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

Каковы ключевые семантические различия между Ruby и Javascript

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

4b9b3361

Ответ 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 в , который.