Διατίθεται σουίτα μεταγλωττιστή LLVM 18

Μετά από έξι μήνες ανάπτυξης, παρουσιάστηκε η κυκλοφορία του έργου LLVM 18.1.0 - μια εργαλειοθήκη συμβατή με το GCC (μεταγλωττιστές, βελτιστοποιητές και γεννήτριες κώδικα) που μεταγλωττίζει προγράμματα σε ενδιάμεσο bitcode εικονικών οδηγιών τύπου RISC (μια εικονική μηχανή χαμηλού επιπέδου με σύστημα βελτιστοποίησης πολλαπλών επιπέδων). Ο ψευδοκώδικας που δημιουργείται μπορεί να μετατραπεί χρησιμοποιώντας έναν μεταγλωττιστή 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

Προσθέστε ένα σχόλιο