На каком языке они строят другие языки? - PullRequest
25 голосов
/ 10 января 2010

Какой язык используется для создания языков низкого уровня, таких как c ++ и java?

Как вы могли бы создать первый язык без языка?

Ответы [ 8 ]

32 голосов
/ 10 января 2010

В контексте компиляторов эту операцию часто называют bootstrapping . В частности, см. Раздел «Проблема с курицей и яйцом», чтобы получить прямой ответ на ваш вопрос.

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

Существует также отличная статья под названием Размышления о доверии к доверию Кена Томпсона о рисках использования компилятора для языка для создания компилятора для этого языка.

14 голосов
/ 10 января 2010

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

Первый автономный компилятор - способен компилировать свой собственный источник код на языке высокого уровня - был создан для Лисп ... С 1970-х годов это стало обычной практикой реализовать компилятор на языке он компилируется, хотя и Паскаль, и C был популярным выбором для язык реализации. http://en.wikipedia.org/wiki/Compiler

6 голосов
/ 10 января 2010

Многое из этого сделано в C.

Первый компилятор C не был написан на C; это был ассемблер PDP-11. Другие ранние компиляторы Си были написаны на разных языках ассемблера.

Но все последующие компиляторы C на самом деле написаны на C на основе раннего "Portable C Compiler". Да, это круговая Но компилятор версии x можно использовать для сборки компилятора версии x + 1.

4 голосов
/ 10 января 2010

Я думаю, что ключевым моментом в вашем вопросе является понятие boot-strapping . Ссылка опишет, как язык может самостоятельно размещаться.

Это довольно распространено в сообществе Лисп. например Некоторые университетские классы будут использовать Scheme для написания языкового подмножества (это не деятельность класса компилятора).

Тем не менее, многие компиляторы написаны на других языках. Например, PUGS (Perl 6) написан на Haskell. Ruby доступен на C или Java (как JRuby ).

3 голосов
/ 10 января 2010

есть пара опций, вы можете реализовать весь язык на языке, доступном на целевом хосте, например C или Ocaml, каким бы он ни был. Если у вас есть такая реализация, вы можете написать компилятор / интерпретатор на самом языке, построить его, и теперь язык запускается сам. этот процесс называется ' bootstrapping '.

1 голос
/ 11 января 2010

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

Однако, есть некоторые языки, которые были специально разработаны для написания компьютерных языков - это lex, yacc, flex, bison (обновленные версии lex и yacc). Они позволяют вам представить лексическую и грамматическую спецификацию некоторых языков (я считаю, LLR или LALR) в форме, которая может быть скомпилирована в эффективный распознаватель языка.

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

См

http://dinosaur.compilertools.net/

1 голос
/ 10 января 2010

Нет такой вещи, как "нет языка". Центральный процессор работает с серией сигналов, которые мы называем битами или единицами и нулями (технически, изменения в потоке электрического тока). В 50-е годы кодирование осуществлялось непосредственно в том виде, в котором «понимал» процессор, и скорость, с которой осуществлялось программирование, составляла примерно до 20 команд ассемблера в день.

0 голосов
/ 10 января 2010

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

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

  1. Введите целевой язык x для компьютера y на языке z на компьютере (urk) a .

  2. Введите целевой язык x для компьютера y на языке x . Теперь одна компиляция на a создаст транслятор, который может работать на y , а вторая компиляция может быть на y с полностью загруженной системой.

Проблема упрощается, если языки или машины не различаются.

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

  • Запишите более мощную виртуальную машину (возможно, стековую машину или что-то со строками) в машинном коде
  • Теперь, записывая байт-код виртуальной машины, напишите что-нибудь ближе к языку

Что-то вроде Форта может сделать хороший промежуточный шаг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...