- •Лекция 1
- •План лекции
- •Информация об этом курсе
- •Понятие программы
- •Понятие программы
- •Понятие программы
- •Этапы создания программ
- •Этапы создания программ – каскад
- •Этапы создания программ – инкремент
- •Этапы создания программ – эволюция
- •Этапы создания программ
- •Написание исходного кода
- •Компиляция исходного кода
- •Компиляция исходного кода
- •Сборка (линковка)
- •Сборка статической библиотеки
- •Сборка динамической библиотеки
- •Сборка исполняемого файла
- •Компиляция, сборка,
- •Сборка (линковка)
- •Сборка (линковка)
- •Сборка (линковка)
- •Отладка
- •Оптимизация
- •Заключение
Этапы создания программ
|
Каскад |
Инкремент |
Эволюция |
Создание программы |
Один |
Итерации |
Итерации |
|
проход |
|
|
Размер программы |
Ограниченн |
Любой |
Любой |
|
ый |
|
|
Изменение технологии |
Невозможно |
Затруднено |
Возможно |
Требования к |
Не |
Расширяютс |
Пересматрива |
программе |
меняются |
я |
ются |
(спецификация) |
|
|
|
Учёт новых пожеланий |
Нет |
Частично |
Полностью |
заказчика |
|
|
|
Качество программы |
Высокое |
Ограниченн |
Ограниченное |
|
|
ое |
|
Требования к |
Низкие |
Высокие |
Высокие |
квалификации |
|
|
|
разработчиков |
|
|
|
Примеры технологий |
Плановая |
Extreme Programming (XP) |
|
Написание исходного кода
Выбор языка программирования
Следование стандарту языка
Следование системе правил
Именование типов, переменных, констант, функций, файлов
Деление кода на функции, файлы, компоненты
Форматирование и комментирование кода
Минимальное дублирование кода
Похожим действия -- похожая запись
|
(«устойчивые обороты») |
|
|
if (1==x) x=0; else x=1; |
|
|
|
x=1-x; |
|
Рефакторинг кода (code refactoring) |
|
|
int T[2] = {1, 0}; x = |
|
Ревью кода (code review) |
T[x]; |
|
x = x?0:1; |
||
|
|
x = !x; |
|
|
if (1==x) x=0; |
|
|
else if (0==x) x=1; |
|
|
else assert(x==0||x==1); |
Компиляция исходного кода
Файлы с исходным кодом называются единицами компиляции
Результатом компиляции является файл с объектным кодом
Если изменения в файле Ф1 могут нарушить логику работы кода в файле Ф2, то Ф2 зависит от Ф1
Системы компиляции умеют автоматически учитывать некоторые зависимости между файлами
GNU make, MS nmake, scons, …
За учёт всех зависимостей отвечает программист
Компиляция исходного кода
worker.h |
Для чего |
void do_some_work(); |
|
worker.c |
нужна строка |
#include "worker.h" |
#include |
void do_some_work() { /* … */ |
}"worker.h" в |
main.c |
файле |
#include "worker.h" |
|
{ |
worker.c? |
int main() |
|
do_some_work(); |
|
|
|
return 0; |
|
} |
|
Изменения в worker.c требуют изменений в worker.h и перекомпиляции worker.c и main.c
Сборка (линковка)
Различают три вида сборки
Сборка статической библиотеки
Сборка динамической библиотеки
Сборка исполняемого файла
Сборка статической библиотеки
Вход: объектные файлы
Выход: архив, содержащий эти файлы
Статическая библиотека – средство группирования логически связанных объектных файлов
Сборка динамической библиотеки
Вход: объектные файлы, статические библиотеки, ранее созданные динамические библиотеки
Выход: файл со служебной информацией для ОС и машинными инструкциями, годными для исполнения процессором
Динамическая библиотека – средство построения программ в процессе их работы
Сборка исполняемого файла
Вход: объектные файлы, статические библиотеки, динамические библиотеки
Выход: файл со служебной информацией для ОС, машинными инструкциями, годными для исполнения процессором, и «точкой входа»
Компиляция, сборка,



загрузка в память для
Свой |
Чужой исходный |
|
К – компилятор |
исполнения код |
|
|
|
исходный |
(заголовочные файлы |
|
Л – линкер, |
код |
библиотек и т.п.) |
|
редактор связей |
|
|
|
|
К |
|
|
З – загрузчик ОС |
Объектный |
|
|
код |
Динамическа |
|
|
|
|
|
я библиотека |
|
Л |
|
З |
|
Исполняемый |
|
Статическа |
файл |
Исполняемы |
я |
|
|
|
й код |
|
библиотека |
|
|
|
|
Сборка (линковка)
c:\Users\espetrov>cl –c worker.c c:\Users\espetrov>dumpbin /all /disasm worker.obj
Microsoft (R) COFF/PE Dumper Version |
SECTION HEADER #2 |
9.00.21022.08 |
|
Copyright (C) Microsoft Corporation. All rights |
.debug$S name |
reserved. |
0 physical address |
|
0 virtual address |
Dump of file worker.obj |
70 size of raw data |
BB file pointer to raw data (000000BB to |
|
File Type: COFF OBJECT |
0000012A) |
0 file pointer to relocation table |
|
FILE HEADER VALUES |
0 file pointer to line numbers |
0 number of relocations |
|
14C machine (x86) |
0 number of line numbers |
3 number of sections |
42100040 flags |
5048208D time date stamp Thu Sep 06 |
Initialized Data |
11:03:25 2012 |
Discardable |
130 file pointer to symbol table |
1 byte align |
9 number of symbols |
Read Only |
0 size of optional header |
RAW DATA #2 |
0 characteristics |
|
SECTION HEADER #1 |
00000000: 04 00 00 00 F1 00 00 00 61 00 00 00 |
23 00 01 11 ....ñ...a...#... |
|
.drectve name |
00000010: 00 00 00 00 63 3A 5C 55 73 65 72 73 |
0 physical address |
5C 65 73 70 ....c:\Users\esp |
0 virtual address |
00000020: 65 74 72 6F 76 5C 77 6F 72 6B 65 72 |
2F size of raw data |
2E 6F 62 6A etrov\worker.obj |
8C file pointer to raw data (0000008C to |
00000030: 00 3A 00 3C 11 00 22 00 00 07 00 0F |
000000BA) |
00 00 00 1E .:.<.."......... |
0 file pointer to relocation table |
00000040: 52 08 00 0F 00 00 00 1E 52 08 00 4D |
0 file pointer to line numbers |
69 63 72 6F R.......R..Micro |
0 number of relocations |
00000050: 73 6F 66 74 20 28 52 29 20 4F 70 74 |
0 number of line numbers |
69 6D 69 7A soft (R) Optimiz |
100A00 flags |
00000060: 69 6E 67 20 43 6F 6D 70 69 6C 65 72 |
Info |
00 00 00 00 ing Compiler.... |
Remove |
SECTION HEADER #3 |
1 byte align |
|
RAW DATA #1 |
.text name |
0 physical address |
|
00000000: 20 20 20 2F 44 45 46 41 55 4C 54 |
0 virtual address |
4C 49 42 3A 22 /DEFAULTLIB:" |
5 size of raw data |
00000010: 4C 49 42 43 4D 54 22 20 2F 44 45 |
12B file pointer to raw data (0000012B to |
46 41 55 4C 54 LIBCMT" /DEFAULT |
0000012F) |
00000020: 4C 49 42 3A 22 4F 4C 44 4E 41 4D |
0 file pointer to relocation table |
45 53 22 20 LIB:"OLDNAMES" |
0 file pointer to line numbers |
Linker Directives |
0 number of relocations |
0 number of line numbers |
|
----------------- |
60500020 flags |
/DEFAULTLIB:"LIBCMT" |
|
/DEFAULTLIB:"OLDNAMES" |
|
Code
16 byte align
Execute Read
_do_some_work: |
|
00000000: 55 |
push ebp |
00000001: 8B EC |
mov |
ebp,esp |
|
00000003: 5D |
pop ebp |
00000004: C3 |
ret |
RAW DATA #3 |
|
|
|
|
|
U.ì]Ã |
00000000: 55 8B EC 5D C3 |
|
|
||||
COFF SYMBOL TABLE |
notype |
Static |
| @comp.id |
|||
000 0083521E ABS |
||||||
001 00000001 |
ABS |
notype |
Static |
| @feat.00 |
||
002 00000000 |
SECT1 |
notype |
Static |
| .drectve |
||
Section length |
2F, #relocs |
0, #linenums |
0, |
|||
checksum |
0 |
|
|
Static |
| .debug$S |
|
004 00000000 |
SECT2 notype |
|||||
Section length |
70, #relocs |
0, #linenums |
0, |
|||
checksum |
0 |
|
notype |
Static |
| .text |
|
006 00000000 |
SECT3 |
|||||
Section length |
5, #relocs |
0, #linenums |
0, checksum |
|||
672BE856 |
SECT3 |
notype () External |
|
| |
||
008 00000000 |
|
|||||
_do_some_work
String Table Size = 0x12 bytes
Summary
70 .debug$S
2F .drectve
5 .text
