Если кто-то должен был реализовать Ruby поверх механизма Javascript (либо в браузере, либо поверх автономного V8 или Spidermonkey), каково было бы несоответствие ключевого импеданса между объектными моделями Ruby и JS?
Каковы ключевые семантические различия между Ruby и Javascript
Ответ 1
Самое важное в вашем лице - это, очевидно, тот факт, что ECMAScript основан на прототипе, а Ruby - на основе класса плюс-mixin. Кроме того, в Ruby инкапсуляция выполняется с помощью объектов, в ECMAScript с закрытием.
Однако, я предполагаю, что конструкции потока управления Ruby будут намного более сложным, чем его объектная модель. В конце концов, Джеймс Коглан JS.Class - это в основном реализация объектной модели Ruby в ECMAScript, и она не такая большая.
ECMAScript просто не хватает инструментов, необходимых для создания собственных конструкций потока управления поверх него. Как правило, вам нужно либо GOTO
, либо продолжения, либо соответствующие хвостовые вызовы. Если у вас есть один из них, вы можете легко реализовать все остальное: исключения, циклы, переключатели, потоки, Fiber
s, генераторы, сопрограммы, и hellip; вы называете это.
Но ECMAScript не имеет их (и не зря, по крайней мере, в случае GOTO
). Единственный конструктор ECMAScript с управляющим потоком обладает настолько мощным, чтобы иметь возможность строить другие конструкции поверх исключений. К сожалению, это довольно медленно. (Тем не менее, они использовались в качестве субстрата реализации, например, в компиляторе Microsoft Live Labs Volta, который использовал исключения ECMAScript для реализации исключений .NET, итераторов, генераторов и даже потоков.)
Итак, в основном вы застряли в реализации, по крайней мере, своего собственного стека вызовов, если не весь интерпретатор (как в случае с HotRuby), выполняя глобальные преобразования CPS или что-то в этом роде.
В принципе, что вы хотите от механизма Ruby, работающего поверх ECMAScript,
- точная реализация RubySpec (в частности, конструкции потока управления, такие как потоки, волокна,
throw
/catch
, исключения и т.д.), - и
- Тесная интеграция с ECMAScript (т.е. возможность передачи объектов и вызова методов между двумя языками).
К сожалению, когда вам приходится прибегать к трюкам, например, управлять собственным стеком, делать преобразования CPS, основываясь на исключениях, & hellip; оказывается, что вы можете выбрать только два из трех целей.
Ответ 2
- Ruby имеет облачное определение локальных переменных на уровне блоков, JavaScript имеет область видимости уровня
- Наследование Ruby + mixins, скорее всего, будет проблематично реализовать, просто используя прототипное наследование JavaScript
- Проверка правильности Ruby для вызова метода/лямбда и более строгая, чем разрешающая передача JavaScript.
- Ruby имеет истинные, принудительные константы; JavaScript не может (в зависимости от того, какую версию использует интерпретатор)
- Переменные класса (ugh) не имеют эквивалента в JaveScript, поэтому потребуется специальная обработка
- Ruby имеет зеленые потоки в ядре, JavaScript не
Ответ 3
JavaScript завершает Turing, поэтому теоретически вы можете реализовать что-нибудь, в том числе и другие языки программирования. Неважно, насколько отличается реализация (JavaScript) и целевой язык (Ruby). Сопротивление несоответствия между языками, такими как Ruby и C, огромно, и там у вас есть Ruby, Python, Perl и JavaScript, все они реализованы на C.
Реализация Ruby в JavaScript должна быть на порядок проще, чем на языке более низкого уровня. В свою пользу, у вас есть большая часть стандартной библиотеки Ruby и Ruby, написанная в Ruby, поэтому, когда вы получаете базовый переводчик, все должно постепенно становиться все более и более спускаться.
Реализация эффективного интерпретатора Ruby в JavaScript может быть сложнее, но это все еще возможно. Вы можете закончить перевод Ruby на JavaScript, чтобы отличные оптимизаторы могли использовать.
Итак, не думайте о различиях между Ruby и JavaScript. Взгляните на стандартную реализацию Ruby и подумайте о том, как реализовать JavaScript в , который.