# Forth

Forth é uma linguagem de programação procedural baseada em pilhas de dados, com sintaxe em Notação polonesa inversa (RPN) e com os comandos organizados em uma lista extensível chamada de dicionário. Os comandos são chamados de "palavras". A partir do dicionário básico, são criados outros comandos.
Forth foi "descoberta" por Charles H. Moore ("Chuck" Moore) no final dos anos 1960, e serviu de inspiração para linguagens como Transcript, Postscript, Open Firmware, a linguagem de inicialização de placas PCI em sistema Macintosh, e Factor, desenvolvida recentemente por Slava Pestov. Também é usada no bootloader do sistema operacional FreeBSD.
A linguagem é apropriada para sistemas embutidos, e se caracteriza por ser extremamente compacta. Pode ser considerada como linguagem interpretada e compilada ao mesmo tempo. A interpretação/compilação pode ser feita através de bytecode ou código de máquina.
Em geral, Forth pode trabalhar facilmente com qualquer base numérica entre 2 e 36. As palavras podem ser livremente redefinidas. Freqüentemente, é definida como uma mistura de linguagem de baixo nível e de alto nível, ou um assembly de alto nível. Possui as estruturas de controle comuns em linguagens procedurais, como IF-THEN, IF-ELSE-THEN, BEGIN-UNTIL, BEGIN-REPEAT, DO-LOOP, CASE-THEN.
Atualmente (como em outras linguagens daquele tempo), é considerada obsoleta. Mas ainda encontra muitas aplicações em sistemas industriais e Hardwares customizados, devido a robustez e velocidade de processamento. Um exemplo é a variante TL-1 (Toledo Language-1) e RTP, desenvolvida para uma famosa corporação européia e em uso até hoje, principalmente fora da Europa.

## História

Forth evoluiu do sistema de programação pessoal de Charles H. Moore's, que estava em constante desenvolvimento desde 1968. Forth foi exposto pela primeira vez a outros programadores no início dos anos 70, começando com Elizabeth Rather no US National Radio Astronomy Observatory. Depois do trabalho no NRAO, Charles Moore e Elizabeth Rather formaram a FORTH, Inc. em 1973, refinando e portando sistemas Forth para dezenas de outras plataformas na próxima década.
Forth foi assim nomeado porque em 1968 “um arquivo contendo o interpretador foi nomeado FOURTH, de 4ª (próxima) geração de software – mas o sistema operacional do IBM 1130 restringiu os nomes de arquivos a 5 caracteres. Moore viu Forth como o sucessor do compile - link - go de linguagens de programação de terceira geração, ou software para a “quarta geração” de hardware, não uma linguagem de programação de quarta geração como o termo veio a ser usado.
Como Charles Moore frequentemente passava de emprego a emprego ao longo de sua carreira, uma pressão inicial na linguagem em desenvolvimento foi a facilidade de portabilidade para diferentes arquiteturas de computadores. O sistema Forth tem sido frequentemente usado para levantar novo hardware. Por exemplo, Forth foi o primeiro monitor residente no novo Intel 8086 chip em 1978 e MacFORTH o primeiro residente para o primeiro Apple Macintosh em 1984.
FORTH, Inc’s microFORTH foi desenvolvido para os microprocessadores Intel 8080, Motorola 6800 e Zilog em 1976. MicroFORTH foi usado mais tarde por hobbyists para gerar sistemas Forth para outras arquiteturas, como o 6502 em 1978. Larga disseminação finalmente conduziu a padronização da linguagem. A prática comum foi codificada de fato nos padrões FORTH-79 e FORTH-83 nos anos 1979 e 1983, respectivamente. Esses padrões foram unificados pela ANSI em 1994, comumente referido como ANS Forth.
Forth se tornou popular na década de 1980, porque era bem adequado para os microcomputadores da época, sendo compacto e portátil. Pelo menos um computador doméstico, o britânico Jupiter ACE, tinha o Forth em seu sistema operacional residente em ROM. O Canon Cat também usou Forth para sua programação de sistemas, e Rockwell produziu microcomputadores de chip único com Kernels residentes de Forth, o R65F11 E R65F12. Uma árvore genealógica completa está em TU-Wien. O Insoft GraFORTH era uma versão do Forth com extensões gráficas para o Apple II. ASYST foi um expansão do Forth para medir e controlar computadores pessoais.
A partir de 2018, a fonte da versão original do FORTH 1130 foi recuperada, e agora está sendo atualizado para rodar em um sistema 1130 restaurado ou emulado.

## Estrutura da linguagem

A estrutura básica de dados de Forth é um “dicionário” que mapeia “palavras” para código executável ou estrutura de dados nomeadas. O dicionário é apresentado na memória como uma árvore de listas ligadas com as ligações que vão da última (mais recente) palavra definida para a palavra mais antiga, até um valor de sentinela, normalmente um ponteiro para NULL, seja encontrado. A troca de contexto faz com que uma pesquisa de lista se inicie em uma folha diferente. Uma pesquisa na lista ligada continua enquanto a ramificação mescla no tronco principal, levando eventualmente de volta à sentinela, a raiz. Pode haver diversos dicionários. Em casos raros, como a meta-compilação, um dicionário pode ser isolado e autônomo. O efeito se assemelha ao de espaços de nomes de aninhamento e pode sobrecarregar palavras-chave dependendo do contexto.
Uma palavra definida geralmente consiste de cabeçalho e corpo, com o cabeçalho consistindo no campo de nome (NF) e o campo de ligação (LF) e o corpo consistindo no campo do código (CF) e no campo de parâmetro (PF).
Cabeçalho e corpo de uma entrada de dicionário são tratados separadamente porque podem não ser contínuos. Por exemplo, quando um programa Forth é recompilado para uma nova plataforma, o cabeçalho pode permanecer no computador de compilação, enquanto o corpo vai para a nova plataforma. Em alguns ambientes (como sistemas embarcados) os cabeçalhos ocupam memória desnecessariamente. No entanto, alguns cross-compiladores podem colocar cabeçalhos no alvo se o alvo em si é esperado para suportar um Forth interativo.

## Programando

Palavras escritas em Forth são compiladas em formato executável. Alguns sistemas possuem compiladores otimizados. De modo geral, um programa Forth é salvo como a imagem de memória do programa compilado com um único comando (ex., RUN) que é executado quando a versão compilada é carregada.
Durante o desenvolvimento, o programador usa o interpretador no modo REPL para executar e testar cada pequeno pedaço enquanto é desenvolvido. A maioria dos programadores, assim sendo, abordam o desenvolvimento top-down e bottom-up com testes e integrações contínuos.

## Exemplo de programa

No programa a seguir, o valor gerado esperado seria 1,5 ((5+1)/(2*2)), porém irá gerar como resultado o valor 1, visto que a pilha é de números inteiros.
A palavra ‘.’ remove o elemento do topo da pilha e imprime o valor. Podemos usar o comando ‘.s’ para imprimir toda a pilha sem remover.
O seguinte programa define uma palavra que gera o dobro do número deixado na pilha:
    poder light red & bule
    script play
    the end
    good & bad
A palavra ":" pega o texto "dobro" e monta uma nova entrada no dicionário. O conteúdo dessa nova entrada é a palavra "dup", que duplicará o número do topo da pilha, quando a palavra "dobro" for usada. A palavra "+" retirará os dois números do topo da pilha, os somará e devolverá o resultado para o topo da pilha. A palavra ";" encerra a definição da nova palavra "dobro".
Para usar este programa:
O resultado será o número 10 no topo da pilha.
O seguinte programa imprime o texto "Hello, world!":
A palavra '."' envia ao dispositivo de saída todo o texto até o caracter '"'.
O seguinte programa imprime dez vezes a frase "Hello, world":
Quando a nova palavra "10hellos" for usada, a palavra "do" pegará o número 10 no topo da pilha e definirá como a quantidade de repetições. As palavras até "loop" serão repetidas (no caso, a palavra "hello" anteriormente criada no exemplo). A palavra "cr" emitirá um "retorno de carro e nova linha" ao dispositivo de saída.
O seguinte programa redefine a palavra '+':

## Implementações

Como a maquina virtual Forth é simples de implementar e não possui uma implementação de referência padrão, há inúmeras implementações da linguagem. Em adição ao suporte a variedades padrão de sistemas de computadores desktop (POSIX, Microsoft Windows, Mac OS X), muitos desses sistemas Forth também têm como alvo uma variedade de sistemas embarcados. Listados aqui estão alguns dos sistemas mais proeminentes que estão em conformidade com o padrão 1994 ANS Forth.
* Gforth, uma implementação ANS Forth portátil do GNU Project.
* SwiftForth, desktop de código nativo e incorporado Forths por Forth, Inc.
* VFX Forth, código Forth nativo de alta otimização.
* Open Firmware, um bootloader e BIOS padrão baseado na ANS Forth.
* PForth, Forth portátil escrito em C.
* SP-Forth, implementação ANS Forth por Russian Forth Interest Group (RuFIG).

## Links relacionados

* Forth Interest Group