LINUX.ORG.RU

Rust 1.13

 


4

10

Представлен релиз Rust 1.13 — системного языка программирования, нацеленного на безопасную работу с памятью, скорость и параллельное выполнение кода. В этот релиз вошли 1448 патчей.

Этот сезон оказался очень плодотворным для Rust. Проведены конференции RustConf, RustFest и Rust Belt Rust. Обсуждено будущее языка, разработан план на 2017 год и созданы новые инструменты.

Новое в 1.13

Выпуск 1.13 содержит несколько расширений языка, включая долгожданный оператор ?, оптимизацию времени компиляции, новые возможности cargo и стандартной библиотеки, а также множество мелких улучшений в документации и исправления ошибок.

Cargo в этом релизе содержит важные обновления безопасности, связанные с зависимостями от curl и OpenSSL, для которых также недавно были опубликованы обновления безопасности. Подробную информацию можно найти в соответствующих источниках для curl 7.51.0 и OpenSSL 1.0.2j.

Оператор ?

Добавлен новый оператор ?, делающий обработку ошибок приятнее за счёт уменьшения визуального шума. В качестве иллюстрации представим следующий код, который считывает некоторые данные из файла:

fn read_username_from_file() -> Result<String, io::Error> {
    let f = File::open("username.txt");

    let mut f = match f {
        Ok(file) => file,
        Err(e) => return Err(e),
    };

    let mut s = String::new();

    match f.read_to_string(&mut s) {
        Ok(_) => Ok(s),
        Err(e) => Err(e),
    }
}

В этом коде есть две позиции, которые могут привести к ошибке: открытие файла и считывание данных из него. Если что-либо из этого даст сбой, нужно возвратить ошибку из read_username_from_file. Для этого необходимо обрабатывать результаты ввода-вывода. В простых ситуациях, как здесь, где требуется лишь возвратить ошибку выше по стеку вызовов, постоянное написание кода обработки по одному и тому же шаблону — это излишняя информация и вряд ли будет содержать полезную информацию для читателя.

С оператором ?, вышестоящий код выглядит следующим образом:

fn read_username_from_file() -> Result<String, io::Error> {
    let mut f = File::open("username.txt")?;
    let mut s = String::new();

    f.read_to_string(&mut s)?;

    Ok(s)
}

Оператор ? заменяет весь код обработки ошибок, написанный при помощи оператора match ранее. Иными словами, ? применяется к значению Result, и если оно равно Ok, разворачивает его и отдаёт вложенное значение; если это Err, то происходит возврат из функции, в которой вы находитесь.

Более опытные пользователи могут заметить, что этот оператор делает то же самое, что и макрос try!, который доступен начиная с Rust 1.0. И будут правы, в самом деле, это то же самое. До 1.13 read_username_from_file можно было бы написать следующим образом:

fn read_username_from_file() -> Result<String, io::Error> {
    let mut f = try!(File::open("username.txt"));
    let mut s = String::new();

    try!(f.read_to_string(&mut s));

    Ok(s)
}

Так зачем надо было расширять язык, если до этого уже был такой макрос? Есть несколько причин. Во-первых, try! доказал своё огромное значение и часто используется в идеоматичном Rust. Он используется так часто, что было принято решение о создании собственного «подслащенного» синтаксиса для него. Такой вид эволюции — одно из преимуществ мощной системы макросов: расширения к синтаксису языка можно добавлять через прототипирование без внесения изменений в сам язык и особо полезные макросы могут указать на недостающие возможности языка. Эволюция try! в ? — яркий пример этого.

Другая причина — восприятие нескольких последовательных вызовов try!:

try!(try!(try!(foo()).bar()).baz())
против
foo()?.bar()?.baz()?

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

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

Более подробно об операторе ? можно прочитать в RFC 243.

Улучшение производительности

В последнее время очень много внимания заострено на производительности компилятора. Mark Simulacrum и Nick Cameron произвели улучшения http://perf.rust-lang.org/, инструмента для отслеживания производительности компилятора, на котором периодически запускается набор rustc-benchmarks на выделенном оборудовании. Инструмент записывает результаты каждого прохода компилятора и позволяет находить и отслеживать код, приведший к регрессии. Например, при помощи этого инструмента можно посмотреть график производительности за весь цикл разработки релиза 1.13, где можно увидеть заметное сокращение времени работы компилятора, отдельно представленное на соответствующей странице со статистикой.

Большое улучшение на графике от 1 сентября связано с оптимизацией от Niko по кешированию нормализованных проекций во время преобразования. То есть во время генерации промежуточного представления LLVM компилятор больше не пересчитывает каждый раз конкретные экземпляры связанных типов, когда они необходимы, а использует ранее вычисленные значения. Несмотря на то, что данная оптимизация не влияет на всю кодовую базу, для некоторого кода с определенным шаблоном, например, futures-rs, ускорение сборки в режиме отладки достигает 40%.

Другая оптимизация от Michael Woerister уменьшает время компиляции библиотек, экспортирующих множество встраиваемых функций. Когда функция помечена как «#[inline]», в дополнение к преобразованию этой функции в текущей библиотеке компилятор сохраняет её представление MIR и преобразует функцию в представление LLVM в каждой библиотеке, которая вызывает её. Оптимизация, сделанная Michael Woerister, позволяет компилятору избегать предварительных преобразований кода встраиваемых функций в библиотеках, в которых они определены, до их непосредственного прямого вызова. Таким образом, компилятор избавляется от необходимости выполнения лишних шагов по преобразованию функции в промежуточное представление LLVM, оптимизации LLVM и преобразования функции в машинный код.

В некоторых случаях это приводит к впечатляющим результатам. Например, время сборки библиотеки ndarray уменьшилось на 50%, а библиотека winapi 0.3 (ещё не опубликована) полностью избавилась от шага генерации машинного кода.

Но это ещё не всё: Nick Nethercote обратил своё внимание на производительность компилятора, сконцентрировавшись на профилировании и микрооптимизациях. Этот релиз включает в себя некоторые плоды его работ, ещё больше ожидается в 1.14.

Другие заметные изменения

Макросы теперь можно использовать на позиции типов (RFC 873), а атрибуты могут быть применены к операторам (RFC 16):

// Use a macro to name a type
macro_rules! Tuple {
    { $A:ty,$B:ty } => { ($A, $B) }
}

let x: Tuple!(i32, i32) = (1, 2);

// Apply a lint attribute to a single statement
#[allow(uppercase_variable)]
let BAD_STYLE = List::new();

Были удалены встраиваемые флаги сброса. Раньше при условном перемещении компилятор встраивал «флаг сброса» в структуру (увеличивая его размер), чтобы отслеживать, когда надо его сбросить. Из-за этого некоторые структуры занимали больше места, что мешало передаче типов с деструкторами поверх FFI. Благодаря тому, что в версии 1.12 добавлен MIR, появилась основа для многих улучшений, включая удаление встраиваемых флагов сброса. Теперь флаги сброса хранятся в дополнительном слоте в стеке тех функций, которым они нужны.

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

Стабилизация языка

Стабилизация библиотек

Возможности Cargo

Более детальный список изменений доступен по ссылке: https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1130-2016-1...

>>> Подробности

★★★★★

Проверено: maxcom ()
Последнее исправление: cetjs2 (всего исправлений: 5)

Послание пророка растофарианцам и гоуландцам

... и всё-таки, Си всех нас переживёт! По крайней мере пока жив Linux. Мозиловцы идиоты, не надо было забрасывать свою ось. Без своей оси вы всего лишь очередной язык программирования. Язык Си прирос мощью из-за Юникса, и продолжает жить благодаря Линуксу.

Без своей оси Раст никогда не станет заменой Си.

anonymous
()
Ответ на: комментарий от tailgunner

Таким образом, авторы завели себя в тупик? Сделают HKT - язык станет слишком сложным (они сами так говорят). Не сделают HKT - сипэпэшники обсмеют и все время будут тыкать этим в лицо.

anonymous
()
Ответ на: комментарий от ilammy

В том, что панику не предполагается использовать для обработки ошибок, только для сигнализации «нарушений контрактов». Исключения же в C++/Java/C# используются и для того, и для другого.

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

Ошибка --- это в общем-то ожидаемая проблема, которая может возникнуть в процессе работы программы. Там, файл не найден, сеть отпала, плагин не загрузился. Эти ситуации можно и нужно обрабатывать.

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

На практике нет такого деления. В каждом случае свои особенности. Иногда отсутствие файла делает бессмысленным продолжение выполнения программы. Иногда нехватка памяти это рядовое, ничем не выделяющееся событие. Нельзя это заранее понять, когда ты пишешь интерфейс, это понятно только когда его используешь и это может меняться в течение жизни программы. Сначала конфиг должен быть и без него сразу падаем. Потом придумали дефолт конфиг и теперь падать не нужно. Сначала любая ошибка из SQL-выражения это WTF и падаем без вариантов. Потом оказывается, что duplicate foreign key вот-тута надо бы обрабатывать.

ИМХО, исключения (unchecked) это самый разумный способ обработки ошибок. Проверка кодов возврата очень неудобна, практически неюзабельна в языках типа C или Go. Но если обсыпать сахаром, как в Rust, уже вроде и ничего страшного. Разве что — у исключений есть шикарный инструмент под названием stacktrace, как можно без него обходиться, я вообще не представляю. Если в возвратах ошибок в момент создания ошибки (или обёртки над ошибкой) ещё и стектрейс в отладочных сборках хватать (а лучше в любых), тогда вообще без разницы будет.

Legioner ★★★★★
()
Ответ на: комментарий от atrus

В назначении. Исключения - это метод информирования программы об ошибках. Исключения должны ловиться (в идеале). Паника это метод убиения программы/потока, с корректным освобождением ресурсов и информирования о беде. Ошибки возвращаются через Option/Result.

Ловить или убивать — решает пользователь функции, а не её автор.

Exception нормально ловить на уровень выше генерации, на два.

А в моей практике постоянно ловятся на 30 уровней выше, и ничего, всё хорошо.

Panic если и ловят, то на самом верхнем уровне, чтобы залогировать или красиво вывести сообщение перед смертью.

А что мне мешает ловить паник на 1 уровень выше и использовать другую логику?

Если вы планируете массово ловить паники и продолжать программу, что у вас что-то очень не так.

Почему это?

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

Не сделают HKT - сипэпэшники обсмеют и все время будут тыкать этим в лицо.

ЭТОГО НЕЛЬЗЯ ДОПУСТИТЬ!!!!1111

tailgunner ★★★★★
()
Ответ на: комментарий от foror

Не нужно это обрабатывать для веб-сервера. Если не нашел файл, то кидаешь выше, где обрабатываются все ошибки и не страдаешь херней.

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

ilammy ★★★
()
Ответ на: комментарий от tailgunner

Это сначала так было. Потом сделали перехватываемую панику.

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

и ронять программу из-за этого как-то слишком резко

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

ilammy ★★★
()
Ответ на: комментарий от chimera19

Так на Rust, ты вообще не сможешь написать двусвязный список, не переходя в небезопасному коду.

Можно, с помощью Rc.

ilammy ★★★
()
Ответ на: комментарий от Legioner

Т.е. как я и говорил, это одно и то же, только используется по-разному.

Суть в том, что у паники более ограниченная область применения, меньше вероятность нецелевого использования. В то время как исключения каждый использует как хочет: кто только для критических ошибок, кто для всех ошибок, кто вообще для control flow.

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

Так есть же. Вот ты сам выделил «рядовые события» и «события, делающие бессмысленным продолжение выполнения программы». Паники как раз для вторых. Для того, что делает бессмысленным продолжение выполнения программы в целом. Ошибки могут повышаться до паник, но паника никогда не понижаются до ошибок.

Если программа в целом подразумевает бесконечность памяти, то она использует паникующий аллокатор. Иначе она обязана проверять и обрабатывать каждый чих. Аналогично с конфигом и SQL-запросами. Особенно это важно вот в этом случае:

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

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

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

Конечно, с опытом приходит умение сразу писать exception-safe код, но всё же приятно, когда за этим следит компилятор, а не белковые ревьюверы.

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

Вот да, тут согласен. И для Rust есть error-chain, который может генерить и укладывать стректрейсы в ошибки.

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

ilammy ★★★
()
Ответ на: комментарий от ilammy

Потом сделали перехватываемую панику.

Её ведь сделали не для обработки ошибок

Выше есть цитата про «graceful handling of the error» - она из документации.

tailgunner ★★★★★
()
Ответ на: комментарий от ilammy

Ты только что описал исключительные ситуации (Exception)

anonymous
()
Ответ на: комментарий от kto_tama

Прорыв в Computer Science. Прям бери и PhD защищай.

anonymous
()
Ответ на: комментарий от tailgunner

ADT, RAII, дженерики, модули

А монады где? Вот как скажи писать драйвер без моноидов в категории пердофунктора? Немыслимо!

anonymous
()

Сабжевый оператор ? - это прикол конечно. Сколько было соплей пролито местными растерами на тему какая крутая в расте обработка ошибок (что там 5 способов и многоуровневые простыни - это типа фича). Такая крутая, что добавили еще один костыль, совершенно уже мутно-магическая. Ларри Уолл уже начинает нервно закуривать, глядя на хипсто-дизайнеров раста.

anonymous
()
Ответ на: комментарий от anonymous

А монады где? Вот как скажи писать драйвер

Всё есть. Драйверы писать можно.

tailgunner ★★★★★
()
Ответ на: комментарий от RazrFalcon

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

Ну ведь можно же! Единственное, что это вся возня через void* уж сильно «дурно пахнет».

void_ptr ★★★★
()
Ответ на: комментарий от tailgunner

Процитируй рекомендацию.

Rust has a tiered error-handling scheme:

  • If something might reasonably be absent, Option is used.
  • If something goes wrong and can reasonably be handled, Result is used.
  • If something goes wrong and cannot reasonably be handled, the thread panics.
  • If something catastrophic happens, the program aborts.

https://doc.rust-lang.org/beta/nomicon/unwinding.html

atrus ★★★★★
()
Ответ на: комментарий от RazrFalcon

Option не ошибка. Отсутствие результата - тоже результат.

Ладно, результат, на который можно забить. :) См. выше.

atrus ★★★★★
()
Ответ на: комментарий от atrus

5коп. В Vala,например, Option выглядит типа int? Т.е. могу вернуть int, а могу - None.

void_ptr ★★★★
()
Ответ на: комментарий от Legioner

А в моей практике постоянно ловятся на 30 уровней выше, и ничего, всё хорошо.

Не существенно. Важен принцип. Исключение эта такая «катапульта» сквозь стек вызовов.

А что мне мешает ловить паник на 1 уровень выше и использовать другую логику?

То, что это не отвечает идеям заложенным в раст. Исключение это сторонний механизм обработки ошибок, существующий параллельно с нормальным графом вызова функций, не связанный с возвращаемыми значениями и т.д. Собственно, разработчики там и пишут:
"Exceptions complicate understanding of control-flow, they express validity/invalidity outside of the type system, and they interoperate poorly with multithreaded code (a major focus of Rust)."
https://www.rust-lang.org/en-US/faq.html#error-handling

Почему это?

Потому что раст сознательно спроектирован не так. Там нет исключений. panic - не исключение. try - не исключение. Если вас это не устраивает - пишите на том языке, который устраивает. От вас ведь не требуют писать на раст голоса в голове? Или вы мне сейчас расскажете, что не в силах игнорировать 3,5 лоровских троллей?

atrus ★★★★★
()
Ответ на: комментарий от atrus

Этот документ устарел. Сильно. Причем он был устаревшим даже на момент публикации:

«In the long-long-ago, Rust was much more like Erlang. Like Erlang, Rust had lightweight tasks, and tasks were intended to kill themselves with a panic when they reached an untenable state. [...] As the Rust we know today came to be, this style of programming grew out of fashion».

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

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Но FAQ-то не устарел? А в главе Error Handling современной редакции примерно это и написано. Только развесисто и без такой сжатой формы. Там показывается как использовать Option и Result и нигде не не рекомендуют painc.

atrus ★★★★★
()
Ответ на: комментарий от atrus

Но FAQ-то не устарел?

FAQ и не противоречит перехвату паники.

и нигде не не рекомендуют painc

If something goes wrong and cannot reasonably be handled, the thread panics.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

FAQ и не противоречит перехвату паники.

Ну перехватывайте. Это уже ведь не обработка ошибок. Это обработка случившейся жопы.

Допустим. У вас функция, которая реверсит большой массив, не выделяя память под новый и копируя, в меняя элементы местами. Где-то в середине этого процесса случился panic. Уровнем выше вы его перехватили. И? Какие ваши действия, кроме как убить себя об стену? (Подсказка: Красиво убить себя об стену.)

If something goes wrong and cannot reasonably be handled, the thread panics.

«reasonably». Во-во.

atrus ★★★★★
()
Последнее исправление: atrus (всего исправлений: 1)
Ответ на: комментарий от atrus

Допустим. У вас функция, которая реверсит большой массив, не выделяя память под новый и копируя, в меняя элементы местами. Где-то в середине этого процесса случился panic. Уровнем выше вы его перехватили. И? Какие ваши действия, кроме как убить себя об стену?

Допустим, у меня много таких массивов. Тогда мои действия - сказать «Input too complex» и перейти к обработке следующего.

Убивать себя об стену - просто не вариант в некоторых случаях, а в других случаях тупо бесполезно.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Тогда мои действия - сказать «Input too complex» и перейти к обработке следующего.

И получить весёлую программу, которая х.з. чего сделает, получив наполовину перевёрнутый массив. Так держать! :)

Убивать себя об стену - просто не вариант в некоторых случаях, а в других случаях тупо бесполезно.

Убить себя об стену - бесценно. Для всего остального есть Option/Result. :-D

atrus ★★★★★
()
Последнее исправление: atrus (всего исправлений: 2)
Ответ на: комментарий от atrus

Тогда мои действия - сказать «Input too complex» и перейти к обработке следующего.

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

Которая выдает сообщение об ошибках на данных, которые не может обработать.

Так держать! :)

Держим. И не мы одни - любые приличные серверы так поступают.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Которая выдает сообщение об ошибках на данных, которые не может обработать.

Но обработка-то запроса на этом прекращается?

atrus ★★★★★
()
Ответ на: комментарий от tailgunner

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

atrus ★★★★★
()
Ответ на: комментарий от Legioner

ИМХО, исключения (unchecked) это самый разумный способ обработки ошибок.

Пожалуйста, никогда не пишите на расте. А еще лучше вообще ничего не пишите.

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

Шок. В расте он тоже есть, и без исключений.

Особенно в С++ исключения вообще каждый использует, как хочет, кто-то всё кидает, кто-то вообще не кидает.

На вас eao197.

RazrFalcon ★★★★★
()
Ответ на: комментарий от atrus

В вашем же комментарии написано «might reasonably be absent», ака «может отсутствовать». Отсутствие результата не ошибка.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Legioner

На практике нет такого деления. В каждом случае свои особенности. Иногда отсутствие файла делает бессмысленным продолжение выполнения программы. Иногда нехватка памяти это рядовое, ничем не выделяющееся событие. Нельзя это заранее понять, когда ты пишешь интерфейс, это понятно только когда его используешь и это может меняться в течение жизни программы. Сначала конфиг должен быть и без него сразу падаем. Потом придумали дефолт конфиг и теперь падать не нужно. Сначала любая ошибка из SQL-выражения это WTF и падаем без вариантов. Потом оказывается, что duplicate foreign key вот-тута надо бы обрабатывать.

Не совсем так.

Вот пишу я метод, который может зафейлиться, причём я на 100% уверен (в ТЗ так), что при неудаче программа должна падать. Должен ли я заботиться о корректном состоянии объекта? Не, в принципе реализовать возможно, но это лишняя работа, а нам нужно версию 1.0 пораньше выкатить. В итоге я бросаю исключение, а на состояние объекта забиваю. Это исключение где-то ловится, выводит сообщение об ошибке и программа завершается. Приходит время писать 1.1, ТЗ изменилось, теперь падать не нужно. Уже другой человек ловит исключение и пытается как-то жить дальше. Но при этом всё сложно, он не знает, насколько код безопасен, можно ли продолжать использовать мой класс, можно ли продолжать использовать данные выше по стектрейсу и так далее до места ловли. Соответственно, раз приходится заботиться о стойкости к исключениям всего кода внутри try и вызываемого им, разумнее всего будет поймать исключение как можно ближе к месту бросания. Это значит 1) исчезает главное достойнство исключений: возможность поймать там где можешь нормально обработать.

2) скорее всего придётся рефакторить код, чтоб на уровне ловли была вся нужная для восстановления информация, а ниже была exception safety.

В rust всё ровно так же, в первой версии .unwrap() или .expect() и паника, при подготовке к 1.1 - поиск места для обработки с возможным рефакторингом ниже и выше. За исключением одного момента: в расте видно, какой код написан с учётом обработки ошибки, а какой с предположением, что ошибки не будет.

khrundel ★★★★
()
Ответ на: комментарий от anonymous

Анонимус, ты понимаешь, что несёшь бред? Достаточно одного мутекса, со ссылкой на него из каждого элемента списка. Про производительность или сценарии использования ничего не было сказано.

red75prim ★★★
()
Ответ на: комментарий от red75prim

Причем тут производятельность, мань?

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

Производятельность того гуано, что вы двое тут накидали, это отдельная тема для отдельного разбора.

anonymous
()
Ответ на: комментарий от ilammy

Я правильно понимаю, что ты предлагаешь в каждом мьютексе держать всю таблицу процессов?

anonymous
()
Ответ на: комментарий от tailgunner

Ага, растоманам настолько пофиг, что на гитхабе репозиториев с ОС на Rust можно найти штук 100 не напрягаясь.

И да, пойнт был в том, незачем реализовывать то, что уже сделано в стандартной библиотеке через unsafe-ад.

anonymous
()
Ответ на: комментарий от anonymous

Наркоман, ты понимаешь, что всем пофиг на то, что рантайм реализован на unsafe-языке?

на гитхабе репозиториев с ОС на Rust можно найти штук 100 не напрягаясь.

И?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Ты тупого-то не включай.

Было бы пофиг - не стали бы так массово копипастить ассемблерные вставки с osdev.

anonymous
()
Ответ на: комментарий от anonymous

Наркоман, ты понимаешь, что всем пофиг на то, что рантайм реализован на unsafe-языке?

на гитхабе репозиториев с ОС на Rust можно найти штук 100 не напрягаясь.

И?

Было бы пофиг - не стали бы так массово копипастить ассемблерные вставки с osdev.

Л - логика. Я бы сказал тебе «не включай тупого», но ты не можешь ни включить его, ни выключить.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

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

Кста, а тут разве не принято срезать кармочку за оверквотинг?

anonymous
()
Ответ на: комментарий от anonymous

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

Не нравится, когда с тобой говорят в твоем же тоне - держи себя в руках.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Rust - это C++, из которого повыпиливали кучу устаревшего говна и прикрутили новые модные стильные молодёжные плюшки

Rust - это Си, в который прикрутили старые плюшки из ML и не очень старые плюшки из Cyclone.

Если это

std::sync::Weak<Mutex<()>>

Си, то я - Дональд Трамп.

Раст изначально готовили как замену плюсам в браузерном движке, если ты забыл, отсюда и увлечение всякими там :: и <>, надо же сделать крестогеям приятные дилды.

Что касается Си, то у него уже есть замена, С++ называется, к тому же, не далее как в 2014 году дохлый страус сманяврировал, и теперь в С++

...открыты все двери для безопасного программирования...

не помню, кто сказал, ЛОЛ.

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

Ну и б.г с тобой, сектант, чем дальше, тем тебе же будет хуже.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.