Подтвердить что ты не робот

Что такое DCU файл Delphi?

Что такое файл DCP Delphi?

Я считаю, что это означает "Delphi Compiled Unit". Правильно ли я предполагаю, что он содержит объектный код и поэтому соответствует файлу .o, скомпилированному из файла исходного кода C/С++?

4b9b3361

Ответ 1

Я считаю, что .dcu обычно означает "Delphi Compiled Unit", а не файл .pas, который просто "Исходный код Pascal".

Файл .dcu - это файл, который компилятор DCC создает после компиляции файлов .pas (файлы .dfm преобразуются в двоичные ресурсы, а затем обрабатываются компоновщиком напрямую).

Это аналог файлов .o и .obj, которые создают другие компиляторы.

Файл .dcu технически не является файлом "кэша", хотя ваши сборки будут работать быстрее, если вы не удалите их и когда не нужно их перекомпилировать. Файл .dcu связан с версией компилятора, сгенерировавшей его. В этом смысле он менее переносим, чем файлы .o или .obj (хотя у них тоже есть проблемы с совместимостью)

Вот немного истории на случай, если что-нибудь добавит.

Компиляторы традиционно переводят языки исходного кода в некоторую промежуточную форму. Переводчики этого не делают - они просто интерпретируют язык и сразу же запускают приложение. Бейсик - классический пример интерпретируемого языка. "Командная строка" в DOS и Windows имеет язык, который можно записать в файлы, называемые " пакетные файлы " с расширением .bat. Но ввод данных в командной строке выполнял их напрямую. В средах * nix существует множество различных интерпретаторов командной строки (CLI), таких как sh, csh, bash, ksh и так далее. Вы можете создавать пакетные файлы из всех них - это обычно называют "языками сценариев". Но сейчас есть много других языков, которые интерпретируются и компилируются.

В любом случае Java и .Net, например, компилируются в нечто, называемое промежуточным представлением " байт-код ".

Первоначально Pascal был написан как однопроходный компилятор, а Turbo Pascal (происходящий из PolyPascal) - с различными редакциями для CP/M, CP/M-86 и DOS - непосредственно генерировал исполняемый двоичный файл (COM), который работал под управлением этих операционных систем. системы.

Первоначально Pascal был спроектирован как небольшой эффективный язык, предназначенный для поощрения хороших методов программирования с использованием структурированного программирования и структурирования данных; Turbo Pascal 1 изначально разрабатывался как IDE со встроенным очень быстрым компилятором и доступным конкурентом на рынке DOS и CP/M, несмотря на длительные циклы редактирования/компиляции/компоновки в то время. Turbo Pascal и Pascal имели те же ограничения, что и любая другая среда программирования: память и дисковое пространство измерялись в килобайтах, скорости процессора в мегагерцах.

Ссылки на исполняемый двоичный файл не позволили вам ссылаться на отдельно скомпилированные модули и библиотеки.

До Turbo Pascal существовала операционная система UCSD p-System (поддерживающая многие языки, включая Pascal. Компилятор UCSD Pascal тогда уже расширил язык Pascal модулями), скомпилированный в псевдомашинный байт-код (называемый p-code). формат, позволяющий связать несколько единиц вместе. Это было медленно, хотя,

Между тем, c развивался в средах VAX и Unix и компилировался в файлы .o, что означало "объектный код", а не "исходный код". Примечание: это совершенно не связано с тем, что мы сегодня называем " объектами ".

Turbo Pascal вплоть до включающей версии 3 непосредственно генерируемых двоичных выходных файлов .com (хотя вы можете использовать изменение этих файлов оверлеев), а с версии 4 поддерживается разделение кода на блоки, которые сначала компилируются в файлы .tpu, а затем связываются в окончательный исполняемый двоичный файл, Компилятор Turbo C генерировал файлы .obj (объектный код), а не байт-коды, а Delphi 2 ввел генерацию файлов .obj, чтобы сотрудничать с C++ Builder.

Объектные файлы используют относительную адресацию в каждом модуле и требуют того, что позже называлось "исправлениями" (или перемещением), чтобы заставить их работать. Исправления указывают на символические метки, которые, как ожидается, существуют в других объектных файлах или библиотеках.

Существует два вида "исправлений": один статически выполняется инструментом, называемым " компоновщик ". Компоновщик берет кучу объектных файлов и соединяет их во что-то, похожее на лоскутное одеяло. Затем он "исправляет" все относительные ссылки, вставляя указатели на все внешние метки.

Вторые исправления выполняются динамически, когда программа загружается для запуска. Они сделаны чем-то, что называется "загрузчик", но вы этого никогда не увидите. Когда вы вводите команду в командной строке, вызывается загрузчик для загрузки EXE файла в память, исправления оставшихся ссылок в зависимости от того, где загружен файл, а затем управление передается в точку входа приложения.

Таким образом, файлы .dcu возникли как файлы .tpu, когда Borland представил модули в Turbo Pascal, а затем изменил расширение с введением Delphi. Они сильно отличаются от файлов .obj, хотя вы можете ссылаться на файлы .obj из Turbo Pascal и Delphi.

Delphi также полностью скрыл компоновщик, так что вы просто делаете компиляцию и запускаете. Однако все параметры компоновщика все еще присутствуют в одной из панелей параметров Delphi.

Ответ 2

В дополнение к ответу Дэвида Шварца, есть один случай, когда dcu на самом деле сильно отличается от типичных файлов obj, сгенерированных на других языках: определения общего типа. Если общий тип определен в Delphi Unit, компилятор компилирует этот код в представление дерева синтаксиса, а не в машинный код. Это представление дерева синтаксиса затем сохраняется в файле dcu. Когда общий тип используется и создается в другом блоке, компилятор будет использовать это представление и "объединить" его с деревом синтаксиса устройства, используя общий тип. Вы могли бы подумать, что это несколько аналогий для метода вложения. Это, кстати, также является причиной того, что блок, который сильно использует дженерики, требует гораздо больше времени для компиляции, хотя общие типы "связаны" с файлом dcu.

Ответ 3

Компилируемый модуль Delphi содержит объектный код и предварительно скомпилированные заголовки и, следовательно, несколько сопоставим как с файлом obj, так и с файлом .pch/.gch.

Раздел "интерфейс" исходного файла Delphi соответствует заголовку, а секция "реализация" создает объектный код.

Предварительно скомпилированные файлы заголовков могут значительно сократить время компиляции и ссылки. Раздел заголовка DCU предоставляет информацию о ссылке на другие ссылочные единицы, которые не нужно повторно открывать.

В среде Delphi/Turbo Pascal предварительно скомпилированные заголовки поддерживают строгую проверку типов, что потребовало бы ссылки на исходный код, если бы использовался формат файла объекта, например .coff или .obj. (В С++ название mangling обеспечивает аналогичную, но менее полную функцию).