Page 1 of 1

OT. Emscripten

Posted: Fri Sep 20, 2013 6:56 pm
by hmpaquito
Hola,

En el foro de Harbour hablan de un curioso compilador. Compila de LLVM (CLang) a JavaScript y asi todo lo que genera corre en un navegador.

Noticia en Harbour:
https://groups.google.com/forum/?fromgr ... 1RcHL2M1Kk

Web del proyecto Emscripten:
https://github.com/kripken/emscripten/wiki

¡ qué curioso ! ¿ no crees, Antonio ? ;-)
Saludos

Re: OT. Emscripten

Posted: Fri Sep 20, 2013 8:00 pm
by Antonio Linares
Muy interesante, gracias por la noticia! :-)

Re: OT. Emscripten

Posted: Fri Sep 20, 2013 8:33 pm
by Antonio Linares
Aqui se puede inspeccionar el código fuente que se genera en Javascript:

http://www.joshuagranick.com/examples/simplegl/SimpleGL.js

http://www.joshuagranick.com/examples/simplegl/

Re: OT. Emscripten

Posted: Fri Sep 20, 2013 8:40 pm
by Antonio Linares
Como una primera idea, y despues de ver la que lia el traductor de llvm a javascript, se me ocurre que de forma infinitamente más simple podriamos escribir la maquina virtual en javascript :-)

Y asi ni necesitamos usar LLVM ni este traductor ni nada más :-)

a ver si tengo un ratito libre... ;-)

Re: OT. Emscripten

Posted: Fri Sep 20, 2013 10:48 pm
by Antonio Linares
No me he podido resistir a constuir este pequeño ejemplo :-)

1. He compilado el siguiente PRG con Harbour:
test.prg

Code: Select all | Expand

function Main()

   ? "Hello world"

return nil


2. He copiado el array de pcode que se genera en test.c y la tabla de símbolos a javascript.

3. he construido una "mini" maquina virtual usando javascript que lo procese :-)

test.html

Code: Select all | Expand

<head>
</head>
<body>
   
    <style>
    .scrollable
  {
     overflow:auto;
  }
    </style>
   
    <div class="scrollable" id="scrollable" height="480">
    <canvas id="canvas" width="640" height="480" style="background-color:0"/>
  </div>
   
    <script type="text/javascript">

    var context = document.getElementById( "canvas" ).getContext( "2d" );
      var pcode = [ 36,3,0,176,1,0,106,12,72,101,108,108,111,32,
                      119,111,114,108,100,0,20,1,36,5,0,100,110,7 ];
    var symbols = [ "MAIN", "QOUT" ];
   
    // pcode tokens
    var HB_P_ENDPROC      =   7;
    var HB_P_DOSHORT      =  20;
    var HB_P_LINE         =  36;
    var HB_P_PUSHNIL      = 100;
    var HB_P_PUSHSTRSHORT = 106;
    var HB_P_RETVALUE     = 110;
    var HB_P_PUSHFUNCSYM  = 176;

      function hb_vmExecute( pcode, symbols )
      {
         var nPos = 0;
         
         while( pcode[ nPos ] != HB_P_ENDPROC )
         {
            switch( pcode[ nPos ] )
            {
               case HB_P_LINE:
                    qout( "line: " + pcode[ ++nPos ] );
                    nPos += 2;
                    break;
                 
               case HB_P_DOSHORT:  
                    qout( "Do short: " + pcode[ ++nPos ] + " parameter" );
                    nPos += 1;
                    break;  
                 
             case HB_P_PUSHNIL:
                  qout( "Push nil" );
                  nPos++;
                  break;

               case HB_P_PUSHSTRSHORT:
                    qout( "Push String short: " + pcode[ ++nPos ] + " bytes" );
                    for( n = 1; n < pcode[ nPos ]; n++ )
                       qout( String.fromCharCode( pcode[ nPos + n ] ) );   
                    nPos += n;
                    break;  

             case HB_P_RETVALUE:
                  qout( "return the pushed value" );
                  nPos++;
                  break;

               case HB_P_PUSHFUNCSYM:
                    qout( "Push Function symbol: " + symbols[ pcode[ ++nPos ] ] );
                    nPos += 2;
                    break;  
                   
               default:
                    qout( pcode[ nPos ] );
                    nPos++;
                    break;        
            }
         }
         
         qout( "EndProc" );  
      }                    
       
      function qout( cText )
      {
       if( context.row == null )
       {
          context.row = 30;
          context.col = 10;
       }  
       else  
          context.row += 20;
         
       context.fillStyle = "green";
       context.font = "bold 16px Arial";
       context.fillText( cText, context.col, context.row );    
      }

    hb_vmExecute( pcode, symbols );    

    </script>
</body>
 

Re: OT. Emscripten

Posted: Fri Sep 20, 2013 10:50 pm
by Antonio Linares
Lo podeis ejecutar desde aqui:

http://www.fivetechsoft.net/test/test.html

Re: OT. Emscripten

Posted: Sat Sep 21, 2013 2:50 am
by carlos vargas
:-0 maravillo antonio.

Re: OT. Emscripten

Posted: Sat Sep 21, 2013 9:23 am
by hmpaquito
Muy, muy bueno, Antonio !!

Ya tenemos una máquina virtual para Javascript. Ahora podemos ejecutar nuestros programas en el navegador. El sueño, por fin, hecho realidad.
Sólo falta la impresión, yo creo que se resuelve fácilmente haciendo otra máquina virtual de listados.

Saludos.



















No. En serio: ha estado muy bien la mini maquina virtual que has creado para el qout.

Re: OT. Emscripten

Posted: Sat Sep 21, 2013 9:36 am
by Enrico Maria Giordano
Antonio,

Antonio Linares wrote:Lo podeis ejecutar desde aqui:

http://www.fivetechsoft.net/test/test.html


Using IE8 I see nothing. :-(

EMG

Re: OT. Emscripten

Posted: Sat Sep 21, 2013 12:19 pm
by George
Antonio,
En Internet Explorer 10 y Google Chrome Version "29.0.1547.76 m" funciona perfecto!

Saludos,

George

Re: OT. Emscripten

Posted: Sat Sep 21, 2013 7:37 pm
by Antonio Linares
Ahora solo falta alguien/es que tengan tiempo, ganas y paciencia de seguir :-)

Recordar que mi primer ejemplito de construcción de un compilador compatible con Clipper hacia practicamente lo mismo que este y fijaros ahora el compilador que usamos ;-)

La semilla es tan importante como la tierra, el agua, el sol y el cariño...

Re: OT. Emscripten

Posted: Wed Sep 25, 2013 1:00 pm
by cnavarro
Antonio Linares wrote:Ahora solo falta alguien/es que tengan tiempo, ganas y paciencia de seguir :-)

Recordar que mi primer ejemplito de construcción de un compilador compatible con Clipper hacia practicamente lo mismo que este y fijaros ahora el compilador que usamos ;-)

La semilla es tan importante como la tierra, el agua, el sol y el cariño...


Antonio, estoy dispuesto a ayudar en lo que pueda dentro de mis posibilidades (conocimientos).

Re: OT. Emscripten

Posted: Wed Sep 25, 2013 7:14 pm
by Antonio Linares
Cristobal,

muchas gracias :-)

Yo desafortunadamente no tengo tiempo que dedicarle a este juguete en javascript, y seguro que es fascinante :-(

Por mi parte, si alguien se anima a continuarlo, cuenta con mi apoyo en todo lo posible :-)

Re: OT. Emscripten

Posted: Wed Sep 25, 2013 7:29 pm
by cnavarro
Ok, Antonio
Vere que puedo hacer.