Как стать автором
Обновить

Страуструп призвал комитет WG21 заняться актуальностью C++ из-за продвижения языков для безопасной работы с памятью

Время на прочтение5 мин
Количество просмотров9.3K
Всего голосов 12: ↑12 и ↓0+15
Комментарии55

Комментарии 55

Семантика языка C++ перешла под управление чиновников Белого дома :) Ну-ну.

Нет, но на чём писать софт на деньги налогоплатильщиков они решить могут.

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

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

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

В прошлый раз таким способом получился язык Ада.

Чиновники не знают.

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

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

Страуструп — в первую очередь учитель, поэтому задачи и проблемы, которые он видит — это чтобы «ученикам» можно было легко и просто показывать примеры простого, безбажного кода (и поэтому его характерная реакция сводится к «правильно показывайте пишите, неправильно не показывайте пишите»). Добавили там какой-нибудь std::span — всё, его проблема решена, потому что в учебных примерах можно им пользоваться (а плохим не пользоваться). То, что в продакшен-коде есть легаси, которое этим не пользуется, есть люди с разным бекграундом, с разным состоянием выспанности, в конце концов — это всё неважно. Страуструп смотрит на наличие способов не выстрелить себе в ногу, а не на отсутствие способов выстрелить.

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

поэтому важно улучшать инструменты и процессы разработки

Самый лучший вариант в моём опыте — улучшить инструмент разработки через смену ЯП.

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

П.С. Это просто пример вероятности, да минимальной, но вероятности.
Чиновник не способен мыслить априори.

А точно страус того? Вроде как страустрап. Ну или straustrup.

Кого Страус, того и Труп.

Он вообще Stroustrup, а ещё он датчанин, так что читается его имя как Бьярне Стровструп.

идею перехода на языки, безопасного работающие с памятью

Статейку бы подредактировать

Да неужто наконец проснулись?))

Неужто начнут удобства в язык завозить каждый год?

Неужто будут оглядываться на успехи конкурентов?

Я конечно верю в сказки, но не до такой степени)

ну судя по набору: java, python, rust - то один новомодный и не особо лучше, так как все равно а) есть unsafe в языке (но зачем, если все можно сделать хорошо - видимо нельзя) а оставшиеся 2 прекрасно из байткода парсятся обратно в код, а вроде как с плюсами это сильно дороже делать

Ну судя по набору мерседес, бнв, ауди, жигули-то не сильно хуже. Те же 4 колеса, да и руль на месте)

С каждым подобным комментом все лучше понимаю, почему комитет так противится, - там мышление примерно такое же. Я вот давече организовал форматирование с плейсхолдерами в стиле php или шарпа (это шире, чем fmt и std format), всрав на это кучу времени и не получив нормальной проверки на этапе компиляции. Будь я чутка помоложе, я бы прям радовался, какой я молодец. Но теперь меня это бесит. Я потратил кучу времени из-за снобизма комитета, который 10-20 лет просто не может завезти простую фичу.

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

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

А язык-то понятнее не становится. Если раньше человеку, не работавшему с С++, но знающему другие языки, можно было глянуть какой-то код и более-менее разобраться, то теперь без помощи друга/LLM не поймёшь. И это не только С++ касается, а всех языков, которые активно "допиливают" годами. А захочет ли молодое поколение лезть в эту "стариковскую" писанину? Может, поэтому и появляются новые языки типа Rust, написанные с нуля.

А в код rust вы пробовали смотреть?

я на rust год уже пишу, очень двоякое впечатление. С одной стороны это лучший язык (pattern matching, borrowing, stdlib, enum'ы, макросы, generics и т.п.), с другой один из худших (инопланетный синтаксис, 50 unsafe в каждом файле в любой серьезной либе/framework'е, сложные примитивы для работы с памятью, время компиляции) в одно и тоже время.

Было бы круто увидеть новый язык похожий на rust, с упрощенным синтаксисом, но с той же основной идеей и крутой std либой. (типа rust2, который никто не собирается писать в ближайшие 20 лет)

Было бы круто увидеть какую-то рабочую группу из выходцев c++, которые сделают новый язык для конкуренции с rust, но без уже хорошо известных граблей rust'а.

Zig. Правда он еще не production-ready, нет готовой многопоточности, инфраструктура меньше чем у rust.

А pattern matching, алгебраические типы данных(ака енумы в rust), дженерики, option и result, функции высшего порядка, все это было и до rust в f#, ocaml и других языках. Кроме borrow checker ничего нового в нем нет. Это и плюс, и минус. Плюс потому что предотвращает класс ошибок. Минус потому что это влияет сильно на время сборки.

И инфраструктура не такая стабильная и богатая, как например на .net или java.

я думаю, основная проблема связанная со временем сборки, это не borrow checker. А минимальная единица кода, которая в rust является crate'ом.

В go например минимальная единица кода это package, в котором обычно пара файликов. А в rust в crate пихают от увесистой либы (~100 файлов) до целого приложения.

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

lifetime — запрещены ссылки на освобождённые или неиспользуемые области памяти, разыменование указателей, явный вызов new/delete.

Интересует как это по факту будет работать, ведь в языке нет информации о времени жизни. Будут вычислять по косвенным данным?

Интересует как это по факту будет работать, ведь в языке нет информации о времени жизни. Будут вычислять по косвенным данным?

У компилятор есть информация о времени жизни переменных https://en.cppreference.com/w/c/language/lifetime

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

Но даже с более простыми случаями могут возникнуть проблемы. Код ниже конечно странно написан, но, например, в любом lock-free алгоритме примерно весь код такой (ради быстродействия):

bool f(int* a, bool b) {
bool b = ...; // что-то делаем с a
if (b) free(a);
}


int* a = malloc(sizeof(int))
bool b = f(a);
if (!b) {
...
free(a);
}

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

Так потому что у вас код примера на С, а речь идет о С++ с классами - обертками вокруг голых указателей https://en.cppreference.com/w/cpp/language/raii, а для профилей используются атрибуты.

Вы скинули ссылку на времена жизни в С, по-этому я ответил про С.

Ну хорошо, перепишите мой пример на new/delete и ничего не поменяется. Как кстати и вопрос про замыкания: это невозможно на текущем этапе развития компиляторов.

а для профилей используются атрибуты.

Означает ли это, что время жизни будет задаваться явно через атрибут?

Там вся статья состоит из примеров как близко к ноге может пролететь пуля.

Как я и говорил, у компилятора не достаточно данных для оценки времени жизни, ваша ссылка это только подтверждает) Прочитайте например раздел Access outside of lifetime.

Вообще весь документ описывает как нельзя делать и в каких случаях будет UB. Что прозрачно намекает что компилятор не может оценить времена жизни (за исключением когда явно срабатывает RAII), и перекладывает на программиста ответственность за времена жизни.

Теперь вопрос что же придумал Страуструп? Правильно ли я понимаю, что он предлагает явно определять времена жизни через атрибуты?

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

Оппонент выше дал ссылку про времена жизни в С, по-этому я ему ответил про С. В С++ я разумеется не использую malloc.

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

Следующим выберут Кеннеди и начнут опять продвигать Кобол?

Когда espressof допилят rust версию esp-idf то перейду с си на раст, но боже упаси юзать плюсы, я их в прямом смысле боюсь

Можно сразу на Haskell перейти! ;)

Он мне не нравится)

Как минимум синтаксисом и наличием GC

GC сам по себе не зло, трудно даже сказать, что лучше работает - ручное или автоматическое управление памятью. Зависит от ситуации.

На микроконтроллерах gc всё же зло, примеру lvgl (gui библиотека) на МК может потреблять до 100% ресурсов процессора, тут для gc места нету

С другой стороны mjs и micro Python вполне себе работают на МК

На хаскеле можно (и очень приятно) делать DSL'и в том числе для глубокого эмбеддеда: например, ivory.

Тема интересная, я об этом не знал и вообще думал что хаскель почти мертв, но видимо не дорос я ещё до этого, мало свободного времени, и си простой как пробка а раст мне просто нравиться)

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

Кроме ivory, есть еще copilot. Первый DSL разработан для NASA, второй для DARPA. На первом сделали квадрик с автопилотом, на втором Боинг сделал беспилотный в качестве демо. Для copilot есть даж биндинги для ардуинок. Мы пишем прошивки своих девайсов на ivory.
В Касперском, например, для ядра своей ОС тоже использовали ivory, а потом перешли на свой DSL

a gcc используется в Расте не знаете? на каком этапе если используется? вопрос из разряда просто интересно, что называется безопасным возможность процессора к преобразованию или верхне уровневая семантика?, может быть так что какая-то операция в Расте использует преобразование, через llvm? которая невозможна например на gcc, есть стандарты на это?

В 2017 видел стикер-пак с мемами про переписать всё на Rust. С выглядывающим сверху 18-летним парнем и прочее. Прошло 8 лет, мем больше не мем.

В чем проблема? Надо просто выпилять из С++ весь хлам...

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

Вопрос про умные указатели. Я пытался их использовать, но наткнулся на проблему. Неужели умные указатели настолько глупы, что не подходят для multithreading приложений?

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

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

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

Пора закопать стюардессу

А причём тут c++ вообще. Эти проблемы с плейн C раст_ут, его надо править, поскольку ядро линукса быстрее на Rust перепишут, чем на C++

Главная проблема не в том, что на C++ можно или нельзя писать "безопасный код", а в том что язык стал слишком сложным и требует большей квалификации программиста. А так, я всеми руками за C++ и за ассемблер. Но крупным компаниям нужно снижать издержки и им нужны языки на которых может более или менее писать средний индус и чтобы при этом в коде был минимум уязвимостей, при этом скорость выполнения кода уже давно ушла даже не на второй план, а на третий или четвертый. Все тупо заливают железом. Вот в чем проблема. С/С++ даёт кучу возможностей, но за них нужно платить больше чем за условный Python. Тут решает рынок, а он не всегда выбирает то что лучше, он выбирает то что дешевле, или хотя бы лучше по соотношению цена/качество (но последнее не точно).

Хоть один годный комментарий не из серии "я с++ боюсь, поэтому айда все на rust, delphi, python (выбрать любое)."

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Другие новости