Языки программирования

Стандарт C23 ISO появился, но вы, вероятно, не станете его читать

Стандарт C23 ISO появился, но вы, вероятно, не станете его читать

Наконец-то ISO C23 был опубликован, но за 250 долларов вы, скорее всего, не станете его читать. Неужели мы можем терпеть такую наживу на чужом труде? Это хуже, чем академическая публикация!

Если вам интересно, ценник в $250 - это цена за PDF-файл, так что нельзя утверждать, что это оплата производственных расходов. Можно, однако, утверждать, что, поскольку комитет по стандартизации выкладывает проекты стандартов в свободный доступ, вам не нужно покупать окончательную публикацию. Но можете ли вы действительно основывать свою работу на чем-то, что не является окончательным вариантом?

Другие языки, кажется, не страдают от этой проблемы - JavaScript - простите ECMAScript 2024 - можно скачать бесплатно; Java можно скачать бесплатно, от Oracle, как никто другой; C# также бесплатен, а у Python нет спецификации, только эталонная реализация в виде CPython. Фактически, единственные популярные языки, за которые нужно платить, - это C и C++. Это неприемлемо.

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

Затем возникает проблема неопределенного поведения. Неужели я должен заплатить 250 долларов за документ, который не удосужился определить, что происходит, когда подписанное значение переворачивается? Мне кажется, что стандарт должен быть полным, а не неопределенным. Конечно, я шучу, но только слегка - вся проблема неопределенного поведения является безумной и требует решения независимо от стоимости стандарта. В реальной жизни все поведение определяется машиной - все, что вам нужно сделать, это понять, что это такое, и идти на поводу у большинства.

Что касается поддержки C23 - в конце концов, компиляторы овеществляют стандарт, и это реальный мир, в котором мы программируем - хорошая новость заключается в том, что начиная с GCC 14, поддержка C23 была практически полной. Теперь, в версии 15, GCC настроен на то, чтобы сделать C23 версией по умолчанию, если вы не укажете иное. Другой основной компилятор C, Clang, не сильно отстает, как и версия C lang от Apple, но, конечно, компилятор C от Microsoft отстает на много миль и вряд ли стоит рассматривать его как компилятор C - он в первую очередь компилятор C++.

Так что же нового в C23? На этот вопрос в значительной степени ответил наш первый взгляд на стандарт, см. C23 - What We Have To Suffer от Гарри Фэйрхеда. Должен сказать, что я на 100 % согласен с его позицией. Я не использую C для программирования IoT, но когда я использую его, я не хочу, чтобы он превращался в C++ или Java - если бы я хотел этого, я бы использовал другой язык. Сохраните C как независимый от машины ассемблер и делайте дополнения, которые соответствуют этому понятию.

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

  • предопределенные true и false означают, что нам не нужно беспокоиться о том, что они определены.
  • Разделитель цифр для констант означает, что мы можем сделать многозначные константы более удобными для чтения.
  • предопределенная константа nullptr позволяет не надеяться на то, что NULL или (void*)0 справятся с задачей.

и так далее.

Однако есть и такие дополнения, которые просто нежелательны. Гарри называет unreachable одной из таких лишних трат места. Я бы хотел добавить расширение auto до значения «выводить тип». Например:

auto n=1;

будет скомпилирован так же, как если бы вы написали:

int n=1;

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

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

auto x = 255;

заменяет

char x = 255;

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

Читайте также