Vous êtes sur la page 1sur 18

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java

V1.1 - AmericaTI.com
11 de Noviembre de 2006

Tabla de contenidos
Intro ...................................................................................................................... 1 Autora y Copyright ...................................................................................... 1 Revisiones .................................................................................................... 2 Introduccin Histrica .......................................................................................... 2 Lenguaje C .................................................................................................. 2 Lenguaje C++ .............................................................................................. 3 Lenguaje Java .............................................................................................. 3 Criterios de Comparacin .................................................................................... 4 Expresividad ................................................................................................. 5 Bien Definido ............................................................................................... 6 Tipos y estructuras de datos ....................................................................... 7 Modularidad ................................................................................................. 9 Facilidades de entrada-salida ...................................................................... 9 Transportabilidad/Portabilidad .................................................................... 10 Eficiencia/Performance ............................................................................... 11 Pedagoga .................................................................................................. 14 Generalidad ................................................................................................ 14 Estandarizacin .......................................................................................... 14 Evolucin: Qu est ocurriendo con el lenguaje? .................................... 15 Soporte de Libreras: Qu NO se debe reescribir? .................................. 15 Cuadro Resumen ............................................................................................... 16 A. Referencias ..................................................................................................... 17

Intro
Este documento pretende hacer una comparacin informal de los lenguajes C, C ++ y Java, poniendo nfasis en sus mutuas ventajas y desventajas, as como en su aplicabilidad.

Autora y Copyright
Este documento tiene copyright (c) 2006 AmericaTI EIRL (www.americati.com.) Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los trminos de la "GNU Free Documentation License, Version 1.2", excepto en lo mencionado en el siguiente prrafo. Esta licencia puede obtenerse en: http://www.gnu.org/licenses/ fdl.txt 1

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java Si se desea crear un trabajo derivado o publicar este documento para cualquier propsito, por favor contactarnos (va nuestra pgina web) a fin de tener la oportunidad de proporcionar una versin ms reciente. De no ser esto posible, la ltima versin debera estar disponible en el sitio web AmericaTI.com. [http:// www.americati.com] Son bienvenidas todas las sugerencias y correcciones. Este documento fue confeccionado con DocBook utilizando el preprocesador Qdk disponible en SourceForge.net. [http://qdk.sourceforge.net]

Revisiones
0.1 2006-10-11 Primera versin preliminar - Introduccin histrica 0.2 2006-10-15 Seccin Performance/Eficiencia 0.3 2006-10-15 Seccin de Portabilidad. Mejoras en Performance/Eficiencia 0.4 2006-10-17 Secciones Expresividad, Bien definido y Modularidad 0.5 2006-10-18 Mejoras en seccin Expresividad. Seccin Tipos de Datos. dos ejemplos ilustrativos 0.6 2006-10-19 Secciones Facilidades de I/O y pedagoga 1.0 2006-10-21 Se completan todas las secciones pendientes 1.1 2006-11-11 Se agrega ejemplo de vector con Glib

Introduccin Histrica
A fin de comprender mejor las ventajas y desventajas de estos lenguajes, es conveniente conocer al menos superficialmente la historia de los mismos, lo cual nos permitir tener una idea preliminar acerca de su aplicabilidad.

Lenguaje C
El lenguaje C es creado entre los aos 1972-1973 por un equipo de programadores de los antiguos Laboratorios Bell de AT&T. Dennis Ritchie dise e implement el primer compilador de lenguaje C en un (prehistrico?) computador PDP-11. El lenguaje C se bas en dos lenguajes (prcticamente desaparecidos): "BCPL", escrito por Martin Richards, y "B", escrito por Ken Thompson en 1970 para el primer sistema UNIX en un PDP-7. Un recuento bastante detallado de estos aos se puede encontrar en [1], en el que se puede apreciar el caracter experimental de su desarrollo, as como las diversas influencias 2

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java de otros lenguajes de programacin y los diversos compromisos de eficiencia que tuvieron que afrontar. El lenguaje C originalmente "oficial" fue el "K&R C"[2]. Ese nombre proviene de los nombres de los autores del libro "The C Programming Language" (primera edicin), a saber, Brian Kernigham y Dennis Ritchie, el cual fue durante muchos aos la "referencia oficial" del lenguaje. Hacia 1988-1989 (luego de varios aos de propuestas y acuerdos preliminares), el American National Standards Institute" (ANSI) adopt una versin mejorada de C, conocida hasta hoy como "ANSI C" o C89. Esta es la versin descrita en la segunda edicin de "The C Programming Language -- ANSI C". La versin ANSI C contiene una importante revisin a la sintaxis, especialmente para el uso de funciones (que fue tomada del lenguaje C+ +), as como la estandarizacin (parcial) de las libreras del sistema. La ltima revisin del lenguaje C es conocida como "C99"[3] y no est (en este momento) soportada en forma completa por la mayora de compiladores, por lo cual gran parte de programadores siguen empleando (muchas veces por desconocimiento) slo lo que proporciona la versin "C89". Adems de libros como [4], existe mucha informacin online para aprender este lenguaje, por ejemplo [5], [6],[7].

Lenguaje C++
Bjarne Stroustrup crea una versin experimental denominada "C with Classes" hacia 1979, con la intencin de proporcionar una herramienta de desarrollo para el kernel Unix en ambientes distribuidos. En particular, l considera que ciertas caracteristicas del lenguaje "Simula" (notablemente su orientacin a objetos) son tiles en desearrollos de software complejos, pero a la vez que dicho lenguaje no proporciona la performance necesaria para el contexto de sistemas operativos. Es as como decide extender el lenguaje C. En 1983 el lenguaje se rebautiza como C++ y en 1985 Stroustrup publica la primera edicin del libro "The C++ Programming Language" que sirvi de estndar informal y texto de referencia. Posteriormente el lenguaje fue estandarizado (ISO C++) y paralelamente son publicadas la segunda y tercera ediciones de "The C++ Programming Language"[8] de modo tal que reflejan estos cambios. Ms detalles se pueden e interesantes opiniones se pueden leer en [9]. Desde sus inicios, C++ intent ser un lenguaje que incluye completamente al lenguaje C (quiz el 99% del cdigo escrito en C es vlido en C++) pero al mismo tiempo incorpora muchas caracteristicas sofisticadas no incluidas en aqul, tales como: POO, excepciones, sobrecarga de operadores, templates o plantillas. Una visin general del lenguaje se pude obtener en [10]. Diversos tutoriales y textos como [11], [12] proporcionan abundante informacin educativa.

Lenguaje Java
Java originalmente fue denominado "Oak". Sus inicios datan de 1991 cuando James Gosling (en Sun Microsystems) encabez un proyecto cuyo objetivo original era implementar una mquina virtual ampliamente portable y un lenguaje de programacin ambos orientados a dispositivos "embedded"[13] (procesadores 3

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java incorporados en diversos dispositivos de consumo masivo como VCR's, tostadoras, PDA's, telfonos mbiles, etc.) La sintaxis del lenguaje hered caractersticas de C y C++, explcitamente eliminando aquellas que para muchos programadores (segn los diseadores) resultan excesivamente complejas e inseguras. Con el auge de Internet, pareci natural aprovechar este lenguaje para desarrollar aplicaciones distribudas y portables. La primera implementacin de Java data de 1995 y pronto los "navegadores web" incorporaron soporte Java para la ejecucin de pequeas aplicaciones interactivas (Applets.) En la actualidad su uso es promovido para el desarrollo de aplicaciones empresariales del lado del servidor, especialmente a travs del estndar J2EE, as como en dispositivos mviles (a travs del estndar J2ME.) En realidad, Java hace referencia a un conjunto de tecnologas entre las cuales el lenguaje Java es slo una de ellas. Por tal motivo muchas veces se habla de la "plataforma Java", la cual es indesligable del lenguaje. Sun controla los estndares de Java a travs de un mecanismo de apertura parcial denominado el Java Community Process (JCP.) Una gran cantidad de documentacin online para el aprendizaje se de Java se puede hallar en [14].

Criterios de Comparacin
Comparar lenguajes de programacin nunca ha sido una tarea sencilla ni objetiva. En [15] se proporcionan nueve "criterios para la evaluacin y comparacin de lenguajes" (ver tambin [16] para una alternativa ms sencilla.) Un listado de estos criterios (con ligeras modificaciones) se presenta a continuacin: 1. Expresividad: Facilidad del lenguaje para expresar los algoritmos 2. Bien Definido: Consistencia y falta de ambigedad 3. Tipos y estructuras de datos 4. Modularidad: permitir el desarrollo de componentes independientemente 5. Facilidades de entrada-salida: Soporte para interaccin con el entorno 6. Transportabilidad/Portabilidad 7. Eficiencia/Performance 8. Pedagoga: Facilidad de aprendizaje y enseanza 9. Generalidad: Aplicabilidad, Uso Esta lista es utilizada en dicha referencia para comparar lenguajes de programacin en un espectro muy amplio (desde LISP hasta COBOL pasando por ALGOL) pero puede servirnos como punto de partida. Considero importante agregar los siguientes aspectos: 4

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java 1. Estandarizacin: Quin controla el lenguaje? 2. Evolucin: Qu est ocurriendo con el lenguaje? 3. Soporte de Libreras: Qu NO se debe reescribir?

Expresividad
El lenguaje C siempre fue distinguido como altamente expresivo y potencialmente muy econmico dada su reducida cantidad de palabras clave y el poder de algunos de sus operadores (por ejemplo, de los punteros.) En la actualidad, sin embargo, es frecuente el deseo de soportar estructuras de programacin cada vez ms complejas (aunque con frecuencia con los mismos algoritmos) con lo cual las implementaciones en lenguaje C tienden a tornarse oscuras (e inseguras) frente a equivalentes en otros lenguajes. El lenguaje C++ proporciona un gran salto cualitativo frente a C al proporcionar nuevas caractersticas tiles en diversos contextos. Por ejemplo, la sobrecarga de operadores dota al lenguaje de una expresividad notable cuando se implementan aplicaciones cientfico-matemticas (aunque en otros contextos pueden crear confusin); la sintaxis de clases y objetos permite manipular convenientemente diversas estructuras de datos y operaciones; las excepciones permiten procesar de un modo claro (aunque a veces con ms cdigo) los casos de error; los templates se pueden considerar (superficialmente) como macros de precompilador pero con muchas ms caractersticas, etc. sin embargo, todo esto no ha estado excento de errores, en gran parte causados por mantener la compatibilidad con C (por ejemplo, ver [17]) tanto a nivel de sintaxis de lenguaje (compilacin) como durante las etapas de enlace y ejecucin. En suma, el C++ es ms expresivo que el C para la mayora de aplicaciones medianas a grandes, lo cual es de esperarse desde que fue diseado para abarcar una mayor cantidad de problemas mediante "mltiples paradigmas". A modo de ejemplo, el siguiente programa realiza la suma de dos nmeros complejos. Ntese el uso del template "complex" instanciado con "double" (para que la parte real e imaginaria sean de este ltimo tipo.)
#include <complex> #include <iostream> using namespace std; int main() { complex<double> a(2,3), b(4,5); cout << "a+b=" << (a+b) << endl; return 0; }

Por su parte, Java adopta una sintaxis muy similar a la del lenguaje C++, aunque eliminando algunas de sus caractersticas ms oscuras. En particular, la eliminacin de los punteros (arrastrados desde el lenguaje C) no lo ha hecho ni ms ni menos expresivo, pero s mucho ms seguro. 5

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java El ejemplo que sigue cumple el mimsmo propsito que la versin anterior en C++, sin embargo, como Java actualmente no proporciona una clase estndar de nmeros complejos (aunque existen diversas clases gratutas en Internet), crearemos una muy bsica:
class TestComplex { double real; double imag; TestComplex(double r,double i) { real=r; imag=i; } TestComplex suma(TestComplex sumando) { return new TestComplex(real+sumando.real,imag+sumando.imag); } public String toString() { return "("+real+","+imag+")"; } public static void main(String[] args) { TestComplex a=new TestComplex(2,3),b=new TestComplex(4,5); System.out.println("a+b="+a.suma(b)); } }

Comprese la realizacin de la suma (a.suma(b)) con la versin en C++ (a+b.) Claramente, C++ proporciona una mayor expresividad en su tipo "complex" (en este caso, gracias a la sobrecarga del operador '+'.) Los proponentes de Java, sin embargo, argumentan que esta ganancia es despreciable en comparacin con la complejidad del lenguaje requerida para redefinir el operador (lo que no mostramos aqu) y que su uso ms bien oscurece aquellos programas que no son esencialmente matemticos como nuestro ejemplo.

Bien Definido
El lenguaje C fue considerado por mucho tiempo un buen ejemplo de un lenguaje consistente y sin ambigedades notorias, especialmente entre sus contemporneos. Los creadores le reconocen ciertos inconvenientes en la notacin que promueven a confusiones pero esto no es estrictamente un error y suele ser evitable. Quiz el principal problema radica en la gran cantidad de aspectos que son dejados a criterio del implementador, entre los cuales destaca el tamao de los tipos de datos. Por ejemplo, en los compiladores para PC de los aos 80 era frecuente encontrar que el rango del tipo "int" se encontraba entre -32768 y 32767, lo cual era un claro reflejo de los procesadores de "palabra de 16 bits" y la representacin de "complemento a 2". En computadores menos comunes y ms antiguos, era frecuente encontrar computadores con otros tamaos de "palabra" y con otros rangos para los tipos de datos; asimismo, en la actualidad es frecuente asumir 32 bits para los enteros, con lo que el rango vara con frecuencia entre 6

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java -2147483648 y 2147483647. Evidentemente esto puede crear serios problemas de portabilidad. Estos inconvenientes lamentablemente fueron ntegramente heredados por C++ y hasta la fecha no tienen una clara solucin (aunque el estndar C99 tiene algunas mejoras.) El lenguaje Java, sin embargo, fue creado desde el inicio con la intencin de desterrar las ambigedades y dependencias del implementador del lenguaje y de sus clases auxiliares, con lo cual actualmente es tal vez el mejor definido de los lenguajes populares.

Tipos y estructuras de datos


El lenguaje C proporciona mecanismos que actualmente se consideran rudimentarios para proporcionar tipos de datos estructurados. Las estructuras (y uniones) se suelen utilizar para definir tipos complejos constitudos a partir de otros ms simples (que a la vez pueden ser estructuras y/o uniones) con la posibilidad de crear identificadores auxiliares que simplifican la notacin (typedef.) Asimismo, los arreglos o arrays permiten especificar colecciones homogeneas de longitud fija (en tiempo de compilacin), los cuales tienen una relacin muy cercana en su manipulacin con los punteros. Una carencia notable (o ventaja segn algunos) es la carencia de tipos de datos para representar cadenas de texto (strings), los cuales son soportados de un modo inusual mediante arrays de caracteres. Si bien este "minimalismo" contribuye a la performance de la ejecucin (o la optimizacin en la compilacin), son muchos los casos donde se requiere el soporte de tipos ms sofisticados (y sus operaciones asociadas) como por ejemplo, vectores, listas enlazadas, colas, etc. para los cuales el lenguaje obliga a construirlos desde sus componentes bsicos. En la prctica, existen diversas libreras que complementan estos aspectos (por ejemplo, la popular Glib) pero su programacin necesariamente es ms laboriosa al no estar integrada internamente al lenguaje. El siguiente ejemplo ilustra la creacin de un "vector" (array dinmico) en el que se insertan tres enteros. Como se aprecia, el cdigo es oscuro y muy propenso a errores.
#include <stdio.h> #include <stdlib.h> void agregar_entero(int **ptr_vector,int *n_elementos,int elemento) { (*ptr_vector)=realloc(*ptr_vector,(*n_elementos+1)*sizeof(int)); (*ptr_vector)[*n_elementos]=elemento; *n_elementos=*n_elementos+1; } int main() { int *v=NULL,n_elementos=0; unsigned int z; agregar_entero(&v,&n_elementos,5); agregar_entero(&v,&n_elementos,6); agregar_entero(&v,&n_elementos,7);

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java


for(z=0;z<n_elementos;z++) printf("Elemento %d -> %d\n",z+1,v[z]); return 0; }

Normalmente, el programador debera evitar esta clase de implementaciones "desde cero". El siguiente ejemplo resuelve el mismo problema utilizando la librera Glib:
#include <stdio.h> #include <glib.h> int main() { GArray *v; unsigned int n_elementos=0,z; int valor; v=g_array_new(FALSE,FALSE,sizeof(int)); valor=5; g_array_append_val(v,valor); n_elementos++; valor=6; g_array_append_val(v,valor); n_elementos++; valor=7; g_array_append_val(v,valor); n_elementos++; for(z=0;z<n_elementos;z++) printf("Elemento %d -> %d\n",z+1,g_array_index(v,int,z)); return 0; }

La compilacin de aplicaciones Glib (o Gnome) se realiza con facilidad gracias al script "pkg-config":
cc $(pkg-config --cflags --libs glib-2.0) -o gvector gvector.c

Por su parte, C++ proporciona facilidades que permiten la creacin de estructuras de datos muy poderosas y fuertemente integradas en el lenguaje. Por ejemplo, las estructuras contenedoras "clsicas" se proporcionan en su librera de templates, la STL; asimismo, el desarrollador puede crear sus propios tipos de dato con diversas operaciones asociadas. Gracias a esto, su uso resulta una extensin natural de los tipos de dato primitivos con lo cual se alcanza un alto grado de claridad. El siguiente programa es una versin C++ del ejemplo anterior del vector:
#include <vector> #include <iostream> using namespace std; int main() { vector <int> v; v.push_back(5); v.push_back(6); v.push_back(7); for(unsigned int z=0;z<v.size();z++) cout << "Elemento " << (z+1) << " -> " << v[z] << endl; return 0; }

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java Java proporciona tipos de datos primitivos similares (notablemente, careciendo de punteros) y mediante su librera de clases estndar proporciona todas las estructuras contenedoras "clsicas" antes mencionadas, aunque con una sintaxis que pone claramente de manifiesto que se trata de clases auxiliares. El siguiente programa ilustra este punto, siendo una reescritura del mismo ejemplo 1 del vector de esta seccin :
import java.util.Vector; class PruebaVector { public static void main(String[] args) { Vector<Integer> v=new Vector<Integer>(); v.add(5); v.add(6); v.add(7); for(int z=0;z<v.size();z++) System.out.println("Elemento " + (z+1) + " -> " + v.elementAt(z)); } }

Modularidad
En la referencia original ([15]) este criterio estaba referido a la posibilidad de desarrollar componentes de manera independiente los que eventualtamente interactuaran. Es ese sentido, los tres lenguajes analizados permiten desarrollar funciones, clases, y paquetes de modo independiente, cada cual con sus convenciones particulares. En cuanto a los "niveles de empaquetamiento" de los componentes, el lenguaje C en la prctica proporciona slo dos niveles: componentes visibles dentro del archivo de cdigo fuente, y componentes visibles globalmente (concretamente, funciones y variables.) En C++ los conceptos de clase y "espacio de nombres" (namespace) proporcionan dos niveles adicionales de "empacado", mientras que en Java los equivalentes corresponden a las clases y los "paquetes".

Facilidades de entrada-salida
Siguiendo la referencia [15], este criterio est referido a las facilidades que proporcionan los lenguajes para acceder a archivos de disco, en particular el acceso secuencial, aleatorio e indexado. Asimismo, se hace referencia a la accesibilidad a sistemas de Base de Datos.

Manipulacin de archivos
1

Este programa utiliza las facilidades presentes en Java SE 5.0. En particular, el vector fue definido como "Vector<Integer>" (en versiones anteriores hubiera sido slo "Vector") lo que hubiera obligado a agregar un "cast a Integer" al momento de extraer los elementos. Asimismo, hemos agregado enteros mediante add(5) cuando anteriormente se necesitaba add(new Integer(5)). En la prctica casi siempre se debe preferir ArrayList, pero aqu mantenemos Vector por similitud con lo anterior.

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java El lenguaje C como tal no proporciona instrucciones de I/O salvo mediante funciones de su "librera estndar", la cual fue diseada en gran medida para aprovechar las facilidades del sistema de archivos Unix. En ese sentido, las funciones de I/O proporcionan acceso secuencial byte a byte o bloque a bloque, as como desplazamientos arbitrarios en la posicin de lectura/escritura; esto en realidad depende de las facilidades inherentes al sistema operativo, pero estn presentes en prcticamente todo sistema comercial moderno. En particular, la librera estndar no proporciona funciones de acceso rpido a travs de ndices (que algunos consideran "bases de datos"), las cuales son implementadas mediante muchas libreras correspondientes, incluso Open Source como GDBM, Berkeley libdb, etc. C++ y Java proporcionan una interfaz alternativa a la misma funcionalidad a travs de jerarquas de clases de I/O con diferente nivel de refinamiento, lo que los hace ms extensibles aunque no necesariamente ms convenientes. La tendencia en general apunta a no extender el lenguaje en este camino y por el contrario, crear nuevas libreras auxiliares para casos concretos.

Acceso a Sistemas de Base de Datos


Como quiera que "C" fue y es uno de los lenguajes ms populares utilizados para el desarrollo de sistemas medianos y grandes, hasta el da de hoy est casi implcito que cualquier aplicacin "de amplia audiencia" que proporciona una interfaz de programacin, permitir el acceso mediante el lenguaje C. Esto es cierto para prcticamente todas las bases de datos comerciales y no comerciales ms populares con lo que C permite un acceso prcticamente ilimitado, aunque no 2 necesariamente el ms conveniente . Por su parte, un programa escrito en C++ tiene normalmente la capacidad de hacer uso del API de lenguaje C, pero muchos sistemas de base de datos proporcionan una interfaz mejorada orientada a objetos disponible en este lenguaje. Nuevamente, su uso no es portable. Los creadores de Java, gracias a las anteriores experiencias, estandarizaron una interfaz orientada a objetos para acceder de un modo portable a cualquier base de datos. Esta API se denomina Java Database Connectivity y gracias a la gran popularidad de Java, practicamente todos los vendedores importantes de bases de datos han creado implementaciones de esta interfaz. Esto promueve la portabilidad en cuanto al acceso a la base de datos, aunque las incompatibilidades y extensiones del SQL subsisten.

Transportabilidad/Portabilidad
El lenguaje C tradicionalmente se ha proporcionado como parte de la distribucin del sistema operativo Unix (aunque en ocasiones, con un costo adicional) siempre siguiendo los lineamientos de sus creadores (K&R) por lo que es reconocido como uno de los lenguajes ms difundidos y portables de la historia, al menos, hasta los aos 80. Asimismo, su proceso de estandarizacin fue cuidadosamente elaborado, con lo cual se convirti en uno de los primeros "caso de xito" de portabilidad gracias
2

Por ejemplo, se pierde la portabilidad: la interfaz de programacin C en diversas bases de datos vara largamente (y su uso suele ser complicado) en comparacin, por ejemplo, con el uso de "Embedded SQL en C".

10

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java a estndares abiertos. Salvo el estndar C99, el cual carece de una amplia base de compiladores que lo soporten, la versin C89/C90 es universalmente portable. El lenguaje C++ sigui posteriormente un ciclo muy similar, y si bien no es un lenguaje automticamente distribudo en los sistemas Unix, prcticamente todos lo pueden ejecutar ya sea en una variante comercial o mediante el popular GNU GCC/G++ con lo que la disponibilidad est asegurada. En cuanto a su portabilidad, el nico inconveniente notorio radica en ciertos problemas (cada vez menos frecuentes) en las implementaciones de la STL. No obstante lo indicado, tanto el C como el C++ presentan importantes dificultades de portabilidad, particularmente en cuanto a los siguientes aspectos: 1. Caractersticas dependientes de la implementacin: Lo que permite realizar fuertes optimizaciones en distintas arquitecturas, resulta con frecuencia una pesadilla para la portabilidad. Muchos detalles importantes son dejados a criterio de quien escribe el compilador, tales como los tamaos de diversos tipos de datos, juegos de caracteres, comportamiento ante ciertos errores, etc. 2. Acceso al libreras del sistema operativo: Las interfaces y libreras principales no han seguido un proceso de estandarizacin tan riguroso como el lenguaje, lo que ha trado como consecuencia diversas soluciones incompatibles para los mismos problemas. Estrictamente este no es un problema del lenguaje, sino ms bien de la plataforma utilizada (por ejemplo, las variantes de Unix.) Estos problemas realmente nunca han tenido una solucin definitiva, y a tal efecto existen algunas herramientas (por ejemplo, el "grupo" autoconf) orientadas mantenerlos "bajo control", mas no a eliminarlos. Asimismo, la escritura de un programa portable en C/C++ suele demandar la presencia de un programador experimentado que estructure adecuadamente el cdigo a fin de facilitar el proceso de "portado" caso por caso. En ese sentido Java introdujo un enfoque radical (aunque predecible) al disear un lenguaje prcticamente sin caractersticas dependientes del implementador (potencialmente algo menos eficiente), y con una extensa librera utilitaria cuya interfaz de programacin est muy fuertemente estandarizada. Esto trajo consigo la famosa promesa: "write once, run everywhere" (escribir una sola vez, ejecutar en cualquier lugar) la cual ha sido muchas veces objeto de mofa debido a diversos errores de implementacin y especificaciones poco claras ("write once, debug everywhere".) Con todo, la portabilidad alcanzada es cualitativamente superior a la que se puede obtener con los lenguaje C/C++, y se consigue de manera automtica por cualquier desarrollador. En conclusin, si es imprescindible una mxima portabilidad a "bajo costo", la respuesta es Java.

Eficiencia/Performance
Este es un aspecto sobre el cual se ha debatido hasta la saciedad y contina siendo un tema de discusin encarnizada. Como de costumbre, en aquellos temas sobre los que se dice mucho, al final resulta que no se concluye en nada. Por lo tanto, proporcionaremos algunos argumentos bastante evidentes a favor y en contra de los lenguajes que estamos analizando y dejaremos al lector extraer su propia opinin. 11

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java Un primer aspecto corresponde a centrar el problema. Cuando nos referimos a la eficiencia/performance estamos hablando principalmente de la velocidad con la cual los programas escritos en los tres lenguajes de estudio, logran llevar a cabo diversas tareas. Asimismo podemos considerar los recursos del sistema requeridos (principalmente memoria) durante su ejecucin.

Ms cerca del fierro


Es bien sabido que prcticamente todos los computadores ejecutan los programas mediante una o ms unidades centrales de procesamiento (CPU) las cuales (dependiendo de la marca y el modelo) slo comprenden el llamado "lenguaje mquina" o "cdigo mquina", el cual consiste de una serie de operaciones relativamente elementales o de muy "bajo nivel" tales como escribir bytes en memoria, sumar un par de nmeros, leer bytes de un dispositivo externo, etc. Por lo tanto, todos los lenguajes de programacin deben ser "traducidos" en algn momento a "lenguaje mquina" para que los programas sean ejecutados; simplificando, a este proceso se le suele denominar "compilacin" y tanto el lenguaje C como el lenguaje C++ siguen este esquema de ser "compilados" al "lenguaje mquina" del procesador en el que se van a utilizar. En particular, el lenguaje C posee estructuras de datos muy simples que resultan generalmente de traduccin bastante directa al "lenguaje mquina", con lo cual el programador est muchas veces muy cerca de escribir en un lenguaje similar al que el CPU comprende. En muchos casos, esta simplicidad consigue que el programa tenga una excelente performance dada la simplicidad del lenguaje mquina producido. En el caso de un programa en C++ en el cual se hace uso de sus ms conspcuas facilidades (por ejemplo, objetos) resulta que la traduccin a "lenguaje mquina" es bastante compleja puesto que los procesadores practicamente carecen de operaciones u operadores que faciliten las operaciones ms abstractas de este lenguaje. Esto trajo como consecuencia que en los primeros compiladores de C 3 ++ , el "lenguaje mquina" generado sea tpicamente extremadamente lento en comparacin a un programa equivalente escrito en C (aunque con frecuencia el equivalente en "C" ser mucho ms extenso y difcil de escribir.) Sin embargo, esta situacin ha cambiado dramticamente con el transcurso de los aos, al punto que actualmente los compiladores de C++ generan un cdigo muy difcil de superar por una hbil implementacin equivalente en C, salvo 4 excepciones . Algo similar se puede afirmar con respecto al uso de la memoria. Personalmente, considero que la performance entre C y C++ es similar; en caso de necesidad de eleccin aplicara los otros criterios utilizados este texto.

Ms lejos del fierro


3

Los verdaderamente primeros compiladores de C++, generaban un programa en C el cual era posteriormente compilado con un compilador de lenguaje C. Era de esperarse una mala performance comparativa en aquellos aos. 4 Por ejemplo, en [18] se describe el caso de un programa que resulta ser mucho ms veloz en C que en C++; la misma referencia indica que el fallo se debe a una mala implementacin de una librera de hash en el compilador de C++ que utilizaron los autores. De otro lado, en [9] se muestra y explica un sencillo pero importante caso en el cual la ordenacin Quick Sort de la librera estndar de C++ (sort()) es ms veloz que la rutina qsort() de la librera estndar de C.

12

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java Java fue creado desde el inicio para ser ejecutado en cualquier clase de dispositivo o CPU, y uno de sus aspectos ms interesantes es que NO se compila directamente en el lenguaje mquina del CPU en uso, sino en un "pseudo lenguaje mquina" denominado "byte code". Este Java compilado en "byte code" puede ser transportado a cualquier computador en el cual se dispone de un programa especial encargado de la traduccin del "byte code" al verdadero "lenguaje mquina" del CPU en uso. En otras palabras, este programa especial "interpreta" el "byte code", efectivamente ejecutando la aplicacin Java original. Este programa intprete se conoce (simplificando un poco) como "Java Virtual Machine" (JVM) o "Java Runtime Environmet". Es evidente que un programa compilado en "byte code" en tanto debe ser adems traducido (interpretado) en lenguaje mquina, en general resulta algo ms lento que un programa ya traducido al lenguaje mquina del CPU donde este paso adicional ya no se requiere. Un segundo inconveniente, particularmente en aplicaciones relativamente pequeas, radica en los recursos de memoria que tpicamente utiliza el Java Virtual Machine; si bien esto suele ser configurable, dichos ajustes no suelen ser sencillos ni bien documentados. Ante esto, no se ha hecho mucho salvo esperar a que los computadores se vendan con memorias mucho ms amplias, al punto que esto ya no suele ser un problema. Un tercer inconveniente para ciertas clases de aplicaciones se encuentra en la impredecibilidad del "garbage collector", el cual en muchas ocasiones no realiza su trabajo en el momento ms apropiado y suele consumir mucho tiempo de CPU en su anlisis, contribuyendo a la lentitud. Afortunadamente los implementadores de las JVM han optimizado mucho la inteligencia del garbage collector al punto que en la actualidad esto slo es un problema en casos excepcionales. A favor de Java cabe mencionar los avances en los entornos de ejecucin "JIT" (Just In Time) los cuales precompilan el "byte code" a lenguaje mquina conforme el programa se ejecuta, con lo cual el esquema se convierte en una combinacin de "compilacin" e "interpretacin" lo cual puede mejorar significativamente la performance de muchas aplicaciones. En general la performance del JVM ha mejorado notoriamente a travs de los aos (pero tambin los CPU's). Sin embargo, adems de la "modernidad" (o la versin) de la misma, tambin se debe tener en cuenta la "implementacin" utilizada. Por ejemplo, la performance puede variar de modo considerable entre las implementaciones de Sun e IBM de la mquina virtual para una misma versin de Java. En particular, ciertas arquitecturas de hardware populares (por ejemplo, la familia x86) suelen tener mquinas virtuales mejor implementadas y ms optimizadas que las menos usuales.

No es importante ser veloz, sino no ser lento


Ms all de los benchmarks y pruebas diversas de "clculo puro" (en los que Java suele ser ms lento que sus contendores) se suele plantear el argumento de la importancia de la velocidad de ejecucin del lenguaje en s. Si bien a todos les interesa que las aplicaciones se ejecuten a mxima velocidad, muchas veces la sensacin de velocidad o lentitud no es ocasionada por la performance del "cdigo principal" de la aplicacin (que puede estar programado en Java) 13

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java sino de componentes auxiliares tales como bases de datos, libreras de terceros, dispositivos grficos acelerados, etc. En esa lnea algunos defensores de Java manifiestan que es poco relevante si el "cdigo C/C++" es 10 o 50% ms veloz, si al final este tiempo no es el verdaderamente percibido por el usuario; asimismo, la aparente reducida performance de Java podra ser frecuentemente superada gracias a la claridad del lenguaje, el cual permitira implementar mejores algoritmos y de un modo ms eficiente. Claramente, todos estos argumentos son subjetivos (pero muchas veces vlidos) y al mismo tiempo son discutibles caso por caso. A modo de conclusin, considero que un programa en Java suele ser notoriamente ms lento si la tarea principal consiste en operaciones lgico/matemticas, mientras que la performance suele ser ligeramente inferior a la correspondiente a C/C++ para aplicaciones que hacen uso de muchos otros componentes y libreras auxiliares.

Pedagoga
En breve, ni C ni C++ fueron creados para ser sencillos de aprender. C fue creado principalmente para ser eficiente, y C++ para ser a la vez eficiente y rico 5 en caractersticas . Java, por el contrario tuvo desde el principio la intencin de ser un lenguaje muy fcil de comprender y utilizar, y si bien eso no significa que su aprendizaje sea rpido ni trivial, ciertamente libera al estudiante de diversos aspectos confusos y sintaxis oscura de los otros lenguajes. Esta es quiz una de las razones ms importantes que ha contribudo a su rpida adopcin (aparte del excesivo marketing.)

Generalidad
Los tres lenguajes estudiados se proponen como "de propsito general", es decir, seran adecuados para atacar prcticamente cualquier clase de problema. En la prctica, el C suele ser utilizado para construir componentes bsicos o de bajo nivel (notablemente, el kernel de muchos sistemas operativos) mientras que C++ y Java tienen un espectro mucho ms amplio (por ejemplo, aplicaciones comerciales de toda clase.) Notablemente Java, en gran medida gracias a la previsin y publicidad de Sun y diversos vendedores de "servidores de aplicacin", es muy utilizado actualmente en el contexto de servidores Web (Servlets y JSP), acompaado en muchos casos de una arquitectura multicapa.

Estandarizacin
Como se indic en la seccin histrica, C y C++ son buenos ejemplos de lenguajes exitosos estandarizados "por comit" lo que promueve una competencia abierta entre las implementaciones, sin detrimento de la portabilidad. Lamentablemente, no hay procesos de certificacin formal para estos lenguajes y muchos implementadores simplemente ignoran algunas caractersticas de stos
5

Sin embargo, Stroustrup[19] manifiesta que las caractersticas con que actualmente cuenta C++ requieren ser enseadas y aprendidas de un modo distinto (especialmente no como una "extensin POO de C") con lo que se puede obtener mucha ms claridad (facilidad) y programas ms eficientes.

14

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java estndares, lo que trae evidentes inconvenientes para los programadores que pretenden codificar "segn el estndar". En parte por este motivo, Sun en sus inicios descart utilizar un mecanismo similar para la estandarizacin de Java (lenguaje y libreras) pero luego dio paso a una apertura parcial en la que diversos vendedores y usuarios promueven los cambios en los estndares futuros, proceso que siempre es monitoreado por Sun (Java Comunity Program.) Asimismo, Sun proporciona exigentes pruebas de certificacin a fin de que los implementadores validen y publiciten su adherencia a los estndares, con el consiguiente beneficio de los desarrolladores.

Evolucin: Qu est ocurriendo con el lenguaje?


En cuanto al lenguaje C (y su "librera estndar"), el estndar C99 sigue a la espera de ser totalmente implementado por los vendedores. Notablemente, GNU GCC incorpora la gran mayora de la funcionalidad requerida. Por lo dems, es uno de los lenguajes ms estables disponibles. C++ contina en su camino apuntando a una nueva revisin comunmente conocida como C++0x (la idea es que aparezca antes de 2010) la cual a juzgar por el mismo Stroustrup (ver [20]) estar ms orientada hacia el desarrollo de las libreras (potencialmente -pero sin muchas probabilidades- incluyendo un API de GUI.) Este desarrollo es relativamente lento aparentemente debido a la falta de entusiasmo de los vendedores que suelen financiar esta clase de proceso. Por su parte, Java contina -a un paso acelerado- haciendo aadidos y mejoras en sus libreras principales y tambin en el lenguaje base (aunque estos ltimos son contados) por lo general orientados a lograr una plataforma moderna y muy completa para distintas clases de aplicaciones (ver la siguiente seccin.)

Soporte de Libreras: Qu NO se debe reescribir?


En esta seccin nos referimos a la posibilidad de reutilizar cdigo ya escrito y depurado a fin de no "reinventar la rueda". Dada su larga permanencia, tanto C como C++ disponen de una extremadamente amplia variedad de opciones en cuanto a libreras para diversos propsitos; asimismo, dada su importancia y ubicuidad, la gran mayora de nuevos sistemas proporcionan libreras que permiten la interaccin con programas escritos en estos lenguajes. El nico aspecto cuestionable radica en que muy pocas de estas libreras estn estandarizadas del mismo modo que el lenguaje. Por ejemplo, el estndar de lenguaje C actualmente incluye una librera (conocida como la "librera estndar") que permite realizar una gran cantidad de tareas esenciales (como mostrar un mensaje, grabar en un archivo de disco, calcular funciones trigonomtricas, procesar cadenas de caracteres, etc.) pero que para muchas aplicaciones 15

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java modernas, resulta francamente insuficiente. Esto obliga a la bsqueda de libreras de terceros, lo que presenta los siguientes inconvenientes: Al no estar estandarizadas, en ocasiones no garantizan un funcionamiento predecible Las diversas implementaciones suelen ser incompatibles Su uso puede requerir la adquisicin de licencias e imponer restricciones adicionales Afortunadamente es posible hallar excelentes libreras muy bien soportadas para propsitos muy variados. Por ejemplo, la conocida Glib[21] utilizada en el proyecto GNOME, incorpora una tremenda gama de aspectos que van desde la portabilidad entre sistemas operativos hasta la implementacin de contenedores estndar. Por su parte, C++ dispone de una librera ms extensa la cual incluye de hecho a la "librera estndar de C" as como la famosa "STL" (Standard Template Library) que implementa diversas estructuras de datos de manera genrica, as como muchos algoritmos populares. De igual modo, muchas libreras de terceros estn disponibles para propsitos ms especializados (por citar dos ejemplos, la librera Xerces[22] de procesamiento de documentos XML, y las libreras Boost[23] de propsito general.) Java desde su creacin tuvo la buena poltica de estandarizar muchas libreras (mediante clases e interfases) para una gran cantidad de aspectos que nunca fueron considerados en C ni C++ (como por ejemplo, la interfaz grfica, el acceso a bases de datos, pginas Web, etc.) lo cual no excluye libreras ms especializadas de terceros (por ejemplo, recuerdo haber empleado un excelente paquete de clases que permitan el procesamiento de documentos de Microsoft Excel.) Esto ha tenido un fuerte impacto en la comunidad de programadores que ven aqu una manera clara y segura de disear y codificar a partir de las especificaciones. El contexto de libreras estandarizadas en torno a Java es tan amplio que la "plataforma Java" se publicita como un conjunto de tecnologas orientas hacia distintos tipos de aplicaciones: Java SE (Java Standard Edition) considera facilidades de propsito general y aplicaciones de escritorio en particular Java EE (Java Enterprise Edition) para el desarrollo de aplicaciones empresariales (potencialmente sofisticadas) en servidores Java ME (Java Micro Edition) dirigida a la programacin de dispositivos mviles

Cuadro Resumen
Tabla 1. Resumen
Caracterstica Expresividad Bien Definido Regular Regular C C++ Muy Buena a Excesiva Muy Buena Java Muy Buena Muy Buena

16

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java Caracterstica C C++ Muy Buena Muy Buena Buena Buena Excelente Regular Muy Buena Buena Estable Muy Bueno Java Muy Buena Muy Buena Buena Excelente Buena Buena Muy Buena Excelente Acelerada Excelente

Tipos y Estructuras Deficiente de datos Modularidad Facilidades de entrada/salida Regular Buena

Transportabilidad / Buena Portabilidad Eficiencia / Performance Pedagoga Generalidad Estandarizacin Evolucin Soporte de Libreras Excelente Regular Buena Buena Estable Bueno

A. Referencias
[1] Dennis M. Ritchie: "The Development of the C Language". History of Programming Languages-II ed. Thomas J. Bergin, Jr. and Richard G. Gibson, Jr. ACM Press (New York) and Addison-Wesley (Reading, Mass), 1996; ISBN 0-201-89502-1. Versin online: http://cm.bell-labs.com/cm/cs/who/dmr/chist.html [2] Brian W. Kernighan: "Programming in C: A tutorial" - Un documento presentado con caracter histrico: http://www.lysator.liu.se/c/bwk-tutor.html [3] Are you ready for op=displaystory;sid=2001/2/23/194544/139 C99? http://www.kuro5hin.org/?

[4] Brian W. Kernighan and Dennis M. Ritchie, "The C Programming Language", 2nd ed, Prentice Hall, 1988, ISBN 0-13-110362-8, 0-13-110370-9 [5] Learning to C: Tutorial de Lenguaje C. http://members.cox.net/midian/articles/ ansic1.htm [6] Steve Holmes: C Programming. http://www.its.strath.ac.uk/courses/c/ [7] The C Book. http://publications.gbdirect.co.uk/c_book/ [8] Bjarne Stroustrup: "The C++ Programming Language" 3rd Ed. Addison-Wesley. 1997. ISBN 0-201-88954-4 17

Ventajas y Desventajas: Comparacin de los Lenguajes C, C++ y Java [9] Bjarne Stroustrup's FAQ http://www.research.att.com/~bs/bs_faq.html [10] Wikibooks: %2B_Programming "C++ Programming" http://en.wikibooks.org/wiki/C%2B

[11] Bruce Eckel "Thinking in C++" 2ed. http://mindview.net/Books/TICPP/ ThinkingInCPP2e.html [12] Nicholas A. Solter, Scott J. Kleper "Professional C++ (Programmer to Programmer)". Wrox Books. 2005. ISBN: 0764574841 [13] The history of Java Technology http://www.java.com/en/javahistory/ [14] The Java Tutorials http://java.sun.com/docs/books/tutorial/index.html [15] Allen B. Tucker, Jr. "Lenguajes de Programacin". 2da ed. McGraw-Hill Mxico. 1992. [16] Wikipedia: "Comparison of programming languages" http://en.wikipedia.org/ wiki/Comparisonofprogramming_languages [17] Ian Joyner: "C++?? : A Critique of C++" (3rd Ed.) http://burks.bton.ac.uk/burks/ pcinfo/progdocs/cppcrit/ [18] Brian W. Kernighan, Rob Pike "The Practice of Programming" Addison-Wesley. 1999. ISBN: 020161586X [19] Bjarne Stroustrup "Learning C++ www.research.att.com/~bs/new_learning.pdf as a New Language" http://

[20] Bjarne Stroustrup: "The Design of C++0x" http://www.informit.com/content/ images/artstroustrup2005/elementLinks/rules.pdf [21] GLib Reference Manual http://developer.gnome.org/doc/API/2.0/glib/ [22] Xerces C++ Parser (XML Library) http://xml.apache.org/xerces-c/ [23] Boost C++ Libraries http://www.boost.org/

18

Vous aimerez peut-être aussi