Conteúdo


As linguagens da IA

Comments

A evolução da inteligência artificial (AI) cresceu com a complexidade das linguagens disponíveis para desenvolvimento. Em 1959, Arthur Samuel desenvolveu um programa de autoaprendizado de xadrez na IBM em um computador IBM® 701 usando as instruções nativas da máquina (um grande feito dadas as árvores de busca e a poda alfa-beta). Mas atualmente, a AI é desenvolvida usando várias linguagens, de Lisp, passando por Python até R. Este artigo explora as linguagens que evoluíram para AI e aprendizado da máquina.

As linguagens de programação que são usadas para desenvolver aplicativos de AI e de aprendizado da máquina variam. Cada aplicativo tem suas próprias restrições e requisitos, e algumas linguagens são melhores do que outras em domínios de problemas específicos. Linguagens também têm sido criadas e têm evoluído com base nos requisitos de exclusividade dos aplicativos de AI.

Antes das linguagens de alto nível

No início da história da IA, as únicas linguagens existentes eram as linguagens nativas das próprias máquinas. Essas linguagens, chamadas de linguagem de máquina ou linguagem assembly, eram complicadas de usar porque operações simples eram as únicas operações existentes (por exemplo, mover um valor da memória para um registro, subtrair o conteúdo de um endereço de memória do acumulador). Da mesma forma, os tipos de dados da máquina eram os únicos tipos disponíveis e eles eram restritos. No entanto, mesmo antes das linguagens de alto nível aparecerem, aplicativos complexos de AI estavam sendo desenvolvidos.

Em 1956, um dos fundadores da AI, John McCarthy, criou um esquema de poda de busca em árvore chamado de poda alfa-beta. Esse trabalho ocorreu em um período em que muitos problemas de AI eram considerados problemas de busca e no qual ocorria uma atividade considerável de busca. O poder de memória e computação também era limitado, mas essa técnica permitiu que pesquisadores implementassem problemas mais complexos nos primeiros sistemas de computador com recursos limitados. A técnica de poda alfa-beta era aplicada nos primeiros aplicativos de AI voltados para jogos.

Também em 1956, Arthur Samuel desenvolveu um programa de jogo de xadrez em um computador IBM 701 usando a busca alfa-beta de McCarthy. Entretanto, o jogo de Samuel incluía um elemento vantajoso: em vez de ele mesmo jogar o programa de xadrez para ensinar o programa como jogar, Samuel introduziu a ideia de autoaprendizado e permitiu que o programa jogasse sozinho. Samuel desenvolveu seu programa no conjunto de instruções nativo do sistema IBM 701, o que foi um feito notável dada a complexidade de seu aplicativo e as instruções de baixo nível que ele tinha à disposição.

Eras de evolução da linguagem AI

A história da AI é cheia de períodos, alguns dos quais são muito detalhados. Eu reduzo a história recente da AI a três segmentos, com base na evolução de linguagens ocorrida. Esses segmentos são os anos iniciais (1954-1973), épocas turbulentas (1974-1993) e a era moderna (1994 até o presente).

Graphical time line showing the development of the major AI      languages by date, from 1960 to 2010
Graphical time line showing the development of the major AI languages by date, from 1960 to 2010

Os anos iniciais (1954-1973)

Os anos iniciais foram um período de descoberta—a introdução de novas máquinas e seus recursos e o desenvolvimento de linguagens de alto nível que puderam usar o poder dessas máquinas para uma ampla variedade de aplicativos.

Em 1958, um programa de xadrez chamado NSS (nomeado com as iniciais de seus criadores, Newell, Shaw e Simon) foi desenvolvido para o computador IBM 704. Esse programa via o xadrez em termos de busca e foi desenvolvido em Information Processing Language (IPL), também desenvolvida pelos criadores do NSS. A IPL foi a primeira linguagem a ser desenvolvida para o propósito de criação de aplicativos de AI. A IPL era uma linguagem de nível superior à linguagem de máquina, mas não necessariamente. No entanto, ela permitia que desenvolvedores usassem a linguagem em vários sistemas de computador.

A IPL introduziu inúmeros recursos que ainda são usados nos dias atuais, como listas, recursão, funções de ordem superior, símbolos e até mesmo geradores que poderiam mapear uma lista de elementos para uma função que iteraria e processaria a lista. A primeira versão da IPL nunca foi implementada, mas as versões subsequentes (2 a 6) foram implementadas e usadas em sistemas como o IBM 704, o IBM 650, o IBM 7090, entre outros. Outros aplicativos antigos de AI que foram desenvolvidos em IPL incluem o Logic Theorist e o General Problem Solver.

Apesar do sucesso da IPL e de sua ampla implementação nas arquiteturas de computadores da época, a IPL foi rapidamente substituída por uma linguagem de nível ainda mais superior que ainda é usada quase 60 anos depois: LISP. A sintaxe esotérica da IPL deu lugar ao LISP mais simples e escalável, mas a influência da IPL pode ser vista em seu homólogo posterior, particularmente seu foco em listas como um recurso de linguagem essencial.

LISP—o LISt Processor—foi criado por John McCarthy em 1958. O objetivo de McCarthy após o Dartmouth Summer Research Project sobre AI em 1956 era desenvolver uma linguagem para AI que fosse focada na plataforma IBM 704. O FORTRAN foi introduzido em 1957 na mesma plataforma e o trabalho na IBM estendeu o FORTRAN ao processamento de lista em uma linguagem chamada FORTRAN List Processing Language (FLPL). Essa linguagem foi usada com sucesso para o projeto de geometria plana da IBM, mas como uma extensão do FORTRAN, a FLPL carecia de alguns recursos-chaves.

A LISP foi uma linguagem de programação fundamental e implementou muitas das principais ideias em Ciência da Computação, como a coleta de lixo, árvores, digitação dinâmica, recursão e funções de ordem superior. A LISP não somente representou dados como listas, mas também definiu o próprio código-fonte como listas. Esse recurso tornou possível para a LISP manipular dados, bem como o código LISP em si. A LISP também é extensível, permitindo que programadores criem nova sintaxe ou até mesmo que novas linguagens (chamadas linguagens específicas de domínio) sejam integradas na LISP.

O exemplo a seguir ilustra uma função da LISP para calcular os fatoriais de um número. No snippet, observe o uso da recursão para calcular o fatorial (chamando o fatorial dentro da função fatorial). Essa função podia ser chamada com (factorial 9).

(defun factorial (n)
   (if (= n 0) 1
       (* n (factorial (- n 1)))))

Em 1968, Terry Winograd desenvolveu um programa revolucionário na LISP, chamado SHRDLU, que podia interagir com um usuário em língua natural. O programa representava um mundo de blocos, e o usuário podia interagir com esse mundo, instruindo o programa a consultar e interagir com o mundo usando instruções como "pegue o bloco vermelho" ou "uma pirâmide pode ser suportada por um bloco?" Essa demonstração de entendimento e planejamento de língua natural dentro de um mundo de blocos baseado em princípios físicos simples criou um otimismo considerável para a AI e a linguagem LISP.

Épocas turbulentas (1974-1993)

As épocas turbulentas representam um período de instabilidade no desenvolvimento e no financiamento de aplicativos de AI. Essa era iniciou com o primeiro inverno da AI, em que os fundos desapareceram devido a uma falha em atender aos resultados esperados. Em 1980, sistemas especializados reavivaram a empolgação pela AI e seu financiamento (assim como ocorreram avanços nas arquiteturas conexionistas), mas por volta de 1987, a bolha da AI explodiu novamente, apesar dos avanços feitos durante esse período, o que levou ao segundo inverno da AI.

A LISP continuou sendo usada em uma variedade de aplicativos durante essa época e também foi disseminada com vários dialetos. A LISP continuou existindo como Common LISP, Scheme, Clojure e Racket. As ideias por trás da LISP continuaram avançando por meio dessas e outras linguagens fora do domínio funcional. A LISP continua trazendo potência ao sistema de álgebra do computador mais antigo, chamado Macsyma (Project MAC's SYmbolic MAnipulator). Desenvolvido no grupo de AI do Massachusetts Institute of Technology, esse ambiente de álgebra de computador é o antecessor de vários programas, como Mathematica, Maple e muitos outros.

Outras linguagens começaram a aparecer nesse período, não necessariamente focadas na AI, mas impulsionando seu desenvolvimento. A linguagem C foi projetada como uma linguagem de sistema para sistemas UNIX, mas rapidamente cresceu como uma das linguagens mais populares (com suas variantes, como C++), de sistemas para desenvolvimento de dispositivo integrado.

Nesse período, foi desenvolvida na França uma linguagem chave chamada Prolog (Programming in Logic). Essa linguagem implementava um subconjunto de lógica chamado cláusulas Horn e permitia que informações fossem representadas por fatos e regras e permitissem que consultas fossem executadas sobre essas relações. O exemplo simples de Prolog a seguir ilustra a definição de um fato (Sócrates é um homem) e uma regra que define que, se alguém é um homem, ele também é mortal:

man( socrates ).                    // Fact: Socrates is a man.
mortal( X ) :- man( X ).            // Rule: All men are mortal.

O Prolog continua sendo usado em várias áreas e possui diversas variantes que incorporam recursos, tais como a orientação por objeto, a capacidade de compilar em código de máquina nativo e a criação de interfaces para linguagens populares (como C).

Uma das principais aplicações do Prolog nesse período era no desenvolvimento de sistemas especializados (também chamados de sistemas de produção). Esses sistemas suportavam a codificação do conhecimento em fatos e, então, regras eram usadas para raciocinar essas informações. O problema com esses sistemas é que eles tendiam a ser frágeis e a manutenção do conhecimento dentro do sistema era complicada e propensa a erros.

Um exemplo de sistema especializado era o eXpert CONfigurer (XCON), usado para configurar sistemas de computação. O XCON foi desenvolvido em 1978 em OPS5 (uma linguagem de sistema de produção escrita em LISP) que usava encadeamento direto para inferência. Em 1980, o XCON continha 2.500 regras, mas era muito caro para manter.

Prolog e LISP não foram as únicas linguagens usadas para desenvolver sistemas de produção. Em 1985, o C Language Integrated Production System (CLIPS) foi desenvolvido e é o sistema mais amplamente usado para desenvolver sistemas especializados. O CLIPS opera em um sistema de conhecimento de regras e fatos, mas é escrito em C e fornece uma interface para extensões C para desempenho.

A falha de sistemas especializados foi um fator que levou ao segundo inverno da AI. Sua promessa e a falta de entrega resultaram em reduções significativas no financiamento de pesquisas de AI. No entanto, surgiram novas abordagens desse inverno, como o renascimento das abordagens conexionistas, levando-nos à era moderna.

A era moderna (1994 até o presente)

A era moderna da AI trouxe uma perspectiva prática ao campo e o sucesso evidente na aplicação de métodos de AI em problemas reais, inclusive alguns problemas do início da história da AI. As linguagens de AI também mostraram uma tendência interessante. Enquanto novas linguagens eram aplicadas aos problemas de AI, os mecanismos potentes da AI (LISP e Prolog) continuavam encontrando aplicativos e sucesso. Essa era também viu o renascimento do conexionismo e novas abordagens para redes neurais, como o deep learning.

A explosão de dialetos da LISP resultou em uma unificação da LISP em uma nova linguagem chamada Common LISP, que tinha similaridades com os dialetos populares da época. Em 1994, o Common LISP foi ratificado como American National Standards Institute Standard X3.226-1994.

Diferentes linguagens de programação começaram a aparecer nesse período, algumas baseadas em novas ideias na Ciência da Computação, outras focadas nas principais características (como multiparadigma e facilidade de aprendizado). Uma linguagem importante que se encaixa nessa última categoria é Python. Python é uma linguagem interpretada de finalidade geral que inclui recursos de diversas linguagens (como recursos orientados a objetos e recursos funcionais inspirados pela LISP). O que torna o Python útil no desenvolvimento de aplicativos inteligentes são os vários módulos disponíveis fora da linguagem. Esses módulos cobrem aprendizado de máquina (scikit-learn, Numpy), língua natural, processamento de texto (NLTK) e diversas bibliotecas de rede neural que cobrem uma ampla variedade de topologias.

A linguagem R (e o ambiente de software no qual você a usa) segue o modelo Python. R é um ambiente de software livre para programação estatística e mineração de dados, desenvolvido na linguagem C . Como uma quantidade considerável do aprendizado de máquina moderno é estatístico por natureza, R é uma linguagem útil que cresceu em popularidade desde seu release estável em 2000. R inclui um grande conjunto de bibliotecas que cobrem várias técnicas; ele também inclui a capacidade de estender a linguagem com novos recursos.

A linguagem C continuou sendo relevante nesse período. Em 1996, a IBM desenvolveu o programa de xadrez mais rápido e inteligente do mundo, chamado Deep Blue. O Deep Blue era executado em um computador IBM RS/6000 de 32 nós com o sistema operacional IBM AIX® e era escrito em C. O Deep Blue era capaz de avaliar 200 milhões de posições por segundo. Em 1997, o Deep Blue se tornou a primeira AI de xadrez a derrotar um grande mestre enxadrista.

A IBM retornou aos jogos posteriormente nesse período, mas dessa vez menos estruturados do que o xadrez. O sistema de perguntas e respostas do IBM Watson® (chamado DeepQA) conseguia responder a perguntas feitas na língua natural. A base de conhecimento do IBM Watson foi preenchida com 200 milhões de páginas de informações, incluindo o website Wikipédia inteiro. Para analisar as questões de forma que o IBM Watson pudesse entender, a equipe da IBM usou o Prolog para analisar questões de língua natural em novos fatos que poderiam ser usados no pipeline do IBM Watson. Em 2011, o sistema competiu no jogo Jeopardy! e derrotou os vencedores anteriores do jogo.

Com um retorno às arquiteturas conexionistas, surgiram novos aplicativos para mudar o plano de fundo do processamento e do reconhecimento de imagem e vídeo. O deep learning (que estende redes neurais até arquiteturas em vários níveis) é usado para reconhecer objetos em imagens ou vídeos, fornecer descrições textuais de imagens ou vídeos com língua natural e até mesmo preparar o caminho para a condução automática de veículos em vias e a detecção de objetos em tempo real. Essas redes de deep learning tendem a ser tão grandes que arquiteturas computacionais tradicionais não conseguem processá-las de modo eficiente. Entretanto, com a introdução de unidades de processamento de gráficos (GPUs), essas redes agora podem ser aplicadas.

Para usar GPUs como aceleradores de rede neural, novas linguagens foram necessárias para juntar CPUs tradicionais e GPUs. Uma linguagem de padrão aberto chamada Open Computing Language (OpenCL) permite que programas semelhantes a C ou C++ sejam executados em GPUs (que consistem em milhares de elementos de processamento, mais simples do que CPUs tradicionais). O OpenCL permite o paralelismo de operações dentro de GPUs orquestradas por CPUs.

Indo além

Nos últimos 60 anos houve mudanças significativas nas arquiteturas computacionais, além de avanços nas técnicas de AI e em seus aplicativos. Nesses anos também houve uma evolução das linguagens, cada uma com seus próprios recursos e abordagens para resolução de problemas. Mas hoje, com a introdução de big data e de novas arquiteturas de processamento que incluem CPUs em cluster com arrays de GPUs, atingiu-se o estágio para um novo conjunto de inovações na AI e nas linguagens que a empoderam.


Recursos para download


Tema relacionado


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Cognitive computing
ArticleID=1056767
ArticleTitle=As linguagens da IA
publish-date=01192018