Устранение неполадок
Слева — что видно на экране, дальше — отчего это и что набрать. Каждая команда проверена этим компилятором; сообщения приведены дословно.
Установка и сборка
| Симптом | Причина | Что делать |
|---|---|---|
flang: двоичный компилятор не собран — его не собрали при установке, код 3 | пакет собирает компилятор из C99 при установке, а на машине нет cc или make | sudo apt install build-essential (Fedora — sudo dnf install gcc make, Alpine — apk add build-base, macOS — xcode-select --install), затем npm rebuild @digitable-lol/flang |
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, файлы записаны | в программе объявлены процессы, надзор или категорная поверхность — двоичный их не судит | это не отказ печати: судите такую программу теми же примерами (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 examples/rosetta/factorial.flang --function 'Факториал' --args '{"н":30}' --max-steps 3
Печатает FLANG_RECURSION_LIMIT: функция «Факториал» исчерпала лимит шагов (3) на глубине вызовов 1 и выходит кодом 1.
Процессы после печати в другой язык
Планировщик печатается не во все цели. Программа с процессами ведёт себя по-разному в зависимости от того, куда вы её напечатали:
| Цель | Что происходит |
|---|---|
js, elixir | планировщик печатается, процессы работают |
go, rust, java | печать отказывает целиком, код 1, ни файла не записано |
c, python, csharp | файлы записаны, а планировщика рядом нет: обработчик стал обычной функцией, которую никто не зовёт |
Отказ у go выглядит дословно так:
flang emit: печать отказала — у цели «go» нет планировщика конкурентности, а в программе
объявлена конкурентность (процессов 2, надзоров 1, прогонов 3), первый — процесс «Работник».
Что делать: печатайте программу с процессами в elixir или js.
flang emit ваш-файл.flang --target elixir --out ./вывод
Языковой сервер молчит в редакторе
| Симптом | Причина | Что делать |
|---|---|---|
| Редактор настроен, сервер запущен, подсказок и подчёркиваний нет | пока стандартный ввод открыт, сервер не присылает ни байта, а редактор ввод не закрывает | вешайте flang check % на клавишу — Настройка редактора |
flang lsp: неразобранный JSON, сообщение пропущено в потоке ошибок | клиент экранировал не-ASCII как \uXXXX, а сервер такие последовательности не разбирает | шлите тело в UTF-8 без экранирования |
| Подсветки нет в VS Code и Emacs | её написали только для Vim и Neovim | там она ставится одной строкой, см. ту же страницу |
Проверить, жив ли сервер, можно одной командой — она закрывает ввод, и ответ приходит:
printf 'Content-Length: 75\r\n\r\n{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"capabilities":{}}}' | flang lsp --stdio
Дальше: Настройка редактора и Установка.