Factor es un lenguaje de programación orientado a pilas creado por Slava Pestov. Factor es de tipado dinámico y cuenta con gestión automática de memoria , además de potentes funciones de metaprogramación. El lenguaje tiene una única implementación que incluye un compilador optimizador autoalojado y un entorno de desarrollo interactivo . La distribución de Factor incluye una amplia biblioteca estándar .
Historia
Slava Pestov creó Factor en 2003 como un lenguaje de scripting para un videojuego . [ 1 ] La implementación inicial, ahora conocida como JFactor, se implementó en Java y se ejecutaba en la Máquina Virtual de Java . Si bien 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 Factor se centraban en la manipulación de objetos Java mediante las capacidades de reflexión de Java . Desde el principio, la filosofía de diseño ha sido modificar el lenguaje para adaptarlo a los programas escritos en él. A medida que la implementación de Factor y las bibliotecas estándar se volvieron más detalladas, se hizo evidente la necesidad de ciertas características del lenguaje, y estas se añadieron. 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 en día, el sistema de objetos es una parte central de Factor. Otras características importantes del lenguaje, como las clases de tuplas , la inserción de combinadores, las macros , las palabras de análisis definidas por el usuario y el moderno sistema de vocabulario, se añadieron de forma gradual a medida que su utilidad se hacía evidente.
La interfaz de funciones externas estaba presente desde las primeras versiones de Factor, y existía un sistema análogo en JFactor. Se optó por esta solución en lugar de crear un complemento para la parte C de la implementación para cada biblioteca externa con la que Factor debiera comunicarse, y tiene la ventaja de ser más declarativa , compilar más rápido y escribir código más sencillo.
La implementación en Java inicialmente consistía solo en un intérprete , pero posteriormente se añadió un compilador a bytecode de Java . Este compilador solo funcionaba en ciertos procedimientos. La versión de Factor en Java fue reemplazada por una versión escrita en C y Factor. Inicialmente, esta consistía solo en un intérprete, pero este 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 con tipado dinámico . El código se estructura en torno a pequeños procedimientos, llamados palabras. En el código típico, estos tienen entre 1 y 3 líneas de longitud, y es muy raro encontrar un procedimiento de más de 7 líneas. Algo que en otro lenguaje de programación se expresaría idiomáticamente con un solo procedimiento, en Factor se escribiría como varias palabras. [ 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 usa solo para organizar las llamadas a las palabras, y no como una estructura de datos. La pila en Factor se usa de manera similar a la pila en Forth ; por esto, ambas 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:
"hola mundo" imprimir
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 oyente gráfico). [ 3 ]
La función factorialSe puede implementar en Factor de la siguiente manera:
: factorial ( n -- n! ) dup 1 > [ [1..b] producto ] [ descartar 1 ] si ;No todos los datos deben transmitirse únicamente mediante la pila. Las variables locales con ámbito léxico permiten almacenar y acceder a los objetos temporales utilizados dentro de un procedimiento. Las variables con ámbito dinámico se utilizan para pasar información entre llamadas a procedimientos sin usar la pila. Por ejemplo, los flujos de entrada y salida actuales se almacenan en variables con ámbito dinámico. [ 3 ]
Factor hace hincapié en 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 con frecuencia 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 la generación de 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. Esto <->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. Estas incluyen:
- Un conjunto de herramientas GUI multiplataforma, construido sobre OpenGL y varios sistemas de ventanas, utilizado para el entorno de desarrollo. [ 4 ]
- Enlaces a varias bibliotecas de bases de datos, incluidas PostgreSQL y SQLite . [ 5 ]
- Un servidor y un cliente HTTP , con el marco web Furnace. [ 6 ]
- Matrices homogéneas eficientes de enteros, números de coma flotante y estructuras C. [ 7 ]
- Una biblioteca que implementa expresiones regulares y genera código máquina para realizar la coincidencia. [ 8 ]
Factor incorpora una interfaz de funciones externas que permite la comunicación con programas escritos en C , Objective-C y Fortran . También ofrece soporte para la ejecución y comunicación con sombreadores escritos en GLSL . [ 3 ] [ 9 ]
Factor está implementado en Factor y C++ . Originalmente, se basó en una implementación anterior de Java. Actualmente, el analizador sintáctico y el compilador optimizador están escritos en este lenguaje. Ciertas partes básicas del lenguaje, como el recolector de basura y algunas primitivas, están implementadas en C++.
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, este se carga en una imagen y esta se guarda. Una herramienta especial facilita el proceso de creación de una imagen mínima para ejecutar un programa específico, 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
- ↑ Pestov, Slava. "El rincón de la web de Slava Pestov" .
- ↑ "Wiki de Concatenative.org: Factor/Historial de implementación" .
- 1 2 3 4 5 6 7 Pestov, Sviatoslav; Ehrenberg, Daniel (2010). "Factor: un lenguaje de programación dinámico basado en pila". ACM SIGPLAN Notices . 45 (12). ACM: 43– 58. doi : 10.1145/1899661.1869637 .
- ↑ Pestov, Slava. "Documentación de factores: marco de interfaz de usuario" .
- ↑ Coleman, Doug. "Documentación de factores: Biblioteca de bases de datos" .
- ↑ Pestov, Slava. "Documentación de factores: servidor HTTP" .
- ↑ Pestov, Slava. "Documentación de factores: arreglos especializados" .
- ↑ Coleman, Doug; Ehrenberg, Daniel. "Documentación de factores: expresiones regulares" .
- ↑ Pestov, Slava (28 de julio de 2010). "Revisión de la interfaz de la biblioteca C de Factor" .
- ↑ Pestov, Slava (10 de enero de 2010). "Explicación del proceso bootstrap de Factor" .
- ^ Pestov, Slava (5 de julio de 2008). "Sobre sacudir los árboles" .
- ↑ Ehrenberg, Daniel (2010). "Eliminación de cierres como propagación constante" (PDF) . Archivado del original (PDF) el 26 de julio de 2011.
Enlaces externos
- Sitio web oficial
- Slava Pestov (27 de octubre de 2008). Factor: Un lenguaje interactivo extensible (flv) (Charla técnica). Google . Archivado del original el 22 de diciembre de 2021.
- Zed Shaw (2008). La ACL está muerta (flv) (CUSEC 2008). CUSEC.– una presentación escrita en Factor que menciona y elogia a Factor
- Lenguajes de programación
- lenguajes de programación concatenativos
- Lenguajes a nivel de función
- Lenguajes de programación orientados a pilas
- Lenguajes de programación creados en 2003
- Lenguajes de programación con sintaxis extensible
- Software de 2003
- Lenguajes de programación de alto nivel
- Software que utiliza la licencia BSD.