Está en la página 1de 16

Ventajas y Desventajas: Comparacin

de los Lenguajes C, C++ y Java

Ventajas y Desventajas: Comparacin de los Lenguajes


C, C++ y Java

LIMA DATA

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

II

HISTORIAL DE REVISIONES
NMERO

FECHA

1.0

11/11/2006

MODIFICACIONES
Primera versin

NOMBRE
Diego Bravo

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

III

ndice
1. Intro

1.1. Autora y Copyright . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2. Revisiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2. Introduccin Histrica

2.1. Lenguaje C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.2. Lenguaje C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3. Lenguaje Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3. Criterios de Comparacin

3.1. Expresividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.2. Bien Definido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.3. Tipos y estructuras de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.4. Modularidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.5. Facilidades de entrada-salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.5.1. Manipulacin de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.5.2. Acceso a Sistemas de Base de Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.6. Transportabilidad/Portabilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.7. Eficiencia/Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.7.1. Ms cerca del fierro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.7.2. Ms lejos del fierro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.7.3. No es importante ser veloz, sino no ser lento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.8. Pedagoga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.9. Generalidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.10. Estandarizacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.11. Evolucin: Qu est ocurriendo con el lenguaje? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.12. Soporte de Libreras: Qu NO se debe reescribir? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4. Cuadro Resumen

11

5. Referencias

12

5.1. Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

1.

1 / 13

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.

1.1.

Autora y Copyright

Este documento tiene copyright (c) 2006 de AMERICATI EIRL. 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 .
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 http://www.limadata.com .
Son bienvenidas todas las sugerencias y correcciones.
Este documento fue confeccionado utilizando Dblatex con ayuda del excelente preprocesador Asciidoc.

1.2.

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

2.

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.

2.1.

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 [CHIST], en el que se puede apreciar el caracter experimental de su desarrollo, as como las diversas influencias 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"[KRTUT]. 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

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

2 / 13

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"[C99K] 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 [ANSIC], existe mucha informacin online para aprender este
lenguaje, por ejemplo [CTUT1],[CTUT2],[CTUT3].

2.2.

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"[CPPSTR] de modo tal que
reflejan estos cambios. Ms detalles se pueden e interesantes opiniones se pueden leer en [CPPFAQ].
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 [CPPWIKI].
Diversos tutoriales y textos como [CPPECKEL], [CPPPROF] proporcionan abundante informacin educativa.

2.3.

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"[JAVAHIST] (procesadores incorporados en diversos dispositivos de consumo masivo como
VCRs, tostadoras, PDAs, 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 [JAVATUT].

3.

Criterios de Comparacin

Comparar lenguajes de programacin nunca ha sido una tarea sencilla ni objetiva. En [TUCKER] se proporcionan nueve "criterios
para la evaluacin y comparacin de lenguajes" (ver tambin [WIKICOMP] 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

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

3 / 13

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:
1. Estandarizacin: Quin controla el lenguaje?
2. Evolucin: Qu est ocurriendo con el lenguaje?
3. Soporte de Libreras: Qu NO se debe reescribir?

3.1.

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 [CPPCRIT]) 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.
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:

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

4 / 13

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.

3.2.

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 -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.

3.3.

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

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

5 / 13

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);
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":

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

6 / 13

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;
}

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 del vector de esta seccin 1 :
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));
}
}

3.4.

Modularidad

En la referencia original ([TUCKER]) 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.
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

7 / 13

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".

3.5.

Facilidades de entrada-salida

Siguiendo la referencia [TUCKER], 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.
3.5.1.

Manipulacin de archivos

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.
3.5.2.

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 necesariamente el ms
conveniente 2 .
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.

3.6.

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 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
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".

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

8 / 13

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.

3.7.

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.
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.
3.7.1.

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

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

9 / 13

3,

compiladores de C++ 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 excepciones 4 . 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.
3.7.2.

Ms lejos del fierro

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 CPUs). 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.
3.7.3.

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) 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
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 [KERPIKE] 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 [CPPFAQ] 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.

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

10 / 13

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.

3.8.

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 en caractersticas 5 . 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.)

3.9.

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.

3.10.

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 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.

3.11.

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 [CPP0X]) 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.)
5 Sin embargo, Stroustrup[STRLEARN] 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.

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

3.12.

11 / 13

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 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[GLIBDOC] 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[XERCES] de procesamiento de documentos XML, y las libreras Boost[BOOST] 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

4.

Cuadro Resumen
Cuadro 1: Resumen
Caracterstica
Expresividad
Bien Definido
Tipos y Estructuras de datos
Modularidad
Facilidades de
entrada/salida
Transportabilidad /
Portabilidad
Eficiencia / Performance

C
Regular
Regular
Deficiente
Regular
Buena

C++
Muy Buena a Excesiva
Muy Buena
Muy Buena
Muy Buena
Buena

Java
Muy Buena
Muy Buena
Muy Buena
Muy Buena
Buena

Buena

Buena

Excelente

Excelente

Excelente

Buena

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

12 / 13

Cuadro 1: (continued)
Caracterstica
Pedagoga
Generalidad
Estandarizacin
Evolucin
Soporte de Libreras

5.
5.1.

C
Regular
Buena
Buena
Estable
Bueno

C++
Regular
Muy Buena
Buena
Estable
Muy Bueno

Java
Buena
Muy Buena
Excelente
Acelerada
Excelente

Referencias
Referencias
[1] [CHIST] 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] [KRTUT] Brian W. Kernighan: "Programming in C: A tutorial" - Un documento presentado con caracter histrico: http://www.lysator.liu.se/c/bwk-tutor.html
[3] [ANSIC] 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
[4] [CTUT1] Learning to C: Tutorial de Lenguaje C. http://members.cox.net/midian/articles/ansic1.htm
[5] [CTUT2] Steve Holmes: C Programming. http://www.its.strath.ac.uk/courses/c/
[6] [CTUT3] The C Book. http://publications.gbdirect.co.uk/c_book/
[7] [C99K] Are you ready for C99? http://www.kuro5hin.org/?op=displaystory;sid=2001/2/23/194544/139
[8] [CPPSTR] Bjarne Stroustrup: "The C++ Programming Language" 3rd Ed. Addison-Wesley. 1997. ISBN 0-20188954-4
[9] [CPPWIKI] Wikibooks: "C++ Programming" http://en.wikibooks.org/wiki/C%2B%2B_Programming
[10] [CPPECKEL] Bruce Eckel "Thinking in C++" 2ed. http://mindview.net/Books/TICPP/ThinkingInCPP2e.html
[11] [CPPFAQ] Bjarne Stroustrups FAQ http://www.research.att.com/~bs/bs_faq.html
[12] [CPPPROF] Nicholas A. Solter, Scott J. Kleper "Professional C++ (Programmer to Programmer)". Wrox
Books. 2005. ISBN: 0764574841
[13] [JAVAHIST] The history of Java Technology http://www.java.com/en/javahistory/
[14] [JAVATUT] The Java Tutorials http://java.sun.com/docs/books/tutorial/index.html
[15] [TUCKER] Allen B. Tucker, Jr. "Lenguajes de Programacin". 2da ed. McGraw-Hill Mxico. 1992.
[16] [KERPIKE] Brian W. Kernighan, Rob Pike "The Practice of Programming" Addison-Wesley. 1999. ISBN:
020161586X
[17] [STRLEARN] Bjarne Stroustrup "Learning C++ as a New Language" http://www.research.att.com/~bs/new_learning.pdf
[18] [WIKICOMP] Wikipedia: "Comparison
Comparison_of_programming_languages

of

programming

languages"

http://en.wikipedia.org/wiki/-

Ventajas y Desventajas: Comparacin


de los Lenguajes C, C++ y Java

13 / 13

[19] [CPPCRIT] Ian Joyner: "C?? : A Critique of C" (3rd Ed.) http://burks.bton.ac.uk/burks/pcinfo/progdocs/cppcrit/
[20] [CPP0X] Bjarne Stroustrup: "The Design
art_stroustrup_2005/elementLinks/rules.pdf

of

C++0x"

http://www.informit.com/content/images/-

[21] [GLIBDOC] GLib Reference Manual http://developer.gnome.org/doc/API/2.0/glib/


[22] [XERCES] Xerces C++ Parser (XML Library) http://xml.apache.org/xerces-c/
[23] [BOOST] Boost C++ Libraries http://www.boost.org/