Факторы инициации трансляции
- 1 year ago
- 0
- 0
В языках программирования, единица трансляции — максимальный блок исходного текста , который физически можно оттранслировать (преобразовать во внутреннее машинное представление; в частности, откомпилировать ). Важная концепция языков Си и Си++ .
Понятие «единица трансляции» появилось с первыми диалоговыми компьютерами: в те времена нехватка памяти была такой, что компьютер не мог удержать в ней одновременно компилятор, текст крупной программы и результирующий код. Приходилось компилировать по частям, а затем специальной программой — компоновщиком — собирать из откомпилированных модулей исполняемый файл . [ источник не указан 2058 дней ]
Сейчас текст разбивают на единицы трансляции в первую очередь ради повторного использования кода . [ источник не указан 2058 дней ] Да и современные оптимизирующие компиляторы зачастую медленны настолько, что пересборка большой программы может длиться десятки минут.
В языках программирования
Си
и
Си++
единица трансляции
(
англ.
translation unit
) — подаваемый на вход компилятора исходный текст (файл с расширением
.c
или
.cpp
) со всеми
включёнными в него
файлами.
В отличие от многих других языков программирования ( Паскаль , Java , C# ), в Си единицы трансляции компилируются по отдельности, никак не пересекаясь. За «стыковкой» единиц в программу следит исключительно компоновщик . Есть две технологии написания программ на Си: «множество единиц трансляции» и «одна единица трансляции».
Традиционная техника, при которой каждый
c
-файл компилируется по отдельности, после чего объектные файлы собираются в исполняемый файл компоновщиком.
Техника, при которой несколько
c
-файлов объединяются не компоновщиком, а с помощью
#include
. Например:
// compile_me.cpp
#include "foo.cpp"
#include "bar.cpp"
// foo.cpp
#include <iostream> // Крупный стандартный заголовок
#include "bar.hpp" // Заголовок функции 'bar'
int main()
{
bar();
}
// bar.cpp
#include <iostream> // Всё тот же крупный заголовок (второй раз подключен не будет!)
void bar()
{
...
}
Плюсы такой структуры: ускоряется полная сборка, расширяется диапазон
возможных оптимизаций
. Упрощается адаптация чужих библиотек под экзотические компиляторы (например,
Embarcadero C++ Builder
в режиме
__fastcall
)
. Минус — при небольших изменениях в коде перекомпилируется вся программа.
В виде одной единицы трансляции часто выпускают крупные открытые библиотеки (например, SQLite ). При этом программируют их «по старинке», огромным количеством единиц, а из одного вида в другой переводят несложным препроцессором.
#include
стандартной библиотеки оборачивать в
соглашение о вызове
__cdecl
.