Foros del Web » Programación para mayores de 30 ;) » Java »

Diferencias entre java y C++

Estas en el tema de Diferencias entre java y C++ en el foro de Java en Foros del Web. Hola Estimados: Una de las diferencias entre Java y C++, es que Java introdujo arrays que realmente lo son y eliminaron la aritmetica de punteros. ...
  #1 (permalink)  
Antiguo 30/07/2008, 09:47
 
Fecha de Ingreso: julio-2008
Mensajes: 15
Antigüedad: 15 años, 8 meses
Puntos: 0
Diferencias entre java y C++

Hola Estimados:

Una de las diferencias entre Java y C++, es que Java introdujo arrays que realmente lo son y eliminaron la aritmetica de punteros. que significa esto

Gracias por su respuesta
  #2 (permalink)  
Antiguo 30/07/2008, 10:20
Avatar de Xinef  
Fecha de Ingreso: marzo-2007
Mensajes: 202
Antigüedad: 17 años, 1 mes
Puntos: 7
Respuesta: Diferencias entre java y C++

En C++ (C) los arrays con bloques de memoria consecutivos, donde el nombre del array es un puntero al primer elemento.

Un puntero es una variable que guarda (apunta) una dirección de memoria.

En Java no existe el concepto "puntero", puesto que es la propia máquina virtual la encargada de las referencias y gestión de memoria.


Yo no veo mucho sentido a la frase. Arrays son arrays... y la eliminación de punteros en Java no tiene nada (o no tanto) que ver con los arrays.
  #3 (permalink)  
Antiguo 30/07/2008, 17:19
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: Diferencias entre java y C++

Hola mira la dif mas grande que tenes es q en C++ necesitas pedir memoria(al igual q en java cuando haces un new) pero a su vez esa memoria en C++ te debes encargar de liberarla en java eso no pasa ya que posee un GC(garbage collector) que cuando pasa(automatica no hay forma de llamarlo) y ve variables que no estan en usa las borra, y otra cosa java es un lenguaje 100% Orientado a Objetos, C++ no(esto no quiere decir q no se pueda programar OO con C++, se puede ya que abarca los tres paradigmas de la programacion (estructurada, orientada a objetos y generica)),
C++ soporta herencia multiple, java no lo "resuelve" con interfaces.

mira para resumirte JAVA== C++ -- jejeje dijiera Bruce Eckel

saludos y cuidate
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #4 (permalink)  
Antiguo 30/07/2008, 20:13
Avatar de diegoy2k  
Fecha de Ingreso: julio-2006
Ubicación: Algun Lugar
Mensajes: 68
Antigüedad: 17 años, 9 meses
Puntos: 0
Respuesta: Diferencias entre java y C++

Que tal!!
Las respuesta anteriores son muy buenas, solo quiero aclarar lo siguiente, C++ si bien soporta herencia multiple, es imposible hacer andar eso, y si bien JAVA no soporta herencia multiple lo soluciona usando Interface,s que si es posible realizar, y usandolas bien son muy muy potentes!!!
Aclaro esto por que en la anterior respuesta falto un coma ",". y se puede prestar a confucion!!!.

Desde mi punto de vista, doy gracias a que JAVA hizo desaperecer los punteros!!!!, uuuuuuuuuufffffff es feo lidear con ellos,
Saludos!!!.
  #5 (permalink)  
Antiguo 31/07/2008, 00:32
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Diferencias entre java y C++

Una de las cosas que tiene Java por lo que los arrays son "verdaderos" y con lo que se impide una forma habitual de aritmetica de punteros es que se comprueba en tiempo de ejecucion el acceso a los miembros de un array y no se permite acceder a posiciones que no esten en el rango correcto (salta una ArrayIndexOutOfBoundsException).

En C++ no se hace y a través de eso se pueden acceder a posiciones de memoria mas alla del array declarado, para lo bueno y para lo malo.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #6 (permalink)  
Antiguo 31/07/2008, 08:46
Avatar de Xinef  
Fecha de Ingreso: marzo-2007
Mensajes: 202
Antigüedad: 17 años, 1 mes
Puntos: 7
Respuesta: Diferencias entre java y C++

Cita:
Iniciado por djagu_26 Ver Mensaje
java es un lenguaje 100% Orientado a Objetos
Weno, que tenga tipos de datos primitivos o básicos le quita porcentaje. . Es decir, Java no es orientado a objetos "puro".
  #7 (permalink)  
Antiguo 31/07/2008, 22:41
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Diferencias entre java y C++

Hola,

Solamente me gustaría aclarar lo siguiente...

Cita:
Iniciado por astaros Ver Mensaje
... Una de las diferencias entre Java y C++, es que Java introdujo arrays que realmente lo son ...
Que es un array verdadero ? C++ tiene arrays falsos ? Quien define qué es un array ? En Java el Array es un objeto, por lo que tiene mayor funcionalidad, igual que si usas Vector:: en C++.

Cita:
Iniciado por astaros Ver Mensaje
... y eliminaron la aritmetica de punteros ...
La aritmetica de punteros se eliminó completamente, puesto que Java es un lenguage que funciona en diferentes sistemas operativos y arquitecturas. Funciona indistintamente en un procesador de 16, 32 o 64 bits sin necesidad de compilar de nuevo el código, al contrario de C++. Creo que ocultando los punteros al programador (acceso directo a memoria) fue importante para eliminar los inconvenientes entre varias arquitecturas de hardware y software.

Pero tiene un concepto de "referencias", que en su debido límite viene a compararse a los punteros.

Código:
// ************ Java
public class Test {
  private class _v {
    public _v(int v) { value = v; };
    public int value;
  }
  public Test() {
    _v p = new _v(1);
    _v q;
    q = p;
    System.out.println(p.value + " " + p.toString()); // 1 Test$_v@19821f
    System.out.println(q.value + " " + q.toString()); // 1 Test$_v@19821f
  }
  public static void main(String[] args) {
    new Test();
  }
}

// ************ C++
#include "iostream"
using namespace std;
class _v {
public:
  _v(int v) { value = v; };
  int value;
};
int main() {
  _v* p = new _v(1);
  _v* q;
  q = p;
  cout << p->value << " " << (void *)p << endl; // 1 00032E18
  cout << q->value << " " << (void *)q << endl; // 1 00032E18
  delete q;
  return 0;
}
En Java, q hace referencia a p de una forma parecida a un puntero.
En C, son punteros. (Solo hay 1 instancia de _v en los dos ejemplos).

Cita:
Iniciado por djagu_26 Ver Mensaje
... ya que posee un GC(garbage collector) que cuando pasa(automatica no hay forma de llamarlo) ...
Runtime r = Runtime.getRuntime();
r.gc();

Cita:
Iniciado por Xinef Ver Mensaje
... que tenga tipos de datos primitivos o básicos le quita porcentaje. . Es decir, Java no es orientado a objetos "puro".
Para cada tipo primitivo hay una clase que encapsula el tipo.

Saludos,
  #8 (permalink)  
Antiguo 01/08/2008, 00:28
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Diferencias entre java y C++

Cita:
Iniciado por HackmanC Ver Mensaje
Que es un array verdadero ? C++ tiene arrays falsos ? Quien define qué es un array ? En Java el Array es un objeto, por lo que tiene mayor funcionalidad, igual que si usas Vector:: en C++.
Como ya he dicho, alguna gente considera que los arrays en C++ no son "verdaderos" por que como no se comprueba que te salgas del indice en tiempo de ejecución, se pueden hacer muchas "cochinadas" y pervertir su uso real de arrays. Es una cuestion semántica y como la mayoría de tales cuestiones, como si un lenguaje es OO al 100%, sirve poco más que para iniciar flames en foros .


Cita:
Iniciado por HackmanC Ver Mensaje
La aritmetica de punteros se eliminó completamente, puesto que Java es un lenguage que funciona en diferentes sistemas operativos y arquitecturas. Funciona indistintamente en un procesador de 16, 32 o 64 bits sin necesidad de compilar de nuevo el código, al contrario de C++. Creo que ocultando los punteros al programador (acceso directo a memoria) fue importante para eliminar los inconvenientes entre varias arquitecturas de hardware y software.
Eliminar la aritmetica de punteros no es por los diferentes sistemas operativos donde ha de correr, es para evitar los problemas que da el abuso de los mismos, ya que los problemas de errores al usarla son dificiles de detectar y pueden tener consecuencias catastroficas. De hecho, es una de las cosas que usan virus y "exploits" para infectar programas.

Cita:
Iniciado por HackmanC Ver Mensaje
Runtime r = Runtime.getRuntime();
r.gc();
La frase más correcta escrita debió ser: "no hay forma de controlar cuando hace su trabajo". Con lo que has escrito tu puedes pedirle al GC que haga su trabajo, pero no te garantiza que limpie completamente. Lo unico que se garantiza es que "se esforzará en limpiar" . La diferencia es sutil pero importante, por si esperamos que al hacer Runtime.gc() nos haya limpiado todo y pretendemos calcular con eso el tamaño que ocupaba un objeto, por ejemplo.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #9 (permalink)  
Antiguo 01/08/2008, 06:48
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: Diferencias entre java y C++

Runtime r = Runtime.getRuntime();
r.gc();

esto no asegura que pase, lo unico que le dice al GC es que ahora podria ser un buen momento para que el pasara, pero en ningun momento lo fuerza, o sea solo le recuerda ahora si pasa o no es problema del GC

saludos
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #10 (permalink)  
Antiguo 01/08/2008, 08:36
Avatar de diegoy2k  
Fecha de Ingreso: julio-2006
Ubicación: Algun Lugar
Mensajes: 68
Antigüedad: 17 años, 9 meses
Puntos: 0
Respuesta: Diferencias entre java y C++

Gente creo que C++ se asemeja mejor a la definicion de array!!! "una serie de direccienes de memoria cuntinuas", mientra que java "Gracias a dios", nos abstrae de esta definicion!!! y nos proteje respecto a direciones invalidas y de no dejar basura en la memoria, no tenemos que lidia con el hecho de punteros colgados... uuuffff.
Respecto a la liberacion de memoria en C++ eso se hace explicito y ahi se termina!!!, si uno no libera memoria hablando mal y pronto "Cagaste" queda ahi dando vueltas!!!
Eso es to to todo Amigos!!!!
  #11 (permalink)  
Antiguo 01/08/2008, 17:33
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Diferencias entre java y C++

Hola,

Cita:
Iniciado por GreenEyed Ver Mensaje
... sirve poco más que para iniciar flames en foros ... .
Espero que no.


Cita:
Iniciado por GreenEyed Ver Mensaje
...Como ya he dicho, alguna gente considera que los arrays en C++ no son "verdaderos" por que como no se comprueba que te salgas del indice en tiempo de ejecución
Quien define qué es un array ?

Java tiene funcionalidad extendida como dicha verificación.
Pero eso es un valor agregado al lenguaje, podría decir que Perl tiene un mejor "array", por que tiene mas funcionalidad que el array de Java.

Cita:
Iniciado por GreenEyed Ver Mensaje
...Eliminar la aritmetica de punteros no es por los diferentes sistemas operativos donde ha de correr, es para evitar los problemas que da el abuso de los mismos, ...
No, no solamente por los diferentes sistemas operativos. Por diferentes arquitecturas de hardware.

Un procesador de 16 bits "paginado" no maneja la memoria de la misma forma que un procesador de 32 con acceso "flat". Un procesador Alpha maneja la memoria de diferente forma que un RISC y un x86. (Sin mencionar PDA's, mobiles, etc).

Windows 95 de 16 bits, o Windows 98 de supuestos 32 bits, no maneja la memoria de igual forma que Windows 2000, XP de 32 bits. Igual a Windows Vista de 64 bits. Inclusive hay que definir si es un OS ANSI o Unicode (WideByte/DoubleByte). (CreateWindow: Implemented as Unicode and ANSI versions on Windows NT/2000/XP.)

Los programadores en C++ saben que tiene que pensar en todas esas características, en Java no. Los virus pueden ser transmitidos inclusive por medio de la VM. (No creo que hayan pensado en suprimir virus al crear Java)

Cita:
Iniciado por GreenEyed Ver Mensaje
..como si un lenguaje es OO al 100%...
Para cada tipo primitivo hay una clase que encapsula el tipo.

No dije que fuera un lenguaje 100% OO, ... la aseveración que Java no es 100% OO puede o no puede ser cierta, pero no puede asegurarse por el concepto que tiene también tipos de datos primitivos.

Cita:
Iniciado por djagu_26 Ver Mensaje
...esto no asegura que pase, lo unico que le dice al GC es que ahora podria ser un buen momento para que el pasara
No aseguré que fuera a suceder... solamente que si existe una forma de llamar al gc (tampoco aseguré que fuera a limpiar tooooooda la memoria).

Saludos,

Última edición por HackmanC; 01/08/2008 a las 18:39 Razón: append
  #12 (permalink)  
Antiguo 02/08/2008, 03:35
Avatar de Xinef  
Fecha de Ingreso: marzo-2007
Mensajes: 202
Antigüedad: 17 años, 1 mes
Puntos: 7
Respuesta: Diferencias entre java y C++

Cita:
Iniciado por HackmanC Ver Mensaje
Para cada tipo primitivo hay una clase que encapsula el tipo.
Sí, pero tiene datos primitivos... eso no lo hace lenguaje objeto puro. Al igual que C++ tampoco lo es, claro.

En contrapartida tienes SmallTalk.


Cita:
la aseveración que Java no es 100% OO puede o no puede ser cierta, pero no puede asegurarse por el concepto que tiene también tipos de datos primitivos.
Pues yo si lo considero suficiente.

Si existen "cosas" que no son objetos, no es un lenguaje orientado a objetos puro.

Otra cosa es que eso sea mejor o peor. :)
  #13 (permalink)  
Antiguo 02/08/2008, 15:23
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Mensaje Respuesta: Diferencias entre java y C++

Hola,

Cita:
Iniciado por Xinef Ver Mensaje
... Sí, pero tiene datos primitivos... eso no lo hace lenguaje objeto puro. Al igual que C++ tampoco lo es, claro.... Si existen "cosas" que no son objetos, no es un lenguaje orientado a objetos puro...
No voy a contradecirte en ese punto, realmente no estoy seguro que java sea 100% orientado a objetos o no lo sea. Como correctamente hiciste la referencia a SmallTalk que si es orientado a objetos puro.

Pero si Java tiene clases para los mismos objetos primitivos, es una cuestión conceptual nada más. Y se refiere más a la forma en que lo usas y no al lenguaje en sí.

Si usas primitivos, tienes un lenguaje que no es 100% OO.
Si usas las clases que encapsulan los datos primitivos, incertidumbre.

Saludos,
  #14 (permalink)  
Antiguo 02/08/2008, 16:06
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: Diferencias entre java y C++

Hola mira no se si es 100% OO pero sin duda que JAVA se invento para programar en Objetos, incluso todas las cosas que tiene java heredan directamente o indirectamente de Object(a excepcion de los datos primitivos), para mi eso ya es suficiente para decir que es OO

saludos
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #15 (permalink)  
Antiguo 03/08/2008, 09:23
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Diferencias entre java y C++

Bueno, ya hemos visto para que sirve definir un lenguaje como OO 100% o no .

Y no, la aritmética de punteros no se quitó por eso. Precisamente Java define un procesador virtual en la JVM donde en todas las arquitecturas todos los datos usan el mismo numero de bytes y el orden esta definido. Y sí, se pensó en la seguridad al crear la JVM, incluyendo los ataques por buffer overflow etc. por eso hay varios niveles de seguridad para que tu codigo no pueda saltarse esos límites. Y seguramente se puedan hacer virus en la JVM, pero como si no es atacando la JVM, tu codigo no puede atacar a otro por "overflow".

Lo del GC no era para contradecirte, solo era para explicar un poco mejor lo que puedes esperar.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #16 (permalink)  
Antiguo 03/08/2008, 13:52
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Diferencias entre java y C++

Hola,

Bueno, ya hemos visto para que sirve definir por qué se quito la aritmética de punteros .

Cita:
Iniciado por GreenEyed Ver Mensaje
... Y no, la aritmética de punteros no se quitó por eso. Precisamente Java define un procesador virtual en la JVM donde en todas las arquitecturas todos los datos usan el mismo numero de bytes y el orden esta definido. ...
¿ Como se logró que en todas las arquitecturas todos los datos usaran el mismo numero de bytes y el orden estuviera definido ?

Ocultando al programador el acceso directo a memoria y los punteros.

El objetivo inicial de Java era portabilidad, y para eso era necesario eliminar todas las diferencias entres procesadores (incluyendo acceso directo a memoria o punteros).

Cita:
Iniciado por GreenEyed Ver Mensaje
... Y seguramente se puedan hacer virus en la JVM, pero como si no es atacando la JVM, tu codigo no puede atacar a otro por "overflow"....
Como dijiste anteriormente, semántica. Creo, que si pensaron en la seguridad, pero no era el objetivo principal al crearlo.

Saludos,

ps: El ejemplo clásico de mi punto de vista es el procesador Morotola y PowerPC con su "endianess" tipo "big-endian".

ps:

Para comprender realmente este concepto hay que entrar en detalle como funciona el procesador, las instrucciones de código de maquina, y los punteros que existen en lenguaje assembler. Por ejemplo en x86: mov ax,[bx] o en RISC: li $v0,(10) ; y como Java elimina ese problema, creando diferentes VM para cada arquitectura de hardware, que muestren simplemente java.lang.Integer i = 10; sin importar si bx es 16, 32 o 64 bits. (O inclusive $v0 es de 64 bits). Y asegurando que java.lang.Integer va a ser de 32 bits.

Y como está fuera de contexto en el foro de Java. Cada quien saque sus propias conclusiones.

Última edición por HackmanC; 03/08/2008 a las 16:34 Razón: rewrite all & ps2 & correct big-endian x little-endian & end.
  #17 (permalink)  
Antiguo 03/08/2008, 18:26
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Diferencias entre java y C++

Claro, por eso la seguridad se nombra como uno de los objetivos de diseño al crear Java, y de ahí, entre otras cosas, eliminar la aritmética de punteros y el control de los accesos a los arrays.

Será que los de Sun no saben de lo que hablan, y eso que lo crearon.
http://java.sun.com/docs/white/langenv/Intro.doc2.html

ps: Se lo que es el "endian" y como funciona un procesador, así que comprendo perfectamente el concepto. Otra cosa es que si la gente que creo el lenguaje me dice que la aritmetica de punteros la quitaron para evitar errores y por seguridad y no para conseguir independencia de plataforma, pues les crea a ellos.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:56.