Подтвердить что ты не робот

На каком языке они строят другие языки?

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Большая часть такого рода вещей выполняется в C.

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

См

http://dinosaur.compilertools.net/

Ответ 8

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

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

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

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

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

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

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

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