Comments 20
А можно всё-таки немного сравнения с конкурентами? =) Что-то же послужило причиной написания своего решения, интересно было бы узнать, чем именно не устроил тот же Jurassic. Когда я где-то год назад присматривался к JS-движкам, остановился именно на нём: он показался самым зрелым и активно развивающимся. (Правда потом пришёл к выводу, что для моих нужд удобнее просто взять и заюзать PhantomJS, но это совсем другая история.)
Jurassic использует System.Reflection.Emit, который недоступен на некоторых платформах. В частности WP7. Платформа старенькая, конечно, но всё таки.
Если смотреть по производительности, то по результатам sunspider jurassic медленнее примерно на 40%: Jurassic, NiL.JS.
Если смотреть на поддержку стандартов, то Jurassic заваливает 759 тестов (версия 2.1) из 11 121. NiL.JS — 87 из 11 547.
Если оценивать сложность интеграции (передачу объектов в среду js, получение их обратно) то Jurassic требует навешивать атрибуты на свойства и методы, которые должны быть доступны (у них это в TODO). NiL.JS работает с любым типом (включая generic) из коробки и, при желании, можно дать доступ к целому пространству имён (на GitHub есть пример с System.Windows.Forms).
Вот в чём я им точно проигрываю, так это в отладке. Они поддерживают отладку в студии, у меня только скромный callback по оператору debugger или на каждую строчку, если это включить.
Если смотреть по производительности, то по результатам sunspider jurassic медленнее примерно на 40%: Jurassic, NiL.JS.
Если смотреть на поддержку стандартов, то Jurassic заваливает 759 тестов (версия 2.1) из 11 121. NiL.JS — 87 из 11 547.
Если оценивать сложность интеграции (передачу объектов в среду js, получение их обратно) то Jurassic требует навешивать атрибуты на свойства и методы, которые должны быть доступны (у них это в TODO). NiL.JS работает с любым типом (включая generic) из коробки и, при желании, можно дать доступ к целому пространству имён (на GitHub есть пример с System.Windows.Forms).
Вот в чём я им точно проигрываю, так это в отладке. Они поддерживают отладку в студии, у меня только скромный callback по оператору debugger или на каждую строчку, если это включить.
Скажите, а события в вашей библиотеке поддерживаются? Эмулировать нажатия клавиш, клики мышкой можно?
А чем плох jint в версии 2.x?
На всё том же sunspider первый проход jint закончил за 1 минуту 58 секунд. Понимая, что их осталось ещё 9, я закрыл тест, закрыл студию, удалил jint
Готов попробовать NiL.JS в нашем проекте, и соответственно писать багрепорты, если найдутся. Есть ли хоть какие-то минимальные примеры использования? Хоть простые вещи:
1) установка значений глобальных переменных
2) добавление глобальных внешних функций
3) вызов js-функции с передачей параметров (простые типы, .net объекты, массивы) и возвратом результата
Очень полезная штука, если ещё нет — возможность ограничения времени выполнения скрипта.
1) установка значений глобальных переменных
2) добавление глобальных внешних функций
3) вызов js-функции с передачей параметров (простые типы, .net объекты, массивы) и возвратом результата
Очень полезная штука, если ещё нет — возможность ограничения времени выполнения скрипта.
В тестовом проекте на GitHub, а конкретно в файле Program.cs есть примеры добавления глобальных переменных и функций. Но нормальных примеров, признаю, нет. Упустил. Сегодня, но чуть позже, напишу мануал по основным возможностям в там вики.
Ограничить время выполнения нельзя.
Ограничить время выполнения нельзя.
Да, там посмотрел. Но не нашел как вызвать функцию скрипта после его первого выполнения.
Например:
var script = new Script(@"
function test(a,b,c) {
return a+b+c;
}
");
script.Invoke();
а теперь надо вызвать test с передачей туда параметров и получением результата… как?
в script.Context не нашлось чего-то похожего
Например:
var script = new Script(@"
function test(a,b,c) {
return a+b+c;
}
");
script.Invoke();
а теперь надо вызвать test с передачей туда параметров и получением результата… как?
в script.Context не нашлось чего-то похожего
Подготовил примеры. Можно посмотреть
Конкретно в этом случае:
Конкретно в этом случае:
var addFn = script.Context.GetVariable("test").Value as NiL.JS.Core.BaseTypes.Function;
System.Windows.Forms.MessageBox.Show(addFn.Invoke(new NiL.JS.Core.Arguments { 1, 2, 3 }).ToString());
Как автору той статьи про Rope интересно — как вы реализовали этот самый Rope и тестировалась ли скорость получения символа по индексу?
Дело в том что при простом создании Concatenation Node при склейке строк очень легко придумать сценарий в котором время индексации вырождается до O(n).
Я провел достаточно много времени в поисках алгоритма конкатенации который минимизирует матожидание времени доступа к символу, но ничего лучше декартова дерева по неявному ключу с рандомными приоритетами так и не откопал. А там конкатенация за логарифм.
Дело в том что при простом создании Concatenation Node при склейке строк очень легко придумать сценарий в котором время индексации вырождается до O(n).
Я провел достаточно много времени в поисках алгоритма конкатенации который минимизирует матожидание времени доступа к символу, но ничего лучше декартова дерева по неявному ключу с рандомными приоритетами так и не откопал. А там конкатенация за логарифм.
Я не спец, но впечатляет. И код аккуратно выглядит, разобраться очень просто. Не хочу показаться глупым, но какое практическое применение? Ну кроме встроенного языка.
Разреженный массив можно было сделать как LinkedHashMap в java
А есть возможность подключения html-страницы для дальнейшего обращения к DOM? Скажем, на примере jQuery.
Sign up to leave a comment.
Алгоритмы и решения при разработке движка JavaScript на C#