Единица трансляции

Поделись знанием:
(перенаправлено с «Единица компиляции»)
Перейти к: навигация, поиск

В языках программирования единица трансляции — минимальный блок исходного текста, который физически можно оттранслировать (преобразовать во внутреннее машинное представление; в частности, откомпилировать). Важная концепция языков Си и Си++.

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

Сейчас текст разбивают на единицы трансляции в первую очередь ради повторного использования кода. Да и современные оптимизирующие компиляторы зачастую медленны настолько, что пересборка большой программы может длиться десятки минут.[1]





В языках Си и Си++

В языках программирования Си и Си++ единица трансляции (англ. 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)[2]. Минус — при небольших изменениях в коде перекомпилируется вся программа.

В виде одной единицы трансляции часто выпускают крупные открытые библиотеки (например, SQLite). При этом программируют их «по старинке», огромным количеством единиц, а из одного вида в другой переводят несложным препроцессором.

В прочих языках

  • Фортран: единицей трансляции является отдельная программная единица (основная программа, подпрограмма или функция) или модуль вместе с включенными файлами. Т.о. в Фортране один файл может содержать несколько единиц трансляции.
  • Паскаль: единицей трансляции является программа или модуль.
  • PHP, Perl: единиц трансляции нет, оттранслировать можно только программу целиком.
  • Java: единица трансляции — класс.

См. также

Напишите отзыв о статье "Единица трансляции"

Примечания

  1. Так, компиляция SQLite на процессоре 2010 года с помощью MinGW длится около полуминуты.
  2. Для версии XE2 приходится отключать предупреждения, а #include стандартной библиотеки оборачивать в соглашение о вызове __cdecl.

Отрывок, характеризующий Единица трансляции

– Vous ne pensez donc pas comme lesautres que nous sommes obliges de nous retirer? [Вы, стало быть, не думаете, как другие, что мы должны отступить?]
– Au contraire, votre altesse, dans les affaires indecises c'est loujours le plus opiniatre qui reste victorieux, – отвечал Раевский, – et mon opinion… [Напротив, ваша светлость, в нерешительных делах остается победителем тот, кто упрямее, и мое мнение…]
– Кайсаров! – крикнул Кутузов своего адъютанта. – Садись пиши приказ на завтрашний день. А ты, – обратился он к другому, – поезжай по линии и объяви, что завтра мы атакуем.
Пока шел разговор с Раевским и диктовался приказ, Вольцоген вернулся от Барклая и доложил, что генерал Барклай де Толли желал бы иметь письменное подтверждение того приказа, который отдавал фельдмаршал.
Кутузов, не глядя на Вольцогена, приказал написать этот приказ, который, весьма основательно, для избежания личной ответственности, желал иметь бывший главнокомандующий.
И по неопределимой, таинственной связи, поддерживающей во всей армии одно и то же настроение, называемое духом армии и составляющее главный нерв войны, слова Кутузова, его приказ к сражению на завтрашний день, передались одновременно во все концы войска.
Далеко не самые слова, не самый приказ передавались в последней цепи этой связи. Даже ничего не было похожего в тех рассказах, которые передавали друг другу на разных концах армии, на то, что сказал Кутузов; но смысл его слов сообщился повсюду, потому что то, что сказал Кутузов, вытекало не из хитрых соображений, а из чувства, которое лежало в душе главнокомандующего, так же как и в душе каждого русского человека.
И узнав то, что назавтра мы атакуем неприятеля, из высших сфер армии услыхав подтверждение того, чему они хотели верить, измученные, колеблющиеся люди утешались и ободрялись.


Полк князя Андрея был в резервах, которые до второго часа стояли позади Семеновского в бездействии, под сильным огнем артиллерии. Во втором часу полк, потерявший уже более двухсот человек, был двинут вперед на стоптанное овсяное поле, на тот промежуток между Семеновским и курганной батареей, на котором в этот день были побиты тысячи людей и на который во втором часу дня был направлен усиленно сосредоточенный огонь из нескольких сот неприятельских орудий.
Не сходя с этого места и не выпустив ни одного заряда, полк потерял здесь еще третью часть своих людей. Спереди и в особенности с правой стороны, в нерасходившемся дыму, бубухали пушки и из таинственной области дыма, застилавшей всю местность впереди, не переставая, с шипящим быстрым свистом, вылетали ядра и медлительно свистевшие гранаты. Иногда, как бы давая отдых, проходило четверть часа, во время которых все ядра и гранаты перелетали, но иногда в продолжение минуты несколько человек вырывало из полка, и беспрестанно оттаскивали убитых и уносили раненых.
С каждым новым ударом все меньше и меньше случайностей жизни оставалось для тех, которые еще не были убиты. Полк стоял в батальонных колоннах на расстоянии трехсот шагов, но, несмотря на то, все люди полка находились под влиянием одного и того же настроения. Все люди полка одинаково были молчаливы и мрачны. Редко слышался между рядами говор, но говор этот замолкал всякий раз, как слышался попавший удар и крик: «Носилки!» Большую часть времени люди полка по приказанию начальства сидели на земле. Кто, сняв кивер, старательно распускал и опять собирал сборки; кто сухой глиной, распорошив ее в ладонях, начищал штык; кто разминал ремень и перетягивал пряжку перевязи; кто старательно расправлял и перегибал по новому подвертки и переобувался. Некоторые строили домики из калмыжек пашни или плели плетеночки из соломы жнивья. Все казались вполне погружены в эти занятия. Когда ранило и убивало людей, когда тянулись носилки, когда наши возвращались назад, когда виднелись сквозь дым большие массы неприятелей, никто не обращал никакого внимания на эти обстоятельства. Когда же вперед проезжала артиллерия, кавалерия, виднелись движения нашей пехоты, одобрительные замечания слышались со всех сторон. Но самое большое внимание заслуживали события совершенно посторонние, не имевшие никакого отношения к сражению. Как будто внимание этих нравственно измученных людей отдыхало на этих обычных, житейских событиях. Батарея артиллерии прошла пред фронтом полка. В одном из артиллерийских ящиков пристяжная заступила постромку. «Эй, пристяжную то!.. Выправь! Упадет… Эх, не видят!.. – по всему полку одинаково кричали из рядов. В другой раз общее внимание обратила небольшая коричневая собачонка с твердо поднятым хвостом, которая, бог знает откуда взявшись, озабоченной рысцой выбежала перед ряды и вдруг от близко ударившего ядра взвизгнула и, поджав хвост, бросилась в сторону. По всему полку раздалось гоготанье и взвизги. Но развлечения такого рода продолжались минуты, а люди уже более восьми часов стояли без еды и без дела под непроходящим ужасом смерти, и бледные и нахмуренные лица все более бледнели и хмурились.