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 ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.