проект который должен использовать многопоточность, взаимодействовать с api операционной системы и быть достаточно производительным для анализа данных поступающих из сети, на алгоритмах требующих затрат. Будет простым или сложным. Примерная кодовая база на с++ 10.000 строк
Вы знаете, по моей шкале - любые две из перечисленных вами характеристик уже делают проект сложным. С одной - еще можно спорить, но две сразу - точно сложный. А тут их 5 :)
что из простого усложняет rust. И как по сложности сопостовим с с++?
Ну вот вам, как мне кажется, показательный случай из жизни. Когда я только начал изучать Rust, то захотел ради эксперимента реализовать ActiveRecord. Посмотреть, как его в принципе можно реализовать на Rust и потестировать с фейковым хранилищем. Для тестов решил хранилище сделать статическим объектом. И тут первая сложность: динамически инициализируемый статический объект можно создать только с помощью специального макроса из сторонней библиотеки. Ну хорошо. Потом другая проблема: просто так изменять статический объект нельзя! (это если не использовать unsafe) Для возможности изменения пришлось навернуть сверху мьютекс. В общем, все подобные проблемы я выяснял на практике, пытаясь просто собрать свой код и тесты. Благо объяснения компилятора были понятны, но все равно, исправления требовали времени и это все вызывало нешуточное раздражение: сплошные проблемы на ровном месте. Я чуть было уже не проклял все, когда код, наконец, собрался, все тесты выполнились и выяснилось, что они запускаются параллельно! То есть меня компилятор научил работать с объектами синхронизации в Rust, пока я просто хотел набросать по-быстрому простой код для тестов. Но я не знал, что тесты запускаются параллельно и что это знание мне тут действительно понадобится. Вот тогда я впервые и ощутил эту слабость и одновременно силу Раста :)
По сравнению с С++ на Rust программировать сильно проще. Сам язык проще и целостнее. Достаточно прочитать небольшую Книгу из документации, написанную для новичков, да еще пару статей - и это все, что нужно знать в теории для того, чтобы начать писать серьезные вещи на Rust. Конечно приходится несколько тратить время на устранение замечаний компилятора, но зато строгие правила языка в сочетании с возможностью просто и быстро писать тесты экономят уйму времени, которое иначе тратилось бы на отладку.
Субъективно, мне разработка проекта на Rust по ощущениям напоминает разработку на Java. С той принципиальной разницей, что там, где Java использует динамику, Rust ориентирован на статику. А идеологии у них похожи: производительность, безопасность, простота (по сравнению с C++), универсальность и кроссплатформенность. Только добивается этого Rust другим способом и не запрещает использовать небезопасный код там, где он уместен. В этом смысле я Rust считаю большей Java, чем сама Java. И я думаю, он со временем займет ее нишу.
В 90% случаев вам лайфтаймы не понадобятся, потому что в типовых случаях Rust выводит их сам. Там же, где вам нужны долгоживущие объекты - используйте "умные" указатели, такие как Box и Rc, без лайфтаймов и явных ссылок. И ничего сложного в лайфтаймах нет, но исходный код они несколько зашумляют, это правда. Ну а про владение, которое "автоматически делает Rust очень сложным" - вы погорячились. Правила владения - проще и понятнее некуда. Другое дело, что программировать в соответствии с ними поначалу будет непривычно, нужна практика.
Синтаксис Rust'а не усложняет написание кода, единственное что он действительно усложняет - это читаемость сигнатур функций и методов. Из-за того, что в одной или нескольких строчках запихана вся информация о типах аргументов и возвращаемых значений. Не знаю, как вам, но мне такой вариант кажется лучше, чем размазывать эту информацию в многострочное полотно или вообще убирать, как делают в скриптовых языках: там не поймешь, что возвращает функция, пока не изучишь ее тело. В любом случае, обобщенный код в Rust строже и читается легче, чем в С++. И писать его намного проще и приятнее.
По поводу "низкоуровневых подробностей". Если вы к таковым относите ссылки и указание мутабельности - то да, о них нужно думать. Но разве эти "подробности" сравнятся по низкоуровневости с указателями в C/C++? По-сравнению с ними, это весьма высокоуровневые и простые вещи, которые доставят вам проблем разве что на этапе компиляции. Другие же языки, со сборщиками мусора, всегда работают со ссылками и не позволяют создавать объекты на стеке. Этим они сильно ограничивают программиста в возможностях оптимизации программ. Так что учитывая, какие возможности Rust предоставляет, в своем классе он язык весьма стройный и весьма высокоуровневый.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Вы знаете, по моей шкале - любые две из перечисленных вами характеристик уже делают проект сложным. С одной - еще можно спорить, но две сразу - точно сложный. А тут их 5 :)