Repository navigation
flang 0.7.29 — Готовые сборки и установка одной командой, законы категорий доказываются
Готовые сборки и установка одной командой, законы категорий доказываются
Что появилось
- Готовые сборки для Linux и macOS, установка одной командой. Компилятор C и sudo не нужны:
curl -fsSL https://raw.githubusercontent.com/digitable-lol/flang/main/install.sh | shкладётflangв~/.local/binи сверяет архив сSHA256SUMSвыпуска. Есть и другие пути:brew install digitable-lol/tap/flang-package, asdf, пакеты deb и rpm. - Песочница в браузере. На странице https://digitable-lol.github.io/flang/playground.html программа и силлогизм проверяются прямо во вкладке: компилятор собран в WebAssembly, ставить ничего не нужно.
- Установленный flang находит стандартную библиотеку.
использует «Lists» только «Длина»работает в программе из любого каталога: библиотека лежит вshare/flang/stdlibрядом с двоичным. Раньше это работало только внутри клона репозитория. - Законы моноида, функтора, изоморфизма и естественного преобразования доказывает ядро — для всех значений, а не на сетке.
check --proofпечатает их отдельным разделом, например наflang/ct/yoneda-preorder.flang:законов утверждениями 9: доказано ядром 9, не доказано 0, в--jsonэто полеlawClaims. Недоказанный закон назван поимённо. Законы монады пока считаются на сетке. flang testисполняет блокипрогони сверяет их ожидания. Каждый блок считается примером: неверное ожидание — код 1 и сообщениеу процесса «Счётчик» состояние {"всего":5}, а ожидалось {"всего":999}.check --proofпечатает ход доказательства у большинства утверждений: какое поле или какой вызов раскрыт и на какой строке исходника, напримерход 1 поля ⟨«Пополнить» от ( счёт ) и сумма⟩ строка 15 …. У части утверждений пока только имя правила.- Свойства «всегда» для процессов проверяются перебором конечной модели. Модель — процессы, их состояния и правила «получив письмо, перейти и отправить письма»; перебор обходит все порядки до заданной глубины. Ответ — либо кратчайший встречный прогон, либо «не нарушено … это не доказательство». Для модели
flang/concurrency/temporal/models/deadlock.flangответ —НАРУШЕНО, встречный прогон, шагов 6. Обе проверяющие программы (на C и на Lean 4) переигрывают такие записи сами:ПЕРЕБОР СВЕРЕН: встречный прогон переигран, шагов 6, в конце свойство «без тупика» ложно. - Напечатанный C сверяется с эталоном.
flang run-script translation:validateпечатает примеры в C, собирает их и сравнивает ответы программ с ответами эталонной семантики на Lean 4:СООТВЕТСТВИЕ ПРОВЕРЕНО для 146 функций, вне валидации 4 … расхождений 0. Шесть нарочно испорченных версий напечатанного C она отвергает. - Грамматика русского предложения на типизированных словах.
flang run flang/ct/russian/parse.flang --function «Разобрать» --args '{"предложение":"мама читает книгу"}'отвечаетграмматично: … связи: мама—читает, читает—книгу, а на «мама читает книга» —не грамматично: неверный падеж. - Юникод 17 в стандартной библиотеке: нормализация (
NFC,NFD), деление на графемы, сравнение без учёта регистра и явное раскодирование байтов.«Графемы» от "👨👩👧🇷🇺"— две графемы;«Равны без учёта регистра» от "STRASSE" и "straße"—да;«Раскодировать байты» от "UTF-8" и [104, 255]— отказ с местом 2 и причиной «байт не может начинать знак UTF-8». - В оболочке
flang replможно писать утверждения, теоремы и силлогизмы. Оболочка сразу отвечает:утверждение «сложение перестановочно»: доказано (код 0), «опровергнуто» с контрпримером или «не доказано» с причиной. - Эталонная семантика ядра языка записана на Lean 4, и для каждого шага, который переигрывает независимая проверяющая программа, на Lean доказано, что шаг корректен.
Что изменилось
- Экспортированная функция может звать скрытого помощника своего модуля. Раньше программа, которая подключала такой модуль, не проходила
check; теперь проходит, а прямой вызов скрытой функции — ошибкаFLANG_UNKNOWN_NAME: «её объявляет …, но не экспортирует». - Вложенный объект — понятная ошибка вместо падения. Строка
вложен объектдаётFLANG_PARSE … старое слово, программу из него не составить: вложенную запись объявите объектом и сошлитесь полем. - Ошибки связывания называют файл, а не только строку и столбец.
make installиз клона репозитория пока не кладёт стандартную библиотеку — программа сиспользует «Lists»вне клона библиотеку не найдёт. Ставьте flang черезinstall.sh, brew, asdf, deb или rpm: там библиотека есть.
Что сломалось
runна программе, которая не проходит проверку, отвечает кодом 1, а не 3. То же с--на-веру: согласие на недоказанное не снимает ошибок разбора, связывания и типов. Если скрипт ждал код 3, проверяйте ненулевой код или исправьте ошибку из сообщения.- Имя, которого нет в списке
только, теперь ошибкаFLANG_UNKNOWN_NAMEпри любом порядке строкиспользует. Раньше оно иногда проходило, если тот же модуль ввозил шире другой файл. Впишите имя в списоктолькоили уберите вызов. check --proofотвечает кодом 3, если часть утверждений держится только на примерах или на сетке значений. Раньше это был код 0 со словами «проверено с опорой». Например, наflang/stdlib/lists.flang(42 доказано, 24 на сетке) теперьНЕ ДОКАЗАНО — ОПОРА НЕ СУДИЛАСЬи код 3. Если сборка считала успехом только 0, докажите оставшиеся утверждения или примите 3 как «проверено не всё».
Описание языка
Разделы DESCRIPTION.md, изменённые с v0.7.28:
- Доказательства
- Модули и пакеты
- Команды
Prebuilt binaries and a one-command install, category laws are proved
What appeared
- Prebuilt binaries for Linux and macOS, installed with one command. No C compiler and no sudo:
curl -fsSL https://raw.githubusercontent.com/digitable-lol/flang/main/install.sh | shputsflanginto~/.local/binand checks the archive against the releaseSHA256SUMS. Other ways:brew install digitable-lol/tap/flang-package, asdf, deb and rpm packages. - A playground in the browser. On https://digitable-lol.github.io/flang/en/playground.html a program or a syllogism is checked right in the tab: the compiler is built to WebAssembly, nothing to install.
- An installed flang finds the standard library.
использует «Lists» только «Длина»(uses Lists, only Length) works in a program in any directory: the library sits inshare/flang/stdlibnext to the binary. Before, this worked only inside a clone of the repository. - The kernel proves the laws of a monoid, functor, isomorphism and natural transformation — for all values, not on a grid.
check --proofprints them in a section of their own, for example onflang/ct/yoneda-preorder.flang:законов утверждениями 9: доказано ядром 9, не доказано 0(laws as statements 9: proved by the kernel 9, not proved 0); in--jsonit is thelawClaimsfield. A law that is not proved is named. Monad laws are still computed on a grid. flang testrunsпрогон(run) blocks and checks their expectations. Each block counts as an example: a wrong expectation is exit code 1 and the messageу процесса «Счётчик» состояние {"всего":5}, а ожидалось {"всего":999}(process Counter has state 5, expected 999).check --proofprints the proof steps for most statements: which field or which call was unfolded and on which source line, for exampleход 1 поля ⟨«Пополнить» от ( счёт ) и сумма⟩ строка 15 …(step 1, fields, line 15). Some statements still show only the rule name.alwaysproperties of processes are checked by exploring a finite model. A model is processes, their states and rules "on this letter, move to that state and send these letters"; the exploration walks every order up to a given depth. The answer is either the shortest counterexample run or "not violated … this is not a proof". For the modelflang/concurrency/temporal/models/deadlock.flangthe answer isНАРУШЕНО, встречный прогон, шагов 6(violated, counterexample of 6 steps). Both proof checkers (in C and in Lean 4) replay such records on their own:ПЕРЕБОР СВЕРЕН: встречный прогон переигран, шагов 6, в конце свойство «без тупика» ложно.- The printed C is checked against a reference.
flang run-script translation:validateprints examples to C, builds them and compares the answers of the programs with the answers of a reference semantics in Lean 4:СООТВЕТСТВИЕ ПРОВЕРЕНО для 146 функций, вне валидации 4 … расхождений 0(146 functions agree, 0 differences). It rejects six deliberately broken versions of the printed C. - A grammar of Russian sentences on typed words.
flang run flang/ct/russian/parse.flang --function «Разобрать» --args '{"предложение":"мама читает книгу"}'answersграмматично: … связи: мама—читает, читает—книгу(grammatical, with the links), and for «мама читает книга» it answersне грамматично: неверный падеж(wrong case). - Unicode 17 in the standard library: normalization (
NFC,NFD), grapheme clusters, case-insensitive comparison and explicit decoding of bytes.«Графемы» от "👨👩👧🇷🇺"gives two graphemes;«Равны без учёта регистра» от "STRASSE" и "straße"givesда(true);«Раскодировать байты» от "UTF-8" и [104, 255]gives a refusal at position 2 with the reason «байт не может начинать знак UTF-8» (this byte cannot start a UTF-8 character). - In the
flang replshell you can write statements, theorems and syllogisms. The shell answers at once:утверждение «сложение перестановочно»: доказано (код 0)(proved), refuted with a counterexample, or not proved with the reason. - A reference semantics of the language core is written in Lean 4, and for every step the independent proof checker replays there is a Lean proof that the step is sound.
What changed
- An exported function may call a hidden helper of its own module. A program that imported such a module used to fail
check; now it passes, and calling the hidden function directly is aFLANG_UNKNOWN_NAMEerror that says the module declares it but does not export it. - A nested object is a clear error instead of a crash. The line
вложен объект(nested object) givesFLANG_PARSE … старое слово(an old word): declare the nested record as an object of its own and refer to it by a field. - Linking errors name the file, not only the line and column.
make installfrom a clone of the repository does not install the standard library yet, so a program withиспользует «Lists»outside the clone will not find it. Install flang withinstall.sh, brew, asdf, deb or rpm instead: those carry the library.
What broke
runon a program that does not pass checking exits with code 1, not 3. The same with--на-веру(on trust): consent to unproved code does not lift parse, link and type errors. If a script waited for code 3, test for a non-zero code or fix the error the message names.- A name missing from an
только(only) list is now aFLANG_UNKNOWN_NAMEerror, whatever the order of theиспользует(uses) lines. Before, it sometimes passed when another file imported the same module more widely. Add the name to theтолькоlist or remove the call. check --proofexits with code 3 when some statements rest only on examples or on a grid of values. Before, this was code 0 with the words "verified with a support". For example,flang/stdlib/lists.flang(42 proved, 24 on the grid) now answersНЕ ДОКАЗАНО — ОПОРА НЕ СУДИЛАСЬ(not proved, the support was not judged) with code 3. If your build treated only 0 as success, prove the remaining statements or accept 3 as "not everything was checked".
Страница выпусков: по-русски · in English.
Архив flang-0.7.29-c.tar.gz — исходники C99 и Makefile: make && sudo make install, Node не нужен. Или brew install digitable-lol/tap/flang.