Semana de la Investigación 2015
PUCMM
Raúl G. Roa Gómez


Disclaimer

-
Github — http://github.com/rroa
-
Blog — http://mrroa.com
-
Portafolio — http://portfolio.mrroa.com
-
LinkedIn — http://linkedin.com/in/raulroa
Quién es Raúl?
Programo desde los ~14 años
Hobbies:
— Fútbol
— Ajedrez
— Discos de vinilo

Perfil Académico
Pontificia Universidad Católica Madre y Maestra (2007)
Ingeniería en Sistemas y Computación (ISC)
Rochester Institute of Technology (2009)
M.S. Software Engineering
The Guildhall at Southern Methodist University (2014)
M.I.T. Digital Game Development — Software Engineering
Perfil Profesional

Game Software Engineer

http://goo.gl/HraduQ


Perfil Profesional
Windows/Web dev (.NET Framework)
10+ años de experiencia
MCP, MCAD and MCSD
2D/3D Game Dev
5+ años de experiencia
C/C++, UnrealScript, Lua, GLSL, HLSL, Unreal Engine, Unity
Docente PUCMM (RSTA, STI) [mayo 2010 ― diciembre 2012]
Fundamentos de Programación, Lab. Estructura de datos.
DCGames [septiembre 2003 ― diciembre 2005]
Portal más grande de video juegos en el Caribe. Adquirido por Verizon en 2005.
Automating portability analysis and performance optimization of native code, cross compiled with Emscripten and Native Client for the Web


Vamos a desglosarlo
Automating portability analysis and performance optimization of native code, cross compiled with Emscripten and Native Client for the Web
Asesores
Corey Clark, PhD
Asesor académico
Máximo Martínez, MSc
Asesor técnico y de alcance
Motivación
¿Qué hay de nuevo en el mundo de desarrollo de software?

- Antes: Desarrollar una aplicación/juego para Windows.
-
Hoy: Desarrollar aplicaciones/juegos para:
- Windows
- OS X
- Android
- iOS
- X1, PS4, OUYA, etc.
ALCANCE

¿Cómo podemos hacer que nuestro código alcance todos los dispositivos modernos al mismo tiempo?
- Escribir código específico para cada plataforma
- Altos costos
Evitando:
La portabilidad es una propiedad deseable, pero rara vez recibe atención sistemática.
"La mayor parte de su documentación son anécdotas y casos prácticos."
Portabilidad
- Evitar código específico por plataforma
- Código portable es más robusto
- La portabilidad expande su mercado
- La portabilidad ofrece libertad
Motivación
Muchos lenguajes de programación y herramientas de desarrollo afirman proveer "portabilidad" sin necesidad de pensar en ella.





"Write once, run anywhere"
Nos enfocaremos en C, C++ y en OpenGL
- Control
- Seguridad != Abundancia de recursos
- Control de memoria limitado
- AOT > JIT
- Garbage collector afecta el rendimiento de ejecución
- Las limitaciones de las herramientas se heredan
¿Por qué?


Pero escribir código en estas tecnologías no garantiza portabilidad
Todos los dispositivos modernos pueden ser una sola plataforma...
Aún así...

- Abierta & estandarizada
- Excelente para alcanzar TODOS los mercados
- Ha evolucionado de manera orgánica en la era digital
- Ha superado todas las adversidades y pronósticos en contra
- Ha escalado de manera exitosa
La Web
La Web



PERO....
Desarrolladores de video juegos != Web
"Hay una gran cantidad de herramientas programadas utilizando lenguajes establecidos, tales como C y C ++, que necesitan ser portadas."
"JavaScript es lento."
"HTML ni siquiera es un lenguaje de programación."
C++ => %$&# => WWW.
El problema
LLVM al rescate.

Modelo típico de compilación de C/C++

Modelo de compilación de LLVM
Modelo de compilación de LLVM


LLVM
El proyecto LLVM es un conjunto de compiladores modulares y reutilizables.
También otras cosas tuvieron que suceder...
JavaScript Engines
A finales de 2008/principios de 2009 la carrera de las máquinas virtuales de JavaScript empieza.
- V8 (Google)
- TraceMonkey (Mozilla)
- Nitro (Safari)
asm.js
- No es un lenguaje, es una especificación.
- Es solo (un subconjunto de instrucciones de) JavaScript.
- Transforma la Web en una plataforma de compilación.
Demo
int fib(int x)
{
if (x < 2) {
return 1;
}
else {
return fib(x - 1) + fib(x - 2);
}
}
define i32 @fib(i32 %x) #0 {
entry:
%retval = alloca i32, align 4
%x.addr = alloca i32, align 4
store i32 %x, i32* %x.addr, align 4
%0 = load i32* %x.addr, align 4
%cmp = icmp slt i32 %0, 2
br i1 %cmp, label %if.then, label %if.else
if.then: ; preds = %entry
store i32 1, i32* %retval
br label %return
if.else: ; preds = %entry
%1 = load i32* %x.addr, align 4
%sub = sub nsw i32 %1, 1
%call = call i32 @fib(i32 %sub)
%2 = load i32* %x.addr, align 4
%sub1 = sub nsw i32 %2, 2
%call2 = call i32 @fib(i32 %sub1)
%add = add nsw i32 %call, %call2
store i32 %add, i32* %retval
br label %return
return: ; preds = %if.else, %if.then
%3 = load i32* %retval
ret i32 %3
}
function _fib($x) {
$x = $x | 0;
var $0 = 0,
$1 = 0,
$2 = 0,
$3 = 0,
$4 = 0,
$5 = 0,
$accumulator$tr$lcssa = 0,
$accumulator$tr1 = 0,
$x$tr2 = 0,
label = 0,
sp = 0;
sp = STACKTOP;
$0 = ($x | 0) < (2); //@line 4 "fibo.c"
if ($0) {
$accumulator$tr$lcssa = 1;
} else {
$accumulator$tr1 = 1;
$x$tr2 = $x;
while (1) {
$1 = (($x$tr2) + -1) | 0; //@line 8 "fibo.c"
$2 = (_fib($1) | 0); //@line 8 "fibo.c"
$3 = (($x$tr2) + -2) | 0; //@line 8 "fibo.c"
$4 = (($2) + ($accumulator$tr1)) | 0; //@line 8 "fibo.c"
$5 = ($3 | 0) < (2); //@line 4 "fibo.c"
if ($5) {
$accumulator$tr$lcssa = $4;
break;
} else {
$accumulator$tr1 = $4;
$x$tr2 = $3;
}
}
}
STACKTOP = sp;
return ($accumulator$tr$lcssa | 0); //@line 10 "fibo.c"
}
function fib(x) {
if (x < 2) {
return 1;
} else {
return fib(x - 1) + fib(x - 2);
}
}
Rendimiento

C++ => LLVM => WWW.
EUREKA!
Antecedentes
Antecedentes
¿Cómo ejecutar codigo nativo en la Web?
- Plugins - NPAPI, PPAPI, ActiveX
- Java Applets
- Native Client (NaCl & PNaCl)
- Emscripten
Compilar a JavaScript no es algo nuevo
- Google Web Toolkit (GWT) - 2006
- Pyjamas (PyJs) - 2007
Metodología
Intención
Evaluar los retos de portar aplicaciones gráficas, de tamaños considerables, escritas en C/C++ a la Web.
¿Cómo?
- Analizar y diagnosticar repositorios de código nativo existentes
- Definir directrices de portabilidad conforme a los estándares Web
- Identificar los estilos de programación que pueden afectar el rendimiento del código compilado a la Web
Resultando en:
- Método sistemático para la creación de aplicaciones portables.
- ConConJS
ConConJS (IPA: /kənkəndʒeɪz/) es una herramienta de análisis estático para determinar si aplicaciones gráficas son multi-plataforma.
¿Qué es ConConJS?

-
El parser, evalúa el código contra un determinado conjunto de bases de datos con especificaciones ténicas.
- Análisis estático
- Optimizaciones (en memoria)
-
El data extractor, extrae información relevante a portabilitad y rendimiento.
- El cross-compiler, produce, cuando es posible, una aplicación Web a partir del código nativo proveido.
Las fases de ConConJS

El Parser



El data extractor


El cross-compiler

-
Soporte a DirectX
- Shims
- Shaders
- Más optimizaciones
- Más analizadores estáticos
Mejoras Futuras
La Web es el futuro de la distribución digital.
¿Preguntas?
ConConJS
http://conconjs.com/examples
Juegos
https://github.com/rroa/GeometryWars
https://github.com/rroa/Pong
https://github.com/rroa/Asteroids
http://goo.gl/LZcJNL (Net Tuts - Neon Shooter iOS)
Librerías
https://github.com/rroa/SOIL
https://github.com/rroa/DevIL
https://github.com/rroa/ResIL
Enlaces
Semana de la investigación
By Raúl G. Roa Gómez
Semana de la investigación
- 476