Как стать автором
Обновить

Комментарии 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-компилятором, нет ручного управления памятью.

Ну да, где-то получается лучше (хотя этот бенчмарк всегда вызывал очень много вопросов в плане адекватности). Я даже знаю, что почти всегда лучше. А на некоторых задачах 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 сделать, скорее всего в Го тоже, но уровень мороки мне кажется меньше

Rust «всего лишь» не даёт придерживаться подхода «тяп-ляп и в продакшен», т.к. заставляет лишний раз подумать, а почему же вот эта вот проблема с borrow-checker'ом вообще возникла. Если памятью (в каждый конкретный момент времени) никто не владеет — это утечка, а если владелец есть — borrow-checker порадуется вместе с вами.
Кстати, об утечках памяти в JS/V8:


Проявляется исключительно в случаях, когда JS многократно вызывает обработчики сообщений из WebSocket, перестраивая DOM. GC срабатывает когда у ОС уже (почти) не остаётся памяти, при этом в воспроизводящемся в Chrome видео пропадает звук. Да, вина не только JS/V8, но в основном.
НЛО прилетело и опубликовало эту надпись здесь

Только нет приличных способов to reason about performance and memory. То есть, стулья не надо выбирать, стульев вообще нет.

НЛО прилетело и опубликовало эту надпись здесь

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

Если честно, не понял, в чем смысл статьи. Текст проговаривает самоочевидные вещи, но при этом объяснение им дается переупрощенное до неправильности.

Пример переупрощенного до неправильности найдется?)

БОльшая часть раздела "Процессы, потоки, GIL и GC" и изрядная часть в разделах после.

А когда python и ruby умерли?

Мне кажется, что для реальной коммерческой разработки нужно еще учитывать "выразительность" языка/платформы.

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

Я бы не стал приписывать Go к группе C и Rust, где «синтаксис языка вынуждает разработчика самому заботиться о памяти».

Зарегистрируйтесь на Хабре, чтобы оставить комментарий