LINUX.ORG.RU

D, Go и Rust, взлетит ли что-нибудь?

 , , , ,


4

8

Привет, LOR. На данный момент в окружающее пространство уже некоторое время накатывает следующая мысль: «Разработчикам прикладного ПО, использующим в своей практике Си и C++, крайне необходимо облегчить жизнь, избавив от ошибок с памятью и предоставив удобные механизмы для параллельного программирования». Одни адепты, этакие Базаровы от программирования, предлагают воплощать задумку с помощью новых языков: D, Go и Rust. Другие же, коих пока явно больше, всячески не желают выходить из своей зоны комфорта, предлагая включать необходимое в новые стандарты уже используемых инструментов.

Как думаешь, садиться ли уже сейчас за изучение одного из убийц Си/C++, чтобы через 5 лет не оказаться на обочине индустрии, или же все продолжит идти в старом русле с незначительными вливаниями новшеств?

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

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

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

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

из любой строчки может вылететь паника

После этой фразы стало немного не по себе.

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

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

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

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

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

В rust весь safe код подчиняется RAII (за исключением плохо написанных биндингов), но есть ньюанс:

use std::ops::Drop;
use std::thread;

pub struct S {
    i:i32
}

impl Drop for S {
    fn drop(&mut self) {
        panic!("Don't try it at home!");
    }
}

fn main() {
    for _ in 0..10 {
        thread::spawn(move || {
            let mut b = Vec::new();
            b.push(S { i: 1 });
            b.push(S { i: 2 });
        });
    }

    thread::park_timeout(std::time::duration::Duration::seconds(30));
}
O02eg ★★★★★
()
Ответ на: комментарий от O02eg

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

В rust весь safe код подчиняется RAII (за исключением плохо написанных биндингов), но есть ньюанс:

fn drop(&mut self) {
panic!(«Don't try it at home!»);

Нюанс (в этом слове нет «ь») - вызов panic! в drop? Да, в этом случае будет плохо. Но, по идее, паника свидетельствует об ошибке в программе, так что нужно валить программу. Альтернативно, можно продолжить выполнение с утечкой.

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

А можно более развернуто?

О том, что в бложике? Нет, там слишком много букв, которые написали чуваки, занимающиеся какими-то специфическими задачами и на 100500% уверенные в собственной правоте.

Если о том, что вы написали, то вот хотя бы на этом разговор можно заканчивать:

надо учитывать, что из любой строчки может вылететь исключение, а это чертовски сложное дело.

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

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

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

panic! валит только текущий поток. Автор racer пользовался этим, потому что разборщик синтаксиса выдавал именно панику на невалидный код. Вот так пишешь код, а IDE память отжирает и отжирает. Предлагалось, кстати, сделать panic! unsafe.

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

panic! валит только текущий поток

Я об этом и сказал.

Автор racer пользовался этим, потому что разборщик синтаксиса выдавал именно панику на невалидный код. Вот так пишешь код, а IDE память отжирает и отжирает.

И он выдает панику именно в drop, или что?

Предлагалось, кстати, сделать panic! unsafe.

В этом нет смысла.

tailgunner ★★★★★
()

Присоединюсь к обсуждению эпичной темы. Я не очень понимаю, что это за языки и действительно ли эти «убийцы C++» могут таковыми называться, поэтому просто напишу что-нибудь на корейском языке:
Nal ddara haebwayo Nal ddara haebwayo Nal ddara haebwayo Ireoke

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

Производительность выше, чем у си никому не нужна, да и врядли возможна.

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

arcanis ★★★★
()

Вопросик про Rust, но не по теме

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

 -C prefer-dynamic
но ето не то.

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

Говорят, что кур доЯт. Столетиями спрессованное до состояние окаменелости говно очень плохо пригодно для числоблудия и непригодно совсем для решения каких-либо других задач. И да, на перемножениях матриц, например, влоб написаный код из BLASA, сливает на десятичный порядок по производительности написанному более изощрённо коду на Цхх (см. напр., библиотеку Eigen). Так что апологеты некромантии делают вывод об охренительной пригодности этого ископаемого дерьмеца по соотношению (пригодность к числоблудию (очень маленькая величина)) / (пригодность,напр. к парсингу текста (ровно 0)). Получается конечная величина, делённая на ноль, откуда и все выводы про отполированность.

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

бенчмарки не делал, ниче не знаю. Вообще, еще говорят о том, что аналогов фортрановых либ на сях нету, но я им не особо верю :/

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

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

Я зато делал, и к сожалению, продолжаю время от времени марать руки об эти поделия. Просто какому-нибудь профессору Дебилдауну из Массачузетского Мухобойного колледжа уже никогда в жизни чего-то другого не осилить. А переписывать его гениальные нетленки, состоящие из лапши goto, никто никогда не будет, потому что гораздо дешевле с нуля написать, чем разбирать то, что даже сам автор не в состоянии понять. Ну и, фортран - это самое убогое подмножество средств, предоставляемых программисту языком. Поэтому, если написать с нуля тоже самое на любом современном ЯП, то получится лучше (быстрее, компактней, надёжней, и др.) абсолютно по всем показателям.

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

Поэтому, если написать с нуля тоже самое на любом современном ЯП, то получится лучше (быстрее, компактней, надёжней, и др.) абсолютно по всем показателям.

Ты сначала найди, кто тебе за это заплатит...

Хотя, конечно, можешь продолжать переписывать всё и вся, так сказать, for fun :)

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

массово переписывать код ни кто не будет: тех, у кого он уже работает, устраивают затраты на его поддержание, но не устраивают затраты на его переписывание. А for fun переписывается только всякая мелочь, которой интересно заниматься... Так что плохого в переписывании ничего нет, просто самого переписывания нет и не предвидится...

yyk ★★★★★
()

всячески не желают выходить из своей зоны дискомфорта

fixed.

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

Это именно то, что находит гугл.

Черт, я подумал что H1Z1 написали на расте. ;)

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

до тех пор пока новые языки не будет полностью обратно совместимы со старыми

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

Новые языки всё-таки могут взлететь. Совместимость нужна, но должна ставиться во главу угла.

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

А как же машина Даффа?

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

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

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

С исключениями ты тоже не можешь гарантировать, что вызывающий не обернёт твою функцию в tray с пустым catch блоком.

Хотя мне тоже жаль, что в расте нет исключений.

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

Отсюда популярность С++ растёт, из-за старпёров

Как-то слабо она растёт.

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

Возврат кода вместе с результатом в принципе тоже имеет стоимость, но с практической точки зрения она около нуля.

Тем не менее, стоимость есть. Причём она платится даже если ошибки не произошло. А исключения тем и хороши, что за них платишь только если «что-то пошло не так».

Собственно в функциональных языках (например Haskell) нет исключений

А что такое, по твоему, error?

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

Тем не менее, стоимость есть. Причём она платится даже если ошибки не произошло.

Хм. Как так? Какая стоимость платится, если ошибки нет?

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

Тем не менее, стоимость есть. Причём она платится даже если ошибки не произошло. А исключения тем и хороши, что за них платишь только если «что-то пошло не так».

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

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

Хм. Как так? Какая стоимость платится, если ошибки нет?

auto res = f1(...);
if (res == ERROR) {
    return ERROR;
}

res = f2(...);
if (res == ERROR) {
    return ERROR;
}

Стоимость этих ифов. У нормальных исключений, в таком случае, оверхеда нет.

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

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

А зачем мне питон смотреть, если я могу посмотреть С++?

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

Стоимость if? Думаю, она стремиться к нулю

А ты возьми да проверь. И хватит уже придумывать за оппонентов утверждения, а потом спорить с ними. Ещё раз для тебя: во первых, не утверждал, что эта стоимость велика, тем не менее она есть всегда. А у исключений только если они реально бросаются. В итоге исключения могут быть быстрее.

по крайней мере, Си программы не тормозят по сравнению с Си++.

Стал адептом царя? Божественная сишка не тормозит просто потому что это сишка?

Хватит уже упарываться. Тормозит прежде всего код, а не языки. С рядом оговорок, конечно, но это не тот случай. Что с чем сравниваешь?

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

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

Тогда специально для тебя:

«In order for exception handling to work, you need to register the frame information at runtime. This is accomplished in the same way that constructors and destructors are registered.»

try-блок не бесплатен.

В итоге исключения могут быть быстрее.

С этим никто и не спорил.

Хватит уже упарываться.

На себя посмотри.

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

Вот по-этому их в Rust и нет )))

Виртуальных вызовов? Да ну? По твоему, когда ты передаёшь в библиотечную функцию, которая ожидает трейт, свой обьект который его реализует обходится без «виртуального вызова»?

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

Бывает, если это работает только в компайл-тайме.

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

В Rust «zero cost abstraction» - это другой принцип, и он реально означает zero cost без всякого маркетинг-стайл мухлежа, типа мелким шрифтом *если вы это не используете.

Ну-ну. Вообще-то С++ тут «честнее» (и естественно, небезопаснее). Скажем, обращаясь по индексу в контейнере ты сам обязан гарантировать, что он валидный. Если хочешь проверок - вызываешь специальный метод. В расте же проверки, при обращении по индексу, будут всегда - вот тебе и «zero cost abstraction».

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

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

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

Это у Вас на диване так?

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

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

В Gо можно перехватывать «исключения». И передавать через них информацию тоже. Другое дело, что это не поощряется.

С перегрузкой операторов история похожая

Разве этого нет в расте? Через трейты.

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

каком диване? например ты хорошо знаешь spring и java, ты получишь уже потолок того, что бы ты там не изучал еще.

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

try-блок не бесплатен.

Ты бы поподробнее почитал. Ну и конструкторам/деструкторам как раз статически регистрироваться никто не мешает. Ну и обьясни почему в ллвм дварф исключения описываются как «zero-cost»? Ну и есть ещё SEH-исключения.

На себя посмотри.

Ну ок, я был несколько «поспешен и груб». Вот только я не додумываю за собеседника и не выдираю из контекста. Ну или ткни носом, где я так делаю.

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

каком диване?

На котором ты сейчас лежишь и размышляешь о жизни

ты получишь уже потолок того

Потолок чего?

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

но есть ньюанс:

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

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

Потолок чего?

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

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

«эксперт» спринг

Ты упускаешь один момент: если «эксперт» спринг и еще 5 других языков/фреймворков." то у него уже другая роль. Если конечно он не работает на it-конвеере.

Debasher ★★★★★
()
Последнее исправление: Debasher (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.