Comments 30
Если не ошибаюсь, rust таки успешно сидит на всех 3-х стульях. Единственный недостаток - это время компиляции. Но, думаю, это цена, которую не жалко заплатить за гарантии, которые он дает.
Скорее JavaScript пытается) Раст требует от разработчика заботиться о памяти. Жестко требует: семантика владения, borrow checker, ручное разделение на стек с кучей, вот это вот все.
Мне кажется, что "заботиться" о памяти нужно в С. В rust-е о ней заботится компилятор. Если оно скомпилилось - значит оно не течет(unsafe не в счет :)). При этом даёт очень внятные объяснения о том, что в коде не так. А владение и заимствование - можно принять как особенности языка.
заботиться о памяти в Раст по прежнему нужно, изменился только способ. Нужно постоянно учитывать владение, и время жизни объектов. Компилятор только говорит ошибки, код вместо программиста он не пишет.
И утечки памяти Rust не находит. Они не приводят к UB, так что с точки зрения языка в этом ничего страшного нет. Можно легко получить утечку при помощи метода Box::leak
, ну или просто создав цикл из RefCount
А можно вопрос, что именно javascript пытается? Все тот же GC и все тот же GIL. Единственное, что до недавнего времени отличало js от python - это non-blocking IO. Но asyncio тут всех уравнял. И хоть асинхронная экосистема в python-е еще не совсем зрелая, принципиального отличия между python+asyncio и js я не вижу. Оно есть?
Он одновременно предлагает высокоуровневый синтаксис не требующий заботы о памяти, хорошую совместимость с нативным кодом (с оговорками, но не идет ни в какое сравнение с JNI) и компиляцию в нативный код. JavaScript - быстрый:
https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/nbody.html
и компиляцию в нативный кодНе более чем JIT, либо я каким-то образом пропустил возможность создания бинарников из JS. При этом по сравнению с другими JIT-языками Node.JS подъедает больше памяти и медленнее работает (но зато скриптовой, да).
Источник — ваша ссылка
JIT это и есть компиляция в нативный код.
Ну тогда питон тоже в нативный код может компилироваться с помощью pypy. Почему вы выделяете js отдельно?
Кстати, стоит ещё упомянуть lua + luajit - отличная интеграция с Си, отличная скорость с jit-компилятором, нет ручного управления памятью.
https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/nbody.html - у JS несколько лучше получается. Подробнее тут: https://youtu.be/39XNklRQJI4 (дисклеймер - в части про ядра и тайминги адовое упрощение)
Ну да, где-то получается лучше (хотя этот бенчмарк всегда вызывал очень много вопросов в плане адекватности). Я даже знаю, что почти всегда лучше. А на некоторых задачах pypy быстрее сишки.
Но раз вы считаете, что js компилируется в нативный код из-за jit, то и питон давайте туда же.
AFAIK, Ruby и Python дают прямой доступ к словарям методов класса в рантайме для модификации. В JS даже такого понятия нет, весь код очень локальный.
В pypy далеко не всё поддерживается, особенно с C/Fortran расширениями беда. И он по сию пору слабо популярен AFAIK
Ок, в скорости python проигрывает, даже на порядки. Но все-равно, в критических ситуациях GC и "single-threaded by design" делают js непригодным к "сидению на 3-х стульях." (ситуациях, как эта, например: https://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f). Да и весь интернет полон статей о том, как избавиться от утечек в node.js, так что говорить, что он не требует заботы о памяти тоже не совсем корректно.
Так что в целом я считаю, что rust, все же, лучший кандидат на этот пост. Со скоростью, близкой к С, без GC и с минимальной болью от контроля памяти :)
Вот насчет "минимальной боли" я не оч согласен. Раст прямо таки требует о памяти заботиться.
Конечно требует. GC то нет :) Если бы не требовал - была бы боль как в С. Но как по мне, делает это самым вразумительным и элегантным способом :)
К стати, а что на счет go? мне кажется он, как минимум, не хуже ноды по всем трем параметрам. Дополнительным бонусом еще и полноценная многопоточность. Разве нет?
Go интересен тем, что у него GC есть, а о памяти заботиться все равно надо! Что показывает, что "высокоуровневый синтаксис" и "garbage collection" - это штуки часто связанные, но не одно и то же. Аллокация на стеке, куче, array фиксированного размера, слайсы - все это требует от разработчика заботиться о памяти в том же объеме, что в C++ или Rust. Меняются только подходы - как именно мы о памяти заботимся ?
Аллокация на стеке, куче, array фиксированного размера, слайсы - все это требует от разработчика заботиться о памяти в том же объеме, что в C++ или Rust
хз, может я не в теме, есть какие-то примеры подводных камней, связанных с тем что вы назвали? Утечку можно и в java сделать, скорее всего в Го тоже, но уровень мороки мне кажется меньше
Кстати, об утечках памяти в JS/V8:
Проявляется исключительно в случаях, когда JS многократно вызывает обработчики сообщений из WebSocket, перестраивая DOM. GC срабатывает когда у ОС уже (почти) не остаётся памяти, при этом в воспроизводящемся в Chrome видео пропадает звук. Да, вина не только JS/V8, но в основном.
Только нет приличных способов to reason about performance and memory. То есть, стулья не надо выбирать, стульев вообще нет.
Если честно, не понял, в чем смысл статьи. Текст проговаривает самоочевидные вещи, но при этом объяснение им дается переупрощенное до неправильности.
А когда python и ruby умерли?
Мне кажется, что для реальной коммерческой разработки нужно еще учитывать "выразительность" языка/платформы.
Потому что лишний день, потраченный на написание кода, глубокую оптимизацию и поиск утечек памяти - равен по стоимости пяти, а то и больше приличным по мощности серверам в облаке. При всем уважении к Грете Тунберг...
Я бы не стал приписывать Go к группе C и Rust, где «синтаксис языка вынуждает разработчика самому заботиться о памяти».
Python и Ruby под нагрузкой: высокое искусство некромантии