Factor (lenguaje de programación)


Factor es un lenguaje de programación orientado a la pila creado por Slava Pestov. Factor se escribe dinámicamente y tiene administración automática de memoria , así como potentes funciones de metaprogramación. El lenguaje tiene una implementación única con un compilador de optimización autohospedado 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 denominada JFactor, se implementó en Java y se ejecutó en la máquina virtual Java . Aunque el lenguaje primitivo se parecía a Factor moderno superficialmente 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 idioma 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 del 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 hicieron 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 pudieras definir tus propias clases , y las primeras versiones de Factor nativo eran las mismas; 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 clases de tuplas , combinación de líneas, macros , 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 función ajena estuvo presente desde las primeras versiones de Factor, y existía un sistema análogo en JFactor. Esto se eligió 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 la ventaja 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 solo un intérprete , pero luego se agregó un compilador para el código de bytes de Java . Este compilador solo funcionó en ciertos procedimientos. La versión Java de Factor fue reemplazada por una versión escrita en C y Factor. Inicialmente, este 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 de tipo dinámico , funcional y orientado a objetos . El código está estructurado en torno a pequeños procedimientos, llamados palabras. En el código típico, son de 1 a 3 líneas de largo, y un procedimiento de más de 7 líneas es muy raro. 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 a las palabras se pasan en una pila de datos , utilizando notación polaca inversa . La pila se usa solo para organizar llamadas a palabras, y no como una estructura de datos. La pila en Factor se usa de manera similar a la pila en Forth ; para ello, 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, el terminal o el oyente gráfico). [3]

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

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

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

Factor enfatiza la flexibilidad y la capacidad de extender el idioma. [3] Existe un sistema para macros, así como para la extensión arbitraria de la sintaxis de Factor. La sintaxis de Factor a menudo se amplía 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 una 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   <->