Ржавчина-это большая надежда на безопасный язык программирования низкого уровня. Это часто выражается в девизе «бесстрашный параллелизм», но кто скажет, что это действительно лучше. Возможно, это так же плохо по-разному.
Новое исследование, проведенное Цзэминем Юем, Линьхаем Сонгом, Иин Чжаном из Университета штата Пенсильвания и Университета Пердью, направлено на то, чтобы выяснить, действительно ли подход Rust к параллелизму защищает программиста от ошибок, столь распространенных в языках, подобных Си.
Ржавчина-это язык, о котором говорят все крутые ребята, если не используют его. Если вы пропустили его предысторию, он был изобретен в 2006 году Градоном Хоаром, защищен и используется Mozilla и быстро завоевывает репутацию серьезной альтернативы C/C++ для системной работы. Ржавчина особенная, потому что она остается близко к металлу и обеспечивает безопасность способами, которые являются недорогими с точки зрения производительности и использования памяти. Он имеет концепцию владения, чтобы избежать проблемы совместного использования переменных между потоками, и обеспечивает использование блокировок. В то время как другие языки имеют блокировки, как правило, они применяются совместно. Если вы хотите получить доступ к ресурсу без использования блокировки, которую вы объявили, что собираетесь использовать — вы можете.
В Rust есть все низкоуровневые вещи, которые вы ожидаете, но с ограничениями на то, как они используются. Если вам действительно нужно перейти на родной язык, вы можете кодировать, используя, скажем, необработанные указатели, но вы должны пометить код как небезопасный. В принципе, если вы не пишете никакого небезопасного кода или если вы пишете небезопасный код правильно, утверждается, что Rust избегает всех опасностей гонки, присущих другим языкам.
Может ли это быть правдой?
Исследователи изучили код в GitHub, чтобы выяснить, как используется Rust и какие ошибки на самом деле произошли. Первое наблюдение состояло в том, что существует много небезопасных тегов. По иронии судьбы именно сервопроект Mozilla чаще всего использовал unsafe. Похоже, что Rust достаточно ограничителен, чтобы заставить разработчиков обратиться к небезопасному коду, чтобы выполнить работу. Возможно, было бы лучше иметь более тонкую версию unsafe, которая отключает только те проверки, которые необходимо отключить.
Rust также, похоже, реализует параллелизм по — разному-предпочитая канал и атомарный мьютексу. Предполагается, что это может затруднить поиск инструментов, помогающих в решении проблем параллелизма, поскольку они более знакомы с мьютексом.
Чтобы узнать об ошибках, связанных с параллелизмом, команда изучила ошибки, классифицированные как ошибки гонки или взаимоблокировки. Было обнаружено, что можно вызвать взаимоблокировку путем неправильного использования каналов, но из десяти случаев взаимоблокировки семь были вызваны двойными блокировками и использованием неявной разблокировки. Из обнаруженных ошибок гонки данных пять из восьми были вызваны небезопасным кодом. Что было удивительно, так это то, что было три случая гонки данных внутри предположительно безопасного кода. В чем может быть проблема? Было обнаружено, что все гонки данных были вызваны неправильным использованием атомарных операций, которые не проверяются на принадлежность. Это, по — видимому, делает их восприимчивыми к переупорядочению процессором или компилятором-жизнь сложна для программного обеспечения, работающего под современным процессором.
Предложение, сделанное исследователями, заключается в следующем::
«Методы обнаружения расы необходимы для ржавчины, и они должны быть сосредоточены на небезопасном коде и атомарных операциях в безопасном коде.»
Еще многое предстоит сделать, и это очень предварительный взгляд на ржавчину. В целом, похоже, что Rust обеспечивает более высокий уровень безопасного параллелизма. Если вы можете избежать необходимости использовать небезопасный код, то существует лишь небольшое количество способов, которыми вы можете испортить его. Реальный вопрос заключается в том, можем ли мы избежать небезопасного кода? Действительно ли это важно? Или программисты просто неправильно мыслят? Или они преобразуют решения с других языков, которые просто не подходят?
Нам нужно больше анализа.