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

К README · Указатель документации

Зачем это нужно

Здесь правило написано один раз и в той форме, которую читает человек из предметной области, а не только программист (фрагмент examples/library-api/lib/fine.flang):

объект «Просроченная выдача»
  «дней просрочки»: число
  «книга редкая»: признак

тотальная функция «Рассчитать штраф»
  принимает «выдача»: «Просроченная выдача»
  возвращает число
  обеспечивает «Штраф ограничен» результат не больше 500
  пример «Вернули вовремя»
    дано «выдача» равно (запись «Просроченная выдача» с «дней просрочки» равным 0 и «книга редкая» равным нет)
    ожидается 0
  пример «Две недели и редкая книга»
    дано «выдача» равно (запись «Просроченная выдача» с «дней просрочки» равным 14 и «книга редкая» равным да)
    ожидается 500
  пусть «дней» равно («выдача».«дней просрочки»)
  пусть «редкая» равно («выдача».«книга редкая»)
  пусть «за просрочку» равно если «дней» больше 0 то 50 иначе 0
  пусть «за долгую» равно если «дней» не меньше 14 то 150 иначе 0
  пусть «за редкую» равно если («редкая» равен да) и притом («дней» больше 0) то 300 иначе 0
  («за просрочку» плюс «за долгую») плюс «за редкую»

Ни фигурных скобок, ни стрелок, ни точек с запятой: поверхность отступная и словесная, а читаемые имена берутся в кавычки-ёлочки.

Три вещи здесь стоят рядом с телом функции и уезжают вместе с ним. Примеры — не тесты в соседнем файле, а часть объявления: flang test находит их сам. обеспечивает — обещание о результате на любом входе, а не на перечисленных. тотальная — признак, за который отвечает компилятор: он либо доказывает завершение сам (композицией, структурой или точным шагом по натуральному), либо требует, чтобы меру назвал автор (убывает), и тогда ставит сторожа НА ВРЕМЯ РАБОТЫ. Второе — не доказательство: flang check отвечает 0, а не убывшая мера валит программу отказом FLANG_MEASURE уже на прогоне. Чем несётся обещание у каждой функции, говорит flang check --proof; разбор — «Что даёт признак тотальная».

Из этого единственного исходника получаются реализация, примеры и проверки — сразу на восьми языках. обеспечивает выше не комментарий: оно превращается в постусловие напечатанного кода.

flang emit examples/library-api/lib/fine.flang --target python --out вывод

даёт в вывод/shtrafy.py, дословно:

    # постусловие «Штраф ограничен»
    if not rt.post(ctx, rt.lte(ctx, _t5, rt.number(500.0)), "Штраф ограничен", "Рассчитать штраф"):
        raise rt.fail("FLANG_PROPERTY", "нарушено свойство «Штраф ограничен» функции «Рассчитать штраф»")

FLANG_PROPERTY — собственный код языка, и формулировка сообщения тоже его. Служба на Python, служба на Go и бинарник на C, напечатанные из этой функции, откажут одному и тому же входу одними и теми же словами. Вот что «единый источник правды» обязан означать, чтобы чего-то стоить.