Un simulador educativo de PC Turing-completo con compilador integrado de lenguaje de alto nivel, inspirado en el libro de texto "De Euclides a Java". Este proyecto demuestra la cadena completa de compilación: desde lenguaje de alto nivel → análisis léxico → ensamblador → código binario → ejecución de instrucciones paso a paso con visualización de registros en tiempo real.
Desarrollado para la Universidad Nacional de Colombia
PCPENA (Simulador PC Simplificado) es una herramienta educativa interactiva que permite a los estudiantes:
- Escribir y compilar programas en lenguaje de alto nivel
- Observar el proceso de análisis léxico y tokenización usando PLY (Python Lex-Yacc)
- Ver la generación de código ensamblador con resolución de etiquetas y reubicación de variables
- Ejecutar instrucciones binarias en una máquina virtual
- Visualizar el estado de la CPU en cada instrucción: registros, RAM, banderas ALU y unidad de control
- Comprender el ciclo completo de compilación y ejecución
Código de Alto Nivel → Lexer (PLY) → Parser → Ensamblador → Enlazador/Cargador → Máquina Virtual
- Utiliza PLY (Python Lex-Yacc) para tokenización
- Soporta sintaxis personalizada de lenguaje de alto nivel
- Los tokens incluyen: números, operadores, palabras clave, variables, funciones, estructuras de control
- Mantiene tabla de símbolos para búsqueda de variables
- Compilación ensambladora en dos pasadas
- Pasada 1: Resolución de etiquetas y asignación de variables
- Pasada 2: Conversión de códigos de operación a código máquina binario
- Maneja la reubicación de direcciones de memoria
- Soporta 14 tipos de instrucciones
- Realiza resolución de símbolos
- Carga el código binario en memoria virtual
- Traslada direcciones de memoria según el punto de inicio del programa
- Inicializa el contador de programa y punteros de instrucción
- 4 Registros de Propósito General: A, B, C, D (16 bits cada uno)
- 1024 Palabras de RAM (celdas direccionables de 16 bits)
- Banderas ALU: Cero (C), Positivo (P), Negativo (N), Desbordamiento (D)
- Unidad de Control: Gestiona el puntero de instrucción y estado de ejecución
- Interfaz gráfica basada en PyQt5
- Visualización en tiempo real de: RAM, registros, banderas ALU, unidad de control, código objeto
- Botones interactivos: Siguiente, Último, Reiniciar, Ensamblar, Enlazar/Cargar
- Conecta el modelo de máquina con la vista PyQt5
- Actualiza el estado de la GUI después de cada operación de máquina
| Registro | Código |
|---|---|
| A | 00 |
| B | 01 |
| C | 10 |
| D | 11 |
| Instrucción | Código de Operación | Descripción |
|---|---|---|
| Parar | 0000000000000000 | Detener ejecución |
| Cargar | 0001 | Cargar desde memoria a registro |
| CargarValor | 0010 | Cargar valor inmediato a registro |
| Almacenar | 0011 | Almacenar registro en memoria |
| SaltarSiCero | 010000 | Saltar si bandera cero activa |
| SaltarSiNeg | 010001 | Saltar si bandera negativa activa |
| SaltarSiPos | 010010 | Saltar si bandera positiva activa |
| SaltarSiDes | 010011 | Saltar si bandera desbordamiento activa |
| Saltar | 010100 | Salto incondicional |
| Copiar | 011000000000 | Copiar registro a registro |
| Sumar | 011000000001 | Sumar (resultado en primer registro) |
| Restar | 011000000010 | Restar (resultado en primer registro) |
| Mult | 011000000011 | Multiplicar (resultado en primer registro) |
| Div | 011000000100 | División entera (resultado en primero) |
# Instalar dependencias del sistema
sudo apt install python3-tk python3-dev
# Crear entorno virtual
python3 -m venv emuenv
source emuenv/bin/activate
# Instalar dependencias de Python
pip install -r requirements.txt
# Ejecutar el simulador
python maintaller.py# Crear entorno virtual
python -m venv emuenv
emuenv\Scripts\activate
# Instalar dependencias de Python
pip install -r requirements.txt
# Ejecutar el simulador
python maintaller.pysudo apt install pyqt5-dev-tools qttools5-dev-tools- PyQt5: Marco de trabajo para interfaz gráfica
- ply: Python Lex-Yacc para análisis léxico
- Python 3.7+
- Escriba Código Ensamblador en el editor de código
- Haga clic en "Ensamblar" para compilar a binario
- Enlace y Cargue en la dirección de memoria deseada
- Ejecute Instrucciones paso a paso
- Monitoree el Estado: Registros, RAM, banderas ALU, unidad de control
CargarValor A, 5 // Cargar 5 en registro A
CargarValor B, 3 // Cargar 3 en registro B
Sumar A, B // Sumar: A = A + B (8)
Almacenar A, 100 // Almacenar en dirección 100
Parar // DetenerAquí hay algunos ejemplos del simulador en acción:
Vea una demostración completa de PCPENA en acción:
El compilador soporta un lenguaje de alto nivel personalizado con las siguientes palabras clave:
fun <nombre>(<parámetros>) ... ffun // Definición de función
var <var1>, <var2>, ... // Declaración de variables
mientras <condición> ... fmientras // Bucle while
caso <valor> ... hacer // Sentencia switch/case
dev <valor> // Sentencia return
- Aritméticos:
+,-,*,/,mod - Relacionales:
<,>,<=,>=,= - Agrupación lógica:
(,) - Delimitadores:
,,;,:
- Búsqueda (Fetch): Leer instrucción desde
table_ram[instruccion_actual] - Decodificación (Decode): Emparejar código de operación con tipo de instrucción
- Ejecución (Execute):
- Cargar valores de operandos (registros o memoria)
- Realizar operación
- Actualizar registro de destino
- Actualizar banderas ALU si es operación aritmética
- Actualización de Control: Actualizar punteros de instrucción y estado de unidad de control
- Enteros: Complemento a dos de 16 bits (rango: -32,768 a 32,767)
- Formato Binario: Rellenado a 16 bits con ceros a la izquierda
- Direccionamiento de Memoria: Direcciones de 10 bits (soporta 1024 celdas)
Pasada 1 (Resolución de Etiquetas/Variables):
- Escanear todas las declaraciones
- Registrar direcciones de etiquetas para destinos de saltos
- Asignar memoria para variables
- Construir tablas de símbolos
Pasada 2 (Generación de Código):
- Generar códigos de operación binarios para cada instrucción
- Reemplazar referencias de etiquetas con direcciones de memoria
- Resolver reubicaciones de variables
- Generar código objeto binario
Este proyecto enseña:
- Diseño de Compiladores: Análisis léxico, generación de código
- Arquitectura de Computadoras: Registros, memoria, operaciones ALU
- Turing Completitud: Instrucciones de salto y aritmética
- Programación a Nivel de Máquina: Interacción directa con CPU
- Tokenización: Dividir el código fuente en símbolos significativos
- Análisis de Sintaxis: Reconocer la estructura del lenguaje
- Generación de Código: Producir instrucciones de máquina
- Gestión de Símbolos: Rastrear ubicaciones de variables/etiquetas
- Operaciones de Registro: Almacenamiento y manipulación directa de CPU
- Gestión de Memoria: Organización de RAM y direccionamiento
- Flujo de Control: Instrucciones de salto y banderas de condición
- Operaciones ALU: Aritmética y lógica con actualizaciones de estado
Inspirado en el libro de texto "De Euclides a Java"


