52 lines
2.2 KiB
Markdown
52 lines
2.2 KiB
Markdown
# 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 |