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

Устранение неполадок

Слева — что видно на экране, дальше — отчего это и что набрать. Каждая команда проверена этим компилятором; сообщения приведены дословно.

Установка и сборка

СимптомПричинаЧто делать
После установки двоичного flang неткомпилятор собирается из четырёх файлов на C99 в bootstrap/, а на машине нет cc или make. Сообщение «двоичный компилятор не собран», которое печаталось при установке, в дереве больше не существует: у package.json нет ни postinstall, ни поля scripts (коммит 2c40752d0)sudo apt install build-essential (Fedora — sudo dnf install gcc make, Alpine — apk add build-base, macOS — xcode-select --install), затем make -C bootstrap
make: command not found при сборке из клонаmake нужен только чтобы собрать четыре файла на Cсоберите одним вызовом cc — команда ниже
asdf install flang отказывает: в архиве не тот файлплагин asdf лежит в отдельном репозитории и отстаёт от дереваbrew install digitable-lol/tap/flang или сборка из исходников
Собранный flang не находитсяmake -C bootstrap кладёт его в bootstrap/flang, а не в PATHsudo make -C bootstrap install или зовите ./bootstrap/flang

Сборка без make — один вызов компилятора C:

cd bootstrap
cc -std=c99 -Wall -Wextra -Werror -pedantic -O2 -o flang \
   flang_cli.c flang_repl.c flang_runtime.c compiler_flang.c -lm -lpthread

Проверка не отвечает или отвечает не про то

СимптомПричинаЧто делать
flang check на большом файле думает и кончается FLANG_RECURSION_LIMITбюджет шагов один на всю команду, а ключа, поднимающего предел, у check нетпроверяйте по одному файлу и дробите модуль на части поменьше
flang check называет строку и столбец, которых в вашем файле нетбеда живёт во ввезённом модуле, а диагностика имени файла не несётпроверьте каждый ввезённый модуль отдельной командой
«замечаний 1», и ни слова о постусловиях: --proof не печатает ничегопроверка встала на первой беде — до постусловий она не дошла, и утверждения не судились вовсепочините беду; пока она есть, «доказано» не означает ничего
FLANG_IMPORT_NOT_FOUND: не найден модуль «Имя»: ни рядом с файлом, ни выше по каталогам, ни в библиотеке компиляторапоиск по одному имени модуля файла не нашёлназовите путь прямо: использует «Имя» из "путь/файл.flang"
flang emit вышел кодом 3, файлы записаныв программе объявлено то, чего двоичный не судит, — например монада (программа с процессами или со стрелками без категории сегодня печатается кодом 0; прогон 11 сентября 2026, двоичный 0.7.17, коммит 2c40752d0, на примерах страницы «Справочник конструкций»)это не отказ печати: судите такую программу теми же примерами (flang test)

Беда во ввезённом модуле выглядит так — строка 7 здесь принадлежит соседнему файлу, а не тому, который вы проверяли:

FLANG_UNKNOWN_NAME, строка 7, столбец 17: имя «неизвестное» не связано

Лечится проверкой по одному файлу:

flang check сосед.flang

Прогон плана упирается в предел

СимптомПричинаЧто делать
FLANG_RECURSION_LIMIT: функция «Имя» исчерпала лимит шагов (10000000) на глубине вызовов N, код 1у flang io предел шагов на один виток по умолчанию 10 000 000поднимите ключом: flang io план.flang --max-steps 100000000
FLANG_RECURSION_LIMIT: функция «Имя» превысила предел глубины вызовов (10000)предел глубины вызовов — 10 000--max-depth N, а лучше переписать рекурсию свёрткой
План встал, не дойдя до конца, а беды нетпоручений за прогон по умолчанию 10 000--max-orders N

Проверить на маленьком пределе, что сообщение именно это:

flang run docs/examples/rosetta/factorial.flang --function 'Факториал' --args '{"н":30}' --max-steps 3

Печатает FLANG_RECURSION_LIMIT: функция «Факториал» исчерпала лимит шагов (3) на глубине вызовов 1 и выходит кодом 1.

Процессы после печати в другой язык

Планировщик печатается не во все цели. Программа с процессами ведёт себя по-разному в зависимости от того, куда вы её напечатали:

ЦельЧто происходит
c, elixir, js, tsпланировщик печатается (у c это flang_conc.c рядом с программой), код 0
cpp, csharp, go, java, python, rustпечать отказывает целиком, код 1, ни файла не записано

Снято на docs/examples/service-on-processes/service.flang (три процесса, надзор, три прогона).

Отказ у go выглядит дословно так:

flang emit: печать отказала — у цели «go» нет планировщика конкурентности, а в программе
объявлена конкурентность (процессов 3, надзоров 1, прогонов 3), первый — процесс «Приёмная».
Напечатать процессы в «go» нечем: обработчик стал бы обычной функцией, которую никто
не зовёт, и программа собралась бы, делая не то, что написано. Цели с планировщиком: c, elixir, js

Что делать: печатайте программу с процессами в c, elixir, js или ts (подсказка отказа называет три цели, ts в ней не назван, хотя печатает — тот же прогон).

flang emit ваш-файл.flang --target elixir --out ./вывод

Языковой сервер в редакторе

СимптомПричинаЧто делать
Редактор настроен, подсказок и подчёркиваний нетредактор не может запустить flang lsp: двоичного нет в PATHпроверьте команду сервера в настройках редактора — Настройка редактора; flang check % на клавише работает и без сервера
Подсветки нет в Emacsподсветка есть только для Vim, Neovim и VS Codeвешайте flang check % на клавишу — см. ту же страницу

Проверить, жив ли сервер, можно одной командой:

printf 'Content-Length: 75\r\n\r\n{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"capabilities":{}}}' | flang lsp --stdio

Дальше: Настройка редактора и Установка.