LINUX.ORG.RU
ФорумTalks

В ядро предлагают добавить поддержку C++

 , ,


0

6

https://www.phoronix.com/news/CPP-Linux-Kernel-2024-Discuss

С похмелья после праздничной новогодней недели «longtime Linux developer H. Peter Anvin» открыл свой лэптоп и случайно наткнулся на первоапрельский набор патчей для ядра, где добавляется поддержка С++. «Хм», подумал Петр Анвин, «а это неплохая идея, но где же мое опохмелительное пиво?» И недолго думая, он решил написать в LKML: «У меня сейчас сильно болит башка, поэтому вот предложение для тех, у кого она ещё не болит: а давайте привсунем в ядро C++?» На его предложение уже положительно откликнулись Jiri Slaby из SUSE, а так же David Howells из Red Hat, который и написал эти патчи как шутку 6 лет назад.

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

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

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

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

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

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

В общем какой такой свой рантайм притащат в ядро плюсы, который не притащит сишка, всё ещё не понятно.

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

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

Потому, что для int Variable; память выделяет не программист и освобождает её не программист.

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

И в сишке, и в плюсах для int Variable память вообще не выделяется. Двигается указатель на стёк и на каком-то офсете от этого указателя кусок памяти назначается под эту переменную (а весьма часто сразу под несколько переменных). И происходит это в плюсах и в сишке абсолютно одинаково, ибо компилятор один и тот же и делает одно и тоже (по идее даже в плюсовых корутинах это делается так же, только стёк по особому выделяется).

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

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

можно, но зачем? Наследование — одна из прекраснейших вещей, которые есть в плюсах.

За шкафом. man композиция и агрегация. Позволяет решать те же задачи что и наследование, только без развесистых иерархий, и т.д. родовых проблем ООП. Одепты ООП выдумывают броские аббревиатурки типа SOLID и вагоны «паттернов» с пересекающимся функционалом, чтоб решать проблемы... которых не было до ООП, вместо признания что ООП нужно не везде, а местами — «дуинг ит вронг», особенно там где нужны обобщенные типы, а не иерархии наследования, за что еще Степанов(создатель STL) их выстебал.

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

Вы хотите сказать, что чистый код на C++ не влечёт за собой при кодогенерации никакого специфичного использования run-time?

Для 2 + 2 всё ok.

Скорее всего C++ вполне годится при разработке ядра.
Но вот для использования rust в ядре почему-то исследование проводилось ...

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

Вы хотите сказать, что чистый код на C++ не влечёт за собой при кодогенерации никакого специфичного использования run-time?

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

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

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

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

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

Пофиксил, не благодари.

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

Ладно Дружище, в основном Ты прав, что для обсуждения этого вопроса пока не готов (не копал).
Просто Redistributable Package «навеяли» суждения о том, что C++ таки имеет свою run-time специфику.

https://gcc.gnu.org/onlinedocs/gccint/Run-time-Target.html

...

Поиск типа «gcc C++ run-time».

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

Имеет. Так же как и у сишки рантайм есть. Просто это не применимо для bare metal.

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

Так ядро NT от винды же вроде на плюсах написано?

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

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

Т.е. для как минимум не менее сложных задач чем ядро ОС и драйвера, Си++ подходит

Для задач с другой спецификой С++ подходит. Для ОС и драйверов - нет. Попытки использовать С++ для ОС и драйверов в угоду моде и всяким дебильным «good programming practices» были и абсолютно все - провалились. Для уя С++ и прочее ООП вполне годится. Потому его там чаще всего и используют. В ОС, драйверах, всяких числодробилках, эмбеддед и пр не годится. Поэтому его там не используют.

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

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

Т.н. «индустрия» выбирает не то, что реально нужно для решения задачи, а то, про что тупорылые менеджеры в каких-нибудь тупорылых книжонках и статейках прочитали. Если завтра всякие пропагандисты «good programming practices» начнут про ниэпическую крутизну форта для приложений энтерпрайз уровня рассказывать, то вся эта сраная индустрия, которая не произвела вообще ничего пристойного в смысле высот программистского искусства за всю историю своего существования и место которой в помойке ещё со времён пузыря доткомов, тут же ринется переписывать своё дерьмо на форте.

Любые попытки подходить к программизму с точки зрения манагерства, маркетинга и «programming practices» сектантства никогда не заканчивались ничем кроме производства всё более и более убогой блоатвари. Результат этих усилий - налицо.

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

Это вовсе не плюсы тащат за собой рантайм. Нет особых технических проблем написать bare-metal на плюсах. Можно даже сделать это красиво и очень ООПшно. Проблема в том, что это любители плюсов тащат ненужный рантайм и без какого-нибудь boost уже не способны ничего написать, уж не говоря о libstdc++.

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

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

вместо признания что ООП нужно не везде

А кто-то утверждал, что ООП нужно везде? Каждой задаче – свой инструмент. А утверждения «ООП нужно везде» и «ООП вообще не нужно» одинаково идиотичны.

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

Сложнее поддерживать и проще писать волшебный говнокод.

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

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

Во-первых, библиотеки не являются рантаймом. М.б. какие-то из них могут требовать чего-то типа rtti, что можно считать рантаймом, но любителей притащить такое в bare metal я пока не встречал и сомневаюсь, что встречу. Такое и в прикладных плюсах никто не любит.

Во-вторых, в чём проблема притащить на железку какие-то части буста, типа интрузивных контейнеров, или какие-то части stl, типа std::array или std::string_view? В чём смысл велосипедить их самостоятельно? А если есть аллокатор и ты не боишься исключений, то в чём проблема в std::vector или std::string? То, что ты сам навелосипедишь будет чем-то лучше?

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

В общем актуальность описанной тобой проблемы сомнительна.

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

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

А сишка в отличие от плюсов, фактически требует type erasure через void* и макросов, что приводит к тому, что компилятор может собрать вообще всё, что угодно.

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

Ivan_qrt ★★★★★
()
Последнее исправление: Ivan_qrt (всего исправлений: 1)

Т.е. количество роутеров, поддерживаемых свежей openwrt, опять уменьшится в 2-3 раза...

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

Хочу сказать, что никакой специфичный для плюсов рантайм в ядро ты просто не притащишь

вообще rtti при желании можно притянуть, но его в приложения-то не всегда тянут

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

Попытки использовать С++ для ОС и драйверов в угоду моде и всяким дебильным «good programming practices» были и абсолютно все - провалились.

их не было

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

вообще rtti при желании можно притянуть, но его в приложения-то не всегда тянут

Ну да. И к тому же довольно сложно придумать, зачем rtti в ядре в принципе может понадобится.

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

Я хз, когда последний раз тыкал gcc, hello_world.cpp с точно таким же кодом, как в hello_world.c, занимал в разы больше места

Shadow ★★★★★
()
Ответ на: комментарий от Shadow
cat /tmp/test.c
#include <stdio.h>

int main() {
    printf("Hello world!\n");
}
cat /tmp/test.cpp
#include <stdio.h>

int main() {
    printf("Hello world!\n");
}
gcc -O3 -std=c11 -o /tmp/test-c /tmp/test.c 
g++ -O3 -std=c++23 -o /tmp/test-cpp /tmp/test.cpp
ll /tmp/test*
-rwxr-xr-x. 1 ivan ivan 17K янв 14 23:06 /tmp/test-c
-rw-r--r--. 1 ivan ivan  62 янв 14 23:05 /tmp/test.c
-rwxr-xr-x. 1 ivan ivan 17K янв 14 23:06 /tmp/test-cpp
-rw-r--r--. 1 ivan ivan  62 янв 14 23:06 /tmp/test.cpp
Ivan_qrt ★★★★★
()
Ответ на: комментарий от rupert

Ну тогда нужно пояснение - зачем тут C++ - если писать на чистом Си.

А понял/увидел/перечитал - тогда мой камент мимо.

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

Это отражает размер iostream vs printf, не более. Да, размер iostream больше, вряд ли кто-то удивился.

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

Ivan_qrt ★★★★★
()

Этого не хватало…

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

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

но на вопрос ты так и не ответил.

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

Естественно, плюсы берут для того, чтобы писать на плюсах, а не на сишке. Но на плюсах можно писать и без stl (и тем более без iostream), если stl по каким-то ограничениям тебе не подходит.

Или можно взять ограниченную версию stl, типа freestanding.

И при этом это будет всё ещё в разы лучше сишки. Что тут может быть не очевидно?

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

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

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

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

В рамках ядра, естественно, писать нужно на каком-то подмножестве. Более того, в рамках ядра и на Си сейчас пишут на подмножестве и libc, входящая в стандарт Си там сильно порезана.

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

Ну хз насколько это необходимо и оправдано.

Необходимого в этом, очевидно, нет. Ядро и сейчас вполне жизнеспособно.

Оправданность может быть выяснена в результате обсуждений, там есть куча отнюдь не очевидных моментов.
Но даже если всё сведётся к тому, чтобы просто компилировать всё компилятором C++ и использовать полноценную систему типов + constexpr вместо void* и макросов, это уже будет значительным улучшением, на мой взгляд.

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