flang компилятор доказывает, что программа не зациклится 0.6.2 GitHub English

К README · Указатель документации

Развитие языка

Компилятор один, написан на самом flang и собирается в двоичный файл. Работа над ним идёт в клоне, и ставить в нём нечего: зависимостей у пакета нет, поэтому команды запускаются сразу после git clone.

Правка компилятора в flang/self/ обязана перепечатать точку раскрутки тем же коммитом, иначе bootstrap/ начнёт собирать прошлый компилятор молча:

sh scripts/raskrutka.sh           # перепечатать bootstrap/ (≈11 минут: двоичный печатает сам себя)
sh scripts/raskrutka.sh --check   # сверить с исходниками побайтово, код 1 при расхождении
sh scripts/raskrutka.sh --stroki  # 0,4 с: все строковые литералы рантайма C закрыты

Печатает эти байты сам двоичный компилятор (bootstrap/flang emit … --target c); если двоичного нет, скрипт сначала соберёт его из bootstrap/.

Сверка стоит столько же, сколько печать, — около одиннадцати минут плюс make, если двоичный не собран. Зовите --check перед слиянием правки в flang/self/ или flang/src/emit/c/, а не на каждое сохранение.

Команды, на которые язык отвечает:

# разобрать, проверить типы, доказать тотальность
flang check examples/leetcode/035-search-insert-position.flang --pretty

# прогнать примеры, объявленные внутри функций
flang test examples/leetcode/035-search-insert-position.flang --pretty

# то же по КОРПУСУ: каталог или маска вместо файла (только у двоичного).
# Печатается каждый не прошедший пример и каждый не взятый файл, прошедшие —
# числом; код возврата 0 — чисто, 1 — упало или файл не взят, 2 — кривой вызов.
flang test flang/stdlib/
flang test 'examples/**/*.flang' --json

# вызвать функцию: --args берёт ПЛОСКИЙ объект скаляров, список туда не подать
flang run examples/leetcode/035-search-insert-position.flang \
  --function "Место вставки" --args '{"цель":2}'
# функции со списочным доводом зовутся своими примерами: flang test <файл>

# напечатать — цели: c | csharp | elixir | go | java | js | python | rust
flang emit examples/leetcode/035-search-insert-position.flang \
  --target python --out ./out-python

Проверки:

sh flang/проверки/обход.sh          # проверки обходчика двоичным
sh flang/проверки/обход-примеров.sh # все примеры дерева
sh scripts/raskrutka.sh --check     # семя против того, что печатают исходники
./ярлык                             # список всех проверок дерева с пояснением к каждой
./ярлык тесты                       # весь набор разом

Отдельная проверка зовётся по имени из этого списка: ./ярлык спеки:проверка, ./ярлык ссылки:проверка, ./ярлык сайт:проверка. У каждой свой код возврата: 0 — чисто, ненулевой — назван виновник.

Каждая команда пишет JSON в stdout, диагностику в stderr и возвращает ненулевой код при отказе — один и тот же контракт везде, и именно он делает всё это пригодным для CI, редакторов и агентов. Единственное исключение — flang repl, который разговаривает с человеком.