Skip to content

Latest commit

 

History

History
206 lines (194 loc) · 10.4 KB

TODO.org

File metadata and controls

206 lines (194 loc) · 10.4 KB

Notas

Error al compilar file:backends/tupla/bootstrap.pd::variable subclase.

El fijar en <a href=”file:backends/tupla/bootstrap.pd::fijar subclase a __CrearClase: {}”>~fijar subclase a~ está siendo compilado a un LSETC EACT, 0, 0, a pesar de que el OPNFRM del ~si~ está vacío. Esto es causado porque la variable subclase está en el entorno ya que no es importada, no es caturada, es local pero no es local directa (hay un ámbito de por medio entre su uso y la función que la contiene).

El código aquí no la «agarra» porque no es una local inmediata (véase esta parte). Por eso no está siendo contada.

No tengo clara la solución. Claramente debo cambiar las reglas de cuando una variable cuenta para el OPNFRM de su entorno. Los nodos si y mientras deberían pasar las variables de sus ámbios como si fuesen «inmediatas». ¿Quizás deba introducir un nuevo metadato? localInmediataDelÁmbito: Si la local es usada en el ámbito en el que se declaró (localInmediata solo toma en cuenta funciones, esta toma en cuenta todos los ámbitos).

Nota: Creo que esto último es innecesario, las locales inmediatas de los si y mientras deberían estarse incluyendo…

Experimentación

v3y

Tipos de suma con metaprogramación, similar a `Enum`.

Literales de objeto.

Esto es fundamental, debo agregarlo lo antes posible, quizán incluso antes que las demás características de v3y.

Mejor manejo de excepciones.

Solo después de agregar continuaciones.

Eliminación de tail-calls.

Existe en el backend de Lua, falta en el de C++.

v3z

Métodos léxicos.

Pensé que eran buena idea pero si ves a los objetos como funciones no tienen sentido.

hacer y finhacer

Importantes, pero no tanto. Parte de abstraer el control de flujo con funciones (y por ende, objetos).

Continuaciones.

implementa y finimplementa.

No estoy seguro de que sea buena idea, sobre todo teniendo en cuenta a los comportamientos.

v3a

Comportamientos e interfaces

Debo agregarlos.

Las interfaces pueden ser como en Racket, los comportamientos aún debo diseñarlos mejor.

Traits.

No, mejor comportamientos.

Objetos como funciones con múltiples puntos de entrada.

Esto significa que los objetos deberían ser usados como un sistema distribuído.

  1. Similar a la filosofía UNIX.
  2. Ver el trabajo en OSH/Oil.
  3. Los objetos solo deben ser usados cuando hay invariantes que mantener.
  4. Objetos como DatosDeVariable son cuestionables.
  5. Objetos como Ámbito son mejores, aunque no perfectos.
  6. Objetos como CaminaNodos son horribles.

Diseño

Asociar el esquema de las tuplas a sus respectivos opcodes.

En vez de especificar manualmente en los distíntos pases del IR que argumenos son constantes, procedimientos, números, etc, cada opcode debería saber los tipos de sus argumentos de forma que, por ejemplo, obtener todas las constantes de una tupla séa tan sencillo como:

Mapear: (Filtrar: tupla#opcode#esquema, (MétodoComoFunción: {esConstante})), funcion: c
    devolver tupla#en: c#índice
finfuncion

Usar el mismo AST en todos los pases ha resultado en complicaciones innecesarias. Por ejemplo, hacer que los ámbitos y bloques estuviesen representados por sus propios nodos simplificaría mucho el compilador.

Por ejemplo, en vez de tener arreglos de nodos (en NodoPrograma, NodoSi, NodoMientras, NodoFunción, etc) sería mejor tener un solo atributo cuerpo que es un NodoBloque, una secuencia de instrucciones. Igualmente, en vez de que NodoFunción, NodoPrograma, NodoSi, etc tengan implícitamente sus ámbitos como parte de ellos, sería mejor un NodoÁmbito que explícitamente representa un ámbito.

Eficiencia

Optimizar tokenizador.

En especial PuertoConPosiciónTextual.

Optimizar el Parser.

Actualmente el parser es una de las partes más lentas del compilador.

Optimizar la lectura/escritura de S-exprs.

Si crees que el parser es lento, espera a ver el parser de expresiones S.

Nota 2021-03-25: Aparentemente, al optimizar Diccionario el lector/escritor de expresiones S se hizo como 2 veces más rápido, así que no se si debería optimizarlo manualmente ahora.

Nota 2021-06-17: Nop, a pesar de que es 2 veces más rápido, aún es demasiado lento para programar de forma cómoda. Mis pruebas al implementar una versión en Lua no fueron exitosas y creo que tendré que hacer una implementación en C o ir a un formato más eficiente (¿Quizás binario? ¿Con string.pack?).

Optimizar estructuras básicas.

Los diccionarios, Resultado y demás no están muy optimizados.

Optimizar ámbitos.

Solo usa _s si es necesario.

Correctitud

Los mensajes de error a veces están mal por uno (1) al principio o final de un archivo.

Solo pasa cuando la instrucción es una llamada a función/método.

Al cerrar un método fuera de clase con finfuncion en vez de finmetodo, el mensaje de error no tiene la ubicación del error en el archivo.

No es posible crear un programa vacío.

FIXED __Lua no puede ser usada en la posición de una instrucción.

FIXED En general, expresiones que no sean llamadas a funciones generarán código mal compilado.

Lua solo permite llamadas a funciones como instrucciones, la solución es compilar todas las expresiones en posición de instrucción a _ = expr.

Ciertas banderas del CLI aún no están implementadas.

Usar una biblioteca real del CLI

¿Quizás bepd/x/cli?

FIXED El CLI aún no utiliza las variables de entorno.

FIXED __Argv no debería necesitar un archivo .lua especial.

FIXME Los espacios de nombres no actualizan sus valores.

Por ejemplo, si la variable X, que es un número, es exportada, fijar X a otro valor dentro del módulo que la exportó debería cambiar el valor visto por los demás módulos, sin embargo, esto no sucede. La solución es hacer que rt.ns pida un rt.scope y la lista de nombres a exportar, en vez de los valores mismos.

FIXED El parser de expresiones S no maneja de forma adecuada los textos con \.

Por ejemplo, el texto "hola \\" mundo" erróneamente será parseado como hola \" mundo en vez de hola \\.

FIXED Diccionario no puede clonarse ni compararse.

Esto es debido a que faltan implementaciones de HashMap#..., DiccionarioHashMap#... y DiccionarioAlist#....

Incluso así, Diccionario tendría que implementar sus propias operaciones.

FIXME NULO es falso en condicionales.

Solo FALSO debe ser falso.

FIXME SonElMismoObjeto debe ser un builtin.

Termina el pase de defuncionalización.

FIXED tags no genera etiquetas para atributos dentro de clases.

FIXME No hay un mensaje de error al llamar a una variable que no es autoejecutable.

FIXME El mensaje de error de cuando una variable no existe no contiene el lugar del programa en el que se encontró el identificador.

FIXED Los NodoVariadic no tienen metadatos.

FIXED No se puede cargar una base de datos de módulos que contenga un módulo que solo exporte un identificador.

En el backend de tuplas

No se está llevando registro que que llamadas están en posición tail y cuales no. Debido a esto nunca de emiten las instrucciones TMSG, TMSGV, TDYNMSG ni TDYNMSGV.

Elimina las instrucciones que no se están utilizando.

  • CLZ2OBJ
  • MK0CLZ

Implementa el sistema de módulos (IMPORT, SAVEIMPORT y MODULE).

Implementa las pragmas.

FIXED Las funciones no pueden tener parámetros variadic.

FIXME No puedes llamar a funciones variadic.

Es necesario usar el nuevo opcode DYNMSG. Hola: 1, ...2, 3 debería compilar a algo como:

(1)
MKARR 1
(2)
(3)
(4)
MKARR 2
-- ([1], 2, [3, 4])
MSGDYN Cx, 3, 1

Builds y Seguridad

Builds reproducibles. [0/2]

Si mal no recuerdo, la única parte actual que no permite un build completamente reproducible es que Ámbito usa un Diccionario (que usa un hash map) para almacenar los nombres y luego el prólogo de ámbito cuando las variables se iteran en-órden para emitir las declaraciones de Lua, su órden está indeterminado.

Nota 2021-06-18: Los nombres de los archivos de los módulos también están en el compilado, así que eso tampoco es reproducible.

Compilación a Lua reproducible.

Base de módulos reproducible.

La base de datos de módulos no es reproducible debido a que almacena información de los nombres de archivos y compilación (que no es reproducible).

UX/UI

Todos los mensajes de error que no son del parser son bastante malos.

Como mínimo, deberían indicar en que parte del programa sucedió el error.

Mejora mensajes de error de la resolución de nombres.

Los mensajes de “logging” del compilador deberían ser opcionales.

Nota 2021-08-12: Ahora se pueden quitar con --sin-mensajes. Aún es un sistema bastante feo, sin embargo.

Soporte de IDE

Corrige la identación en pseudod-mode.

Agrega soporte de autocompletar.

Nota 2021-08-12: Parcial con PDTAGS.

Agrega REPL y funcionalidad típica (recargar módulos, solicitar información, etc de forma que una IDE simple pueda simplemente usar el REPL).

Crea un servidor LSP.

Crea módulos que lean los archivos PDTAGS para Emacs, VSCode y Atom. [1/4]

Soporte de Emacs

Soporte de VSCode

Soporte de Atom

Soporte de vi/vim/neovim/etc

Herramientas

Depurador.

Generador de documentación.

Agrega soporte de compilación incremental.

Paquetes

Crear la estructura de los paquetes.

Sistema de paquetes.

Manejador de paquetes.

Distribución

Es necesaria una manera de empaquetar programas en PseudoD.

Cambia la distribución del makefile a un script separado.