Paradigma | multiparadigma : concatenativo ( basado en pila ), funcional , orientado a objetos |
---|---|
Revelador | Esclavo Pestov |
Apareció por primera vez | 2003 |
Versión estable | 0,99 / 24 de agosto de 2023 ( 24/08/2023 ) |
Disciplina de mecanografía | fuerte , dinámico |
Sistema operativo | Windows , MacOS , Linux |
Licencia | Licencia BSD |
Sitio web | factorcode.org |
Influenciado por | |
Alegría , Adelante , Ceceo , Yo |
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 .
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]
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"
print
es una palabra del io
vocabulario 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 dup
duplica el elemento superior de la pila. <->
Significa rellenar esa parte del documento XML con un elemento de la pila.
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]