7

Компиляторы написаны на разных языках, чем язык, который они компилируют?

4 ответа4

16

Компилятор использует три языка: компилируемый язык (исходный язык), компилируемый язык (целевой язык) и язык, на котором написан компилятор (язык реализации). В общем, язык реализации - это язык общего назначения, такой как C или C++, или исходный язык. Целевым языком может быть какой-то язык, подходящий близко к исходному языку, который уже существует, или сборка. Иногда существует пользовательский промежуточный язык, так что может быть общий бэкэнд для разных языков. Это способ, которым работает gcc. Есть интерфейс для C, C++, Fortran, Ada и, возможно, других. Каждый компилируется в один и тот же промежуточный язык, который затем компилируется в специфичный для архитектуры язык ассемблера.

Если компилятор написан на том же языке, на котором он компилируется, компилятор называется самостоятельным размещением. Если язык новый, то для него уже не существует компилятора, а это значит, что его первый компилятор не может быть самодостаточным (иначе как этот первый компилятор будет компилироваться?). В результате первая итерация любого компилятора для нового языка всегда пишется на другом языке. Как уже было сказано, самостоятельное размещение более удобно; автор (ы) должен быть опытным только на одном языке.

3

Вы можете написать компилятор, теоретически, на любом языке. Даже тот, который вы компилируете.

1

В Stack Overflow есть гораздо больше информации об этом, например, на каком языке лучше всего писать компилятор?,

Больше связано на SO

Я знаю, что вопросы перенесены сюда из Переполнения стека, но я не знаю, работает ли он и наоборот.

0

Из небольшого исследования, которое я сделал несколько лет назад (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:
    Болтовня
  • Лисп:
    шепелявость

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .