FractalPark
Язык формул FRM

Создавайте фракталы на FRM

Изучите проверенное подмножество FRM FractalPark, поймите, как исходный код превращается в GPU-шейдер, и соберите три рабочие формулы на тех же примерах, что использует редактор.

01

Что такое FRM

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

Формат вырос из экосистемы Fractint, где файлы формул позволяли обмениваться экспериментами без пересборки программы рендеринга. FractalPark переносит эту идею создания формул в браузерный рабочий процесс, документируя собственное проверенное подмножество вместо заявления о полной совместимости.

Об истоках и истории более широкого проекта см. сайт проекта Fractint.

02

Поддержка FRM в FractalPark

FractalPark токенизирует, разбирает, проверяет и компилирует продуманное подмножество FRM. Таблица разделяет конструкции, которые работают напрямую, конструкции с документированной семантикой FractalPark и конструкции, которые текущий рабочий процесс не может сохранить.

УровеньЗначениеПроверенный охват
ПоддерживаетсяПокрыто тестами компилятора и пригодно к использованию без семантических оговорок.
  • Одно объявление формулы на исходный документ
  • секции init, loop и bailout
  • присваивания и пользовательские переменные
  • вещественные и комплексные литералы; арифметические, сравнительные, логические, унарные выражения и выражения величины
  • ветви if / elseif / else / endif
  • z, c, pixel, zPrev, p1–p5, константы и проверенные встроенные функции
  • комментарии FRM
  • структурированная диагностика и сопоставление исходного кода FRM с GLSL
АдаптированоПринимается с документированным семантическим отличием или как расширение FractalPark.
  • ismand соответствует текущему режиму выполнения Мандельброт/Жюлиа в FractalPark
  • fn1–fn4 используют диспетчеризацию функций на этапе компиляции
  • @mode: native, @default-view и @default-coloring — это расширения FractalPark; директивы по умолчанию действуют только в нативном режиме
Не поддерживаетсяНе сохраняется текущим компилятором или файловым рабочим процессом; отклоняется, а не молча переписывается.
  • выбор одной из нескольких формул в одном файле
  • автоматическое преобразование классических диалектов Fractint
  • произвольные директивы исходного кода
  • не-ASCII идентификаторы
  • пользовательские функции или макросы
  • возможности препроцессора
  • любые конструкции, отклоняемые текущим конвейером компиляции

Это проверенный базовый уровень совместимости, а не заявление о полной совместимости с Fractint. Когда меняется компилятор, эта матрица и её тесты должны меняться вместе.

Проверенная совместимость

Эти показатели возможностей взяты из версионированного манифеста: 588 целевых записей включают 579 прохождений strict-v2 и 9 документированных отступлений; 117 отдельных записей исключены по стабильным причинам.

Целевые записи
588
Прохождения strict-v2
579
Документированные отступления
9
Исключены с указанием причин
117
Типы дескрипторов bailout
4
Встроенные функции
20

Дескрипторы bailout

  • C1
  • C2
  • C4R
  • C5

Стабильные причины отклонения

  • unknown-predicate
  • unknown-magnitude-form
  • threshold-not-loop-invariant
  • chained-logical

Встроенные функции

  • sin
  • cos
  • tan
  • sinh
  • cosh
  • tanh
  • exp
  • log
  • sqrt
  • abs
  • sqr
  • conj
  • flip
  • recip
  • cabs
  • real
  • imag
  • atan2
  • cosxx
  • cotanh

Параметры: p1, p2, p3, p4, p5 · Слоты функций: fn1, fn2, fn3, fn4

Манифест возможностей v1 · Строгая семантика v2

03

Анатомия формулы

FRM-формула FractalPark состоит из одного именованного объявления и трёх явных секций. Вместе они определяют переход состояния для каждого пикселя.

01

init:

Выполняется один раз для пикселя. Здесь задайте начальное значение орбиты и вспомогательные переменные.

02

loop:

Выполняется один раз за итерацию. Обновите z и любое состояние, необходимое следующей итерации.

03

bailout:

Возвращает условие продолжения орбиты. Когда оно становится ложным, точка вышла за пределы.

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

04

Руководство по синтаксису

Язык намеренно остаётся небольшим: выражения описывают комплексную арифметику, операторы обновляют состояние орбиты, а управляющие конструкции выбирают между обновлениями.

Объявление и секции
Заключите одну именованную формулу в фигурные скобки, затем напишите init:, loop: и bailout: в этом порядке.
Значения и переменные
Используйте вещественные числа, например 0.15, комплексные пары, например (0.05, -0.02), встроенные значения орбиты или собственные присвоенные переменные.
Выражения
Арифметические операции, степени, сравнения, логические операторы, унарные операторы, синтаксис величины |z| и проверенные комплексные функции можно комбинировать.
Управляющие конструкции
Используйте if, elseif, else и endif, когда обновление орбиты зависит от условия. Блоки должны быть сбалансированы.
Встроенные элементы
Основные имена включают z, c, pixel, zPrev, p1–p5, pi, e, maxit, ismand, fn1–fn4 и функции, покрытые тестами компилятора.
Комментарии и директивы
Комментарии с точкой с запятой документируют исходный код. Распознаваемые директивы @ настраивают нативное поведение FractalPark; неизвестные директивы не игнорируются молча.
05

Конвейер: FRM → AST → GLSL

FractalPark не вставляет текст FRM в шейдер. Он прогоняет исходный код через поэтапный компилятор, чтобы синтаксис, смысл, сгенерированный код и диагностика оставались связанными.

  1. 1

    Исходный код FRM

    Точный текст из редактора, вставки или локального файла является авторитетными входными данными.

  2. 2

    Токены лексера

    Лексер распознаёт имена, числа, операторы, маркеры секций, комментарии и директивы, сохраняя позиции в исходном коде.

  3. 3

    Разобранное AST

    Парсер строит структурированное дерево формулы и сообщает о некорректных объявлениях, выражениях и блоках управления.

  4. 4

    Проверка и каноническая форма

    Валидатор проверяет имена, типы, секции и поддерживаемую семантику перед созданием канонической формулы.

  5. 5

    GLSL и карта исходного кода

    Генерация кода создаёт шейдерные функции и фиксирует сопоставления сгенерированного GLSL с исходным кодом FRM.

  6. 6

    Плагин формулы

    Успешная компиляция превращается в тот же контракт плагина формулы, который используют рендерер и система сборки шейдеров.

Общий контракт компилятора держит Обзор, отдельный редактор, сохранённые пользовательские формулы, примеры и тесты на одном пути реализации.

06

Пошаговые уроки

Эти примеры идут от простейшей квадратичной формулы к параметрам и обратной связи с состоянием. Каждый блок исходного кода взят непосредственно из общего реестра примеров и компилируется во время тестов.

Урок 1

Стартовое множество Мандельброта

Простейшая формула времени убегания — удобна для первого знакомства со структурой init / loop / bailout.

В центре внимания: объявление и структура init / loop / bailout. Меняйте показатель степени или порог убегания только после того, как эта версия скомпилируется.

starter-brot.frm
StarterBrot {
init:
  z = 0
loop:
  z = z^2 + c
bailout:
  |z| < 4
}

Урок 2

Дрейф параметров

Демонстрирует слоты параметров p1 / p2 и разницу между cabs и |z|.

В центре внимания: слоты параметров p1 и p2, комплексный литерал и cabs(z) как явная функция величины.

parameter-drift.frm
ParameterDrift {
init:
  z = 0
loop:
  z = z^2 + c + p1 * 0.15 + p2 * (0.05, -0.02)
bailout:
  cabs(z) < 8
}

Урок 3

Эхо орбиты

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

В центре внимания: zPrev как предыдущее состояние орбиты. Обратная связь добавляет память без введения второй вручную управляемой переменной состояния.

orbit-echo.frm
OrbitEcho {
init:
  z = pixel
loop:
  z = sqr(z) + zPrev * (0.30, -0.12) + pixel * (0.85, 0.0)
bailout:
  |z| < 48
}

Редактор FRM открывает эти же примеры, проверенные компиляцией, по стабильному ID. Исходный код формулы остаётся только на текущей вкладке, пока вы не сохраните его в облачной библиотеке формул, и никогда не встраивается в URL.

07

Ошибки и диагностика

Компиляция останавливается на самой ранней небезопасной стадии и сообщает сообщения, привязанные к исходному коду. Отклонённая конструкция никогда не переписывается во что-то лишь похожее.

Лексические ошибки

Неожиданные символы и неподдерживаемые идентификаторы сообщаются с указанием строки и столбца.

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

Некорректные секции, выражения или блоки управления диагностируются до семантической проверки.

Ошибки проверки

Неизвестные переменные, недопустимые присваивания, несоответствие типов и неподдерживаемая семантика не позволяют генерировать код.

Сопоставление исходного кода шейдера

Сгенерированный GLSL сохраняет сопоставления, позволяющие связать сбой компиляции шейдера с исходной позицией FRM.

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

08

Обмен и публикация

Написанная вами формула приватна, пока вы не решите иначе. Есть три способа её распространения — каждый явный, ни один не молчаливый.

  • Приватно по умолчанию

    Формулы хранятся в вашей облачной библиотеке и видны только вам. Сохранённые работы содержат копию исходного кода формулы внутри черновика, поэтому они всегда открываются в том виде, в котором вы их оставили.

  • Скачайте файл .frm

    Ваша формула — это обычный текст. Скачайте её из раздела «Мои формулы» в любое время и храните собственную копию — без запросов на экспорт и ожидания.

  • Опубликуйте работу, поделитесь исходным кодом

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

Полный текст лицензии MIT находится на opensource.org.

09

Примеры, следующие шаги и ссылки

Посмотрите на рендерер в контексте

Откройте Обзор, чтобы сравнить поведение встроенных формул, раскраску, трансформации, анимацию и элементы управления экспортом, прежде чем писать собственную формулу.

Открыть Обзор

Используйте специальный редактор FRM, чтобы компилировать, просматривать, импортировать и скачивать формулы; войдите, чтобы сохранить формулу в облачной библиотеке, прежде чем передать её в Обзор.

Ссылки

Исторический контекст и детали реализации указаны отдельными ссылками, чтобы руководство могло отличать наследие Fractint от текущего контракта компилятора FractalPark.