12

Estoy haciendo una encuesta de características para preparar un proyecto de investigación.Idiomas y máquinas virtuales: características que son difíciles de optimizar y por qué

Nombra una característica de lenguaje o lenguaje convencional que sea difícil de optimizar, y por qué la característica vale o no el precio pagado, o en su lugar, desacredita mis teorías a continuación con evidencia anecdótica. Antes de que alguien marque esto como subjetivo, estoy pidiendo ejemplos específicos de idiomas o funciones, e ideas para la optimización de estas características, o características importantes que no he considerado. Además, cualquier referencia a implementaciones que demuestren que mis teorías son correctas o incorrectas.

superior en mi lista de disco para optimizar características y mis teorías (algunas de mis teorías no se han probado y se basan en experimentos mentales):

1) Runtime sobrecarga de métodos (también conocido como multi-método de expedición o la firma despacho basado). Es difícil de optimizar cuando se combina con características que permiten la compilación en tiempo de ejecución o la adición de métodos. ¿O es solo difícil, de todos modos? El almacenamiento en caché del sitio de llamadas es una optimización común para muchos sistemas de tiempo de ejecución, pero los métodos múltiples agregan complejidad adicional y la hacen menos práctica para los métodos en línea.

2) Tipo morphing/variantes de tipificación basada (también conocido como valor en lugar de variable basada) optimizaciones tradicionales simplemente no puede aplicarse cuando no se sabe si el tipo de calle detrás puede cambiar en un bloque básico. En combinación con los métodos múltiples, la delimitación debe realizarse con cuidado, si es que lo hace, y probablemente solo para un determinado umbral de tamaño del destinatario. es decir. es fácil considerar la incorporación de recuperaciones simples de propiedades (getters/setters), pero la incorporación de métodos complejos puede dar como resultado la saturación del código. El otro problema es que no puedo asignar una variante a un registro y JIT con las instrucciones nativas porque tengo que llevar la información del tipo, o cada variable necesita 2 registros en lugar de 1. En IA-32 esto es inconveniente, incluso si mejorado con los registros extra de x64. Esta es probablemente mi característica favorita de los lenguajes dinámicos, ya que simplifica muchas cosas desde la perspectiva del programador.

3) continuaciones de primera clase - Hay varias formas para ponerlos en práctica, y lo han hecho en los dos enfoques más comunes, siendo una copia de pila y el otro como la implementación del tiempo de ejecución para usar el estilo de continuación que pasa, pilas de cactus, marcos de pila de copia sobre escritura y recolección de basura. Las continuaciones de primera clase tienen problemas de gestión de recursos, es decir. debemos guardar todo, en caso de que se reanude la continuación, y no estoy al tanto si hay idiomas que admiten dejar una continuación con "intención" (es decir, "no volveré aquí, así que puedes descartar esta copia del mundo").) Habiendo programado en el modelo de subprocesamiento y el modelo de continación, sé que ambos pueden lograr lo mismo, pero la elegancia de las continuidades impone una complejidad considerable en el tiempo de ejecución y también puede afectar la eficiencia de la memoria caché (la ubicación de la pila cambia más con el uso de continuidades y correlpacidades) El otro problema es que simplemente no se asignan al hardware. La optimización de las continuidades se está optimizando para el caso menos común, y como sabemos, el caso común debería ser rápido y los casos menos comunes deberían ser correctos.

4) Puntería aritmética y capacidad para enmascarar punteros (almacenar en enteros, etc.) Tuve que tirar esto, pero en realidad podría vivir sin esto con bastante facilidad.

Mi opinión es que muchas de las características de alto nivel, particularmente en los lenguajes dinámicos , simplemente no se asignan al hardware. Las implementaciones de microprocesadores tienen miles de millones de dólares de investigación detrás de las optimizaciones en el chip, pero la elección de las características del lenguaje puede marginar muchas de estas características (características como el almacenamiento en caché, aliasing to top para registrar, paralelismo de instrucciones, búferes de direcciones de retorno, bucle búferes y predicción de bifurcación).Las macro-aplicaciones de micro-características no necesariamente funcionan como a algunos desarrolladores les gusta pensar, y la implementación de muchos lenguajes en una VM termina mapeando operaciones nativas en llamadas a funciones (es decir, cuanto más dinámico es un lenguaje, más debemos buscar/caché en tiempo de ejecución, no se puede suponer nada, por lo que nuestra combinación de instrucciones se compone de un mayor porcentaje de ramificación no local que el código tradicional compilado estáticamente) y lo único que podemos JIT es evaluar la expresión de tipos no dinámicos y operaciones en tipos constantes o inmediatos. Tengo la corazonada de que las máquinas virtuales de bytecode y los núcleos JIT tal vez no estén justificados para ciertos idiomas debido a esto.

Agradezco sus respuestas.

+0

¿Quizás debería ser CW? –

Respuesta

5

Un par de comentarios:

  • Todos los idiomas con envío dinámico, incluso sobre la base de un único objeto, parece bastante difícil de poner en práctica de manera eficiente. Mire todo el esfuerzo que se ha dedicado a la optimización en tiempo de ejecución de Self (o más recientemente, JavaScript, con SpiderMonkey).

  • No pase por alto continuaciones delimitadas. El jurado todavía está fuera, pero son significativamente más fáciles de optimizar que las continuaciones clásicas no delimitadas. Lea el documento de Gasbichler y Sperber.

1

es mi intestino sensación de que el código de bytes máquinas virtuales y núcleos JIT son quizá no siempre justificada por determinados idiomas debido a esto.

No se escribió IronPython para demostrar que una máquina virtual no podía funcionar tan bien como la implementación nativa del lenguaje (Python). Y luego, el autor de IronPython se sorprendió cuando descubrieron que IronPython funcionaba muy bien para un lenguaje dinámico en una máquina virtual de bytecode.

El propio grupo interno de .Net de Microsoft confirma que creen que el JITter superará en rendimiento a un compilador/enlazador "normal" (por ejemplo, C/C++).

Creo que el jurado todavía está deliberando sobre esto. Es difícil llamarlo de cualquier manera. Elija el idioma que mejor se adapte al trabajo ...

+0

"Elija el idioma que mejor se adapte al trabajo ..." - Gracias, estoy de acuerdo, pero este no es el objetivo de mi pregunta. Se trata de optimización y características, específicamente. En cuanto a IronPython, no sé la respuesta a su pregunta, pero estoy interesado en leer si tiene referencias que pueda seguir. – codenheim

+0

Mi pregunta era retórica. IronPython fue tan bueno que desmintió la teoría de que los lenguajes dinámicos no eran adecuados para las máquinas virtuales bytecode. De ahí el siguiente párrafo acerca de Microsoft que admite ese punto de vista. Y eso lleva al último párrafo. Preocuparse de si un lenguaje dinámico es adecuado no tiene sentido. Son (suponiendo que la máquina virtual es lo suficientemente buena, algunos de ellos no), por lo que puede elegir el mejor idioma para el trabajo. –

+0

Esta pregunta no se trata de si un idioma es adecuado, así que por favor manténgalo en el tema. Soy un investigador/implementador de idiomas e VM y estoy hablando de optimizaciones específicas de funciones y usted está hablando de "elegir la mejor herramienta para el trabajo". Escribo herramientas para el trabajo. Ahora, para IronPython, es un ejemplo útil, pero algunas de las características que he enumerado no están presentes en Python. Python no tiene cierres reales (las variables son de solo lectura) o continuaciones de primera clase (CPS no es lo mismo). IronPython demuestra que Python se puede implementar bien en CLR, y no todos los idiomas. – codenheim

Cuestiones relacionadas