# FOCAL (linguagem de programação)

FOCAL, (abreviação de FOrmula CALculator), é uma linguagem de programação interpretada semelhante a JOSS.
Em grande parte criação de Richard Merrill, FOCAL foi inicialmente escrito para e teve seu maior impacto sobre os computadores Digital Equipment Corporation (DEC) PDP-8. Merrill escreveu o interpretador original (1968) e o interpretador clássico FOCAL-69 para o PDP-8. A própria Digital descreveu a FOCAL como "uma linguagem tipo JOSS" (em inglês: JOSS-like).
Como as versões iniciais de BASIC, FOCAL era um ambiente completo de programação em si, sem necessidade de sistema operacional. Como em MUMPS, a maioria dos comandos podiam ser, e, na prática, eram, abreviados para uma única letra do alfabeto. Escolhas criativas de palavras foram usadas para fazer cada comando único definido pelo seu caracter inicial. A Digital disponibilizou várias versões em línguas européias em que as palavras de comando foram traduzidas para a linguagem-objeto.

## Eficiência

FOCAL rodou nos menores sistemas PDP-8, mesmo em sistemas com apenas 4K palavras de memória e com ausência de memória de armazenamento em massa. O interpretador FOCAL foi escrito em linguagem assembly, de forma bastante econômica em termos de numero de instruções de código, e normalmente usando apenas 3K palavras de 12 bits, deixando a limitante quantidade de 1K palavras para conter os programas de usuário e as variáveis.
Se o sistema era atualizado, acrescentando-se um ou mais bancos extra de 4K de memória, FOCAL poderia utilizar a memória extra, seja para um único usuário, ou dividindo a memória extra por vários usuários com tempo compartilhado.
Não havia espaço de memória disponível para armazenar mensagens de erro, então FOCAL usava uma forma inteligente de contornar esta situação; ela reportava o endereço do código onde o erro era detectado como um pseudo-número de ponto flutuante. Por exemplo, o erro de divisão por zero era detectado pelo código 4333 logo a mensagem de erro era: ?28,73 @ 01.10. A maioria das estações de trabalho de FOCAL tinha uma listagem mapeando o "número do erro" para a "mensagem de erro" gravada perto dos terminais.
Comparações entre FOCAL e BASIC eram inevitáveis pois ambas as linguagens eram comuns em computadores pequenos da mesma época. FOCAL carecia de apoio inerente a strings, como elementos de dados que podiam ser atribuídos às variáveis. Isso geralmente é considerado uma deficiência grave, em comparação com as capacidades de manipulação de strings da maioria dos dialetos Basic. Esta deficiência, embora séria, não era tão absolutamente incapacitante como poderia soar. Uma quantidade surpreendente de usos de string em programas FOCAL são dedicados à formatação de saída do usuário. Uma vez que a saída de FOCAL era orientada a streams de caracteres, a saída de duas seqüências de caracteres seqüencialmente poderia às vezes substitutir a operação de concatenação, e ferramentas procedurais poderiam ser escritas para a realização de saídas formatadas complexas.
Uma quantidade limitada de entrada de strings podia ser feita, por isso um programa poderia fornecer questões simples, tipo Sim/Não, mas isto era realmente uma gambiarra. Por exemplo, se você digitasse "HELLO" em uma declaração de entrada, FOCAL iria converter o H para "8", em seguida, interpretar o "E" como o início de um expoente, então tentar calcular "8" elevado à potência "LLO", o que levaria alguns segundos de tempo de CPU e resultar em um valor de 0.76593020E+103, não uma resposta particularmente útil.
É geralmente aceito que FOCAL foi mais eficiente no uso dos recursos do que sistemas comparáveis em BASIC. Em uma máquina típica da época(geralmente de 6 a 24 kilobytes de memória principal), FOCAL poderia aguentar maiores e mais complexas tarefas de programação do que a linguagem BASIC.
A implementação de FOCAL para o PDP-8 utilizava uma representação de ponto flutuante , que representava os números, em quatro palavras de 12 bits, com trinta e seis bits de mantissa e doze bits de expoente. Isto permitiu que para ambos ela tivesse números de alta precisão e uma maior gama de valores em comparação a maioria dos outros sistemas de programação de baixo custo, e fez dela uma escolha razoável para trabalhos numéricos de grande monta. Esta alta precisão, e boas opções para formatação de saída padrão decimal, significavam que as dificuldades com arredondamento binário para decimal não eram evidentes para usuários iniciantes.

## Versões derivadas

A Corporação Coca-Cola utilizou uma versão personalizada do FOCAL chamada COKE.
FOCAL mais tarde foi implementada no PDP-7/9, PDP-11 e PDP-12.
O manual FOCAL mostrava como adicionar comandos para o interpretador FOCAL, então muitos usuários adicionaram comandos especializados para o funcionamento de seu hardware personalizado.
A DEC User Society recolheu muitos consertos e melhorias para a FOCAL. Havia ainda grandes ramificações mais robustas de FOCAL, como FOCAL-W, que acrescentou vários recursos, incluindo melhores arquivos de I/O para armazenamento em massa e até mesmo de memória variável virtual!
Na Rússia, se viu seu uso tardio no início dos anos 1990 nos computadores produzidos em massa das séries Elektronika BK.
Uma das causas do declínio de FOCAL pode ter sido as questões de propriedade intelectual; o património de IP da FOCAL era de tal forma nebuloso que a Digital não podia estar certa de que tinha sua "propriedade", e esta foi provavelmente o fator que fez a Digital não dar destaque a linguagem e não continuar seu desenvolvimento.

## Exemplo de sessão com Focal em um PDP15

Este programa obtém o seu ano de nascimento e calcula em que ano após FOCAL você nasceu.
As linhas de programa em um programa FOCAL são agrupadas em grupos de linha e e números de linha dentro desse grupo. A primeira linha do programa, linha 01.10 é a linha 10 do grupo 01. Os números de linha são os rótulos-alvo para comandos GOTO e declarações IF.
A instrução ASK exibe no teletipo anexado pedindo uma entrada, enquanto o comando TYPE exibe saídas de texto no teletipo. Múltiplos itens podem ser enviados para o teletipo, acrescentando uma vírgula após cada item. Um ponto de exclamação (!) provoca o envio de um retorno de carro e um avanço de linha.
A declaração de SET atribui um valor a uma variável. Este valor pode ser o resultado de uma expressão.
O comando condicional IF pode receber até 3 números de linhas como parâmetros. O programa segue a ramificação da primeira linha se o resultado da expressão entre parêntesis é menor que zero, segue a ramificação da segunda linha se o resultado é igual a zero e a da terceira se o resultado é maior que zero. Este comando é semelhante ao if aritmético da linguagem FORTRAN.
Ao encontrar o comando GO, FOCAL começa a rodar o programa.
Focal indica com um asterisco (*) no início da linha quando ela está esperando uma entrada.