Вопрос

Некоторое время я программировал в Ruby, теперь только с стандартной реализацией МРТ Ruby, но мне всегда было интересно другим реализациям, о которых я так много слышу.

Я читал по Рубинсу на днях, рубин-переводчик, написанный в Руби. Я попытался посмотреть в разных местах, но мне было трудно выяснить, насколько что-то подобное это работает. У меня никогда не было много опыта в компиляторах или написании языка, но мне очень интересно понять это.

Как именно может быть интерпретирован язык? Есть ли базовый шаг в составлении того, что я не понимаю, где это имеет смысл? Может кто-нибудь объяснить это мне, как я идиот (потому что это не будет слишком далеко от базы в любом случае)

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

Решение

Это проще, чем вы думаете.

Рубинс не на 100% написан в Ruby, просто в основном.

От http://rubini.us/

Большой аспект популярных языков, таких как C и Java, заключается в том, что большинство функциональных возможностей, доступных для программиста, написано на самом языке. У Рубинса есть цель добавления Ruby в этот список. Rubyists могут легче добавлять функции на язык, исправить ошибки и узнать, как работает языком. Везде, куда возможен Рубинс написан в Руби. Где невозможно (пока), это C ++.

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

Концепция, которую вы ищете, это Компилятор загрузки.

В основном загрузка означает запись компилятора (или переводчика) для языка Икс на языке Икс. Отказ Это делается либо путем написания базового компилятора на более низком уровне вручную (то есть написание компилятора C в сборке) или с помощью другого языка высокого уровня.

Узнайте больше о загрузке на Википедия. Отказ Ответ Грега в отношении мета-круговых оценщиков также настоятельно рекомендуется, включая соответствующую главу в SICP.

В случае Рубинса VM написан в C ++ и имеет дело со всеми низким содержанием (связанной с системой операционной системы) и базовые операции. VM имеет свой собственный формат Bytecode (например, JVM имеет свой собственный), и когда Rubinius запущен, он запускает виртуальную машину, которая выполняет Bytecode. Однако большая часть стандартной библиотеки Рубинса (которая является частью RUBY, язык), реализуется в Ruby, по сравнению с C (МРТ) или Java (JRuby). Кроме того, компилятор Rubinius Bytecode также написан в Ruby. Так что да, в какой-то момент в начале вначале они должны были использовать стандартный переводчик Ruby (MRI) для загрузки рубинца. Но это больше не должно быть (хотя я не уверен, что вам все равно может понадобиться, так как его сборка использует грабли).

Предположим, язык вы работаете, это какой-то язык, скажем, Lisp, хотя это не имеет значения. (Может быть C ++, Java, Ruby, что угодно.)

Ну, у вас есть реализация Lisp. Позвоните в эту реализацию Imp (только некоторые сделанные именем короткие для реализации). Поскольку Imp - это сама по себе программа, ваш компьютер может запустить его. Теперь вы пишете свою собственную реализацию для Lisp, написанные в Lisp, и вы называете IT CIRC. CICK - это просто программа, собранная (или интерпретирована, если вы будете) из кода LISP. Ваш код написан, чтобы он читал в файле, разбирается (обрабатывает его в значимые данные) и делает что-то с данными. Что это что-то? В случае CICK он выполняет данные.

Но как это сделать так?

Хорошо, предположим, что для простого случая, что кодовое значение читает и анализаторы, это что-то простое, как делать некоторые математики и выводит результат. Крик обрабатывает код в простых в использовании данных (ну для языка, такого как Lisp легко начнется, но это за пределами точки) и хранит его. Хорошо в Lisp, вы можете написать код для хруста, поэтому код, написанный для CICK, может сделать это тоже, потому что он написан в Lisp. Таким образом, обработанные данные подключены к некоторому добавлению кода обработки ... и VOILA! У вас есть численный результат! Тогда программа вашего канала выводит результат.

То же самое можно сделать с более сложными вещами, чем простые математики. На самом деле вы можете компилировать / интерпретировать другие аспекты языка. Напишите достаточно этих «других аспектов» и приклейте их вместе, вы получаете компилятор AA для Lisp, написанные в Lisp.

Поскольку компилятор скомпилирован IMP, его можно запускать вашу машину, а Presto! Вы сделали.

Эта техника обычно называется Метациртный оценщик И сначала введен несколько десятилетий назад в контексте Лисски.

Хорошее описание техники можно найти в Структура и интерпретация компьютерных программ, Глава 4.

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