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