¿Que´determina la eficiencia de un lenguaje?

Buenas!

Me voy corriendo a la uni, pero antes sus dejo esta pequeña rayada (made in FuckingFreaky, like always). ¿Qué factores determinan la lentitud/velocidad que proporciona un lenguaje para los programas? Es decir... Los programas en C supongo que corren a una velocidad, en cambio tengo entendido que Java es más lento... me refiero a qué hace que cada lenguaje sea más o menos eficiente en cuanto a eso, ¿qué lo determina? Repito, lenguaje, no programas.

¿Dónde podría investigar/aprender un poquito más sobre esto? ¿Qué asignaturas se dan en la carrera sobre estos temas?

Pues hale... si alguien quiere responder a mis pequeñas paranoias... mi FuckingFreaky interior se lo agradecerá mucho.

Un saludo!
Hombre ente C y Java esta clarisimo.

Los compiladores de C suelen generar codigo binario que
se ejecuta directamente en la maquina.

Java con el javac lo que genera es un bytecode (una especie
de lenguaje intermedio o de codigo binario de la maquina virtual)
que se interpreta por java. Lo que hace que sea más lento.

A parte de eso no creo que un lenguaje tenga que influir decisivamente
en la velocidad de sus programas aunque claro siempre habra
lenguajes en los que por ser de muy alto nivel el codigo sea
más dificil de optimizar, pero en general la velocidad del codigo
binario depende más del compilador y de lo bien que optmice
Un lenguaje compilado ( como c ) siempre va a ser mas rapido porque no le metes un interprete entre la maquina y el programa, de todas formas depende lo que hagas no lo vas a notar mucho, en mi opinion es mucho mas interesante el algoritmo que uses... generalmente es mas eficiente uno iterativo que uno recursivo y asi

En la uni, a las alturas que voy yo, el tema de los algoritmos lo das en asignaturas como algoritmica (no se si se llamara igual en todos los sitios...). Se supone que aprendes a decidir cual es el mejor algoritmo de varias opciones, razonar si es bueno tu programa... ese tipo de cosas. Luego tienes compilacion que puede que traten el tema de diferencias de rendimiento pero no te puedo decir porque no he dado aun :D

Espero que te sirva de algo el tochazo mañanero jeje

Salu2
Entre los mismos lenguajes influye (y mucho) el compilador. Eso lo estudias en asignaturas como Compiladores o Procesadores del Lenguaje (una asignatura mucho más bonita de lo que parece). Entre distintos lenguajes depende de muchos factores por lo que enumerarlos se hace difícil y casi tardas menos en hacer un bechmark. ;).


De todos lo más importante de todo es la pericia del programador como bien han indicado aqui. Bueno, la pericia y las ganas de currarse una ordenacion de una lista con mergesort por ejemplo y no mediante la burbija :D :D :D :D
Más eficiente que la burbuja es el Q-Sort. y no es tan dificl de programar
Aunque yo prefiero el HeapSort (lo tengo hecho en java,c e incluso
en ensamblador)

(una asignatura mucho más bonita de lo que arece)

Yo creo que como la mayoria de las asignaturas se dan demasiado
rápido y no da tiempo a cojerles "gustillo"
Al menos a mi me ha resultado que las asignaturas más dificiles
suelen ser las más interesantes
Bueno, la verdad que no fue nada buena la comparaión de C con Java... iba rápido y ni pensé en la máquina de java y esas historias que sí sé que, por supuesto, hace que sea más lento.

Pero dejando a un lado las diferencias de rendimiento de interpretados, y compilados... y también ensamblador puesto que ahora no me interesa saber mucho de lenguajes que no puedan generar programas multiplataforma ¿no influye en nada el lenguaje?

Es decir... entre C y C++ (por poner dos lenaguajes compilados, aunque son "más o menos lo mismo") ¿hay diferencia para un programa similar? Haciendo todos los métodos con la misma pericia y demás...

Por lo que habéis dicho tengo todas esas aignaturas ó similares, así que guay. Los nombres a veces asustan, pero al igual que Harl, de momento, las teóricamente más difíciles son las que más me están gustando, a excepción de todas las mátemáticas... que no puedo con ellas.

En fin, toda esta rallada viene porque a mi mente vino la idea de si de alguna forma en un futuro, podremos reducir el número de lineas de un programa, de si eso influiría y si se ejecutarían más rápido los métodos... no sé, en fin, muy abstracto y muy confuso puesto que, como véis, no tengo npi de todo esto. ¿Sabéis algo sobre optimizaciones de este tipo? De cómo reducir un lenguaje para que sea más rápido programar en él y su influencia en la eficiencia...

Bueno, mis paranoias y yo, seguimos investigando...

Gracias!

Saludos.

P.D: Puta recursividad, qué invento más inútil...
Obviamente también cuenta el runtime. En el caso de C si no recuerdo mal el runtime no existe, pero en lenguajes como C++ y Obj-C si.

En este caso "el mismo programa" en C++ y Obj-C debería ir más rápido en Obj-C ya que su runtime es más liviano. (iirc).

Salu2.Ferdy
FuckingFreaky escribió:Bueno, la verdad que no fue nada buena la comparaión de C con Java... iba rápido y ni pensé en la máquina de java y esas historias que sí sé que, por supuesto, hace que sea más lento.

Pero dejando a un lado las diferencias de rendimiento de interpretados, y compilados... y también ensamblador puesto que ahora no me interesa saber mucho de lenguajes que no puedan generar programas multiplataforma ¿no influye en nada el lenguaje?

Es decir... entre C y C++ (por poner dos lenaguajes compilados, aunque son "más o menos lo mismo") ¿hay diferencia para un programa similar? Haciendo todos los métodos con la misma pericia y demás...

Por lo que habéis dicho tengo todas esas aignaturas ó similares, así que guay. Los nombres a veces asustan, pero al igual que Harl, de momento, las teóricamente más difíciles son las que más me están gustando, a excepción de todas las mátemáticas... que no puedo con ellas.

En fin, toda esta rallada viene porque a mi mente vino la idea de si de alguna forma en un futuro, podremos reducir el número de lineas de un programa, de si eso influiría y si se ejecutarían más rápido los métodos... no sé, en fin, muy abstracto y muy confuso puesto que, como véis, no tengo npi de todo esto. ¿Sabéis algo sobre optimizaciones de este tipo? De cómo reducir un lenguaje para que sea más rápido programar en él y su influencia en la eficiencia...

Bueno, mis paranoias y yo, seguimos investigando...

Gracias!

Saludos.

P.D: Puta recursividad, qué invento más inútil...


Aqui ya me parece que te estas liando un poco. Hay que diferenciar muchas cosas:

- La sintaxis del lenguaje o lo que es el lenguaje propiamente dicho: Especifica como se construyen los programas. Es por ejemplo C, C++, Java.... eso no determina practicamente nada la velocidad de ejecución de un programa.

- El compilador: Es un caso particular de un traductor. Pasa de un lenguaje a codigo máquina. En el caso de C lo pasa a intrucciones en código máquina de la arquitectura que sea, en caso de java a instrucciones máquina de la máquina virtual de java. Es el que se lleva el peso de las optimizaciones que permitirán determinar la velocidad de ejecución.

- El intérprete: En algunos lenguajes existe un elemento llamado intérprete que se encarga de ejecutar un determinado código. Por ejemplo en java lo que llamamos la máquina virtual de java o en python el intérprete de python. Suelen ser lentos ya que para ejecutar el programa tienen que transformar antes desde un código propio al código máquina de la plataforma donde se esté ejecutando. Por ejemplo en python es como si tuviésemos que compilar el programa cada vez que lo queramos ejecutar.

Esto es lo más básico. Luego hay mil cosas más detrás.

Lo que dices de reducir el numero de instrucciones para aumentar la velocidad no tiene serntido (al menos estrictamente). Un programa con menos instrucciones máquina no es más rapido sino que incluso puede ser más lento. Por ejemplo un bucle que haga exactamente 1000 sumas se ejecuta más lento si está implementado como un bucle que si está implementado como 1000 instrucciones de suma consecutivas. De hecho muchos compiladores aplican esta optimización al código.

P.D. : ¡Como que puta recursividad! Si tengo que implementar ciertas cosas iterativamente me muero :D :D :D

P.P.D. : La burbuja es el ejemplo de anti-eficiencia pero que levante la mano el que nunca lo haya usado en un momento de apuro de "joder, no tengo tiempo para acabar esto" ;) ;) ;)
Cógete unos apuntes de Metodología y Tecnología de la Programación (MTP), seguramente encontrarás un capítulo entero dedicado a todas las cuestiones que planteas. Ahí puedes conseguir los apuntes y documentación que seguimos en mi Escuela:

http://servil.unileon.es/asignaturas/MTP/
Ya lo encontré XD

http://jungla.dit.upm.es/~pepe/doc/fprg/ ahi tiene sun apple que ves cual algoritmo de ordenación es mas eficiente, pon un numero alto en el array, verás como el Qsort te va sorprender

Un saludo, y epsero que te sirva para hacerte una idea

Encima del applet que se ve, hay enlaces a mas applets con mas codigos de ordenación no tiene desperdicio
Yo en este semestre empiezo lenguajes y paradigmas de la programación. Esta interesante, y la asignatura se centra en los paradigmas alternativos de programacion. Las prácticas se hacen con Haskell para el paradigma funcional (aquí la recursividad es a muerte xD) y prolog para el paradigma lógico.
Además para lenguajes tienes Teoria de Autómatas y Lenguajes Formales. La bestia negra de la carrera y la base para compiladores. Jerarquias de Chomsky, maquinas de Turing, etc. Por suerte no le he cogido demasiada tirria. Por desgracia las prácticas son con mathematica y (volviendo al tema) tiene un lenguaje bastante penoso para mi gusto.

Saludos
Raharu escribió: Las prácticas se hacen con Haskell para el paradigma funcional (aquí la recursividad es a muerte xD)


Como odio la programación funcional!! (Para algunas cosas es totalemente necesaria aunque algunos no lo piensen A.I por ejemplo) entre Haskell, Lisp, y Camel me traen loco, eso si cuando te sale algo te sientes realizado pro lo menos yo.
FuckingFreaky escribió:P.D: Puta recursividad, qué invento más inútil...


Bueno, eso te lo parecerá a tí, a mi me parece cojonuda.
Harl escribió:Más eficiente que la burbuja es el Q-Sort. y no es tan dificl de programar
Aunque yo prefiero el HeapSort (lo tengo hecho en java,c e incluso
en ensamblador)


El más rápido es sin duda el Radix Sort, pero es un algoritmo que no se basa en cdc's.

Por otra parte, yo creo que, una vez distinguimos entre lenguajes para máquinas virtuales y lenguajes para máquinas físicas, la velocidad depende sobretodo del compilador.

C permite hacer muchas cosas a bajo nivel, mientras que por ejemplo Pascal es un lenguaje enteramente de alto nivel, por lo que en C es más sencillo y eficiente traducir directamente de código de alto nivel a código máquina, alcanzado un mayor grado de optimización.
bastian escribió:Bueno, eso te lo parecerá a tí, a mi me parece cojonuda.
Exacto, eso he puesto, mi opinión.
De todas formas era un pequeño comentario de nada y medio en coña. Está claro que tiene su utilidad, aunque tb pienso que la gente a veces abusa de ella, ó más bien, nos enseñan a abusar de ella. Como ya han dicho, en ciertas cosas que se pueden ahcer tanto iterativas como recursivas, es mucho más eficiente lo iterativo, así como en otras es necesaria la recursividad. A vé, que esto es como todo, ni un extremo, ni otro. Nada más era eso ;).

Yo este año no la he cogido, pero tb tengo una asignatura con LISP y prolog y otro lenguaje que no me acuerdo. No me atrae mucho, la verdad... mola más C y SSOO a saco XD.

En fin... ¿cómo evolucionarán los lenguajes en un futuro? ¿Serán más eficientes? ¿gastarán más recursos?

Un saludo!
14 respuestas