Sugiero el siguiente enfoque:
- Escribe una calculadora RPN. Esta es la “máquina” programable más simple con la que puedes jugar. Lo más probable es que use una pila en su programa para admitir tit. Agregue operadores “push” y “pop” a la calculadora, inventando efectivamente la pila dentro de la calculadora “VM”.
- Escriba una calculadora “normal”, con corchetes y demás. Añadirle variables. Reutilice su calculadora RPN como núcleo de la nueva calculadora.
- Escribe un simulador de máquina de Turing. Escribe algunos programas básicos para ello.
- Escriba una VM para una CPU de juguete: algunos registros de 16 bits: “contador de programa” / “puntero de instrucción”, algunos registros de uso general, puntero de pila, registro de banderas; haga que su bus de direcciones de memoria no sea más grande que 16 o 24 bits (para que pueda asignar una sola matriz en su programa emulador y convertirla en la memoria completa de su CPU virtual), un conjunto de instrucciones simples (aritmética básica, comparación, carga / tienda, push / pop, saltos condicionales e incondicionales, tal vez una instrucción de “llamada” / “retorno” que lo ayudará a hacer programas más significativos que solo saltos).
- Agregue una instrucción de llamada al sistema con argumentos que harán que su emulador haga algo fuera de la VM dependiendo de los argumentos enviados desde dentro de la VM (por ejemplo, imprima el valor de un registro específico en su pantalla real, o lea un valor del teclado en un registro en tu CPU virtual). Aquí puede agregar una pantalla virtual y algún otro hardware virtual, pero es más fácil comenzar con un “terminal virtual” basado en caracteres como ese.
- Escriba un ensamblador para su CPU virtual. La única parte difícil será manejar etiquetas para saltar, por ejemplo, hacer que su ensamblador sea de dos pasos (el primer paso codifica todas las instrucciones y sus argumentos, excepto las direcciones a las que apuntan las instrucciones de salto, el segundo paso calcula y codifica estas direcciones en argumentos de instrucciones mirando dónde están las etiquetas. Una tabla de etiquetas o “símbolos” puede ayudar.
- Escribe algunos programas en tu asamblea.
- Escriba un compilador toy-C que traduzca un subconjunto de un lenguaje C en su ensamblaje: bucles, variables, funciones. Reutilice su experiencia escribiendo una calculadora para traducir expresiones complejas.
- Finalmente, escriba un programa toy-C para su CPU. Utilice las funciones de su CPU para admitir llamadas a funciones, invente una convención ABI y de llamadas, etc.
- Ahora debería estar listo para mirar los simuladores de código abierto, preferiblemente comenzando con algo que emule MIPS, ya que ha sido diseñado para la educación.