JavaScript движок в 30 сотен строк кода

Вступление


На сегодняшний день в мире уже больше десятка разномастных движков JavaScript'a. Некоторые из них достигли таких мощностей, что в переваривании кода стоят на одном уровне с нативными решениями. Однако, у всех, ну или почти у всех, есть один недостаток — все они написаны на C\C++. Но ведь парням из мира управляемого кода .NET тоже хочется приобщиться к этому мейнстриму. Идея эта не нова и уже успела породить Jurassic, Jint и даже обёртку над V8 — JavaScript .Net. А теперь добавился ещё один…

Что это?


Имя у него NiL.JS, оно рабочее и, с большой вероятностью, изменится. Проект есть на GitHub и разрабатывается одним человеком — мной. На данный момент TODO-list ещё не пуст и содержит: ворох Error, цикл forIn, блок with и оператор «lablel:», но уже то, что готово, позволяет делать примерные оценки результата:

Reflection

Здесь этот механизм оказался как нельзя кстати. Вы можете посмотреть на заготовку объекта Math, а я покажу Вам, как он подключается:
globalContext.AttachModule(typeof(Modules.Math));

Теперь при первом запросе Math из скрипта будет создан экземпляр этого типа и автоматически подключен к движку в глобальный контекст. Я планирую и дальше развивать механизм интеграции с платформой, правда не обойдётся без ограничений: перегрузки функций в javascript не поддерживаются и сейчас при попытке использовать что-нибудь перегруженное будет кидаться исключение.

Скорость

На фоне всё подогреваемой войны скоростей было бы не хорошо оставить это движок без оценки скорости. Однако, вы должны понимать, что платформа .NET не самая шустрая и заведомо проиграет любому нативному решению. На данный момент цикл
var a = 1; for(var i = 0; i < n;i++){ a = a * 3 * i; }

работает медленнее нативного выполнения примерно в 40 раз и медленнее V8 в 25-30 раз, а вот такой код
function fib(n) {
    if (n <= 2) {
        return n;
    }
    return fib(n - 1) + fib(n - 2);
}
var start = new Date;
for (var i = 0; i < 35; i++)
    fib(i);
console.log(new Date - start);

заставляет компьютер напрягаться от 85 до 90 раз дольше, чем он напрягается при выполнении этого кода движком V8.

Переносимость

Известно, что в зависимости от хоста на код .NET могут накладываться разные ограничения, а некоторые пространства имён могут быть просто недоступны. В этом проекте я постарался обойтись минимальным подмножеством платформенных средств, а включенный unsafe для проекта легко выключается после неалгоритмической правки нескольких строк.

В заключении


Я прошу вас прокомментировать сей проект, есть ли у него перспективы и стал ли он кому-нибудь интересен. Ведь, как известно, внимание со стороны это очень сильный мотиватор. А дабы не быть голословным в названии, вот скрин метрик кода в Relise сборке:
Tags:
NiL, js, javascript, javascript engine

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.