LINUX.ORG.RU

Corrode, проект транслятора из C в Rust, получил финансирование Mozilla

 , corrode, , ,


3

8

Джеймс Шарп (James Sharp), отметившийся ранее в проекте X.org, в начале мая 2016 начал разработку проекта Corrode, целью которого является трансляция программ, написанных на C, в исходный код на Rust. Corrode написан на Haskell и распространяется под GNU GPLv2.

На текущий момент проект обзавёлся сообществом, научился транслировать некоторые программы и обрёл первые ближайшие цели и ориентиры: трансляция неподдерживаемых программ на C в Rust. В качестве субъекта тестирования был выбран исходный код CVS — давно устаревшей, но ещё используемой, системы контроля версий. Разработка и поддержка CVS была остановлена в 2008 году, а первая до сих пор не закрытая remote-уязвимость была обнаружена в 2012 году.

Джеймс рад сообщить, что он получил финансовый патронаж Mozilla, и как минимум на ближайшие несколько месяцев он может сконцентрироваться на своём свободном проекте. Mozilla рассматривает Corrode не только в качестве полуавтоматического транслятора для устаревшего кода, но и как статический анализатор нового поколения для кода на C.

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

★★★★★

Проверено: Shaman007 ()
Последнее исправление: Shaman007 (всего исправлений: 6)
Ответ на: комментарий от RazrFalcon

Ну тащемта, он прав насчет выразительности (сам того не зная, ЛОЛ).

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

Вот смотри, списки: Вставка в зад, Rust:

    /// Adds the given node to the back of the list.
    fn push_back_node(&mut self, mut node: Box<Node<T>>) {
        unsafe {
            node.next = None;
            node.prev = self.tail;
            let node = Some(Shared::new(Box::into_raw(node)));

            match self.tail {
                None => self.head = node,
                Some(tail) => (**tail).next = node,
            }

            self.tail = node;
            self.len += 1;
        }
    }

То же на Си:

// Insert an item to a list
void bgrt_item_insert(bgrt_item_t *item, bgrt_item_t *head)
{
    // A tail of a list
    bgrt_item_t * tail;
    tail = head->prev;
    // Insert an item between a head and a tail
    item->prev = tail;
    item->next = head;

    head->prev = item;
    tail->next = item;
}

Вырезать из списка на Rust:

    fn pop_front_node(&mut self) -> Option<Box<Node<T>>> {
        self.head.map(|node| unsafe {
            let node = Box::from_raw(*node);
            self.head = node.next;

            match self.head {
                None => self.tail = None,
                Some(head) => (**head).prev = None,
            }

            self.len -= 1;
            node
        })
    }
То же на Си:
void bgrt_item_cut(bgrt_item_t *item)
{
    bgrt_item_t * prev;
    bgrt_item_t * next;
    prev = item->prev; //Previous item
    next = item->next; //Next item

    next->prev = prev;
    prev->next = next;

    item->prev = item;
    item->next = item;
}

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

Интересно, а почему так:

void bgrt_item_cut(bgrt_item_t *item)
{
    bgrt_item_t * prev;
    bgrt_item_t * next;
    prev = item->prev; //Previous item
    next = item->next; //Next item
а не вот так:
void bgrt_item_cut(bgrt_item_t *item)
{
    bgrt_item_t * prev = item->prev; //Previous item
    bgrt_item_t * next = item->next; //Next item
?

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

Интересно, а почему так:

Потому-что как у K&R, добавляет илитарности.

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

Не все компиляторы понимают современные диалекты Си.

Т.е. C89, например, это современный диалект С? Збс.

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

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

Некоторые требуют инициализацию константой.

Всегда ваш, К.О.

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

У каждого компилятора, фактически, свой стандарт языка

Да, но в виде расширения основного, например, того же С89. И подстраивание под какие-то левые компиляторы только делает код менее переносимым.

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

В очень низкоуровневых - да. Но так как это будет спрятано в глубине либы - мне без разницы что там.

Зато на расте я могу писать

vec.iter().filter().map()
. Жду аналогичный пример на Си.

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

Шок для вас. Ибо вы сравниваете совершенно разные вещи.

Это был пример лаконичного кода. Покажите аналог этого кода на С:

let a = [1i32, 2, -5, 100, -100];
for n in a.into_iter().filter(|x| **x > 0).map(|x| x * 2) {
    print!("{} ", n);
}

// 2 4 200 

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

Цитирую:

Ну тащемта, он прав насчет выразительности (сам того не зная, ЛОЛ).
В задачах низкоуровневого системного программирования С более выразителен, чем Rust.

Corrode, проект транслятора из C в Rust, получил финансирование Mozilla (комментарий)

Как будите отнекиваться теперь?

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

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

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

В «низкоуровневом системном программировании» нет необходимости прохода по набору данных? Окей...

Как вам такой пример:

match v {
    0...999 => println!("some 1"),
    1000...1999 => println!("some 2"),
    2000...2999 => println!("some 3"),
    _ => println!("error"),
}
Как такое сделать на Си без расширений компиляторов. Или это недостаточно системно?

И это я закрывая глаза на goto clear_data;.

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

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

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

Проход по набору данных нужен в крайне редких случаях, делать из этого киллер-фичу языка как-то нездорово, ЛОЛ.

А на микроконтроллерах он нужен ровно один раз при старте программы, и там уж точно не надо делать filter и map.

В таких случаях будет просто

static const some_struct_t table[TABLE_SZ] = 
{
    //XMACRO USED HERE
};
/*...*/
    n = TABLE_SZ;
    while(n--)
    {
        do_something(table+n);
    }
Иногда бывают нужны таблицы значений, но их не фильтруют и не мапят, их генерируют.

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

Не только на микроконтроллерах.

В любых системах реального времени стараются избежать циклов где только можно.

Количество оперативной памяти тут не при чём.

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

Это довольно узкая область. И в неё Rust не метит. Его цель убить Си на x86, ARM, etc. То есть десктоп, мобилки, сервера и тд.

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

Сколько таких недоязыков уже было...

C и C++ созданы для того, чтоб писать программы, и поэтому они востребованы, мощны и вечны.

а смешные недоязычки, созданые ололошами с полыхающими пуканами чтоб «убить С/С++» появляются, газуют в лужи и исчезают.

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

В данном случае у раста много шансов. И я делаю всё, чтобы их стало больше.

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