Pull to refresh

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

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

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

UFO just landed and posted this here

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

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

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

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

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

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

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

Sign up to leave a comment.