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)
Ответ на: комментарий от DarkEld3r

окей, давайте отмотаем стэк.

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

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

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

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

Я тоже, но это, судя по всему, так специально задумано. И что характерно (или удивительно) многим нравится.

Так что ниши для хорошего нативного языка с GC, имхо, есть.

Может и так.

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

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

Дык, на это был ответ:

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

Хотя я данную штуку тоже считаю весьма сомнительной.

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

Сейчас ты в фанатика превращаешься. Потому что если говорить объективно, то не всем нужны эти «критически важные библиотеки», а некоторые готовы сами их писать. Или скажешь, что все, кто перечислен вот тут, фанатики?

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

О каком менеджере вообще идёт речь? Если не считать libc, то у автора полный доступ к памяти, без каких либо менеджеров.

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

Ну и минутка статистики: в паскалевских прогах меньше ошибок потому, что количество паскалевских прог стремится к нулю.

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

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

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

Упоминать надёжность плюсов и KDE - это вообще анекдот.

Упоминать надежность плюсов — это, действительно, анекдот. Ибо язык специально создавался таким, чтобы дать разработчику возможность делать то, что он (т.е. разработчик) хочет. Хочет верить в то, что malloc никогда не возвращает NULL — пожалуйста. Хочет кастовать char* к int* — нет проблем.

Так что надежность программ на C++ определяется программистом, а не языком. Считает программист, что исключения зло, шаблоны слишком сложны и не должны использоваться в «промышленном» коде, а STL — это вообще говно, ну так и качество программы будет соответствующим. Только виноват, почему-то, будет инструмент.

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

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

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

Спасибо. Я в курсе. Это был ответ на унылый вброс. Не стоило воспринимать его серьёзно.

С другой стороны GNOME начинают переписывать на Rust. Посмотрим, что получится.

Проблема С++ не в том, что он кривой, а в том, что людей умеющих на нём писать - единицы. Rust решает эту проблему с минимум затрат. Как со стороны разработчика, так и со стороны CPU.

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

Rust решает эту проблему с минимум затрат. Как со стороны разработчика, так и со стороны CPU.

Это еще должно пройти проверку временем. Ибо Rust-у еще всего ничего, на нем даже каких-то примечательных вещей никто не сделал, а критика уже есть.

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

Да ладно. Фанаты Rust-а дружно сказали чуваку: ты мудакламер и так делать нельзя. Только самого главного не поняли: он хотел сделать так, как ему проще и удобнее. Раз на Rust-е это не получается, то ну этот Rust в /dev/null. И таких чуваков, которые будут смотреть на проблему со своей колокольни, а не с позиций настоящих растоманов, будет еще немало.

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

Это верно только про реддит. На HN не одни растоманы.

Ну и ваш тезис не верен. Человек с тем же успехом мог наехать на C++, ибо в нём нет привычного ему GC. Значит и он в /dev/null.

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

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

Значит и он в /dev/null.

Так и есть. Там, где нужен GC, С++ в /dev/null.

У Rust-а, как здесь, на LOR-е неоднократно говорили, своеобразный взгляд на ООП. Поэтому Rust идет в /dev/null для всех, кому такой взгляд не нравится.

А так же для тех, кому кажется диким использовать unsafe для реализации двухсвязного списка.

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

И т.д. и т.п. Так что нужно еще посмотреть на то, как оно на самом-то деле пойдет. Пока что-то даже сама Mozilla не может взять и Servo в продакшен выкатить. Это успех, однозначно.

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

Опять таки, языков не похожих на C++ полно, но это не мешает им жить. То, что раст не похож на C++ не делает его плохим.

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

Ну вот OCaml, например, живет, да. Только что-то не видно на нем ни браузеров популярных, ни СУБД, ни того же KDE.

А если сравнивать востребованность OCaml-а и, например, востребованность Java или JavaScript, то и жизнью это назвать сложно.

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

Пока что-то даже сама Mozilla не может взять и Servo в продакшен выкатить

Вы знаете сколько людей работает над Servo и сколько над Firefox? Какой у них бюджет? Какие у них планы? Нет? Тогда ваши тезисы об «успехе» беспочвенны.

Если верить репе на гитхабе, то Servo пишет человек 10. Сам проект создали 4-е года назад, а активно пишут последние 2. Пока всё идёт своим чередом.

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

Ну если Servo еще не в продакшене, то ethereum вполне себе и сейчас самой стабильной его реализацией признана реализация на расте.

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

Но Java(Script) тоже не похожи на С++ от слова совсем. Но они намного популярнее. Для большинства JS разрабов C++ - страшный сон. Значит его нужно в /dev/null.

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

Планы Mozilla сейчас сосредоточены вокруг Quantum: http://www.opennet.ru/opennews/art.shtml?num=45385 Что наводит на мысль о том, что сам Servo оказался тупиковым экспериментом и Mozilla будет внедрять код на Rust-е в свой браузер очень осторожно и по чайной ложке. При том, что Mozilla-овцы постарались обкарнать C++ по самое нехочу:

Mozilla code only uses a subset of C++. Runtime type information (RTTI) is disabled, as it tends to cause a very large increase in codesize. This means that dynamic_cast, typeid() and <typeinfo> cannot be used in Mozilla code. Also disabled are exceptions; do not use try/catch or throw any exceptions. Libraries that throw exceptions may be used if you are willing to have the throw instead be treated as an abort.

Т.е. в Mozilla старательно наживали себе геморрой, потом решили, что жить с этим уже нельзя, поэтому запилили Rust. Но и с этим все на так просто. Не получилось, видимо, из Rust-а серебрянной пули.

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

Для большинства JS разрабов C++ - страшный сон. Значит его нужно в /dev/null.

На данный момент так оно и есть.

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

Выводы у вас есть, а вот их правильность под сомнением. Слишком много имхо.

Что наводит на мысль о том, что сам Servo оказался тупиковым экспериментом

Всё правильно сделали. Лучше плавно переписывать, чем писать с нуля.

Mozilla старательно наживали себе геморрой

Вырубили всё говно C++ и правильно сделали.

Не получилось, видимо, из Rust-а серебрянной пули.

Еще использовать не начали, а уже не получилось. Ну вы ванга.

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

Лучше плавно переписывать, чем писать с нуля.

Ну т.е. написать что-то большое с нуля не получилось даже у Mozilla.

Вырубили всё говно C++ и правильно сделали.

Да я знаю уже почему вам в C++ некомфортно, а в Rust-е норм: исключения говно, STL говно и т.д.

Еще использовать не начали

Кто ж виноват, что сама Mozilla за все годы, вложенные в Rust, ничего на нем не сделала?

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

наводит на мысль о том, что сам Servo оказался тупиковым экспериментом

Я не знаю цели Servo, но прямо указывалось, что прямое замещение Firefox такой целью не является. А в остальном - эксперимент продолжается, над Servo работает всё больше людей.

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

Ну т.е. написать что-то большое с нуля не получилось даже у Mozilla.

Ваши интерпретации в свою пользу не перестают удивлять.

исключения говно, STL говно и т.д.

Это факт.

Кто ж виноват, что сама Mozilla за все годы, вложенные в Rust, ничего на нем не сделала?

Какие годы? Повторяю: «проект пишут 2-а года».

не получилось даже у Mozilla.

Еще раз: «servo пишет человек десять». Это явно не «вся Mozilla».

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

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

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

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

Они их запретили по всем известным причинам: тормоза (на x86_64 полегче, но всё равно), раздувание бинаря, неочевидность, поддержка до недавних пор была отвратная.

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

Ваши интерпретации в свою пользу не перестают удивлять.

Ну вам же никто не запрещаеть думать и говорить, что исключения говно и STL говно.

Еще раз: «servo пишет человек десять». Это явно не «вся Mozilla».

10 человек, минимум, 2 года. На супер-пупер языке. Ну говорю же, успех, очевидный.

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

как я понимаю, эксепшены они запретили не от хорошей жизни

Запретили из-за того, что корни их разработок идут еще из древнего Netscape-шного кода, который писали хрен знает когда и когда поддержка C++ных исключений была еще не во всех компиляторах.

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

Static linking... не - не слышал!

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

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

Ты серьёзно думаешь, что желающих и умеющих ковыряться в паскале больше чем в С и С++?

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

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

Так что надежность программ на C++ определяется программистом, а не языком.

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

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

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

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

исключения говно

Скорее вкусовщина.

STL говно

Факт. Оглянитесь вокруг. У остальных популярных языков (окромя недоязыков типа JS) std просто конфетка. В то время как у C++ страх и ненависть. А у Rust вообще даблкилл, ибо у него прекрасная std + cargo.

На супер-пупер языке.

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

2 года.

Расскажите свою историю успеха о написание такого титанического проекта, как браузер, за 2-а года.

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

Только самого главного не поняли: он хотел сделать так, как ему проще и удобнее.

Дык, кому-то «проще у удобнее» смартпоинтерами в плюсах не пользоваться. Или шаблонами или ещё чем-то. Но ведь ты тоже возмутишься, если вместо шаблонной функции кто-то руками идентичные варианты писать будет.

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

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

Честно говоря, не понял. С++ ведь тоже не выставляет наружу «нестабильные функции из ядра» - это всё детали реализации стандартной библиотеки. И чем тогда это отличается от «прослоек»?

А много в той стандартной библиотеке есть, если на каждый чих надо подключать зависимости? Фактически, стандартная библиотека, это почти аналог модуля system, только типов данных там поменьше, что побуждает либописателей использовать переменные нестабильной длины. А самые нужные системнозависимые фичи у FPC сконцентрированы в модулях unix, linux, windows, dos. В первых двух не много чего и есть, но вроде как хватает, а последний такой няшка, что на нём можно писать и в линуксе. Весь линукс сжался до двух модулей, а виндовс до одного:) Есть ещё особенности - модули-прослойки компиляются тем же компилятором, что и весь остальной код, а стандартная библиотека, она внешняя, из допустимого диапазона версий.

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

Там, где нужен GC, С++ в /dev/null.
А так же для тех, кому не нравится взгляд Rust-а на многопоточность.

И вот тут ты подменяешь понятия. Одно дело «нужно», другое - «не нравится». Второе вполне может быть причиной выбора, но объективным оно не станет. И на джаве можно не пользоваться GC,а выделить память один раз и потом вручную в ней копаться. И такое решение может быть оправданным, если, конечно, не делается просто чтобы не писать на «ужасном С++».

Пока что-то даже сама Mozilla не может взять и Servo в продакшен выкатить. Это успех, однозначно.

Дык, растовый код уже в фаерфоксе имеется. А Servo - это ведь не тупо «переписать на расте», а ещё и про распараллеливание всего чего можно. Мне что-то подсказывает, что на любом другом языке оно тоже быстро не взлетело бы.

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

Скорее вкусовщина.

Ну окай. Хотя симптоматика характерная.

В то время как у C++ страх и ненависть.

Походу, у вас «говно» == «малый размер».

cargo.

Ну вот cargo у Rust-а — это действительно киллер-фича по сравнению с C++.

Но уже сейчас для многих задач он в разы лучше С++.

Если из C++ выбросить все хорошее, что в нем есть, а потом еще и добавить C++хейтерства, то да, на Rust-е для C++неосиляторов будет в разы лучше и проще. Это уже многократно доказывалось, хоть с ObjectPascal, хоть с Java, хоть с C#.

Расскажите свою историю успеха о написание такого титанического проекта, как браузер, за 2-а года.

Servo уже стал браузером? Как интересно. Или у тех, кто не осиливает исключения, нет разницы между движком и самим браузером?

А вообще, если я правильно помню, движки для Netscape, Opera и KHTML появлялись как раз за 1.5-2 года разработки.

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

Что наводит на мысль о том, что сам Servo оказался тупиковым экспериментом и Mozilla будет внедрять код на Rust-е в свой браузер очень осторожно и по чайной ложке.

Меня оно наводит на совсем другие мысли.

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

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

У меня противоположное мнение. Можно, конечно, поискать какую-нибудь статистику, но мне лень, так что сошлюсь просто на гитхаб: С++ активности там больше.

Всё-таки паскаль развивается во многом из любви к искусству, без серьёзного финансирования корпорациями

Delphi - не паскаль?

Другое дело, если автор программы накрутил в ней тонны фич ООП и новшеств компилятора просто ради крутизны и ЧСВ, то такой код тоже сложен.

Дык, новшества должны давать удобства или новые возможности. Иначе нафиг такие новшества?

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

В то время как у C++ страх и ненависть.

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

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

Речь шла о том, что в KDE можно камнями кидаться, потому что KDE (да и вообще проекты масштаба KDE и больше) на C++ есть. И как себя ведет в проектах большого масштаба и сложности, уже известно.

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

Так что Rust-оманам либо следовало бы перестать бросаться камнями в большие C++ные проекты, либо показать, что Rust позволяет делать что-то подобное.

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

А много в той стандартной библиотеке есть, если на каждый чих надо подключать зависимости?

Тогда это проблема зависимостей, разве нет? В любом случае, есть отлично дополняющий стандартную библиотеку boost, есть Qt и прочие. Насколько мне известно, они тоже ничего наружу не выставляют.

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

Мало типов «стабильной длины», серьёзно?

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

Есть всякие там STLport.

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

Походу, у вас «говно» == «малый размер».

Мне кажется, что у раста стандартная библиотека меньше плюсовой. Хотя, как по мне, это скорее минус: базовые штуки должны быть стандартными иначе сторонним библиотекам сложнее «договориться» и использовать одинаковые зависимости.

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

либо показать, что Rust позволяет делать что-то подобное.

Время покажет.

Хотя любой результат никак не помешает кидаться какашками, причём обеим сторонам. (:

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

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

Все так, но поинт был в другом: язык C++ специально был сделан таким, что у пользователя есть широкое поле для свободы. Откуда и получаются вещи вроде:

const std::string & make_name() {
  std::string name;
  name = ...;
  return name;
}
Которые могут иметь более сложные формы, вроде:
struct valid_name {
  const std::string & name_;
  valid_name(const std::string & name) : name_(name) {
    ensure_name_validity(name_);
  }
};
valid_name make_name() {
  std::string name;
  name = ...;
  return valid_name(name);
}
Только вот есть вводить драконовские правила контроля, то тогда придется трахаться в других местах, которые вполне себе валидны.
// Определяется и реализуется в другой единице трансляции.
// Возможно, в другой so/dll-ке.
struct valid_name_holder {
  std::string name_;
  valid_name_holder(const std::string & name);
};
// А в совсем другом месте...
valid_name_holder make_name() {
  std::string name;
  name = ...;
  return valid_name_holder(name);
}

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

Относительно «драконовских правил» - да, есть такое. Хотя растовые ограничения мне кажутся приемлемыми.

Пример должен иллюстрировать «сложное» время жизни? Тогда он мне как раз кажется удачным для раста.

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

Пример должен иллюстрировать «сложное» время жизни?

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

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

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

Дык, valid_name_holder и valid_name_holder make_name() на расте точно так же тривиально будут выглядеть:

struct ValidNameHolder {
    name: String,
}

fn make_name() -> ValidNameHolder {
    let mut name;
    name = ...;
    ValidNameHolder { name: name }
}
Заморачиваться приходится ровно в тех же местах, где в С++ ты говоришь «я знаю, что делаю». Разница, в том, что в плюсах ограничения надо держать в уме, а в расте - в коде.

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

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