Хотите четкое объяснение препроцессоров GCC

Когда читаешь это документ, в конце есть одно предложение:

Исторически компиляторы для многих языков, включая C ++ и Fortran, были реализованы как «препроцессоры», которые испускают другой язык высокого уровня, такой как C.

Не имеете представления о препроцессорах, какой-либо документ? Означает ли это, что все эти языки будут переведены в исходные коды C?

3

Решение

Я думаю, что было бы лучше использовать термин переводчик из источника в источник вместо «препроцессоров», что делает его двусмысленным по смыслу, но и в этом нет ничего плохого.

По сути, компилятор — это компьютерная программа, которая переводит исходный код с языка программирования высокого уровня на язык более низкого уровня (например, язык ассемблера или машинный код). Но документ в вопросе гласит:

Исторически, компиляторы для многих языков, в том числе C ++ и Fortran,
Был реализованы как «препроцессорыКоторые излучают еще один высокий уровень
язык, такой как C.

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

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

Теперь, приходя к препроцессор, используемый в программе , давайте возьмем пример:

#include <stdio.h>// a PREPROCESSOR directive

Препроцессор — это программа, которая обрабатывает исходный файл до того, как
основная компиляция, (аналогично переводчику) но разница заключается в том, что ЗДЕСЬ он обрабатывает директивы, имена которых начинаются с #.

Вот #include это директива. Эта директива заставляет препроцессор добавлять содержимое stdio.h подать в ваш
Программа. Это типичное действие препроцессора: добавление или замена текста в исходном коде.
до его компиляции.

2

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

Некоторые языки были реализованы с помощью компилятора, генерирующего код C, который затем компилируется компилятором C. Известные примеры включают в себя:

  • C ++ в первые дни (и C с классами до этого) — cfront сгенерированный код C из кода C ++. Это перестало быть практичным, когда C ++ поддерживал исключения (читайте Страуструп Дизайн и эволюция C ++ для получения дополнительной информации), но не все компиляторы C ++ использовали эту технику (на самом деле, я не знаю ни одного другого компилятора, кроме cfront это сделал)
  • Yacc компилируется в C-код. Bison может быть скомпилирован в код C или C ++.
  • Lex скомпилирован в C-код. Я считаю, что Flex может быть скомпилирован в код на C или C ++.
  • Informix ESQL / C преобразует встроенный SQL в чистый C.
  • Informix 4GL преобразует исходный код I4GL в ESQL / C, а затем использует компилятор ESQL / C для создания кода C (и компилятор C для создания объектного кода и исполняемых файлов), поэтому он имеет многоэтапный компилятор (и я упрощаю немного).
2

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

Это надо называть компилятор исходного кода. Одним из примеров является Cfront (разработанный Бьярном Страуструпом), который преобразовал C ++ в C.

Для нормального значения фразы «препроцессор» в C ++, см. Вот.

1

Нет, не обязательно Многие компиляторы C ++, КАК СКАЗАЛ ДОКУМЕНТ GCC, (но не gcc / g ++) производят вывод кода C. Почему они это делают? Таким образом, они могут использовать весь исполняемый код бэкенда, с которым могут компилироваться компиляторы C (X86, AMD и т. Д.). Имея C в качестве кода назначения, они сохраняют много низкоуровневого кодирования на серверной части. К таким компиляторам относятся оригинальный Cfront и Comeau C / C ++.

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