Files
bara-lang/docs/ARCHITECTURE.bg.md
T

4.1 KiB
Raw Blame History

Архитектура на Clojure/Nim

Общ Преглед

Clojure/Nim е компилатор, не интерпретатор. Следва модела на ClojureScript: Clojure изходният код се чете, разширява с макроси, анализира и се генерира като Nim изходен код, който после се компилира до C и накрая до native бинарен файл.

Компилационен Пайплайн

┌─────────────┐
│  .clj Файл  │
└──────┬──────┘
       │
  ┌────▼────┐
  │ Reader  │  ← EDN парсер. Произвежда Clojure структури от данни.
  └────┬────┘
       │
  ┌────▼────┐
  │ Макроси │  ← Разширение на defmacro. Работи върху Clojure данни.
  └────┬────┘
       │
  ┌────▼────┐
  │Анализатор│  ← Специални форми, locals, анализ на closures.
  └────┬────┘
       │
  ┌────▼────┐
  │ Генератор│  ← Генерира Nim AST / изходен код.
  └────┬────┘
       │
  ┌────▼────┐
  │ Nim CC  │  ← Nim → C компилация.
  └────┬────┘
       │
  ┌────▼────┐
  │   C CC  │  ← C → машинен код (GCC/Clang).
  └────┬────┘
       │
  ┌────▼────┐
  │  Бинарен│  ← Единичен native изпълним файл.
  └─────────┘

Ключови Дизайн Решения

1. AOT Компилатор

Компилираме предварително (ahead-of-time), като ClojureScript. Това ни дава:

  • Бързо изпълнение (скорост на C)
  • Малък размер на бинарния файл
  • Без overhead на интерпретатор

Компромисът е, че компилацията в REPL е по-бавна (всяка форма се компилира индивидуално).

2. Clojure Макроси върху Clojure Данни

Разширяването на макроси става преди да стигнем до Nim. Nim никога не вижда Clojure макроси:

(defmacro unless [condition & body]
  `(if (not ~condition)
     (do ~@body)))

Този макро оперира върху CljVal обекти (Clojure списъци, символи), не върху Nim AST.

3. Runtime в Nim

Модулът lib/cljnim_runtime.nim предоставя:

  • CljVal — tagged union, представящ всички Clojure стойности
  • cljAdd, cljMul, и т.н. — полиморфна аритметика
  • cljRepr — текстово представяне

4. Nim Interop (Бъдеще)

Вместо Java interop, ще имаме Nim interop:

(nim/import "strutils")
(nim/call "strutils.join" ", " ["a" "b"])

Отговорности на Модулите

Модул Роля
src/reader.nim Парсира .clj текст към CljVal AST
src/emitter.nim Трансформира CljVal AST в Nim изходен код
src/repl.nim Имплементация на human и AI REPL
src/types.nim Типове на AST възли (използват се от reader/emitter)
src/macros.nim Двигател за разширяване на макроси
src/runtime.nim Допълнителни runtime помощници
lib/cljnim_runtime.nim Основна runtime библиотека

Модел на Паметта

  • Използва Nim's ORC garbage collector
  • CljVal е ref object (заделя се на heap)
  • Бъдеще: persistent структури от данни използват структурно споделяне