Этот пост скорее вопрос, чем комментарий, но я думаю, что Medium - подходящее место для такого рода вещей: что сообщество Rust думает о Scala?

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

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

Назначение Scala

Если вы ищете простой способ построить массивно-параллельную систему в вычислительном кластере, включая такие вещи, как автоматическое масштабирование, но с достаточным количеством вещей в «экспертном режиме», которые вы все равно можете работать на уровне протокола, если хотите, тогда Akka и Scala для вас.

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

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

Назначение Rust

Итак, с нашей массовой параллельной вычислительной нагрузкой, распределенной, кластеризованной, использующей протокол сплетен, построенной супер-причудливой системой, у нас есть какая-то работа, чтобы сделать с этим, верно? В моем случае эта работа часто сильно ограничена вычислительными ресурсами, создает много временной памяти и обычно разбивает JVM на куски.

Вот где Scala ломается. Мои JVM привязаны к ядрам, безнадежно пытаясь наверстать упущенное в гонке, которую они не могут выиграть. И насколько я могу видеть проблему - и даже понимать ее - прямого пути решения нет; проблема становится одной из инженерных разработок вокруг JVM.

И теперь очевидным выбором становится Rust. С той же выразительностью, которая была у меня раньше - хотя, возможно, это было немного сложнее и, конечно, труднее для новых разработчиков - я могу опуститься настолько низко, насколько мне нужно. Я могу написать молниеносный код (я бы сказал, скорость C), который эффективно использует память, без управления памятью и без ущерба для современных удобств, например замыканий. Я повсюду получаю абстракции с нулевой стоимостью. Я могу раскачивать CUDA, не чувствуя, что вставляю квадратный стержень в круглое отверстие, умноженное на тысячи ядер.

Предостережения

Это не означает, что кластеризация, распределенные вычисления и т. Д. Не могут быть выполнены с помощью Rust - для этого существует множество отличных инструментов Rust. Но на данном этапе эволюции экосистемы Rust я не думаю, что есть что-то настолько современное, элегантное, мощное и одновременно подходящее для производственных развертываний, как стек Akka и Scala.

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

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

Что это нас оставляет?

Я не знаю. Я прошу вас. Если вы чувствуете то же самое - если вы действительно любите и Scala, и Rust, каждый для своей цели, - как вы примирите это несоответствие?

Несколько лет назад, когда Scala достигла совершеннолетия, появилась тенденция к созданию новых и лучших языков для JVM, и из этого вышло много замечательных вещей - Clojure, Groovy и да, вся экосистема Scala (Akka, Spark, Play, Lift и множество другой критически важной инфраструктуры, широко используемой в промышленности).

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

Итак, мой вопрос к вам, учитывая эти два отличных инструмента: как нам согласовать, где их использовать? Есть ли естественный способ объединить их в какое-то блаженство полиглота с помощью очередей сообщений, REST API или даже встроенного взаимодействия? Или каждый проект должен сделать твердый выбор, жить на земле JVM или на родине?