Доступна (http://mailman.nginx.org/pipermail/nginx/2018-October/057065...) новая версия njs 0.2.5 (http://nginx.org/en/docs/njs/), интерпретатора языка JavaScript для веб-сервера nginx. Интерпретатор njs реализует стандарты ECMAScript (http://nginx.org/ru/docs/njs/compatibility.html) и позволяет расширять (http://nginx.org/ru/docs/njs/) возможности nginx по обработке запросов с помощью скриптов (http://nginx.org/ru/docs/njs/examples.html) в конфигурации.
Скрипты могут использоваться в файле конфигурации для определения расширенной логики обработки запросов, формирования конфигурации, динамической генерации ответа, модификации запроса/ответа или быстрого создания заглушек с решением проблем в web-приложениях.
В новом выпуске улучшена поддержка спецификации ECMAScript 5.1,
исправлено более 13 ошибок, улучшена обработка различных значений в функции Array.prototype.slice(), реализована поддержка дробей без целочисленной части, добавлена поддержка объекта "arguments (https://developer.mozilla.org/ru/docs/Web/JavaScript/Referen...)" для обработки в функциях произвольного числа аргументов и переопределения встроенных функций.
URL: http://mailman.nginx.org/pipermail/nginx/2018-October/057065...
Новость: https://www.opennet.ru/opennews/art.shtml?num=49524
и сюда js прокрался, ну почему...
Ну, если люди кодят на js, то почему бы и не появиться
Может потому что тех, кто кодит на JS лучше не пускать туда, где нужен nginx?
JS везде, соответственно и те кто на нем кодит везде. По твоему получается что?
> JS везде, соответственно и те кто на нем кодит везде. По твоему
> получается что?JS только в браузере, потому что так исторически сложилось.
А вот любить JS и поэтому воткнуть его везде - нужно быть редким извращенцем.
Таких отбитых к нормальному коду - не пускать.
JS настолько хорош, что подходит почти для любой сферы, от веба до embedded, вот только с научными расчётами проблема.
Ну почему проблемы. Недавно в js появилась поддержка BigInt. Это факт может дать новый толчёк, например, машинному обучению. Конечно, никто не говорит о производительности таких научных расчётов, суть в быстром прототипировании. Да и вообще, на худой случай можно использовать webassembly.
>толчёкЯсно.
>Да и вообще, на худой случай можно использовать webassembly.
Почему на "худой"?
> Недавно в js появилась поддержка BigIntЛучше бы поддержка BigDecimal появилась.
для прототопирования тот же питон чем не устраивает?
> для прототопирования тот же питон чем не устраивает?а чем питон лучше js??
Ничем. Те же яйца, как руби и остальные перлы.
Очевидно, потому что он хуже плюсов.
> JS настолько хорош, что подходит почти для любой сферы, от веба до
> embedded, вот только с научными расчётами проблема.Что, на самом деле и моторчиком гироскутера в реальном времени поуправлять может? Да еще и так, чтобы хипстеру не пришлось каждую минуту тренироваться в низких бреющих полетах и торможении об асфальт носом? Ух ты!
Или на нем дрова c системным софтом пишут?
А может браузер или JIT-компилеры-самого-себя?
Или не-хелловрот-вебсервера (замшелым нжинксам или хотя бы апачам не сильно уступающие) ваяют?Или "автомобиль может быть любого цвета, если этот цвет черный!"?
Насчёт вебсерверов, это вы мимо :-) На ноде чего только не пишут. Я встречал сервер раздачи видео, например.
> Насчёт вебсерверов, это вы мимо :-) На ноде чего только не пишут.А нода разве на JS?
у js полно своих проблем тож он не на столько хорош
эмбеддинг? на"жиэс" ?? дно, походу, достигнуто
если есть хороший интерпретатор и хардовая библиотека обработки низкоуровневых операций, то почему бы и нет :)
с помощью баш-скриптов управляют же крутыми и мощщщщными серверами. а чем ентот скриптовый язык хужее.
драйвер видюхи конечнож не напишешъ, но жс-писателей к такому и не допускають.
> если есть хороший интерпретатор и хардовая библиотека обработки низкоуровневых операций, то почему бы и нет :)Посмотреть бы, как вы ответите на этот «риторический» вопрос рядом с механизмом, от которого зависит ваша безопасность и в контроллере которого требования реального времени борются со сборщиком мусора. Подозреваю, что в библиотеку обработки низкоуровневых операций вы после этого захотите перенести примерно всё.
Каждое поколение пытается взгромоздить на самоходную газонокосилку язык дня: Java, Scheme, Python, — теперь JavaScript. Гранты осваивают, диссеры защищают…
Вот только программировать это всё будет махровый индус и последнее, что бы вы хотели - это чтобы он лез в эту библиотеку низкоуровневых операций. А это суровая реальность.Все эти языки и изоляции нужны чтобы максимально защитить вас от результата работы не слишком гениальных программистов (99%).
> Подозреваю, что в библиотеку обработки низкоуровневых операций вы после этого захотите перенести примерно всё.Ну оно примерно так всё и обстоит когда делают адекватные опытные люди. Ввод/вывод, обработка всего критичного (да и не только) основного функционала делает то, что в вашей терминологии - "библиотека обработки низкоуровневых операций". А для всякого сервисного, технологического и иногда "высокоуровневой" логики работы (не сильно критичной по времени и кастрированной ровно настолько чтоб минимальный функционал/безопасность обеспечивались даже если скрипты вообще "упадут" на первой же строке и навсегда), то почему бы и нет. Выбирается движок не по достоинствам скриптового языка, а по легкости встраивания, прожорливости и приемлемости/знакомости для участников. Делается не ради понтов, а чтобы часть работы могли делать менее квалифицированные товарищи (обычно "не из нашего района") так чтобы без шансов сломать что-либо важное. И чтобы им же было проще вносить хренилион мелких исправлений по мелким замечаниям типа "вот тут должно мигать чуть побыстрее", "при нажатии кнопки должно пищать 3 раза, а не 2" - не трогая ни нормальный код, ни нормальных разработчиков. Ну и вопрос ответственности (это же не "мы", а "мы вместе с вами" разрабатывали!)
Мне не очень нравится термин "библиотека обработки низкоуровневых операций" - он как бы намекает, что это набор каких-то разрозненных данных/функций, а тут всем рулит Скрипт (или даже СКРИПТ) и он лишь дергает какие-то низкоуровневые функции для мелкой черновой работы (хотя для поднятия самооценки пишуших такие скрипты - пусть так и считают). По факту, это обычной embedded проект, где помимо обычного функционирования, в одном или нескольких потоках запускаются VM/интерпретаторы, им скармливается часть данных/событий и они чего-то дергают/возвращают/генерируют, что передается потом обратно основной программе.
>и в контроллере которого требования реального времени борются со сборщиком мусора.какая-то каша.
в первых, для микроконтролеров применяются максимум embedded RTOS (классический представитель которого FreeRTOS - "я есть шедулер и все"), и вообще pure C. И обработка событий от периферии на прерываниях и main loop.
засунуть в 128Kb флеша и еще столько же памяти интрпрепретатор (которых 50-100 разных из только ходовых) c хуками к голым аппаратным прерываниям и регистарам управления - ну нужно постараться.
В общем-то, никто и не старается.Но если таки будет - микроконтролеры таки все больше по ресурсам, то это будет нечто другое, и вполне адекватное по времени реакции.
Классический, хоть и не самый лучший, пример на каждый день - интерпретаторы Postscript, который внезапно язык программирования, на платах принтеров.
А JS, если выжать до основ, это тот же LISP-like, который внезапно уже лет как 30-40 редким мелким бисером вшивают в микропрограммное обеспечение.
Нет, не в варианте-идеологии V8, даже если MCU с ресурсами ARMv8+ - хрен бы там с выделением памяти, это уже вылизано за десятки лет, там событийная машина самый цимес подрыва детерминизма.
Но и то опят же, при сниженных требованиях к latency, ... ну дофига что делают на базе V8+Node.js
во вторых, с тем же cамом pure C и c FreeRTOS дурак с клавиатурой, не понимающий смысла прерывания и атомарности процесса, и вообще гирлянды state machines ... лучше скажите мне перед демонстрацией.
Но проблема в том, что вы и не узнаете.
все лучше чем lua
Например, в чём лучше? Тем что позволяет выстрелить себе в ногу 100500 способами? Тем что позволяет переопределить object.prototype?
Имея один JS, можно переопределяться всё, кроме этого JS. Имея два JS, можно переопределяться абсолютно всё.
Сравняли автозамена!
> Например, в чём лучше? Тем что позволяет выстрелить себе в ногу 100500
> способами? Тем что позволяет переопределить object.prototype?Как будто в этом что-то плохое.
Да хотя бы [-1,-2,3,4].sort() чудесно
Подобное можно делать даже в плюсах, так что нет, не впечатляет
> Подобное можно делать даже в плюсах, так что нет, не впечатляетЯ конечно не специалист в плюсах, но чтобы там получить именно ТАКОЙ результат сортировки:
[-1,-2,3,4].sort()
Array(4) [ -1, -2, 3, 4 ]
придется все же "пошаманить" ;)
А вот с reverse() не фортануло. Брендон Айк подбрасывал кубик чтобы решать чистая будет функция или нет
Потому что документацию надо читать:
Если функция сравнения compareFunction не предоставляется, элементы сортируются путём преобразования их в строки и сравнения строк в порядке следования кодовых точек Unicode.
[-2,-1,3,4].sort((a,b)=>a-b);>>> [-2, -1, 3, 4]
> Потому что документацию надо читать:
> Если функция сравнения compareFunction не предоставляется, элементы
> [-2,-1,3,4].sort((a,b)=>a-b);
>>>> [-2, -1, 3, 4]Удобство и предсказуемость, че -- главное, почаще повторять и постараться забыть, что сам ЯП был сваян за десяток дней.
Главное - постараться понять предназначение языка. Яваскрипт со строками работает гораздо чаще, чем с математикой. А если у вас таки много математики, то вам к расширениям языка типа asm.js и WebAssembly...
В Lua хотя бы есть строгое и прозрачное различение между глобальными переменными и их не объявишь по ошибке. Да и массивы начинают индекс с 1-цы, а не как в модном JS с 0-ля. Очевидно что на Lua легче писать большое приложение и его поддерживать.
В Lua нет массивов, там только таблицы. Поэтому начинать нумерацию можно с чего угодно, хоть с -2.
Зачем плодить сущности, когда можно было взять года готовый движок? Благо выбор есть: V8, Spidemonkey, Duktape тот же.
Тут разработчики объясняют почему V8, SpiderMonkey и Duktape неподходят
https://youtu.be/Jc_L6UffFOs?t=645
И что там вкратце? Неужели ты думаешь что кто-то пойдёт смотреть какое-то кино с Ютюба?
1) V8 и Spidermonkey сделаны в первую очередь для браузеров где совершенно иной сценарий использования (пару десятков вкладок, в каждой вкладке разный код). Тогда как на сервере для данного location код всегда одинаковый. Его можно скомпилировать и вообще выкинуть из движка все что не нужно на стороне сервера. Эти движки очень тяжелые для nginx (впилить можно, но получится недо node.js, который уже есть). nginx легковесный и быстрый и ему нужен легковесный и быстрый движок (пусть и менее навороченный, но который позволяет решать практические задачи на стороне прокси).2) у Duktape другие цели, в первую очередь они таргетят memory footprint, а не performance.
3) Свой движок можно кастомайзить под nginx.
Узнал что правильно говорить энжинэкс. А не нжинкс.
Сысоев о проблемах V8 в контексте nginx писал ещё 8 лет назад: http://sysoev.ru/prog/v8.html - с тех пор мало что изменилось.
Интересно, а "более 13" это сколько?
Чуть меньше чем 15
> добавлена поддержка объекта "arguments"А разве его не выпилили в ES6?, есть же spread
Не выпилили https://www.ecma-international.org/ecma-262/6.0/#sec-argumen...rest parameters syntax (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...) в процессе.
njs вообще реализует новые стандарты или хотя бы какой-то стандарт?
http://nginx.org/en/docs/njs/index.htmlnjs is a subset of the JavaScript language that allows extending nginx functionality. njs is created in compliance with ECMAScript 5.1 (strict mode) with some ECMAScript 6 and later extensions. The compliance is still evolving.
Nginx пилит свою ноду?
похоже хотят сделать аналог openresty только вместо lua javascriptидея интересная и подход правильный, из минусов только то что для lua есть куча модулей а с урезанным javascript без модулей непонятно что делать.
хоть они и говорят что это не application сервер, но аппетит приходит во время еды, есть множество сценариев когда ещё не application но уже и не просто навороченный конфиг и делает реально что то полезное.
>с урезанным javascript без модулей непонятно что делать.Берется rollup и полетели!
Непонятно, зачем именно js. Если так уж хочется js-подобный язык можно было сделать какую-нибудь облагороженную версию типа typescript или свой вариант.
Могли бы лучше поддержку CoffeeScript или хоть LiveScript сделать. Так нет - везде этот JS тащат!
Странный выбор. Почему не луа, с его минимализмом потребления ресурсов, или не питон (питон-хэйтеры, расслабьтесь, - я имел ввиду что-то вроде Cython, но заточенного под продукт)?И вообще, если посмотреть на траекторию развития nginx в целом, то приходит на ум вопрос: зачем было гордо отказываться от динамических модулей, коли теперь приходится бизнес-логику расширять с помощью скриптов? Уж лучше было бы плагины-сошники "на лету" подключать, - они по крайней мере бинарные, со статической типизацией, что многие проблемы решает.
Короче, я в недоумении по поводу такой архитектуры. Лично мне она не кажется очевидной. Но возможно я чего-то не до конца понимаю.
Маркетинг. JavaScript - новый PHP, миллиарды неосиляторов теперь пишут на нём под любую задачу, "кадры" можно найти в любой подворотне.
Ну почему же неосиляторов. На нём просто приятно писать, а, когда за плечами много лет опыта C++, прелести современного JS осознаешь сильнее
Я бы лучше веб на плюсах писал.
WebAssembly и транслятор asm.js уже готов.
> WebAssembly и транслятор asm.js уже готов.А зачем мне asm.js если есть Bridge.Net?
Все-таки на шарпе по-приятнее.А из веб ассембли нет доступа к DOM. Или что-то поменялось?
Собственно мы на C# под веб и пишем (транспайл).
TypeScript - очередная затычка от мелкософта.
>Я бы лучше веб на плюсах писал.Да-да, расскажи инвестору, что проект займет полгода вместо 2 месяцев.
Где вас таких изготавливают?
>>Я бы лучше веб на плюсах писал.
> Да-да, расскажи инвестору, что проект займет полгода вместо 2 месяцев.
> Где вас таких изготавливают?Да-да расскажи инвестору, что ты запилишь очередную дичт, которую потом надо будет переписывать.
В итоге 2 месяца JS, 2 месяца фиксов этого JS. Потом выкидывание велосипеда и переписываение большей части кода.У меня на типизированных языках разработка идет кстати быстрее.
Так что это все из области неосиляторов.
А вариантов овердокуя: Java (GWT), C#, Kotlin.Так что таких как ты я бы близко к коду не пускал. Жаль у вас на лбу не написано: "веб-макака".
К сожалению (а может и к счастью?), кадры работающие с nginx профессионально (админы) не особенно близки с js. Я например, плохо представляю себе системного администратора яростно изучающего js. А вот админа знающего питон, я, напротив, представить очень даже могу, поскольку питон админу может для решения многих задач пригодится. Могу представить даже админа знающего lua... с некоторым напрягом, правда, но могу. А вот админа использующего для администрирования js ни как не получается представить. И однако, разрабы nginx выбирают именно js и это очень странный выбор.В общем, приходится делать вывод, что целевая аудитория nginx перестала быть ориентированной на администраторов и стала ориентироваться на веб-программистов. Печально коли так.
Девелоперы часто становятся DevOps'ами. Хоть как-то js знают бекендщики, в корпоративном секторе такое часто. А вот python... только если стек на python, а так инфраструктура держится на bash + основной язык из стека (java, c#, go...). Девелоперы занимаются не только разарботкой но и механизмом развертывания их творения. Админы рулят уже зоопарком серверов и контейнеров, управляют ресурсами, поддерживают корпоративную сеть (месенджеры, почта...), еще ездят в датацентры обслуживать арендованные стойки. Но да, nginx часто получается в пересечении этих двух "миров" :)
Тут с 8:57 рассказано почему JavaScript:
https://youtu.be/Jc_L6UffFOs?t=5371. Это современный лингва франка, о нём знают все и если не программировали на JavaScript, то хотя бы видели и сталкивались.
2. Использует С-подобный синтаксис, который неплохо знаком разработчикам и DevOps-инженерам (на которых эта функциональность и ориентирована). Также благодаря этому он хорошо вписывается в формат конфигурационных файлов nginx, который тоже использует фигурные скобки для обозначения блоков кода.
3. Был написан для браузеров под событийно-ориентированную парадигму программирования. И это хорошо ложиться на nginx, поскольку он тоже работает в этой парадигме и построен на обратных вызовах (callback-ах).
> зачем было гордо отказываться от динамических модулей,nginx динамические модули умеет уже много лет.
Почему не lua, потому что, быть может, большинство из сферы Web знает JavaScript? У всех ассоциация "Web? JavaScript!". Во FreeBSD, например, уходят от Forth в пользу lua. Зачем? Потому что молодое поколение не хочет идти в страшный Forth, а lua выглядит куда более дружественное и порог вхождения куда меньше, чем в Forth - так прямо и написали в рассылке.
> Во FreeBSD, например, уходят от
> Forth в пользу lua. Зачем? Потому что молодое поколение не хочет
> идти в страшный Forth, а lua выглядит куда более дружественное и
> порог вхождения куда меньше, чем в Forth - так прямо и
> написали в рассылке.Вы бы еще пояснили, что речь идет о загрузчике:
> A LUA boot loader is 60k larger than a FORTH one, which is
> 80k larger than a no-interpreter one. Subtle changes in size
> may tip things past some subtle limit (the binary is ~430k now
> when built with LUA). A future version may offer coexistance.
>
так lua - давно, это уже пройденый этап. (интересно, он по сей день намертво лочит воркер?)У него есть два недостатка - уродливый синтаксис (требующий много лишнего колошматенья по клавиатуре) и то что он не js - поэтому мартышки его не знают, а учить им некогда, смузи ж скиснет.
> зачем было гордо отказываться от динамических модулей
чтобы не плодить лишний код и лишние проблемы (прикинь как классно подключается этот модуль при многотредовой схеме).
А бизнес-логику при помощи скриптов пишут _конечные_пользователи_, они тебе сошки писать все равно не будут, не обучены.
Ура! можно писать конфиги для nginx на JSF**c!
По производительности смотрел кто-то данное изделие? Можно его использовать в своих разработках?
> По производительности смотрел кто-то данное изделие? Можно его использовать в своих разработках?Точн! Может ли оно притормозить обработку запросов nginx до уровня апача или не сдюжит. Аудитория затаила.
Если надо высокопроизводительной математики на "кластарах", то у интерпретируемого самописного языка конфигов "будут для тебя плохие новости"ТМ.