Pull to refresh

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 или на каждую строчку, если это включить.
Скажите, а события в вашей библиотеке поддерживаются? Эмулировать нажатия клавиш, клики мышкой можно?
Да, поддерживаются. При подписывании на событие или передаче функцию js в функцию .net, принимающую делегат, что то же самое, будет создана обёртка, транслирующая вызов в js функцию
На всё том же sunspider первый проход jint закончил за 1 минуту 58 секунд. Понимая, что их осталось ещё 9, я закрыл тест, закрыл студию, удалил jint
Готов попробовать NiL.JS в нашем проекте, и соответственно писать багрепорты, если найдутся. Есть ли хоть какие-то минимальные примеры использования? Хоть простые вещи:
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 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());
Спасибо. Попробую. Куда лучше писать репорты? Чтобы тут не мусорить
Если, по какой-то причине, недоступен багтрекер на github, то в профиле есть скайп
Как автору той статьи про Rope интересно — как вы реализовали этот самый Rope и тестировалась ли скорость получения символа по индексу?
Дело в том что при простом создании Concatenation Node при склейке строк очень легко придумать сценарий в котором время индексации вырождается до O(n).
Я провел достаточно много времени в поисках алгоритма конкатенации который минимизирует матожидание времени доступа к символу, но ничего лучше декартова дерева по неявному ключу с рандомными приоритетами так и не откопал. А там конкатенация за логарифм.
Нет, таких исследований я не проводил. Хотя, да, стоит. Сейчас там реализация «в лоб». На тот момент задач ещё было гора, вагон и маленькая тележка, поэтому не хотелось надолго задерживаться на чем-то одном
Я не спец, но впечатляет. И код аккуратно выглядит, разобраться очень просто. Не хочу показаться глупым, но какое практическое применение? Ну кроме встроенного языка.
В рабочем проекте я приспособил его для локализации. Вместо стандартного DisplayNameAttribute мы используем его наследника, которому передаем путь к ресурсу с локализованым текстом
А есть возможность подключения html-страницы для дальнейшего обращения к DOM? Скажем, на примере jQuery.
Есть возможность подключить движок html. Если сможете найти или реализовать такой — пожалуйста. Стандарт ECMAScript не предусматривает реализации модели DOM
Sign up to leave a comment.

Articles