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

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

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

3 ответов


A .файл dcu-это файл, который компилятор DCC создает после компиляции .ПА./ПДФ файлы.

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

Я верю .DCU обычно означает "блок компиляции Delphi" в отличие от a .PAS-файл, который просто "исходный код Pascal".

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

вот некоторая история, если она что-то добавляет.

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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