Каков язык компиляторов? Они записаны с различными языками?

Компиляторы на различных языках?

5
задан Peter Mortensen 16 December 2014 в 22:30
поделиться

5 ответов

A компилятор , вероятно, мог быть написан на любом языке. В своей основной форме компилятор просто преобразует код с одного языка на другой. В том смысле, что большинство людей сегодня используют термин «компилятор», они относятся к чему-то, что принимает исходный код какого-либо языка более высокого уровня и преобразует его либо в ассемблер, либо в какой-либо промежуточный язык низкого уровня ( CIL ) .

10
ответ дан 18 December 2019 в 05:28
поделиться

Иногда да, иногда нет. Принято пытаться реализовать компилятор для нового языка на самом языке как можно скорее, частично для того, чтобы доказать, что он может выполнять «тяжелую работу».

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

А для многих специализированных языков написание компилятора на самом языке нецелесообразно, потому что язык не предназначен для таких вещей, как компиляторы.

4
ответ дан 18 December 2019 в 05:28
поделиться

Компиляторы часто пишутся на языке, на котором написан компилятор. Например, компилятор языка C обычно написан на языке C.

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

Как заметил @jball, прочитайте статью в Википедии о Bootstrapping для получения полной информации.

3
ответ дан 18 December 2019 в 05:28
поделиться

На каком языке есть что-нибудь? gcc , например, написан на C .
Однажды была история об интерпретаторе Лиспа , написанном на Лиспе.

Это поднимает следующий вопрос - если компилятор C написан на C, то что скомпилировало первый компилятор C? Для этого прочтите здесь .

2
ответ дан 18 December 2019 в 05:28
поделиться

Вот пара примеров:

  • компилятор Rubinius Ruby написан на Ruby,
  • компилятор YARV Ruby написан на C,
  • компилятор XRuby Ruby написан на Java,
  • Ruby Компилятор .NET Ruby написан на C #,
  • компилятор MacRuby Ruby написан на Objective-C,
  • компилятор IronJS ECMAScript написан на F #,
  • компилятор MS Visual F # написан на F #,
  • ] компилятор MS Visual C # написан на C ++, в настоящее время переписывается на C #,
  • компилятор MS Visual Basic.NET написан на C ++, в настоящее время переписывается на Visual Basic.NET,
  • написан компилятор GCC C в C,
  • компилятор Clang C написан на C ++,
  • большинство компиляторов Pascal написаны на Pascal,
  • большинство компиляторов Oberon написаны на Oberon,
  • компиляторы 6g / 8g и gccgo Go написаны на C.

В общем, компиляторы могут быть написаны на любом языке, который на самом деле достаточно мощный для написания компилятора. Это, очевидно, включает любой Tu кольцевой язык. Но возможно даже написать компилятор на языке, не являющемся полным по Тьюрингу. (Например, я не вижу очевидной причины, по которой компилятор не может быть полной функцией, но общие функции, очевидно, не являются полными по Тьюрингу.)

На практике, однако, компиляторы в основном написаны на трех конкретных классах языков с разными плюсами и минусами:

  1. тот же язык, который реализует компилятор (плюсы: большее сообщество, потому что каждый, кто знает язык, может работать с компилятор, иначе им пришлось бы знать оба языка; минусы: проблема начальной загрузки)
  2. основной язык системного программирования низкого уровня платформы, на которой должен работать компилятор, например C на Unix, Java на JVM, C # на CLI (плюсы: очень быстро; минусы: часто эти языки просто не очень подходят для написания компиляторов, также я на самом деле не верю, что преимущества производительности реальны)
  3. язык, который очень хорош для написания компиляторов, таких как ML, Haskell, Lisp, Scheme (плюсы: эти компиляторы, как правило, очень легко понять и взломать; минусы: вам все равно нужно знать оба языка) {{ 1}}
    1. частный случай вышеупомянутого: предметно-ориентированный язык для написания компиляторов, таких как OMeta, или для интерфейса синтаксического анализа ANTLR, YACC (плюсы: то же, что и выше, но даже больше; минусы: то же, что и выше)

Все это по сути компромиссы: написание компилятора на одном языке облегчает понимание, потому что вам не нужно изучать другой язык. Это также может затруднить понимание, потому что язык на самом деле не очень хорош для написания компиляторов. (Представьте, например, написание компилятора SQL на SQL.) Возможно, даже невозможно написать компилятор, например (для довольно общего определения «языка» и «компилятора») это невозможно. написать компилятор CSS в CSS или компилятор HTML в HTML.

С другой стороны: написание компилятора на специализированном языке написания компилятора, вероятно, упрощает его понимание, но в то же время требует от вас изучения нового языка.

Обратите внимание, что эти три класса не являются непересекающимися: компилятор может относиться к более чем одному классу. Например, компилятор для специализированного языка написания компиляторов, написанный сам по себе, попадает как в категорию 1 (написан сам по себе), так и в категорию 3 (написан на языке, который хорошо умеет писать компиляторы).

В некоторых случаях вы действительно можете попасть в золотую середину. Например, F # - это собственный язык с собственной скоростью интерфейса командной строки, и он очень хорош для написания компиляторов. Итак, написание компилятора F # на F # дает вам №1 (запись сама по себе), №2 (запись на родном, быстром языке) и №3 (запись на языке, который хорошо подходит для написания компиляторов). То же относится и к Scala.

16
ответ дан 18 December 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: