stringtranslate.com

Factor (lenguaje de programación)

Factor es un lenguaje de programación orientado a pila creado por Slava Pestov. Factor tiene tipado dinámico y administración automática de memoria , así como potentes funciones de metaprogramación. El lenguaje tiene una única implementación que incluye un compilador optimizador alojado en el servidor propio y un entorno de desarrollo interactivo . La distribución de Factor incluye una gran biblioteca estándar .

Historia

Slava Pestov creó Factor en 2003 como lenguaje de programación para un videojuego . [1] La implementación inicial, ahora conocida como JFactor, se implementó en Java y se ejecutó en la máquina virtual de Java . Aunque el lenguaje inicial se parecía superficialmente al Factor moderno en términos de sintaxis , el lenguaje moderno es muy diferente en términos prácticos y la implementación actual es mucho más rápida.

El lenguaje ha cambiado significativamente con el tiempo. Originalmente, los programas de Factor se centraban en manipular objetos Java con las capacidades de reflexión de Java . Desde el principio, la filosofía de diseño ha sido modificar el lenguaje para que se adaptara a los programas escritos en él. A medida que la implementación de Factor y las bibliotecas estándar se volvieron más detalladas, la necesidad de ciertas características del lenguaje se hizo evidente y se agregaron. JFactor no tenía un sistema de objetos donde el programador pudiera definir sus propias clases , y las primeras versiones de Factor nativo eran iguales; el lenguaje era similar a Scheme en este sentido. Hoy, el sistema de objetos es una parte central de Factor. Otras características importantes del lenguaje, como las clases de tuplas , la inserción en línea de combinadores, las macros , las palabras de análisis definidas por el usuario y el sistema de vocabulario moderno, solo se agregaron de manera fragmentada a medida que su utilidad se hizo evidente.

La interfaz de funciones externas estuvo presente desde las primeras versiones de Factor, y existía un sistema análogo en JFactor. Se optó por esto en lugar de crear un complemento para la parte C de la implementación para cada biblioteca externa con la que Factor debería comunicarse, y tiene el beneficio de ser más declarativo , más rápido de compilar y más fácil de escribir.

La implementación de Java inicialmente consistía en un solo intérprete , pero luego se agregó un compilador de bytecode de Java . Este compilador solo funcionaba en ciertos procedimientos. La versión Java de Factor fue reemplazada por una versión escrita en C y Factor. Inicialmente, consistía solo en un intérprete, pero el intérprete fue reemplazado por dos compiladores, utilizados en diferentes situaciones. Con el tiempo, la implementación de Factor ha crecido significativamente más rápido. [2]

Descripción

Factor es un lenguaje de programación funcional , orientado a objetos y de tipado dinámico . El código se estructura en torno a pequeños procedimientos, llamados palabras. En un código típico, estos tienen una longitud de entre 1 y 3 líneas, y es muy raro que un procedimiento tenga más de 7 líneas. Algo que se expresaría idiomáticamente con un procedimiento en otro lenguaje de programación se escribiría como varias palabras en Factor. [3]

Cada palabra toma un número fijo de argumentos y tiene un número fijo de valores de retorno. Los argumentos de las palabras se pasan en una pila de datos , utilizando la notación polaca inversa . La pila se utiliza solo para organizar las llamadas a las palabras, y no como una estructura de datos. La pila en Factor se utiliza de forma similar a la pila en Forth ; por esto, ambos se consideran lenguajes de pila . Por ejemplo, a continuación se muestra un fragmento de código que imprime "hola mundo" en el flujo de salida actual:

Impresión "Hola mundo"

printes una palabra del iovocabulario que toma una cadena de la pila y no devuelve nada. Imprime la cadena en el flujo de salida actual (por defecto, la terminal o el receptor gráfico). [3]

La función factorial se puede implementar en Factor de la siguiente manera:

: factorial ( n -- n! ) dup 1 > [ [1,b] producto ] [ eliminar 1 ] si ;                 

No todos los datos tienen que pasarse solo con la pila. Las variables locales con alcance léxico permiten almacenar y acceder a los datos temporales utilizados dentro de un procedimiento. Las variables con alcance dinámico se utilizan para pasar cosas entre llamadas de procedimiento sin utilizar la pila. Por ejemplo, los flujos de entrada y salida actuales se almacenan en variables con alcance dinámico. [3]

Factor enfatiza la flexibilidad y la capacidad de extender el lenguaje. [3] Existe un sistema para macros, así como para la extensión arbitraria de la sintaxis de Factor. La sintaxis de Factor se extiende a menudo para permitir nuevos tipos de definiciones de palabras y nuevos tipos de literales para estructuras de datos. También se utiliza en la biblioteca XML para proporcionar sintaxis literal para generar XML. Por ejemplo, la siguiente palabra toma una cadena y produce un objeto de documento XML que es un documento HTML que enfatiza la cadena:

 : make-html ( cadena -- xml ) dup <XML <html> <head><title><-></title></head> <body><h1><-></h1></body> </html> XML> ;              

La palabra dupduplica el elemento superior de la pila. <->Significa rellenar esa parte del documento XML con un elemento de la pila.

Implementación y bibliotecas

Factor incluye una gran biblioteca estándar, escrita completamente en el lenguaje. Entre ellas se encuentran:

Factor tiene incorporada una interfaz de funciones externas que permite la comunicación con programas en C , Objective-C y Fortran . También hay soporte para ejecutar y comunicarse con sombreadores escritos en GLSL . [3] [9]

Factor está implementado en Factor y C++ . Originalmente, se creó a partir de una implementación anterior de Java. Hoy en día, el analizador y el compilador optimizador están escritos en el lenguaje. Ciertas partes básicas del lenguaje están implementadas en C++, como el recolector de elementos no utilizados y ciertas primitivas.

Factor utiliza un modelo basado en imágenes , análogo a muchas implementaciones de Smalltalk , donde el código compilado y los datos se almacenan en una imagen. [10] Para compilar un programa, el programa se carga en una imagen y la imagen se guarda. Una herramienta especial ayuda en el proceso de creación de una imagen mínima para ejecutar un programa en particular, empaquetando el resultado en algo que se puede implementar como una aplicación independiente. [3] [11]

El compilador Factor implementa muchas optimizaciones avanzadas y se ha utilizado como objetivo para la investigación de nuevas técnicas de optimización. [3] [12]

Referencias

  1. ^ Pestov, Slava. "El rincón de la web de Slava Pestov".
  2. ^ "Wiki de Concatenative.org: Historial de implementación/factor".
  3. ^ abcdefg Pestov, Sviatoslav; Ehrenberg, Daniel (2010). "Factor: un lenguaje de programación dinámico basado en pila". Avisos SIGPLAN de la ACM . 45 (12). ACM: 43–58. doi :10.1145/1899661.1869637.
  4. ^ Pestov, Slava. "Documentación de factores: marco de interfaz de usuario".
  5. ^ Coleman, Doug. "Documentación de factores: biblioteca de bases de datos".
  6. ^ Pestov, Slava. "Documentación de factores: servidor HTTP".
  7. ^ Pestov, Slava. "Documentación de factores: matrices especializadas".
  8. ^ Coleman, Doug; Ehrenberg, Daniel. "Documentación de factores: expresiones regulares".
  9. ^ Pestov, Slava (28 de julio de 2010). "Revisión de la interfaz de la biblioteca C de Factor".
  10. ^ Pestov, Slava (10 de enero de 2010). "Explicación del proceso de arranque de Factor".
  11. ^ Pestov, Slava (5 de julio de 2008). "Sobre sacudir los árboles".
  12. ^ Ehrenberg, Daniel (2010). "Eliminación de clausura como propagación constante" (PDF) . Archivado desde el original (PDF) el 26 de julio de 2011.

Enlaces externos