Самым очевидным является тот факт, что 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, является
- точной реализацией RubySpec (в частности, конструкции потока управления, такие как потоки, волокна,
throw
/ catch
, исключения и т. Д.), - производительность и
- тесная интеграция с ECMAScript (т. Е. Возможность передавать объекты и вызывать методы назад и вперед между двумя языками).
К сожалению, когда вам приходится прибегать к таким хитростям, как управление собственным стеком, выполнение преобразований CPS, сборкапомимо исключений ... получается, что вы можете выбрать только два из трех голов.