Язык программирования C3 продолжает стремительно развиваться, предлагая разработчикам уникальные возможности и современный инструментарий для эффективного создания программного обеспечения. Последний выпуск версии 0.7.4 стал ключевым этапом в истории этого проекта, представив многочисленные новшества, улучшения и исправления ошибок. Рассмотрим подробности обновления, чтобы понять, какие преимущества он приносит и почему к C3 стоит присмотреться тем, кто ценит производительность, читаемость кода и расширяемость.
Одним из важных нововведений в версии 0.7.4 является появление константных перечислений, которые обозначаются синтаксисом enum Foo : const. Они ведут себя подобно привычным enum из языка C, однако при этом могут принимать значения любого типа. Такая гибкость облегчает работу с типобезопасными константами и расширяет спектр применения перечислений в проекте.
В дополнение к этому возвращена возможность напрямую приводить типы к перечислениям и обратно без необходимости использования специальных функций .ordinal и .from_ordinal. Такая упрощённая работа с перечислениями значительно повышает удобство и понятность кода. Стоит отметить, что встроенные значения для перечислений теперь считаются устаревшими, и для включения их поддержки нужно применять флаг --use-old-enums.
Это сделано с целью стандартизации и повышения стабильности системы типов. Для разработчиков появилось удобство в работе с типами на этапе компиляции благодаря возможности оператора $typeof возвращать именно компилируемый тип. Кроме того, была добавлена опция --echo-prefix, позволяющая настраивать префикс у операторов $echo с поддержкой подстановки {FILE} и {LINE}, что упрощает диагностику и отладку кода. Компилятор также теперь способен выявлять случайные ошибки, например, сравнение foo == BAR, когда, возможно, имелось в виду присваивание foo = BAR. Улучшенное диагностическое сообщение существенно снижает количество типичных ошибок начинающих и опытных программистов.
В области обработки исключений появились улучшения — теперь сообщения об ошибках при повторном выбрасывании исключений (rethrow) в функциях, которые не возвращают опциональные значения, стали более информативными. Это помогает точнее диагностировать проблемы и лучше понимать поведение программы. Для тех, кто активно использует ассемблерные инструкции в проектах, введена новая команда --list-asm, позволяющая просмотреть все поддерживаемые инструкции ассемблера. Кроме того, появилась возможность указывать форматирование со спецификатором "%h", который теперь корректно поддерживает указатели, расширяя возможности кастомизации вывода. Компилятор тщательно доработан, чтобы предотвращать ошибки неявных преобразований, например, предупреждать о попытках преобразования беззнаковых типов в знаковые, что могло приводить к нежелательным перенаборам или неправильному поведению программы.
Важным элементом улучшений стала проверка и обновление условий инициализации структур, что сделало процесс создания структур более надёжным и понятным, особенно при использовании сложных константных выражений. Интеграция новых криптографических примитивов является ещё одним значимым шагом в развитии. В стандартной библиотеке теперь доступны семейства SipHash — ключевые функции псевдослучайного формирования, а также новые варианты хешей, такие как komihash, a5hash, metrohash64, metrohash128 и wyhash2. Каждая реализация сопровождается тестами и тестами производительности, гарантируя качество и надёжность. Состоялось обновление старых функциональностей: некоторые устаревшие элементы, например $is_const, заменены более современными аналогами (@is_const, основанным на $defined), что упрощает взаимодействие с компилятором и повышает читаемость макрокода.
Аналогично, устаревшие методы allocator::heap() и allocator::temp() теперь не рекомендуются к использованию. Добавлен новый механизм потоковой синхронизации — thread::fence, обеспечивающий барьер памяти, что крайне важно для многопоточного программирования и позволяет создавать более эффективные и корректные параллельные алгоритмы. Обновлён механизм сборки проектов: теперь по умолчанию вывод помещается в каталог out, а при сборке из командной строки используется временная папка. Это упрощает структурирование и организацию рабочих директорий. Появились новые возможности для встраивания ресурсов — теперь допускаются абсолютные пути для $embed, что значительно упрощает работу с внешними файлами и интеграцию данных непосредственно в программу.
Среди команд обработки исключений добавлены конструкции @try и @try_catch, расширяющие возможности обработки ошибок и делая код более выразительным и безопасным. Логика оценки выражений была изменена и теперь следует порядку справа налево (right->left), что соответствует поведению современных стандартов C++17 и, возможно, будущему C23. Это изменение влияет на порядок вычисления сложных присваиваний и может повлиять на некоторые сценарии вычислений. В числе исправленных ошибок — проблемы с работой mkdir и rmdir на не-Windows платформах при использовании подстрок в путях, несоответствия в форматировании и проверке типов, которые ранее могли приводить к сбоям или ненадёжному поведению. Особое внимание уделено улучшению безопасности и устойчивости — теперь обнаруживаются и предотвращаются ошибки с выходом за пределы массива в константных срезах, а также добавлена проверка невыравненного доступа к массивам, что предотвращает неопределённое поведение.
Реализована функция «отравления» текущей функции (poison) раньше, если объявление не может быть корректно разрешено. Эта мера повышает надёжность анализа кода и упрощает обнаружение критических ошибок на ранних этапах. В стандартной библиотеке появились новые криптографические и утилитарные функции, такие как Whirlpool, Ed25519, а также усовершенствованы средства строкового форматирования и работы с виртуальной памятью. Добавлена поддержка новых типов, таких как Ref и RefCounted (экспериментальная функциональность), Volatile, UnalignedRef, что расширяет возможности по управлению памятью и оптимизации доступа. Библиотека также получила улучшения в работе с потоками, включая ConditionVariable.
wait_until и wait_for, что позволяет лучше контролировать синхронизацию и ожидание в многопоточных приложениях. Добавлены ряд конверсионных функций для строк, обеспечивающих преобразования между snake_case и PascalCase, что облегчает работу с разными стилями именования и делает код более унифицированным и читаемым. Обновление версии 0.7.4 также исправляет все замеченные ошибки, связанные с неправильным поведением при работе с указателями, сложными типами, а также баги в работе с макросами и компиляцией кода.
Решены проблемы с ошибочным отображением сообщений компилятора и некорректным определением размеров при форматировании, что улучшает удобство отладки. Особое внимание уделено улучшению работы с функциями, методами и анонимными функциями (лямбдами). Лямбды теперь корректно наследуют атрибуты, что способствует более предсказуемому поведению и удобству написания функций без лишних тел. Сетевые и системные аспекты тоже вошли в число доработок: исправлено некорректное поведение при создании и удалении директорий в рекурсивном режиме, а также настроена работа с NDK на Android, что обеспечивает кросс-платформенность. Все эти изменения делают язык C3 в версии 0.
7.4 не просто инструментом для системного программирования, но и мощной средой для разработки приложений, где необходим баланс между производительностью, надёжностью и современными возможностями языка. В целом, релиз версии 0.7.4 демонстрирует серьёзный и комплексный подход к развитию языка C3, учитывая потребности сообщества и современные тренды в программировании.
Добавление новых функций, улучшения качества компиляции и расширение стандартной библиотеки делают этот язык привлекательным выбором для разработчиков, которым важна высокая производительность, безопасность и удобство кода. С каждым обновлением C3 подтверждает статус перспективного, современного и гибкого языка программирования, который успешно конкурирует с уже устоявшимися технологиями, предоставляя инновационные решения и развивая экосистему инструментов. Если вы стремитесь к эффективной и качественной разработке, следите за новыми версиями C3 и используйте возможности последнего релиза для улучшения своих проектов.