LINUX.ORG.RU

Scala.js on Node.js для разработки бэкенда

 , , ,


0

5

В последнее время со все большим удовольствием посматриваю на Scala. При этом я с давних пор скептически отношусь к хорошо прогретой JVM, поскольку меня пугает, когда для запуска даже хеллоуворлда уходит десяток секунд, а также смущают темпы потребления памяти ею. В этом смысле v8 мне нравится гораздо больше: легче, субъективно потребляет меньше памяти, не имеет десятка параметров запуска, без тонкого тюнинга которых было бы не обойтись в процессе развития почти любого приложения.

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

Deleted

А зачем тебе тогда шкала?

со все большим удовольствием посматриваю на Scala. При этом я с давних пор скептически отношусь к JVM

странно как то. Чем так скала понравилась?

Bad_ptr ★★★★ ()
Ответ на: А зачем тебе тогда шкала? от Bad_ptr

Лаконичностью, более развитым ООП по сравнению с JS (функциональные возможности есть и в самом JS). Да и хочется, чтобы мои типы ненавязчиво контролировали в процессе компиляции.

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

Мне не нравится как громоздкий синтасисис, так и сама идея дополнить JS, не сломав обратной совместимости.

Deleted ()

Три авторитетных ответа: нет, нет, и еще раз нет.

Скала ошибочно кажется языком общего назначения. На самом деле это только пускалка для akka. Все остальное на ней очень не очень. Не нужны акторы - не нужна скала.

HelloWorld на JVM запускается 50 миллисекунд, ну 100 может быть. Десять секунд приходят от сторонних библиотек (включая и stdlib скалы).

Память JS жрет как бы не больше JVM-ы. Во всяком случае, сейчас память чаще всего заканчивается из-за хрома, а в хроме память кончается из-за JS-а. Скажешь, что хром клиент-сайд? — посмотри на meteor.js, он от 300 МБ начинается.

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

Конкретно Scala.js весьма долго компилируется, так что профита от нее вообще не получишь. Как ты из нее будешь работать с JS-овыми библиотеками — вообще непонятно. Скорее всего, с болью и унижениями.

Не хочешь нативного JS-а — бери тайпскрипт. Хорошая вещь. Да и JS6 ничего так.

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

громоздкий синтасисис

?
Что там громозкого?
Function уже не обязательно.
Class и interface?

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

более развитым ООП по сравнению с JS

покажи пример. Ты нагло врешь.

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

Понятно. Так-то я имею дело с TypeScript и JS, но хочется чего-то нового. Что же, предлагаешь на Elixir с ErlangVM вместо скалы смотреть тогда?

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

В JS нет трейтов и/или множественного наследования, например. Больше одного прототипа у объекта по определению быть не может.

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

Вообще то трейты и множественное наследование это как теплое и мягкое. А разве трейты не заменяются миксинами?

Больше одного прототипа у объекта по определению быть не может.

В принципе, это сейчас можно сделать с Proxy, но Proxy поддерживается пока не везде.

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

Громоздкие циклы, отсутствие enumerators.

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

Кстати, опять ты соврел. В скале нет множественного наследования. Да и вообще, пробежался сейчас по теме, похоже на то, что в ней вообще псевдо-ооп, в стиле джавы вперемежку с функциональными костылями. Такое «ооп» джаваскриптовскому в подметки не годится, даже несмотря на отсутствие готовой реализации множественного наследования.

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

Вот конкретно про скалу написано:

Scala реализует повторное использование кода посредством т.н. трейтов (трейт — это базовый языковой конструкт, подобный миксину).

то есть, миксины заменяют трейты, миксины в JS делаются как 2 пальца, нет никаких преимуществ у скалы в этом смысле.

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

А вот и есть, и реализовано с помощью микшинов трейтов (хотя честно говоря не сказать, что это верх изящества, конечно)

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

но множественное наследование реализованное миксинами и трейтами — это множественное наследование для быдла. С настоящим множественным наследованием подобное говно ничего общего не имеет. И использовать подобное — дурной тон. Это ведет к проблемам.

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

А что пытаешься написать-то? «Сокеты и легкие API» очень расплывчато завучит. Чистые сокеты для веба нафиг не сдались, все работает по HTTP.

Самое легковесное, что есть в вебе — Golang, по потреблению памяти его никто забороть не сможет (если не извращаться с C/C++). В общем-то, на него вылит не один ушат помоев, но мой совет — возьми да попробуй. Мне понравился. Опять же, весь контекст крутится в одном сервере, для чатов на вебсокетах — самое простое решение. Плюс горутины в комплекте, т.е. по факту на каждый запрос по своему контексту, причем гораздо дешевле, чем треды ОС. Плюс стандартная библиотека, в которой все для сетевого общения (http-клиент, http-сервер, общение с БД, криптография, разбор командной строки). Плюс это единственный язык, в stdlib которого есть сервер http2.

Для стандартного сервера «Запрос-ответ», с CRUD, cron-задачами, роутингом, контроллерами и middleware бери PHP+Laravel. Самое удобное, что я видел в вебе. Все на месте, дока короткая и внятная.

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

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

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

Deleted ()

Маразм. Программа на JVM стартует доли секунды. Потребление памяти у Java будет в разы меньше V8. Про производительность вообще молчу. Впрочем каждый развлекается, как хочет.

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

А почему тогда программы на жабе отжирают у меня всю память и периодически падают?

Хотя, ты отчасти прав, V8 сейчас идет тем же путем. Хотя ему все еще далеко до жабы.

Вообще говоря, основная проблема тут не в VM. Жаба просто by design не может не расходовать память, там все ООП на тупом копировании, в этом основная причина жора. Если руки кривые, можно конечно и на JS также писать, если замыкания на каждый пук лепить, и тп. Сейчас большинство хомячков так и делают.

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

Про производительность вообще молчу.

А производительность жабы недалеко от js ушла, так что, да, лучше помолчать. И настоящая производительность — это вопрос архитектуры приложения, а не вопрос скорости.

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

А почему тогда программы на жабе отжирают у меня всю память и периодически падают?

Потому, что ты выбрал такие программы.

Вообще говоря, основная проблема тут не в VM. Жаба просто by design не может не расходовать память, там все ООП на тупом копировании,

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

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

Основная причина в том, что память дёшева и для большинства программ это не является существенным ресурсом до определённого момента.

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

ты о чём

Я о том, что каждый сабкласс там, насколько я понимаю, содержит все поля родительского класса как свои собственные, независимые от родительского, например.

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

Поля содержит объект, а не класс. Класс это абстракция. Объект дочернего класса действительно содержит все поля родительского класса, а как иначе?

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

Да, когда жабист проводит бенчмарки, у него всегда так получается, а когда джаваскриптер — наоборот. Но я мантры религиозных фанатиков не читаю. Думаю, там разница в среднем процентов 30 в пользу жабы, но субъективно, визуально, проги на жабе тормозят раза в 2 сильней, хз почему так. Какая то магия.

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

Поля содержит объект

тем более, там тогда и в тысячи раз больше жор может быть.

а как иначе

ООП JS основано на делегировании. Там наследники содержат только ограниченное число полей, все унаследованные поля содержаться в родителях

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

Я имею в виду что-то в духе веб-сокетов, то есть постоянно открытые соединения, причем хочется настоящей многопоточности (а не как в ноде), но без потенциальных дедлоков. На Go тоже посматриваю, но отсутствие дженериков или шаблонов отпугивает меня.

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

слишком часто используются обёртки вместо примитивных типов.

А вот это, как раз, к большому расходу памяти привести не может (хотя, может что-то жаба специфичное опять-таки), это влияет только на скорость.

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

ООП JS основано на делегировании. Там наследники содержат только ограниченное число полей, все унаследованные поля содержаться в родителях

Ты и в Java можешь использовать делегирование вместо наследования. Только это отношение называется «содержит» или «ссылается», а не «наследует». Наследование подразумевает независимый экземпляр родителя и в JavaScript делается точно так же, как и в Java. тут можешь подробней ознакомиться, как оно работает.

Legioner ★★★★★ ()
Ответ на: комментарий от filequest

А вот это, как раз, к большому расходу памяти привести не может (хотя, может что-то жаба специфичное опять-таки), это влияет только на скорость.

Если у тебя есть миллион int-ов, они будут занимать 4 мегабайта памяти. Если у тебя есть миллион Integer-ов, они будут занимать 16 байтов каждый, плюс 4 байта на указатель, в итоге выйдет 20 мегабайтов. Скорость, конечно, тоже будет хуже.

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

Ты и в Java можешь использовать делегирование вместо наследования.

может и можешь, но 100% хавают то что дали, так что не надо тут о том что можно в глубокой теории.

Наследование подразумевает независимый экземпляр родителя

Я не понял к чему ты это сказал. Делегирование должно отменять независимый экземпляр родителя? Может отсыпешь братве, че ты там куришь?

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

Akka & Scala отличные инструменты. Есть большой проект, который работает с использованием ресурсов 4 отличных серверов. Система предназначена для расчета и обработки сложных структур. Все работает как часы, можно на лету перераспределить ресурсы, выделенные под ту или другую задачу. Доля Java в проекте теперь от силы сократилась в разы. Думаю, что через несколько месяцев она совсем уйдет в прошлое. Как говориться «на вкус и цвет все фломастеры разные». Есть у этой связки олени минус - количество способов выстрелить себе в ногу в десятки раз больше чем при использовании других инструментов, связок.

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

делегирование вместо наследования.

и не «вместо», а как реализацию. Это как раз в жабе вместо наследования используется какая то параша, не забываем откуда идет вся эта терминология — из смоллтока, именно там канонический вариант.

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

Вот тебе код на JavaScript, проверь сам. Нет никакого независимого экземпляра родителя.

class Base {
  constructor() {
    this.baseVar = 1;
  }
}

class Derived extends Base {
  constructor() {
    super();
    this.derivedVar = 2;
  }
}

const d = new Derived();

console.log(d);

Объект d содержит два поля: baseVar и derivedVar.

Legioner ★★★★★ ()
Ответ на: комментарий от mystery

Да то что он называет «множественным наследованием» в JS то же есть. Трейты — это миксиноподобная хренотень

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

Ты че, охренел чтоли? Конечно в твоем примере нет, ты же конструктор вместо Ъ-наследования используешь. Не ожидал от тебя такой глупости. То что в конструкторе, сеттится в экземпляры.

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

Ну если для тебя extends это неправильное наследование, тогда я сдаюсь. Но правда в том, что весь мир пишет именно так, поэтому во всех JS-программах наследование используется именно так и никакой разницы с Java тут нет.

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

поэтому во всех JS-программах наследование используется именно так.

Не во всех, а только в быдлячих. Но возможно их бОльшая часть, не считал. Основа наследования в JS — это прототипы. Даже с сахаром классов.

A extend тут не при чем, дело в использовании конструктора, я тебе сказал уже. Ты вообще в JS ноль.

Кстати, этим синтаксисом лучше не пользоваться, он сильно ограничен даже по сравнению со старым new.

filequest ()

Скала еще на .net умеет. Вообще у нас сейчас датчане все почти с явы переписали на скалу, профит (с учетом ошибок прошлых проектирования) заметен даже «на глаз». Это распределенка, бигдата, внутренние сервисы со всякими RPC и сотнями тысяч запросов.

А v8 это хипстота и рак. Для реальных задач, сложнее home page by Vasya, он не подходит. Для «поиграться» и прототип накатать по быстрому может быть, ходя даже для этого есть более инструментные инструменты.

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

home page by Vasya

ага, типа таких:

Might be worth updating this to include stuff in 2013:

Walmart (Why Walmart is using Node.js ) E-bay / PayPal ( Node.js at PayPal) Microsoft (Node.js Dev Center | Windows Azure) They have extensive support, in fact their Azure CLI tools are actually written in Node.js. LinkedIn (Exclusive: How LinkedIn used Node.js and HTML5 to build a better, faster app) Yahoo Google (Node at scale: What Google, Mozilla, & Yahoo are doing with Node.js) Yammer (now part of Microsoft) (Managing Node.js Dependencies and Deployments at Yammer - Yammer Engineering) Netflix has a series of blog posts on its use (Search results for node.js)(Updated 2016-02) Looks like Uber is using it as well (Updated 2016-03)

https://www.quora.com/What-are-the-biggest-websites-built-with-Node-js-on-the...

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

А что ты хотел, чтобы он содержал только derivedVar?

menangen ★★★★★ ()
Ответ на: комментарий от filequest

Это все и есть homepage by vasya

половина там только морду юзерам отдает и кнопоськи отрисовывает, все остальное там далеко не на этом дерьме. У того же пейпала, только запросики и ответики. типичный домашний хомяк. Все остальное, например на https://github.com/paypal/squbs этом

Так что давай другие примеры, эти не впечатлили.

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

он хотел сказать, что в JS вот такого не бывает:

o = Object.create({a: 1})
console.log(o.a, o.hasOwnProperty("a"))// 1, false

filequest ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.