Historias
Slashboxes
Comentarios
 
Este hilo ha sido archivado. No pueden publicarse nuevos comentarios.
Mostrar opciones Umbral:
Y recuerda: Los comentarios que siguen pertenecen a las personas que los han enviado. No somos responsables de los mismos.
  • ¿Y qué dice del C++?

    (Puntos:5, Interesante)
    por quk (8884) el Miércoles, 15 Septiembre de 2004, 19:57h (#355587)
    ( http://barrapunto.com/ )
    Todavía no he conseguido que me expliquen la ventaja de Java o C# sobre C++.

    • ¿Recolección de basura automática?

      También están disponibles en C++ recolectores tipo mark & sweep como el de Java, pero nadie los usa porque es mucho más eficiente gestionar la memoria en la pila, o usar conteo de referencias para la memoria reservada en el heap.

    • ¿Código seguro que no da cores ni fallos de segmentación?

      Qué mas da que el programa salga por un fallo de segmentación, que salga por una excepción no capturada tipo java.lang.NullPointerException o java.lang.IndexOutOfBoundException. Bueno, la verdad es que con un core puedes usar el depurador y examinar todo el proceso. En java y en c# te tienes que conformar con la traza de llamadas. Los programas en C# petan y salen con excepciones igual que el resto de los programas. No hay magia, si el programa está mal el runtime no puede hacer nada por corregirlo. Cuando Java chequea el límite de un array o si un puntero es nulo, está replicando el trabajo de algo que ya hace el sistema operativo, y que además lo hace por hardware usando la MMU del micro.

    • ¿Velocidad?.

      Venga ya, todos lo hemos visto. Pero en cualquier caso, todos los lenguajes una vez compilados son prácticamente igual de rápidos, la diferencia está en las optimizaciones que sea capaz de hacer cada compilador, no en el lenguaje en sí. Las máquinas virtuales de Java y Mono están escritas en C, por algo será.

    Lo único que no tiene discusión es la portabilidad. Pero entonces, ¿para qué C# si sólo funciona en Windows y a medias en Linux?.

    Pero bueno, tampoco quiero provocar un flamewar, que cada cual use el lenguaje que quiera, pero hoy por hoy las estadísticas de sourceforge son aplastantes, el rey siguie siendo el C, con C++ comiéndole terreno progresivamente.

    Lo único que quiero es que la gente reconsidere el C++ ahora que hay un estándar, pero usándolo bien, con la STL, con smart pointers, y con namespaces, porque el C++ estándar es el gran desconocido de la gente que ha estado usando C++ durante 10 años sin un estándar, y que creen conocer un lenguaje que en realidad ha cambiado mucho.

    Puntos de inicio:    5  puntos
    Modificador extra 'Interesante'   0  

    Total marcador:   5  
  • por jmmv (5375) el Miércoles, 15 Septiembre de 2004, 20:15h (#355600)
    ( http://julipedia.blogspot.com/ )
    Plas, plas, plas. Muy bueno el post. A falta de puntos para moderar, dejo este comentario ;-)
    --

    The Julipedia [blogspot.com]

    [ Padre ]
  • Re:¿Y qué dice del C++?

    (Puntos:1, Inspirado)
    por pobrecito hablador el Miércoles, 15 Septiembre de 2004, 20:42h (#355620)
    Java y C# tienen mas futuro que C++ en tanto que las horas de programador son mas caras que los milisegundos ganados en tiempo de ejecución. Para casos en los que los milisegundos son mas caros que las horas de programador, se sigue usando C++.
    [ Padre ]
  • por Unleashed (8472) el Miércoles, 15 Septiembre de 2004, 23:07h (#355699)
    ( http://www.flawedcode.org/ )
    Cuando Java chequea el límite de un array o si un puntero es nulo, está replicando el trabajo de algo que ya hace el sistema operativo, y que además lo hace por hardware usando la MMU del micro.

    No.

    Esas operaciones no son tarea del SO ni de la MMU. Si lo fueran, difícilmente íbamos a ver cosas como buffer overflows y similares.

    Lo que sí es su tarea es gestionar los recursos de hardware, y actuar cuando un proceso intente acceder donde no debe.

    Tanto la comprobación de punteros nulos como la de límites de arrays son medidas que tomaron los diseñadores del lenguaje para ayudar a los desarrolladores a capturar errores, y es algo que solamente se hace una vez, nada de esfuerzos duplicados.

    En particular, ayudan mucho a rebajar los casos de programas que pueden funcionar bien un día, incluso el 99% de las veces, pero que están mal hechos y en cualquier momento fatídico podrían cascar. Y en especial aumentan la seguridad por defecto de un programa, lo cual no quiere decir que sea completamente seguro, y a un buen programador que además tuviese en cuenta la seguridad esos chequeos no le serian necesarios en alguna ocasiones.

    Pero todos sabemos que los buenos programadores no nacen hechos.
    --
    Unix have fun [barrapunto.com]
    [ Padre ]
  • por samsaga2 (5886) el Jueves, 16 Septiembre de 2004, 06:15h (#355769)
    ( http://barrapunto.com/ )
    ¿Recolección de basura automática?

    Lo que tiene uno que escuchar. ¿Porque esta cada vez mas de moda usar recolectores de basura? Una de las principales fuentes de bugs (por no decir la principal) es la gestion de memoria que usa C/C++ (uno se lo gisa uno se lo come) y cualquier programador serio te dira que es imposible librar un programa en C del 100% de los memory leaks (fugas de memoria). Un gestor de memoria como http://www.hpl.hp.com/personal/Hans_Boehm/gc/ promete por lo general la misma velocidad que usar unas funiones malloc/new e incluso si tu programa recolecta mucha memoria para objetos pequeños notaras una mejora de velocidad de ejecucion ya que el recolector no estara como loco cogiendo y liberando objetos (el C esta obligado a hacerlo inmediatamente despues de llamar al malloc/free en lugar).

    ¿Código seguro que no da cores ni fallos de segmentación?

    Me estas comparando una excepcion del Java con un fallo de segmentacion? Te dire la diferencia:

    try {

        a[12345] = 0;

    } catch(Exception e) {

        printf("Aqui no ha pasado nada\n");

    }

    a[0] = 0;

    Un fallo de segmentacion te lo comes con patatas.

    ¿Velocidad?.

    En eso estoy de acuerdo contigo, la unica diferencia al final es que unos compiladores optimizan mas el codigo que otros, es decir, la limitacion no es del lenguaje si no de la calidad de compilador (normalmente contra mas tiempo en el mercado mas calidad tiene aunque no necesariamente). Lo que quiere decir que es cuestion de tiempo.

    No digo que el C sea una caca de la vaca si no que hay que saber que escoger para segun que tipo de programas. Para que vas a hacer un programa de gestion para una empresa en C? Eso es una locura! Hazlo en Java, C# o incluso en python.

    Todos los lenguajes tienen una fecha de caducidad y el C no se libra tampoco. Cada vez van apareciendo mas alternativas, supongo que eso quiere decir algo.
     
    --
    Pa que? Pa cagala?
    [ Padre ]
  • por knar (4125) <solrac888@QUITAESTOyahoo.com> el Jueves, 16 Septiembre de 2004, 09:27h (#355856)
    ( http://blog.irreality.eu/ )

    • Recolección de basura: Hace tiempo que se sabe que, en programas no triviales, un buen recolector de basura es MÁS eficiente que gestionar la memoria "manualmente" mediante refcounting o similares.

      • Se evita el tener que manipular contadores de referencias.

      • En los momentos en que sobra memoria no se pierde tiempo liberando memoria. Se pueden ajustar los momentos en que salta el recolector para optimizar el tiempo de respuesta.

      • Y, sobre todo, todo el código de gestión de la memoria está concentrado en unas pocas líneas y esto es mucho mejor de cara a la caché.

      • Todo esto hace que en la actualidad no tenga mucho sentido gestionar la memoria "a mano" salvo en aplicaciones de tiempo real, e incluso hay trabajos que pretenden acabar con este último feudo de los mallocs/frees.

      • Sobre el chequeo de límites y de referencias nulas: En la práctica, esto no provoca deterioro en el rendimiento, porque la mayoría de las veces estos chequeos son eliminados por el compilador al ver que no son necesarios. Por ejemplo, en un bucle for que recorre un array, lo más normal es que los chequeos simplemente no se hagan. Sólo se harán en situaciones donde el resultado sea impredecible en tiempo de compilación (dinámica), con lo cual tenemos las ventajas obvias de seguridad y los inconvenientes simplemente no se notan.


      • En velocidad, hace tiempo que Java supera sobradamente a C++, principalmente debido a las ventajas de la compilación dinámica (JIT, Hotspot...) que permite hacer optimizaciones con mucho más conocimiento que las que hace un compilador de C++. (Véase por ejemplo http://www.kano.net/javabench/). Y encima todas estas ventajas todavía no están explotadas de todo, queda mucho más por hacer que hará que Java sea *significativamente* más rápido que cualquier lenguaje estáticamente compilado en el futuro, ya que en éstos hay menos campo de trabajo al tener menos información en el momento en que compilamos.


      En resumen, ahora mismo no hay muchos motivos para elegir un lenguaje tipo C/C++ sobre uno tipo Java, salvo si (1) estamos haciendo el kernel de un sistema operativo, (2) trabajamos contra código legacy, (3) queremos presentar un ejecutable pequeñito y nos fastidia tener que distribuir u obligar a bajar la JVM, o (4) simplemente nos gusta más/tenemos más experiencia en ese lenguaje.

      La velocidad, desde luego, ha dejado de ser un motivo. Vivan las VM's.
    --
    Mi bitácora: Reductio ad Absurdum 2.1 [irreality.eu]
    [ Padre ]
  • por Carnil (11361) <Carnil en jabber.org> el Jueves, 16 Septiembre de 2004, 09:38h (#355861)
    ( Última bitácora: Martes, 18 Mayo de 2004, 09:30h )

    Hombre, para empezar me gustaria destacar que Icaza no defendió en ningún momento C# ni ningún otro lenguaje, precisamente Mono (bueno, y .NET) se hizo con el objetivo de poder desarrollar APIs en cualquier lenguaje y utilizarlas desde cualquier otro lenguaje, con lo cual permite usar el más apropiado para cada tipo de problema(o el que mejor se te dé).

    Respondiendo más directamente a tus puntos, creo que:

  • Los recolectores de basura facilitan bastante el trabajo en aplicaciones distribuidas, puesto que nunca es facil determinar quien y cuando se tiene que liberar un espacio de memoria cuando ese espacio se esta usando desde diferentes máquinas, y, tal como señaló Icaza, CORBA daba bastantes problemas para solucionar esto.
  • En el segundo punto estoy de acuerdo contigo, en C++ tambien se pueden realizar las mismas comprobaciones y solo cambia el tipo de error que recibes
  • En el tema de velocidad yo no he visto ninguna diferencia entre programas desarrollados en C# o en C++, la verdad.

    Por otro lado, no se porque dices que C# solo funciona a medias en Linux. El compilador de C# de mono funciona para Linux, Mac y incluso Solaris, y que yo sepa en todos ellos igual de bien.

    Para acabar solo comentar que a mi tambien me gusta C++ y no tengo ningun inconveniente en que se convierta en lenguaje standard de facto, pero tiene un problema que C# y Java solucionan magistralmente: los strings!! los de la STL son una porqueria, y lo demuestra el hecho de que cada proyecto que conozco se implementa un tipo propio para ellos!!

[ Padre ]
  • por luser (15253) el Jueves, 16 Septiembre de 2004, 10:06h (#355876)
    ( http://barrapunto.com/ )
    Cuando Java chequea el límite de un array o si un puntero es nulo, está replicando el trabajo de algo que ya hace el sistema operativo, y que además lo hace por hardware usando la MMU del micro.

    Ahi se te ha ido la olla tio. Si eso fuera cierto no habría ningún fallo de seguridad por desbordamiento de buffer ;).

    Si te sales del límite de un array en C o C++ puede que ni siquiera te enteres. No hay excepción por violación de segmento porque sigue accediendo a memoria del proceso.

    Lo que ocurre es que las direcciones de retorno de las funciones se encuentran en el mismo segmento de memoria que los buffers (la pila). Si te sales de los límites del buffer puedes sobreescribir esa direccion de retorno y la ejecución del programa se desviará a otro lugar, generalmente la zona del buffer donde está el 'código malicioso'. Si el usuario que ejecuta el proceso tiene privilegios suficientes (root@localhost) puedes conseguir el control total de la máquina remotamente.

    Si ese buffer es por ejemplo una imagen de una página web, podría sustituir la verdadera imagen por instrucciones máquina, desviar la ejecución a esa zona y ya lo tienes: ejecución remota de código :) Hace poco corrigieron un fallo de este tipo en la librería png (libpng).

    Todo esto en Java y .NET no puede ocurrir porque siempre se chequean los índices porque los buffers están otra zona memoria (el heap). En C++ es fácil de evitar siguiendo unas buenas costumbres de programación. En C es bastante más difícil porque suele ser más incómodo de comprobar y por la mala (e inútil) costumbre de querer optimizarlo todo.

    [ Padre ]
  • 3 respuestas por debajo de tu umbral de lectura actual.