01 noviembre, 2008

JSLibs, Javascript en la línea de comandos

Hace unas semanas probé algunos de los problemas de Google Code Jam y, me quedé en cierta fase en parte por culpa de la falta de rendimiento del motor de Javascript del navegador sobre el que estaba probando (Firefox).

Hoy la cosa pinta bien distinta. A parte de que prácticamente todos los navegadores (Chrome, Firefox, Safari, y Opera) han multiplicado el rendimiento de dichos motores con muy buenas optimizaciones, empiezan a aparecer herramientas como JSLibs.

Se trata de un entorno de desarrollo para usar JavaScript como un lenguaje interpretado de propósito general. Utiliza el motor SpiderMonkey (Firefox) aunque en breve se actualizará al más optimizado TraceMonkey. Facilita una serie de módulos nativos que contiene varias clases y funciones como: zlib, SQLite, FastCGI, NSPR (Netscape Portable Runtime) , ODE (Open Dynamics Engine) , libpng, libjpeg, librsvg, SDL, libiconv, OpenGL, OpenAL, ogg vorbis, libTomCrypt, libffi (Foreign function interface) , ... con funciones como: Print(), Load(), Exec(), Seal(), Expand(), Buffer class, Blob class, Sandbox class, ...

Un pequeño programa de acceso por consola (jshost) puede ser utilizado para ejecutar archivos Javascript, mientras que hay una versión para Windows (jswinhost) sin consola.  


Como ejemplo, el siguiente código muestra un icono en la barra de tareas de Windows que muestra un menú con dos opciones ("agregar" y "salir"), con la función de agregar elementos de programas para poder lanzarlos desde ese menú.

LoadModule('jsstd');
LoadModule('jswinshell');

var s = new Systray();
s.icon = new Icon( 0 );
s.menu = { add:'Add', exit:'Exit', s1:{ separator:true } };
s.onmousedown = s.PopupMenu;

s.oncommand = function( id, button ) {

 switch ( id ) {
  case 'exit':
   return true;
  case 'add':
   var fileName = FileOpenDialog( 'Programas|*.exe;*.com;*.cmd;*.bat|todos los archivos|*.*' );
   if ( !fileName )
    return;
   s.menu[fileName] = { 
    icon: ExtractIcon( fileName ), 
    text: fileName.substr( fileName.lastIndexOf( '\\' ) + 1 )
   };
   break;
  default:
   if ( button == 1 ) // left-click to run.
    CreateProcess( id );
   else // right-click to remove.
    if ( MessageBox( 'Eliminar elemento: ' + id + '? ', 'Question', MB_YESNO) == IDYES )
     delete s.menu[id];
  }
}

do { Sleep(100) } while ( !s.ProcessEvents() ); // bucle indefinido con pausas de 100 ms

Publicar un comentario en la entrada

Últimos links en indiza.com