В рамках проекта Duktape (http://duktape.org/) развивается JavaScript-движок, ориентированный на встраивание в кодовую базу проектов на языке C/C++ и отличающийся компактным размером, высокой переносимостью и низким потреблением ресурсов. Исходные тексты движка написаны на языке Си и распространяются (https://github.com/svaarala/duktape) под лицензией MIT. Состояние проекты отмечено как стабильное и пригодное для промышленного применения.
Для интеграции Duktape в код на C/C++ достаточно (http://duktape.org/guide.html#gettingstarted) добавить в проект файлы duktape.c и duktape.h, и использовать Duktape API (http://duktape.org/api.html) для вызова функций на JavaScript из кода на C/C++ или наоборот. Код Duktape занимает около 200 Кб и потребляет всего 46kB ОЗУ, а в режиме низкого потребления памяти 22kB ОЗУ. Подобная особенность позволяет использовать Duktape на встраиваемых системах, укомплектованных 256kB Flash и 96kB ОЗУ.
Движок является полностью совместимым со спецификациями Ecmascript E5/E5.1, а также поддерживает часть возможностей из находящегося в разработке стандарта Ecmascript E6, в том числе поддерживается объект Proxy, который можно использовать для виртуализации свойств. Предоставляется также набор собственных расширений, таких как сопрограммы, встроенный фреймворк для журналирования, механизм загрузки модулей на основе CommonJS.
В состав входит встроенный движок для выполнения регулярных выражений и подсистема для поддержки Unicode. Для освобождения неиспользуемых объектов из памяти применяется сборщик мусора с финализатором, построенный на основе комбинации алгоритма (https://ru.wikipedia.org/wiki/%D0%A1%D0%... подсчёта ссылок с алгоритмом пометок (Mark and Sweep).
URL: https://news.ycombinator.com/item?id=8701228
Новость: http://www.opennet.me/opennews/art.shtml?num=41194
JIT?
Как Вы предполагаете совместить JIT и низкое потребление ресурсов?
Ну LuaJIT же как-то совместил
Все переменные глобальны,весь функционал в динамически линкуемых либах, действительно, как им удалось сделать его быстрым и легковесным?
> Все переменные глобальныэто ж надо. а создание совершенно независимых контекстов исполнения, со своими наборами переменных, поддерживается.
> весь функционал в динамически линкуемых либах
только что попробовал: у тебя враньё какое-то.
if true then print("hello"); endif
работает. никаких «внешних либ» для if и print не надо. и строки работают. и массивы. и словари. и математика. и луа-регулярки. а-я-яй, как нехорошо врать-то.
> if true then print("hello"); endifИ в чем бы был смысл если бы и это не работало?
А вот реальная задача, забрать по SNMP и положить в БД, требует портянки предварительной подготовки контекста в котором будет реализована требуемая логика, и в догонку установка дополнений кой нужно еще найти, по итогу написание простого скрипта занимает примерно столько же сколько реализация на с.
> совершенно независимых контекстов исполнения
В большенстве случаев совершенно независимые контексты нафиг не нужны, нужно адекватное наследование, и адекватная работа с индексами в выражениях for(i=0;i<x;i++), а не for(loop_15_i=0;loop_15_i<x;loop_15_i++);
На полноту знаний в данном вопросе я не претендую, у меня нет задачи решить задачу на lua, у меня есть просто задача, и множество раз возникала необходимость в программируемой прослойке между чем-то и чем-то, и js для этого подошел бы просто идеально, но нету нормальной реализации : либо монстр, либо вендор лок, либо лицензия продай душу, либо мертвое поделие. Поэтому попробовал lua, не понравилось, потому что интеграция равнялась бы прибиванию гвоздями.
>> if true then print("hello"); endif
> И в чем бы был смысл если бы и это не работало?не знаю, это же не я утверждал, что *всё* во внешних библиотеках.
> А вот реальная задача, забрать по SNMP и положить в БД, требует
> портянки предварительной подготовки контекста в котором будет реализована требуемая логика,
> и в догонку установка дополнений кой нужно еще найти, по итогу
> написание простого скрипта занимает примерно столько же сколько реализация на с.гениальный пример. мне даже и сказать-то нечего.
>> совершенно независимых контекстов исполнения
> В большенстве случаев совершенно независимые контексты нафиг не нужны, нужно адекватное
> наследование, и адекватная работа с индексами в выражениях for(i=0;i<x;i++), а не
> for(loop_15_i=0;loop_15_i<x;loop_15_i++);ты дурак, да? вопрос риторический.
> На полноту знаний в данном вопросе я не претендую, у меня нет
> задачи решить задачу на lua, у меня есть просто задача, и
> множество раз возникала необходимость в программируемой прослойке между чем-то и чем-то,
> и js для этого подошел бы просто идеально, но нету нормальной
> реализации : либо монстр, либо вендор лок, либо лицензия продай душу,
> либо мертвое поделие. Поэтому попробовал lua, не понравилось, потому что интеграция
> равнялась бы прибиванию гвоздями.вопрос действительно риторический…
> ты дурак, да?ну раз пытаюсь что-то до тебя донести, то видимо да.
> мне даже и сказать-то нечего.
Когда нечего сказать, принято молчать.
Мной был обозначен факт, что в луа отсутсвуют основополагающие механизмы, присущие иным языкам. Что делает его значительно проще на их фоне.А вот js, обтертый тысячами глаз программистов, годен - и для соло применения, и для встраивания, и для переноса в клиент-серверных системах.
Но ведь тебе все равно, в каком контексте было сказано что-либо, ты не можешь дать развернутое обьяснение, даже точку зрения обозначить не можешь, ты можешь лишь пукнуть парой слов обильно сдобренных негативом, потому что тебе действительно нечего сказать по делу, лишь г..но из тебя прет бессмысленно пачкая все вокруг.
зрелищем твоего развороченого афедрона удовлетворён.
В ваших копрофильских фетишах совсем не силен, но троль ты такой же махровый.
когда я указываю тебе на твой идиотизм — это не троллинг, а печальная правда жизни.
аааа, да, я просто не заметил
> совместить JIT и низкое потребление ресурсов?Я Вам сейчас открою секрет страшный - хороший JIT один из немногих корректных путей обеспечить хорошее б-е для языков такого класса.
Вопрос в степени прямизны JIT и разработчика самого приложения.
JIT зло и оверхед большой
> JIT зло и оверхед большойхорошо, что Mike Pall не в курсе.
> JIT злоЖдем Вашего рецепта решения проблемы низкой про-ти.
> и оверхед большой
JIT вообще-то добавляет "оверхед" только на первом этапе работы.
Скажем ф-я вызвалась Н раз (к примеру - 100), в 101-й уже выполнился найтивный код
> Ждем Вашего рецепта решения проблемы низкой про-ти.Статическая типизация и компиляция. Никакой принципиальной проблемы во вкрутке компилятора в приложение нет. Язык, правда, надо подобрать подходящий. Я бы, пожалуй, в сторону паскаля смотрел - он всегда компилился шустро, а излишние языковые возможности в скриптах - только во вред.
Добрый день.> Статическая типизация
Никаким боком к JIT. Вообще. Самый наглядный пример - Java.
Не надо сводить JIT только в JS и т.д.
JIT актуален (причем - прежде всего) и там, где генерируется байт-код> и компиляция. Никакой принципиальной проблемы во вкрутке компилятора
> в приложение нет.Т.е. Вы предлагаете тот путь, по которому пошли в Google с AOT в Android ?
Путь интересный, но в некоторых случаях спорный, и вот почему:
К примеру - что делать в случае, если приложение должно исполнять другой, загружаемый кусок ? Типа AS серверов ?> а излишние
> языковые возможности в скриптах - только во вред.Так Вы значит только о скриптах ?
Простите, а Вы не забыли, что сегодня на этих скриптах, которым как Вы говорите "а излишние языковые возможности в скриптах - только во вред." строятся целые приложения и с учетом этого момента и стоит решать ?
а есть js-интерпритатор для консоли? возможно на нём...
>а есть js-интерпритатор для консоли? возможно на нём...aptitude search spidermonkey
apt install nodejs
"Состояние проекты "
Но при этом: "стабильное и пригодное для промышленного применения"
Чем оно лучше LuaJIT?
Язык программирования менее эзотеричен (Таблицы и метатаблицы для всего и double для всех числовых данных? Спасибо, не нужно.)
В чём проблема, если JIT это оптимизирует?
> В чём проблема, если JIT это оптимизирует?Только в 22 кило RAM все это уже явно не уместится.
в Lua 5.3 есть integer
> в Lua 5.3 есть integerЭто прорыв !!!
таблицы - это просто хэши
магия с прототипами вам больше нравится?
как по вашему в js представлены числа?
> магия с прототипами вам больше нравится?Monkey patching FTW!!!
> Таблицы и метатаблицы для всего и double для
> всех числовых данных? Спасибо, не нужно.ты только что описал javascript.
Например, тем, что количество людей, умеющих писать на JS, больше тех, кто умеет Lua, раз в сто как минимум. Готового кода тоже в достатке.Правда, непонятна скорость этой штуки.
> Правда, непонятна скорость этой штуки.Duktape (finally released in October 2014) lacks a lazy evaluation model.
http://wiki.netsurf-browser.org/Developer_Weekend_%28No...
Скорее бы к netsurf прикрутили - будет хотя бы один легкий браузер с js.
Си-подобностью? Переносимостью (в браузер без всяких lua2js) и интероперабельностью с JS-кодом?
> Чем оно лучше Squirrel?Отремонтировал для большей справедливости
Повод для еще одного форка nodejs
больше жаваскрипов для бога жаваскрипов! see? njs? jx9? фатальные недостатки!
движок регулярных выражений, само собой, чисто бэктрекинговый. авторы малацца, жгут.
> Для интеграции Duktape в код на C/C++ достаточно добавить в проект файлы duktape.c и duktape.hНе думал, что в 2014 найдутся люди, не понимающие, почему по пути gnulib идти нельзя.
и что тебе не нравится? ты не в курсе термина «амальгамизация»?
Ты bundle'ишь в программу zlib. Или libpng. Или md5.c. Завтра там находят уязвимость. Твои действия?
> Ты bundle'ишь в программу zlib. Или libpng. Или md5.c. Завтра там находят
> уязвимость. Твои действия?выпускаю фикс. конечному пользователю вообще по-барабану, в дистрибутиве давно всё починил маинтайнер. ещё идиотские вопросы есть?
Ну, я бы сказал, что он прав... если бы сабж совершенно очевидно не был рассчитан на какой-то эмбед, где хоть шаред, хоть статическую либу будет (или не будет) фиксить один и тот же разработчик прошивки
> Ну, я бы сказал, что он прав...нет, он идиот. который уверен, что если дали амальгаму, то единственный метод использования амальгамы — затащить к себе в проект. мозги же у него отсутствуют, и предположить, что амальгамизация никак не мешает делать отдельную библиотеку, он не в состоянии.
Ты выкатываешь новую прошивку. Или забиваешь, так как устройство с уязвимостью тобой уже не поддерживается. Еще раз посмотри описание (в частности, акцент на малом потреблении памяти) и подумай, на какое применение эта штука рассчитана.
Очень даже верный подход. То, что многие отказались от него и даже успели нагородить свехсложную интеграцию - не делает их правыми.
Один из ярчайших примеров использования данной техники - это sqlite, весьма удачное решение
> Один из ярчайших примеров использования данной техники - это sqlite, весьма удачное
> решение% locate libsqlite
/usr/lib64/libsqlite3.so
/usr/lib64/libsqlite3.so.0
/usr/lib64/libsqlite3.so.0.8.6Вообще мимо кассы. Я говорил про подход gnulib.
> Вообще мимо кассы. Я говорил про подход gnulib.
Полезная вещь! Время от времени думал о том что неплохо бы найти нечто подобное, но лениво было.
А аналоги есть? (чтобы сравнить и выбрать лучшее)
А кто пробовал, а то у меня почему-то require не работает. Что нужно - поделитесь опытом?
Нужно определить следующую конструкцию:```
Duktape.modSearch = function (id) {
var res;print('loading module:', id);
// _source_code_from_module = read('...'); // Provide source code from name
return _source_code_from_module;
}
```Удачи.