En ciencias de la computación , una máquina abstracta es un modelo teórico que permite un análisis detallado y preciso de cómo funciona un sistema informático. [ 1 ] Es similar a una función matemática en el sentido de que recibe entradas y produce salidas basadas en reglas predefinidas. Las máquinas abstractas se diferencian de las máquinas literales en que se espera que funcionen correctamente e independientemente del hardware . [ 2 ] Las máquinas abstractas son " máquinas " porque permiten la ejecución paso a paso de programas ; son " abstractas " porque ignoran muchos aspectos de las máquinas reales ( hardware ). [ 3 ] Una máquina abstracta típica consiste en una definición en términos de entrada, salida y el conjunto de operaciones permitidas utilizadas para convertir la primera en la segunda. Pueden usarse por razones puramente teóricas, así como modelos para sistemas informáticos del mundo real. [ 2 ] En la teoría de la computación , las máquinas abstractas se utilizan a menudo en experimentos mentales sobre computabilidad o para analizar la complejidad de los algoritmos . [ 3 ] Este uso de máquinas abstractas es fundamental para el campo de la teoría de la complejidad computacional , como con las máquinas de estados finitos , las máquinas de Mealy , los autómatas de pila y las máquinas de Turing . [ 4 ]
Clasificación
Las máquinas abstractas se clasifican típicamente en dos tipos según la cantidad de operaciones que pueden ejecutar simultáneamente en un momento dado: máquinas abstractas deterministas y máquinas abstractas no deterministas . [ 2 ] Una máquina abstracta determinista es un sistema en el que un estado o condición inicial particular siempre produce las mismas salidas. No hay aleatoriedad ni variación en cómo las entradas se transforman en salidas. [ 5 ] Por el contrario, una máquina abstracta no determinista puede proporcionar varias salidas para la misma entrada en diferentes ejecuciones. [ 2 ] A diferencia de un algoritmo determinista, que da el mismo resultado para la misma entrada independientemente del número de iteraciones, un algoritmo no determinista toma varios caminos para llegar a diferentes salidas. [ 6 ] Los algoritmos no deterministas son útiles para obtener respuestas aproximadas cuando derivar una solución precisa utilizando un enfoque determinista es difícil o costoso. [ 7 ]

Las máquinas de Turing , por ejemplo, son algunas de las máquinas abstractas más fundamentales en la informática. [ 2 ] Estas máquinas realizan operaciones sobre una cinta (una cadena de símbolos) de cualquier longitud. Sus instrucciones permiten tanto modificar los símbolos como cambiar el símbolo en el que se encuentra actualmente el puntero de la máquina. Por ejemplo, una máquina de Turing rudimentaria podría tener una sola instrucción: "convertir el símbolo en 1 y luego moverse a la derecha", y esta máquina solo produciría una cadena de 1s. [ 8 ] Esta máquina de Turing básica es determinista; sin embargo, también se pueden construir máquinas de Turing no deterministas que pueden ejecutar varias acciones con la misma entrada. [ 2 ]
Implementación
Cualquier implementación de una máquina abstracta en el caso de una implementación física (en hardware ) utiliza algún tipo de dispositivo físico (mecánico o electrónico) para ejecutar las instrucciones de un lenguaje de programación . Sin embargo, una máquina abstracta también puede implementarse en software o firmware en niveles intermedios entre la máquina abstracta y el dispositivo físico subyacente. [ 9 ]
- Implementación en hardware : La implementación directa de una máquina abstracta en hardware consiste en utilizar dispositivos físicos como memoria , circuitos aritméticos y lógicos , buses, etc., para implementar una máquina física cuyo lenguaje de máquina coincide con el lenguaje de programación . Una vez construida, sería prácticamente imposible modificar dicha máquina. [ 9 ] Una CPU puede considerarse como una realización concreta en hardware de una máquina abstracta, en particular el diseño del procesador . [ 10 ]
- Simulación mediante software : Implementar una máquina abstracta con software implica escribir programas en un lenguaje diferente para implementar las estructuras de datos y los algoritmos que necesita la máquina abstracta. Esto proporciona la mayor flexibilidad, ya que los programas que implementan las construcciones de la máquina abstracta se pueden modificar fácilmente. [ 9 ] Una máquina abstracta implementada como una simulación de software, o para la cual existe un intérprete , se denomina máquina virtual . [ 11 ]
- Emulación mediante firmware : La implementación del firmware se sitúa entre la implementación del hardware y la del software. Consiste en simulaciones de microcódigo de estructuras de datos y algoritmos para máquinas abstractas. [ 9 ] El microcódigo permite a un programador escribir instrucciones de máquina sin necesidad de fabricar circuitos eléctricos . [ 12 ]
Implementación del lenguaje de programación
Una máquina abstracta es, intuitivamente, solo una abstracción de la idea de una computadora física. [ 13 ] Para su ejecución real, los algoritmos deben formalizarse adecuadamente utilizando las construcciones que ofrece un lenguaje de programación . Esto implica que los algoritmos que se van a ejecutar deben expresarse utilizando instrucciones del lenguaje de programación. [ 3 ] La sintaxis de un lenguaje de programación permite la construcción de programas utilizando un conjunto finito de construcciones conocidas como instrucciones. La mayoría de las máquinas abstractas comparten un almacén de programas y un estado , que a menudo incluye una pila y registros. [ 9 ] [ 14 ] En las computadoras digitales, la pila es simplemente una unidad de memoria con un registro de direcciones que puede contar solo enteros positivos (después de que se carga un valor inicial en él). El registro de direcciones para la pila se conoce como puntero de pila porque su valor siempre se refiere al elemento superior de la pila. [ 15 ] El programa consiste en una serie de instrucciones, con un puntero de pila que indica la siguiente instrucción que se va a ejecutar. Cuando se completa la instrucción, se avanza un puntero de pila . Este mecanismo de control fundamental de una máquina abstracta también se conoce como su bucle de ejecución . [ 3 ] Así, una máquina abstracta para un lenguaje de programación es cualquier conjunto de estructuras de datos y algoritmos capaces de almacenar y ejecutar programas escritos en dicho lenguaje. Establece un puente entre el alto nivel de un lenguaje de programación y el bajo nivel de una máquina real , proporcionando un paso de lenguaje intermedio para la compilación . Las instrucciones de una máquina abstracta se adaptan a las operaciones específicas necesarias para implementar las operaciones de un determinado lenguaje fuente o conjunto de lenguajes fuente. [ 9 ]
Lenguas imperativas
A finales de la década de 1950, la Association for Computing Machinery (ACM) y otras organizaciones afines desarrollaron numerosas propuestas para el Lenguaje Universal Orientado a Computadoras (UNCOL) , como la máquina de Conway . El concepto de UNCOL es bueno, pero no se ha utilizado ampliamente debido al bajo rendimiento del código generado . En muchas áreas de la informática, su rendimiento seguirá siendo un problema a pesar del desarrollo de la Máquina Virtual de Java a finales de la década de 1990. El Código Objeto Algol (1964), la máquina P4 (1976), la máquina P de la UCSD (1977) y Forth (1970) son algunas máquinas abstractas exitosas de este tipo. [ 3 ]
Lenguajes orientados a objetos
Las máquinas abstractas para lenguajes de programación orientados a objetos suelen estar basadas en pilas y tienen instrucciones de acceso especiales para campos y métodos de objetos . En estas máquinas, la gestión de memoria suele ser implícita y la realiza un recolector de basura (función de recuperación de memoria integrada en los lenguajes de programación). [ 16 ] Smalltalk-80 (1980), Self (1989) y Java (1994) son ejemplos de esta implementación. [ 3 ]
lenguajes de procesamiento de cadenas
Un lenguaje de procesamiento de cadenas es un lenguaje informático que se centra en el procesamiento de cadenas en lugar de números. Durante décadas, han existido lenguajes de procesamiento de cadenas en forma de intérpretes de comandos , herramientas de programación , procesadores de macros y lenguajes de scripting . [ 17 ] El uso de una máquina abstracta adecuada ofrece dos ventajas: mayor velocidad de ejecución y mayor portabilidad. Snobol4 y ML/I son dos ejemplos notables de lenguajes de procesamiento de cadenas primitivos que utilizan una máquina abstracta para lograr independencia de la máquina. [ 3 ]
Lenguajes de programación funcionales

Las primeras máquinas abstractas para lenguajes funcionales , incluyendo la máquina SECD (1964) y la Máquina Abstracta Funcional de Cardelli (1983), definieron la evaluación estricta, también conocida como evaluación ansiosa o por valor , [ 3 ] en la que los argumentos de la función se evalúan antes de la llamada y exactamente una vez. Recientemente, la mayor parte de la investigación se ha centrado en la evaluación perezosa (o por necesidad) , [ 18 ] como la máquina G (1984), la máquina Krivine (1985) y la Máquina de Tres Instrucciones (1986), en las que los argumentos de la función se evalúan solo si es necesario y como máximo una vez. Una razón es que la implementación efectiva de la evaluación estricta ahora se comprende bien, por lo que la necesidad de una máquina abstracta ha disminuido. [ 3 ]
Lenguajes lógicos
El cálculo de predicados (lógica de primer orden) es la base de los lenguajes de programación lógica . El lenguaje de programación lógica más conocido es Prolog . Las reglas en Prolog se escriben en un formato uniforme conocido como "cláusulas de Horn" cuantificadas universalmente, lo que significa que se inicia el cálculo que intenta descubrir una prueba del objetivo. La máquina abstracta de Warren (WAM , por sus siglas en inglés ) (1983), [ 3 ] que se ha convertido en el estándar de facto en la compilación de programas Prolog, ha sido el foco de la mayoría de los estudios. Proporciona instrucciones de propósito especial, como instrucciones de unificación de datos e instrucciones de flujo de control para admitir el retroceso (algoritmo de búsqueda). [ 19 ]
Estructura
Una máquina abstracta genérica se compone de una memoria y un intérprete . La memoria se utiliza para almacenar datos y programas, mientras que el intérprete es el componente que ejecuta las instrucciones incluidas en los programas. [ 9 ]

El intérprete debe realizar las operaciones que son propias del idioma que está interpretando. Sin embargo, dada la variedad de idiomas, es concebible identificar categorías de operaciones y un " mecanismo de ejecución " compartido por todos los intérpretes. Las operaciones del intérprete y las estructuras de datos que las acompañan se dividen en las siguientes categorías: [ 9 ] [ 20 ]
- Operaciones para el procesamiento de datos primitivos :
- Operaciones y estructuras de datos para controlar la secuencia de ejecución de las operaciones ;
- Operaciones y estructuras de datos para el control de transferencias de datos ;
- Operaciones y estructuras de datos para la gestión de memoria .
Procesamiento de datos primitivos
Una máquina abstracta debe contener operaciones para manipular tipos de datos primitivos como cadenas y enteros. [ 9 ] Por ejemplo, los enteros se consideran casi universalmente un tipo de dato básico tanto para las máquinas abstractas físicas como para las máquinas abstractas utilizadas por muchos lenguajes de programación . La máquina realiza las operaciones aritméticas necesarias, como la suma y la multiplicación, en un solo paso de tiempo. [ 21 ]
Control de secuencia
Las operaciones y estructuras para el "control de secuencia" permiten controlar el flujo de ejecución de las instrucciones del programa. Cuando se cumplen ciertas condiciones , es necesario cambiar la ejecución secuencial típica de un programa. [ 9 ] Por lo tanto, el intérprete emplea estructuras de datos (como las que se usan para almacenar la dirección de la siguiente instrucción a ejecutar) que se modifican mediante operaciones distintas de las que se usan para la manipulación de datos (por ejemplo, operaciones para actualizar la dirección de la siguiente instrucción a ejecutar). [ 22 ]
Controlar las transferencias de datos
Las operaciones de transferencia de datos se utilizan para controlar cómo se transportan los operandos y los datos desde la memoria al intérprete y viceversa. Estas operaciones se ocupan del almacenamiento y del orden de recuperación de los operandos desde el almacenamiento. [ 9 ]
Gestión de la memoria
La gestión de memoria se refiere a las operaciones que se realizan en la memoria para asignar datos y aplicaciones. En la máquina abstracta, los datos y los programas pueden almacenarse indefinidamente, o en el caso de los lenguajes de programación, la memoria puede asignarse o liberarse mediante un mecanismo más complejo. [ 9 ]
Jerarquías

A menudo se emplean jerarquías de máquinas abstractas, en las que cada máquina utiliza la funcionalidad del nivel inmediatamente inferior y añade funcionalidades propias para satisfacer las del nivel inmediatamente superior. En el nivel más básico se puede añadir un ordenador físico , construido con dispositivos electrónicos. Por encima de este nivel, se puede introducir el nivel de máquina microprogramada abstracta. La máquina abstracta proporcionada por el sistema operativo , implementada mediante un programa escrito en lenguaje máquina , se sitúa inmediatamente por encima (o directamente por encima del hardware si no existe el nivel de firmware ). Por un lado, el sistema operativo amplía las capacidades de la máquina física proporcionando primitivas de nivel superior que no están disponibles en la máquina física (por ejemplo, primitivas que operan sobre archivos). La máquina anfitriona está formada por la máquina abstracta proporcionada por el sistema operativo, sobre la cual se implementa un lenguaje de programación de alto nivel utilizando una máquina intermedia , como la máquina virtual Java y su lenguaje de código de bytes. El nivel proporcionado por la máquina abstracta para el lenguaje de alto nivel (por ejemplo, Java) no suele ser el nivel final de la jerarquía. En este punto, se pueden introducir una o más aplicaciones que ofrecen servicios adicionales de forma conjunta. Por ejemplo, se puede añadir un nivel de "máquina web" para implementar las funcionalidades necesarias para gestionar las comunicaciones web ( protocolos de comunicación o presentación de código HTML ). El nivel de " servicio web " se sitúa por encima de este y proporciona las funcionalidades necesarias para que los servicios web se comuniquen, tanto en términos de protocolos de interacción como del comportamiento de los procesos implicados. En este nivel, se pueden desarrollar lenguajes completamente nuevos que especifican el comportamiento de los denominados "procesos de negocio" basados en servicios web (un ejemplo es el Business Process Execution Language ). Finalmente, en el nivel más alto se puede encontrar una aplicación especializada (por ejemplo, el comercio electrónico ) que posee una funcionalidad muy específica y limitada. [ 9 ]
Véase también
- Interpretación abstracta : enfoque para el análisis estático de programas.
- Paralelismo síncrono masivo : modelo para el diseño de algoritmos paralelos
- Tiempo discreto : marcos para modelar variables que evolucionan con el tiempo. Páginas que muestran breves descripciones de los destinos de redireccionamiento.
- Taxonomía de Flynn : Clasificación de arquitecturas informáticas
- Modelos formales de computación : capacidad para resolver un problema mediante un procedimiento eficaz.
- Modelo de computación : modelo matemático que describe cómo se calcula la salida de una función a partir de una entrada.
- Máquina de acceso aleatorio paralela : computadora abstracta para el diseño de algoritmos paralelos. Páginas que muestran breves descripciones de los destinos de redirección , el modelo estándar de facto.
- Máquina SECD : máquina abstracta utilizada como objetivo para compiladores.
- Espacio de estados : conjunto de todos los valores posibles de un sistema. Páginas que muestran descripciones breves de los destinos de redirección.
Referencias
- ↑ Weisstein, Eric W. "Máquina abstracta" . mathworld.wolfram.com . Consultado el 16 de mayo de 2022 .
- 1 2 3 4 5 6 "¿Qué es una máquina abstracta?" . EasyTechJunkie . Consultado el 16 de mayo de 2022 .
- 1 2 3 4 5 6 7 8 9 10 Diehl, Stephan; Hartel, Pieter; Sestoft, Peter (mayo de 2000). "Máquinas abstractas para la implementación de lenguajes de programación" . Future Generation Computer Systems . 16 (7): 739– 751. doi : 10.1016/S0167-739X(99)00088-6 .
- ↑ "9.1.1: Descripción general de la máquina de estados finitos" . Engineering LibreTexts . 29 de abril de 2021. Consultado el 31 de mayo de 2022 .
- ↑ "¿Qué es un sistema determinista? - Definición de Techopedia" . Techopedia.com . 29 de agosto de 2019. Consultado el 30 de mayo de 2022 .
- ↑ Stearns, Richard E. (enero de 2003). "Problemas de tiempo y cotas inferiores deterministas versus no deterministas" . Journal of the ACM . 50 (1): 91– 95. doi : 10.1145/602382.602409 . ISSN 0004-5411 . S2CID 2194820 .
- ↑ Armoni, Michal; Gal-Ezer, Judith (diciembre de 2007). "No determinismo: un concepto abstracto en los estudios de ciencias de la computación" . Computer Science Education . 17 (4): 243– 262. Bibcode : 2007CSEd...17..243A . doi : 10.1080/08993400701442885 . ISSN 0899-3408 . S2CID 41928460 .
- ↑ Gill, John (diciembre de 1977). "Complejidad computacional de las máquinas de Turing probabilísticas" . SIAM Journal on Computing . 6 (4): 675– 695. doi : 10.1137/0206049 . ISSN 0097-5397 .
- 1 2 3 4 5 6 7 8 9 10 11 12 13 Gabbrielli, Maurizio; Martini, Simone (2010), "Máquinas abstractas" , Lenguajes de programación: principios y paradigmas , Londres: Springer London, pp. 1–25 , doi : 10.1007/978-1-84882-914-5_1 , ISBN 978-1-84882-913-8, consultado el 16 de mayo de 2022
- ↑ Bair, Ray; Chien, Andrew; Cook, Jeanine ; Donofrio, Dave; Grider, Gary; Kuehn, Jeff; Moore, Shirley; Shalf, John; Vetter, Jeff (2018-02-01). Evaluación de hardware: modelos de máquinas abstractas y arquitecturas proxy para computación a exaescala (informe técnico). Oficina de Información Científica y Técnica del Departamento de Energía de EE. UU. doi : 10.2172/1733300 . OSTI 1733300 .
- ↑ "máquina abstracta de FOLDOC" . foldoc.org . Consultado el 7 de agosto de 2021 .
- ↑ Gee, J.; Melvin, SW; Patt, YN (1986). "La implementación de Prolog mediante microcódigo VAX 8600" . Actas del 19.º taller anual sobre microprogramación . Nueva York, Nueva York, EE. UU.: ACM Press. págs. 68–74 . doi : 10.1145/19551.19538 . ISBN 081860736X. S2CID 3846072 .
- ↑ "máquina abstracta" . Oxford Reference . Consultado el 16 de mayo de 2022 .
- ↑ García-Martín, Julio Manuel; Sutil-Martin, Miguel (15 de agosto de 1999). "La máquina abstracta: un patrón para diseñar máquinas abstractas" (PDF) . Actas de Pattern Languages of Programs '99 .
- ↑ upscfever.com (25-01-2017). "Organización y arquitectura de computadoras (organización de pilas) - UPSC FEVER" . upscfever.com . Consultado el 31-05-2022 .
- ↑ "¿Qué es la programación orientada a objetos (POO)?" . SearchAppArchitecture . Consultado el 31/05/2022 .
- ↑ "Consideraciones de diseño para lenguajes de procesamiento de cadenas" , Un estudio sobre lenguajes de procesamiento de cadenas , Lecture Notes in Computer Science, vol. 205, Berlín, Heidelberg: Springer Berlin Heidelberg, 1985, pp. 17–37 , doi : 10.1007/3-540-16041-8_2 , ISBN 978-3-540-16041-0, consultado el 31 de mayo de 2022
- ↑ Hackett, Jennifer; Hutton, Graham (26 de julio de 2019). "La llamada por necesidad es una llamada por valor clarividente" . Actas de la ACM sobre lenguajes de programación . 3 (ICFP): 1–23 . doi : 10.1145/3341718 . ISSN 2475-1421 . S2CID 195782686 .
- ↑ "Prolog | Una introducción" . GeeksforGeeks . 26 de mayo de 2018. Consultado el 31 de mayo de 2022 .
- ↑ Accattoli, Beniamino; Barenbaum, Pablo; Mazza, Damiano (26 de noviembre de 2014). "Destilando máquinas abstractas" . ACM SIGPLAN Notices . 49 (9): 363–376 . doi : 10.1145/2692915.2628154 . ISSN 0362-1340 . S2CID 234775413 .
- ↑ baeldung (11 de enero de 2018). "Introducción a las primitivas de Java | Baeldung" . www.baeldung.com . Consultado el 31 de mayo de 2022 .
- ↑ Kuchana, Partha (2004), "Intérprete", Patrones de diseño de arquitectura de software en Java , Auerbach Publications, doi : 10.1201/9780203496213 , ISBN 978-0-8493-2142-9
Lecturas adicionales
- Peter van Emde Boas, Modelos y simulaciones de máquinas, págs. 3-66, publicado en:
- Jan van Leeuwen , ed. «Manual de informática teórica. Volumen A: Algoritmos y complejidad» , The MIT PRESS/Elsevier, 1990. ISBN 0-444-88071-2(volumen A). QA 76.H279 1990
- Stephan Diehl, Pieter Hartel y Peter Sestoft, Máquinas abstractas para la implementación de lenguajes de programación Archivado el 1 de mayo de 2013 en Wayback Machine , Future Generation Computer Systems, Vol. 16(7), Elsevier, 2000.
- Werner Kluge (2006). Máquinas de computación abstractas: una perspectiva del cálculo lambda . Springer. ISBN 978-3-540-27359-2.
- Máquinas abstractas
- Autómatas (computación)
- Modelos de computación