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

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

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

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

СимптомПричинаЧто делать
flang: двоичный компилятор не собран — его не собрали при установке, код 3пакет собирает компилятор из C99 при установке, а на машине нет cc или makesudo 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, а не в 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, файлы записаныв программе объявлены процессы, надзор или категорная поверхность — двоичный их не судитэто не отказ печати: судите такую программу теми же примерами (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

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