Universidad Interamericana de PanamáMateria: Compiladores Inicio Documentación Tema 6 · BYTE WARS
Tema 6 · Mini máquina virtual y bytecode

BYTE WARS

PROGRAMA · COMPILA · EJECUTA · DESTRUYE

BYTE WARS es un juego 2D de combate espacial en el que el jugador no controla la nave con el teclado, sino que escribe una estrategia en BWL (Byte Wars Language), un lenguaje de programación creado para este proyecto. El compilador desarrollado en C transforma el código en bytecode, que una máquina virtual ejecuta instrucción por instrucción para controlar los movimientos, disparos y escudos de la nave. Todo el juego funciona en el navegador gracias a WebAssembly, convirtiendo la programación en una estrategia de combate en tiempo real.

Lenguaje propio Compilador en C VM y bytecode Juego 2D
1

Código fuente

sin compilar
2

Bytecode generado

0 instr.
3

Ejecución en la VM

listo
Instrucción actual —
Contador de programa0000
Ticks0

Pila

vacía

Variables

sin variables

Estado

Compila un programa para comenzar.
4

Juego en tiempo real

en espera
— PC 0000 Ticks 0 listo
HEALTH
100
SHIELD
—
SCORE000000
LEVEL1
#TipoLexemaLínea:col
Arquitectura

Del código a la nave, sin salir del navegador

El compilador, la máquina virtual y el juego están escritos en C. Emscripten los convierte a WebAssembly para que la página los ejecute directamente.

Código fuenteBWLTexto que escribe el jugador
→
CompiladorCLexer, parser, sema y codegen
→
BytecodeISAInstrucciones y pila
→
Máquina virtualCPC, pila, variables y saltos
→
JuegoCanvasNaves, balas y HUD
El mismo núcleo C se compila también a bytewars_cli y bytewars.exe para pruebas y demostración nativa.
Lenguaje BWL

Una gramática pequeña, un juego completo

Byte Wars Language está diseñado para que la estrategia se lea como un programa y se ejecute como una máquina de verdad.

Gramática

programa   := sentencia*
sentencia  := 'SET' IDENT expresion
            | 'MOVE' ('UP'|'DOWN'|'LEFT'|'RIGHT')
            | 'SHOOT' | 'SHIELD'
            | 'WAIT' expresion
            | 'REPEAT' expresion bloque
            | 'WHILE' expresion bloque
            | 'IF' expresion bloque ('ELSE' bloque)?
bloque     := '{' sentencia* '}'
expresion  := comparaciones, sumas, productos,
              unarios, llamadas y paréntesis

Funciones integradas

NombreDevuelve
enemy_ahead()1 si hay un enemigo delante
enemy_left()1 si hay un enemigo a la izquierda
enemy_right()1 si hay un enemigo a la derecha
random(n)Entero entre 0 y n-1
health, scoreVariables reservadas de solo lectura
enemies_left, level, shield, ticksEstado del juego en tiempo real
Bytecode

La máquina virtual ejecuta esto

Cada instrucción tiene un opcode, un operando opcional y la línea del fuente para depurar.

OpcodeOperandoEfectoDescripción
PUSHnúmero+1 pilaEmpuja una constante
LOAD / STOREvariable+1 / −1Lee o escribe una variable
ADD SUB MUL DIV MOD—−1Aritmética de pila
LT GT LE GE EQ NE—−1Comparaciones (1 o 0)
JMP JZ JNZdirección0 / −1Saltos y control de flujo
CALLbuiltinvariableLlama a enemy_ahead(), random(n)…
MOVE_* SHOOT SHIELD—0Acciones sobre el juego
WAIT—−1Espera n ticks de juego
REPEAT_START / REPEAT_ENDdirección−1 / 0Bucles contados
HALT—0Detiene la VM
Tecnologías

Un solo núcleo, dos destinos

CCompilador, VM y juego
EmscriptenCompila C a WebAssembly
WebAssemblyEjecución en el navegador
HTML/CSS/JSInterfaz y editor
Canvas 2DNaves, balas y animaciones
mingw-w64Runner nativo .exe

Runner nativo para Windows

bytewars.exe compila y simula programas BWL desde la consola, usando exactamente el mismo núcleo C que la versión web.

Equipo

Integrantes

CZCarlos Zachrisson
KAKaren Arauz