🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: La supuesta portabilidad de C.

#26043
From: Guillermo Rodriguez Garcia
Date: Mon, 08 Feb 1999 00:00
213 lines
11456 bytes
El d�a Sun, 07 Feb 1999 13:57:35 +0100, Jonathan Revusky
<jrevusky@jet.es> escribi�:


>> S� que hay una diferencia principal, y es que las librer�as est�ndar
>> de Java son mucho m�s completas que las de C. Por eso un programa en
>> Java puede tener GUIs utilizando s�lo librer�as est�ndar, mientras que
>> en C no es as�... (pero esto no significa que no se pueda hacer de
>> forma portable. 
>
>Hay una diferencia b�sica. En C, tienes que saber por adelantado en qu�
>plataformas quieres que el c�digo corra y escoger las librer�as en
>funci�n de eso.

No te creas. Todas las librer�as importantes se portan a todos los
sistemas importantes, exactamente de la misma forma que Java se porta
a todos los sistemas importantes. Haz una aplicaci�n que use tcl/tk, o
V, y funcionar� en casi cualquier cosa.

>> Simplemente utiliza una librer�a adecuada, como por
>> ejemplo V), pero no es un problema de que el *lenguaje* sea m�s o
>> menos portable, sino de las librer�as.
>
>Las librer�as son un elemento de la rompecabezas. No obstante, no es el
>�nico elemento. Hasta el lenguaje Java es intr�nsecamente m�s portable
>que el lenguaje C. Como Juan Antonio indic�, la sem�ntica de Java se
>expresa en t�rminos de una m�quina virtual. Un programa v�lido en Java
>se reduce a una serie de instrucciones para esa m�quina *virtual*, que
>es una abstracci�n de una m�quina real. Bueno, eso quer�a matizar en un
>cierto momento, ya que por supuesto el C tambi�n incorpora una
>abstracci�n de la m�quina real. Cualquier lenguaje menos ensamblador,
>pens�ndolo. No obstante, hay una gran diferencia. En Java toda la
>sem�ntica de esas instrucciones (de hecho, uf, algunos matices me vienen
>en mente...pero bueno) est� definida de una manera independiente de la
>m�quina real.

Y eso tiene la ventaja de que todo lo que escribas es perfectamente
portable, y la DESVENTAJA de que es IMPOSIBLE escribir algo que
aproveche las caracter�sticas de una determinada m�quina o de un
determinado S.O., en aras de la portabilidad.

Por eso digo que C puede ser portable pero no te obliga a serlo.


Mira, para que dejemos de hablar de vaguedades y teor�as ambiguas, te
voy a citar ejemplos concretos. Me pongo a pensar en las aplicaciones
que yo he desarrollado en los �ltimos meses. T� puedes hacer lo mismo.

Un par de aplicaciones de las que yo llamo "de usuario":

1. Una aplicaci�n de gesti�n hotelera (no suelo hacer este tipo de
cosas, pero se trataba de una ocasi�n especial). ESTO es lo que llamo
aplicaciones de usuario (ahora ver�s el contraste con las que vienen
despu�s). Ni se me ocurre hacerla en C, porque tendr�a que trabajar el
triple. Ning�n problema en reconocerlo. La pod�a haber hecho en Java,
pero la hice en Delphi 4 porque *no* necesitaba que fuese portable, y
con Delphi puedo utilizar caracter�sticas espec�ficas de W95 mientras
que con Java NO PUEDO.

2. Una aplicaci�n estilo "chat", con algunas particularidades, para
correr en una red local en la que hab�a diferentes tipos de equipos.
Esta sigue estando en lo que yo considero aplicaciones de usuario.
Aqu� si que necesitaba portabilidad, y no ten�a que acceder a recursos
concretos de cada m�quina o S.O. Bueno, pues ESTA la hice en Java.

Y un par de aplicaciones que NO son aplicaciones de usuario:

3. Un analizador de espectros en tiempo real para frecuencias de
audio, que necesitaba para realizar un procesado digital de la se�al.
B�sicamente lo que hace es muestrear audio hasta 44 kHz, a 8/16 bits,
en mono/est�reo, calcular el espectro de la se�al o el espectrograma,
seg�n el modo de trabajo, enventanarla con diferentes funciones,
realizar filtrados de tipos diversos, etc., y todo esto en tiempo real
(70 fps). Esto no es una aplicaci�n de usuario, esto es una
herramienta. Evidentemente la hice en C. Y no es nada portable, por
cierto, ni falta que hace. Ahora bien, te reto no ya a hacer esto de
forma eficiente en Java, sino simplemente a _hacerlo_ en Java, y ver�s
qu� quiero decir.

4. Una aplicaci�n de visi�n artificial que reconoce matr�culas de
veh�culos a partir de fotograf�as tomadas por una c�mara digital. El
programa encuentra la placa en la imagen, la segmenta e identifica los
caracteres. Esta tambi�n est� hecha integramente en C, y hay dos
versiones: una de consola que funciona en *cualquier* sistema que
tenga un compilador de C, aunque sin mostrar im�genes, solo texto,  y
otra con GUI (basado en V), que corre bajo Windows (95, 98 y NT),
OS/2, Mac y cualquier sistema Unix con X.-Windows. La pod�a haber
hecho en Java, aunque probablemente hubiera salido algo m�s lenta
(realiza c�lculos intensivos). En cualquier caso la hice en C y es
perfectamente portable.


Bueno, pues aqu� tienes casi un ejemplo de cada tipo:

- Una aplicaci�n de usuario que se pod�a haber hecho en Java pero
result� m�s f�cil y apropiado hacerla usando una herramienta RAD. Es
decir, que la portabilidad es buena... pero no siempre necesaria.

- Una aplicaci�n de usuario en la que le mejor elecci�n era Java.

- Una herramienta que es IMPOSIBLE hacer con Java

- Una herramienta que se podr�a hacer con Java pero que est� hecha en
C y es perfectamente portable.


Lo cual, me parece a m�, demuestra los dos principales puntos que
intento defender en esta discusi�n:

a) Que C puede ser portable.
b) Que con Java no se puede hacer de todo.

�Te siguen pareciendo argumentos de abogado?


>A diferencia de eso, en el coraz�n mismo de C, hay una sintaxis de
>punteros y aritm�tica de punteros sin restricciones -- y la sem�ntica de
>los punteros es necesariamente distinta para cada m�quina ya que depende
>sutilmente (y a veces no tan sutilmente) del modelo de memoria de cada
>SO y procesador. Para m�, eso ser�a un motivo inescapable para tener que
>concluir que C no es intr�nsecamente portable en el mismo sentido que
>Java.

Pues no s� por qu� dices eso: de cara al programador da exactamente
igual como funcionen los punteros por dentro. Yo he escrito programas
en C que utilizaban punteros y han funcionado en una gran cantidad de
m�quinas diferentes y en muchas de ellas no ten�a ni pu�etera idea de
c�mo iban los punteros por dentro, ni falta que me hac�a. La sintaxis
es la que te da el lenguaje, no depende de la m�quina.
 
>Otro motivo importante por el cual C es intr�nsecamente no portable --
>por lo menos compar�ndolo con Java -- es que Java lleva incorporado en
>el lenguaje mismo una sem�ntica de programaci�n multitarea. Ya que los
>programas no triviales hoy d�a tienden a ser multitarea, eso representa
>una gran limitaci�n de la portabilidad de C, una limitaci�n superada
>claramente por Java.
>
> 
>> Por otra parte, he visto que le contestabas a Enrique que en C hay que
>> recompilar para cada m�quina, mientras que en Java tienes lo que has
>> llamado "un �nico binario ejecutable". Eso es simplemente porque Java
>> normalmente es int�rpretado (dentro de esta categor�a incluyo los
>> compiladores JIT) 
>
>�C�mo dices? Guillermo, para que lo sepas. Los compiladores JIT compilan
>de verdad. Generan instrucciones de m�quina. La compilaci�n JIT ocurre
>la primera vez que una clase se carga en memoria. Y se ejecuta c�digo
>compilado comparable en eficacia con el c�digo generado por compiladores
>de otros lenguajes.

Para empezar, te agradecer�a que no utilizaras ese tono paternalista
conmigo. Si te das cuenta no estoy hablando aqu� de eficiencia, sino
de que en Java tienes un �nico archivo binario (pero no EJECUTABLE,
como t� lo has llamado) simplemente porque hay un int�rprete debajo
que es qui�n lo ejecuta. Y en este sentido da igual que se trate o no
de un compilador JIT, da igual la eficiencia y da igual lo que genera.
El caso es que el archivo binario NO es directamente ejecutable, y esa
es la �nica raz�n para no tener que recompilar en cada m�quina como en
C.

Aparte de lo cual, tienes que reconocer que _conceptualmente_, un
compilador JIT no es m�s que un int�rprete extremadamente sofisticado
e inteligente. Dejando aparte temas de rendimiento, de eficiencia, de
s� genera c�digo m�quina que despu�s ejecuta o lo que le de la gana de
generar, el caso es que sin �l, el programa no funciona. Y esa es
esencialmente la caracter�stica de un programa interpretado.

>> y C compilado, pero sigue sin ser una caracter�stica
>> esencial del lenguaje, m�s bien del entorno.
> 
>> A pesar de todo, nunca he tenido problema en reconocer que Java es m�s
>> portable que C. 
>
>Si t� lo dices. :-)

No es solo que lo diga, es que estoy harto de repetirlo. Te invito a
que repases todos mis mensajes, si no te acuerdas. He dicho mil veces
que no discuto que Java sea m�s portable que C, o portable en un
sentido diferente, o m�s c�modo, etc. Lo �nico que defiendo es que hay
cosas que con Java no se pueden hacer, por una parte, y que C puede
ser perfectamente portable, por otra.

>
>> Pero eso no significa que la portabilidad de C sea
>> "pura teor�a" como t� dices.
>
>Mira, yo apostar�a que todas las empresas principales de Software --
>IBM, Microsoft, Adobe, Corel, etcetera -- tienen grupos enteros de
>trabajo donde la gente no hace m�s que portar c�digo.

Pff.. Empresas como IBM, Microsoft, Adobe o Corel deben tener grupos
enteros de trabajo hasta para limpiar las bolitas del rat�n.

>Para m�, la portabilidad de C es algo te�rico. Puedes afirmar que ANSI C
>es portable pero tienes que condicionar y matizar la afirmaci�n hasta
>tal punto que, al fin y al cabo, no tiene mucho significado.

No, f�jate que poco matizo:

"Un programa escrito siguiendo las directrices que dicta el est�ndar
ANSI C es perfectamente portable. Un programa escrito en C que no siga
el est�ndar puede funcionar perfectamente pero no ser� necesariamente
portable"

>Cierro este mensaje aqu�, porque todo esto se vuelve largo y quiz�
>conteste al resto por separado cuando tenga un momento.

Vaya, pero si te has dejado la parte m�s interesante.

Salu2: GUILLE
----
Guillermo Rodriguez Garcia
<XXguille@XXiies.XXes>  (ya sabes :-)
Technical Details
Message-ID: <36bf0d4c.2885808@noticias.iies.es>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <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> <36B22A44.44F9B181@jet.es> <36bc4728.97809@noticias.iies.es> <36BD8DBF.43818422@jet.es>

Show Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII
X-Google-Thread: 1116f3,4e17c3721247235e
X-Google-Attributes: gid1116f3,public
From: XXguille@XXiies.XXes (Guillermo Rodriguez Garcia)
Subject: Re: La supuesta portabilidad de C.
Date: 1999/02/08
Message-ID: <36bf0d4c.2885808@noticias.iies.es>
X-Deja-AN: 441913814
Content-Transfer-Encoding: 8bit
References: <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> <36B22A44.44F9B181@jet.es> <36bc4728.97809@noticias.iies.es> <36BD8DBF.43818422@jet.es>
Content-Type: text/plain; charset=ISO-8859-1
Organization: Telefonica Transmision de Datos
Mime-Version: 1.0
Newsgroups: es.comp.lenguajes.java