Ya sé que muchos de los lectores pensarán que no se puede estar llegando al 20% del tiempo total de desarrollo del Sistema Operativo y todavía no haber tocado el núcleo de éste. Para tranquilizar, ya que estoy yendo un poco por libre y la gente empieza a preguntar, adelantar que sí, habrá un núcleo, en concreto, un micronúcleo-exonúcleo. Pero hoy ni por asomo podemos afrontar el tema de picar código, sino que vamos a tener que ver el compilador que usaremos.
Es obvio que si vamos a tener un lenguaje de programación y un código fuente, vamos a necesitar un programa que nos convierta ese código fuente en código objeto para que pueda ejecutarse en el Sistema Informático. Ese es el cometido del compilador.
Vamos a dejar claro las estructuras que nos va a tener que proveer, y con las que vamos a poder formar el lenguaje de programación. Estas estructuras tendrán la característica, como todo lo que empieza por almohadilla ("#") según definimos en el idioma, de empezar por dicho símbolo. Igualmente, hay que concretar que sólo usaremos ese símbolo para comunicarse con el compilador o utilizar las estructuras que nos provea el compilador.
Esto es muy serio ya que muchos lenguajes de programación lo usan para representar números hexadecimales; eso no lo podremos hacer por definición.
El compilador nos va a ofrecer las siguientes estructuras nativas:
- #: Será la estructura global.
- #VOID: Será la estructura vacía.
- #DEFINED: Será la estructura base de todas las que definamos a través de los métodos correspondientes.
- #UNDEFINED: Será cualquier estructura que no entre en la definición de las demás.
A esas cuatro estructuras nativas se añaden todas las que generará el compilador a través de la definición del idioma de programación que hicimos:
- #FUNTION: Será la estructura que generan las llaves ({...}) para trabajar con funciones.
- #STRING: Será la estructura que generan las comillas dobles ("...") y simples ('...') para trabajar con cadenas.
- #UINT: Será la estructura que generarán los números (0123456789) para trabajar con enteros sin signo.
- #OBJECT: Será la estructura que generarán los dos puntos (:) para trabajar con tipos de dato.
- #ARGUMENT: Será la estructura que generará la coma (,) o el espacio ( ) para trabajar con argumentos.
Como se dejaba ver en la estructura #DEFINED, el compilador, además, nos permite usar unos procedimientos para realizar ciertas acciones. Hay que tener en cuenta que estos procedimientos no se verán reflejados en el código máquina (si no serían métodos), ya que su objetivo es parametrizar el compilador. Nótese que siempre reciben cadenas constantes, nunca variables. En un futuro podría (para las dos últimas) entender expresiones regulares, aunque eso ahora no corre prisa. Por último, los procedimientos siempre irán en minúsculas, en contraposición con las estructuras, que irán en mayúsculas.
- #compilador "compilador": Selecciona el tipo de compilador, por si hubiera diferentes configuraciones por defecto.
- #lenguaje "lenguaje": Selecciona el tipo de lenguaje, por si hubiera diferentes (que habrá) lenguajes que usar.
- #define "nueva estructura": Pasa un #UNDEFINED (" estructura") a #DEFINED.
- #undefine "estructura a destruir": Pasa un #DEFINED (" estructura a destruir") a #UNDEFINED.
- #haz " nuevo recurso" "estructura": Pasa un #UNDEFINED (" nuevo recurso") al tipo "estructura".
- #deshaz "recurso a destruir": Pasa un recurso (" recurso a destruir") a #UNDEFINED.
- #alterna "valor buscado" "valor escrito": Alterna en el código fuente "valor buscado" por "valor escrito".
- #unterna "valor ya no buscado": Deja de alternar "valor buscado".
- #crea "estructura" "estructura devuelta" "argumentos" "función": quizás es la más completa y más poderosa, ya que crea métodos dentro de las estructuras, es decir, define estructuras por completo.
Esto nos deja por fin abiertas las puertas para abordar mañana todo el conjunto de conceptos que hemos ido definiendo para empezar el trabajo duro.