Pipeline de compilación

Forja tiene un pipeline de 10+ fases que transforma código fuente .fa en código Rust, bytecode ejecutable (para 2 VMs), assembly nativo, LLVM IR, o ejecutables autónomos.

🔀 Flujo completo del pipeline
flowchart TB
    subgraph SRC["📄 Código Fuente"]
        S(["`**source.fa**`"])
    end
    subgraph LEX["FASE 1 · Lexer"]
        L(["`**Lexer** lexer.rs
            texto → tokens`"])
    end
    subgraph PAR["FASES 2-3 · Parser"]
        P(["`**Parser** parser.rs
            tokens → AST
            _recursive descent_`"])
    end
    subgraph SEM["FASE 4 · Semántica"]
        TC(["`**Type Checker**
            semantics.rs
            inferencia de tipos`"])
        BC(["`**Borrow Checker**
            semantics.rs
            ownership · scoping`"])
    end
    subgraph OPT["FASE 4c · Optimización"]
        O(["`**Optimizer** optimizer.rs
            constant folding
            dead code elimination`"])
    end
    subgraph GEN["FASE 5 · Generación"]
        TR(["`**Transpilador**
            transpiler.rs
            Forja → Rust`"])
        BG(["`**Bytecode**
            bytecode.rs
            AST → Opcodes`"])
        UO(["`**Uops**
            uops.rs
            micro-opcodes`"])
        AS(["`**Compilador ASM**
            compiler_asm.rs
            Forja → Assembly`"])
    end
    subgraph VM["FASE 6 · Ejecución"]
        V3(["`**VM v3 DT**
            vm_jit.rs
            direct threading`"])
        V5(["`**VM v5 Fast** 🏆
            vm_fast.rs
            NaN tagging`"])
        J(["`**NativeJIT**
            jit.rs + jit_engine.rs
            código máquina`"])
        G(["`**gcc -O2** → .exe`"])
    end
    subgraph DIST["FASE 7 · Distribución"]
        A(["`**AOT + Selfrun**
            aot.rs + selfrun.rs
            .exe autónomo`"])
        W(["`**WASM**
            forja-wasm
            playground web`"])
    end

    S --> L --> P --> TC --> BC --> O
    O --> TR & BG & AS
    BG --> UO
    UO --> V3 & V5
    V5 --> J
    AS --> G --> A
    J --> A --> W

    TR -.-> R(["`📄 Rust (.rs)`"])
    UO -.-> B(["`💾 Bytecode (.fbc)`"])
    AS -.-> Sa(["`📄 Assembly (.s)`"])
    G -.-> E(["`⚡ Ejecutable (.exe)`"])
    W -.-> Pg(["`🌐 WebAssembly`"])

    classDef src fill:#2d2d3d,stroke:#7c7c9e,color:#fff
    classDef lx fill:#1a3a5c,stroke:#4a8ccf,color:#e0e0e0
    classDef pr fill:#2d5a1e,stroke:#5cb84a,color:#e0e0e0
    classDef sm fill:#5a2d1e,stroke:#c8783a,color:#e0e0e0
    classDef op fill:#3a2d5a,stroke:#8a5ac8,color:#e0e0e0
    classDef gn fill:#1e3a3a,stroke:#3aa0a0,color:#e0e0e0
    classDef vm fill:#3a1e3a,stroke:#c060c0,color:#e0e0e0
    classDef ds fill:#2a2a1e,stroke:#a0a040,color:#e0e0e0
    classDef ot fill:#333,stroke:#666,color:#999,stroke-dasharray:4 4

    class S src; class L lx; class P pr; class TC,BC sm; class O op
    class TR,BG,UO,AS gn; class V3,V5,J,G vm; class A,W ds
    class R,B,Sa,E,Pg ot
  

Rutas según el comando

flowchart LR
    C1["`**forja run**`"] --> R1["Lexer → Parser → TC → BC → Opt → Bytecode → Uops → **ForjaFast v5**"]
    C2["`**forja build**`"] --> R2["Lexer → Parser → TC → BC → Opt → Bytecode → **AOT + Selfrun** → .exe"]
    C3["`**forja build-asm**`"] --> R3["Lexer → Parser → **Compiler ASM** → .s → gcc −O2 → .exe"]
    C4["`**forja .fa**`"] --> R4["Lexer → Parser → TC → BC → Opt → **Transpilador** → Rust (.rs)"]
    C5["`**forja repl**`"] --> R5["Lexer → Parser → Bytecode → **ForjaFast**"]
    C6["`**forja fmt**`"] --> R6["Lexer → Parser → **Formatter**"]
    C7["`**forja diagrama**`"] --> R7["Lexer → Parser → **DiagramGenerator** → HTML"]

    classDef cmd fill:#1a1a2e,stroke:#4a4a8f,color:#fff
    classDef rt fill:#1e3a2e,stroke:#3aa060,color:#e0e0e0
    class C1,C2,C3,C4,C5,C6,C7 cmd
    class R1,R2,R3,R4,R5,R6,R7 rt
  

Fases del pipeline

flowchart TB
    F1["1 · Lexer · lexer.rs · texto → Vec<Token>"]
    F2["2-3 · Parser · parser.rs · Vec<Token> → Programa (AST)"]
    F4A["4a · Type Checker · semantics.rs · inferencia de tipos"]
    F4B["4b · Borrow Checker · semantics.rs · ownership · scoping"]
    F4C["4c · Optimizer · optimizer.rs · constant folding + DCE"]
    F5A["5a · Transpilador · transpiler.rs · AST → Rust (.rs)"]
    F5B["5b · Bytecode · bytecode.rs + uops.rs · AST → Opcodes → Uops"]
    F5D["5d · Assembly · compiler_asm.rs · AST → .s (x86-64 / ARM64)"]
    F6A["6a · VMs · vm_jit.rs / vm_fast.rs · bytecode → Output"]
    F6B["6b · JIT Engine · jit_engine.rs + jit.rs · código máquina"]
    F7["7 · AOT + Selfrun · aot.rs + selfrun.rs · .exe autónomo"]

    F1 --> F2 --> F4A --> F4B --> F4C
    F4C --> F5A & F5B & F5D
    F5B --> F6A & F6B
    F6A & F6B --> F7

    classDef ph fill:#1a2a3a,stroke:#4a7a9f,color:#e0e0e0
    class F1,F2,F4A,F4B,F4C,F5A,F5B,F5D,F6A,F6B,F7 ph
  

Los 60+ módulos del proyecto

🎯

main.rs

CLI — 20+ comandos, punto de entrada

📚

lib.rs

API pública: compilar(), ejecutar()

🔤

token.rs

Definición de tokens del lenguaje

📖

lexer.rs

Tokenizador (texto → tokens)

🌳

ast.rs

AST definitions (nodos del árbol)

🔧

parser.rs

Parsing recursivo descendente

🚫

error.rs

Sistema de errores educativo + JSON

🔍

semantics.rs

Type Checker + Borrow Checker

⚙️

monomorph.rs

Monomorfización de genéricos

🦀

transpiler.rs

Forja → Rust (código compilable)

compiler_asm.rs

Forja → Assembly (3413 líneas)

compiler_llvm.rs

Forja → LLVM IR

🔀

ir.rs / ir_ssa.rs

Mid-level IR en SSA con φ-nodes

🔀

ir_constructor.rs

AST → IR SSA

🔀

ir_to_bytecode.rs

IR SSA → bytecode

🪟

stack_to_reg.rs

Stack → registros virtuales

🪟

register_ir.rs

IR de registros + live intervals

🪟

register_alloc.rs

Linear scan + spill

🪟

codegen_reg.rs

Generación x86-64 con REX

💾

bytecode.rs

Generación bytecode (5107 líneas)

🔬

uops.rs

Micro-opcodes (832 líneas)

vm_jit.rs v3 DT

Direct Threading (1570 líneas)

🚀

vm_fast.rs v5 🏆

NaN tagging, producción (8694 líneas)

🌀

gc.rs / gc_intrinsics.rs

GC generacional + safe points

🧱

arena.rs / shape.rs

Arena allocator + shapes de objetos

🔥

jit.rs

NativeJIT x86-64 (20+ opcodes)

🔀

jit_engine.rs

Orquestador JIT + fallback

📶

jit_tiered.rs

JIT tiered + OSR + deopt

📈

pgo.rs

Optimización guiada por perfiles

💾

incremental_cache.rs

Cache de compilación incremental

📐

optimizer.rs

Constant folding + DCE (2743 líneas)

🎨

formatter.rs

Formateador de código

📊

diagrama.rs

Diagramas HTML del AST

💬

repl.rs

REPL interactivo

📦

aot.rs

Compilador AOT (.exe autónomo)

🏃

selfrun.rs

Bytecode embed + auto-ejecución

🧩

module.rs

Resolvedor módulos (+ anti path traversal)

📋

prelude.rs

Prelude del lenguaje

🔗

ffi.rs

Llamadas a librerías nativas (C)

📦

package_resolver.rs

Resolución de paquetes

⚙️

package_config.rs

Configuración forja.json

📈

fprofiler.rs

Profiler integrado

🖥️

forja_lsp.rs

Servidor LSP + VSCode

🌐

forja-wasm

Bindings WASM para playground

🖼️

forja-wasm-gui

GUI en Canvas 2D (WASM)

🤖

forja-android-rt

VM Forja en Android (JNI)

🖼️

forja-gui-rt

GUI nativa (Xilem)

API pública (lib.rs)

Estas son las funciones principales que expone la biblioteca para usar Forja desde Rust:

📄 API de compilación y ejecución
/// Compila .fa → código Rust (pipeline completo con Optimizer)
pub fn compilar(source: &str) -> Result<String, Vec<ErrorForja>>;

/// Compila y ejecuta código Forja en ForjaFast v5 (VM producción)
pub fn ejecutar(source: &str) -> Result<Vec<String>, String>;

/// Compila y ejecuta con JIT Nativo (x86-64), fallback a ForjaFast
pub fn ejecutar_jit(source: &str) -> Result<Vec<String>, String>;

La función compilar() ejecuta: Lexer → Parser → Type Checker → Borrow Checker → Optimizer → DCE → Transpilador.
La función ejecutar() ejecuta: Lexer → Parser → Type Checker → Optimizer → DCE → Bytecode Generator → optimizar_indices → fusionar_opcodes → ForjaFast v5.