Ответ 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; оказывается, что вы можете выбрать только два из трех целей.