LLVM 18 ڪمپلر سوٽ دستياب آهي

ڇهن مهينن جي ترقيءَ کان پوءِ، LLVM 18.1.0 پروجيڪٽ جو رليز پيش ڪيو ويو - هڪ GCC-مطابقت رکندڙ ٽول ڪٽ (ڪمپائلر، آپٽمائيزر ۽ ڪوڊ جنريٽر) جيڪو پروگرامن کي RISC-جهڙي ورچوئل هدايتن جي وچ واري بٽ ڪوڊ ۾ گڏ ڪري ٿو (هڪ گهٽ-سطح واري ورچوئل مشين سان. گھڻ-سطح اصلاحي نظام). ٺاهيل pseudocode کي JIT ڪمپيلر استعمال ڪندي مشين جي هدايتن ۾ سڌو سنئون پروگرام جي عمل جي وقت ۾ تبديل ڪري سگھجي ٿو.

Начиная с ветки 18.x проект перешёл на новую схему формирования номеров версий. По аналогии с проектами GCC и GDB, нулевой выпуск («N.0») теперь используется в процессе разработки, а первая стабильная версия снабжается номером «N.1». Изменение позволяет отделить сборки на основе находящейся в разработке ветки (mainline) от сборок ветки с финальными релизами. Например, при подготовке нынешнего выпуска разработка велась с использованием нестабильной ветки LLVM 18.0, а первый стабильный релиз вышел под номером 18.1.0. В дальнейшем при необходимости каждые две недели могут формироваться корректирующие выпуски под номерами 18.1.1, 18.1.2 и т.п. В случае внесения в текущую ветку изменений, нарушающих ABI, обновление будет сформировано с изменением второй цифры версии (т.е. 18.2.0).

Clang 18 ۾ اهم سڌارا:

  • Изменения, связанные с языком Си:
    • Структуры, объединения и массивы с признаком «const» по аналогии с GCC теперь могут использоваться как константные выражения.
    • Перечисления (enum) теперь отражаются в метаданных TBAA (Type Based Alias Analysis) в своём исходном целочисленном типе, вместо обработки как типа «char».
    • Добавлена поддержка атрибута «counted_by», через который можно указать поле в структуре с гибким массивом, определяющим число элементов в гибком массиве. Атрибут может использоваться в clang для повышения эффективности проверок выхода за границу буфера.
  • Возможности, определённые в будущем Си-стандарте C23:
    • Добавлена поддержка флагов «-std=c23» и «-std=gnu23», а также значения «202311L» для макроса «__STDC_VERSION__», определяющих стандарт C23 и расширения GNU C23.
    • Добавлена поддержка выражения «requires c23» для привязки модулей к поддержке стандарта C23.
    • Реализована поддержка вывода типа при определении объектов, что позволяет использовать вместо типа признак «auto» для определения типа переменных на основе типа выражения для их инициализации. Например: «auto y = cos(x);».
    • Добавлена поддержка заголовочного файла <stdckdint.h> с макросами для проверки целочисленных вычислений.
    • Разрешено размещение меток в любых местах внутри составных выражений.
    • При компиляции в режиме C23 прекращена поддержка в коде триграфов, последовательностей из трёх ASCII-символов, обрабатываемых как один символ, например, последовательность «??=» можно было использовать вместо «#». После появления Unicode поддержка триграфов потеряла смысл.
  • Возможности, связанные со стандартом C++20: Реализована экспериментальная возможность использования в шаблонах дополнительных видов аргументов, не являющихся типами, например, разрешено указание значений с плавающей запятой, указателей и ссылок на субобъекты.
  • Возможности, связанные со стандартом C++23: Добавлена экспериментальная поддержка механизма «Deducing this», позволяющего использовать в шаблоне параметры с признаком «this» и дающего возможность из функции класса узнать категорию выражения (например, является ли константой), для которого эта функция вызвана.
  • Возможности, связанные с будущим стандартом C++2с (C++26):
    • Добавлена возможность использования сразу нескольких переменных-заполнителей с именем «_» в одной области видимости, например, теперь являются корректными конструкции: struct S { int _, _; }; void func() { int _, _; } void other() { int _; // ранее выводилось предупреждение в режиме -Wunused }
    • Предоставлена возможность использования строковых литералов в контексте, в котором они не используются для инициализации массива символов и не попадают в результирующий код, а применяются только во время компиляции для диагностических сообщений и препроцессинга, например, в качестве параметров директив и атрибутов _Pragma, asm, extern, static_assert, [[deprecated]] и [[nodiscard]].
    • Переведено в разряд устаревших выполнение неявных преобразований перечисляемых значений в арифметических вычислениях. int main() { enum E1 { e }; enum E2 { f }; bool b = e

      جو ذريعو: opennet.ru

تبصرو شامل ڪريو