APL (linguagem de programação)
APL (em homenagem ao livro A Programming Language) é uma linguagem de programação desenvolvida na década de 1960 por Kenneth E. Iverson. Seu tipo de dados central é o array multidimensional. Ele usa uma grande variedade de símbolos gráficos especiais para representar a maioria das funções e operadores, levando a um código muito conciso. Foi uma influência importante no desenvolvimento de modelagem de conceito, planilhas, programação funcional e pacotes de matemática de computador. Também inspirou várias outras linguagens de programação.
História
Notação matemática
Uma notação matemática para manipulação de arrays foi desenvolvida por Kenneth E. Iverson, começando em 1957 na Universidade de Harvard. Em 1960, ele começou a trabalhar para a IBM, onde desenvolveu esta notação com Adin Falkoff e a publicou em seu livro A Programming Language em 1962. O prefácio declara sua premissa:
A matemática aplicada está em grande parte preocupada com a concepção e análise de procedimentos explícitos para o cálculo dos valores exatos ou aproximados de várias funções. Tais procedimentos explícitos são chamados algoritmos ou programas. Como uma notação eficaz para a descrição de programas exibe estrutura sintática considerável, é chamado de linguagem de programação.
Esta notação foi usada dentro da IBM para relatórios curtos de pesquisa em sistemas de computador, como o Burroughs B5000 e seu mecanismo de pilha quando máquinas de pilha versus máquinas de registro estavam sendo avaliadas pela IBM para computadores futuros.
Iverson também usou sua notação em um rascunho do capítulo A Programming Language, escrito para um livro que estava escrevendo com Fred Brooks, Automatic Data Processing, que seria publicada em 1963.
Em 1979, Iverson recebeu o Prêmio Turing por seu trabalho em APL.
Desenvolvimento em uma linguagem de programação de computador
Já em 1962, a primeira tentativa de usar a notação para descrever um sistema de computador completo aconteceu depois que Falkoff discutiu com William C. Carter seu trabalho para padronizar o conjunto de instruções para as máquinas que mais tarde se tornaram a família IBM System/360.
Em 1963, Herbert Hellerman, trabalhando no IBM Systems Research Institute, implementou uma parte da notação em um computador IBM 1620 e foi usada por alunos em um curso especial do ensino médio sobre cálculo de funções transcendentais por soma de séries. Os alunos testaram seu código no laboratório de Hellerman. Essa implementação de uma parte da notação foi chamada de Tradutor de Array Personalizado (PAT).
Em 1963, Falkoff, Iverson e Edward H. Sussenguth Jr., todos trabalhando na IBM, usaram a notação para uma descrição formal da arquitetura e funcionalidade da máquina da série IBM System/360, o que resultou em um artigo publicado em IBM Systems Journal em 1964. Após a publicação, a equipe voltou sua atenção para a implementação da notação em um sistema de computador. Uma das motivações para esse foco de implementação foi o interesse de John L. Lawrence, que tinha novas funções na Science Research Associates, uma empresa educacional comprada pela IBM em 1964. Lawrence pediu a Iverson e seu grupo que ajudassem a usar a linguagem como uma ferramenta para desenvolver e usar computadores na educação.
Depois que Lawrence M. Breed e Philip S. Abrams, da Universidade de Stanford, se juntaram à equipe da IBM Research, eles continuaram seu trabalho anterior em uma implementação programada em FORTRAN IV para uma parte da notação que havia sido feita para o computador IBM 7090 rodando no sistema operacional IBSYS. Este trabalho foi concluído no final de 1965 e mais tarde denominado IVSYS (para o sistema de Iverson). A base dessa implementação foi descrita em detalhes por Abrams em um relatório técnico da Universidade de Stanford, "An Interpreter for Iverson Notation" em 1966, o aspecto acadêmico foi formalmente supervisionado por Niklaus Wirth. Como o sistema PAT de Hellerman anteriormente, essa implementação não incluía o conjunto de caracteres APL, mas usava palavras reservadas especiais em inglês para funções e operadores. O sistema foi posteriormente adaptado para um sistema de compartilhamento de tempo e, em novembro de 1966, foi reprogramado para o computador IBM System/360 Modelo 50 rodando em modo de compartilhamento de tempo e foi usado internamente na IBM.
Hardware
Um desenvolvimento fundamental na capacidade de usar APL de forma eficaz, antes do amplo uso de terminais de tubo de raios catódicos (CRT), foi o desenvolvimento de um elemento de digitação intercambiável especial da máquina de escrever IBM Selectric com todos os caracteres APL especiais nele. Isso foi usado em estações de trabalho terminais de impressão de papel usando a máquina de escrever Selectric e mecanismo de elemento de digitação, como o terminal IBM 1050 e IBM 2741. Keycaps podem ser colocados sobre as teclas normais para mostrar quais caracteres APL seriam inseridos e digitados quando essa tecla fosse pressionada. Pela primeira vez, um programador pode digitar e ver caracteres APL apropriados conforme usados na notação de Iverson e não ser forçado a usar representações de palavras-chave em inglês desajeitadas deles. Falkoff e Iverson tinham os elementos de digitação APL Selectric especiais, 987 e 988, projetados no final de 1964, embora nenhum sistema de computador APL estivesse disponível para usá-los. Iverson citou Falkoff como a inspiração para a ideia de usar um elemento de digitação IBM Selectric para o conjunto de caracteres APL.
Muitos símbolos APL, mesmo com os caracteres APL no elemento de digitação Selectric, ainda precisavam ser digitados sobrepondo dois caracteres de elemento existentes. Um exemplo é o caractere grade up, que tinha que ser feito de um delta (shift-H) e um traço Sheffer (shift-M). Isso era necessário porque o conjunto de caracteres APL era muito maior do que os 88 caracteres permitidos no elemento de digitação, mesmo quando as letras eram restritas a maiúsculas (maiúsculas).
Disponibilidade comercial
O primeiro login interativo APL e criação de um espaço de trabalho APL foi em 1966 por Larry Breed usando um terminal IBM 1050 no IBM Mohansic Labs perto do Thomas J. Watson Research Center, a casa do APL, em Yorktown Heights, Nova York.
A IBM foi a principal responsável pela introdução do APL no mercado. A primeira versão publicamente disponível do APL foi lançada em 1968 para o IBM 1130. A IBM fornecia APL1130 gratuitamente, mas sem responsabilidade ou suporte. Ele rodaria em apenas 8k palavras de 16 bits de memória e usaria um disco rígido dedicado de 1 megabyte.
APL ganhou sua posição em sistemas de compartilhamento de tempo de mainframe do final dos anos 1960 até o início dos anos 1980, em parte porque daria suporte a vários usuários em sistemas de especificação inferior que não tinham hardware de conversão de endereço dinâmico. Melhorias adicionais no desempenho para sistemas de mainframe IBM System/370 selecionados incluíram o APL Assist Microcode no qual algum suporte para execução APL foi incluído no firmware do processador, diferente de ser implementado inteiramente por sistemas superiores software de nível. Um pouco mais tarde, quando o hardware de desempenho adequado foi finalmente ficando disponível em meados da década de 1980, muitos usuários migraram seus aplicativos para o ambiente de computador pessoal.
Os primeiros interpretadores IBM APL para hardware IBM 360 e IBM 370 implementavam seu próprio gerenciamento multiusuário em vez de depender dos serviços de host, portanto, eles eram seus próprios sistemas de compartilhamento de tempo. Introduzido pela primeira vez para uso na IBM em 1966, o sistema APL360 era um interpretador multiusuário. A capacidade de se comunicar programaticamente com o sistema operacional para obter informações e definir as variáveis do sistema do interpretador foi feita por meio de "I-beam" funções, usando operações monádicas e diádicas.
Em 1973, a IBM lançou APL.SV, que era uma continuação do mesmo produto, mas que oferecia variáveis compartilhadas como um meio de acessar recursos fora do sistema APL, como arquivos do sistema operacional. Em meados da década de 1970, o interpretador de mainframe IBM foi adaptado para uso no computador desktop IBM 5100, que tinha um pequeno CRT e um teclado APL, quando a maioria dos outros pequenos computadores da época ofereciam apenas BASIC. Na década de 1980, o produto do programa VSAPL teve amplo uso com usuários do Sistema de Monitoramento de Conversação (CMS), Opção de Compartilhamento de Tempo (TSO), VSPC, MUSIC/SP e CICS.
Em 1973–1974, Patrick E. Hagerty dirigiu a implementação do interpretador APL da Universidade de Maryland para a linha 1100 dos computadores mainframe da série Sperry UNIVAC 1100/2200. Na época, Sperry não tinha nada. Em 1974, o aluno Alan Stebbens recebeu a tarefa de implementar uma função interna. Xerox APL estava disponível a partir de junho de 1975 para mainframes Xerox 560 e Sigma 6, 7 e 9 rodando CP-V e para Honeywell CP-6.
Nas décadas de 1960 e 1970, surgiram várias empresas de timesharing que vendiam serviços APL usando versões modificadas do interpretador IBM APL360. Na América do Norte, as mais conhecidas foram IP Sharp Associates, Scientific Time Sharing Corporation (STSC), Time Sharing Resources (TSR) e The Computer Company (TCC). A CompuServe também entrou no mercado em 1978 com um APL Interpreter baseado em uma versão modificada de Digital Equipment Corp e Carnegie Mellon's, que rodava em máquinas DEC KI e KL de 36 bits. O APL da CompuServe estava disponível tanto para seu mercado comercial quanto para o serviço de informações ao consumidor. Com o advento primeiro de mainframes mais baratos, como o IBM 4300, e mais tarde do computador pessoal, em meados da década de 1980, a indústria de compartilhamento de tempo praticamente desapareceu.
OSharp APL estava disponível na IP Sharp Associates, primeiro como um serviço de compartilhamento de tempo na década de 1960 e, posteriormente, como um produto de programa a partir de 1979. O Sharp APL era um avançado Implementação APL com muitas extensões de linguagem, como pacotes (a capacidade de colocar um ou mais objetos em uma única variável), sistema de arquivos, arrays aninhados e variáveis compartilhadas.
Os interpretadores APL também estavam disponíveis em outros fabricantes de mainframes e minicomputadores, notadamente Burroughs, Control Data Corporation (CDC), Data General, Digital Equipment Corporation (DEC), Harris, Hewlett-Packard (HP), Siemens, Xerox e outros.
Garth Foster, da Universidade de Syracuse, patrocinou reuniões regulares dos líderes dos implementadores de APL. comunidade no Minnowbrook Conference Center de Syracuse em Blue Mountain Lake, Nova York. Anos depois, Eugene McDonnell organizou reuniões semelhantes no Asilomar Conference Grounds, perto de Monterey, Califórnia, e em Pajaro Dunes, perto de Watsonville, Califórnia. O grupo de interesse especial SIGAPL da Association for Computing Machinery continua a apoiar a comunidade APL.
Microcomputadores
Nos microcomputadores, que se tornaram disponíveis a partir de meados da década de 1970, o BASIC tornou-se a linguagem de programação dominante. No entanto, alguns microcomputadores forneciam APL - o primeiro sendo o MCM/70 baseado em Intel 8008, lançado em 1974 e usado principalmente na educação. Outra máquina dessa época foi o VideoBrain Family Computer, lançado em 1977, que era fornecido com seu dialeto de APL chamado APL/S.
O Commodore SuperPET, lançado em 1981, incluía um interpretador APL desenvolvido pela Universidade de Waterloo.
Em 1976, Bill Gates afirmou em sua Carta Aberta aos Hobbyists que a Microsoft Corporation estava implementando o APL para o Intel 8080 e o Motorola 6800, mas tinha "muito pouco incentivo para disponibilizá-lo aos hobistas" por causa da pirataria de software. Nunca foi lançado.
APL2
A partir do início da década de 1980, o desenvolvimento do IBM APL, sob a liderança de Jim Brown, implementou uma nova versão da linguagem APL que continha como principal aprimoramento o conceito de arrays aninhados, em que um array pode conter outras matrizes e novos recursos de linguagem que facilitam a integração de matrizes aninhadas no fluxo de trabalho do programa. Ken Iverson, não mais no controle do desenvolvimento da linguagem APL, deixou a IBM e ingressou na I. P. Sharp Associates, onde uma de suas principais contribuições foi direcionar a evolução do Sharp APL para estar mais de acordo com sua visão. O APL2 foi lançado pela primeira vez para CMS e TSO em 1984. A edição APL2 Workstation (Windows, OS/2, AIX, Linux e Solaris) foi lançada posteriormente.
Como outros fornecedores estavam ocupados desenvolvendo interpretadores APL para novos hardwares, principalmente microcomputadores baseados em Unix, o APL2 era quase sempre o padrão escolhido para novos desenvolvimentos de interpretadores APL. Ainda hoje, a maioria dos fornecedores de APL ou seus usuários citam a compatibilidade com APL2 como um ponto de venda para esses produtos. A IBM cita seu uso para resolução de problemas, projeto de sistema, prototipagem, engenharia e cálculos científicos, sistemas especialistas, para ensino de matemática e outros assuntos, visualização e acesso a banco de dados.
Implementações modernas
Várias implementações de APL por APLX, Dyalog, et al., incluem extensões para programação orientada a objetos, suporte para.NET Framework, primitivas de conversão de matriz XML, gráficos, interfaces de sistema operacional e expressões de cálculo lambda. Versões freeware incluem GNU APL para Linux e NARS2000 para Windows (que roda em Linux no Wine). Ambos são versões razoavelmente completas do APL2 com várias extensões de linguagem.
Línguas derivadas
O APL formou a base ou influenciou os seguintes idiomas:
- A e A+, uma alternativa APL, a última com extensões gráficas.
- FP, uma linguagem de programação funcional.
- Ivy, um intérprete para uma linguagem semelhante a APL desenvolvida por Rob Pike, e que usa ASCII como entrada.
- J, que também foi projetado por Iverson, e que usa ASCII com digramas em vez de símbolos especiais.
- K, uma variante proprietária da APL desenvolvida por Arthur Whitney.
- MATLAB, uma ferramenta de computação numérica.
- Nial, uma linguagem de programação de array de alto nível com uma notação de programação funcional.
- Linguagem de programação polimórfica, uma linguagem interativa e extensível com uma linguagem base semelhante.
- S, uma linguagem de programação estatística (geralmente agora vista na versão open-source conhecida como R).
- Speakeasy, um ambiente interativo de computação numérica.
- Wolfram Language, a linguagem de programação do Mathematica.
Características da linguagem
Conjunto de caracteres
O APL foi criticado e elogiado por sua escolha de um conjunto de caracteres único e fora do padrão. Alguns que aprendem tornam-se adeptos fervorosos. Nas décadas de 1960 e 1970, poucos dispositivos terminais ou mesmo monitores podiam reproduzir o conjunto de caracteres APL. Os mais populares empregavam o mecanismo de impressão IBM Selectric usado com um elemento especial do tipo APL. Um dos primeiros terminais de linha APL (somente operação em modo de linha, não em tela cheia) foi o Texas Instruments TI Modelo 745 (c. 1977) com o conjunto de caracteres APL completo que apresentava modos de telecomunicações half e full duplex, para interagir com um serviço de compartilhamento de tempo APL ou mainframe remoto para executar um trabalho de computador remoto, chamado de RJE.
Com o tempo, com o uso universal de telas gráficas de alta qualidade, dispositivos de impressão e suporte a Unicode, o problema da fonte de caracteres APL foi amplamente eliminado. No entanto, inserir caracteres APL requer o uso de editores de método de entrada, mapeamentos de teclado, conjuntos de símbolos APL virtuais/na tela ou cartões de teclado impressos de fácil referência que podem frustrar iniciantes acostumados a outras linguagens de programação. Com iniciantes que não têm experiência anterior com outras linguagens de programação, um estudo envolvendo alunos do ensino médio descobriu que digitar e usar caracteres APL não atrapalhou os alunos de forma mensurável.
Em defesa do APL, ele requer menos caracteres para digitar e os mapeamentos do teclado são memorizados com o tempo. Teclados APL especiais também são feitos e usados hoje, assim como fontes para download gratuito para sistemas operacionais como o Microsoft Windows. Os ganhos de produtividade relatados pressupõem que se gaste tempo suficiente trabalhando na linguagem para que valha a pena memorizar os símbolos, sua semântica e mapeamentos de teclado, sem mencionar um número substancial de expressões idiomáticas para tarefas comuns.
Design
Ao contrário das linguagens de programação tradicionalmente estruturadas, o código APL é normalmente estruturado como cadeias de funções monádicas ou diádicas e operadores atuando em matrizes. APL tem muitos primitivos não padronizados (funções e operadores) que são indicados por um único símbolo ou uma combinação de alguns símbolos. Todos os primitivos são definidos para ter a mesma precedência e sempre associados à direita. Assim, APL é lido ou melhor entendido da direita para a esquerda.
As primeiras implementações de APL (c. 1970 ou mais) não tinham estruturas de controle de fluxo de loop de programação, como loops do
ou while
e construções if-then-else
. Em vez disso, eles usaram operações de matriz, e o uso de construções de programação estruturada geralmente não era necessário, pois uma operação poderia ser executada em uma matriz completa em uma instrução. Por exemplo, a função iota
(ι
) pode substituir a iteração for-loop: ιN quando aplicado a um número inteiro positivo escalar produz uma matriz unidimensional (vetor), 1 2 3... N. As implementações mais recentes de APL geralmente incluem estruturas de controle abrangentes, de modo que a estrutura de dados e o fluxo de controle do programa possam ser separados de forma clara e limpa.
O ambiente APL é chamado de espaço de trabalho. Em um espaço de trabalho o usuário pode definir programas e dados, ou seja, os valores dos dados existem também fora dos programas, e o usuário também pode manipular os dados sem precisar definir um programa. Nos exemplos abaixo, o interpretador APL primeiro digita seis espaços antes de aguardar a entrada do usuário. Sua própria saída começa na coluna um.
n ← 4 5 6 7 | Atribuir vetor de valores, {4 5 6 7}, a variável n , um array criar operação. Uma expressão equivalente ainda mais concisa da APL seria n ← 3 + ⍳4 . Vários valores são armazenados no array n , a operação realizada sem loops formais ou linguagem de fluxo de controle.
|
n 4 5 6 7 | Exibir o conteúdo de n , atualmente um array ou vetor.
|
n+48 9 10. 11 | 4 agora é adicionado a todos os elementos do vetor n , criando um vetor de 4 elementos {8 9 10 11}.Como acima, o interpretador da APL mostra o resultado porque o valor da expressão não foi atribuído a uma variável (com uma ← ).
|
+/n22 | APL exibe a soma de componentes do vetor n , i.e., 22 (= 4 + 5 + 6 + 7) usando uma notação muito compacta: ler + / como "mais, mais..." e uma ligeira mudança seria "multiplicar, mais..."
|
m ← +/3+4 m22 | Essas operações podem ser combinadas em uma declaração, lembrando que a APL avalia expressões à direita para a esquerda: primeiro ⍳4 cria um array, [1,2,3,4] , então 3 é adicionado a cada componente, que são somados juntos e o resultado armazenado em variável m , finalmente exibido.
Na notação matemática normal, é equivalente a: m= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =Gerenciamento Gerenciamento Eu...= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =14(Eu...+3){displaystyle displaystyle m=sum limits _{i=1}^{4}(i+3)}. Lembre-se de que as expressões matemáticas não são lidas ou avaliadas da direita para a esquerda. |
O usuário pode salvar o espaço de trabalho com todos os valores, programas e status de execução.
O APL usa um conjunto de símbolos não-ASCII, que são uma extensão da notação aritmética e algébrica tradicional. Ter nomes de caracteres únicos para instruções únicas, funções vetoriais de dados múltiplos (SIMD) é uma maneira pela qual o APL permite a formulação compacta de algoritmos para transformação de dados, como a computação do Game of Life de Conway em uma linha de código. Em quase todas as versões do APL, é teoricamente possível expressar qualquer função computável em uma expressão, ou seja, em uma linha de código.
Devido ao conjunto de caracteres incomum, muitos programadores usam teclados especiais com teclas APL para escrever código APL. Embora existam várias maneiras de escrever código APL usando apenas caracteres ASCII, na prática isso quase nunca é feito. (Isso pode ser pensado para apoiar a tese de Iverson sobre a notação como uma ferramenta de pensamento.) A maioria, se não todas as implementações modernas, usam layouts de teclado padrão, com mapeamentos especiais ou editores de método de entrada para acessar caracteres não ASCII. Historicamente, a fonte APL tem sido distinta, com caracteres alfabéticos itálicos maiúsculos e numerais e símbolos verticais. A maioria dos fornecedores continua exibindo o conjunto de caracteres APL em uma fonte personalizada.
Os defensores da APL afirmam que os exemplos do chamado código somente para gravação (código mal escrito e quase incompreensível) são quase invariavelmente exemplos de prática de programação ruim ou erros de iniciante, que podem ocorrer em qualquer linguagem. Os defensores também afirmam que são muito mais produtivos com APL do que com linguagens de computador mais convencionais, e que o software funcional pode ser implementado em muito menos tempo e com muito menos programadores do que usando outras tecnologias.
Eles também podem alegar que, por ser compacto e conciso, o APL se presta bem ao desenvolvimento e à complexidade de software em larga escala, porque o número de linhas de código pode ser bastante reduzido. Muitos defensores e profissionais do APL também consideram as linguagens de programação padrão, como COBOL e Java, comparativamente tediosas. O APL é frequentemente encontrado onde o tempo de colocação no mercado é importante, como em sistemas de negociação.
Terminologia
APL faz uma clara distinção entre funções e operadores. As funções recebem matrizes (variáveis, constantes ou expressões) como argumentos e retornam matrizes como resultados. Operadores (semelhantes a funções de ordem superior) usam funções ou matrizes como argumentos e derivam funções relacionadas. Por exemplo, a função soma é derivada aplicando o operador redução à função adição. Aplicando o mesmo operador de redução à função máximo (que retorna o maior de dois números), obtém-se uma função que retorna o maior de um grupo (vetor) de números. Na linguagem J, Iverson substituiu os termos verbo por função e advérbio ou conjunção por operador.
O APL também identifica os recursos incorporados à linguagem e representados por um símbolo ou uma combinação fixa de símbolos como primitivos. A maioria dos primitivos são funções ou operadores. Codificar APL é basicamente um processo de escrever funções não primitivas e (em algumas versões de APL) operadores. No entanto, algumas primitivas são consideradas nem como funções nem como operadores, principalmente atribuição.
Algumas palavras usadas na literatura APL têm significados que diferem daqueles em matemática e na generalidade da ciência da computação.
Termo | Descrição |
---|---|
função | operação ou mapeamento que leva zero, um (direita) ou dois (esquerda e direita) argumentos que podem ser escalares, arrays ou estruturas mais complicadas, e podem retornar um resultado similarmente complexo. Uma função pode ser:
|
array | objeto avaliado de zero ou mais dimensões ortogonais na ordem principal da linha em que cada item é um dado escanal primitivo ou outro array. |
Niladic | não tomar ou exigir quaisquer argumentos, nullary |
Monadic | exigindo apenas um argumento; à direita para uma função, à esquerda para um operador, unary |
Dyadic | exigindo uma esquerda e um argumento direito, binário |
ambivalente ou monádico | capaz de usar em um contexto monádico ou dádico, permitindo que seu argumento esquerdo seja elided |
operador | operação ou mapeamento que leva uma (esquerda) ou duas (esquerda & direita) função ou array argumentos valorizados (operands) e deriva uma função. Um operador pode ser:
|
Sintaxe
APL tem representações explícitas de funções, operadores e sintaxe, fornecendo assim uma base para a declaração clara e explícita de facilidades estendidas na linguagem e ferramentas para experimentá-las.
Exemplos
Olá, mundo
Isso exibe "Olá, mundo":
Olá, mundo '
Um tema de design em APL é definir ações padrão em alguns casos que produziriam erros de sintaxe na maioria das outras linguagens de programação.
A página 'Olá, mundo' A constante string acima é exibida, porque display é a ação padrão em qualquer expressão para a qual nenhuma ação é especificada explicitamente (por exemplo, atribuição, parâmetro de função).
Exponenciação
Outro exemplo desse tema é que a exponenciação em APL é escrita como 2*3
, que indica elevar 2 à potência 3 (isso seria escrito como 2^3
em alguns outros idiomas e 2**3
em FORTRAN e Python). Muitos idiomas usam *
para significar multiplicação, como em 2*3
, mas APL escolhe usar 2×3
. No entanto, se nenhuma base for especificada (como na instrução *3
em APL, ou ^3
em outro linguagens), a maioria das linguagens de programação veria isso como um erro de sintaxe. APL, entretanto, assume que a base que falta é a constante do logaritmo natural e, e interpreta *3
como 2.71828*3.
Estatísticas simples
Suponha que X
seja uma matriz de números. Então (+/X)÷⍴X
dá seu média. Lendo da direita para a esquerda, ⍴ X
fornece o número de elementos em X, e desde ÷
é um operador diádico, o termo à sua esquerda também é necessário. Está entre parênteses, caso contrário, X seria tomado (de modo que a soma seria de X÷⍴X
—cada elemento de X dividido pelo número de elementos em X) e +/X
fornece a soma dos elementos de X. Com base nisso, a seguinte expressão calcula o desvio padrão:
(+/(X - Não. (+/X)÷⍴X)*2)÷⍴X)*0,5
Naturalmente, alguém definiria essa expressão como uma função para uso repetido, em vez de reescrevê-la a cada vez. Além disso, como a atribuição é um operador, ela pode aparecer em uma expressão, portanto, o seguinte colocaria valores adequados em T, AV e SD:
SD←(+/(X - Não. AV←(T←+/X)÷⍴X)*2)÷⍴X)*0,5
Escolha 6 números de loteria
Esta seguinte expressão de modo imediato gera um conjunto típico de números de loteria Pick 6: seis inteiros pseudo-aleatórios variando de 1 a 40, não repetitivos garantidos e exibe-os classificados em ordem crescente:
xNão.⍋x←6?40]
O acima faz muito, concisamente, embora possa parecer complexo para um novo APLer. Ele combina as seguintes funções APL (também chamadas de primitivas e glyphs):
- O primeiro a ser executado (APL executa do mais direito ao mais esquerdo) é função dídica
?
(nomeadodeal
quando dyadic) que retorna um vetor que consiste em um número seleto (esquerdo argumento: 6 neste caso) de inteiros aleatórios que variam de 1 a um máximo especificado (discurso direito: 40 neste caso), que, se disse o comprimento máximo ≥ vector, é garantido para ser não-repetante; assim, gerar/criar 6 inteiros aleatórios que variam de 1 a 40. - Este vetor é então atribuído (
←
) à variávelx
, porque é necessário mais tarde. - Este vetor é então ordenada em ordem ascendente por um monádico
⍋
função, que tem como seu argumento certo tudo à direita dele até o próximo desequilibrado close-bracket ou parênteses próximas. O resultado de⍋
é os índices que colocarão seu argumento em ordem ascendente. - Então a saída de
⍋
é usado para indexar a variávelx
, que salvamos anteriormente para esta finalidade, selecionando assim seus itens em Ascendente sequência.
Como não há nenhuma função à esquerda do x mais à esquerda para dizer ao APL o que fazer com o resultado, ele simplesmente o exibe no visor (em uma única linha, separada por espaços) sem precisar de nenhuma instrução explícita para faça isso.
?
também possui um equivalente monádico chamado roll
, que simplesmente retorna um inteiro aleatório entre 1 e seu único operando [à direita dele], inclusive. Assim, um programa de RPG pode usar a expressão ?20
para lançar um dado de vinte faces.
Números primos
A seguinte expressão encontra todos os números primos de 1 a R. No tempo e no espaço, a complexidade do cálculo é O(R2){displaystyle O(R^{2}),!} (em notação Big O).
(~R∊R..×R)/R←1↓R
Executado da direita para a esquerda, significa:
- Iota
⍳
cria um vetor contendo inteiros de1
paraR
(se)R= 6
no início do programa,⍳R
o1 2 3 4 5 6
) - Gota primeiro elemento deste vetor (
↓
função), ou seja,1
. Então...1↓⍳R
o2 3 4 5 6
- Conjunto
R
para o novo vetor (←
, atribuição primitivo), ou seja,2 3 4 5 6
- O
/
replicar operador é dyadic (binário) e o intérprete primeiro avalia seu argumento esquerdo (com parênteses): - Gerar produto externo de
R
multiplicado porR
, ou seja, uma matriz que é a mesa de multiplicação de R por R (°.×
operador), ou seja,
4 | 6 | 8 | 10. | 12 |
6 | 9 | 12 | 15 | 18. |
8 | 12 | 16. | 20. | 24. |
10. | 15 | 20. | 25 | 30 |
12 | 18. | 24. | 30 | 36 |
- Construir um vetor o mesmo comprimento que
R
com1
em cada lugar onde o número correspondenteR
está na matriz externa do produto (∈
, inclusão do conjunto ou elemento de ou Epsilon operador), ou seja,0 0 1 0 1
- Lógica negação (não) valores no vetor (mudar zeros para um e outro para zeros) (
∼
, lógico não ou Tilde operador), ou seja,1 1 0 1 0
- Selecione os itens em
R
para o qual o elemento correspondente é1
(/
replicar operador), ou seja,2 3 5
(Observação, isso assume que a origem APL é 1, ou seja, os índices começam com 1. APL pode ser definido para usar 0 como origem, de modo que ι6
seja 0 1 2 3 4 5
, o que é conveniente para alguns cálculos.)
Classificando
A seguinte expressão classifica uma lista de palavras armazenada na matriz X de acordo com o comprimento da palavra:
XNão.⍋X+.≠';
Jogo da Vida
A seguinte função "life", escrita em Dyalog APL, pega uma matriz booleana e calcula a nova geração de acordo com o Game of Life de Conway. Ele demonstra o poder do APL para implementar um algoritmo complexo em muito pouco código, mas entendê-lo requer algum conhecimento avançado de APL (como o mesmo programa faria em muitos idiomas).
vida ← (⊃1 ⍵ ∨.∧ 3 4 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = +/ +⌿ ? 0 1 ..⊖ ? 0 1 ⌽" ?⍵?
Remoção de tags HTML
No exemplo a seguir, também Dyalog, a primeira linha atribui algum código HTML a uma variável txt
e então usa uma expressão APL para remover todas as tags HTML (explicação):
Txt← Isto é emphasized text.
' (⍵ Não. ~(⍵Executar⍵?⍵∊' '? TxtIsto é... o enfatizado texto.
Nomeando
APL deriva seu nome das iniciais do livro de Iverson A Programming Language, embora o livro descreva a notação matemática de Iverson, em vez da linguagem de programação implementada descrita neste artigo. O nome é usado apenas para implementações reais, começando com APL360.
Adin Falkoff cunhou o nome em 1966 durante a implementação do APL360 na IBM:
Enquanto eu andava pelo escritório os três alunos compartilharam, eu poderia ouvir sons de um argumento acontecendo. Eu coloquei minha cabeça na porta, e Eric me perguntou: "Não é verdade que todo mundo sabe que a notação que estamos usando é chamada APL?" Desculpa ter de o desiludir confessando que nunca tinha ouvido isso. Onde é que ele teve a ideia de que era bem conhecido? E quem decidiu chamar isso? Na verdade, porque é que tinha de ser chamado de alguma coisa? Pouco tempo depois ouvi como se chamava. Quando o esforço de implementação começou em junho de 1966, o esforço de documentação também começou. Suponho que quando eles tiveram que escrever sobre "ele", Falkoff e Iverson perceberam que eles teriam que dar "ele" um nome. Havia provavelmente muitas sugestões feitas na época, mas ouvi falar de apenas duas. Um grupo na SRA em Chicago que estava desenvolvendo materiais instrucionais usando a notação foi a favor do nome "Mathlab". Isto não aconteceu. Outra sugestão era chamá-lo de "Melhor Matemática de Iverson" e, em seguida, deixar as pessoas cunhar o acrônimo apropriado. Isto foi considerado de frente.
Então um dia Adin Falkoff entrou no escritório de Ken e escreveu "Uma Linguagem de Programação" no tabuleiro, e abaixo dele o acrônimo "APL". Assim nasceu. Foi apenas uma semana ou mais depois disso que Eric Iverson me fez sua pergunta, em um momento em que o nome ainda não tinha encontrado o seu caminho a treze milhas acima do Taconic Parkway da IBM Research para IBM Mohansic.
—Eugene McDonnell,
APL é ocasionalmente reinterpretado como Array Programming Language ou Array Processing Language, tornando APL em um backronym.
Logotipo
Sempre houve cooperação entre os fornecedores da APL, e conferências conjuntas foram realizadas regularmente de 1969 a 2010. Nessas conferências, mercadorias da APL eram frequentemente distribuídas, apresentando motivos da APL ou coleções de logotipos de fornecedores. Comum eram maçãs (como um trocadilho com a semelhança na pronúncia de apple e APL) e o trecho de código ⍺*⎕
que são os símbolos produzidos pelo layout clássico do teclado APL ao segurar a tecla modificadora APL e digitar "APL&# 34;.
Apesar de todos esses esforços da comunidade, não surgiu nenhum logotipo universal independente de fornecedor para a linguagem de programação. Como as linguagens de programação populares estabeleceram cada vez mais logotipos reconhecíveis, o Fortran recebendo um em 2020, a British APL Association lançou uma campanha no segundo semestre de 2021 para estabelecer esse logotipo para o APL e, após uma eleição da comunidade e várias rodadas de feedback, um logotipo foi escolhido em maio de 2022.
Usar
O APL é usado para muitas finalidades, incluindo aplicações financeiras e de seguros, inteligência artificial, redes neurais e robótica. Tem sido argumentado que APL é uma ferramenta de cálculo e não uma linguagem de programação; sua natureza simbólica e recursos de matriz o tornaram popular entre especialistas de domínio e cientistas de dados que não possuem ou exigem as habilidades de um programador de computador.
O APL é adequado para manipulação de imagens e animação por computador, onde as transformações gráficas podem ser codificadas como multiplicações de matrizes. Uma das primeiras empresas de computação gráfica comercial, a Digital Effects, produziu um produto gráfico APL chamado Visions, que foi usado para criar comerciais de televisão e animação para o filme de 1982 Tron. Ultimamente, o simulador de navegação Stormwind usa APL para implementar sua lógica central, sua interface com o middleware do pipeline de renderização e uma parte importante de seu mecanismo de física.
Atualmente, o APL permanece em uso em uma ampla gama de aplicações comerciais e científicas, por exemplo Gestão de Investimentos, gestão de ativos, assistência médica, e perfil de DNA, e por amadores.
Implementações notáveis
APL360
A primeira implementação de APL usando símbolos APL reconhecíveis foi APL360, que rodava no IBM System/360 e foi concluída em novembro de 1966, embora naquela época permanecesse em uso apenas na IBM. Em 1973, seus implementadores, Larry Breed, Dick Lathwell e Roger Moore, receberam o Prêmio Grace Murray Hopper da Association for Computing Machinery (ACM). Foi concedido "por seu trabalho no projeto e implementação do APL360, estabelecendo novos padrões de simplicidade, eficiência, confiabilidade e tempo de resposta para sistemas interativos."
Em 1975, o microcomputador IBM 5100 oferecia APL360 como uma das duas linguagens interpretadas baseadas em ROM integradas para o computador, completas com um teclado e uma tela que suportavam todos os símbolos especiais usados na linguagem.
Desenvolvimentos significativos para APL360 incluíram CMS/APL, que fez uso dos recursos de armazenamento virtual de CMS e APLSV, que introduziram variáveis compartilhadas, variáveis de sistema e funções de sistema. Posteriormente, foi portado para as plataformas IBM System/370 e VSPC até seu lançamento final em 1983, após o qual foi substituído pelo APL2.
APL1130
Em 1968, o APL1130 tornou-se o primeiro sistema APL publicamente disponível, criado pela IBM para o IBM 1130. Tornou-se o software IBM Type-III Library mais popular lançado pela IBM.
APL*Plus e Sharp APL
APL*Plus e Sharp APL são versões do APL360 com extensões de negócios adicionadas, como formatação de dados e recursos para armazenar matrizes APL em arquivos externos. Eles foram desenvolvidos em conjunto por duas empresas, empregando vários membros da equipe de desenvolvimento original do IBM APL360.
As duas empresas eram a I. P. Sharp Associates (IPSA), uma empresa de serviços APL360 formada em 1964 por Ian Sharp, Roger Moore e outros, e a STSC, uma empresa de serviços de consultoria e compartilhamento de tempo formada em 1969 por Lawrence Breed e outros. Juntos, os dois desenvolveram o APL*Plus e, posteriormente, continuaram a trabalhar juntos, mas desenvolveram o APL separadamente como APL*Plus e Sharp APL. A STSC portou o APL*Plus para muitas plataformas com versões feitas para VAX 11, PC e UNIX, enquanto a IPSA adotou uma abordagem diferente para a chegada do computador pessoal e disponibilizou o Sharp APL nesta plataforma usando hardware PC-XT/360 adicional. Em 1993, a Soliton Incorporated foi formada para dar suporte ao Sharp APL e desenvolveu o Sharp APL em SAX (Sharp APL para Unix). A partir de 2018, APL*Plus continua como APL2000 APL+Win.
Em 1985, Ian Sharp e Dan Dyer, do STSC, receberam em conjunto o Prêmio Kenneth E. Iverson por Contribuição Extraordinária para a APL.
APL2
O APL2 foi uma reimplementação significativa do APL pela IBM, que foi desenvolvido em 1971 e lançado pela primeira vez em 1984. Ele fornece muitas adições à linguagem, das quais a mais notável é o suporte a matrizes aninhadas (não retangulares). Toda a Equipe de Produtos e Serviços APL2 recebeu o Prêmio Iverson em 2007.
Em 2021, a IBM vendeu o APL2 para a Log-On Software, que desenvolveu e vendeu o produto como Log-On APL2.
APLGOL
Em 1972, o APLGOL foi lançado como uma versão experimental do APL que adicionava construções de linguagem de programação estruturada à estrutura da linguagem. Novas instruções foram adicionadas para controle interestadual, execução de instrução condicional e estruturação de instrução, bem como instruções para esclarecer a intenção do algoritmo. Foi implementado para a Hewlett-Packard em 1977.
Dialog APL
Dyalog APL foi lançado pela empresa britânica Dyalog Ltd. em 1983 e, a partir de 2018, está disponível para plataformas AIX, Linux (incluindo no Raspberry Pi), macOS e Microsoft Windows. É baseado em APL2, com extensões para suportar programação orientada a objetos, programação funcional e programação tácita. As licenças são gratuitas para uso pessoal/não comercial.
Em 1995, dois membros da equipe de desenvolvimento – John Scholes e Peter Donnelly – receberam o Prêmio Iverson por seu trabalho no intérprete. Gitte Christensen e Morten Kromberg foram os ganhadores do Prêmio Iverson em 2016.
NARS2000
NARS2000 é um interpretador de APL de código aberto escrito por Bob Smith, um proeminente desenvolvedor e implementador de APL da STSC nas décadas de 1970 e 1980. O NARS2000 contém recursos avançados e novos tipos de dados e é executado nativamente no Microsoft Windows e em outras plataformas do Wine. É nomeado após uma ferramenta de desenvolvimento da década de 1980, NARS (Nested Arrays Research System).
APLX
APLX é um dialeto de plataforma cruzada de APL, baseado em APL2 e com várias extensões, que foi lançado pela empresa britânica MicroAPL em 2002. Embora não esteja mais em desenvolvimento ou à venda comercial, agora está disponível gratuitamente na Dyalog.
York APL
York APL foi desenvolvido na York University, Ontário por volta de 1968, rodando em mainframes IBM 360. Uma diferença notável entre ele e o APL360 era que ele definia a "forma" (ρ) de um escalar como 1 enquanto APL360 o definiu como o 0 mais matematicamente correto — isso facilitou a escrita de funções que agiam da mesma forma com escalares e vetores.
GNU APL
GNU APL é uma implementação livre de Extended APL conforme especificado na ISO/IEC 13751:2001 e é, portanto, uma implementação de APL2. Ele é executado no Linux (incluindo no Raspberry Pi), macOS, vários dialetos BSD e no Windows (usando Cygwin para suporte total de todas as funções do sistema ou como um binário nativo do Windows de 64 bits com algumas de suas funções do sistema ausentes). GNU APL usa Unicode internamente e pode ser script. Foi escrito por Jürgen Sauermann.
Richard Stallman, fundador do Projeto GNU, foi um dos primeiros a adotar o APL, usando-o para escrever um editor de texto quando era estudante do ensino médio no verão de 1969.
Interpretação e compilação de APL
APL é tradicionalmente uma linguagem interpretada, tendo características de linguagem como tipo de variável fraco, não adequado para compilação. No entanto, com arrays como sua estrutura de dados central, ele oferece oportunidades para ganhos de desempenho por meio de paralelismo, computação paralela, aplicativos massivamente paralelos e integração em escala muito grande (VLSI), e desde o início o APL foi considerado uma linguagem de alto desempenho - por exemplo, foi notado pela velocidade com que poderia executar operações complicadas de matriz "porque opera em matrizes e realiza operações como inversão de matriz internamente".
No entanto, o APL raramente é interpretado puramente e as técnicas de compilação ou compilação parcial que são ou foram usadas incluem o seguinte:
Reconhecimento de idioma
A maioria dos interpretadores de APL oferece suporte ao reconhecimento de idiomas e avalia idiomas comuns como operações únicas. Por exemplo, avaliando o idioma BV/⍳⍴A
como uma única operação (onde BV
é um vetor booleano e A
é uma matriz), a criação de duas matrizes intermediárias é evitada.
Bytecode otimizado
Digitação fraca em APL significa que um nome pode referenciar uma matriz (de qualquer tipo de dados), uma função ou um operador. Em geral, o interpretador não pode saber de antemão qual será o formato e deve, portanto, realizar análises, verificações de sintaxe etc. em tempo de execução. No entanto, em certas circunstâncias, é possível deduzir com antecedência que tipo um nome deve referenciar e, em seguida, gerar bytecode que pode ser executado com sobrecarga de tempo de execução reduzida. Esse bytecode também pode ser otimizado usando técnicas de compilação, como dobramento constante ou eliminação de subexpressão comum. O interpretador executará o bytecode quando presente e quando quaisquer suposições feitas forem atendidas. Dyalog APL inclui suporte para bytecode otimizado.
Compilação
A compilação de APL tem sido objeto de pesquisa e experimento desde que a linguagem se tornou disponível; o primeiro compilador é considerado o Burroughs APL-700, lançado por volta de 1971. Para poder compilar APL, limitações de linguagem devem ser impostas. APEX é um compilador APL de pesquisa que foi escrito por Robert Bernecky e está disponível sob a licença pública GNU.
O STSC APL Compiler é um híbrido de um otimizador de bytecode e um compilador - ele permite a compilação de funções para código de máquina desde que suas subfunções e globais sejam declaradas, mas o interpretador ainda é usado como uma biblioteca de tempo de execução e para executar funções que não atendem aos requisitos de compilação.
Padrões
O APL foi padronizado pelo grupo de trabalho X3J10 do American National Standards Institute (ANSI) e pela International Organization for Standardization (ISO) e pela International Electrotechnical Commission (IEC), ISO/IEC Joint Technical Committee 1 Subcommittee 22 Working Group 3. The Core A linguagem APL é especificada na ISO 8485:1989, e a linguagem APL Estendida é especificada na ISO/IEC 13751:2001.
Contenido relacionado
Código Baudot
André S. Tanenbaum
Erlang (linguagem de programação)