Как вы пишете компилятор на язык на этом языке? [Дубликат

StackOverflow https://stackoverflow.com/questions/4265716

Вопрос

Возможные дубликаты:
Как можно написать компилятор языка на этом языке?
Реализация компилятора в «самом себе»

Я смотрел на Рубин, Реализация RUBY, которая компилирует к Bytecode с помощью компилятора, написанного в Ruby. Я не могу вернуть голову вокруг этого. Как вы пишете компилятор на язык на самом языке? Похоже, что это будет просто текст без чего-либо, чтобы скомпилировать его в исполняемый файл, который мог бы собрать будущий код, написанный в Ruby. Я запутался, просто набрав это предложение. Кто-нибудь может помочь объяснить это?

Это было полезно?

Решение

Чтобы упростить: сначала напишите компилятор для компилятора, на другом языке. Тогда вы компиляторы компилятора и Voila!

Итак, вам нужен какой-то язык, который уже имеет компилятор - но поскольку есть много таких, вы можете написать компилятор Ruby Compiler (!), Например, в C, который будет компилятором Ruby, который может затем собрать программы Ruby Даже дополнительные версии сама.

Конечно, оригинальные компиляторы были написаны в машинном коде, скомпилированные компиляторы для сборки, которые в свою очередь скомпилированы компиляторы для, например, C или Fortran, которые скомпилированы компиляторы для ... в значительной степени все. Итеративное развитие в действии.

Процесс называется загрузка - Возможно названа в честь истории Барона Мюнхаузена, в которой он вытащил себя из болота своих собственных Bootstraps :)

Другие советы

Что касается начала компилятора компилятора, стоит читать об этом дьявольском умном взломе.

http://catb.org/jargon/html/b/back-door.html.

Я запутался просто читать это предложение.

Это может помочь подумать о компиляторе в качестве переводчика, которые компиляторы часто называют. Его цель - предпринять исходный код, который люди могут читать и переводить его в двоичный код, которые могут прочитать компьютеры. В случае Rubinius код, который он читает, оказывается RUBY-кодом, и код, который он преобразует его в машинный код (фактически Master Code, который сам по себе дополнительно скомпилирован в Intel Machine Code, но это просто деталь фона) Отказ Сам Рубинс мог быть написан практически на любом языке программирования. Просто было написано на одном языке, который он компилирует.

Конечно, вам нужно что-то, чтобы запустить Рубинс в первую очередь, и это, скорее всего, обычный переводчик Ruby. Обратите внимание, однако, что, как только вы сможете запустить Rubinius на интерпретатере, вы можете пройти свой собственный исходный код, и он создаст и запустит компиляционную версию себя. Это называется загрузкой, из старой фразы «подтягивая себя за бутстрапс».

Одно окончательное примечание: программы Ruby не могут вызывать произвольный аппаратный код. Эта часть Рубинца на самом деле написана на C ++.

Ну, можно сделать это в следующем порядке:

  1. Напишите компилятор на любом языке, скажем, C для вашего курсивого кода.
  2. Теперь, когда вы можете собрать код Ruby, вы можете написать компилятор, который компилирует код RUBY и компилял этот компилятор с компилятором C вы написали на шаге 1. Wahh Это предложение странно!
  3. Отныне вы можете скомпилировать весь ваш код Ruby с компилятором, написанным в 2. :)

Повеселись! :)

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

Веселье приходит, когда вы пишете компилятор для языка для платформы, написанные на одном языке, что еще не имеет компилятора для вашего языка реализации. Ваш выбор здесь - составить на другую платформу, для которой у вас есть компилятор, или напишите компилятор на другом языке и используете это для компилятора «REAL».

Это процесс 2 шага:

  1. Напишите компилятор Ruby в каком-то другом Lanaguriage, как C, при условии, что компилятор Ruby еще не существует
  2. Так как у вас сейчас есть компилятор Ruby, вы можете написать программу Ruby, которая (новый) Ruby Compiler

Поскольку кто-то уже написал компилятор Ruby (Matz), вы «только» должны сделать вторую часть. Проще сказать, чем сделать.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top