Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

Google, Facebook та Amazon вже пишуть на Rust. Що це за мова і які її перспективи?

Мене звати Валентин Файчук, я працюю Software Engineer в компанії SoftServe у проекті з кібербезпеки. Займаюся розробкою платформи для підтримки різних хмарних security-сервісів. Основний фреймворк проєкту написаний на С, однак у доповнення команда вирішила використати Rust.

Швидкість чи надійність? Багатьом програмістам часто доводиться вирішувати, що важливіше, обираючи мову програмування. Перед таким вибором постав і Грейдон Хор. Він подумав, а чому б не поєднати швидкість і широкі можливості С++ та надійність Haskell? Так у 2015 з’явилася мова Rust, яка вже п’ять років поспіль є улюбленою мовою програмістів за версією StackOverflow.

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

Що особливого в Rust

Rust — це універсальна мова програмування, яку розробляє компанія Mozilla. Вона позиціонується як:

  • компільована (готову програму можна запустити на будь-якому комп’ютері, який сумісний з версією програми);
  • системна (нею пишуть програми для роботи систем, адже вона надає високий рівень контролю над функціями заліза);
  • мультипарадигмальна (в ній поєднуються кілька парадигм програмування: С++ і Haskell).

Rust вирішує проблеми, що мучили C/C++ розробників довгий час: помилки пам’яті та багатопотокове програмування. По-перше, тут немає збирача сміття. Rust керує пам’яттю через систему володіння з набором правил, які компілятор перевіряє під час компіляції. Як тільки компілятор бачить, що певна змінна вже не буде використовуватися, він автоматично передає виокремлену під неї памʼять для інших цілей.

Інша особливість Rust — це паралельне програмування. У паралельного коду можуть бути небажані взаємодії між потоками, включно з дедлоками (deadlock), конкуренцією та дата рейсами (data races). Rust використовує концепцію володіння і запозичення. Якщо ви присвоюєте блоку даних іншу змінну, то попереднє присвоєння втратить доступ. Тобто, у кожної змінної є унікальний власник, а право володіння можна передати чи позичити. Так, система складна, але таким чином в Rust досягається memory safety.

Також в Rust немає наслідування класів, адже вона не є класичною об’єктно орієнтованою мовою. Можна наслідувати інтерфейси (traits), але це не можна назвати повноцінним наслідуванням.

Мова, яку люблять і бояться

Rust — це молода мова, яка швидко стала популярною серед програмістів. Основна її перевага у тому, що вона сильно оптимізується компілятором і водночас має високий рівень безпеки. Тому незважаючи на те, що основний фреймворк на нашому проекті написаний на С, ми вирішили використовувати Rust через її безпечність. Вона має автоматичний хендлінг дуже багатьох кейсів, але по продуктивності дозволяє досягти майже такого ж рівня, що й С.

Водночас, у Rust є два режими роботи: safe i unsafe. У першому є деякі обмеження, наприклад, object ownership management, щоб забезпечити належну роботу коду. В unsafe {} режимі вам відкриваються всі можливості, але ви не застраховані від поломок.

Ще один плюс цієї мови в тому, що вона дозволяє використовувати дуже багато трюків з C. Наприклад, асемблерні вставки, SIMD — різні хитрі інструкції, які дозволяють працювати з хардварними механізмами. Зазвичай різними такими хаками відомі низькорівневі мови, такі як С, але при цьому вони є в Rust.

Особливо мені подобається робота з перелічуваними типами даних (enumerations). Вони можуть мати кілька варіантів значення і ці варіанти можуть мати свій аргумент. Наприклад, перший варіант — None (немає значення), другий — U32, який має змінну формату U32 в собі, що дозволяє витягнути потрібне. В U64, відповідно, буде змінна більшого розміру. Rust це все робить як об’єднання (unions, спеціальний тип даних в С, що дозволяє зберігати різні типи даних в одній області пам’яті). Тобто вони всі накладаються один на одного, і на початку є Bid, що каже, який саме варіант зараз активний.

Серед мінусів Rust перевикористання бібліотек на С, які за замовчуванням, грубо кажучи, вважаються unsafe. З одного боку, вони перевірені часом, а з іншого — ти ніколи не знаєш, де там може ховатися баг. Також через те, що Rust перевіряє більше елементів і сама собою є розумнішою, вона довше компілює код — загалом, в 4-7 разів повільніше порівняно з GCC.

Мова Rust — класна, але їй бракує формальної специфікації. Це, напевне, є визначальним фактором, чому деякі проекти побоюються її використовувати. Та попри це, в Rust є величезна та дружня ком’юніті, яка активно його розвиває. Ба більше, Rust рухається в напрямку створення специфікації та має офіційну базу RFCs (Request For Change). Тому, думаю, в найближчому майбутньому цю мову зможуть застосовувати у більшій кількості сфер.

Як вивчити цю мову? Спойлер: наберіться терпіння

Я відкрив для себе Rust рік тому, коли перейшов на мій теперішній проєкт. За цей час ми з командою спробували різні тулчейни. Починали з stable rust та clang-11. З часом перейшли на clang-12, оскільки навесні Rust перевів свої тулчейни (stable та nightly) на нову версію; та nightly rust, бо там доступні «не стабільні (на деяких платформах)» інтрінсіки (intrinsics). Вони дозволяють нам отримати перформанс коду рівня таких низькорівневих мов як C. Сьогодні ми продовжуємо активно розвивати Rust-напрямок в нашій компанії, наприклад, зараз його вчить група в нашій IT Academy.

Але треба бути готовим, що вчитися доведеться довго. На початку ця мова дуже лоскотатиме вам нерви, бо Rust майже нічого не дозволяє. Ти можеш пробувати різні варіанти, а воно не буде компілюватися. Але потім ти втягуєшся, починаєш розуміти, і це дає тобі великий досвід як програмісту. Ось приклад функції, звичайної для інших мов, яку Rust не дозволить скомпілювати:

fn get_ranged_vec(low: usize, high: usize) -> Vec<usize> {

    let coll = (low..high).collect();

    for elem in coll { // coll is moved (consumed) here

        print!("{}, ", elem);

    }

    coll // <- won’t compile, coll is unknown

}

Справа в тому, що Rust-змінні існують тільки в межах свого скоупу і до моменту, поки їх не перемістити в інший скоуп. Ми називаємо цей процес «споживання змінної одного скоупу іншим». В цьому прикладі змінна coll була переміщена в тіло циклу for, відтак спожита із скоупу функції. Для виправлення помилки, наприклад, можна перемістити в цикл не саму змінну, а посилання на неї &coll.

fn get_ranged_vec(low: usize, high: usize) -> Vec<usize> {

    let coll = (low..high).collect();

    for elem in &coll { // reference coll instead of consuming

        print!("{}, ", elem);

    }

    coll // coll is moved here - consumed by the scope of caller

}

Я вчив Rust, одночасно читаючи книгу Джима Бленді «Programming Rust» та практикуючись. Часто після прочитаного абзацу чи знайденої нової фічі в інтернеті доводилось повертатись до вже написаного коду. Зрештою, тут не існує чіту з назвою «rust-in-15-mins.txt», прочитавши який, програміст може сказати, що вміє на ньому девелопити (якщо знайдете такий — не вірте).

Особисто мені найскладніше давався концепт позичання змінних (borrowing & mut borrowing). Основний лайфхак, як підходити до таких комплексних концептів — це читати, пробувати, читати ще більше, і тоді все вийде. Початківцям раджу переглянути цей ресурс, а досвідченим розробникам систем на C/C++ для швидкого старту допоможуть матеріали за посиланням.

Google, Facebook, Amazon... Де використовують Rust?

Мова Rust досить універсальна і підходить для різних задач: розробки операційних систем, веб-серверів, інфраструктури, сервісів для управління криптографічними ключами та інших. Однак з Rust є певні обмеження, адже вона не має офіційної ліцензійної документації, тому її не можна використовувати в дуже відповідальних сферах, як от авіаконструювання. Але сподіваємося, що оскільки ця мова постійно розвивається та оновлюється, скоро це зміниться.

Rust повним ходом використовують технічні гіганти. Facebook навесні приєднався до Rust Foundation, поруч з Amazon Web Services, Google, Huawei, Microsoft та Mozilla. Компанія пише на Rust ще з 2016 року, зокрема його використовували у криптовалютному проекті Libra, для сервера управління версіями Mononoke тощо. У Facebook кажуть, що після переходу Mononoke з C++ на Rust багато JavaScript i Python девелоперів зацікавилися цією мовою програмування через високий перфоманс і виявлення помилок під час компіляції.

Механізм синхронізації з зовнішнім сховищем даних (sync engine) Dropbox також написаний на Rust. За їхніми словами, його оцінили через перфоманс, ергономічність та сфокусованість на коректності. А Google планує використати Rust як другу мову програмування для ядра Linux. Крім того, техгігант також допускав можливість, що цю мову використають в Android Open Source Project, аби зменшити кількість багів з memory safety.

Серед інших компаній, які використовують Rust у своїх проектах, — Atlassian, Evo Company, Coursera, Cryptape та інші.

Підіб’ємо підсумки

Отже, чи варто братися за Rust? Якщо ви шукаєте мову з високим перфомансом, сек’юрністю та ергономічністю, то так. Rust має надійну систему взаємодії з пам’яттю, потужний аналізатор коду, який дозволяє уникати помилок, С-подібний синтаксис та інші переваги. Але будьте готові до того, що вчитися доведеться довго і важко.

Rust — це cutting edge language, тобто вона має всі властивості мови сучасності, бо С уже досить олдскульна. Наші клієнти це також усвідомлюють і хочуть в майбутньому використовувати нові підходи у своїх проєктах. Поки що розробників, які пишуть цією мовою, не так багато, що робить таких кандидатів дуже цінними. Американська компанія O’Reilly провела опитування серед понад 3000 своїх підписників у США, і виявилося, що найбільше заробляють Rust-розробники — $180 000 на рік. Python-розробники мають $150 тисяч. Тому, на мою думку, це дуже перспективна мова.

👍ПодобаєтьсяСподобалось7
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Ты не оригинален, тянуть говно с каких-то рашкопомоек на ДОУ в тренде — dou.ua/...​rums/topic/30864/#2299731

Вот прочитал некоторые комментарии, где идет срач про то, что лучше — Python или Rust, и решил накинуть на вентилятор — rustpython.github.io ( github.com/RustPython/RustPython ) - интерпретатор 3-го питона написанный на расте. :-)

Хай оно Clang LLVM, у який Rust компілиться перепишуть, бо він жеж на нерастоугодному С++ написаний!

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

Имхо, куда проще будет переписать весь Linux на Rust :)

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

Тіки сраний systemd не має ніякого відношення до linux core

То вообще не важно, прям совсем, от инфаркта их всё равно не спасти.

Что значит не дадут? Не дадут склонировать репо или создать свой? Будут шантажировать и отстреливать разработчков?

посмотрел вакансии на доу, 9 из 10 крипта, десятое вообще не понятно что.

десятое вообще не понятно что

переписать те 9 из 10 — назад на с++

Пишу на Расті вже майже півроку. Класно, що все більше компаній і продуктів переходять на нього.

Єдиний мінус мови — поріг входу доволі великий. Не тільки через те, що Раст низькорівневий і треба щоб в голові з’явився borrow checker, але й через те, що ідіоматичний Раст на половину мова функціональна: імутабельність, функції як значення, ітератори, ADT і паттерн матчінг, Option і Result функтори. Мені здається без функціонального бекграунду поріг входу для середнього розробника ще вищий, ніж здається.

Для C++ панства Раст це можливість скинути з плеч необхідність слідкувати за стрілянням по ногам, збільшити надійність програм, при цьому не втрачаючи швидкодії.

tiobe показує спад

imho поки всі мову хвалять і одночасно кажуть, що поріг високий — діла не буде
От коли трейні будуть нахвалювати, як вони після похпе однією п’яткою написали сервер для роздачі статики — тоді можна буде не переживати за майбутнє мови

От коли трейні будуть нахвалювати, як вони після похпе однією п’яткою написали сервер для роздачі статики

Я думаю вы спутали Rust с Go

Ну с++ вообще не хвалят и порог высокий, но это не мешает крестам быть популярными.

Популярний, бо альтернатив нема
І я не бачив, щоб самі плюси нахвалювали

Спасибо, но уж проще просто с сырой памятью не работать в С++, чем вот это все:

Також в Rust немає наслідування класів, адже вона не є класичною об’єктно орієнтованою мовою.
Мені здається без функціонального бекграунду поріг входу для середнього розробника ще вищий, ніж здається.

Ну... сімула лайк ООП мене не надихає, дуже легко попадатися в архітектурні пастки. Тому мене не дивує, що Rust, Golang відходять від цього та набувають деякої популярності.

поріг входу вищий чим для Гошки, але нижчий чим для С чи С++

але нижчий чим для С чи С++

От взагалі ні разу не правда.
Поріг входу у C серед цих трьох — найнижчий, це доволі проста мова, але низькорівнева.
C++ та Rust — складніші і рівень вище, просто різна форма learning curve — у C++ вона буде пологіша (особливо для тих, хто хоч трохи знає C, то може писати в стилі «C з класами»), а у Rust — набагато крутіша (бо без уміння задовільняти borrow checker та уміння у всякі види обгорток поінтерів ніхто нікуди не їде)

вхід простий в С для хеловорд, але писати по людськи буде високий.
для С++ аналогічно, для хеловорд пологий вхід, а щоб не відстрілювати яйця собі, буде вищий чим у С
Руст пілся 2х тижнів боротьби з боровчекером дозволяє вже писати багатопоточні CRUDи, без ліків пам"яті, сегфлолтів, дебага, та решти С/С++ гемороя
Майже як Пайтон, тільки компільований, і майже як Го але без GC

Про те і мова — інструменти з низьким порогом входу є троха легшими для освоєння, бо дозволяють поступово вчитись, набивати шишки і отримувати хоч якісь результати. Само собою, щоби щось полюдське писати на «кросплатформеному асемблері», треба дофіга наїстись.

А от Rust дає багато пряників та батогів, але фішка в тому, що на початку ти отримуєш тим пряником в табло.

цікаво, чому ж вона тоді Why the developers who use Rust love it so much
в табло дає С++, якщо щось при компіляції не так, вивалить 10 екранів фігпоймичого,
не кажучи про стромні креші і сегфолти в рантаймі, щоб віддебажити тре потратити ще 100500 годин часу, а якщо рейкондішен, то ще довше

Ти взагалі чуєш, про що говорять?
Починати важко, крива освоєння крута. А далі, коли прожуєш пряник, яким по тобі гатить Rust, буде получче, є всякі плюхи і borrow checker не такий вже і злий параноїк.
Просто в залежності від крутості кривої навчання, не всі до цього моменту доходять.

Тому що після отримання пряником в табло і через певний період коли в голові «ага, он воно що» клацає, ти розумієш наскільки Раст продуманий і класний, компілятор розумний, а екосистема потужна. Звідти і любов від розробників.

Як вище сказали, просто багато хто може не дійти до плато розуміння і продуктивності. Це як з ФП — більшість ФП хейтерів просто не побачили цільної картини, елегантності і продуктивності від парадигми. Винити тут важко, все через криву навчання. Це стосується багатьох технологій і фреймворків, Раст просто одна з них.

Тут ще є окреме питання, про який С++ ми розмовляємо.
Я декілька років тому здивувався після спілкування з чуваком, який коммерційно пише на асмі. Виявилося, що зараз він зовсім не заморочується з пагінацією пам’яті, яка, наприклад, для мене була тією ще проблемою свого часу.

В девятом классе школы, после прочитанных книг по Basic, с большими ограничениями с доступом мне понабилось около месяца, чтобы начать писать на Си. Что там сложного???

Єдиний мінус мови — поріг входу доволі великий.

Я б так не сказав. Але я вже писав на С, С++, Objective C, Python та Swift до того як зіткнувся з Rust. Можливо це впливає

Було б класно мати порівняння коду раст і аналогічного коду на С

Ну... когда у меня было желание перевести пару своих проектов на Rust, то выяснилось, что их надо переписывать чуть более чем полностью. Потому что разные списки (двусвязные кольцевые) очень плохо ложатся на идеологию Rust. Ну и всякие хаки, типа, объединить несколько маленьких malloc-ов в один большой, и т. п.

Ну а так, по каким критериям сравнивать-то?

Помечаешь эти куски unsafe и вперед за орденами )))

У меня получалось, что весь код надо unsafe делать... И тогда какой смысл?

Коли буде IDE від JetBrains тоді поговоримо

На сторінці JetBrains Fleet позначено Rust як одну з вже відтримуваних мов

Є, але плагін VS Code IMHO аналогічний по функціоналу (всякі всякі дебагири, онлайн перевірки і інше...)

Фраза «Google, Amazon, Facebook» используют двусмысленна, они используют все языки
программирования популярные. Интересно увидить динамику использования. Лет 10 как слышно выражения вроде Rust-убийца С++ или Rust замечательный язык программирования.

Rust замечательный язык программирования

Он, как минимум, приятный.

Скайнета на Вас нету за такое сквернословие :(

Почему? Go давно используется теми же Google, Facebook и Apple. Docker, Kubernetes, Prometheus и VictoriaMetrics написаны на Go.

Google, Apple и Facebook настолько большие, что в них используется все, что угодно.

На любом более менее популярном языке что-то да написано.

Ну Гугл это парадокс кстати, обычно они не используют то, в чём принимают активное участие.

величезна та дружня ком’юніті

Якби ж то. У Core Team є скандалістка, котра замішана в неприємних речах, на кшталт озвучення тези «kill all men».

Однак сама мова приємна, мені після С зайшла. Cargo (менеджер пакунків і залежностей) — це взагалі казка.

От любите ви плітки розповсюджувати

Зачем такие сложности, нафиг оно кому надо когда есть какой нить python

так Rust позиционируется как заменитель C/C++, он не для тех ниш где используют Python.

Системное программирование, но его ж не так и много и с этим вполне справляется С и С++ зачем там Раст?

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

Что то очереди нет. Вот когда go появился так прям ажиотаж, а тут уже который год глухо.
Утечки памяти там где низкая квалификация.

Я лично пока не пробывал, мне и C++ в моей сфере нужен не так часто.

iOS: Нет поддержки Rust из коробки, внедрять очень не удобно.
Тож же Swift на практике при обработке больших raw-данных и прямых руках имеет скорость сравнимую с C++ в прикладных приложениях.

Недавно подвезли поддержку Rust в Android Studio. Но задач где прям нужно писать очень много кода на C/C++ тоже пока нет.

В итоге мне проще продолжать использовать C/C++. Но если не загнется в течении 5-ти лет то обязательно попробую Rust.

Те Раст не нужон? Вот так новость. Конечно загнётся через 5 лет, но не плюсы а раст

На данный момент не нужен, плюсы будут актуальны еще долго как бы их не хоронили.

А Rust, зависит от благополучия Mozilla.

У мозилы никогда не было благополучия.
Ну а о чем спор то? Те тебе пишу что сие поделие не надо, а ты говоришь подожди но там есть вундервафля. По итогу даже ты понимаешь что оно не надо.
Я вот лучше потрачу свое время на что более прикладное как python.

Я ничего не утверждал. Я написал «так говорят»:

Rust пиарят тем что он безопасно работает с памятью на уровне языка без магии из кастомных shared_ptr и прочего.

Вы ж выше спросили, я ответил.

Вундервафля там есть, но применить ее особо либо нету куда, либо не удобно.
Так что можно на данный момент считать что особо и не нужен если нет энтузиазма. А у коммерческого разработка скорее всего нет.

А Rust, зависит от благополучия Mozilla.

До чого тут Mozilla? Головний спонсор — Amazon.

Да, я ошибся основный спонсором.

Порядок спонсорів постійно змінюється, як визначили головного?

Хто більше грошей дає, гадаю. Бо порядок не за абеткою.

Відкрив код сторінки то порядок змінюється на сервері а в репозиторії свій порядок

Тут на першому місці: foundation.rust-lang.org (не абетка; також перший відос на головній за участі члена ради від AWS, а не жодного іншого спонсора).
Тут на першому місці: foundation.rust-lang.org/members (тут абетка, але все одно platinum founder).

Ну і на додачу: Стів Клабник жаліється саме на сильний вплив Амазону, а не Мозіли.

Я свій висновок зробив.

Дякую за аргументоване пояснення!

Это спонсоры, которые немного денег подкинули команде Rust для покрытия текущих расходов или предоставили какую-то бесплатную инфраструктуру или ПО для CI/CD. Это фигня, и на судьбу проекта мало влияет.

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

якщо крипта не здохне, то Rust себе там добре почуватиме, а ще крім системної розробки ходять слухи про WEB3, але я не з тої пісочниці, може хто розкаже про про перспективи Rust у WASM WEB3

А Rust, зависит от благополучия Rust Foundation.

fixed.
З.Ы. хотя... (судя по камментам ниже) да, там от каких-то спонсоров зависит эта организация.

Будь-який масштабний опенсорс залежить від спонсорів, навіть сама Free Software Foundation. Чи ви гадали, Торвальдс безоплатно дописує патчі до ядра? :)

Фрі софтваре це опенсорс, але не весь опенсорс фрі софтваре.

Корисне посилання:
www.gnu.org/...​tware-for-freedom.en.html

Тому пише статті на кшталт Saying No to unjust computing even once is help? А FSF навіть офіційно радить користуватися Apache 2.0 для невеликих проектів.

Втім полеміка зразка такої це нормально.

І дискусії можуть бути й доволі практичні. Мені колись припала до душі одна дуже практична стаття від ютубера.

Торвальдс не фсф, fsf вообще не признаёт ядро Линукс, в том виде, в котором его делает Торвальдс. FSF это кучка радикальных долбанов, с gnu головного мозга, а за Линукс, там что-то Линукс фоундейшн отвечает, ну и сам Торвальдс.

Торвальдс не фсф

Де я написав, що Торвальдс в FSF?

FSF это кучка радикальных долбанов, с gnu головного мозга

До слова, я член FSF. ;)

Як асоціативний член, плачу щомісячно внесок, маю від FSF джаббер і емейл-аліас + інші дрібні «benefits».

Брав би участь у локальних проектах, але в Україні, на жаль, глухо. Хіба що самому щось починати, але не почуваю, що маю достатньо досвіду.

До технічних проектів не долучаюся з тієї ж причини, хоча хотілося б.

плюси як Кобол будуть вмирати довго

Утечки памяти там где низкая квалификация

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

Хорошо когда и язык разработки помогает избегать хотьт части ошибок

Утечки памяти там где низкая квалификация.

Ага, to stop a bad guy with C++ you need a good guy with C++

Давно жаловались, valgrind и санитайзеры сейчас решают проблему.

По-опыту Xcode, ничего эти штуки не решают, если язык позволяет стрелять в ногу.
То тебе прийдет код который стреляет в ногу. Такие инструменты решают проблему лишь частично. Иначе бы в том же энтерпрайзе писали бы на C++ вместо Java.

Не, с джавой другой профиль.
У програмера есть какой-то объем мозгов.
В эти мозги надо запихать язык и бизнес логику.
Вот С++ настолько кривой, что занимает слишком много мозгов, и для бизнес-логики остается мало места.

Вместо мозгов можно подставить (скорость разработки), или (сложность кода), или (1 / (удобство библиотек))

В сучасному С++ я вже не пам’ятаю, коли писав *

А чем отличается BadAccess от NullReference? Вот, кстати, Rust лечит и от второго. А если говорить про Энтерпрайз, то так получилось, пиар компания, вложенные средства в разработку, во времена, когда санитайзеров не было. Ну и C++ сам по себе имеет много граблей без памяти.

EXC_BAD_ACCESS — это уже ошибка от ОС. NullReference — от рантайма языка.

А если говорить про Энтерпрайз, то так получилось, пиар компания, вложенные средства в разработку, во времена, когда санитайзеров не было. Ну и C++ сам по себе имеет много граблей без памяти.

Ну ок, это все классно но я не могу это применить.

Покажіть будь ласка, де в рантаймі кидається NullReference. Можливо, я відстав від життя.

Це коди процесор звертається по нульовій сторінці (адреса від 0 до 4095), стається page fault.

Рантайм тут ні до чого — хіба в ньому є додатковий обробник.

social.msdn.microsoft.com/...​on-not-handled-by-sxe-clr

Конечно он есть.

Там хуже, потому что для объекта, который `null` даже если ты вызываешь пустой метод, всё равно получаешь NullReference.

Но меня интересовали не технические детали, а практика. Основная проблема мемликов и bad access всё-таки была в том, что ты не получал ошибки не в момент возникновения, а хрен знает когда. И часто возникала ситуация, когда ты фиксил ошибку, которую совершил пару месяцев назад.

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

В управляемых языках типа Java/C# NullReferenceException реализован через условный блок, который выполняется в рантайме.

На page fault его не получится реализовать, потому что

1) Через нулевой указатель обращение может идти далеко за пределы первой страницы (например, структра может быть больше 4КБ и обращение может идти к полю за пределами первых 4кб), и случайно можно попасть в валидную память
2) Есть платформы на которых нулевой адрес памяти валидный и обращение к нему не вызовет page fault
3) В этих языках нет неопределенного поведения, обращение к Null всегда должно бросать NullReferenceException, и «случайно» считать чужую память, потому что она оказалась замапленой — это недопустимое поведение.

1 и 2 возможны только в каком-то жестком эмбеддеде с парой килобайтов оперативы, или в режиме ядра. Там ни C# ни жаба не запустится.

1 и 2 возможны только в каком-то жестком эмбеддеде с парой килобайтов оперативы
#include <sys/mman.h>
#include <stdio.h>
#include <stdint.h>

int main()
{
    volatile uint8_t *ptr = mmap((void *)0, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0);

    *ptr = 10;

    printf("address: %p, value: %d\n", ptr, *ptr);
}
echo 0 > /proc/sys/vm/mmap_min_addr
make zero && ./zero
address: (nil), value: 10

Первая команда выполняется под root, остальные под обычным юзером. Проверял на Ubuntu WSL 4.19.104-microsoft-standard

Кто тебе виноват что ты указал MAP_FIXED ?
Если целиться точно в ногу, то что угодно в эту ногу выстрелит)

Кто тебе виноват что ты указал MAP_FIXED ?

Кто тебе виноват, что ты делаешь обобщенные заявления, не проведя банального due diligence?

Если целиться точно в ногу, то что угодно в эту ногу выстрелит)

Что именно выстрелит?

Твой пример не валидный. Это все равно что умышленно снять защиту с страниц памяти (такое возможно через вин32 апи, для определенных видов программ которые снифят память такое полезно) и жаловаться что теперь ОСь не контролирует джампы по памяти за пределы песочницы.

Твой пример не валидный.

Мой пример демонстрирует, что на не эмбедед и не в режиме ядра возможно читать и писать в нулевой адрес памяти. Что именно в этом примере невалидно?

Напоминает анекдот:
— У мужиков нет сисек им не нужны ливчики
— Вот пример где парню из Тайланда приделали сиськи
— Да но этот парень целенаправленно пошел в хирургию (MAP_FIXED). Такое очень редко нужно, для сниферов например которые ломают другое ПО
— Что именно в этом примере невалидно?

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

Занавес.

Сорян, я не планировал в треде про нулевые указатели опускаться на уровень обсуждения сисек.

Абсурдность доводов лучше всего выявлять на метафорах. С такими полиморфными взглядами в технической дискуссии легко потеряться в трёх соснах, ведь как на примере с сиськами автор который вносит такие ремарки не рассчитывает на что-то кроме как затролить техническую дискуссию. Поэтому трансвеститы из Тайланда здесь как раз к месту.

Треба буде якось під дебагером на асемблер глянути, дотнета на бачив з 2010-го

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

мене недавно інтев"ювали на консалтинг для бігдата, хочуть швидкий Rust а не заторможений Пайтон, і така ніша є

одне дубль в середині слова з трьох літер
з.і.
бігдата, це тіпа хіпстерський теорвєр,
раніше ганяли регресії в Статі, та Монтекарло та мартігейли

бігдата, це тіпа хіпстерський теорвєр,

ТВ — це ТВ
І bigdata також
Більше того, з самого початку, щоб не дати хіпстерам розказувати як вони бігдату в екселі робили люди зробили мнемоніку з 5 слів, що починаються на V
Так от і питаю у вас чи уточнили ви у них про ці особливості в їх процесах?

скоріше всього ніт, бо що я почув там бігдата пітонщики, а тре бігдата руст/с++ але ще від клієнта теж нема чіткого розуміння вимог

Когда человек говорит про тормозной питон то это он тормозит, тк не знает ни черта

так, один ти тут мамкін пограміст, який все знає

Да я знаю тк я работаю с python c++/c
А ты похоже просто любитель языком чесать что попало

молодець, тримай нас в курсі

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

а що з перформансом?
там варіанти або С або С++ або Rust,
замовник хоче Rust, а от консалтинг ще вагається, чи може таки С++, бо легше знайти розробників, але з С++ свої але...

з.і.
співбесідував пітонщик, і вних команда бігдата пітонщиків, і працюють із фінтехом, але вимога: тре рантайм перформанс і пітон не конає

з.з.і.
про Джаву/Го навіть не заїкнулися

Рантайм перформанс под что?

фінтех, напр. на ходу состряпать порфель акцій із заданими ріск/ревенью

Те просто в цикле сделать мат расчеты. Хех для питона это уже не проблема. Но даже если бы было проблемой, дописывается модуль на плюсах и ни каких проблем.

яка різниця, особисто мені пофіг,
мопєд нє мой, я просто размєстіл абяву
а в пайтоністів уже в пєрдаках підгроріло що Руст девів шукають і для бігдати

Да куда там подгорело
Пусть пробуют искать, тут на питон попробуй найди.
Да и когда у инструмента нет каких то плюсов то его юзать будет полторы фрик компаний

Ми ж вище вияснили, що то клієнту здалося, що в нього бігдата

Руст девів шукають і для бігдати

Та й добре
Коли на расті буде хоч десята частина пакетів, інфраструктура чи просто буде попит, то будемо десь поряд веслувати

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

Ну хотят, то пусть хотят. Никто им не мешает. Блохи, это личная проблема собаки.

С многопоточностью? С race conditions? Пропущенные состояния? Как раз именно тут Rust в общем-то очень оправдан.

А кстати, какие реальные архитектуры с нестандартной многопоточностью попадаются?
На моей памяти обычно все сводится к одной из следующих, хорошо проработанных:
* Actors
* Pipes and Filters (Actors, вид сбоку)
* Service threads
* Lock and Use (Blackboard) -> тут можно дедлочить
* Upper/Lower half (Actor+Interrupts)
Почти везде тут разово пишется фреймворк, отлаживается за первые пол-года разработки, а дальше стрельнуть может только use-after-free или передача переменной по ссылке вместо значения.

Гошні канали і (го)рутини куди відносяться?

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

Зазвичай канали — то або Актори (коли каналами передаються сигнали чи команди чи запити) або Pipes and Filters (коли каналами передаються дані). Асинхронні мікросервіси на каналах чи Pub/Sub можуть поєднувати обидва варіанта (каналами передаються і команди, і апдейти даних). Наскільки я розумію, різниця між акторами та pipes and filters в тому, що актори стосуються control flow, а pipes and filters — data flow. Себто, меседжі між акторами бігають як хочуть, і куди далі меседж побіжить — залежить від його начинки та від стану актора-обробника. В pipes and filters дані завжди біжать одним маршрутом, що був створений на старті системи.

Щось таке, як я розумію. Нормальної книжки чи статті з цими означеннями не бачив.

Не знаю, я не сильно люблю упорядочивать знания, они у меня больше мазками. libuv куда отнести?

Да кто его знает. Наверное, что на нем сверху построишь, то и будет.

Ну... хотя бы что быть уверенным в том, нали вставлять is not None или не надо, т. е. для того, чтобы быть уверенным в том, все случаи, требующие взять во внимание, рассмотрены. Как по мне это одна из самых частых ошибок в кодировании.

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

Скорость может быть не хуже раста.
Завтра Раст превратится в такое же нечитаемое легаси каким является код на питон. Читаемость кода зависит не от языка, а от того кто это пишет.
Ну да питон более популярен чем руби именно из за того что он плохой.

Статическая типизация напрямую влияет на читабельность.

Есть методики повысить читабельность, это не проблема

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

Вот что именно питон делает плохо? Это уже какой то стереотип.

Питон хорош максимум небольшие скрипты писать, но что-то надежное и поддерживаемое вообще нет

Шкода що у великому ІТ про це не чули.

В тому то й біда, що чули. Інфоцигани постарались.

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

Кажется, примерно такие фразы уже лет пять о нем пишут

Вообще идея с синтаксисом для указания семантики: «Либо много читателей, либо один писатель» прикольная
это ж киллер-фича Rust а все остальное то уже такое

Как киллер-фича Go — работа с каналами

Но как-то да, разговоров о Rust много, а похоже взлетает ну очень медленно.

Все ниши где б можно было юзать Раст уже заняты и использовать Раст там нет ни какого смысла

Все так. Но если применение ЯП дает ощутимый прирост в скорости разработки — то вытеснит

Или — на С/С++ уже вполне научились решать проблему для которой эта киллер-фича, и поэтому она уже не востребована.
Либо довесок остального в ЯП такой, что портит весь полезный эффект от этой фичи.

Так Раст не даёт прирост в скорости разработки, он как минимум сложен в изучении
На с/с++ можно решить любую проблему. Потому вопрос зачем нужен Раст.

На с/с++ можно решить любую проблему.

и ждать второго пришествия пока оно собирается\компилируется\упаковывается... (правда растоманы тоже будут ждать, но на то они и растоманы)

А что в этом плохого? Сидишь кофе пьеш и смотришь на логи. Я так понимаю адепты Раст хотят пахать без продыху?)))

если не надо что-то быстренько поменять и пересобрать, то да — можно медитировать и думать про 42 )

Спешка нужна при ловле блох. Что то сделать быстренько приводит к появлению багов.

ну да, ну да, «это не баг, это — фича» :)

Зачем мне твой сарказм. Скажи лучше зачем нужен Раст вот прям сейчас

это к растоманам, я — за гошечку

Логично тк го есть 2 главных плюса это простота и крупная корпорация за плечами. А раст это поделие на поиграться, для работы не годится.

для работы не годится

Саме тому дурачки з амазону вирішили зробити отаке firecracker-microvm.github.io

Они могут себе позволить эксперементы которые уйдут в мусорку или не уйдут, что этот пример доказывает?
Он куча фриков есть которые пихают в проект Erlang, clojure, Haskell
О чем это говорит?

О чем это говорит?

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

для работы не годится.

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

Скажи лучше зачем нужен Раст вот прям сейчас

Как минимум, FOMO.

Скажи что и на чем ты пишешь, я могу посоветовать зачем тебе может быть нужен Rust

Си компилируется очень быстро.

нащо потрібно

с/с++

якщо можна бахати все на асемблері?

Ассамблеи это ускоспециализированный инструмент, где он выгоден его используют. Где выгоден Раст?

с/с++ — вузькоспеціалізований інструмент, де воно вигідно де його використовують?
На расті пишуть бд; критичні секції для продуктів які написані на повільних мовах по типу джави чи го; софт для супутників і аеростатів; а також можна бахати звичайні круди для котосховищ.

Производительность не проблема уже давно
Производительный код я могу написать и на питон и это будет проще раста

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

Какой брейнфак.
На питоне разрабатывают очень крупные проекты и их больше чем проектов на Раст.

Производительный код я могу написать и на питон

Радий за тебе, але всі інші люди на цій планеті не можуть так робити, тому у них постає вибір або C або Cython або Rust.

Да все могут. Даже если есть какие то необъяснимые проблемы. То пару строчек пишешь на С.

То пару строчек пишешь на С.

 Зазвичай люди пишуть щось більше за hello world

Обычна на С надо сто то вычислить и под это уже куча либ, там очень часто прям буквально пару строчек

Так Раст не даёт прирост в скорости разработки

Моя практика на нескольких проектах показывает, что дает.

он как минимум сложен в изучении

С++ тоже сложен в изучении. Я даже поспорю, что C++ сложнее в изучении, чем Rust.

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

Моя практика на нескольких проектах показывает, что дает.

І їх після вашого уходу не переписали на чомусь іншому?

Це не з Rust переписують, це на Rust переписують. Якщо хтось перепише з Rust, то растоподібні прийдуть і перепишуть назад на Rust.

Ну я б посмотрел на эти проекты

Да и с++ и Раст сложны, каждый в своем, потому это замена шила на мыло.
Для прикладного программирования лучше юзать питон.

Ну я б посмотрел на эти проекты

У меня в линкедине написано где я работаю, приходи смотри.

Да и с++ и Раст сложны, каждый в своем, потому это замена шила на мыло.

Сколько строчек на Rust ты написал, чтоб делать такое заявление?

В инсте есть или на гитхаб? Это все что есть с соцсетей

Написал небольшой сервак и на Раст и на плюсах. По итогу понял что лучше питона ничего нет.

А шахматный движок попробуешь написать?

Могу. Движки игр уже делал на питон.
Буквально на выходных делал Множество Мандельброта на фулхд показало 90фпс.

Написал небольшой сервак и на Раст и на плюсах. По итогу понял что лучше питона ничего нет.

Аминь

На Ассемблере тоже можно решить любую проблему, дело разве в этом?

Раст в разы безопасней, на нем быстрее пишется код, в нем лучше экосистема для разработки (тесты из коробки, cargo, clippy, rust-analyzer), он позволяет писать более сложные абстракции через трейты, при этом сохраняя перфоманс. Короче, скорей наоборот — С++ стоит выбирать вместо Раста если вот прямо нет какой-либо нужно либы или если уже есть развитая экосистема (например, геймдев и фреймворки).

як щодо підтримки і дебага С / С++ свистоперділок?

Зачем это если его на питоне пользуют все реже
А так все просто можно модуль отдельно разработать

Это как раз сложно изменить, и очень субъективно. Для меня киллерфича всё-таки маттерн-матчинг на алгебраических типах.

Это как раз сложно изменить

это как раз просто замерить

1. берем фичу и ищем такую же в других ЯП. опа, а нету — значит уже уникальное предложение
2. дальше, рассматриваем эту фичу с точки зрения какую проблему решает. опа, важную, актуальную проблему решает
3. потом послушаем самих авторов — а они зачем новый ЯП сделали, мало ли их что-ли? А они тычут в эту фичу, что мы выше обнаружили исследовали, и говорят — ради нее делали!

ну все, значит это — киллер-фича

Для меня киллерфича

это субъективно.
кому-то и отступы в Питоне — «киллерфича»

рассмотрите ее по предложенному алгоритму

или свой предложите, в котором не будет — «а для меня»

а пока
OCaml(F#), Haskell, Scala ее имеют, фичу эту
уже — не уникальна. значит — не киллер-фича

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

Всё так. Киллер-фича Раста это высокий уровень абстракции (Sum Types, traits, iterators), при этом сишная скорость и возможность опускать на уровень разыменования указателей.

Так же я бы отдельно вынес очень умный компилятор и borrow checker. Такого просто нет нигде больше.

Вытеснить С/С++, из этого мира невозможно, тупо потому что оно везде абсолютно. Чтобы искоренить С, надо наверное вселенную уничтожить под ноль.

Как киллер-фича Go — работа с каналами

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

vlang без сборщика мусора

ошибся, уже и туда завезли (как опцию)

Аналогично несколько месяцев назад начали использовать Rust для секьюрити решения. Для меня rust — это фановый, быстрый и безопасный язык

Я так и не понял почему именно вы решили использовать Rust.

Як на мене одна з головних фічей, про якусь чомусь не кажуть, це паттерн-матчінг на алгебраїчних типах.

www.tiobe.com/tiobe-index/rust
The outliers were Rust, which had the highest average salary (over $180,000), Go ($179,000), and Scala ($178,000)
www.oreilly.com/...​3/2021/09/04-774×1048.jpg
далі там обж сі, ерланг

Зп то до лампи, коли не вказано скільки % ця зп в total compensation має
Якщо вже патякати про високі матерії і maang (kekw)

*GAMNA

я бачу, ми рухаємось у вірному напрямку

Тему моральності не розкрито.

Це правда
Поки не зрозуміло, що там такого паскудного наробила коре тім, що це навіть не захотіли оприлюднювати
cp?
q?
n?

Раст дуже добре підходить під роль першої мови — відразу правильно ставить підхід до програмування, спонукає розбиратися в управлінні пам‘яттю ітд.

<мем про про додавання * та & поки компілятор не буде щасливий>

Як на мене овероптимістично, щоб розібратися з борроу чекер, вже треба трохи програмувати...

Управління пам‘яттю у мовах зі збором сміття взагалі перестає хвилювати програміста. Він звикає до швидкого написання коду і робота з раст стає мукою.
Про мови з динамічними типами і говорити не буду.
А от якщо порівнювати з C/C++, то питання спірне, я вчив С першою мовою і дуже нервував, наштовхуючись на проблеми пам‘яті. В расті я так само мав би проблеми, але ще і компілятор, який пояснював би ці проблеми.
Хоча на початку може справді краще трохи постраждати на справді низькому рівні без усяких абстракцій...

дозволяє використовувати дуже багато трюків

Помнится точно также в свое время было с руби.Вся любовь проходит когда берешь в руки проект от 20 разрабов где каждый свои трюки внедряет.Если не будет выработан «rust-way» причем строгий то этот язык останется для самых умных в узких кругах мировых гигантов у которых нет финансовых проблем

Ну... там особо выбора пути немного, ИМХО.

Если не будет выработан „rust-way” причем строгий

github.com/rust-lang/rust-clippy

Для популяризації Rust в Україні треба писати технічні статті, прикладу розібрати копію Reddit github.com/LemmyNet/lemmy

Підписатись на коментарі