FractalPark
FRM 수식 언어

FRM으로 프랙탈 작성하기

FractalPark의 검증된 FRM 하위 집합을 배우고, 소스가 GPU 셰이더가 되는 과정을 이해하며, 에디터가 사용하는 동일한 예제로 작동하는 수식 세 개를 만들어 보세요.

01

FRM이란 무엇인가요?

FRM은 반복 프랙탈을 설명하는 간결한 텍스트 기반 방식이에요. 수식은 시작 상태, 각 오빗마다 반복되는 계산, 그리고 반복을 계속할지 결정하는 조건을 정의해요.

이 형식은 렌더링 프로그램을 다시 빌드하지 않고도 실험을 교환할 수 있게 해준 수식 파일이 있는 Fractint 생태계에서 성장했어요. FractalPark은 완전한 호환성을 주장하는 대신 자체 검증된 하위 집합을 문서화하면서 그 저작 아이디어를 브라우저 워크플로우로 옮겨왔어요.

더 넓은 프로젝트의 기원과 역사에 대해서는 다음을 참조하세요: Fractint 프로젝트 사이트.

02

FractalPark의 FRM 지원

FractalPark은 의도적으로 설계된 FRM 하위 집합을 토큰화·파싱·검증·컴파일해요. 아래 표는 직접 작동하는 구성, 문서화된 FractalPark 의미론을 가진 구성, 현재 워크플로우가 보존할 수 없는 구성을 구분해요.

수준의미검증된 범위
지원됨컴파일러 테스트로 검증되며 의미론적 제약 없이 사용할 수 있어요.
  • 소스 문서당 수식 선언 하나
  • init, loop, bailout 섹션
  • 할당 및 사용자 변수
  • 실수·복소수 리터럴; 산술, 비교, 논리, 단항, 크기(magnitude) 표현식
  • if / elseif / else / endif 분기
  • z, c, pixel, zPrev, p1–p5, 상수, 검증된 내장 함수
  • FRM 주석
  • 구조화된 진단 및 FRM-to-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

수식 구조

FractalPark FRM 수식은 이름 있는 선언 하나와 세 개의 명시적 섹션으로 구성돼요. 이들이 함께 모든 픽셀의 상태 전이를 정의해요.

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

스타터 만델브로

가장 작은 이탈 시간(escape-time) 수식으로, 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의 현재 컴파일러 계약을 구분할 수 있어요.