LINUX.ORG.RU

Продемонстрирована возможность разработки частей Linux на Rust

 , ,


4

9

Французский программист написал статью, в которой рассмотрел возможность переписывания ядра Linux на Rust.

В статье отмечено, что данный язык хорошо подходит для системного программирования, будучи достаточно низкоуровневым и при этом лишённым многих недостатков C, и уже используется для написания новых ОС. Однако автор не считает создание ОС с нуля перспективным для серьёзного применения, и последовательный перенос отдельных частей Linux на Rust для решения различных проблем безопасности кажется ему более целесообразным.

В качестве «Proof of Concept» была приведена реализация системного вызова, содержащая вставки на Assembler внутри unsafe-блоков. Код компилируется в объектный файл, не связанный с библиотеками и интегрируемый в ядро во время сборки. Работа производилась на основе исходного кода Linux 4.8.17.

>>> Статья



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

Ответ на: комментарий от AntonyRF

У меня есть ощущение, что мне приходится общаться с малолетними дебилами (c), которые позволяют себе ссылаться вот на это:

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

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

Малолетний дебил (c) в силу скудоумия и отсутствия опыта даже не может себе вообразить ситуацию, когда некий условный Федя Иванов пишет на безопасном Rust-е свой вариант распараллелиного qsort-а. В котором задействует стороннюю библиотеку от условного Васи Пупкина. В библиотеке этой, для обхода контроля borrow checker-а, Вася Пупкин задействовал unsafe (ну вот почти так же, как это сделано в упомянутом выше split_at_mut). Но Вася ошибся и иногда у него возникают перекрывающиеся диапазоны, параллельный доступ к которым из qsort-а приводит к порче данных.

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

Виноват, по мнению малолетнего дебила (с), конечно же, Вася Пупкин. Ну еще и некто eao197, который говорит какой-то бред на счет «гарантий отсутствия data races в Rust». Так победим!

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

Вася Пупкин задействовал unsafe

Но Вася ошибся

Виноват, по мнению малолетнего дебила (с), конечно же, Вася Пупкин. Ну еще и некто eao197

Все сходится :)

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

eao197

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

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

Ну, я бы добавил еще и «Rust гарантировал». Тогда точно все сходится :)

Раст гарантировал Феде что это точно не его косяк. И опираясь на эту гарантию, Федя знает кому пойдет бить морду.

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

Их разработка началась где-то около 2011-го. Практически в одно время. Доступные для использования превью Kotlin-а появились вскоре после Ceylon 1.0.

Не столько в контексте Kotlin/Ceylon, но вообще дата начала разработки может мало о чём говорить. Если один язык делается силами большой корпорации без всяких анонсов, а потом сразу выпускается 1.0 в более-менее финальном виде и с кучей батареек - это одно. А если вначале (и хорошо если только вначале) вся работа ведётся одним человеком по выходным - совсем другое. Ну и до кучи до «релиза» руки, в принципе, развязаны и язык может сильно меняться, как это и было с растом.

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

так или иначе связанном с растом откладываете кирпичи с завидным упорством?

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

так или иначе связанном с растом откладываете кирпичи с завидным упорством?

Тезка, не путайте настоящих троллей с косящими под них самозванцами!

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

Гарантия, которая обеспечивается теорией вероятности — это что-то новое.

Контроль качества на основе выборки (одна из любимых задач в теорвере) — не, не слышал.

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

Контроль качества на основе выборки

Хотите сказать, что в Rust-е контроль за лайфтаймами и отсутствием гонок на вероятностном подходе основан?

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

При разработке приложения на С++ у тебя будет 1000 проблем, из них 500 - состояния гонки. При разработке приложения на Расте у тебя будет 501 проблема, и состояние гонки случится только в одной из них. Т.е. статистически таких проблем практически не существует.

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

Т.е. статистически таких проблем практически не существует.

Даже если не рассматривать сейчас ситуации, когда статистически таких проблем нет, а на практике они есть, в чем вы видите противоречие вот с этим?

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

Хотите сказать, что в Rust-е контроль за лайфтаймами и отсутствием гонок на вероятностном подходе основан?

Нет, я хотел сказать именно то, что сказал. Не нужно пытаться натужно прочитать между строк.

ЗЫ:к ответившему выше тезке отношения не имею.

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

Нет, я хотел сказать именно то, что сказал. Не нужно пытаться натужно прочитать между строк.

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

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

Для нескольких unsafe примитивов на пару тысяч строк можно формально доказать корректность. С целой либой на миллион ничего кроме «мамой клянусь» не прокатит.

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

Для нескольких unsafe примитивов на пару тысяч строк можно формально доказать корректность.

Смотри тему _этого_ топика и что там внутри :) А внутри там неонка, да :)))) Любая програма на ржавом, которая делает что то полезное, а не считает сферических коней в вакууме выглядит так: начало Вывод ЧСВ аффтара и ссылка на ***оно репку в гитхабе unsafe { код } конец

С целой либой на миллион ничего кроме «мамой клянусь» не прокатит.

Ну то есть преимуществ перед С\С++ нет?

anonymous
()

Растишки такие забавные карапузы (правда надоедливые и назойливые) :)

Нет такого проекта на гитхабе который растишки не кинулись бы переписывать на ржавеньком :)

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

А потом тихий слив :-D :))))

Типо:

Я мог бы Rust добавить, проект очень крутой
Вот человек уже пытался, даже рантайм написал, но в итоге не осилил: https://github.com/kaitai-io/kaitai_struct/issues/22

Растишки сейчас начнут свою любимую песню о том, что этот мол не смог, не заржавел ещё достаточно, но мы де - подхватим упавшие труселя знамя и тыгыдым-тыгыдым :)

Но факт остаётся фактом:

  • Нет такого проекта на гитхабе который растишки не кинулись бы переписывать на ржавеньком
  • И нет такого проекта изЪ - который бы они успешно доделали! :)))

Сам по себе Rust - язык не хуже (и не лучше) других. Но растишки - это что-то! :)

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

О я-я! Нацюрлих! Целых __два__ примера сомнительной полезности :-)

О чем и спичЪ :)

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

Но тут другое интересно: несколько привлекателен бы был Rust, если бы в нем поддержку ООП сделали

ООП не ООП, а вот если бы исключения сделали, я бы на Раст обратил серьёзное внимание.

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

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

Имеется такой стек вызовов A -> B -> C. C кидает исключение, А его ловит, все хорошо.

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

Раст старается быть максимально безопасным языком, так что решение вида «написать в комментариях к функции В что она кидает исключения» не подходит.

А дальше начинаются костыли вида checked exceptions или catch(Throwable e), один не лучше другого.

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

Во-первых, все вовсе не так печально, как вы пытаетесь изобразить. По крайней мере вне мира Java.

Во-вторых, в Rust-е есть и Result, и паника. Так что программист явно находится не в такой радужной ситуации, как ему об этом пытаются рассказать.

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

Во-вторых, в Rust-е есть и Result, и паника.

В руководсте от гугла написано:

The availability of exceptions may encourage developers to throw them when they are not appropriate or recover from them when it's not safe to do so. For example, invalid user input should not cause exceptions to be thrown. We would need to make the style guide even longer to document these restrictions!

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

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

Звучит, как бредятина. Как раз исключения и убирают лишний геморр при инициализации сложных объектов и агрегатов.

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

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

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

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

Он наверное имел в виду такой кейс

let mut a = A::new();

panic::catch_unwind(|| {
    a.do_smthng();
}).ok();

println!("{:?}", a);

В последней строке `a` может содержать логически неверное состояние.

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

Паника приведёт к завершению проги, если её не ловить. То есть это не способ сообщить об ошибке.

Логические - да. Но в C++ мы можем получить неинициализированную переменную, которая будет содержать мусор. В rust такого не будет.

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

Если посреди конструктора будет брошено исключение, то мы получим не до конца инициализированный объект.

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

Еще раз,

Исключения не гарантируют ..., что недопустимо в Safe Rust.

Так что будет недопустимого если сделать исключения такими же безопасными как сейчас panic?

Если посреди конструктора будет брошено исключение, то мы получим не до конца инициализированный объект.

o_O

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

По ссылке чел предлагает разрешить переключать варианты enum не перемещая совпадающие поля, на что ему ответили что такая фича будет не безопасна в присутствии panic.

Не вижу тут ничего особенного.

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

Концептуально — возможно было и раньше. Часть вещей с тех пор как стабилизировали фичу no_std (т. к. в пространстве ядра нет необходимых для libstd вещей), часть до сих пор только в nightly. Например, макрос asm! до сих пор формально нестабилен, т.е. может поменять синтаксис.

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

Просто пример.

Пример того, что вы не знаете C++?

Еще раз: какое отношение метод init имеет к инициализации объекта?

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

Ок, так и быть, упрощаю:

class Data {
public:
    Data() {
        v1 = 1;
        throw "error";
        v2 = 2;
    }

public:
    int v1;
    int v2;
};

{
    Data *d;

    try {
        d = new Data();
    } catch(...) { }

    std::cout << d->v2 << std::endl;
}

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

Неинициализированным осталось поле v2.

В расте же мы может изобразить только:

use std::panic;

#[derive(Debug)]
struct Data {
    v1: i32,
    v2: i32,
}

impl Data {
    fn new() -> Data {
        Data {
            v1: panic!(),
            v2: 2,
        }
    }
}

fn main() {
    let d = panic::catch_unwind(|| {
        Data::new()
    });

    println!("{:?}", d);
}
Где d хранит или ошибку, если было исключение, или результат с Data, если всё ок. Промежуточное состоянии, как в примере с C++, получить нельзя.

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

Ну и инициализируй указатель дефолтным значением до try {} catch, не будет проблемы с неинициализированным указателем.
Что ты пытаешься доказать? Что на Rust такое не скомпилируется? Дак это и ежу понятно

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