Benchmarking en distintos lenguajes [ Era algo así como cliente en jabber... ]
Franco Catrin L.
fcatrin en tuxpan.com
Mie Dic 5 09:59:48 CLST 2007
El mié, 05-12-2007 a las 01:06 -0300, Aldrin Gonzalo Martoq Ahumada
escribió:
> On Dec 3, 2007 10:59 AM, Xavier Andrade <xavier en tddft.org> wrote:
> > On Sun, 2 Dec 2007, Aldrin Gonzalo Martoq Ahumada wrote:
> > > Discrepo. Lo que se llama "maquina" es la definicion de una
> > > arquitectura y su set de instrucciones. Cuando se habla de "maquina
> > > virtual", se quiere decir que ese set de instrucciones no es el mismo
> > > que el implementado en hardware; por lo tanto si quieres ejecutar ese
> > > set de instrucciones requeriras de un paso de traduccion.
> > > Un interprete es un programa que realiza la traduccion desde un set de
> > > instrucciones o lenguaje y las ejecuta, de manera que puedas correr el
> > > codigo en tu maquina "real". La distincion importante es que el paso
> > > de traduccion se hace en tiempo de ejecucion; es decir, cada vez que
> > > corras el programa tendras el costo adicional de traduccion lo que
> > > puede traer problemas de performance o uso de recursos (memoria por
> > > ej). Por eso la *implementacion* de la maquina virtual de java es un
> > > interprete.
> > El problema es que no es tan claro hacer la distincion, de acuerdo a tu
> > definicion, x86(_64) es una maquina virtual, ya los procesadores modernos
> > implementan un set de instrucciones a la RISC internamente y en el momento
> > de ejecucion se traducen las instrucciones x86 a instrucciones nativas,
> > algunas directamente y otras por microcodigo.
>
> Exactamente, ese es el punto: los procesadores x86 modernos poseen un
> interprete!
>
> Dicho de otra forma, si pudieramos compilar (traducir "offline")
> directamente en el codigo "nativo" del procesador, nos ahorrariamos
> varios ciclos de cpu (y tal vez transistores si dejamos esa pega
> exclusivamente al ambiente); que se gastan en el interprete (traducir
> "online").
Dudo que se gane mucho ya que esa traduccion se ejecuta una sola vez,
antes de ejecutar un bloque. En una aplicación por ejemplo no es lento
ejecutar una sección secuencial de código ( O(1)) comparado con lo que
significa ejecutar un ciclo (O(n)). En este ultimo caso, el paso de
traduccion simplemente lo convierte en O(n+1), y si tenemos casos como
O(n^2) se transforma simplemente en O(n^2 + 2)
Respecto a la compilacion, la diferencia entre compilar un programa en C
y ejecutar bytecode (Java, C#) es que el programa compilado en C queda
en un archivo estático (offline como dices), y eso impide que se puedan
hacer optimizaciones en tiempo de ejecucion.
En Mono se puede indicar el flag -aot (ahead of time) para que los
no-creyentes tengan un archivo estatico para ejecutar.
Las diferencias van por otro lado, el paper que envió Daniel Serpell es
muy iluminador, aunque aun no lo he terminado de analizar por completo.
--
Franco Catrin L. TUXPAN Software S.A.
http://www.tuxpan.com/fcatrin
Más información sobre la lista de distribución Linux