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

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

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

13

Решение

Файл .dcu — это файл, который компилятор DCC создает после компиляции файлов .PAS / .DFM.

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

Я считаю, что .DCU обычно означает «Модуль компиляции Delphi», а не файл .PAS, который просто «Исходный код Pascal».

И технически это не файл «кеша», хотя ваши сборки будут работать быстрее, если вы не удалите их и когда вам не нужно их перекомпилировать.

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

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

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

Первоначально Pascal был написан как однопроходный компилятор, и он генерировал исполняемый файл (COM или EXE) непосредственно под DOS. (Паскаль изначально был разработан для академических целей, чтобы преподавать программирование, а не создавать большие приложения. Поэтому его ограничения были преднамеренными в этом отношении.)

Этот процесс не позволял вам связываться с отдельно скомпилированными модулями и библиотеками. UCSD Pascal пришел и исправил вещи, скомпилировав в формат байт-кода, который позволял связывать несколько единиц вместе.

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

Пришел TurboPascal и, если я не ошибаюсь, генерировал файлы .obj (объектный код), а не байт-коды.

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

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

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

Я думаю, что файлы DCU возникли, когда Borland представил Delphi, чтобы отличить их от файлов OBJ, созданных TurboPascal. То есть вы не можете связать файлы OBJ TP напрямую с файлами DCU Delphi. Они были разных форматов.

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

23

Другие решения

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

6

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

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

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

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

0
По вопросам рекламы [email protected]