Каковы ключевые семантические различия между Ruby и Javascript? - PullRequest
12 голосов
/ 01 апреля 2011

Если бы кто-то реализовал Ruby поверх движка Javascript (либо в браузере, либо поверх автономного V8 или Spidermonkey), каковы были бы несоответствия ключевых импедансов между объектными моделями Ruby и JS?

Ответы [ 3 ]

7 голосов
/ 01 апреля 2011

Самым очевидным является тот факт, что ECMAScript основан на прототипах, а Ruby - на классах с миксинами.Кроме того, в Ruby инкапсуляция выполняется с объектами, в ECMAScript - с замыканиями.

Однако я предполагаю, что конструкции потока управления в Ruby будут гораздо более серьезным препятствием, чем его объектная модель.В конце концов, JS.Class Джеймса Коглана является в основном реализацией объектной модели Ruby в ECMAScript, и она не так уж и велика.ваши собственные конструкции потока управления поверх него.Как правило, вам нужны либо GOTO, либо продолжения, либо правильные хвостовые вызовы.Если у вас есть один из них, вы можете легко реализовать все остальное: исключения, циклы, переключатели, потоки, Fiber s, генераторы, сопрограммы, ... вы называете это.

Но в ECMAScript их нет (и по уважительной причине, по крайней мере, в случае GOTO).Единственная конструкция потока управления, имеющаяся в ECMAScript, достаточно мощная, чтобы можно было строить другие конструкции поверх исключений.К сожалению, это довольно медленно.(Тем не менее, они использовались в качестве субстрата реализации, например, в компиляторе Microsoft Live Labs Volta, который использовал исключения ECMAScript для реализации исключений .NET, итераторов, генераторов и даже потоков.)

Итак, в основном вы застряли в реализации хотя бы своего собственного стека вызовов, если не всего интерпретатора (как в случае с HotRuby), выполнении глобальных преобразований CPS или чего-то в этом роде.

По сути, что вы хочу от движка Ruby, работающего поверх ECMAScript, является

  1. точной реализацией RubySpec (в частности, конструкции потока управления, такие как потоки, волокна, throw / catch, исключения и т. Д.),
  2. производительность и
  3. тесная интеграция с ECMAScript (т. Е. Возможность передавать объекты и вызывать методы назад и вперед между двумя языками).

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

3 голосов
/ 01 апреля 2011
  1. В Ruby есть область видимости локальных переменных на уровне блоков, в JavaScript - область действия на уровне функций
  2. В Ruby наследование + миксины, вероятно, было бы проблематично реализовать просто с использованием прототипного наследования JavaScript
  3. Ruby проверяет арность для вызова метода / лямбды и является более строгим, чем разрешающая передача JavaScript
  4. В Ruby есть истинные принудительные константы; JavaScript не может (в зависимости от того, какую версию использует переводчик)
  5. Переменные класса (тьфу) не имеют эквивалента в JaveScript, поэтому требуют специальной обработки
  6. Ruby's имеет зеленые нити в ядре, JavaScript не
2 голосов
/ 03 апреля 2011

JavaScript завершен по Тьюрингу, поэтому теоретически вы можете реализовать все, что угодно, включая другие языки программирования. Неважно, насколько отличаются реализация (JavaScript) и целевой язык (Ruby) . несоответствие импеданса между такими языками, как Ruby и C, огромно, и там у вас есть Ruby, Python, Perl и сам JavaScript, все реализованные на C.

Реализация Ruby в JavaScript должна быть порядкомвеличины проще, чем делать это на языке более низкого уровня.В ваших интересах то, что большая часть стандартной библиотеки Ruby и Ruby написана на самом Ruby, поэтому, как только вы начнете работать с базовым интерпретатором, все постепенно будет становиться все более и более унылым.

Реализация эффективной Интерпретатор Ruby в JavaScript может быть сложнее, но все же возможно.Вы можете в конечном итоге перевести Ruby на JavaScript, чтобы можно было использовать превосходные доступные оптимизаторы.

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

...