LINUX.ORG.RU

Автор Wayland композитора Way Cooler переписывает своё детище с Rust на C

 , ,


1

8

Как-то давно смотрел список Wayland композиторов, в нём был проект Way-Cooler, примечательный тем, что декларировался как духовный наследник AwesomeWM и проект использовал Rust. Но недавно я набрёл на пост автора с грустными новостями. В новостях про Rust часто просят привести примеры ПО, разрабатываемого на этом языке, т.е. многим интересен опыт реального применения этого языка. Именно таким опытом и делится автор по ссылке выше.

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

Автор на протяжении примерно года писал биндинг к библиотеке wlroots, за это время он внёс более 1000 изменений и в итоге репозиторий wlroots-rs содержал более 11 тысяч строк Rust кода, при чём это не просто копипаста одного куска для каждой сущности библиотеки, автор написал несколько макросов, один из которых сам же назвал уродливым. Автор пишет, что все 11 тысяч строк это просто обёртки, которые занимаются управлением памяти и при этом они не покрывают и половины API wlroots. Кроме того, автор заметил, что разобраться и пользоваться плодом его трудов довольно сложно и некоторые отказываются от использования wlroots-rs в пользу wlroots.

Основными проблемами при написании обёртки для wlroots автор называет описание модели владения объектами wlroots на языке Rust. По ссылке автор показывает несколько примеров кода, которые демонстрируют проблему. Кроме того, автор не видит возможности написать на Safe Rust расширение протокола Wayland.

В итоге автор принял непростое решение переписать Way-Cooler на C. Автор упоминает некоторые другие проекты, столкнувшиеся с аналогичной проблемой написания биндингов, которые приняли противоположное решение – переписать библиотеки на Rust.

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

IMHO, основная проблема тут в том, что он пытался писать биндинг к библиотеке. Нужно было вместо этого делать на Rust реализацию с нуля. Возможно, поглядывая на реализацию в wlroots.

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

Нужно было вместо этого делать на Rust реализацию с нуля.

Но зачем?

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

Но зачем?

Вот за этим: «Основными проблемами при написании обёртки для wlroots автор называет описание модели владения объектами wlroots на языке Rust». Сова на глобус натягивается, но с вазелином и болью.

Manhunt ★★★★★ ()

ничо, скоро на метапроге будет перерисовывать

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

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

andalevor ()

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

Хитрая манипуляция, под историей где Rust не подошел писать статьи о его использовании, намекая что если не ходить по ссылкам, то там тоже уныние. Можно их просто посчитать и сделать выводы

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

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

vertexua ★★★☆☆ ()

Так што, ещё десятилетия будем сидеть на дырявой сишке с лопающимися буферами?

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

Хитрая манипуляция

Вы мне льстите. На самом деле я надеялся на обратное.

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

тут проблема скорее в том, что wlroots изначально проектировался под С

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

Покупаешь большую бутылку игристого вина. Торжественно именуешь её «Цельная СИшка с надёжными буфферами». Садишься на неё. Профит!!

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

Но зачем?

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

i-rinat ★★★★★ ()
Ответ на: комментарий от eternal_sorrow

А кто-то видел её проги в живой природе? Так-то на форуме звиздеть любой может XD

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

Можно на это посмотреть и иначе, на С написано так, потому что наилучшим образом описывает происходящее. Вот что пишет автор Way-Cooler:

A Wayland “output” is the resource that represents a display device. Commonly this means it handles a computer monitor. This resource could disappear at any time in the life cycle of the application. This is easy enough to imagine: all it takes is a yank of the display’s power cord and the monitor goes away. This is basically the exact opposite of the Rust memory model.

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

на С написано так, потому что наилучшим образом описывает происходящее

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

MyTrooName ★★★★★ ()

В итоге автор принял непростое решение переписать Way-Cooler на C

не Way-Cooler, а только композитор

The compositor part of Way Cooler is now written in C. The client portion (i.e. the side that implements the AwesomeWM functionality) is still written in Rust.

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

Фатальная проблема вот тут сформулирована: «Way Cooler will have to talk to C libraries any ways (the rest of the Wayland ecosystem is all C, including libinput, DRM, and OpenGL), so either more bindings will need to be written (again distracting from the main problem of making a working compositor) or they will need to be RiiR.» У него там в любом случае будут мегатонны usafe кода, так что реализация оставшихся частей на сишке драмы уже не сделает.

Manhunt ★★★★★ ()

Начал натягивать сову на глобус и понял что это ппц. У биндингов к gtk та же проблема, ибо приходится повторять костыли сишки в Rust, тем самым превращая его в ту же убогую сишку.

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

не Way-Cooler, а только композитор

Так Way-Cooler это и есть Wayland compositor. С этих слов даже пост начинается и в оригинале автор написал.

The client portion (i.e. the side that implements the AwesomeWM functionality) is still written in Rust.

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

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

Что за бред. Обьект не должен умирать, просто может сыпать ошибками из методов

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

The compositor part of Way Cooler is now written in C

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

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

я боюсь представить, даже как это на С выглядит.

it can only be dropped between event callbacks, wlroots/Wayland is callback based

то ли исходный интерфейс на С, мягко говоря, странен, то ли автор попытался callback-based интерфейс обернуть в нормальный процедурный, что приниципиально проблематично, вне зависимости от языков

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

Не знаю, автор пишет:

Each call to wlroots will require a check to see if the handle has been dropped, even though it almost certainly has not been dropped (it can only be dropped between event callbacks, wlroots/Wayland is callback based).

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

Еще лучше, пускай держит свои Weak pointers between callbacks и голый обьект в другое время. Rust как раз это ему и подсказыват сделать, так более корректно.

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

vertexua ★★★☆☆ ()
Последнее исправление: vertexua (всего исправлений: 3)
Ответ на: комментарий от andalevor

Это можно обойти двумя типами - RawHandle и SafeHandle. SafeHandle конструируется из RawHandle перед передачей в Rust callback (здесь проверяем хэндл) и не проверяет валидность хэндла при вызовах wlroots через него. RawHandle просто хранит хэндл.

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

- Да не налазит сова на глобус! - Нет, ты смажь глобус и ещё раз попробуй!

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

А почему это вдруг callback стал чем-то ненормальным?

Совсем хипстеры поехали.

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

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

на сишке спокойно пишутся приложения с любыми буферами, хоть статическими, хоть динамическими. от микроконтроллеров до больших серверных приложений 24/7. неосиляторы идут лесом, вместе со своими ржавыми памперсами.

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

Проверять хэндл при каждом вызове - вот это натягивать сову на глобус. Тут скорее: «А воздушный шарик сдуть не пробовали?»

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

Так што, ещё десятилетия будем сидеть на дырявой сишке с лопающимися буферами?
А кто-то видел её проги в живой природе? Так-то на форуме звиздеть любой может XD

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

Владимир

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

Всем давно известно, что ты Царь. Признайся или я тебя на ноль помножу.

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

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

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

Наверное, 99% хейтеров С — тупо новички, которым хочется с места в карьер. Чтобы ничего не изучать, а тупо «сесть и игры писать». А задела нет, поэтому такое говно и получается.

Это чем-то напоминает мне абдуринщиков: там вообще 100% — неосиляторы, которым не хочется читать Титце и Шенка, Хоровица и Хилла и другую литературу, изучать С, изучать архитектуру микроконтроллеров... Им хочется сесть, и «сделать крутую железяку». Ну и хрен с ними, лишь бы они это «в продакшн» не тащили! А то я все тот грузовой лифт на абдурине вспоминаю. И чем-то он мне эти потуги переписать все на [censored]rust'е напоминает!

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от alexferman

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

Владимир

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

тупо «сесть и игры писать»

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

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

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

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

если язык используется начиная с 70-х годов прошлого века, не утратив актуальности и поныне, то этот язык очень даже неплох

С каких там годов Пугачёва поёт?)

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

А то я все тот грузовой лифт на абдурине вспоминаю.

Ты про эту статью на хабре?

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

Угу. Помнится, на «казусе» и изыэлектрониксе товарища таким количеством говна облили... Чуть меньше говна получил разве автор «конструктора-ЭКГ», у которого подключаемая к человеку система была запитана от обычного китайского блока питания...

Eddy_Em ☆☆☆☆☆ ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)