Article View: es.comp.lenguajes.java
Article #26193Re: La supuesta portabilidad de C.
From: Guillermo Rodriguez Garcia
Date: Thu, 28 Jan 1999 00:00
Date: Thu, 28 Jan 1999 00:00
241 lines
12208 bytes
12208 bytes
El d�a Mon, 25 Jan 1999 18:18:24 +0100, Jonathan Revusky <jrevusky@jet.es> escribi�: >Es incorrecto obviamente. Pero no s� si es ilegal. Quiz� se describa >como ilegal en la especificaci�n, pero no me parece un argumento muy >potente en todo caso. En fin... >Incluso si es oficialmente ilegal, carece de significado. Si algo es >ilegal y no hay absolutamente ning�n mecanismo para "imponer la ley", su >ilegalidad es m�s bien te�rica. Por ejemplo, si hay un limite de >velocidad en una carretera de 100 km/h pero no hay ninguna vigilancia y >nunca te multan, ese l�mite no tiene importancia pr�ctica (por lo menos No s� a qu� viene esto, de verdad. >nadie que proporcione empleo y vivienda a cada espa�ol.) El argumento >que haces sobre lo que es legal, a nivel pr�ctico, me temo, no tiene >mucha base real. No hago ning�n argumento. Solo digo que el C es perfectamente portable si te atienes al est�ndar, que para eso est�. El hecho de que no haya miles y miles de controles y chequeos y vigilancias etc etc como los hay en Java es simplemente por motivos de *velocidad*, que teniendo en cuenta para qu� est� dise�ado C parece un factor bastante importante. >Pero todo eso nos lleva, como siempre, a la siguiente observaci�n. > >La portabilidad en C es algo: > >(1) definido de manera muy limitada La portabilidad de C est� perfectamente definida para permitir trabajar sin tener un overhead del 1000% s�lo en comprobaciones sobre si el programador es lo suficientemente inteligente como para no acceder a un elemento inexistente en un array, por ejemplo. Ya he dicho que el �nico motivo de no tener los muchos mecanismos que tiene Java de protecci�n contra errores son motivos de eficiencia, y est�n plenamente justificados.Repito por en�sima vez que me da exactamente igual que Java sea m�s portable que C o que deje de serlo. Lo que defiendo es que C puede ser perfectamente portable. >y > >(2) no tiene mucho significado pr�ctico. Claro, por eso herramientas como por ejemplo todas las de gnu est�n �ntegramente escritas en C y son perfectamente portables a docenas de sistemas distintos. >Eso a nivel de empresas grandes que pueden dedicar muchos a�os-hombre al >tema de portar software. A nivel de gente como yo, un desarrollador >independiente, o incluso empresas peque�as, a nivel pr�ctico, esa >portabilidad casi no existe. Nunca he dicho que el C sea un buen lenguaje para t�, ni para la gente como t�, ni para peque�as empresas que desarrollan mayoritariamente aplicaciones de gesti�n o similares. He dicho que el C es el lenguaje de los que desarrollan sistemas operativos, aplicaciones de sistema, herramientas, etc. Se me va a caer la boca de decirlo. >En el contexto de un foro sobre lenguaje Java, yo creo que es bastante >justo decir que "el C no es realmente portable". O bien, dicho de otro >modo, la portabilidad en el mundo C/C++ est� definida de forma tan >limitada, que no es lo que estamos llamando portabilidad en el mundo >Java en un principio. �Por qu� te empe�as en convencerme de que Java es m�s portable que C, cuando yo nunca he defendido lo contrario? Java es m�s portable que C, porque Java est� dise�ado con el objetivo prioritario de ser portable. C est� dise�ado con el objetivo prioritario de ser eficiente, y luego _permitir_ pero no_forzar_ la portabilidad, simplemente por una cuesti�n de versatilidad. > >> Por el contrario, un programa *ilegal* en C puede tener un >> comportamiento indefinido, o simplemente dependiente de la >> implementaci�n. <resto cortado> > >Ese tipo de cosa me suena tecnicismo de abogado, no realmente un >argumento de ingeniero. La definici�n que propuse, que el mismo programa >produce el mismo comportamiento en distintas plataformas, de punto de >vista de ingenier�a, me parece ser m�s o menos la definici�n correcta. Si un mismo programa produce el mismo comportamiento en distintas plataformas, el programa es portable. Y yo a�ado: en C puedes escribir programas perfectamente portables, siguiendo las directrices que marca el est�ndar ANSI C, que para eso se ha creado. Lo cual no impide que puedas escribir programas que NO sean portables, bien deliberadamente o bien porque no sepas escribir un programa que siga el est�ndar. El trozo de mi p�rrafo anterior que has cortado explicaba por qu� en Java dispones de un mecanismo de excepciones muy complejo y en C no: porque se decidi� que fuera as�, porque C ten�a que ser eficiente. Porque, como ya estoy harto de decir, Java est� pensado para aplicaciones de usuario y C para aplicaciones del sistema. >> No es m�a, es de las organizaciones ANSI e ISO, que me da a m� en la >> nariz que de esto deben saber un poco. > >Bueno, a m� lo que me da en la nariz es lo siguiente. En el comit�, >tienes representantes de los principales fabricantes de compiladores C, >que tienen muchas implementaciones incompatibles, y en vez de realmente >ponerse de acuerdo para hacerlos verdaderamente compatibles, redefinen >la palabra "compatible" o "portable" -- porque es m�s f�cil hacer eso >que hacer que las cosas sean compatibles o portables de verdad. >Supongo que es una interpretaci�n c�nica de todo eso. Si eso >escandaliza, lo siento. No me escandaliza, simplemente me parece un poco retorcido. Por cierto, que en el comit� no solo hab�a "fabricantes de compiladores". >> No es eso lo que he dicho. He dicho que no puedes basar tu c�digo en >> trabajar a base de excepciones. > >S�, bueno, pero la situaci�n de leer o escribir a un puntero inv�lido no >es precisamente muy excepcional en el mundo C. Es bastante cotidiano. No >obstante, el C no trata el problema. Decir "es ilegal" pero no hay >ning�n mecanismo que impone la m�s m�nima disciplina es realmente una >contradicci�n. No es ninguna contradicci�n. Es decir lo siguiente: si te atienes a las reglas, tu programa ser� portable. Si no te atienes a las reglas, puede funcionar, o puede no funcionar. No te vamos a "imponer la disciplina" porque eso supone una carga adicional que no queremos obligarte a sufrir, cuando probablemente no la necesites. >> No te confundas. El hecho de que punteros y arrays sean equivalentes >> en muchas ocasiones no quiere decir que sean totalmente >> intercambiables. De hecho, el est�ndar define cu�ndo son equivalentes >> y cuando no lo son; internamente cada compilador los puede implementar >> como le parezca, aunque lo l�gico es hacerlo mediante punteros. > >Para m�, el C no tiene arrays. Menos mal que para los programadores de C s� que los tiene. >Para ser un array, debe tener un >principio y un fin. Dicho de otro modo, un array tiene una dimensi�n. En >ese sentido, el Java tiene arrays y el C no los tiene. Tiene sintaxis de >arrays implementada con punteros. Un array tiene una dimensi�n, pero eso no implica que el lenguaje tenga que obligarte por narices a respetarla. Son cosas distintas. >> Y much�simos otros ejemplos. La llamada "equivalencia" de punteros y >> arrays en C no significa que sean totalmente id�nticos. Son >> equivalentes, por ejemplo, como par�metros formales en una funci�n, >> pero en muchos otros contextos no lo son. > >De hecho, ya era consciente de que hay diferencias sutiles en la >especificaci�n, pero a nivel pr�ctico, existe el mismo problema. El >puntero tiene un principio y ning�n fin definido. Pasar un array a una >funci�n es efectivamente lo mismo que pasar un puntero, y por lo tanto, Concretamente, pasar un array a una funci�n es equivalente a pasar un puntero al primer elemento del array. Pero de ah� no debes deducir que en cualquier otro contexto, un puntero y un array sean tipos equivalentes. Porque no lo son. Fin. >> === Empieza === >> 6.3: So what is meant by the "equivalence of pointers and arrays" >> in C? >> >> A: Much of the confusion surrounding arrays and pointers in C can >> be traced to a misunderstanding of this statement. Saying that >> arrays and pointers are "equivalent" means neither that they are >> identical nor even interchangeable. >> >> "Equivalence" refers to the following key definition: >> >> An lvalue of type array-of-T which appears in an >> expression decays (with three exceptions) into a >> pointer to its first element; the type of the >> resultant pointer is pointer-to-T. >> >> (The exceptions are when the array is the operand of a sizeof or >> & operator, or is a string literal initializer for a character >> array.) >> === Acaba === > >Pero bueno, citas los escritos sagrados que casi nadie lee... Anda, pues f�jate que casualidad, que los escritos sagrados "que casi nadie lee", como t� los llamas, son el FAQ de comp.lang.c, as� que me parece que no debe existir ning�n documento m�s le�do por la comunidad de programadores de C que ese. >(Espero que no he topado con algunos religiosos. Lo que quiero decir es >que todo eso es misticismo, que adem�s, prima facie, parece >contradecirse, o quiz� no se contradiga, yo que s�.. pero nadie lo >entiende realmente...) Querr�s decir que no lo entiendes t�. No extrapoles con tanta facilidad. De todas formas, si quieres te puedo poner m�s ejemplos y dar m�s explicaciones de por qu� punteros y arrays no son lo mismo, pero es que ya me parec�a un poco aburrido. >En el fondo, que es la diferencia entre eso y: > >"Hay fans de otros lenguajes que afirman que en C, los arrays, punteros, >y cadenas, es todo la misma cosa. Si es verdad que, bajo ciertas >condiciones, esas tres cosas son intercambiables, bla bla bla, las tres >cosas son elementos distintos... > >�No es simplemente m�s misticismo, que s�lo los te�logos entienden? Sin comentarios. >> No hablo de la libertad de escribir a una direcci�n de memoria >> inv�lida, ni a la libertad de que tropieces en un suelo lleno de >> porquer�a. Hablo de la libertad de tratar los arrays y los punteros >> como tipos equivalentes, en las situaciones en la que est� >> perfectamente especificado que puedes hacerlo. > >En el fondo, lo que est�s describiendo es la libertad de acceder a >memoria de forma inv�lida. Est�s hablando de la libertad de tratar >cualquier elemento -- un array, cadena, o en C++ un objeto -- como un >puntero crudo. Tengo serias dudas de que uno deber�a *querer* hacer eso. Bien: si no *quieres*, pues no lo hagas. Pero otros pueden *querer*, y entonces est� bien que *puedan* hacerlo. >En todo caso, la idea que esta libertad de romperse el culo produce >mucha eficacia en el c�digo resultante, la tratar� luego, ya que esto se >vuelve demasiado largo. Quer�a hablar de "la supuesta portabilidad de >C". La "supuesta eficacia de C" es algo que procurar� refutar luego, >cuando tenga un momento. Como quieras. Salu2: GUILLE ---- Guillermo Rodriguez Garcia <XXguille@XXiies.XXes> (ya sabes :-)
Technical Details
Message-ID:
<36b4aa0e.4641133@noticias.iies.es>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<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>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/01/28 Message-ID: <36b4aa0e.4641133@noticias.iies.es> X-Deja-AN: 437902544 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> Content-Type: text/plain; charset=ISO-8859-1 Organization: Telefonica Transmision de Datos Mime-Version: 1.0 Newsgroups: es.comp.lenguajes.java