Una arquitectura de computadora de lenguaje de alto nivel ( HLLCA ) es una arquitectura de computadora diseñada para ser dirigida por un lenguaje de alto nivel específico , en lugar de que la arquitectura sea dictada por consideraciones de hardware. En consecuencia, también se denomina diseño informático dirigido por el lenguaje, acuñado en McKeeman (1967) y utilizado principalmente en las décadas de 1960 y 1970. Los HLLCA fueron populares en las décadas de 1960 y 1970, pero desaparecieron en gran parte en la década de 1980. Esto siguió al dramático fracaso de Intel 432 (1981) y la aparición de compiladores optimizadores y cómputo de conjuntos de instrucciones reducidos.(RISC) y arquitecturas CISC similares a RISC, y el posterior desarrollo de la compilación just-in-time para HLL. Se puede encontrar una revisión y una crítica detalladas en Ditzel y Patterson (1980) .
Los HLLCA datan casi del comienzo de los HLL, en los grandes sistemas de Burroughs (1961), que fueron diseñados para ALGOL 60 (1960), uno de los primeros HLL. Los HLLCA más conocidos son las máquinas Lisp de las décadas de 1970 y 1980 (para Lisp , 1959). En la actualidad los HLLCA más populares son los procesadores Java , para Java (1995), y estos son un éxito calificado, siendo utilizados para determinadas aplicaciones. Una arquitectura reciente en este sentido es la Arquitectura de sistema heterogéneo (2012), cuya capa intermedia HSA (HSAIL) proporciona soporte de conjunto de instrucciones para características HLL como excepciones y funciones virtuales; esto utiliza JIT para garantizar el rendimiento.
Definición
Hay una amplia variedad de sistemas bajo este título. El ejemplo más extremo es un lenguaje ejecutado directamente, donde la arquitectura del conjunto de instrucciones de la computadora es igual a las instrucciones del HLL, y el código fuente es directamente ejecutable con un procesamiento mínimo. En casos extremos, la única compilación requerida es tokenizar el código fuente y alimentar los tokens directamente al procesador; esto se encuentra en lenguajes de programación orientados a pilas que se ejecutan en una máquina de pila . Para lenguajes más convencionales, las declaraciones HLL se agrupan en instrucción + argumentos, y el orden infijo se transforma en orden prefijo o sufijo. Los DEL son típicamente solo hipotéticos, aunque fueron defendidos en la década de 1970. [1]
En ejemplos menos extremos, el código fuente se analiza primero en código de bytes , que es luego el código de máquina que se pasa al procesador. En estos casos, el sistema normalmente carece de un ensamblador, ya que el compilador se considera suficiente, aunque en algunos casos (como Java) se utilizan ensambladores para producir códigos de bytes legales que el compilador no generaría. Este enfoque se encontró en Pascal MicroEngine (1979) y actualmente lo utilizan los procesadores Java.
En términos más generales, una HLLCA puede ser simplemente una arquitectura de computadora de propósito general con algunas características específicamente para admitir una HLL determinada o varias HLL. Esto se encontró en las máquinas Lisp desde la década de 1970 en adelante, que aumentaron los procesadores de propósito general con operaciones diseñadas específicamente para admitir Lisp.
Ejemplos de
Los Burroughs Large Systems (1961) fueron los primeros HLLCA, diseñados para admitir ALGOL (1959), uno de los primeros HLL. Esto se denominó en ese momento "diseño dirigido por el lenguaje". Los Burroughs Medium Systems (1966) fueron diseñados para admitir COBOL para aplicaciones comerciales. Los sistemas pequeños de Burroughs (mediados de la década de 1970, diseñados a partir de finales de la década de 1960) fueron diseñados para admitir múltiples HLL en un almacén de control de escritura . Todos estos eran mainframes.
La serie Wang 2200 (1973) se diseñó con un intérprete BASIC en microcódigo.
El Pascal MicroEngine (1979) fue diseñado para la forma UCSD Pascal de Pascal , y usó p-code ( código de bytes del compilador Pascal) como su código de máquina. Esto influyó en el desarrollo posterior de Java y máquinas Java.
Las máquinas Lisp (décadas de 1970 y 1980) eran un grupo influyente y conocido de HLLCA.
Intel iAPX 432 (1981) se diseñó para admitir Ada. Este fue el primer diseño de procesador de 32 bits de Intel, y estaba destinado a ser la familia de procesadores principal de Intel para la década de 1980, pero fracasó comercialmente.
Rekursiv (mediados de la década de 1980) era un sistema menor, diseñado para admitir la programación orientada a objetos y el lenguaje de programación Lingo en hardware, y admitía la recursividad en el nivel del conjunto de instrucciones, de ahí el nombre.
Varios procesadores y coprocesadores destinados a implementar Prolog de manera más directa se diseñaron a fines de la década de 1980 y principios de la de 1990, incluido el Berkeley VLSI-PLM , su sucesor ( PLUM ) y una implementación de microcódigo relacionada . También hubo una serie de diseños simulados que no se produjeron como hardware [1] , [2] . Al igual que Lisp, el modelo básico de cálculo de Prolog es radicalmente diferente de los diseños imperativos estándar, y los científicos informáticos y los ingenieros eléctricos estaban ansiosos por escapar de los cuellos de botella causados por emular sus modelos subyacentes.
El proyecto Lilith de Niklaus Wirth incluía una CPU personalizada orientada al lenguaje Modula-2 . [2]
El Transputer INMOS fue diseñado para soportar programación concurrente, usando occam .
El procesador AT&T Hobbit , derivado de un diseño llamado CRISP (Procesador de conjunto de instrucciones reducido en lenguaje C), se optimizó para ejecutar código C.
A finales de la década de 1990, Sun Microsystems y otras empresas tenían planes de construir CPU que implementaran directamente (o de cerca) la máquina virtual Java basada en pilas . Como resultado, se han construido y utilizado varios procesadores Java .
Ericsson desarrolló ECOMP, un procesador diseñado para ejecutar Erlang . [3] Nunca se produjo comercialmente.
La capa intermedia HSA (HSAIL) de la arquitectura de sistema heterogéneo (2012) proporciona un conjunto de instrucciones virtuales para abstraerse de las ISA subyacentes y tiene soporte para características HLL como excepciones y funciones virtuales, e incluye soporte de depuración.
Implementación
Los HLLCA se implementan con frecuencia a través de una máquina de pila (como en Burroughs Large Systems e Intel 432), y se implementan HLL a través de microcódigo en el procesador (como en Burroughs Small Systems y Pascal MicroEngine). Las arquitecturas etiquetadas se utilizan con frecuencia para admitir tipos (como en las máquinas Burroughs Large Systems y Lisp). Los ejemplos más radicales utilizan una arquitectura que no es de von Neumann , aunque normalmente son solo propuestas hipotéticas, no implementaciones reales.
Solicitud
Algunos HLLC han sido particularmente populares como máquinas de desarrollo (estaciones de trabajo), debido a las compilaciones rápidas y al control de bajo nivel del sistema con un lenguaje de alto nivel. Las máquinas Pascal MicroEngine y Lisp son buenos ejemplos de esto.
Los HLLCA a menudo se han defendido cuando un HLL tiene un modelo de computación radicalmente diferente al de la programación imperativa (que es una combinación relativamente buena para los procesadores típicos), en particular para la programación funcional (Lisp) y la programación lógica (Prolog).
Motivación
En Ditzel y Patterson (1980) se ofrece una lista detallada de supuestas ventajas .
Los HLLCA son intuitivamente atractivos, ya que, en principio, la computadora puede personalizarse para un idioma, lo que permite un soporte óptimo para el idioma y simplifica la escritura del compilador. Además, puede admitir de forma nativa varios idiomas simplemente cambiando el microcódigo. Las ventajas clave son para los desarrolladores: compilación rápida y depuración simbólica detallada desde la máquina.
Una ventaja adicional es que la implementación de un idioma se puede actualizar actualizando el microcódigo ( firmware ), sin necesidad de volver a compilar un sistema completo. Esto es análogo a actualizar un intérprete para un idioma interpretado.
Una ventaja que está reapareciendo después del 2000 es la seguridad. La TI convencional se ha trasladado en gran medida a lenguajes con seguridad de tipo y / o memoria para la mayoría de las aplicaciones. El software del que dependen, desde el sistema operativo hasta las máquinas virtuales, aprovecha el código nativo sin protección. Se han encontrado muchas vulnerabilidades en dicho código. Una solución es utilizar un procesador personalizado para ejecutar un lenguaje seguro de alto nivel o al menos comprender los tipos. Las protecciones a nivel de palabra del procesador dificultan el trabajo de los atacantes en comparación con las máquinas de bajo nivel que no ven distinción entre datos escalares, matrices, punteros o código. Los académicos también están desarrollando lenguajes con propiedades similares que podrían integrarse con procesadores de alto nivel en el futuro. Un ejemplo de estas dos tendencias es el proyecto SAFE [4] . Compare los sistemas basados en idiomas , donde el software (especialmente el sistema operativo) se basa en un lenguaje seguro de alto nivel, aunque el hardware no tiene por qué serlo: la "base de confianza" puede estar todavía en un lenguaje de nivel inferior.
Desventajas
En Ditzel y Patterson (1980) se ofrece una crítica detallada .
La razón más simple de la falta de éxito de los HLLCA es que a partir de 1980, la optimización de los compiladores resultó en un código mucho más rápido y más fácil de desarrollar que la implementación de un lenguaje en microcódigo. Muchas optimizaciones del compilador requieren un análisis complejo y una reordenación del código, por lo que el código máquina es muy diferente del código fuente original. Estas optimizaciones son imposibles o imprácticas de implementar en microcódigo, debido a la complejidad y la sobrecarga. Los problemas de rendimiento análogos tienen una larga historia con los lenguajes interpretados (que datan de Lisp (1958)), y solo se resuelven adecuadamente para su uso práctico mediante la compilación just-in-time , pionera en Self y comercializada en la máquina virtual HotSpot Java (1999).
El problema fundamental es que los HLLCA solo simplifican el paso de generación de código de los compiladores, que suele ser una parte relativamente pequeña de la compilación, y un uso cuestionable de la potencia informática (transistores y microcódigo). Como mínimo, se requiere la tokenización y, por lo general, se seguirán realizando análisis sintácticos y comprobaciones semánticas básicas (variables no vinculadas), por lo que no hay ningún beneficio para el front-end, y la optimización requiere un análisis anticipado, por lo que no hay ningún beneficio para el extremo medio.
Un problema más profundo, todavía un área activa de desarrollo a partir de 2014[actualizar], [5] es que proporcionar información de depuración HLL desde el código de máquina es bastante difícil, básicamente debido a la sobrecarga de la información de depuración, y más sutilmente porque la compilación (particularmente la optimización) hace que la determinación de la fuente original de una instrucción de máquina sea bastante complicada. Por lo tanto, la información de depuración proporcionada como parte esencial de los HLLCA limita severamente la implementación o agrega una sobrecarga significativa en el uso ordinario.
Además, los HLLCA suelen estar optimizados para un solo idioma, por lo que son menos compatibles con otros idiomas. Problemas similares surgen en máquinas virtuales multilingües, en particular, la máquina virtual Java (diseñada para Java) y .NET Common Language Runtime (diseñado para C #), donde otros lenguajes son ciudadanos de segunda clase y, a menudo, deben ajustarse estrechamente a los principales lenguaje en semántica. Por esta razón, las ISA de nivel inferior permiten que varios lenguajes tengan un buen soporte, dado el soporte del compilador. Sin embargo, surge un problema similar incluso para muchos procesadores aparentemente neutrales en el lenguaje, que están bien soportados por C, y donde la transpilación a C (en lugar de apuntar directamente al hardware) produce programas eficientes y compiladores simples.
Las ventajas de los HLLCA se pueden lograr alternativamente en HLL Computer Systems ( sistemas basados en lenguaje ) de formas alternativas, principalmente a través de compiladores o intérpretes: el sistema aún está escrito en un HLL, pero existe una base confiable en el software que se ejecuta en un nivel inferior. arquitectura de nivel. Este ha sido el enfoque seguido desde alrededor de 1980: por ejemplo, un sistema Java donde el propio entorno de ejecución está escrito en C, pero el sistema operativo y las aplicaciones están escritos en Java.
Alternativas
Desde la década de 1980, el enfoque de la investigación y la implementación en arquitecturas de computadora de propósito general ha estado principalmente en arquitecturas similares a RISC, típicamente arquitecturas de carga / almacenamiento internamente ricas en registros , con ISA bastante estables, no específicas del idioma, con múltiples registros, canalización y, más recientemente, sistemas multinúcleo, en lugar de ISA específicos del idioma. El soporte del lenguaje se ha centrado en los compiladores y sus tiempos de ejecución, y en los intérpretes y sus máquinas virtuales (en particular, las JIT), con poco soporte directo de hardware. Por ejemplo, el tiempo de ejecución actual de Objective-C para iOS implementa punteros etiquetados , que utiliza para la verificación de tipos y la recolección de basura, a pesar de que el hardware no es una arquitectura etiquetada.
En arquitectura de computadora, el enfoque RISC ha demostrado ser muy popular y exitoso, y es opuesto a los HLLCA, enfatizando una arquitectura de conjunto de instrucciones muy simple. Sin embargo, las ventajas de velocidad de las computadoras RISC en la década de 1980 se debieron principalmente a la adopción temprana de caché en chip y espacio para registros grandes, en lugar de las ventajas intrínsecas de RISC [ cita requerida ] .
Ver también
- Procesador Java
- Sistema basado en idiomas
- Máquina Lisp
- Prólogo # Implementación en hardware
- Compilador de silicio
- ASIC
Referencias
- ^ Ver referencias de Yaohan Chu.
- ^ "Pascal para pequeñas máquinas - Historia de Lilith" . Pascal.hansotten.com. 28 de septiembre de 2010 . Consultado el 12 de noviembre de 2011 .
- ^ http://www.erlang.se/euc/00/processor.ppt
- ^ http://www.crash-safe.org
- ^ Consulte LLVM y el compilador de Clang.
- McKeeman, William M. (1967), Diseño por computadora dirigido por lenguaje (PDF) , 31 Parámetro desconocido
|conference=
ignorado ( ayuda )- Keirstead, Ralph E. (marzo de 1968). "Diseño informático dirigido por lenguaje R68-8" (PDF) . Transacciones IEEE en computadoras . 17 (3): 298. doi : 10.1109 / TC.1968.229106 . S2CID 41983403 . - revisión
- Ditzel, David R .; Patterson, David A. (1980). Retrospectiva sobre la arquitectura informática de lenguaje de alto nivel (PDF) . ISCA '80 Actas del 7º simposio anual de Arquitectura de Computadores. ACM. págs. 97-104. doi : 10.1145 / 800053.801914 . Consultado el 18 de noviembre de 2014 .
- Una docena de panaderos: falacias y trampas en el diseño de procesadores Grant Martin y Steve Leibson, Tensilica (principios de la década de 2000), diapositivas 6–9
Otras lecturas
- Un estudio de diseño informático dirigido por el lenguaje, David Barkley Wortman, Departamento de Ciencias de la Computación, Ph.D. tesis, Universidad de Stanford, 1972
- Hoevel, LW (agosto de 1974). " Idiomas " ideales "ejecutados directamente: un argumento analítico para la emulación" (PDF) . Transacciones IEEE en computadoras . IEEE. 23 (8): 759–767. doi : 10.1109 / TC.1974.224032 . S2CID 29921112 .
- Chu, Yaohan (diciembre de 1975). "Conceptos de arquitectura informática de lenguaje de alto nivel". Boletín ACM SIGMICRO . 6 (4): 9–16. doi : 10.1145 / 1217196.1217197 . S2CID 9545539 .
- Chu, Yaohan (1975). Conceptos de arquitectura informática de lenguaje de alto nivel . ACM '75 Actas de la conferencia anual de 1975. págs. 6–13. doi : 10.1145 / 800181.810257 .
- Chu, Yaohan; Cannon, R. (junio de 1976). "Sistema interactivo de microprocesador de ejecución directa de lenguaje de alto nivel". Transacciones IEEE sobre ingeniería de software . 2 (2): 126-134. doi : 10.1109 / TSE.1976.233802 . S2CID 9076898 .
- Chu, Yaohan (diciembre de 1977). "Arquitectura informática de ejecución directa". ACM SIGARCH Computer Architecture News . 6 (5): 18-23. doi : 10.1145 / 859412.859415 . S2CID 10241380 .
- Chu, Yaohan (1978). Ejecución directa en una arquitectura informática de alto nivel . ACM '78 Actas de la conferencia anual de 1978. págs. 289–300. doi : 10.1145 / 800127.804116 .
- Chu, Yaohan; Abrams, M. (julio de 1981). "Lenguajes de programación y arquitectura informática de ejecución directa". Computadora . 14 (7): 22–32. doi : 10.1109 / CM.1981.220525 . S2CID 3373193 .