En
el
campo
de
la
informática,
a
veces
somos
testigos
de
innovaciones
sorprendentes
como,
qué
sé
yo,
la
posibilidad
de
ejecutar
un
sistema
Linux
completo
dentro
de
un
archivo
PDF
(este
PDF,
en
concreto).
Algo
así
carece,
claro,
aplicaciones
prácticas
inmediatas
debido
a
sus
limitaciones
de
rendimiento
y
entrada/salida,
pero
sienta
un
precedente
en
el
mundo
de
la
emulación
y
la
experimentación
con
formatos
de
archivo.
Y
este
logro
se
lo
debemos
al
desarrollador
(adolescente,
según
su
perfil
de
GitHub)
que
hace
sólo
unos
días
creó
también ‘DoomPDF’,
el
proyecto
que
permite,
como
su
nombre
indica,
jugar
al
histórico ‘Doom’
dentro
de
un
documento
PDF.
De
hecho,
nuestro
protagonista
ha
reutilizado
parte
de
ese
trabajo
para
dar
vida
a
este
nuevo
proyecto:
basado
en
el
emulador
ligero
TinyEMU,
que
permite
simular
arquitecturas
de
hardware
(en
este
caso,
un
procesador
RISC-V),
este
experimento
demuestra
la
flexibilidad
del
formato
PDF
más
allá
de
su
uso
tradicional.
Un
PDF
interactivo:
más
que
texto
y
gráficos
Lo
que
se
espera
de
los
archivos
PDF
es
que
contengan
meros
documentos
estáticos,
pero
este
proyecto
desafía
esa
idea
preconcebida
al
demostrar
que
los
PDF
pueden
ejecutar
JavaScript.
Los
navegadores
modernos,
como
Chromium
y
Firefox,
han
implementado
una
versión
limitada
de
las
API
de
JavaScript
en
PDF,
permitiendo
cierto
grado
de
interactividad.
Adobe
Acrobat,
por
otro
lado,
ofrecería
una
implementación
aún
más
completa
de
JavaScript,
con
funcionalidades
avanzadas
(como
renderización
3D
y
peticiones
HTTP),
aunque
las
mismas
no
están
presentes
en
navegadores
debido
a
potenciales
problemas
de
seguridad.
De
modo
que,
gracias
a
este
soporte,
es
posible
realizar
cálculos
y
ejecutar
código
dentro
de
un
PDF,
aunque
con
restricciones
en
la
entrada
y
salida
de
datos.
Esto
ha
permitido
portar
un
emulador
de
RISC-V
al
entorno
PDF,
convirtiéndolo
en
una
máquina
virtual
funcional
dentro
de
un
archivo.
La
magia
de
la
compilación:
de
C
a
asm.js
El
emulador
TinyEMU,
base
de
este
proyecto,
fue
modificado
para
ejecutarse
en
el
entorno
restringido
de
un
PDF.
Esto
se
logró
utilizando
una
versión
antigua
de
Emscripten,
que
permite
compilar
código
C
a
asm.js
en
lugar
de
WebAssembly.
Como
WebAssembly
es
incompatible
con
el
entorno
PDF
limitado
que
proporcionan
los
navegadores,
asm.js
era
la
mejor
alternativa
disponible.
Desafíos
técnicos
y
rendimiento
Uno
de
los
mayores
obstáculos
de
este
experimento
ha
sido
el
rendimiento.
Debido
a
que
la
implementación
de
V8
en
el
motor
PDF
de
Chrome
tiene
el
compilador
JIT
desactivado,
la
emulación
es
extremadamente
lenta.
Iniciar
el
kernel
de
Linux
dentro
del
PDF
puede
tomar
entre
30
y
60
segundos,
lo
que
es
más
de
100
veces
más
lento
que
en
condiciones
normales.
El
sistema
de
archivos
raíz
cuenta
con
versiones
tanto
de
32
como
de
64
bits.
Sin
embargo,
la
versión
de
64
bits
basada
en
Alpine
Linux
es
aproximadamente
el
doble
de
lenta
que
la
de
32
bits,
por
lo
que
normalmente
no
se
utiliza.
Además,
el
sistema
visual
del
emulador
dentro
del
PDF
se
basa
en
el
uso
de
campos
de
texto,
donde
cada
fila
de
píxeles
en
la
pantalla
se
representa
con
caracteres
ASCII.
Y
para
la
entrada
de
datos
se
ha
implementado
un
teclado
virtual
con
botones
interactivos
y
un
campo
de
texto
donde
el
usuario
puede
escribir,
enviando
así
pulsaciones
de
teclas
a
la
máquina
virtual.
Un
proyecto
desarrollado
en
tiempo
récord
A
pesar
de
los
desafíos
técnicos,
el
desarrollo
de
este
proyecto
fue
sorprendentemente
rápido.
Gracias
a
la
reutilización
de
partes
del
código
de
DoomPDF,
incluyendo
el
script
de
generación
de
PDF
y
partes
de
los
scripts
de
compilación,
el
desarrollador
logró
completar
el
trabajo
en
tan
solo
16
horas
y
39
minutos…
…lo
preciso
del
conteo
se
debe
a
que
utilizó
WakaTime,
una
extensión
de
VSCode,
dedicada
precisamente
a
registrar
el
tiempo
dedicado
a
proyectos
de
programación.
Además,
la
portabilidad
de
TinyEMU
ya
contemplaba
compatibilidad
con
Emscripten,
lo
que
facilitó
su
adaptación
al
entorno
PDF.
La
experiencia
previa
del
desarrollador
con
Emscripten
y
otros
proyectos
complejos,
como
la
portabilidad
de
SuperTuxKart,
también
contribuyó
a
la
rapidez
del
desarrollo.
Al
enfocarse
exclusivamente
en
Chromium,
también
se
logró
optimizar
el
proceso
de
pruebas
y
depuración.
Imagen
|
Marcos
Merino
mediante
IA