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

Установка

Последний выпуск — 0.7.29 (релиз на GitHub).

ПутьЧто ставитЧто нужно на машине
Одной строкойготовую сборку в ~/.local без sudocurl или wget, sha256sum или shasum
Homebrewflang, библиотеку, заголовки, man flangbrew
asdfflang рядом с другими версиямиasdf
deb и rpmпакет системыapt или dnf
Из исходниковflang из клонаgit, cc, make

Готовые сборки лежат в каждом выпуске начиная с 0.7.29: Linux x86_64 и aarch64 (статически, на любом дистрибутиве), macOS arm64 и x86_64. Пакет называется flang-package, команда, которую он ставит, — flang. Печать во все десять целей, проверки, доказательства и языковой сервер (flang lsp --stdio) есть в каждой готовой сборке.

Имя занято LLVM Flang. Компилятор Фортрана из LLVM тоже ставит команду flang (формула flang в Homebrew, пакет flang в AUR и Fedora). Если стоят оба, побеждает тот, что раньше на PATH. Проверка — flang --version: наш отвечает первой строкой flang <версия>. Лечится порядком каталогов в PATH или полным путём к команде в каталоге установки.

Одной строкой

curl -fsSL https://raw.githubusercontent.com/digitable-lol/flang/main/install.sh | sh

Сценарий выбирает сборку под систему и процессор, скачивает её вместе с SHA256SUMS выпуска, отказывается продолжать при несовпадении суммы и ставит bin/, share/ (на macOS ещё lib/ и include/) в ~/.local. Версию закрепляет FLANG_VERSION=0.7.29, каталог — PREFIX=/opt/flang; обе — переменные среды sh. Под Windows сценарий отвечает отказом и советует WSL.

Homebrew

brew install digitable-lol/tap/flang-package

brew install digitable-lol/tap/flang тоже работает: это другое имя той же формулы. Ставит flang, libcompiler_flang.a, заголовки и страницу man flang — раздаёт их репозиторий homebrew-tap.

asdf

asdf plugin add flang https://github.com/digitable-lol/asdf-flang.git
asdf install flang latest
asdf set -u flang latest

Плагин скачивает готовую сборку и сверяет её сумму. Выпуски до 0.7.29, а также установка с ASDF_FLANG_FROM_SOURCE=1 собираются из исходников C — для этого нужны cc и make. В каталог версии ложатся bin/flang, lib/libcompiler_flang.a, заголовки в include/, исходники рантайма каждой цели печати в share/flang/<цель>/ и стандартная библиотека в share/flang/stdlib/. После установки плагин щупает поставленное: flang --version обязан назвать запрошенную версию. Третья строка — asdf set, а не asdf global: global и local удалены в asdf 0.16.0. Тот же плагин понимает mise: mise plugin add flang https://github.com/digitable-lol/asdf-flang.git.

deb и rpm

Скачайте пакет под свой процессор из последнего выпуска и поставьте:

sudo apt install ./flang-package_<версия>_amd64.deb     # или _arm64.deb
sudo dnf install ./flang-package-<версия>-1.x86_64.rpm   # или .aarch64.rpm

rpm конфликтует с пакетом flang из Fedora (LLVM Flang): оба владеют /usr/bin/flang.

Плагин живёт в своём репозитории, asdf-flang; это дерево держит его сабмодулем packaging/asdf-plugin и не выпускается, пока он расходится с packaging/asdf/.

Из исходников

git clone https://github.com/digitable-lol/flang.git
cd flang
make -C bootstrap -j4
sudo make -C bootstrap install        # или PREFIX=$HOME/.local, без sudo

Кладёт bin/flang, lib/libcompiler_flang.a, заголовки в include/, рантаймы целей печати в share/flang/<цель>/ и стандартную библиотеку в share/flang/stdlib/ — и говорит куда:

…
поставлено: /usr/local/bin/flang — проверьте: flang --version
make: Leaving directory '…/bootstrap'

Версия будет та, что в клоне, а не последняя выпущенная. Страницы man на этом пути нет: flang.1 приезжает только в архиве релиза. Клон старше 0.7.29 share/flang/ не ставит; flang emit из такой установки просит назвать каталог рантайма (--runtime <клон>/flang/src/emit/c или переменная FLANG_RUNTIME_DIR). Порядок поиска библиотеки и переменные, которые показывают двоичному клон, — в руководстве.

Если make на машине нет, хватает одного вызова cc:

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

Не через npm

Четвёртого пути нет: пакета npm нет, package.json в репозитории нет. npm install @digitable-lol/flang под этим именем ничего не находит, а npm install git+https://github.com/digitable-lol/flang.git не ставит ни одной команды.

Под Windows Homebrew не ставит, а путь из исходников хочет cc и make: это значит MSYS2, WSL или другой набор с C99; родного пути нет. Под Windows здесь ничего не проверяется.

Языкового сервера это не касается: он и есть flang lsp --stdio, подкоманда самого двоичного, и он на каждом пути выше.

Проверка, что встало

Три команды. Отвечают так — flang на месте.

flang --version
flang 0.7.29
оболочка …: правит строку (стрелки, слова, история, Tab), цвет digitable

Положите в privet.flang:

модуль «Привет»
тотальная функция «Два»
  возвращает число
  2
flang check privet.flang
модуль «Привет»: функций 1, из них с доказанным завершением 1; типов 0
privet.flang: проверено — разбор, типы, завершаемость, ядро и примеры; замечаний нет

Код возврата 0. Файл, который не прошёл, отвечает не проверено — замечаний N и кодом возврата 1.

flang repl
flang 0.7.29 — оболочка. «.помощь» — команды, «.выход» или Ctrl-D — конец.
Объявление заканчивается пустой строкой, выражение вычисляется сразу.
оболочка …: строку правит сама (Tab — дополнение, «.помощь» — клавиши)
» 2 плюс 2
4

Выход — Ctrl-D. Если вместо 4 оболочка отвечает вычислять нечем: не найден libcompiler_flang.a, двоичный файл поставлен, а библиотека — нет: положите libcompiler_flang.a рядом с двоичным файлом или укажите каталог с ней в FLANG_LIB_DIR.

Удаление

ПутьКоманда
Одной строкойкоманду удаления сценарий печатает последней строкой: rm -rf по списку поставленных файлов
Homebrewbrew uninstall flang-package
asdfasdf uninstall flang <версия>, затем asdf plugin remove flang
deb, rpmsudo apt remove flang-package, sudo dnf remove flang-package
Из исходниковmake -C bootstrap uninstall — с тем же PREFIX=…, с каким ставили

make -C bootstrap uninstall снимает bin/flang, библиотеку, share/flang/ и страницу man, но ОСТАВЛЯЕТ заголовки в include/ (compiler_flang.h, flang_runtime.h, tls_client.h) — удалите их руками, если каталог должен остаться пустым.

Построено на flang

Четыре приложения вне этого репозитория — не примеры, а рабочий код:

Что дальше