Transpilador

Un pequeño """""lenguaje de programación""""" que transpila el código a código de la M++.

Es una prueba de concepto funcional y en cierto modo divertida.

Su programación ha sido rápida y lo más simple posible, intentando seguir el procedimiento normal:

Cómo funciona

Cuando programamos en la M++ a veces echamos en falta algún registro extra para guardar algún dato. Esta falta la podemos suplir con diferentes recursos: memoria o stack… y esto añade complejidad al código ya que tanto para guardar como para recuperar el valor hay que añadir varias líneas de código que puede distraernos de nuestro principal próposito.

Este traspilador los quita esa complejidad utilizando el recurso de la memoria.

Cuando el traspilador convierte el código en instrucciones, “reserva” unas direcciones de memoria que se encuentran al final del codigo traspilado donde los valores de nuestras variables serán guardadas.

¿Cómo se usa?

Números

Los números se pueden representar en 3 bases distintas:

  • Decimal: 0x<número>
  • Hexadecimal: 0d<número>
  • Binario: 0b<número>

donde <número> es el numero en dicha base.

Operaciones

Solo soportadas la suma (+), la resta (-) y la multiplicación (*).

La multiplicación no es una operación nativa del lenguaje, sino que se implementa mediante sumas sucesivas. Por lo tanto, no es recomendable utilizarla para números grandes. Tampoco está optimizada al 100%.

Variables

Los nombres de variables no pueden empezar por un número.

Asignación

Sintaxis

<1> = <2>;

Donde:

  • <1> es el nombre de la variable
  • <2> es el valor a asignar.

Dependiendo de <2> la asignación será del tipo:

  • Directa: variable = 0d25;
  • Indirecta: variable = otraVariable
  • Compuesta: variable = 0d2 + 0d2

En las compuestas se podrán utilizar múltiples sumandos

Condición

Sintaxis:

if (<A> <op> <B>): <CODE>;
  • Donde <A> y <B> podrían ser tanto un número como una variable.
  • Donde <op> es un operador de igualdad (==) o desigualdad (!=).
  • Donde <CODE> es el código a ejecutar si se cumple la condición.

Etiquetas y salto

Sintáxis

etiqueta: variable = 0d2;
...
jmp etiqueta;

Puede haber múltiples etiquetas.

Comando show

Sintáxis

show <variable>;

donde <variable> es una variable previamente declarada.

Carga en el acumulador el valor de la variable.

Ejemplo multiplicación (sumas)

En el siguente ejemplo se realiza la implementación de la multiplicación de dos números mediante sumas sucesivas.

Dicha operación también está disponible en la sección de ejemplos: Multiplicación


MOV 02, AC STA 0035 MOV 02, AC STA 0036 MOV 00, AC STA 0037 LDA 0037 MOV AC, RC LDA 0035 MOV AC, RB MOV RC, AC ADD RB STA 0037 LDA 0036 SUB 01 STA 0036 LDA 0036 MOV AC, RB MOV 00, AC CMP RB BEQ 0031 JMP 000f LDA 0037 FIN

Variables

VariableAddress
num135
num236
resultado37

Labels

NameAddress
startF

Ejemplo factorial

En el siguiente ejemplo se realiza la implementación del algoritmo de factorial.

Dicha operación también está disponible en la sección de ejemplos: Factorial. Aunque aquí la podremos programar de forma más sencilla por medio del operador de multiplicación (’*’).


MOV 03, AC STA 004d LDA 004d STA 004e LDA 004d MOV AC, RB MOV 01, AC CMP RB BEQ 0018 JMP 001b JMP 0049 LDA 004d SUB 01 STA 004f LDA 004e MOV AC, RC MOV 00, RD MOV RC, AC CMP 00 BEQ 003c MOV RD, RB LDA 004f ADD RB MOV AC, RD MOV RC, AC SUB 01 MOV AC, RC JMP 0029 MOV RD, AC STA 004e LDA 004f STA 004d JMP 000b LDA 004e FIN

Variables

VariableAddress
n4D
result4E
prev4F

Labels

NameAddress
startB
end49

¡A programar!

Empieza editando el ejemplo :)

Código fuente

El código fuente está disponible en Github.

Código fuente