Как стать автором
Обновить

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 сборке:
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.
Изменить настройки темы