Semana de la Investigación 2015
PUCMM
Raúl G. Roa Gómez
Hobbies:
— Fútbol
— Ajedrez
— Discos de vinilo
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
Game Software Engineer
http://goo.gl/HraduQ
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
Corey Clark, PhD
Asesor académico
Máximo Martínez, MSc
Asesor técnico y de alcance
¿Qué hay de nuevo en el mundo de desarrollo de software?
¿Cómo podemos hacer que nuestro código alcance todos los dispositivos modernos al mismo tiempo?
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."
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
Pero escribir código en estas tecnologías no garantiza portabilidad
Todos los dispositivos modernos pueden ser una sola plataforma...
Aún así...
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.
asm.js
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);
}
}
C++ => LLVM => WWW.
EUREKA!
Antecedentes
Antecedentes
¿Cómo ejecutar codigo nativo en la Web?
Compilar a JavaScript no es algo nuevo
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?
Resultando en:
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?
Las fases de ConConJS
El Parser
El data extractor
El cross-compiler
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