# Factor (linguagem de programação)

Factor é uma linguagem de programação orientada a pilha criada por Slava Pestov. Factor é tem tipagem dinâmica e gerenciamento automático de memória, bem como poderosos recursos de metaprogramação. A língua tem um aspecto de implementação único que vem a ser um compilador otimizado embutido e um ambiente de desenvolvimento interativo. A distribuição padrão de Factor inclui uma grande biblioteca padrão.

## História

Slava Pestov criou a linguagem Factor em 2003 como uma linguagem de script para um Video-game. A implementação inicial, agora designada JFactor, foi implementada em Java rodando sob a Java Virtual Machine. Embora a linguagem inicial parecesse o Factor moderno superficialmente em termos de sintaxe, a linguagem moderna é muito diferente em termos práticos e a implementação atual é muito mais rápida.
A linguagem mudou significativamente ao longo do tempo. Originalmente, os programas Factor eram centrados em torno da manipulação de objetos Java com capacidades de reflexão do Java. Desde o início, a filosofia de projeto tem sido a de modificar a linguagem para satisfazer programas escritos nela. A medida que a implementação de Factor e de suas bibliotecas-padrão cresceu mais detalhadamente, a necessidade de certas características da linguagem tornaram-se claras, e elas foram adicionadas. JFactor não tem um sistema de objetos onde você poderá definir suas próprias classes, e as primeiras versões nativas de Factor eram o mesmo; a linguagem era semelhante ao Scheme desta maneira. Hoje, o sistema de objetos é uma parte central de Factor. Outras características importantes, como as classes de tuplas, combinadores inlining, macros para análise sintática definidas pelo usuário e o sistema de vocabulário moderno só foram adicionadas de forma fragmentada como a medida que sua utilidade se tornou clara.
A função de interface externa estava presente desde as primeiras versões de Factor, e um sistema análogo existia em JFactor. Esta foi escolhida no lugar de criar um plugin para o C para cada biblioteca, que deve se comunicar com Factor, e tem a vantagem de ser mais declarativa, compilar mais rápido e ser mais fácil de escrever.
A implementação Java, inicialmente, consistia apenas de um interpretador, mas um compilador para bytecodes Java foi adicionado mais tarde. Este compilador só trabalhava em determinados procedimentos. A versão Java de Factor foi substituída por uma versão escrita em C e Factor. Inicialmente, esta constituída por apenas um interpretador, mas o interpretador foi substituído por dois compiladores, utilizados em situações diferentes. Ao longo do tempo, a aplicação do Factor tem crescido significativamente mais rápida.

## Paradigma de programação

O Factor é uma linguagem de programação tipada dinamicamente, funcional e orientada a objeto. O Código é estruturado em torno de pequenos procedimentos, chamados palavras (words). Em um código típico, essas tem tamanho entre 1-3 linhas, e um procedimento de mais de 7 linhas de tamanho é muito raro. Algo que idiomaticamente pode ser expresso como um procedimento em outra linguagem de programação seria escrito como várias palavras em Factor.
Cada palavra tem um número fixo de argumentos e tem um número fixo de valores de retorno. Argumentos para palavras são passadas em uma pilha de dados usando notação polonesa reversa. A pilha é utilizada apenas para organizar as chamadas para as palavras, e não como uma estrutura de dados. A pilha em Factor é utilizada de forma semelhante à pilha na linguagem de programação Forth, por isso, ambas são consideradas linguagens de programação orientadas à pilha. Por exemplo, abaixo está um trecho de código que imprime "Olá Mundo" para a fluxo padrão de saída:
print é uma palavra no vocabulário de io que recebe uma string da pilha e não retorna nada. Ela imprime a sequência para o fluxo padrão de saída (por padrão, o terminal ou graphical listener).
Nem todos os dados devem ser repassados somente com a pilha. Variáveis locais com escopo léxico permitem-lhe armazenar e acessar variáveis temporárias usadas dentro de um processo. Variáveis com escopo dinâmico são usadas para passar elementos entre chamadas de procedimento sem usar a pilha. Por exemplo, od fluxos correntes de entrada e saída são armazenados em variáveis com escopo dinâmico.
Fator enfatiza a flexibilidade e a capacidade de estender a linguagem. Existe um sistema de macros, bem como a possibilidade de extensão arbitrária da sintaxe de Factor. A sintaxe de Factor sintaxe é frequentemente estendida para permitir novos tipos de definições de palavras e de novos tipos de literais para estruturas de dados. Ele também é usado na biblioteca XML para fornecer sintaxe literal para se gerar XML. Por exemplo, a seguinte palavra recebe uma string e produz um objeto de documento XML que é um documento HTML enfatizando a sequência:
A palavra dup duplica o item do topo da pilha. O <-> serve para o preenchimento na parte do documento XML com um item da pilha.

## Implementação e bibliotecas

Factor inclui uma grande biblioteca padrão, escrito inteiramente na linguagem. Esta inclui
* Uma plataforma cruzada GUI toolkit, construída em cima de OpenGL e vários sistemas de janelas, usados para o ambiente de desenvolvimento

## Implementação e bibliotecas

Factor inclui uma grande biblioteca padrão, escrito inteiramente na linguagem. Esta inclui
* Uma plataforma cruzada toolkit GUI, construída em cima da OpenGL e vários sistemas de janelas, usada para o ambiente de desenvolvimento
* Ligações para bibliotecas de banco de dados diversos, incluindo PostgreSQL e SQLite
* Servidor e cliente HTTP, com o framework web Furnace
* Eficiente arrays homogêneos de inteiros, floats ou structs C
* Uma biblioteca para implementação de expressões regulares, gerando o código máquina para fazer a correspondência
Uma Foreign function interface é construída na Factor, permitindo a comunicação com programas C, Objective-C e Fortran. Também há suporte para execução e comunicação com shaders escritos em GLSL.
Factor é implementada em Factor e C++. Veio originalmente de uma aplicação Java anterior por técnicas de bootstrap. Hoje, o analisador e o compilador otimizado são escritos na linguagem. Alguns elementos básicos da linguagem são implementados em C++, como o coletor de lixo e certas primitivas.
Factor usa um modelo baseado em imagens, semelhante a muitas implementações Smalltalk, onde o código compilado e os dados são armazenados em uma imagem. Para compilar um programa, o programa é carregado em uma imagem e a imagem é guardada. Uma ferramenta especial auxilia no processo de criação de uma imagem mínima para executar um programa especial, embalando o resultado em algo que pode ser implantado como um aplicativo independente.