- Lexer: add INDENT/DEDENT tokens, <, >, : operators, while keyword, closing DEDENT emission, include guards - Parser: add NODE_WHILE with while_loop union, parse while/cond/body blocks, include guards - Eval: add while loop evaluation, GC integration with roots from env, debug and gc flags, <, > comparison operators - GC: implement mark-and-sweep collector with 3 stages (mark roots, sweep unmarked, join free blocks) - Allocator: block reuse via first-fit search with splitting, exponential heap growth, NULL check on malloc, include guards, marked field in metadata - Object: add include guards, fix include to use allocator.h
j-lang
La idea de j-lang es crear un "proto-lenguaje" parecido a python pero implementado desde 0 para validar y aprender más sobre la gestión de memoria.
Actualmente en mem-heap\src\allocator.h ya hay una implementeción de un Memory Allocator casi funcional.
🗺️ Hoja de Ruta: Proyecto Proto-Lenguaje
Esta ruta va desde lo más bajo (la memoria) hasta lo más alto (ejecutar código).
Fase 1: El Cimiento (Gestión de Memoria) 🏗️
Objetivo: Tener un malloc y free propios que gestionen metadatos compactos.
Estado: ¡Ya estás aquí!
Tareas clave:
- Terminar CMA_malloc con la cabecera compactada (Size + Marked + InUse).
- Implementar una función CMA_free que pueda liberar un bloque específico.
Fase 2: El Modelo de Objetos (Object Model) 📦
Objetivo: Definir cómo se ve un número, una cadena o una lista dentro de tu memoria C. Conexión: Cada objeto de tu lenguaje será un struct en C que comienza con tu CMA_metadata.
Tareas clave:
- Crear un enum para los tipos (ENTERO, STRING, LISTA).
- Definir el struct Object genérico que envuelve tus datos.
Fase 3: El Front-End (Lexer y Parser) 📖
Objetivo: Convertir el texto del código fuente en algo que C entienda.
Tareas clave:
- Lexer (Tokenizador): Romper el texto x = 10 en fichas: [ID:x], [OP:=], [NUM:10].
- Parser: Organizar esas fichas en un Árbol de Sintaxis Abstracta (AST). Por ejemplo, un nodo "Asignación" que tiene un hijo "x" y otro "10".
Fase 4: El Motor (Evaluador o VM) ⚙️
Objetivo: Recorrer el árbol y "hacer" lo que dice.
Tareas clave:
- Crear una función recursiva eval(nodo) que ejecute la lógica.
Si es un nodo SUMA, suma los hijos. Si es un nodo IMPRIMIR, muestra en pantalla.
Fase 5: El Recolector de Basura (Garbage Collector) 🧹
Objetivo: Automatizar la limpieza.
Tareas clave:
- Implementar Mark (Marcar): Recorrer todos los objetos accesibles desde tus variables y poner el bit Marked a 1.
- Implementar Sweep (Barrer): Recorrer todo el heap linealmente (usando tu función next_block). Si un bloque tiene Marked == 0 y InUse == 1, llamar a CMA_free.
Estructura del proyecto
- vm: maquina virtual de j-lang
- projects: carpeta con scripts en j-lang