Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
ВнизВопросы: что компилируется, а что - нет. И когда. Найти похожие ветки
← →
AlexanderMS © (2006-08-16 17:47) [0]У меня возникло несколько вопросов. Я решил оформить своё "мнение" в виде утверждений (утверждения, ИМХО, воспринимаются и выглядят лучше, чем вопросы), а Вы, пожалуйста, ответьте Да/Нет с пояснениями.
1. Обычные процедуры и функции, которые нигде не используются, всё равно компилируются и включаются в exe.
2. Процедуры, функции, методы, свойства класса, которые нигде не используются, не компилируются и не включаются в exe.
3. Если к одному модулю подключён, к примеру, модуль SysUtils, и к другому модулю тоже подключён SysUtils, то в exe код этого модуля включается только один раз.
4. В конечный файл (*.exe) включается сам код реализации процедуры в точке её вызова, а не ссылка на какой-либо участок кода (где реализация процедуры), если эта процедура вызывается только один раз.
5. В конечный файл (*.exe) включаются ссылки на код реализации процедуры в точке её вызова, а не сам код её реализации, если эта процедура вызывается несколько раз.
6. Неиспользуемые модули не компилируются и не включаются в исполняемый файл.
7. Код неиспользуемого класса не компилируется.
---
8. Если исходные файлы не изменены, то по нажатию F9 программа (если она есть на диске) просто запускается без компиляции.
9. Project-> Build XXX - то же самое, что и результат нажатия F9. А если нет, то в чём отличие.
10. А теперь вопрос: почему в конечный продукт включаются курсоры, которые нигде не используются, какие-то картинки, которые тоже нигде не используются, сообщения об ошибках, которые просто никогда не могут появиться на экране, информация о проекте (список модулей, классов и т.п.) и исходные коды форм в открытом виде?
P. S. Если что-то покажется бредом, взгляните на название конференции :).
← →
Zeqfreed © (2006-08-16 17:54) [1]> [0] AlexanderMS © (16.08.06 17:47)
> 1. Обычные процедуры и функции, которые нигде не используются,
> всё равно компилируются и включаются в exe.
Видел такие синие кружочки в редакторе кода после компиляции? Так вот это — строки, попавшие в программу. Проверь на досуге свое предположение.
> 3. Если к одному модулю подключён, к примеру, модуль SysUtils,
> и к другому модулю тоже подключён SysUtils, то в exe код
> этого модуля включается только один раз.
Ну это логично, правда? :)
> 5. В конечный файл (*.exe) включаются ссылки на код реализации
> процедуры в точке её вызова, а не сам код её реализации,
> если эта процедура вызывается несколько раз.
Даже если один раз. inline-фунцкии в Delphi появились недавно. Они включаются в код столько раз, сколько их вызвали.
Остальное оставлю другим, да и сам бы послушал ответы :)
← →
Lexiy (2006-08-16 18:08) [2]хм по поводу шестого не уверен ... а так ... соглашусь с мсье Зигфридом интересно бы послушать ответы
← →
Zeqfreed © (2006-08-16 18:13) [3]> [2] Lexiy (16.08.06 18:08)
.
По поводу шестого был большой флейм в «Основной». Совсем недавно.
> 9. Project-> Build XXX - то же самое, что и результат нажатия
> F9. А если нет, то в чём отличие.Choose Project|Build project to rebuild all the components of a project regardless of whether they have changed. This command is useful when you’ve changed global compiler directives or compiler options, to ensure that all code compiles in the proper state.
This option is identical to Project|Compile project except that it rebuilds everything, whereas Project|Compile rebuilds only those files that have changed since the last build.
You can also invoke this command from the Project Manager. Right click and choose Build.
If you have multiple projects within a Project Group, you can build all projects within a Project Group by using the Project|Build All Projects command.
> 8. Если исходные файлы не изменены, то по нажатию F9 программа
> (если она есть на диске) просто запускается без компиляции.Choose Compile from the Project Manager Project context menu to compile all files in the current project that have changed since it was last built. This command is similar to Build, except that Make/Compile builds only those files that have changed whereas Build rebuilds all files regardless of whether they have changed or not. ...
← →
evvcom © (2006-08-16 18:14) [4]Про компиляцию: компилируются все модули и целиком. Результат попадает в соответствующие *.dcu. А вот дальше над этими dcu трудится линковщик (компоновщик). Он и определяет, используется ли данная функция/проц./метод в программе или нет. Если нет, то код не включается. Если имя "светится" в таблице экспорта, то линкер считает, что эта фун/проц/метод используется.
> 9. Project-> Build XXX - то же самое, что и результат нажатия
> F9. А если нет, то в чём отличие.
Не то же самое. Независимо от изменений в модулях, они все перекомпилятся и заново слинкуются. Причем если в опциях проекта стоит увеличивать номер билда приложения, то это выполнится.
← →
Desdechado © (2006-08-16 18:28) [5]10. Ты просто не знаешь, где они и как используются.
← →
Германн © (2006-08-16 18:35) [6]
> Независимо от изменений в модулях, они все перекомпилятся
> и заново слинкуются.
Особенно необходимо, если часто используется "условная компиллиция".
← →
Lexiy (2006-08-16 18:46) [7]Зифрид а какой счет и в чью пользу ... а то я так время от времени на все меня не хватает :) не видел
← →
StriderMan © (2006-08-16 18:46) [8]с 6 несогласен.
попробуй включить в проект юнит с заведомо кривым содержанием. компилер сразу заругается. а еще говорят (где-то в параллельной ветке) что от неиспользуемых, но включенных в проект юнитов, ехе-шник подрастает.
← →
Ketmar © (2006-08-16 22:05) [9]1. нет.
2. нет.
3. да.
4. только для inline (если компилятор решит, что это имеет смысл).
5. только для не-inline (если компилятор решит, что это имеет смысл).
6. нет.
7. нет.
8. да/нет. происходит линковка.
9. ни разу.
10. ресурсы приходят из других модулей. формы -- ну хранятся они так, что уж тут...
← →
Loginov Dmitry © (2006-08-16 23:27) [10]1. False
2. True (кроме неиспользуемых виртуальных и динамических методов)
3. True
4. False (кроме появившихся в Delphi недавно inline-функций)
5. True (однако код реализации тоже где-то присутствует :))
6. (True + False) / 2 (если есть секция initialization (и finalization), то будут компилироваться функции, используемые в этой секции)
7. True
8. True (если есть dcu-файлы, скомпилированные в текущем сеансе работы Delphi)
9. False (перекомпилятся все dcu-шки, увеличится номер версии (при включенной соответствующей опции), вступят в силу новые глобальные директивы компиляции и т.д.)
10. Все это - динамически загружаемые ресурсы. Delphi не знает, в какой момент они могут понадобиться, и сохраняет их в exe. Исходные коды форм - это тоже ресурсы, используемые RTTI (информация о типах в ран-тайме). Свойства компонентов, которые вы кладете на форму в режиме разработки, загружаются в ран-тайме благодаря этим самым ресурсам.
← →
Ketmar © (2006-08-16 23:43) [11]> [10] Loginov Dmitry © (16.08.06 23:27)
2. нет. и ты пы. был вопрос про "компилируется"? однозначно компилируется. а вот линкуется ли -- это уже совсем другой вопрос.
← →
Kolan © (2006-08-17 00:38) [12]
> 2. нет. и ты пы. был вопрос про "компилируется"? однозначно
> компилируется. а вот линкуется ли -- это уже совсем другой
> вопрос.
>
> не компилируются и не включаются
Мне тоже интересно...
← →
Ketmar © (2006-08-17 01:20) [13]> [12] Kolan © (17.08.06 00:38)
если одна из частей утверждения ложна, то ложно всё утверждение (случай для "и", см. "булева логика").
← →
AlexanderMS © (2006-08-17 19:59) [14]Всем спасибо!
← →
TUser © (2006-08-17 20:12) [15]а. Компилируется все, что останется после оптимизации, и кладется в dcu-файл.
б. Другой вопрос - что будет использовано линковщиком, а что - нет.
Пример - неиспользуемая процедура. В dcu есть, в exe не линкуется. Неиспользуемый метод будет в exe, если он динамический или виртуальный. Т.к. для обычного метода линковщик может определить, - нужен тот или нет, а для виртуального нет - такой метод может понадобиться в потомке. Все остальное определяется аналогично.
F9 - делает компиляцию проекта. При этом модули, для которых есть dcu, и текст не поменялся не компилируется, линковщик использует готовые dcu. При билде компилируется все.
Тут еще такая тонкость. Код модуля мог не пеменяться, но поменяться могли директивы компиляции. Из-за этого код уже теряет актуальность, но компилятор про это ничего не знает. Это может привести к труднонаходимой ошибке, поэтому после изменения директив рекомендуется делать билд.
← →
Ketmar © (2006-08-17 20:31) [16]> [15] TUser © (17.08.06 20:12)
> Компилируется все, что останется после оптимизации
???
← →
TUser © (2006-08-17 21:21) [17]> Ketmar © (17.08.06 20:31) [16]
Сказал попроще. Строго говоря, конечно, компилятор производит
1. Лексический анализ кода
2. Оптимизацию, при которой часть кода удаляется
3. Генерирует машкоды, + отладочнеую информацию
4. Кладет все это в объектный файл, у нас - dcu, ну или obj
Все, что выкинуто оптимизатором на этапе 2 в этапах 3 и 4 не учавствует, т.е. не попадает в exe. В контексте данной ветке - "не компилируется".
← →
Ketmar © (2006-08-17 22:28) [18]> [17] TUser © (17.08.06 21:21)
пропустил этап генерации промежуточного кода. который потом уже оптимизируется. %-)
← →
evvcom © (2006-08-18 10:11) [19]
> [17] TUser © (17.08.06 21:21)
> 3. Генерирует машкоды
Опять же, машкод генерируется в зависимости от настроек оптимизатора, потому жестко разделить работу генератора кода и оптимизатора, я думаю, просто невозможно.
← →
Ketmar © (2006-08-18 10:15) [20]> [19] evvcom © (18.08.06 10:11)
ошибаешься. ещё как возможно. оптимизируется обычно какая-то промежуточная форма (i-code или нечто подобное). на этой стадии делаются вещи типа data flow analysis, dead code removal, loop strength reduction и прочие страшные штуки. ну, и математика, конечно. а уже потом генерируется машкод.
тут свои весёлости есть -- типа распределения регистров и прочего. но это уже совсем другая сказка.
зыж а иногда и не i-code. иногда DAG"i, потом i-code, потом risc-code, потом машинный. и так бывает. %-)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.044 c