Создатель и разработчик Linux Линус Торвальдс внес позднее изменение в готовящийся к выпуску код ядра 5.15, повышающее минимальный размер компилятора с GCC 4.9 до 5.1, что может в будущем позволить использовать обновленную версию языка программирования C, C11.
Раньше минимальная версия GCC (GNU Compiler Collection) была 4.9, для которой первый выпуск появился в 2014 году. Изменение до 5.1 было предложено Ником Десолнерсом из Google, который работает над компиляцией ядра с помощью Clang, чтобы упростить код, необходимый для работы. вокруг ошибок, вызванных отсутствием функций компилятора.
«Повышение минимального количества поддерживаемых версий позволяет нам удалить все резервные помощники для! COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW, вместо отправки встроенных команд компилятора», – пояснил он.
Ядро уже указывает как минимум GCC 5.1 для сборок arm64. GCC 5.1 был впервые выпущен в апреле 2015 года.
Торвальдс объединил изменение не только из-за проблемы Десолье, но и по причинам, связанным с очисткой, необходимой для обработки предупреждений как ошибок (-Werror), спорного изменения, которое было изменено для применения только к тестовым сборкам, но остается важным. .
“Поддержка Gcc-4.9 в течение некоторого времени была раздражающей, и с -Werror у меня был выбор: применить довольно большой патч от Киса Кука, чтобы удалить изрядное количество предупреждений инициализатора (некоторые все еще остаются), или эту серию патчей от Ника это просто устраняет источник проблемы », – сказал Торвальдс.
«Похоже, что на самом деле никто не строит на 4.9 – в настоящее время в x86_64 allmodconfig имеется около 200 ошибок (в том числе предупреждений)», – сказал Кук, инженер по безопасности ядра в Google.
Некоторые отметили, что они все еще используют GCC 4.9, но в этом случае решением будет придерживаться более старой версии ядра.
«Согласно distrowatch, это потеряет поддержку версии дистрибутива gcc Debian 8 (Jessie), Ubuntu 15.04 и более старых версий Android AOSP (новые версии используют clang для сборки ядер, старые версии также нуждаются в более старых ядрах). Я думаю, что это приемлемо “, – сказал разработчик ядра Арнд Бергманн.
Бергманн также заметил, что «после этого, я думаю, мы также можем изменить –std = gnu89 на –std = gnu11 в качестве дополнительного преимущества». Торвальдс также отметил это, сказав: «Мы, вероятно, можем изменить наше использование ‘–std = gnu89’ на ‘–std = gnu11’ и, наконец, начать использовать объявления локальных циклов и т. Д. Но в этой серии статей этого еще не сделано».
Эти директивы определяют используемый стандарт C. std = gnu89 означает ISO C90 с расширениями GNU, которые включают некоторые функции C99. Это изменение позволит использовать C11 с расширениями GNU. C11 была ратифицирована десять лет назад, как следует из ее названия.
В C89 все объявления переменных должны быть в начале блока кода, тогда как в C99 on переменные могут быть объявлены в любом месте блока. Торвальдс сказал в 2005 году: «Это проблема стиля кодирования. Мы размещаем объявления переменных там, где люди могут их _ находить, а не в случайных местах кода. Помещение переменных в середину кода улучшает читаемость только тогда, когда у вас беспорядочный код. функция, которая _может_ того стоить, – это счетчик циклов: синтаксис for (int i = 10; i; i–) действительно имеет смысл и является реальной функцией (он делает ‘i’ локальным для цикла и может фактически помогите людям избежать ошибок – вы не можете использовать «i» по ошибке после цикла) ».
При всем волнении по поводу возможного будущего использования Rust в кодировании ядра последнее изменение является напоминанием о том, что ядро не только написано на C, но и использует старую версию языка. Последней версией C и по умолчанию в GCC, если не используется директива, является ISO / IEC 9899: 2018, также известный как C17 или C18, но он только исправляет дефекты в C11 и не вводит новые языковые функции. ®