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
Variable | Address |
---|---|
num1 | 35 |
num2 | 36 |
resultado | 37 |
Labels
Name | Address |
---|---|
start | F |
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
Variable | Address |
---|---|
n | 4D |
result | 4E |
prev | 4F |
Labels
Name | Address |
---|---|
start | B |
end | 49 |
¡A programar!
Empieza editando el ejemplo :)
Código fuente
El código fuente está disponible en Github.
Código fuente