Компиляторы написаны на разных языках, чем язык, который они компилируют?
4 ответа
Компилятор использует три языка: компилируемый язык (исходный язык), компилируемый язык (целевой язык) и язык, на котором написан компилятор (язык реализации). В общем, язык реализации - это язык общего назначения, такой как C или C++, или исходный язык. Целевым языком может быть какой-то язык, подходящий близко к исходному языку, который уже существует, или сборка. Иногда существует пользовательский промежуточный язык, так что может быть общий бэкэнд для разных языков. Это способ, которым работает gcc. Есть интерфейс для C, C++, Fortran, Ada и, возможно, других. Каждый компилируется в один и тот же промежуточный язык, который затем компилируется в специфичный для архитектуры язык ассемблера.
Если компилятор написан на том же языке, на котором он компилируется, компилятор называется самостоятельным размещением. Если язык новый, то для него уже не существует компилятора, а это значит, что его первый компилятор не может быть самодостаточным (иначе как этот первый компилятор будет компилироваться?). В результате первая итерация любого компилятора для нового языка всегда пишется на другом языке. Как уже было сказано, самостоятельное размещение более удобно; автор (ы) должен быть опытным только на одном языке.
Вы можете написать компилятор, теоретически, на любом языке. Даже тот, который вы компилируете.
В Stack Overflow есть гораздо больше информации об этом, например, на каком языке лучше всего писать компилятор?,
Я знаю, что вопросы перенесены сюда из Переполнения стека, но я не знаю, работает ли он и наоборот.
Из небольшого исследования, которое я сделал несколько лет назад (2010):
- Ocaml ocaml:
парсер: (o)caml
ядро: C - C++ g++:
парсер: C
ядро: C (теперь c++)-> рано сгенерировано с помощью бизона, потом написано от руки - D dmd:
парсер: C
ядро: C - Haskell GHC:
парсер: haskell (+ C)
ядро: Haskell
-> ранее в LML - C gcc:
парсер: C
ядро: C
-> ранее BCPL / asm - SmallTalk:
Болтовня - Лисп:
шепелявость