Устранение неполадок
Слева — что видно на экране, дальше — отчего это и что набрать. Каждая команда проверена этим компилятором; сообщения приведены дословно.
Установка и сборка
| Симптом | Причина | Что делать |
|---|---|---|
После установки двоичного 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, а не в PATH | sudo 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
Дальше: Настройка редактора и Установка.