Pregunta

¿Es posible diseñar algo como Ruby o Clojure sin la pérdida de rendimiento significativa en muchas situaciones en comparación con C / Java? Juega un papel diseño de hardware?

Edit: Con significativa quiero decir en un orden de magnitud, no sólo procent diez

Editar: Sospecho que delnan es correcta conmigo significa lenguajes dinámicos así que cambié el título

¿Fue útil?

Solución

El rendimiento depende de muchas cosas. Por supuesto, la semántica de la lengua tienen que ser conservados, incluso si estamos compilando que - no se puede quitar envío dinámico del Ruby, sería acelerar las cosas drmatically pero sería romper totalmente el 95% de toda el código de Ruby en el mundo. Pero aún así, gran parte del rendimiento depende de qué tan inteligente es la aplicación.

Asumo, por "alto nivel", que quiere decir "dinámica"? Haskell y OCaml son extremadamente alto nivel, sin embargo, se se compila de forma nativa y pueden superar a C # o Java, incluso C y C ++, en algunos casos de esquina - especialmente si el paralelismo entra en juego. Y desde luego no fueron diseñados con el rendimiento como meta # 1. Sin embargo, los autores de compiladores, especialmente aquellos enfocados idiomas onfunctional, son gente muy inteligente. Si usted o yo comenzamos un lenguaje de alto nivel, incluso si utilizamos por ejemplo, LLVM como backend para la compilación nativa, que no llegaría a nada cerca de este rendimiento.

Hacer lenguajes dinámicos correr rápido es más difícil - retrasan muchas decisiones (tipos, miembros de una clase / objeto, ...) al tiempo de ejecución en lugar de tiempo de compilación, y mientras que el análisis de código estático a veces puede demostrar que no es posible en líneas n ym, usted todavía tiene que llevar a un tiempo de ejecución avanzada alrededor y hacer algunas cosas bastante compilador de un lenguaje estático puede hacer en tiempo de compilación. Incluso envío dinámico se puede optimizar con un inteligente VM ( Inline Cache alguien?), Pero es un mucho trabajo. Más de un pequeño lenguaje nuevo fangeled podía hacer, lo que es.

También ver de Steve Yegge lenguajes dinámicos contraatacan .

Y, por supuesto, lo que es una pérdida significativa peformance? 100 veces más lento que C se lee como mucho, pero como todos sabemos, el 80% del tiempo de ejecución se gasta en el 20% del código = 80% del código no tendrá un impacto notable en el rendimiento percibida de todo el programa. Para el 20% restante, siempre se puede volver a escribir en C o C ++ y llamarlo desde el lenguaje dinámico. Para muchas aplicaciones, esto basta (para algunos, que ni siquiera tienen que optimizar). Para el resto ... bueno, si el rendimiento es tan crítica, que debe además probablemente lo escribe en un lenguaje diseñado para el rendimiento.

Otros consejos

No se debe confundir el lenguaje de diseño de la plataforma que se ejecuta.

Por ejemplo, Java es un lenguaje de alto nivel. Se ejecuta en la JVM (como lo hace Clojure - identificada anteriormente, y JRuby - una versión Java de rubí). La JVM llevará a cabo el análisis de código byte y optimizar la forma en las pistas de código (haciendo uso del análisis de escape, compilación en tiempo de ejecución, etc.). Por lo que la plataforma tiene un efecto sobre el rendimiento que es en gran medida independiente del lenguaje mismo (ver aquí para obtener más información sobre el rendimiento y las comparaciones de Java a C / C ++)

La pérdida comparado con qué? Si necesita un recolector de basura o cierres entonces usted los necesita, y vas a pagar el precio independientemente. Si un idioma les hace fácil para que usted pueda obtener en, eso no significa que tenga que usarlos cuando no los necesita.

Si un idioma se interpreta en lugar de compilado, que se va a introducir un orden de magnitud desaceleración. Sin embargo, un tipo de lenguaje puede tener compensar ventajas, como la facilidad de uso, la independencia de plataforma, y ??no tener que compilar. Y, los programas se escriben en ellos no pueden correr el tiempo suficiente para la velocidad a ser un problema.

Existen muchas implementaciones de lenguajes que introducen lentitud sin una buena razón, pero los que no tienen que ser utilizados.

Es posible que desee ver lo que la DARPA HPCS iniciativa ha llegado con. Hubo 3 lenguajes de programación propuestos: Fortaleza del Sol, X10 de IBM y la capilla de Cray. Los dos últimos son todavía en desarrollo. Si alguno de estos se encuentran su definición de alto nivel no sé.

Y sí, el diseño de hardware sin duda juega un papel importante. Los 3 de idiomas están dirigidos a los superordenadores con muchos procesadores y exhiben características apropiadas a ese dominio.

Es ciertamente posible. Por ejemplo, Objective-C es un lenguaje dinámicamente con tipo que tiene un rendimiento comparable a C ++ (aunque un poco wee más lento, en términos generales, pero todavía más o menos equivalente).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top