🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.lenguajes.java
Article #26060

Re: La supuesta portabilidad de C.

#26060
From: Jonathan Revusky
Date: Tue, 09 Feb 1999 00:00
222 lines
13892 bytes
Alberto Planas Dominguez wrote:
> 
> Jonathan Revusky wrote:
> 
> [Se comentaba que...]
> > > Hay una diferencia ESENCIAL  entre JAVA y C que claramenteproporciona portabilidad >frente a velocidad.
> >
> > La otra cosa que matizar�a es que creo que lo de arriba es un falso
> > paralelismo. Se puede decir de modo muy tajante que Java es m�s portable
> > que C. Pero no se puede decir lo mismo sobre la velocidad de C. Y de
> > hecho, la velocidad no es una prestaci�n de un lenguaje realmente. Es
> > una prestaci�n de una implementaci�n de un lenguaje. El �nico modo en
> > que se puede afirmar de modo tajante que C es mucho m�s r�pido que Java
> > -- y quiero decir como regla -- ser�a comparando el C compilado con Java
> > interpretado. Y esa es claramente una comparaci�n injusta.
> 
>   Una notilla sobre la �velocidad del lengiaje�. Creo que algunas ideas
> no se tienen muy claras respecto a lo que es un lenguaje. Es mucho mas
> util considerar el lenguaje como el conjunto de reglas lexicas,
> sintacticas y semanticas que nos permiten expresar un algoritmo. Los
> lenguajes incorporan en estas reglas facilidades para expresar y
> entender estos conceptos. Por esa misma razon un lenguaje no puede ser
> mas rapido que otro. La velocidad aqui seria responsabilidad del
> algoritmo utilizado.

Bueno, eso suena como un pasaje de un libro de texto de universidad. Lo
le� y me pareci� como uno de esas afirmaciones te�ricas que tiene alg�n
defecto y finalmente, me parece que lo he descubierto. Supongo que la
afirmaci�n es cierta, pero es que pasa por alto un aspecto de las cosas,
la noci�n del uso "idiom�tico" del lenguaje. Es decir, si coges un
programa en C y pasas el algor�tmo directamente a Java sin m�s, supongo
que acabas con una sola clase enorme con nada m�s que m�todos est�ticos.
En principio, lo podr�as compilar luego a un ejecutable nativo y supongo
que no tendr�a porque ejecutarse a una r�pidez muy distinta del programa
en C. El problema es que no ser�a Java idiom�tico. O Java de verdad,
como quieras.

En realidad, si hablamos de pasar del C a Java, eso normalmente
significa adoptar un enfoque de POO y usar clases e interfaces y
herencia. Y en la pr�ctica, el modelo de programaci�n orientada objetos
tiende a suponer alg�n coste de velocidad. Eso dicho, un compilador con
un optimizador muy sofisticado puede reducir dram�ticamente ese coste.
Pienso en cosas como inlining y lo que se llama returned-value
optimization.

Adem�s, se tendr�a que decir que, para los m�todos cruciales de punto de
vista eficacia, se puede prescindir de la invocaci�n virtual, declarando
los m�todos cr�ticos "final" o "static". De todas formas, para la
mayor�a de c�digo que uno escribe, el coste pr�ctico del model POO es
nulo, porque el c�digo no es cr�tico de punto de vista eficacia.
Entonces, en general, para la gran parte de lo que uno hace, me parece
que el enfoque POO es el enfoque correcto.

>   Pero claro, esto no tiene naada que ver con Java y C/C++. Estos
> lenguajes deben de implementarse en maquinas reales. Aqui si podemos
> hablar de lenguajes rapidos, ya que algunos permiten que la traduccion
> de codigo nativo (asm) sea mucho mas eficiente. En este caso tanto Java
> como C/C++ son perfectamente equiparables. Los dos tienen construcciones
> similares, y el problema de la herencia ya no supone carga alguna.
> 
>   La compilacion que Java se realiza para una maquina virtual, invitando
> a considerar la ejecucion del codigo como un paso intermedio entre la
> interpretacion y ejecucion nativa. Con la llegada de los JITs esta
> interpretacion se acerca aun mas a la ejecucion nativa del codigo, pero
> sigue suponiendo una carga para el procesamiento.

En el sentido de que, al momento de cargar la clase, se tiene que hacer
la compilaci�n de bytecode a c�digo nativo. Pero en realidad, eso puede
ser tan r�pido que no supone ning�n coste importante. Y es un coste que
se impone todo por adelantado. No tiene porque afectar la velocidad de
ejecuci�n. El problema actual es un problema de implementaci�n. Bajo
Win32, por lo menos, la compilaci�n JIT no s�lo compila tu programa sino
todas las clases de las librer�as empezando por java.lang.Object y
java.lang.Thread. Y eso s� que supone un coste. Pero l�gicamente,
deber�a haber un mecanismo de cache para esas clases. Creo que en el
futuro, sacar�n sistemas operativos que son "java-aware" y guardar�n un
cache para las clases m�s usadas.

Aun y as�, hay motivos por los cuales un compilador est�tico puede
producir c�digo m�s eficaz. En general, el compilador est�tico dispone
de m�s informaci�n. Por ejemplo, incluso si un m�todo es virtual, el
compilador est�tico podr�a prescindir de la b�squeda din�mica si sabe
que s�lo hay un m�todo que se puede invocar. Es decir, es un sistema
cerrado en que todas las clases que se pueden instanciar ya se conocen
por adelantado. En contraste, un runtime Java es un sistema abierto y se
puede cargar m�s clases durante la ejecuci�n del programa. Entonces, hay
optimizaciones que no son posibles. El otro motivo es que un compilador
est�tico puede pasar m�s tiempo analizando la informaci�n que tiene. 

>   Asi que cuando se habla de lenguajes veloces, �en que nivel nos
> referimos? :????
> 
> > Java tiene una sem�ntica distinta y el conjunto de optimizaciones
> > posibles es distinto. Te�ricamente hay factores que dar�an una ventaja
> > al C pero tambi�n hay factores que dar�an una ventaja a Java.
> 
>   :)))) No son tan distintos, 


Bueno, son m�s distintos de lo que pareces darte cuenta. Hasta se puede
decir que la semajanza entre Java y C++ es m�s bien superficial. Y es
enga�osa.

> solo que las optimizaciones de Java no
> pueden llegar a tener en cuenta el procesador sobre en que se ejecutara
> (reordenamiento de instruciones, uso de registros, prediccion de
> saltos).

Un poco confuso, lo que dices. Las optimizaciones indicadas depender�an
del procesador y el bytecode representa un formato �nico para cualquier
plataforma. Entonces, l�gicamente, la etapa de optimizaci�n tiene que
ser hecho a partir del bytecode de todas formas. Y es lo que hace un
compilador JIT. O un compilador est�tico que coge bytecode de entrada y
crea un ejecutable nativo de salida.

> Tengo entendido que algunos JIT realizan esta fase de la
> optimizacion.

S�, aunque hay ciertas limitaciones, ciertas optimizaciones que no
pueden hacer porque no pueden llevar a cabo una an�lisis global del
c�digo. (Despu�s de todo, se puede cargar m�s c�digo durante la
ejecuci�n, �no?) Y tambi�n hay una restricci�n de tiempo como cuesti�n
pragm�tico. Pero, de hecho, es sorprendente ver hasta qu� punto un
compilador JIT puede optimizar. Y el campo est� aun en su infancia.
 
> > Entonces, el falso paralelismo de portabilidad frente a velocidad es lo
> > siguiente:
> >
> > Java, como lenguaje, no tiene un problema *intr�nseco* de velocidad. Es
> > todo cuesti�n de implementaci�n.
> 
>  :)) Cherto, a ese nivel LISP, Java, Smalltalk, Eiffel y todos los
> lenguajes funcionales e imperativos son igualmente veloces. Occam y
> algunos otros para multiprocesadores y los logicos..... quizas sean los
> unicos capaces de situarse a distinto nivel de velocidad.

En la realidad, quiz�s el factor dominante es cu�nto esfuerzo se pone en
crear implementaciones muy optimizadas. Java, a diferencia de los otros
lenguajes que mencionas, parece tener una movida tal que, se puede decir
que si es posible crear una implementaci�n de Java optimizado hasta el
mismo nivel que el C compilado, se har�. Simplemente hay demasiado
armamento intelectual apuntado al problema.

>   Otra cosa que me gustaria comentar es que no se puede comparar la
> protabilidad de Java con C, como lenguajes su portabilidad esta
> asegurada siempre que usemos compiladores de versiones iguales. (Lease
> lo de versiones C K&R y ANSI, y Java como 1.0, 1.1 y 1.2)
> 
>   No hay que confunvir la portabilidad de Java con la portabilidad del
> lenguaje Java. Java no es solo un lenguaje. Java esta definido como una
> plataforma. Java, como lenguaje, no es gran cosa. Es bonito que no
> incorpore herencia multiple pero si interfaces multiples. Queda feo en
> la declaracion de clases internas.... Es solo un lenguaje mas. Algunos
> pensaran que Eiffel es mejor lenguaje, otros creeran que como Smalltalk
> ninguno...., po vale :)

Tienes raz�n. Java es m�s que el lenguaje. Pero todo se dise�o junto, el
lenguaje, el bytecode, las librer�as. No es tan f�cil definir una l�nea
fina donde una cosa empieza y otro acaba. Como lenguaje, es un lenguaje
m�s, y tiene sus defectos. Pero me recuerda algo que dijo Alan Kay, me
parece. El dijo que el Macintosh era el primer ordenador lo
suficientemente bueno como para criticarlo. Es que para que sea
interesante criticar algo, tiene que llegar a un cierto nivel. Me parece
que, como lenguaje, Java es bastante bueno para que sea interesante
criticarlo. Eiffel y Smalltalk, los cuales conozco poco, sospecho que
tambi�n merecen una cr�tica. C y C++, muy francamente, no llegan a ese
nivel. Esos lenguajes son tan obviamente malos que no vale la pena
criticarlos. Bueno, el C tiene una virtud. Es muy sencillo. Es lo que
es. Muy primitivo y limitado, un denominador com�n al cual siempre se
puede recurrir cuando hace falta hacer programaci�n de bajo nivel. Lo
aprendes y es otra herramienta que tienes. Pero realmente no veo ninguna
justificaci�n para el C++, el esfuerzo intelectual que hace falta para
aprender todos sus rincones. Alguien me dijo (no cualquiera, alguien que
estaba en el comit� de normalizaci�n) que Bjarne Stroustrup dijo en
alg�n momento que consideraba que la sintaxis del C++ era un experimento
que hab�a fracasado. Supongo que quer�a decir el experimento de agregar
toda una sintaxis de POO encima de un viejo lenguaje procedural
manteniendo una casi completa compatibilidad hacia atr�s. Pero no estoy
100% seguro que lo dijo de verdad. O a lo mejor estaba borracho y lo
reconoci� en un momento de debilidad. Los escandinavos beben mucho
despu�s de todo. Pero me gustar�a encontrar la referencia.

> 
>   La plataforma Java si es un sue�o que tiene trazas de realidad, Y eso
> me encanta. Saber que puedo programar con INDEPENDENCIA del sistema
> operativo subyacente.... Java nos abre muchas puertas a los que adoramos
> la programacion distribuida. Pero nos cierra otras. Estas puertas son
> las que, precisamente, tienen que ver con las opciones que la plataforma
> Java no recoje, pero si oferta el sistema operativo. Quizas, para
> solucionar esto, la libreria de clases de Java tengan que crecer en otra
> direccion. Mi opinion es que SUN hace lo correcto al hacer crecer Java
> solo hacia la programacion distribuida, ya que acercarse a la maquina
> supondria crear una plataforma equivalente a un sistema operativo.

Est�n enfatizando los aspectos din�micos de Java, es decir, los que
tienen que ver con el ClassLoader y el SecurityManager, el hecho de
poder cargar clases y objetos indistintamente del disco local o la red
-- los applets, los servlets, servidores de aplicaciones...  Lo que pasa
es que un modelo de compilaci�n din�mica puede tener un cierto coste de
eficacia (que, como vemos, no tiene que ver con el lenguaje en s�) pero
lo que pasa es que son los aspectos din�micos de Java que lo hacen tan
especial. Y en esos dominios, Java tiende a ser suficientemente r�pido
de todas formas. As� que, bueno, estoy de acuerdo que ellos tienen raz�n
al enfatizar esos aspectos. No obstante, no est�n desanimando a nadie de
implementar Java como lenguaje compilado est�ticamente y hay empresas
entrando en ese vac�o tambi�n. Y bueno, como dije antes, no veo
especialmente porque Java compilado est�ticamente tiene porque ser m�s
lento que C++ o incluso C compilado est�ticamente. Hay expertos que
dicen que incluso tender� a ser� m�s r�pido.

El argumento de la forma "Java es lento y C es r�pido" no me impresiona
especialmente. Me parece probable que es una situaci�n m�s bien
temporal.

Saludos,

Jonathan Revusky
-- 
Java and Delphi Consulting
Make your .class files double-clickable
with SmartJ
http://www.bigfoot.com/~crystalline.solutions
Technical Details
Message-ID: <36C0BBA6.500B0EA4@jet.es>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <367ecc2b.2367399@noticias.iies.es> <01be2d1e$9894a5e0$e6164cc3@default> <75ntf6$vgl$1@news.udl.net> <01be2f3f$b70425a0$65164cc3@default> <3685c875.1606618@noticias.iies.es> <3686AEA6.95121EF7@jet.es> <36895642.1240659@noticias.iies.es> <3695DAA5.554C94F2@ibm.net> <3698a74d.1128294@noticias.iies.es> <36A384E0.4EC6BEC@jet.es> <36a59e89.1856809@noticias.iies.es> <36A50AD4.FC2F8B7A@jet.es> <36a8acca.4654561@noticias.iies.es> <36ACA760.8FD40701@jet.es> <36b4aa0e.4641133@noticias.iies.es> <36B5F161.EBCF71E5@tid.es> <36B9F497.1C0EAC3A@jet.es> <36C041EA.41C6@ac.uma.es>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: 1116f3,4e17c3721247235e
X-Google-Attributes: gid1116f3,public
From: Jonathan Revusky <jrevusky@jet.es>
Subject: Re: La supuesta portabilidad de C.
Date: 1999/02/09
Message-ID: <36C0BBA6.500B0EA4@jet.es>
X-Deja-AN: 442588581
Content-Transfer-Encoding: 8bit
References: <367ecc2b.2367399@noticias.iies.es> <01be2d1e$9894a5e0$e6164cc3@default> <75ntf6$vgl$1@news.udl.net> <01be2f3f$b70425a0$65164cc3@default> <3685c875.1606618@noticias.iies.es> <3686AEA6.95121EF7@jet.es> <36895642.1240659@noticias.iies.es> <3695DAA5.554C94F2@ibm.net> <3698a74d.1128294@noticias.iies.es> <36A384E0.4EC6BEC@jet.es> <36a59e89.1856809@noticias.iies.es> <36A50AD4.FC2F8B7A@jet.es> <36a8acca.4654561@noticias.iies.es> <36ACA760.8FD40701@jet.es> <36b4aa0e.4641133@noticias.iies.es> <36B5F161.EBCF71E5@tid.es> <36B9F497.1C0EAC3A@jet.es> <36C041EA.41C6@ac.uma.es>
X-Accept-Language: en
Content-Type: text/plain; charset=iso-8859-1
X-Complaints-To: usenet@lola.ctv.es
X-Trace: lola.ctv.es 918600990 16822 194.224.182.89 (9 Feb 1999 22:56:30 GMT)
Organization: CTV/JET
Mime-Version: 1.0
Reply-To: jrevusky@bigfoot.com
NNTP-Posting-Date: 9 Feb 1999 22:56:30 GMT
Newsgroups: es.comp.lenguajes.java