На чем написаны современные и старые компиляторы? - PullRequest
3 голосов
/ 30 марта 2010

Поскольку компилятору, кроме интерпретатора, нужно только переводить ввод, а не запускать его, производительность сама по себе должна быть не такой проблемной, как с интерпретатором. Следовательно, вы не будете писать интерпретатор, скажем, Ruby или PHP, потому что он будет слишком медленным.

Однако как насчет компиляторов?

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

Чтобы быть уверенным: под языком сценариев я подразумеваю интерпретируемые языки, имеющие типичные функции, которые делают программирование быстрее, проще и приятнее для программиста, обычно, по крайней мере. Примеры: PHP, Ruby, Python, возможно JavaScript, хотя это может быть странным выбором для компилятора

  • На чем обычно пишут компиляторы? Как я полагаю, вы ответите чем-то низкоуровневым, таким как C, C ++ или даже Assembler, почему?

  • Есть ли компиляторы, написанные на языках сценариев?

  • Каковы (не) преимущества использования языков программирования низкого или высокого уровня для написания компилятора?

Ответы [ 7 ]

6 голосов
/ 30 марта 2010

Большинство компиляторов написаны на языке программирования, для которого они предназначены ( bootstrapping ).

Есть, конечно, многочисленные исключения.

1 голос
/ 30 марта 2010

Большинство компиляторов написаны на C или C ++. Даже сегодня производительность компилятора имеет значение. Когда вам нужно скомпилировать проект из 900 файлов, это чертовски важно, если это займет 2 минуты или 20 минут.

Некоторые компиляторы написаны на языках сценариев (один из примеров, который приходит на ум - это Pyjamas - компилятор из Python в Javascript, написанный на Python), но подавляющее большинство промышленных компиляторов написаны на C & C ++. 1003 *

0 голосов
/ 02 октября 2010

Компилятор javac из JVM SUN / Oracle написан на Java; как и компилятор Java, используемый в Eclipse IDE для фоновой компиляции при редактировании. Компиляторы для многих функциональных языков часто пишутся на этом языке, поскольку функциональные языки обычно вполне подходят для написания компиляторов. Компиляторы для языков с ограниченным доступом (например, программирование на GPU, таких как GLSL / OpenCL) не будут написаны на языках, исполняемых на графических процессорах.

Одна фундаментальная проблема заключается в том, что язык, скомпилированный данным компилятором, может не быть хорошим языком для реализации компилятора; Я не знаю никого, кто писал бы компиляторы для FORTRAN на FORTRAN.

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

0 голосов
/ 30 марта 2010

Для эффективной реализации компиляторов существуют специализированные языки программирования, например ::

http://www.meta -alternative.net / mbase.html

Также: Irony, JetBrains MPS и некоторые другие.

Функциональные языки в целом достаточно эффективны в этой области, особенно языки с алгебраическими типами данных, например, с шаблоном соответствия карри - Haskell, ML (F #, OCaml), Nemerle, Scala.

0 голосов
/ 30 марта 2010

Есть собственный компилятор Python для Python с именем pypy .

0 голосов
/ 30 марта 2010

Компиляция - это одна из самых сложных вычислительных операций, которую вы можете делать на компьютере или, как говорит Джоэл Спольски:

Написание кода на скомпилированном языке одна из последних вещей, которые до сих пор не может быть сделано мгновенно в саду домашний компьютер.

Следовательно, вы не хотите, чтобы компилятор был настолько быстрым, насколько это возможно, что делает C и C ++ естественным выбором.

0 голосов
/ 30 марта 2010

Они в основном написаны на языке довольно высокого уровня (C / C ++). Однако на современном оборудовании прекрасно иметь компилятор, написанный на управляемом языке (C # / Java), на функциональном языке (Haskell) или, еще лучше, на управляемом функциональном языке (Nemerle).

Функциональные языки используют метод, называемый сопоставление с шаблоном , который значительно упрощает обработку деревьев разбора / AST.

Настоящий компилятор-фу пишет компилятор для языка на этом конкретном языке (процесс называется bootstrapping ).

...