flang — полный язык поверх FTS Чего в языке пока нет: проверенный список
0%

Чего в языке пока нет: проверенный список

Чего в языке пока нет: проверенный список

В репозитории есть редкая вещь: язык ведёт список собственных недостач. Файл flang/examples/leetcode/index.json содержит раздел «чего не хватает языку» — шестнадцать пунктов с объяснениями, и раздел «невыразимые» — задачи LeetCode, которые на flang не пишутся, с указанием причины.

Список честный, но у него есть особенность, о которой стоит знать: он местами отстаёт от кода на несколько часов. Язык менялся быстрее, чем обновлялся файл. Поэтому ниже каждый пункт перепроверен запуском.

Что уже починили

Пять пунктов списка на момент нашей проверки неверны. Приводим их, потому что иначе вы прочитаете index.json и поверите.

Связывание модулей — работает

В списке: «Заголовок „модуль … использует …“ разбирается, но связывания между файлами нет […] Стандартной библиотекой нельзя воспользоваться из решения».

На деле работает. flang/examples/import-check.flang подключает «Списки» и успешно прогоняет 46 примеров — свой один плюс сорок пять пришедших вместе с функциями стандартной библиотеки. Разбор — в главе «Стандартная библиотека».

Структурное сравнение в примерах — работает

В списке: примеры, возвращающие список или запись, «считаются провалившимися, даже когда значения совпадают поэлементно. Команда „flang test“ на таких файлах не работает».

На деле flang test flang/stdlib/lists.flang даёт 45 из 45, и среди этих примеров множество списочных.

Встроенная форма «символ» — работает

В списке: расхождение порядка аргументов между парсером и тайпчекером, «любое использование формы „символ“ не проходит check».

Проверяем:

тотальная функция «Взять символ»
  принимает текст: строка, номер: число
  возвращает строка
  пример «Второй символ»
    дано текст равно "мир"
    дано номер равно 2
    ожидается "и"
  символ номер в текст

Проходит check и test.

Вариант как значение примера — работает

В списке: parseLiteralValue «сворачивает конструктор варианта в запись из его полей и теряет имя варианта», поэтому функция, принимающая или возвращающая сумму типов, примера иметь не может.

Это же ограничение объясняет структуру flang/stdlib/optional.flang и result.flang: там половина функций помечена комментарием // Без примера: … и обложена скалярными обёртками.

Проверяем обе стороны:

тотальная функция «Есть значение»
  принимает опция: «Число или ничто»
  возвращает признак
  пример «Есть»
    дано опция равно вариант «Есть число» с значение равным 5
    ожидается да
  пример «Нет»
    дано опция равно вариант «Нет числа»
    ожидается нет
  разбор опция
    случай вариант «Есть число» с значение как зн
      то да
    случай «Нет числа»
      то нет

Оба примера проходят. Ограничение снято, но комментарии в стандартной библиотеке про него ещё стоят.

Вызов функции без аргументов — работает

В списке: «Применение записывается только как „Имя“ от аргумента, поэтому функцию с пустым списком параметров вызвать нечем».

На деле функция без параметров объявляется и вызывается — именем без от:

тотальная функция «Константа»
  возвращает число
  42

тотальная функция «Использовать»
  принимает н: число
  возвращает число
  пример «Плюс константа»
    дано н равно 1
    ожидается 43
  н плюс «Константа»

Пример проходит.

Чего действительно нет

Проверено запуском на момент фиксации.

Логических операций

Ни и, ни или, ни не для признаков:

$ … а и б
{"code":"FLANG_PARSE","message":"не разобрана конструкция: у функции больше одного тела"}

$ … не а
{"code":"FLANG_UNKNOWN_NAME","message":"имя «не» не связано"}

Слово и в языке занято: оно разделяет аргументы вызова и поля конструктора. Конъюнкция пишется вложенными если, отрицание — сравнением равен нет. Читается заметно хуже написанного условия — так и записано в списке.

Псевдонимов типов

Спецификация показывает тип «Строка счёта» это список «Позиция». Пробуем:

$ тип «Строка счёта» это список числа
  … длина с
{"code":"FLANG_UNKNOWN_NAME","message":"имя «длина» не связано"}

Объявление разбирается, но types.mjs раскладывает объявления только на суммы и записи, и псевдоним становится записью без полей — списком он не является. В корпусе .flang-файлов псевдонимов нет ни одного.

Разбора строк по образцу

Образцы пусто и голова и хвост работают только со списком. Любой посимвольный проход — обычная функция, вне тотального класса. В списке это названо самой дорогой недостачей: «она одна делает нетотальными задачи 13, 14, 20, 125».

Убывания по мере

Анализ завершаемости знает только структурное убывание. n − 1, алгоритм Евклида, двоичный поиск по границам — всё FLANG_NOT_TOTAL, хотя завершается очевидно. Разбор — в главе «Тотальность».

Словаря и множества

Нет ни ассоциативного массива, ни множества. Каждая задача «посчитай, сколько раз встретилось» превращается из O(n) в O(n²). В решении про анаграммы вместо словаря — список записей и линейный поиск по ключу, с прямо посчитанной ценой: «O(слов × групп × 26) вместо O(суммарной длины)».

Индексного доступа

Список читается только с головы; «Элемент по номеру» пишется рекурсией и стоит O(n). Кучи, таблицы динамики и двумерные сетки на этом ломаются.

Порядка на строках

{"code":"FLANG_TYPE","message":"левый операнд сравнения «gt» имеет тип строка:
 сравнения порядка допустимы только для чисел"}

Сортировка строк невыразима. Уточнение к списку: там этот пункт описан как расхождение слоёв, при котором программа проходит проверку и падает при запуске. Сейчас отказ приходит на check — то есть до запуска. Само ограничение осталось, диагностика стала лучше.

Параметрического полиморфизма

«Обратить» для списка чисел и для списка строк — две функции с одинаковым телом. Подробнее — глава «Система типов».

Обработки ошибок

Отказ встроенной формы прекращает вычисление целиком и не перехватывается. Проверять пригодность аргумента приходится заранее, «а выразить эту проверку удаётся не всегда».

Литерала записи

$ … дано поз равно {цена: 10, количество: 3}
{"code":"FLANG_PARSE","message":"не разобрана конструкция: неожиданное '{'"}

Записи строятся только конструктором запись «Имя» с поле равным ….

Двух встроенных форм, до которых не добраться

пусто в позиции выражения всегда читается как литерал пустого списка, поэтому до одноимённой формы (проверка «список или строка пусты») из исходника не добраться — пишется (длина x) равен 0. Аналогично соединить X с Y всегда даёт склейку двух строк, а списочная форма из builtins.mjs недоступна; в flang/stdlib/strings.flang она написана заново.

Изменяемого состояния и объектов с методами

По устройству языка. Из-за этого невыразимы целые классы задач — в разделе «невыразимые» это LRU Cache и Min Stack: «задача формулируется как API из четырёх операций над разделяемым состоянием».

Чего нет вокруг языка

Отдельный список, не менее важный при оценке.

Подсветки синтаксиса. Каталог editors/ содержит tree-sitter, расширение VS Code, лексер Chroma и запись Linguist — всё для .fts. Для .flang нет ничего. Ваш редактор покажет эти файлы простым текстом.

LSP, форматирования, линтера. Команда fmt заявлена в разделе 6 спецификации, но CLI отвечает unknown command 'fmt'. Сервер языка в репозитории есть — tools/ftsls, — и он тоже целиком про .fts: слово flang в нём не встречается ни разу. Из девяти инструментов tools/ flang вообще упомянут в одном, gasearch, и то в разделе «Что переедет на flang» — то есть как план, а не как поддержка.

Пакета и пакетного менеджера. package.json помечен "private": true и называется @digitable/fts; отдельного пакета flang нет. Установка — только клонированием. Репозиторий это признаёт прямо: в разделе Status README.md записано, что пакет не опубликован и «каждая команда выше запускается через node из клона».

Замеров производительности. Стенд в benchmarks/ меряет компиляцию и валидацию FTS-модели. Ни интерпретатор flang, ни сгенерированный им код в репозитории не измерены.

Руководства и туториала. Здесь за последние часы стало заметно лучше, и это стоит отметить: README.md переписан от языка, у него появился русский двойник README.ru.md, есть раздел «How FTS and flang relate» и рабочие примеры запуска. Но это по-прежнему README, а не руководство. Каталог docs/ в корне — про FTS; у самого flang есть SPEC.md, core/SPEC.md, комментарии в исходниках и index.json. Пути «от нуля до своей программы» не написано.

Сообщества и пользователей. Репозиторий создан 3 августа 2026 года.

Как этим пользоваться

Список выше — не приговор, а срез. Пять пунктов из шестнадцати починили за несколько часов до нашей проверки; вероятно, к моменту чтения починили ещё что-то.

Это не риторическая фигура: пока трек готовился к публикации, у языка появились два новых бэкенда кодогенерации, а парсер ядра FTS на flang научился разбирать скобочный диалект и сошёлся с эталоном на всех 56 моделях вместо 53. Каждый абзац этой главы пришлось перепроверять запуском второй раз — и часть глав трека переписывать. index.json при этом не менялся вовсе, то есть отстал ещё сильнее.

Отсюда практический совет: не верьте ни этой статье, ни index.json, а проверьте запуском. Цикл короткий — node flang/bin/flang.mjs check файл.flang работает без установки и без сборки, а отказ приходит с кодом, сообщением и позицией. Три минуты на проверку надёжнее любого текста о суточном языке, включая этот.

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

Дальше — глава «Как читать репозиторий», про то, как в этом разбираться дальше.

Нашли неточность? Выделите фрагмент текста — рядом появится жучок.

Нужен разбор именно вашей ситуации?

Статья описывает общий случай. Если у вас частный — можно разобрать его отдельно, платно. А если не хватает целого материала, предложите тему: её оплачивают вскладчину, и она выходит открытой для всех.

Доска запросов
Дальше