LINUX.ORG.RU

Common Lisp vs Node.js

 ,


0

2

Всем привет. Это не вброс :) Вопросы таковы:

1. В CL можно скомпилировать код явно, выполнив compile, и сохранить образ лисп-среды (исполняемый файл). При повторном перезапуске этого файла никакая компиляция уже не будет происходить, поэтому такое приложение запустится практически мгновенно. Можно ли так сделать в Node.js (кроссплатформенно)?

2. Пробовал ли кто-нибудь swank-js - как он соотносится по фичам с настоящим SLIME?

3. Верно ли я понял, что node.js раза в 2-3 медленнее на микробенчмарках, чем оптимизированный SBCL?

4. Каков наилучший IDE для node.js?

5. Верно я понял, что в node.js есть FFI? Есть ли официальный FFI, насколько он хорош?

6. Если я хочу многопоточное приложение, в node.js это делается за счёт существования нескольких процессов операционной системы и каких-то хитрых способов взаимодействия между ними. Как это называется и насколько это медленнее, чем обычные треды с мьютексами и очередями?

7. Как отлаживать ошибки уровня FFI? Могу ли я использовать для этого gdb?

В гугле меня нет, не забанили, но хотелось бы сэкономить моё время.


В CL можно скомпилировать код явно, выполнив compile, и сохранить образ лисп-среды (исполняемый файл). При повторном перезапуске этого файла никакая компиляция уже не будет происходить, поэтому такое приложение запустится практически мгновенно. Можно ли так сделать в Node.js (кроссплатформенно)?

И как это ты в CL компидируешь кроссплатформенно? Сумашедший? В Node, а вернее нода тут не при чем, потому что исполнитель v8 - пожалуста - можешь толчно так же предкомпилировать код. Нужные апи в ноду прокинуты в модуль vm.

anonymous
()

Если я хочу многопоточное приложение, в node.js это делается за счёт существования нескольких процессов операционной системы и каких-то хитрых способов взаимодействия между ними. Как это называется и насколько это медленнее, чем обычные треды с мьютексами и очередями?

Очень странные вопросы для человека, который разрабатывал собственный язык\компилятор.

anonymous
()

Если я хочу многопоточное приложение, в node.js это делается за счёт существования нескольких процессов операционной системы и каких-то хитрых способов взаимодействия между ними. Как это называется и насколько это медленнее, чем обычные треды с мьютексами и очередями?

Вообще, в JS сейчас есть web-workers, вроде и в ноде они есть, но они не шарят память между потоками

3. Верно ли я понял, что node.js раза в 2-3 медленнее на микробенчмарках, чем оптимизированный SBCL?

Это вряд ли. V8 сейчас один из самых быстрых движков, он сишке в спину дышит

noconformism
()
Ответ на: комментарий от noconformism

Вообще, в JS сейчас есть web-workers, вроде и в ноде они есть, но они не шарят память между потоками

Вы такие некомпетеннтные, что ужас. Воркреы - это WebAPI и никакого отношения к JS они не имеют. В ноде, их нет и быть не может. Они эмулируются кластером, но это даже рядом не стоит с реализацией, которая требует спека WebAPI.

Что за манера мешать апи разных сред в свойства языка?

anonymous
()

А как там свой язык? JS вроде далек от CL, неужели можно еще сомневаться в выборе таких разных сущностей?

I-Love-Microsoft 👍👍👍👍
()
Ответ на: комментарий от anonymous

ну да, я как то с ними детально не разбирался, игрался только на клиенте немного. А кроме того, оказывается веркеры все равно используют треды уровня OC

The Worker interface spawns real OS-level threads, and mindful programmers may be concerned that concurrency can cause “interesting” effects in your code if you aren't careful.

https://developer.mozilla.org/ru/docs/DOM/Using_web_workers

noconformism
()
Ответ на: комментарий от Bad_ptr

фичи SLIME - как у обычной IDE (переход к определению, автодополнение, компиляция, подсветка кода, переход к концу/началу текущей пары скобок и пр.). В случае лиспа с его горячей заменой доступны дополнительные возможности: перекомпилировать одну функцию и перекомпилировать один файл. Ну и REPL. Также есть отладчик - при остановке можно ходить по стеку и вычислять выражения в кадре стека, также есть некая пошаговая отладка.

den73
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Да вот товарищи навели на мысль, что если я перейду на JS, то больше будет шансов найти добровольцев. Разница между JS и CL не так уж и велика, особенно, если пишешь свой язык поверх.

den73
() автор топика
Ответ на: комментарий от noconformism

Это вряд ли. V8 сейчас один из самых быстрых движков, он сишке в спину дышит

Ты начитался рекламы.

den73
() автор топика
Ответ на: комментарий от anonymous

И как это ты в CL компидируешь кроссплатформенно? Сумашедший?

Здоровый ты наш, есть compile и save-image в SBCL. Код не кроссплатформенный, но эти команды работают в разных ОС одинаково: на выходе save-image получается исполняемый файл для этой же платформы, а compile компилирует функцию внутри данного образа, в результате чего функция работает гораздо быстрее.

den73
() автор топика
Последнее исправление: den73 (всего исправлений: 1)

swank-js

Если за пару лет не изменился, то всё ещё неработающий кусок говна.

anonymous
()
Ответ на: комментарий от anonymous

Что за манера мешать апи разных сред в свойства языка?

Каков язык, такие и манеры.

Shadow 👍👍👍👍👍
()

3. Верно ли я понял, что node.js раза в 2-3 медленнее на микробенчмарках, чем оптимизированный SBCL?

От рук зависит. А микробенчмарки - вообще лажа. В принципе, если хочешь быстрый код на ноде, надо писать как на языках со статической типизацией. Только не имея для этого инструментов :).

4. Каков наилучший IDE для node.js?

Подозреваю что webstorm. А так пользуюсь sublime и atom, мне пошагово дебажить не надо.

5. Верно я понял, что в node.js есть FFI? Есть ли официальный FFI, насколько он хорош?

https://github.com/node-ffi/node-ffi

Стабильный, поддерживается. Сам не пользовался.

6. Если я хочу многопоточное приложение, в node.js это делается за счёт существования нескольких процессов операционной системы и каких-то хитрых способов взаимодействия между ними. Как это называется и насколько это медленнее, чем обычные треды с мьютексами и очередями?

https://nodejs.org/api/cluster.html ?

C тредами сравнивать бессмысленно, т.к. внутри процесса код асинхронный, и потребность обычно не возникает. См. async/await. Ну а много процессов обычно чтобы параллельно сетевой порт слушать, это через cluster разруливается. Если тебе очередь задач нужна - ищи готовые пакеты, он для тебя сами все разрулят.

Vit
()
Последнее исправление: Vit (всего исправлений: 1)
Ответ на: комментарий от Vit

Спасибо за ответы! Про треды речь идёт в контексте каких-нибудь вычислительных задач, здесь async не поможет, когда надо загрузить несколько ядер. В SBCL треды есть, но и неприятные баги от них тоже есть. Качество вроде важнее производительности, но и производительность от ЯП общего назначения тоже нужна.

Насчёт бенчмарков - от рук многое зависит, но и от языка тоже кое-что.

den73
() автор топика
Ответ на: комментарий от anonymous

Судя по том, что последний коммит - в августе 15-го - не изменился. А что именно в нём не работает?

den73
() автор топика
Ответ на: комментарий от den73

Ты начитался рекламы.

Нет, он просто наркоман.

AUX
()

1. В CL можно скомпилировать код явно, выполнив compile, и сохранить образ лисп-среды (исполняемый файл). При повторном перезапуске этого файла никакая компиляция уже не будет происходить, поэтому такое приложение запустится практически мгновенно. Можно ли так сделать в Node.js (кроссплатформенно)?

Что-то подобное в самом v8, на котором построена нода, есть. По крайней мере, это есть в nw.js, который в одном проекте объединяет nodejs и webkit. С.м. http://docs.nwjs.io/en/latest/For Users/Advanced/Protect JavaScript Source Code/

Но как пишут в этой документации, это наоборот снижает скорость и сделано больше для защиты кода, чем во имя производительности. Разаработчики v8 говорят о том, что их код по разному комилируется в зависимости от среды выполнения и спсобов выполнения самого кода. Т.е. в зависимости от того, как твой код будет выполняться, при каждом запуске он будет копилироваться по разному.

4. Каков наилучший IDE для node.js?

Мощные IDE хороши в строго типизированных языках, где можно без выполнения выести типы и на их основе давать адекватные подсказки и делать безопасный рефакторинг. Поскольку все это невозможно сделать в JS, толку в IDE не много. Мне хватает Sublime для разработки. Если нужен отладчик, запукаю ноду с ключом --inspect, это позволяет подцепиться стандарным отладчиком хромиума/хрома к процессу и отлаживать нодовский код как обычный браузерный JS.

5. Верно я понял, что в node.js есть FFI? Есть ли официальный FFI, насколько он хорош?

Я имею смутное представление о том, что такое FFI. Как я понял по быстрому просмотру, это возможность динамически во время исполнения подцепиться к стронней нативной либе и дернуть ее функции.

В стандарной ноде этого точно нет. Там максимум можно запустить стороннее приложение и распарсить его вывод. Но гугл выдает какие-то стронние модули, реализующие FFI, может они и подойдут.

Для ноды можно создавать сторонние нативные модули (аддоны), которые могут быть оберткой для нативных либ.

+ у ноды очень большое комьюнити, так что возможно для твоих требований уже кто-то написал такую обертку.

6. Если я хочу многопоточное приложение, в node.js это делается за счёт существования нескольких процессов операционной системы и каких-то хитрых способов взаимодействия между ними. Как это называется и насколько это медленнее, чем обычные треды с мьютексами и очередями?

Нода создавалась в первую очередь для веба. Там типичное приложение тратит свое время на следующие вещи:

1. Запросы к БД

2. Работу с жеским диском

3. Работу с сетью

4. Непосредственная обработка запросов и формирование ответов.

Первые 3 пункта в ноде сделаны ассинхронными и не блокируют основной тред. Четвертый пункт непосредственно реализуется на ноде и в типичном приложении занимается распарсиванием запроса и созданием ответа (по факту, результаты полученные от бд, при помощи шаблонов превращаются в html/json и передаются ассинхронно в сеть).

Если твое приложение не подходит под этот юзкейс, то, возможно, не стоит пользоваться нодой. Для длительных сервисных операций, как например сборка статистики и т.п., можно породить отдельный процесс и обмениваться с ним простыми сообщеними, хотя это довольно редкий случай. Можно написать нативный аддон на другм языке, в котором нет ограничений на порождение новых потоков. В общем, для типичной ноды это редкое явление.

Неудобство работы с настоящими потоками - цена за простую работу с ассинхронными операциями.

Deleted
()

6. Если я хочу многопоточное приложение, в node.js это делается за счёт существования нескольких процессов операционной системы и каких-то хитрых способов взаимодействия между ними. Как это называется и насколько это медленнее, чем обычные треды с мьютексами и очередями?

По поводу использования IPC смотри https://nodejs.org/api/child_process.html#child_process_child_send_message_se...

Deleted
()
Ответ на: комментарий от den73

Ну про бенчмарки написал как есть. Уже много раз давал ссылки на свои развлечения с быстрым яваскриптом. Если упереться рогом, то можно сделать очень быстро, но смысла обычно нет. Надо брать конкретную задачу, и ее разбирать, общего ответа нет.

«Какие-то вычислительные задачи» - смахивает на то что решается через очередь задач. Там обычно скорость отклика уже пофик и процессы нормально канают без всяких тредов. Себе сделали вот такую хрень https://github.com/nodeca/idoit, альтернатив тоже много. Надо смотреть по конкретной задаче, а не «какой-то вычислительной».

Vit
()
Ответ на: комментарий от Deleted

Спасибо! Прекрасные ответы, тема почти исчерпана. Конечно, я хочу, чтобы после nw.js двоичный код можно было отлаживать, но видимо, я просто хочу слишком уж много - ведь nw.js. И ещё осталась неясность на тему состояния swank-js.

den73
() автор топика
Ответ на: комментарий от den73

Если у тебя матрицы перемножаются 10 секунд, какая разница, сколько милисекунд задаржки добавит коммуникация между процессами?

Это должна быть весьма специфичная задача, чтобы именно треды заиграли яркими красками. В большинстве случаев дубового нодовского подхода хватает.

Например, если ты по запросу с веб-странички хочешь перемножить матрицы и показать результат. Время перемножения не сильно большое. Зачем тогда выносить отдельно именно перемножение, когда можно целиком вебню нафоркать? Надо по конкретной задаче смотреть.

Vit
()
Ответ на: комментарий от Vit

Думается, что в расчётных задачах типа метода конечных элементов всё же важны треды. У меня такой задачи сейчас нет, я «в общем» думаю, насколько будет плохо, если в ЯП нет тредов и какие костыли помогут, если вдруг окажется такая задача.

den73
() автор топика
Ответ на: комментарий от RazrFalcon

Спасибо! Я знал, что Раст крут в плане производительности, но таких цифр не ждал. Хотя это нужно ещё сравнивать алгоритмы. Для чистоты эксперимента надо бы теперь на CL его портировать, но кто же это будет делать...

den73
() автор топика

Ох, лол :-)

Common Lisp vs Node.js

Всё равно что тесто vs сковородка :-) Common Lisp - это язык :-) Node.js - это платформа для написания приложения в стиле кооперационной многозадачности :-) Думается, все знают о такой и чем она отличается от вытесняющей :-) Хотя, судя по комментариям, у меня сомнения на этот счёт :-)

В CL можно скомпилировать код явно, выполнив compile, и сохранить образ лисп-среды (исполняемый файл). [...] Можно ли так сделать в Node.js

Нет :-)

5. Верно я понял, что в node.js есть FFI? Есть ли официальный FFI, насколько он хорош?

Там нет FFI такого, каким ты его знаешь в Common Lisp :-) Так, в SBCL можно обойтись одним лишь кодом на самом Лиспе для вызова функций внешней библиотеки :-) В Node.js придётся писать специальный модуль на цепепе, который уже и будет вызывать функций внешней либы :-)

6. Если я хочу многопоточное приложение, в node.js это делается за счёт существования нескольких процессов операционной системы и каких-то хитрых способов взаимодействия между ними. Как это называется и насколько это медленнее, чем обычные треды с мьютексами и очередями?

Многопоточное или многозадачное? :-) В Node.js врукопашную(!) пишут код кооперационной многозадачности :-) Лол :-) Наверное, это ностальгия по Windows 3.1 такая :-) Хотя, если написано правильно, в Node.js можно добиться приемлемой производительности параллельного выполнения нескольких задач на одном физическом ядре :-) Только это трудно - писать свой шедулер снова и снова :-) Да, там можно иметь дело с трэдами, но это делается на цепепе :-) Кстати, писать многопоточный код на цепепе проще и понятнее, чем переключать контекст вручную, тикая таймером :-) И если задачу надо решать с помощью многопоточности, то зачем тогда эта Node, когда можно просто взять C++? :-)

7. Как отлаживать ошибки уровня FFI? Могу ли я использовать для этого gdb?

Ты можешь купить CLion :-) Там поддержка отладки Node.js из коробки :-) Но CLion - это IDE для C++, что как бы, намекает на то, что надо знать C++ :-) Лол :-)

anonymous
()
Ответ на: комментарий от den73

У меня там целая «дока» есть по тестированию.

Причины тормозов как минимум две:

1) js и python запускаются каждый раз с нуля, то есть часть времени отжирает интерпритатор. У раста такой «проблемы» нет.

2) Код написан не ради скорости/бенчмарков, а идиоматический. У меня атрибуты хранятся в кастомной структуре и обращение идёт по индексам, что очень быстро, а в том же scour(python) используется обычный hashtable с ключом-строкой, что дико медленно. Зато идиоматично.

В остальном раст версия содержит побольше логики/флгоритмов/фич.

Тем не менее, rust версия довольно медленная. Её ещё как минимум в два раза быстрее можно сделать.

RazrFalcon
()
Ответ на: комментарий от den73

Забей. Если у тебя будут реалтаймы с принудительным переключением задач, то всё завалится на фризах в сборщике мусора, и до проблем с отсутствием тредов ты не дойдешь :)

Vit
()
Ответ на: комментарий от den73

Я же тебе написал - ровно то же самое есть в v8. Ты можешь предкомпилировать любой модуль, скрипт, функцию. Это не называется кросплатформенностью - потому что скомпилированный код не получится запустить на другой архитектуре. А ты сумасшедший, да.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо! В принципе я уже раздумал.

den73
() автор топика
Ответ на: комментарий от Vit

Рилтайм - это одно, а вычисление методом конечных элементов - другое. Оба имеют свою область применения.

den73
() автор топика
Ответ на: комментарий от RazrFalcon

Ну то есть всё же это не является сравнением именно производительности языков. Думаю, разница где-то в 5-10 раз будет при сравнении на одинаковых алгоритмах, в среднем по больнице.

1) js и python запускаются каждый раз с нуля, то есть часть времени отжирает интерпритатор. У раста такой «проблемы» нет.

Потому я и спрашивал про возможность сохранения образа.

den73
() автор топика
Ответ на: комментарий от den73

Потому я и спрашивал про возможность сохранения образа.

https://nodejs.org/api/vm.html#vm_class_vm_script cachedData

Но я бы предложил не страдать этими извращениями и просто держать пул воркеров, где уже все загружено и прогрето.

Vit
()
Ответ на: комментарий от den73

Смотря с какой точки зрения. С точки зрения бенчмарка - нет. С точки зрения идеоматического кода - да.

RazrFalcon
()
Ответ на: комментарий от Bad_ptr

Какие такие фичи есть у этого вашего SLIME?

Основная киллер-фича в том, что можно подключиться дистанционно к работающему приложению и поковыряться в кишках, включая перекомпиляцию и замену кода на ходу. По-сути это просто удалённый REPL на стеройдах (поиск определений, кроссреференсов и т.п.)

no-such-file 👍👍👍👍👍
()
Ответ на: комментарий от no-such-file

Основная киллер-фича в том, что можно подключиться дистанционно к работающему приложению и поковыряться в кишках, включая перекомпиляцию и замену кода на ходу.

Это можно сделать в любом языке с eval.

noconformism
()
Ответ на: комментарий от noconformism

Это можно сделать в любом языке с eval

Да, и что? SLIME это конкретное решение в рамках данной теоретической возможности. Будут другие, будет что обсуждать.

Кроме того eval бывает разный - не всякий eval выполняет код в текущем контексте, т.е. не всегда так можно переопределить функцию в работающем коде, например.

no-such-file 👍👍👍👍👍
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Да, и что?

Ладно анонiмус живёт фантазиями, но ты-то. Помимо наличия eval среде нужно обладать ещё целой пачкой особенностей, чтобы этот eval использовать для горячей замены кода.

nezamudich
()
Ответ на: комментарий от no-such-file

Ну да конечно. Если нельзя подключиться дебаггером на лету — это придирки? Если структуры данных входят в состояние, неизменное для работающего кода — это придирки? Не даёт эвал горячей замены. Он есть даже в хаскелях всяких, а горячей замены кода нет.

nezamudich
()
Ответ на: комментарий от no-such-file

Анон вон питон вспомнил. И правильно вспомнил. Эвал есть, горячей замены нет. Не, частично есть, конечно, но только частично. С этими вашими лиспами и эрлангами не сравнить.

nezamudich
()
Ответ на: комментарий от nezamudich

Если нельзя подключиться дебаггером на лету — это придирки?

Это всё решаемо, на уровне архитектуры программы. Дело даже не в eval, как известно в любую программу на любом языке можно запихать хреновую и тормозную реализацию лиспа. Я как бы и предложил анонимусу показать, что он видел что-то лучше SLIME в данном контексте.

no-such-file 👍👍👍👍👍
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от Vit

Скажи, а вот это дикий изврат или норм?

"use strict";

const cluster = require('cluster');
const numCPUs = 4;
const _ = require('underscore');

if (cluster.isMaster) {
  console.log("Master", process.pid, "is running");

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    let arr = [];
    arr.push(_.random(0, 1000));
    arr.push(_.random(0, 1000));
    arr.push(_.random(0, 1000));
    arr.push(_.random(0, 1000));
    arr.push(_.random(0, 1000));
    console.log("Master arr:", arr);
    cluster.fork({GLOBAL_VAR_A: arr});
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log("Worker", worker.process.pid, "died");
  });
} else {
  let A = process.env.GLOBAL_VAR_A.split(",").map(i => Number(i));
  console.log("Worker arr:", A);
  process.exit(0);
}
GoNaX
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.