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.
¿Quizás debería ser CW? –