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

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

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

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

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

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

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

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


person ulum    schedule 30.03.2010    source источник
comment
Я считаю, что писать код на C ++ быстро, легко и приятно.   -  person    schedule 30.03.2010
comment
Скорость очень важна для компиляторов, так как это (youtube.com/watch?v=rKnDgT73v8s) Google Tech Talk о языке GO иллюстрирует. Скорость компилятора здесь - ключевая особенность.   -  person Björn Pollex    schedule 30.03.2010
comment
@Neil, расскажи это новичку в C ++ ;-)   -  person Nick Dandoulakis    schedule 30.03.2010


Ответы (7)


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

Конечно, есть множество исключений.

person Aram Hăvărneanu    schedule 30.03.2010
comment
Почему голоса против, если это объективная, поддающаяся проверке правда? - person Aram Hăvărneanu; 30.03.2010
comment
Я не голосовал против, но это неверно для (например) FORTRAN и COBOL, если назвать только два. Если у вас есть статистика, подтверждающая ваше утверждение, предоставьте ее. - person ; 30.03.2010
comment
Другим примером могут быть языки, поставляемые с GNU, такие как компилятор Ada, или gcj, написанные на C, как и остальная часть набора инструментов GCC. - person Eli Bendersky; 30.03.2010
comment
Вы, должно быть, не прочитали сообщение полностью. Существует множество компиляторов, написанных на других языках, чем они нацелены, но большинство компиляторов для основных, скомпилированных языков не такие. Большинство распространенных реализаций C, C ++, Haskell, Java, Erlang, OCaml, Oberon, Pascal, Delphi написаны на этих языках. - person Aram Hăvărneanu; 30.03.2010
comment
Это не «объективная правда». Фактически это внутреннее противоречие: «большинство» с «многочисленными исключениями»? Если вы не согласны, проверьте это. Приведите несколько примеров компиляторов Cobol, написанных на Cobol. Компиляторы PHP, написанные на PHP. Компиляторы RPG, написанные на RPG. Компиляторы Javascript, написанные на Javascript. Компиляторы JIT, написанные на Java или байт-коде JVM. - person user207421; 30.03.2010
comment
Если 51% компиляторов написаны на языке, на который они нацелены, это большинство, но остальные 49% по-прежнему являются многочисленными исключениями, нет противоречия. Я предоставил примеры компиляторов, написанных на языке, на который они нацелены, для скомпилированных основных языков. - person Aram Hăvărneanu; 30.03.2010
comment
@Aram Если 51% ... - да, но вы не дали никаких доказательств, что цифра не 49%. - person ; 30.03.2010
comment
Erlang здесь не совсем подходит. Большая часть БИБЛИОТЕКИ Erlang написана на Erlang, но виртуальная машина в ядре находится на C. Из моего корневого каталога Erlang find -name "*.c" | wc дает мне 489 исходных файлов C. То же для .erl файлов - 2506 файлов. Конечно, это не идеальный подход, но он дает хорошее ощущение. Беглый взгляд на распределение указанных файлов помещает большинство этих файлов C в реализации BEAM и HIPE - самое ядро ​​языковой среды выполнения. - person JUST MY correct OPINION; 30.03.2010
comment
Самозагрузка является актуальной техникой в ​​информатике, процесс четко определен и применяется. Я думаю, что этот ответ не заслуживает отрицательных отзывов - person Eineki; 30.03.2010
comment
@ttmrichter, вы правы, виртуальная машина Erlang, интерпретирующая байт-код, - это C, точно так же, как виртуальная машина Java, интерпретирующая байт-код Java, - это C, или виртуальная машина .NET, которая интерпретирует байт-код MSIL, - это C, но компилятор, который переводит исходный код erlang в erlang байт-код - это erlang, точно так же, как компилятор, переводящий java в java IL, - это Java. Я имел в виду именно это, поскольку фактически это компилятор. - person Aram Hăvărneanu; 30.03.2010
comment
Ах, да, я понял, что вам нужно. Сканер / парсер / treewalker / оптимизатор / все, что угодно, в основном написано на Erlang (потому что Erlang ХОРОШО в таких вещах), в то время как среда выполнения написана на C. часть. - person JUST MY correct OPINION; 30.03.2010
comment
Большинство - это не «большинство», и вы не предоставили никаких доказательств. Я считаю кобол основным языком. Существует множество примеров компиляторов, которые загружаются и не загружаются. Если у вас есть факты о «большинстве», пожалуйста, предоставьте их. - person user207421; 01.04.2010
comment
Учитывая количество компиляторов, которые поддерживают несколько языков ввода (например, набор GCC включает C, C ++, ObjectiveC, Fortran, ADA, Java), но реализован на одном языке (C), разумно сделать вывод, что компилятор реализован на каком-то языке. который отвечает различным критериям: достаточно эффективный (время выполнения / время разработки), переносимый и знакомый разработчикам. Другой пример - LLVM / Clang - поддерживает - (C, C ++, Objective-C) и реализован на C ++. Начальная загрузка актуальна исключительно в случае реализации на одном языке без используемых инструментов разработки на целевой платформе. - person grrussel; 02.10.2010
comment
@grrussel: FWIW, они, вероятно, могли бы отказаться от поддержки Java, и практически никто не пропустил бы это. Способ, которым сообщество Java использует этот язык, полностью отличается от того, как его поддерживает gcj. - person Donal Fellows; 02.10.2010
comment
@Aram: Ядро Java реализовано на C ++, но это лишь очень небольшая часть; механизм JIT переходит не с Java на C ++, а непосредственно на собственный машинный код. - person Donal Fellows; 02.10.2010

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

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

person Eli Bendersky    schedule 30.03.2010
comment
Глупо то, что очень легко написать ужасно производительный код обработки строк как на C, так и на C ++. Конечно, на самом деле это не вина этих языков, но они тоже не волшебно быстрее. Получение высокоскоростного компилятора в основном связано с разумным использованием структур данных и алгоритмов. (Забавно, вот что такое почти все высокопроизводительное программирование!) - person Donal Fellows; 02.10.2010

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

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

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

person Anton Gogolev    schedule 30.03.2010

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

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

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

person Andreas Brinck    schedule 30.03.2010
comment
Написание кода или его компиляция? Я видел несколько сверхбыстрых компиляторов C. (Однако C ++ сложнее.) Однако фактическая разработка кода выполняется медленно; это творческий и человеческий процесс, поэтому его невозможно преобразовать в простой алгоритм. (Алгоритмы, которые у нас есть, выполняют преобразование одного языка в другой, т. Е. Компиляцию.) - person Donal Fellows; 02.10.2010

Для Python существует собственный компилятор Python, который называется pypy.

person Christian    schedule 30.03.2010

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

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

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

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

person SK-logic    schedule 30.03.2010

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

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

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

person grrussel    schedule 02.10.2010