Você está na página 1de 276

PDF gerado usando o pacote de ferramentas em cdigo aberto mwlib. Veja http://code.pediapress.com/ para mais informaes.

PDF generated at: Fri, 16 May 2014 10:03:19 UTC


Histria das linguagens de
programao
Histria, conceitos e paradigmas
Contedo
Pginas
Histria das linguagens de programao
1
Histria das Linguagens de Programao 1
Pioneiros
7
Charles Babbage 7
Ada Lovelace 10
Herman Hollerith 13
Alan Turing 15
Alonzo Church 19
Konrad Zuse 21
Primeiros computadores
23
Z1 23
Z2 24
Z3 25
Z4 25
O Colossus 26
Harvard Mark I 27
ENIAC 27
EDVAC 29
os anos 40
31
Plankalkl 31
Os anos 1950 - As primeiras linguagens
34
Short Code 34
Sistema A-0 35
Personagem: John Backus 35
Speedcoding 37
Personagem: Grace Hopper 38
Flow-Matic 40
Fortran 41
COMTRAN 49
COMIT 49
ALGOL 58 50
FACT 50
Outros paradigmas nos anos 50
52
IPL 52
Personagem: John McCarthy 55
LISP 57
COMIT 63
RPG 64
Os anos 60 e o paradigma imperativo
66
COBOL 66
Personagem: Peter Naur 73
ALGOL 60 75
SNOBOL 75
CPL 76
BASIC 77
PL/I 85
BCPL 90
Icon 91
ALGOL 68 97
B 101
Outros paradigmas nos anos 60
106
APL 106
Simula 108
Logo 111
Os anos 70, a programao estruturada e a simplicidade
114
Personagem: Niklaus Wirth 114
Pascal 115
Personagem: Dennis Ritchie 121
Personagem: Ken Thompson 124
C 125
Ada 134
Outros paradigmas nos anos 70
140
BLISS 140
Forth 142
Smalltalk 143
Prolog 148
Scheme 160
ML 164
AWK 166
Os anos 80 e a orientao a objeto
171
Ada 171
Erlang 176
Modula 180
C++ 180
Common Lisp 194
Miranda 196
Eiffel 197
Perl 203
FL 209
Os anos 90 - linguagens multiparadigma
210
Dylan 210
Haskell 211
Python 218
Gdel 230
Lua 231
Java 237
PHP 244
Ruby 253
Os anos 2000
262
C 262
Clojure 262
Extenses orientadas aspectos
264
AspectJ 264
Referncias
Fontes e Editores da Pgina 266
Fontes, Licenas e Editores da Imagem 269
Licenas das pginas
Licena 271
1
Histria das linguagens de programao
Histria das Linguagens de Programao
Este artigo discute os principais desenvolvimentos na histria das linguagens de programao.
Antes de 1940
As linguagens de programao so anteriores ao advento do primeiro computador moderno. De incio as linguagens
eram apenas cdigos.
Durante um perodo de nove meses entre 1842-1843, Ada Lovelace traduziu as memrias do matemtico italiano
Luigi Menabrea sobre a a mais nova mquina proposta por Charles Babbage, a sua mquina analtica. Com o artigo,
ela anexou uma srie de anotaes que especificavam em completo detalhe um mtodo para calcular nmeros de
Bernoulli com a mquina, reconhecido por alguns historiadores como o primeiro programa de computador do
mundo. Mas alguns bigrafos debatem a medida de suas contribuies originais versus as de seu marido.
O tear de Jacquard, inventado em 1801, usava furos em cartes perfurados para representar os movimentos do brao
do tear ao realizar costuras, a fim de gerar padres decorativos automaticamente.
Herman Hollerith percebeu que poderia codificar a informao em cartes perfurados, quando ele observou que o
condutor de trens controlava a presena dos titulares dos bilhetes de trem com a posio dos furos no bilhete.
Hollerith, ento, comeou a codificar os dados do censo de 1890 em cartes perfurados.
Os primeiros cdigos para computador eram especializados segundo as aplicaes. Nas primeiras dcadas do sculo
XX, os clculos numricos eram baseados em nmeros decimais. Eventualmente, se percebeu que a lgica podia ser
representada com nmeros, to bem como com as palavras. Por exemplo, Alonzo Church foi capaz de expressar o
clculo lambda de uma maneira formalizada. A mquina de Turing era uma abstrao do funcionamento da mquina
de uma fita de marcao, por exemplo, em uso em empresas de telefonia. No entanto, ao contrrio do clculo
lambda, os cdigo elaborados por Turing no serviam como uma base para linguagens de alto nvel - a sua utilizao
principal era na anlise rigorosa da complexidade algortmica.
Como muitos "primeiros" na histria, a primeira linguagem de programao moderna difcil de ser identificada. No
incio, as restries do hardware definiam a linguagem. Cartes perfurados dispunham de at 80 colunas, mas
algumas das colunas tinham que ser usados para um nmero de seqncia de cada carto. Fortran inclua algumas
palavras-chave que eram as mesmas palavras em Ingls, como "IF" (se), "GOTO" (v para) e "CONTINUE"
(continue). O uso de um tambor magntico para a memria significava que os programas de computador tambm
tinham que ser intercalados com as rotaes do tambor. Assim, os programas eram mais dependentes do hardware do
que hoje.
Para algumas pessoas, a resposta depende de quanta energia e legibilidade humana so necessrias antes que o status
de "linguagem de programao" seja concedido. Os teares de Jacquard e a mquina diferencial de Charles Babbage,
ambos tinham linguagens simples e extremamente limitadas para descrever as aes que estas mquinas deviam
executar. Alguns podem at alegar que as perfuraes de cartes para pianos possam ser vistas como uma linguagem
de propsito especfico, embora no destinadas ao consumo humano.
Histria das Linguagens de Programao
2
Os anos 1940
Na dcada de 1940 os primeiros computadores eltricos, reconhecidamente modernos, foram criados. A velocidade
limitada capacidade da memria forava os programadores a escrever a mo economicamente programas em
linguagem de montagem (linguagem de mquina). Logo se descobriu que a programao em linguagem assembly
exigia um grande esforo intelectual e era muito sujeita a erros. Em 1948, Konrad Zuse
[1]
publicou um artigo sobre
a sua linguagem de programao Plankalkl. No entanto, esta no foi implementada em sua poca e suas
contribuies originais foram isoladas de outros desenvolvimentos.
Algumas linguagens importantes que foram desenvolvidas durante este perodo incluem:
1943 - Plankalkl (Konrad Zuse)
1943 - ENIAC coding system
1949 - C-10
Os anos 1950s e 1960s
Na dcada de 1950 as primeiras trs linguagens de programao modernas, cujos descendentes ainda esto em uso
difundido hoje foram concebidas:
FORTRAN (1954), a "FORmula TRANslator", inventada por John Backus e outros.;
LISP, a "LISt Processor", inventada por John McCarthy e outros.;
COBOL, a COmmon Business Oriented Language, criada pelo Short Range Committee, com grande influncia
de Grace Hopper.
Outro marco na dcada de 1950 foi a publicao, por um comit de cientistas americanos e europeus, de "uma nova
linguagem para os algoritmos", a ALGOL 60 atravs da publicao do relatrio "The ALGOL 60 Report (the
"ALGOrithmic Language")". Este relatrio consolidou muitas idias que circulavam na poca e apresentou duas
inovaes chave quanto ao projeto de linguagens:
Estrutura de blocos aninhados: pedaos significativos de cdigo poderiam ser agrupados em bloco de instrues,
sem ter que ser transformados em procedimentos separados e ser explicitamente chamados;
Escopo lxico: um bloco podia ter suas prprias variveis no acessveis fora do bloco, e muito menos
manipulveis de fora do bloco.
Outra inovao, relacionada a esta ltima, foi na forma como a linguagem foi descrita:
Uma notao matemtica exata, Backus-Naur (BNF), foi utilizada para descrever a sintaxe da linguagem. Quase
todas as linguagens de programao posteriores utilizaram uma variante da BNF para descrever a parte livre de
contexto de sua sintaxe.
Algol 60 foi particularmente influente na concepo das linguagens posteriores, algumas das quais logo se tornaram
mais populares. Os grandes sistemas da Burroughs foram projetados para serem programados em um subconjunto
estendido do Algol, a WFL (Work Flow Language).
Algumas ideias-chave da linguagem Algol foram tomadas, produzindo-se a linguagem ALGOL 68:
A sintaxe e semntica se tornaram ainda mais ortogonais, com rotinas annimas, um sistema recursivo de
digitao com funes de ordem superior, etc;
no somente a parte livre de contexto da linguagem, mas a sintaxe da linguagem completa e a semntica foram
definidos formalmente, em termos da gramtica de Van Wijngaarden, um formalismo desenvolvido
especificamente para esta finalidade.
Os recursos pouco utilizados de Algol 68 (por exemplo, blocos simultneos e paralelos) e seu complexo sistema de
atalhos sintticos e coeres de tipo automtico tornou a linguagem impopular entre os implementadores e ganhou a
reputao de ser difcil. Niklaus Wirth realmente saiu do comit de projeto para criar uma linguagem mais simples:
Pascal.
Histria das Linguagens de Programao
3
Panorama das duas dcadas:
1951 - Regional Assembly Language
1952 - Autocode
1954 - FORTRAN
1955 - FLOW-MATIC (antecessor do COBOL)
1957 - COMTRAN (antecessor do COBOL)
1958 - LISP
1958 - ALGOL 58
1959 - FACT (antecessor do COBOL)
1959 - COBOL
1962 - APL
1962 - Simula
1964 - BASIC
1964 - PL/I
1967-1978: estabelecendo os paradigmas fundamentais
O perodo compreendido entre o final dos anos 1960 dcada de 1970 trouxe um grande florescimento de
linguagens de programao. A maioria dos principais paradigmas de linguagem agora em uso foram inventados
durante este perodo:
Simula, inventada nos anos 1960 por Nygaard e Dahl como um super conujunto de Algol 60, foi a primeira
linguagem a suportar o conceito de classes.
C, uma das primeiras linguagens de programao de sistemas, foi desenvolvido por Dennis Ritchie e Ken
Thompson nos laboratrios da Bell entre 1969 e 1973.
Smalltalk (meados de 1970) forneceu uma base completa para o projeto de uma linguagem orientada a objetos.
Prolog, projetada em 1972 por Colmerauer, Roussel, e Kowalski, foi a primeira linguagem de programao do
paradigma lgico.
ML built a polymorphic type system (inventada por Robin Milner em 1973) uma linguagem funcional, baseada
em Lisp, estaticamente tipada.
Cada uma dessas lnguas gerou toda uma famlia de descendentes, e linguagens mais modernas contam, pelo menos,
com uma delas em sua ascendncia.
A dcada de 1960 e 1970 tambm viu um considervel debate sobre os mritos da "programao estruturada", que,
entre outros aspectos,envolvia a programao sem o uso de Goto. Este debate foi estreitamente relacionado com
projeto de linguagem: algumas linguagens no incluram o comando GOTO, ou o desestimularam, o que obrigou o
programador a utilizar a programao estruturada. Apesar de o debate ter ficado quente na poca, quase todos os
programadores agora concordam que, mesmo em linguagens que fornecem um comando de desvio incondicional
como o GOTO, um mau estilo de programao us-lo, exceto em raras circunstncias. Como resultado, as geraes
posteriores de projetistas da linguagem consideram o debate em torno da programao estruturada tedioso e at
desconcertante.
Algumas linguagens importantes que foram desenvolvidas durante este perodo incluem:
1970 - Pascal
1970 - Forth
1972 - C
1972 - Smalltalk
1972 - Prolog
1973 - ML
Histria das Linguagens de Programao
4
1978 - SQL (inicialmente apenas uma linguagem de consulta, mais tarde estendido com construes de
programao)
Os anos 1980: consolidao, mdulos, performance
Os anos 1980 foram anos de relativa consolidao. C++ combinou orientao a objetos e programao de sistemas.
O governo dos Estados Unidos padronizou a Ada, uma linguagem de programao de sistemas destinados
utilizao por parte dos contratantes de defesa. No Japo e em outros lugares, vastas somas foram gastas
investigando as chamadas linguagens de programao de quinta gerao que incorporavam a programao lgica em
suas construes. A comunidade de linguagens funcionais se dedicou a padronizar a ML e o Lisp. Ao invs de
inventar novos paradigmas, todos estes esforos visaram aperfeioar as idias inventadas na dcada anterior.
No entanto, uma tendncia nova e importante na concepo de linguagens foi o aumento do foco na programao de
sistemas de larga escala com o uso de mdulos, ou em unidades organizacionais de cdigo de larga-escala. As
linguagens Modula, Ada e ML desenvolveram notveis sistemas de mdulos na dcada de 1980. Sistemas modulares
muitas vezes eram associados com a programao genrica construes --- genricas vindo a ser, em essncia,
mdulos parametrizados.
Embora os principais paradigmas novos para as linguagens de programao no tivessem aparecido, muitos
pesquisadores expandiram as idias das linguagens existentes adaptando-os para novos contextos. Por exemplo, as
linguagens dos sistemas Argus e Emerald adaptaram a programao orientada a objeto para os seus sistemas
distribuidos.
A dcada de 1980 tambm trouxe avanos na implementao das linguagens de programao. O movimento RISC,
em arquitetura de computadores postulou que o hardware deveria ser concebido para os compiladores ao invs de ser
voltado a programadores assembly. Ajudado por melhorias na velocidade dos processadores que permitiu cada vez
mais tcnicas agressivas de compilao, o movimento RISC despertou maior interesse na tecnologia de compilao
para linguagens de alto nvel.
A tecnologia de linguagens continuou ao longo destas linhas durante a dcada de 1990.
Algumas linguagens importantes que foram desenvolvidas durante este perodo incluem:
1983 - Ada
1983 - C++
1985 - Eiffel
1987 - Perl
1989 - FL (Backus)
Os anos 1990's: A Era da Internet
A dcada de 1990 no viu nenhuma novidade fundamental, mas a recombinao e maturao das idias antigas. Uma
filosofia de grande importncia era a produtividade do programador. Muitas linguagens com "aplicaes de
desenvolvimento rpido" (RAD) surgiram, geralmente vindo com um IDE, coleta de lixo, e eram descendentes de
linguagens mais antigas. Todas essas linguagens foram orientadas a objeto. Entre estas estavam a Object Pascal,
Visual Basic, e C#. Java era uma linguagem mais conservadora, que tambm incluiu a coleta de lixo e recebeu muita
ateno. Mais radicais e inovadoras do que as lnguas RAD foram as novas linguagens de scripting. Estas no
descenderam diretamente das outras linguagens e contaram com sintaxes novas e incorporao mais liberal de novas
funcionalidades. Muitos consideram essas linguagens de scripting mais produtivas do que at mesmo as linguagens
RAD, mas muitas vezes, por causa da facilidade com que pequenos programas podem ser escritos e mantidos. No
entanto, linguagens de scripting vieram a ser mais proeminentes usadas em conexo com a web.
Algumas linguagens importantes que foram desenvolvidas durante este perodo incluem:
1990 - Haskell
Histria das Linguagens de Programao
5
1991 - Python
1991 - Java
1993 - Ruby
1993 - Lua
1994 - ANSI Common Lisp
1995 - JavaScript
1995 - PHP
2000 - C#
2008 - JavaFX Script
Tendncias Atuais
A evoluo das linguagens de programao continua, tanto na indstria quanto na pesquisa. Algumas das tendncias
atuais incluem:
Mecanismos para a adio de segurana e verificao da confiabilidade para a linguagem: verificao esttica
prolongada, controle de fluxo de informao, esttico segurana em threads.
Mecanismos alternativos de modularidade: mixin s, Delegao de programao, programao orientada a
aspectos.
Desenvolvimento de software orientado a componentes.
Metaprogramao, Reflexo ou acesso a rvores de sintaxe abstratas.
Maior nfase na distribuio e mobilidade.
Integrao com bases de dados, incluindo XML e bancos de dados relacionais.
Suporte para Unicode de forma que o cdigo-fonte no esteja restrito aos caracteres contidos no cdigo ASCII;
permitindo, por exemplo, o uso de scripts no latinos ou pontuao estendida.
XML para a interfaces grficas (XUL, XAML).
Pessoas de destaque na histria das linguagens de programao
John Backus, inventor do Fortran.
John McCarthy, inventor do LISP.
Alan Cooper, desenvolveu o Visual Basic.
Edsger W. Dijkstra, desenvolveu o framework de programao adequada.
James Gosling, desenvolveu a linguagem Oak, precursora do Java.
Anders Hejlsberg, desenvolveu o Turbo Pascal e o C#.
Grace Hopper, desenvolveu o Flow-Matic, influenciando o COBOL.
Kenneth E. Iverson, desenvolveu o APL.
Bill Joy, inventor do vi, um dos primeiros autores do BSD Unix, e criador do SunOS, que veio a se tornar o
sistema operacional Solaris.
Alan Kay, Pioneiro da programao orientada a objeto, e autor do Smalltalk.
Brian Kernighan, co-autor do primeiro livro sobre a linguagem C junto com Dennis Ritchie, co-autor das
linguagens AWK e AMPL.
John von Neumann, autor do conceito de Sistema Operacional.
Dennis Ritchie, inventor do C.
Bjarne Stroustrup, desenvolveu o C++.
Ken Thompson, inventor do Unix.
Niklaus Wirth inventor do Pascal e Modula.
Rasmus Lerdorf criador da linguagem PHP.
[1] Konrad Zuze (http:/ / www-history. mcs.st-andrews. ac.uk/ history/ Mathematicians/ Zuse. html)
Histria das Linguagens de Programao
6
Bibliografia
CAMPBELL-KELLY, Martin. From Airline Reservations to Sonic the Hedgehog: A History of the Software
Industry. Cambridge, Massachusetts:The MIT Press, 2003.372 p. ISBN 0-262-03303-8
CERUZZI, Paul E.. A History of Modern Computing. Cambridge, Massachusetts:The MIT Press, 1998.398 p.
ISBN 0-262-03255-4
CORTADA, James W.. A Bibliografic Guide to the History of Computing, Computers, and the Information
Processing Industry. New York:Greenwood Press, 1990.644 p. ISBN 0-313-26810-X
IFRAH, Georges. The Universal History of Computing. New York:John Wiley and Sons, 2001.410 p. ISBN
0-471-39671-0
METROPOLIS, N.; HOWLETT, J; ROTA, Gian-Carlo(editores). A History of Computing in the Twentieth
Century. New York:Academic Press, 1980.659 p. ISBN 0-12-491650-3
ORGANICK, E. I.;FORSYTHE, A. I.;PLUMMER, R. P.. Programming Language Structures. New
York:Academic Press, 1978.659 p. ISBN 0-12-528260-5
SAMMET, Jean E. Programming Languages: History and Fundamentals. Englewood Cliffs, New
Jersey:Prentice Hall, 1969.785 p. ISBN 0-13-729988-5
WEXELBLAT, Richard L.(Editor). History of Programming Languages. New York:Academic Press, 1981.758
p. ISBN 0-12-745040-8
Ligaes externas
The History of Programming Languages (http:/ / hopl. murdoch. edu. au) by Diarmuid Pigott
History and evolution of programming languages (http:/ / www. scriptol. com/ programming/ history. php).
The Evolution of Programming Languages (http:/ / www. ulb. ac. be/ di/ rwuyts/ INFO020_2003/
grogono-evolution. pdf) by Peter Grogono. PDF.
Graph of programming language history (http:/ / www. levenez. com/ lang/ history. html)
7
Pioneiros
Charles Babbage
Charles Babbage
Cincia da computao, matemtica
Charles Babbage em 1860
Nacionalidade Britnico
Nascimento 26 de Dezembro de 1791
Local Londres
Morte 18 de Outubro de 1871(79anos)
Local Londres
Atividade
Campo(s) Cincia da computao, matemtica
Instituies Trinity College (Cambridge)
Prmio(s) Medalha de Ouro da RAS (1824)
Assinatura
Charles Babbage (Londres, 26 de Dezembro de 1791 Londres, 18 de Outubro de 1871) foi um cientista,
matemtico, filsofo, engenheiro mecnico e inventor ingls nascido em Teignmouth, Devon que originou o
conceito de um computador programvel.
Charles Babbage mais conhecido e, de certa forma, referenciado como o inventor que projetou o primeiro
computador de uso geral, utilizando apenas partes mecnicas, a mquina analtica. Ele considerado o pioneiro e pai
da computao. Seu invento, porm, exigia tcnicas bastante avanadas e caras na poca, e nunca foi construdo. Sua
Charles Babbage
8
inveno tambm no era conhecida dos criadores do computador moderno.
Mais recentemente, entre 1985 e 1991, o Museu de Cincia de Londres construiu outra de suas invenes
inacabadas, a mquina diferencial 2, usando apenas tcnicas disponveis na poca de Babbage.
Nascimento
O local de nascimento de Babbage controverso, mas ele provavelmente nasceu na Inglaterra, mais precisamente no
endereo 44 Crosby Row, Walworth Road, em Londres, Inglaterra.
H uma pequena discrepncia, provinda de trs fontes, sobre a data de nascimento de Babbage. A primeira,
publicada no obturio do The Times aponta 26 de Dezembro de 1792. Entretanto, dias mais tarde, um sobrinho de
Babbage escreveu dizendo que seu tio havia nascido precisamente um ano antes, em 1791. O registro paroquial de
'St. Mary's Newington', Londres, mostra Babbage sendo batizado em 06 de janeiro de 1792, apoiando um ano de
nascimento de 1791.
O pai de Babbage, Benjamin Babbage, foi um banqueiro, scio do Praeds, de 'Bitton Estate', em Teignmouth. Sua
me era Betsy Plumleigh Babbage. Em 1808, a famlia Babbage mudou-se para a antiga 'Rowdens house', a leste de
Teignmouth, e Benjamin Babbage tornou-se administrador das proximidades da igreja de St. Michael.
Educao
The Illustrated London News (4 de novembro de
1871).
O dinheiro de seu pai permitiu que Babbage recebesse instruo de
diversas escolas e tutores durante o curso de seu ensino fundamental.
Com cerca de oito anos de idade foi enviado para uma escola de campo
em Alphington, Devon perto de Exeter para se recuperar de uma febre
com risco de vida. Seus pais ordenaram que a "no era para se exigir
demais de seu crebro" e Babbage sentiu que "esta grande ociosidade
pode ter levado alguns dos meus raciocnios infantis". Por um tempo
curto ele frequentou o King Edward VI Community College em Totnes,
South Devon, mas sua sade forou ele de volta para professores
particulares por um tempo. Ele ento se juntou a 30 alunos da
academia Holmwood, em Baker Street, Enfield, Middlesex sob o
reverendo Stephen Freeman. A academia tinha uma biblioteca bem
abastecida que levou Babbage ao amor pela matemtica. Ele estudou
com mais dois tutores privados depois de sair da academia.
Charles Babbage estudou no Trinity College, em Cambridge, onde
depois lecionou matemtica. Ele tinha lido extensivamente Leibniz,
Joseph Louis Lagrange, Thomas Simpson, e Lacroix e ficou seriamente decepcionado com o ensino da matemtica
disponvel em Cambridge. Em resposta, ele, John Herschel, George Peacock, e vrios outros amigos formaram a
Analytical Society do Trinity College, em Cambridge em 1812. Babbage, Herschel e Peacock tambm eram amigos
ntimos do futuro juiz e patrono da cincia Sir Edward Ryan. Babbage e Ryan casaram com duas irms. Como
estudante, Babbage foi tambm membro de outras sociedades, como o the Ghost Club, preocupado com a
investigao de fenmenos sobrenaturais, e do the Extractors Club, dedicado a libertar seus membros do hospcio,
caso algum dos membros fosse parar l.
Em 1812 Babbage transferido para Peterhouse, Cambridge. Ele foi um dos melhores matemticos em Peterhouse,
mas no se formou com honras. Ao invs disso, recebeu um diploma honorrio sem exame em 1814.
Eleito membro da Royal Society of London (1816), recebeu uma bolsa do governo para projectar uma calculadora
com capacidade para at a vigsima casa decimal (1823).
Charles Babbage
9
Enquanto desenvolvia sua mquina era professor de matemtica na University of Cambridge (1828-1839).
Apresentou sua mquina analtica em 1833, tendo sido considerada o ponto de partida para os modernos
computadores eletrnicos.
Publicou diversos artigos sobre matemtica, estatstica, fsica e geologia. Tambm colaborou para a modernizao do
sistema de cdigo postal ingls, alm de ser o primeiro matemtico que conseguiu colocar em desuso a cifra de
Vigenre, utilizando mtodos de cripto-anlise (anlise de frequncia).
Casamento, famlia, morte
Tmulo de Charles Babbage no Cemitrio de
Kensal Green
Em 25 de Julho de 1814, Babbage se casou com Georgiana Whitmore,
na Igreja de St. Michael em Teignmouth, Devon. O casal viveu em
Dudmaston Hall, Shropshire (onde Babbage projetou o sistema de
aquecimento central), antes de passar a morar no nmero 5 da rua
Devonshire Street, em Portland Place, Londres.
Charles e Georgiana tiveram oito filhos, mas apenas quatro - Benjamin
Babbage Herschel, Georgiana Whitmore, Dugald Bromhead Babbage e
Henry Prevost - sobreviveram infncia. A esposa de Charles,
Georgiana, morreu em Worcester em 1 de setembro de 1827, mesmo
ano em que seu pai, seu segundo filho (tambm chamado Charles) e
seu filho recm-nascido Alexander morreram. Sua deciso posterior para passar um ano viajando no continente
registou uma atraso na construo de suas mquinas.
Charles Babbage morreu aos 79 anos em 18 de Outubro de 1871, e foi sepultado em Londres no Cemitrio de Kensal
Green. Segundo Horsley, Babbage morreu "de insuficincia renal, secundria cistite".
[1]
Em 1983, o relatrio da
autpsia para Charles Babbage foi descoberto e publicado mais tarde por seu trineto.
[2]
Uma cpia do original
tambm est disponvel.
[1] [1] ( necessrio ser assinante para ler).
[2] [2] ( necessrio ser assinante para ler)
Ada Lovelace
10
Ada Lovelace
Ada Lovelace
Nacionalidade Londres, Inglaterra
Reino Unido
Nascimento 10 de dezembro de 1815
Local Londres, Inglaterra
Reino Unido
Morte 27 de novembro de 1852(36anos)
Local Londres, Inglaterra
Reino Unido
Conhecido(a) por ser a primeira programadora de computadores da histria
Ada Augusta Byron King, Condessa de Lovelace (10 de Dezembro de 1815 - 27 de Novembro de 1852),
atualmente conhecida como Ada Lovelace, foi uma matemtica e escritora inglesa e hoje principalmente
reconhecida por ter escrito o primeiro algoritmo para ser processado por uma mquina, a mquina analtica de
Charles Babbage.
[1]
. Durante o perodo em que esteve envolvida com o projeto de Babbage, ela desenvolveu os
algoritmos que permitiriam mquina computar os valores de funes matemticas, alm de publicar uma coleo
de notas sobre a mquina analtica. Por esse trabalho considerada a primeira programadora de toda a histria..
Lovelace nasceu em 10 de dezembro de 1815 e a nica filha legtima do poeta Lord Byron e sua esposa Anne
Isabella "Anabella" Byron
[2][3]
. Todos os outros filhos de Lorde Byron nasceram fora do casamento.
[4]
Byron se
separou da esposa um ms depois do nascimento de Ada e deixou a Inglaterra para sempre , quatro meses depois.
Acabou morrendo doente durante a Guerra da Independncia Grega, quando Ada tinha oito anos de idade. A me de
Ada promoveu o interesse de Ada em matemtica e lgica , em um esforo para impedi-la de se desenvolver o que
ela via como a insanidade de Lord Byron, mas Ada permaneceu interessada em seu pai e, a seu pedido, foi enterrada
ao lado dele quando morreu.
Na juventude seus talentos matemticos levaram-a a uma relao de trabalho e de amizade com o colega matemtico
britnico Charles Babbage e, em particular, o trabalho de Babbage sobre a Mquina Analtica . Entre 1842 e 1843,
ela traduziu um artigo do engenheiro militar italiano Luigi Menabrea
[5]
sobre o motor, e complementou com um
Ada Lovelace
11
conjunto de sua prpria autoria, que ela chamou de Anotaes. Essas notas, contm um algoritmo criado para ser
processado por mquinas, o que muitos consideram ser o primeiro programa de computador. Ela tambm
desenvolveu uma viso sobre a capacidade dos computadores de irem alm do mero clculo ou processamento de
nmeros, enquanto outros , incluindo o prprio Babbage , focavam apenas nessas capacidades.
[6]
Sua mentalidade
da "cincia potica"
[7]
a levou a fazer perguntas sobre a Mquina Analtica (como mostrado em suas notas ) e a
examinar como os indivduos e a sociedade se relacionam com a tecnologia como uma ferramenta de colaborao.
[8]
Histria
Infncia
Ada Lovelace nasceu Augusta Ada Byron em 10 de dezembro de 1815, em Londres, na Inglaterra. Filha do poeta
George Gordon Byron, 6 Baro Byron, e de Anne Isabella "Annabella" Milbanke, Baronesa Byron
[9]
. George
Byron esperava ser pai de um menino e ficou desapontado quando sua esposa deu luz uma menina.
[10]
Augusta
recebeu esse nome por causa da meia-irm de Byron, Augusta Leigh, e foi chamada de" Ada "pelo prprio George.
[11]
Em 16 de Janeiro 1816, Annabella, a pedido de George, se mudou para a casa de seus pais em Kirkby Mallory
levando Ada com ela, que na poca tinha apenas um ms de idade.
[12]
Embora a lei Inglesa desse ao pai a custdia
total de seus filhos em caso de separao, Byron no fez nenhuma tentativa de reivindicar seus direitos 12], mas
pediu para que sua irm o mantesse informado sobre o bem-estar de Ada.
[13]
Em 21 de abril, Byron assinou a
escritura de separao, com muita relutncia, e deixou a Inglaterra para sempre alguns dias depois.
[14]
Alm de no
aceitar bem a separao amarga, Annabella fez acusaes sobre o comportamento imoral de Byron, durante toda sua
vida.
[15]
Este conjunto de eventos deixaram Ada famosa na sociedade vitoriana. Byron no tinha um relacionamento
com sua filha, e nunca mais a viu. Ele morreu em 1824, quando ela tinha oito anos. Sua me era a nica figura
parental significativa em sua vida.
[16]
Ada no foi autorizado a ver qualquer retrato de seu pai at seu vigsimo
aniversrio.
[17]
Sua me se tornou Baronesa Wentworth em 1856.
Primeiro programa de computador
Em 1842 Charles Babbage foi convidado a ministrar um seminrio na Universidade de Turim sobre sua mquina
analtica. Luigi Menabrea, um jovem engenheiro italiano e futuro Primeiro-ministro da Itlia, publicou a palestra de
Babbage em francs e esta transcrio foi posteriormente publicada na Bibliothque universelle de Genve, em 1842.
Babbage pediu a Ada para traduzir o artigo de Menabrea para o ingls, adicionando depois a traduo com as
anotaes que ela mesma havia feito. Ada levou grande parte do ano nesta tarefa. Estas notas, que so mais extensas
que o artigo de Menabrea, foram ento publicados no The Ladies' Diary e no Memorial Cientfico de Taylor sob as
iniciais "AAL".
Em 1953, mais de cem anos depois de sua morte, as notas de Ada sobre a mquina analtica de Babbage foram
republicadas. A mquina foi reconhecida como um primeiro modelo de computador e as notas de Ada como a
descrio de um computador e um software.
Ada Lovelace
12
Uma ilustrao inspirada pelo retrato criado por
Alfred Edward Chalon para a en:Ada Initiative,
que apia tecnologias abertas e mulheres
As notas de Ada foram classificadas alfabeticamente de A a G. Na nota
G ela descreve o algoritmo para a mquina analtica computar a
Sequncia de Bernoulli. considerado o primeiro algoritmo
especificamente criado para ser implementado num computador, e Ada
recorrentemente citada como a primeira pessoa programadora por
esta razo. No entanto, a mquina no foi construda durante o tempo
de vida da Condessa de Lovelace.
[1] J. Fuegi and J. Francis, "Lovelace & Babbage and the creation of the 1843 'notes'".
IEEE Annals of the History of Computing 25 No.4 (OctoberDecember 2003):
1626. Digital Object Identifier (http:/ / dx.doi.org/ 10. 1109/ MAHC. 2003.
1253887)
[2] https:/ / en. wikipedia.org/ wiki/ Anne_Isabella_Byron,_Baroness_Byron
[3] Ada Lovelace Biography, biography.com
[4] Toole, Betty Alexandra (1987), "Poetical Science", The Byron Journal 15: 5565.
[5] https:/ / en. wikipedia.org/ wiki/ Frederico_Luigi,_Conte_Menabrea
[6] Fuegi & Francis 2003, pp. 19, 25
[7] Toole 1998, pp. 234235
[8] Toole, Betty Alexandra (1987), "Poetical Science",The Byron Journal 15: 5565.
[9] [9] Stein 1985, p. 14
[10] [10] Turney 1972, p. 35.
[11] [11] Stein 1985, p. 17.
[12] [12] Turney 1972, p. 35
[13]
Woolley 1999, p. 80
[14] Turney 1972, pp. 3638.
[15] Woolley 1999, pp. 7477
[16] [16] Turney 1972, p. 138
[17] [17] Woolley 1999, p. 10
Ligaes externas
Artigo sobre Ada Lovelace no blog Tecnologia Inteligente (http:/ / blog. vettalabs. com/ 2008/ 05/ 11/
dia-das-maes-no-tecnologiainteligente)
Herman Hollerith
13
Herman Hollerith
Herman Hollerith
Estatstica, inveno, empresrio
Nacionalidade Estadunidense
Nascimento 29 de Fevereiro de 1860
Local Buffalo
Morte 17 de Novembro de 1929(69anos)
Local Washington, D.C.
Atividade
Campo(s) Estatstica, inveno, empresrio
Conhecido(a) por Leitor de cartes perfurados, holerite
Prmio(s) Medalha Elliott Cresson (1890), National Inventors Hall of Fame (1990)
Herman Hollerith (Buffalo, 29 de Fevereiro de 1860 Washington, D.C., 17 de Novembro de 1929) foi um
empresrio norte-americano e o principal impulsionador do leitor de cartes perfurados, instrumento essencial para a
entrada de informao para os computadores da poca. Foi tambm um dos fundadores da IBM, precursor do
processamento de dados.
Carto perfurado
Certamente utilizando o princpio descoberto por Jacquard para comando automtico de teares, Hermann Hollerith -
funcionrio do United States Census Bureau - inventou, em 1880, uma mquina para realizar as operaes de
recenseamento da populao. A mquina fazia a leitura de cartes de papel perfurados em cdigo BCD (Binary
Coded Decimal) e efectuava contagens da informao referente perfurao respectiva. O sistema foi patenteado em
8 de junho de 1887.
A informao perfurada no carto era lida numa tabuladora que dispunha de uma estao de leitura equipada com
uma espcie de pente metlico em que cada dente estava conectado a um circuito elctrico.
Herman Hollerith
14
Cada carto era colocado sobre uma taa que continha mercrio e que estava conectada tambm ao mesmo circuito
elctrico do pente. Quando o pente era colocado sobre o carto os dentes que atravessavam as perfuraes fechavam
o circuito elctrico que accionava os contadores respectivos. O contador visualizava o resultado da acumulao pelo
deslocamento de um ponteiro sobre um mostrador.
Invenes e negcios
Hollerith construia mquinas sob encomenda para o United States Census Bureau, que foram usadas para calcular o
censo de 1890 em apenas um ano. O censo de 1880 demorou sete anos. Comeou seu prprio negcio em 1896,
quando fundou a Tabulating Machine Company. Os maiores centros de censo do mundo alugavam seus
equipamentos e compravam seus cartes, assim como as companhias de seguros. Para fazer seu sistema funcionar,
inventou o primeiro mecanismo de cartes perfurados, permitindo um operador treinado processar 200 a 300 cartes
por hora e um tabulador
[1]
. O tabulador 1890 era especificamente criado para operar apenas cartes do censo de
1890. Um painel de fios em seu tabulador 1906 Type I permitiu-lhe executar diferentes trabalhos sem a necessidade
de ser reconstrudo, considerados os primeiros passos em direo programao. Essas invenes foram uma das
fundaes da moderna indstria de processamento de informaes
[2]
.
Sepultura no Cemitrio Oak Hill
Em 1911, quatro corporaes, incluindo a firma de
Hollerith, se fundiram para formar a Computing
Tabulating Recording Corporation. Sob a presidencia
de Thomas J. Watson, ela foi renomeada para IBM.
[1] Hollerith's Electric Sorting and Tabulating Machine, ca. 1895
(http:/ / memory. loc. gov/ cgi-bin/ query/ r?ammem/
mcc:@field(DOCID+ @lit(mcc/ 023))) from the American
Memory archives of the Biblioteca do Congresso
[2] The Invention and Development of the Hollerith Punched Card
(http:/ / www2. computer. org/ portal/ web/ csdl/ doi/ 10.1109/
MAHC. 1991. 10023)
Ligaes externas
Hollerith, H.. (April 1889). " An Electric Tabulating
System (http:/ / www. columbia. edu/ acis/ history/
hh/ index. html)". The Quarterly, Columbia
University School of Mines X (16): 238-255.
Pgina sobre Hollerith (http:/ / sti. br. inter. net/
jferro/ prec009a. htm)
Pgina 2 sobre Hollerith (http:/ / cobit. mma. com. br/ precursores/ herman_hollerith. htm)
Alan Turing
15
Alan Turing
Alan Turing
Matemtica, lgica e criptoanlise
Esttua de Alan Turing com sua fotografia na parede
Dados gerais
Nome de nascimento Alan Mathison Turing
Nacionalidade Britnico
Residncia Reino Unido
Nascimento 23 de Junho de 1912
Local Maida Vale, Londres, Reino Unido
Morte 7 de Junho de 1954(41anos)
Local Wilmslow, Cheshire, Reino Unido
Causa Suicidou-se comendo uma ma envenenada
Atividade
Campo(s) Matemtica, lgica e criptoanlise
Instituies Universidade de Manchester
National Physical Laboratory
Universidade de Cambridge
Alma mater Universidade de Cambridge
Universidade de Princeton
Orientador(es) Alonzo Church
Orientado(s) Robin Gandy
Conhecido(a) por Mquina de Turing, Problema da parada, Teste de Turing, Prmio Turing
Prmio(s) Officer of the Order of the British Empire
Fellow of the Royal Society
Alan Turing
16
Alan Mathison Turing OBE (23 de Junho de 1912 7 de Junho de 1954) foi um matemtico, lgico, criptoanalista
e cientista da computao britnico. Foi influente no desenvolvimento da cincia da computao e na formalizao
do conceito de algoritmo e computao com a mquina de Turing, desempenhando um papel importante na criao
do computador moderno. Ele tambm pioneiro na inteligncia artificial e na cincia da computao.
Durante a Segunda Guerra Mundial, Turing trabalhou para a inteligncia britnica em Bletchley Park, num centro
especializado em quebra de cdigos. Por um tempo ele foi chefe do Hut 8, a seo responsvel pela criptoanlise da
frota naval alem. Planejou uma srie de tcnicas para quebrar os cdigos alemes, incluindo o mtodo da bomba
eletromecnica, uma mquina eletromecnica que poderia encontrar definies para a mquina Enigma.
Aps a guerra, trabalhou no Laboratrio Nacional de Fsica do Reino Unido, onde criou um dos primeiros projetos
para um computador com um programa armazenado, o ACE. Posteriormente, Turing se interessou pela qumica.
Escreveu um artigo sobre a base qumica da morfognese
[1]
e previu reaes qumicas oscilantes como a Reao de
Belousov-Zhabotinsky, que foram observadas pela primeira vez na dcada de 1960.
A homossexualidade de Turing resultou em um processo criminal em 1952 - os atos homossexuais eram ilegais no
Reino Unido na poca, e ele aceitou o tratamento com hormnios femininos e castrao qumica, como alternativa
priso. Morreu em 1954, algumas semanas antes de seu aniversrio de 42 anos, devido a um aparente
auto-administrado envenenamento por cianeto, apesar de sua me (e alguns outros) ter considerado a sua morte
acidental. Em 10 de setembro de 2009, aps uma campanha de internet, o primeiro-ministro britnico Gordon Brown
fez um pedido oficial de desculpas pblico, em nome do governo britnico, devido maneira pela qual Turing foi
tratado aps a guerra.
Em 24 de dezembro de 2013, Alan Turing recebeu o perdo real da rainha Elisabete II, da condenao por
homossexualidade.
Juventude e carreira
Turing nasceu em Londres enquanto seu pai estava de frias do seu trabalho no Indian Civil Service (ICS) em
Chhatrapur, provncia de Bihar e Orissa, na ndia Britnica. Seu pai, Julius Mathison Turing (18731947), era filho
de um clrigo de uma famlia de comerciantes escoceses que havia se estabelecido nos Pases Baixos. A me de
Alan, Ethel Sara (ne Stoney; 18811976), era filha de Edward Waller Stoney, engenheiro chefe da Estra de Ferro
Madras. Os Stoneys eram uma famlia gentia anglo-irlandeses e protestante dos condados de Tipperary e Condado de
Longford.
[2]
O trabalho de Julius no ICS havia trazido a famlia para a ndia Britnica onde seu av havia sido um
general do Exrcito Bengali. Entretanto, Julius e Ethel queriam que seus filhos fossem criados na Inglaterra, ento se
mudaram para Maida Vale, Londres, onde Turing nasceu em 23 de junho de 1912.
[3]
Ele tinha um irmo mais velho,
John (o pai de Sir John Dermot Turing, 12 Baro do baronete Turing). A comisso do servio civil de seu pai ainda
estava ativa, e durante a infncia de Turing viajaram entre Hastings na Inglaterra e ndia, deixando seus dois filhos
com um casal de aposentados.
Dedicao
Dedicava-se a teoremas que podiam ser comprovados, e Teoria da Computabilidade. A sua preocupao depois de
formado era o que se poderia fazer atravs da computao. Suas respostas iniciais vieram sob a forma terica.
Consagrao
Aos 24 anos de idade, consagrou-se com a projeo de uma mquina que, de acordo com um sistema formal,
pudesse fazer operaes computacionais. Mostrou como um simples sistema automtico poderia manipular smbolos
de um sistema de regras prprias. A mquina terica de Turing pode indicar que sistemas poderosos poderiam ser
construdos. Tornou possvel o processamento de smbolos, ligando a abstrao de sistemas cognitivos e a realidade
concreta dos nmeros. Isto buscado at hoje por pesquisadores de sistemas com Inteligncia Artificial (IA). Para
Alan Turing
17
comprovar a inteligncia artificial ou no de um computador, Turing desenvolveu um teste que consistia em um
operador no poder diferenciar se as respostas a perguntas elaboradas pelo operador eram vindas ou no de um
computador. Caso afirmativo, o computador poderia ser considerado como dotado de inteligncia artificial. Sua
mquina pode ser programada de tal modo que pode imitar qualquer sistema formal. A ideia de computabilidade
comeou a ser delineada.
Devido a todos esses feitos, Alan Turing tido como o Pai da cincia da computao.
Colossus
Em 1943, sob sua liderana foi projetado o Colossus, computador ingls que foi utilizado na Segunda Guerra
Mundial. Utilizava smbolos perfurados em fitas de papel que processava a uma velocidade de 25 mil caracteres por
segundo. O Colossus tinha a misso de quebrar cdigos alemes ultra-secretos produzidos por um tipo de mquina
de codificao chamada Enigma. Os cdigos mudavam frequentemente, obrigando a que o projeto do Colossus
devesse tornar a decifrao bastante rpida. Turing foi depois at os Estados Unidos para um projeto de transmisso
de dados transatlnticos de forma segura.
Morte
Como homossexual declarado, no incio dos anos 1950 foi humilhado em pblico, impedido de acompanhar estudos
sobre computadores, julgado por "vcios imprprios" e condenado a terapias base de estrognio, um hormnio
(hormona) feminino o que, de fato, equivalia a castrao qumica e que teve o humilhante efeito secundrio de lhe
fazer crescer seios.
Em 8 de junho de 1954, um criado de Turing encontrou-o morto, o que tinha ocorrido no dia anterior, em sua
residncia em Wilmslow, Cheshire. Um exame post-mortem estabeleceu que a causa da morte foi envenenamento
por cianeto. Quando seu corpo foi descoberto, uma ma estava meio comida ao lado de sua cama, e embora a ma
no tenha sido testada quanto ao cianeto, especula-se que este foi o meio pelo qual uma dose fatal foi ingerida. Um
inqurito determinou que ele tinha cometido suicdio, tendo sido ento cremado no crematrio de Woking em 12 de
junho de 1954.
A me de Turing argumentou com veemncia que a ingesto fora acidental, causada pelo armazenamento descuidado
de seu filho de produtos qumicos de laboratrio. O bigrafo Andrew Hodges sugere que Turing pode ter se matado
deliberadamente de forma bastante ambgua para dar sua me alguma negao plausvel. Outros sugerem que
Turing estava encenando uma cena do filme Branca de Neve, de 1937, seu conto de fadas favorito, salientando que
ele tinha "um prazer especialmente mordaz na cena em que a bruxa malvada mergulha a ma na poo venenosa."
Jack Copeland defende que a morte pode ter sido acidental como resultado de inalao de vapores de cianeto durante
uma experincia qumica conduzida no improvisado laboratrio que tinha em casa e onde j anteriormente sofrera
acidentes por descuido. O mesmo autor afirma que - contrariamente ao que se tem afirmado - profissionalmente o
trabalho lhe corria bem, que andava alegre e que interagia socialmente com normalidade e boa disposio. Constata
que na ma encontrada cabeceira no foi testada laboratorialmente para determinar a presena de cianeto, que os
nveis do veneno no organismo eram uniformes, portanto mais compatveis com a inalao lenta do que com a
ingesto. Conclui, deste modo, que a investigao foi mal conduzida e precipitada e que os elementos disponveis
no indiciam necessariamente que a causa da morte seja suicdio.
Alan Turing
18
Pedidos de Desculpa e Perdo
Por muitos anos foram feitas campanhas que envolveram ativistas da tecnologia da informao, do meio poltico e
do pblico LGBT.
[4]
Em 11 de setembro de 2009, 55 anos aps sua morte, oprimeiro-ministrodoReino
Unido,Gordon Brown, seguindo um pedido feito atravs de uma petio direcionada ao governo britnico, pediu
desculpas formais em nome do governo pelo tratamento preconceituoso e desumano dado a Turing, que o levou ao
suicdio. Em 24 de Dezembro de 2013, passou a ter efeito a Real Prerrogativa do Perdo, concedida a Turing pela
Rainha Elizabeth II a pedido do ministro da justia do Reino Unido, Chirs Grayling, depois que uma petio criada
em 2012 obteve mais de 37.000 assinaturas solicitando o devido perdo.
[5][6]
Cinebiografia
Parte de sua vida foi retratada no telefilme Breaking the Code de 1996 com o ator Derek Jacobi no papel principal.
[1] A.M. Turing, "The Chemical Basis of Morphogenesis", Philosophical Transactions of The Royal Society of London, series B, volume 237,
pages 3772, 1952.
[2] Phil Maguire, "An Irishman's Diary", page 5. The Irish Times, 23 June 2012
[3] The Scientific Tourist In London: #17 Alan Turings Birth Place (http:/ / blogs. nature. com/ london/ 2011/ 03/ 16/
the-scientific-tourist-in-london-17-alan-turings-birth-place), Nature.com London Blog
[4] http:/ / www. pcpro.co. uk/ news/ 386248/ alan-turing-finally-gets-royal-pardon
[5] http:/ / www. bbc.co.uk/ portuguese/ noticias/ 2013/ 12/ 131224_codigo_nazista_condenado_homossexualidade_lgb. shtml
[6] http:/ / epetitions. direct. gov.uk/ petitions/ 23526
Bibliografia
Hodges, Andrew. Alan Turing: The Enigma of Intelligence. London:Burnett Books, 1983. ISBN 0-04-510060-8
Leavitt, David. The Man Who Knew Too Much: Alan Turing and the invention of the computer. [S.l.: s.n.], 2007.
ISBN 978-0-7538-2200-5
Agar, Jon. In: MIT Press. The government machine: a revolutionary history of the computer (em ingls).
Cambridge, Massachusetts:[s.n.], 2003. ISBN 978-0-262-01202-7 Pgina visitada em 23 de junho de 2012.
Paul Ceruzzi. A History of Modern Computing (em ingls). MIT Pressed. Cambridge, Massachusetts, e
Londres:[s.n.], 1998. ISBN 0-262-53169-0
Ligaes externas
Biografia (http:/ / www-groups. dcs. st-and. ac. uk/ ~history/ Mathematicians/ Turing. html) em MacTutor (em
ingls)
Alan Turing (http:/ / genealogy. math. ndsu. nodak. edu/ id. php?id=8014) em Mathematics Genealogy Project
Alonzo Church
19
Alonzo Church
Alonzo Church
Matemtica e lgica
Dados gerais
Nome de nascimento Alonzo Church
Nacionalidade Estadunidense
Residncia Estados Unidos
Nascimento 14 de junho de 1903
Local Washington, D.C.
Morte 8 de novembro de 1995(92anos)
Local Hudson, Ohio
Atividade
Campo(s) Matemtica e lgica
Instituies Universidade de Princeton (19291967)
University of California, Los Angeles (19671995)
Alma mater Universidade de Princeton
Tese
1927: Alternatives to Zermelo's Assumption
[1]
Orientador(es) Oswald Veblen
Orientado(s) Curtis Anthony Anderson, Peter Andrews, George Alfred Barnard, Martin Davis, Leon Henkin, David
Kaplan, John George Kemeny, Stephen Kleene, Michael Rabin, Hartley Rogers, Jr, J. Barkley Rosser,
Nathan Salmon, Dana Scott, Raymond Smullyan, Alan Turing
Alonzo Church (Washington, DC, 14 de junho de 1903 Hudson (Ohio), 8 de novembro de 1995) foi um
matemtico estadunidense.
Atuou principalmente nas reas de lgica matemtica, teoria da recurso e teoria da computao. Entre suas maiores
contribuies, esto o clculo lambda, um sistema matemtico formal que investiga funes, aplicao de funes.
Influenciou as linguagens de programao, principalmente as linguagens funcionais, como o LISP (LISP 'puro' pode
Alonzo Church
20
ser chamada de uma linguagem funcional verdadeira).
A Tese de Church-Turing
Partindo em busca do que seria um procedimento efetivo ou mecnico (o que pode ser feito seguindo-se diretamente
um algoritmo ou conjunto de regras ), surgiram a sistematizao e desenvolvimento das "funes recursivas". O
clculo-lambda (componente caracterstico fundamental da linguagem de programao LISP) de Alonzo Church,
tornou pblica a possibilidade da definio bem elaborada de processo efetivo.
O teorema de Church n.1 consiste fundamentalmente na demonstrao de que no existe algoritmo capaz de
enumerar as expresses no vlidas, de maneira que fica excludo a priori todo procedimento de deciso para as
expresses do "Clculo de predicados".
Church tambm era interessado no problema da indecibilidade de Hilbert (Entscheidungsproblem). Church tinha
alcanado resultados, empregando o conceito de lambda-definibilidade (ao invs do computvel por uma mquina de
Turing definido por Turing), mostrando assim que lambda-definibilidade equivalente ao conceito de recursividade
de Gdel-Herbrand. O clculo-lambda, como sistema elaborado por Church para ajudar a fundamentar a Matemtica
era inconsistente, mas a parte do clculo-lambda que tratava de funes recursivas estava correta e teve sucesso.
Usando sua teoria, Church props uma formalizao da noo de "efetivamente computvel", atravs do conceito de
lambda-definibilidade. Desta forma mostrou que o sistema de procedimentos de Turing eram equivalente
lambda-definibilidade. O trabalho de Church e Turing fundamentalmente liga os computadores com as mquinas de
Turing. Os limites das Maquinas de Turing, de acordo com a tese de Church-Turing, tambm descreve os limites de
todos os computadores.
Como foi observado, a mquina de Turing pode ser interpretada como um algoritmo. Efetivamente toda ao de uma
mquina algortmica, como o computador pode ser considerada, se resume a calcular o valor de uma funo 2 com
determinados argumentos. Este fato interessante, pois d uma maneira de se medir a capacidade computacional de
uma mquina. Uma mquina que compute mais funes que outra mais poderosa. A partir dos resultados de Kurt
Gdel, Alan Turing e Church, pode-se dizer que existem funes para as quais no existe uma sequncia de passos
que determinem o seu valor, com base nos seus argumentos. Dizendo-se de outra maneira, "no existem algoritmos
para a soluo de determinadas funes". So as chamadas "funes no computveis". Isto significa que para tais
funes no h nem haver capacidade computacional suficiente para resolv-las. Logo, descobrir as fronteiras entre
funes computveis e no computveis equivalente a descobrir os limites do computador em geral. A tese de
Church-Turing representa um importante passo nesse sentido. Eles perceberam que o poder computacional das
Maquinas de Turing se resumia a qualquer processo algortmico, ou seja, todas as funes computveis que
pudessem ser descritas por algoritmos. Isto foi a contribuio dada pelo trabalho de Turing e Church. As funes
computveis so as mesmas funes Turing-computveis. A importncia disso est na possibilidade de se verificar o
alcance e limites de um computador.
1. Um clebre teorema de Alonzo Church (1903-1995) demonstrou em 1936 que no pode existir um procedimento
geral de deciso para todas as expresses do Clculo de Predicados de 1a ordem, ainda que exista tal
procedimento para classes especiais de expresses de tal clculo.
2. 2. O processo que determina o valor de uma funo atravs dos argumentos dessa funo chamado de clculo da
funo (ou computar uma funo).
[1] http:/ / www. ams. org/ journals/ tran/ 1927-029-01/ S0002-9947-1927-1501383-1/
Alonzo Church
21
Ligaes externas
Biografia (http:/ / www-groups. dcs. st-and. ac. uk/ ~history/ Mathematicians/ Church. html) em MacTutor (em
ingls)
Alonzo Church (http:/ / genealogy. math. ndsu. nodak. edu/ id. php?id=8011) em Mathematics Genealogy Project
Konrad Zuse
Konrad Zuse
Engenharia, cincia da computao
Residncia Alemanha
Nascimento 22 de Junho de 1910
Local Berlim
Morte 18 de Dezembro de 1995(85anos)
Local Hnfeld
Atividade
Campo(s) Engenharia, cincia da computao
Alma mater Universidade Tcnica de Berlim
Conhecido(a) por Z3, Z4, Plankalkl
Prmio(s) Anel Werner von Siemens (1964), Harry H. Goode (1965), Medalha Wilhelm Exner (1969),
Bundesverdienstkreuz (1972), Medalha Cothenius (1985)
Konrad Zuse (Berlim, 22 de Junho de 1910 Hnfeld, 18 de Dezembro de 1995) foi um engenheiro alemo e um
pioneiro dos computadores. O seu maior feito foi a compleo do primeiro computador de programa controlado por
fita guardada, o Z3, com Helmut Schreyer em 1941.
Konrad Zuse inventou o primeiro computador eletromecnico, constitudo de rels - efetuava clculos e exibia os
resultados em fita perfurada.
Konrad Zuse
22
No Museu da Tecnologia de Bonn existem alguns de seus inventos, como o Z2, um dos primeiros computadores do
mundo. Em outro museu na mesma cidade (Museum fr Deutsche Geschichte - Museu da Histria Alem) tambm
se encontram outros equipamentos desenvolvidos por Konrad Zuse.
Zuse recebeu em 1964 o Anel Werner von Siemens, pelo Z3. Sua mquina computadora S2 considerada o primeiro
computador controlado por processamento, que foi usado para ajudar a desenvolver os msseis Henschel Hs 293 e
Henschel Hs 294, precursores dos modernos msseis de cruzeiro.
Ligaes externas
Arquivo Internet Konrad Zuse (http:/ / zuse. zib. de/ )
A vida da obra de Konrad Zuse (http:/ / www. epemag. com/ zuse) Por Prof. Horst Zuse (filho de K. Zuse);
Biografia MacTutor (http:/ / www-history. mcs. st-andrews. ac. uk/ history/ Mathematicians/ Zuse. html)
Technical University of Berlin (http:/ / www. tu-berlin. de/ )
Free University of Berlin (http:/ / www. fu-berlin. de/ )
Konrad Zuse (http:/ / ei. cs. vt. edu/ ~history/ Zuse. html)
Konrad Zuse, inventor do primeiro computador programvel (http:/ / www. idsia. ch/ ~juergen/ zuse. html)
Tese de fsica digital e o universo calculvel de Zuse (http:/ / www. idsia. ch/ ~juergen/ digitalphysics. html)
Deutsches Technikmuseum Berlin (http:/ / www. dtmb. de/ Aktuelles/ Sonderausstellungen/ Zuse_Ausstellung/
index. html)
Computermuseum Kiel Z11 (http:/ / www. museen-sh. de/ ml/ pi_485_0489AB_s2. html)
Computermuseum Kiel Z22 (http:/ / www. museen-sh. de/ ml/ pi_485_0488ABCDEF_s2. html)
Computermuseum Kiel Z25 (http:/ / www. museen-sh. de/ ml/ pi_485_0490ABCDEF_s2. html)
Precedido por
Otto Bayer, Walter Reppe e Karl Ziegler
Anel Werner von Siemens
1964
com Fritz Leonhardt e Walter Schottky
Sucedido por
Karl Kpfmller e Siegfried Meurer
23
Primeiros computadores
Z1
Z1 exposto em Berlin
O Z1 era uma unidade aritmtica mecnica,
desenvolvida por Konrad Zuse, a partir de 1934 e
destrudo durante a Segunda Guerra Mundial. Antes da
guerra era denominado V-1 (Versuchs modell-1), Zuse
mudou seu nome, aps o fim da guerra, para Z1 a fim
de evitar confuses com a denominao dos foguetes
desenvolvidos pelo seu amigo Werner von Braun.
Embora eletro-mecnico, era digital (usava o sistema
de numerao de base 2). Sua programao era limitada
e as instrues eram passadas atravs de carto
perfurado.
Esta mquina era constituda basicamente por um
somador/subtrator de 22 bits de vrgula flutuante
(ponto-flutuante) e uma unidade lgica de controle que possibilitava a realizao de tarefas mais complexas como
multiplicao (por sucessivas somas) e diviso (por sucessivas subtraes). O nico componente eltrico do Z1 era
um motor que servia para gerar um sinal de clock mecnico de um hertz. Tinha a maioria dos elementos de
arquitetura do modelo Z3, entretanto, por causa de problemas mecnicos no teve utilidade prtica.
Este computador eletro-mecnico representa um marco histrico pois considerado a primeira mquina binria
programvel do mundo. O Z1 foi o primeiro de uma srie de computadores produzido por Konrad Zuse. Os
sucessores Z2 e Z3 seguiram as mesmas idias e princpios presentes no Z1.
O Z1 foi concludo em 1938. Zuse trabalhou no Z1, com conhecidos e amigos na sala de estar do apartamento de
seus pais, em Berlim, o que motivou que estes o proibissem de continuar. Porm, Zuse teve financiamento de muitas
partes nessa poca. Assim, o pai, um empregado, retrocedeu da deciso, enquanto destinava o salrio da irm e
pedindo a alguns amigos para emprestar dinheiro a Zuse, desde que foi convencido do sucesso desde
empreendimento.
H uma reproduo, feita por Zuse em 1986, deste computador no museu alemo de Tecnologia de Berlim
(Deutsches Technikmuseum Berlin).
Arquitetura (arquitectura)
A arquitetura do Z1 serviu como ponto de partida para a dos seus sucessores. O Z1 dispunha de uma memria para
64 nmeros de vrgula flutuante (ponto-flutuante), de 22 bits de largura (ponto-flutuante de 22 bits de tamanho). A
unidade aritmtica possua comandos de adio, subtraco (subtraco), multiplicao, diviso e um decodificador
binrio-decimal.
O sistema de entrada e sada de dados do Z1 era composto por duas unidades: uma perfuradora de cartes e uma
leitora de cartes perfurados.
Z1
24
Ligaes externas
(em alemo) Informaes sobre o Z1
[1]
(em alemo) [2]
(em ingls) [3]
Referncias
[1] http:/ / irb. cs. tu-berlin.de/ ~zuse/ Konrad_Zuse/ de/ Rechner_Z1. html
[2] http:/ / www. dtmb.de/
[3] http:/ / www. epemag. com/ zuse/ default.htm
Z2
O Z2 era uma unidade aritmtica eletromecnica, desenvolvido por Konrad Zuse, em 1939.
Antes de ter concludo o Z1, que era limitado tecnicamente, por ser eletro-mecnico, Zuse comeou a trabalhar num
outro computador com rels e vlvulas, criando, em Abril de 1939, o Z2, o primeiro computador do mundo.
O Z2 foi concludo em Abril de 1939, quando Zuse o apresentou, em uma demonstrao, para a Deutsche
Versuchsanstalt fur Luftfahrt (Instituto de Investigao da Fora Area Alem) o qual teve interesse em financiar o
desenvolvimento de um computador mais potente.
H uma reproduo, feita por Zuse em 1986, deste computador no museu alemo de Tecnologia de Berlim.
Arquitetura (arquitectura)
(Em construo)
Z3
25
Z3
Rplica do Z3 em exposio no Deutsches
Museum em Munique.
O computador Z3 foi a primeira mquina de computao totalmente
automtica e programvel do mundo, criado em 1941 pelo alemo
Konrad Zuse. Foi utilizado pelo Instituto de pesquisa aeronutica
alemo a fim de realizar anlises estatsticas em projetos de asas de
novas aeronaves.
Sua construo se deu durante a segunda guerra mundial e tinha como
objetivo a codificao de mensagens, por uma equipe de 15 pessoas em
um anexo da fbrica de avies Henschel. Tinha uma memria que
armazenava 64 nmeros de 22 bits. Seus clculos eram realizados em
aritmtica binria de ponto flutuante e j calculava razes quadradas e
realizava uma multiplicao em cerca de 5 segundos. Foi a primeira
mquina de calcular com controle automtico de operaes. Foi destrudo, junto com a casa de Zuse, em Berlim, por
um bombardeio.
Ligaes externas
A evoluo do computador (http:/ / wwwusers. rdc. puc-rio. br/ rmano/ comp2hc. html) (em portugus)
Z4
Z4
O Z4 foi um computador-projeto por Konrad Zuse, baseado nos
anteriores Z3 e Z2.
Antecedentes
Em 1940, Konrad Zuse teve a idia de usar computadores para libertar
os espritos dos seres humanos da tarefa de clculos. Para construir o
seus computadores, Konrad Zuse fundou uma companhia chamada de
Zuse Apparatebau em Berlim no dia 1 de abril de 1940.
O computador Z4
A Zuse Apparatebau era uma pequena empresa localizada no Methfesselstrae 7 e 10, em Berlim-Kreuzberg. Em
1941, Konrad Zuse tinha certeza de que os problemas gerais de construo de computadores poderosos foram
resolvidos. Ele projetou o Z4 para ser um prottipo de computadores para escritrios de engenharia e institutos
cientficos. Com base em suas experincias com as mquinas Z1 a Z3 , e sabendo o que ele queria para solucionar
problemas para os engenheiros, ele percebeu que o Z4 necessitava de muito mais memria do que as mquinas
anteriores.
Por este motivo, ele comparou as vantagens e desvantagens de uma memria construda utilizando rels de uma
memria construda a partir de folhas de metal fino (como o Z1 e Z2). Sua concluso foi de que a construo da
memria a partir de folhas de metal era muito menos dispendioso do que construir uma memria de rels . Ficou
Z4
26
claro para ele que uma memria de 32-bit mil palavras consistindo de rels seria muito grande, porque ele iria
precisar de mais de 1000 x 32 = 32000 rels. Sua memria mecnica patenteada (1936) funcionou de forma muito
confivel, e para as 1000 palavras ele no iria precisar de mais de um metro cbico de espao. Konrad Zuse tambm
estimou os custos de uma palavra de 32-bit da memria mecnica como sendo de 5 RM (Reichmarks), o que
correspondeu a aproximadamente 2,50 dlares em 1942.
A meta para o Z4, que foi desenvolvido entre 1942 e 1945, foi a construo do prottipo de uma mquina que estava
destinada a ser produzida na casa das centenas.
Z4 e a Segunda Guerra Mundial
Em 1945 a Zuse Apparatebau tinha cerca de 20 funcionrios. Nesta poca o edifcio e a empresa foram
completamente destrudos pelos ataques areos. Nesse ano, a regio do terreno no Methfesselstrae 7 foi
bombardeado. Os Z3 e Z4 foram construdos em uma casa sobre esta parcela de terreno.
Demorou mais de quatro anos para construir o Z4, que acabou por ser muito menor do que o inicialmente previsto.
No entanto, a falta de materiais, os quase dirios ataques areos, bem como a crescente dificuldade de se viver em
Berlim tornaram impossvel terminar o Z4.
Fonte
http:/ / www. epemag. com/ zuse/ part6a. htm
O Colossus
Colossus Mark 2 sendo operado
Colossus foi um computador ingls projetado em
Bletchley Park durante a Segunda Guerra Mundial pela
equipe liderada por Tommy Flowers. Seu principal
objetivo era fazer a criptoanlise de cdigos
ultra-secretos utilizados pelos nazistas, criados com a
mquina. Lorenz SZ 40/42. Utilizando smbolos
perfurados em fitas de papel, o equipamento processava
a uma velocidade de 25 mil caracteres por segundo.
Ligaes externas
Mark Ward (11 de fevereiro de 2013). The road to
uncovering a wartime Colossus
[1]
. BBC News.
The Colossus Gallery
[2]
. The National Museum of Computing.
Referncias
[1] http:/ / www. bbc.co.uk/ news/ technology-21384672
[2] http:/ / www. tnmoc. org/ explore/ colossus-gallery
Harvard Mark I
27
Harvard Mark I
Parte do Mark I
O ASCC (Automatic Sequence Controlled Calculator),
chamado de Mark I pela Universidade de Harvard
[1]
,
foi o primeiro computador eletromecnico automtico
de larga escala desenvolvido nos Estados Unidos da
Amrica.
[2]
Ele foi construdo em 1944 num projeto da
Universidade de Harvard em conjunto com a IBM.
[1] O nome impresso no computador Aiken-IBM Automatic
Sequence Controlled Calculator Mark I.
[2] IBM Archives (http:/ / www-03. ibm. com/ ibm/ history/
reference/ faq_0000000011. html)
ENIAC
Duas mulheres operando o ENIAC (fotografia
pertencente ao Exrcito dos Estados Unidos (U.S.
Army)).
Electronic Numerical Integrator Analyzer and Computer (ENIAC
- em portugus: computador integrador numrico electrnico) foi o
primeiro computador digital eletrnico de grande escala. Muitos falam
que o primeiro foi o Mark I, mas este era apenas eletromecnico. Foi
criado em fevereiro de 1946 pelos cientistas norte-americanos John
Eckert e John Mauchly, da Electronic Control Company
O ENIAC comeou a ser desenvolvido em 1943 durante a II Guerra
Mundial para computar trajetrias tticas que exigissem conhecimento
substancial em matemtica, mas s se tornou operacional aps o final
da guerra.
Sua capacidade de processamento era de 5.000 operaes por
segundo;
Criado na segunda guerra, tinha como principal finalidade clculos balsticos;
Possua 17.468 vlvulas terminicas, de 160 kW de potncia;
Esta mquina no tinha sistema operacional e seu funcionamento era parecido com uma calculadora simples de hoje.
O ENIAC, assim como uma calculadora, tinha de ser operado manualmente.
A calculadora efetua os clculos a partir das teclas pressionadas, fazendo interao direta com o hardware, como no
ENIAC, no qual era preciso conectar fios, rels e sequncias de chaves para que se determinasse a tarefa a ser
executada. A cada tarefa diferente o processo deveria ser refeito. A resposta era dada por uma sequncia de
lmpadas.
ENIAC
28
Produo
Era to grande que tinha de ser disposto em U com trs painis sobre rodas, para que os operadores pudessem se
mover em torno dele. Foram gastos cerca de $500.000,00 (quinhentos mil) em sua construo. Quando em operao,
outros complexos clculos de balstica passaram a realizarse em alucinantes 30 segundos, quando com as
calculadoras manuais que at a se usavam levava 12 horas para se obter o mesmo resultado. O centro de
processamento tinha uma estrutura muito similar dos processadores mais bsicos que atualmente utilizamos em
nossas calculadoras de bolso. Tinha 20 registos de dez dgitos cada, onde se podiam efetuar somas, subtraes,
multiplicaes, divises e razes quadradas.
As programadoras do ENIAC
O ENIAC era programado atravs de milhares de interruptores, podendo cada um dele assumir o valor 1 ou 0
consoante o interruptor estava ligado ou desligado. Para o programar era necessrio uma grande quantidade de
pessoas que percorriam as longas filas de interruptores dando ao ENIAC as instrues necessrias para computar, ou
seja, calcular. Existia uma equipe de 80 mulheres na Universidade da Pensilvnia cuja funo era calcular
manualmente as equaes diferenciais necessrias para os clculos de balstica. O exrcito chamava a funo destas
pessoas: computadores.
Quando o ENIAC ficou pronto, seis mulheres foram escolhidas para testarem a nova mquina.
Verso modernizada do ENIAC
Curiosamente, o termo deixou de estar associado as pessoas que operavam a mquina para dar nome a mquina
propriamente dita, uma vez que de facto a mquina passou a realizar as contas que antes eram realizadas por essas
pessoas.
O ENIAC torna-se obsoleto e economicamente invivel de manter aps 10 anos de operao, tendo sido
desmontado. Hoje encontram-se peas do ENIAC por muitos museus do mundo, incluindo o Smithsonian em
Washington D.C. e no local preciso onde foi construdo, na Moore School for Electrical Engineering da
Universidade da Pensilvnia.
Desenvolvimento posterior
O ENIAC serviu de inspirao para muitos outros computadores que se seguiram, como o EDVAC (Electronic
Discrete Variable Computer); o ORDVAC (Ordnance Variable Automatic Computer); SEAC (Standards Automatic
Computer) e o UNIVAC, este ltimo tambm construdo por Eckert e Mauchly para o processamento dos dados dos
censos da populao americana.
Em 1955, um computador j s pesava 3 toneladas e consumia 50 kW de potncia, tendo um custo de U$200.000.
Uma mquina destas podia realizar 50 multiplicaes por segundo. Assim, os primeiros computadores eram tambm
eles mquinas que s estavam ao alcance de grandes empresas ou instituies que tinham necessidades de clculo
muito exigentes e que possuam as condies econmicas para to grande investimento.
Com o rpido desenvolvimento dos transstores entre 1952 e 1960, os tubos de vcuo tornaram-se obsoletos e foi
este avano tecnolgico que permitiu a criao de mquinas muito mais rpidas, menores e mais baratas.
Com o tempo, os transstores passaram a ser a base da electrnica, seguindo-se a VLSI (Very Large Scale
Integration), ou seja, a construo de circuitos cada vez menores por forma a que pudessem ser mais leves e
despender menos energia, por terem menos superfcie para a dissipao de energia por calor. Esta miniaturizao
permitiu que se tivesse a mesma capacidade de clculo de um ENIAC na palma de uma mo. A diminuio do
tamanho fez tambm diminuir a quantidade de energia necessria e o custo caiu com a produo em srie dos novos
processadores.
ENIAC
29
Em 1977 uma calculadora manual pesava menos de meio quilo, consumia meio watt e podia realizar 250
multiplicaes por segundo, custando $300. Hoje uma calculadora pesa poucos gramas podendo ser incorporada em
rguas ou agendas, funciona at a energia solar e custa de R$5,00 a R$10,00 (isso calculadoras simples com
operaes bsicas e geralmente raiz quadrada e outras poucas funes).
EDVAC
O EDVAC, instalado no Edifcio 328 do Ballistics Research
Laboratory.
EDVAC (Electronic Discrete Variable Automatic
Computer) foi um dos primeiros computadores
eletrnicos. Diferentemente de seu predecessor
ENIAC, utilizava o sistema binrio e possua
arquitetura de von Neumann.
EDVAC (Electronic Discrete Variable Automakltic
Computer), por sua sigla em Ingls, foi um dos
primeiros computadores eletrnicos. Ao contrrio do
ENIAC que operava com base em codificao
decimal, o EDVAC foi projetado para utilizar cdigos
binrios e manter os programas armazenados na
memria, respeitando a arquitetura de von Neumann.
O projeto do EDVAC considerada um sucesso na
histria da computao, e sua arquitetura tornou-se
padro para os computadores modernos..
O projeto do EDVAC foi desenvolvido antes mesmo
do ENIAC estava comeando e era destinado a
resolver muitos problemas encontrados no projeto do
ENIAC. Assim como o ENIAC, o EDVAC foi
construdo pela Ballistic Research Laboratory U. S.
Universidade da Penhlksilvnia. Os projetistas do
ENIAC, J. Echkert e John Mauchly foram reunidos
pelo grande matemtico John von Neumann. O contrato para a sua construo foi assinado em abril de 1946 e previa
um oramento inicial de US$ 1,000,000. O nome EDVAC, definido nesse contrato, o acronome gerado pela
expresso Electronic Discrete Variable Automatic Calculator (calculadora eletrnica discreta varival automtica em
Ingls).
O custo do EDVAC foi semelhante ao do ENIAC, apenas abaixo de $ 500.000,00.
O computador foi concebido para ter a adio binria, subtrao e multiplicao, diviso programada e automtica.
Tambm possui um verificador automtico para at mil palavras (que mais tarde conjunto em 1024). Fisicamente, o
computador foi construdo pelos seguintes componentes: uma unidade de leitora e gravao, uma unidade de
controle com o osciloscpio, uma unidade para receber instrues numricas em pares de nmeros jm um tempo e
mant-los na memria aps confirmao com outra unidade idntica, um cronmetro e uma unidade de memria
dual.
Uma das principais preocupas no projeto foi o de equilbrio entre confiabilidade e custo.
EDVAC fisicamente possua quase 6.000 vlvulas termoinicas (vacuum tubes) e 12.000 diodos, consumindo o
equivalente a 56 kilowatts de potncia. Ocupava 45,5 m
2
de rea e pesava 7.850 kg.
A equipe operacional era composta por trinta pessoas para cada turno de oito horas.
EDVAC
30
EDVAC recebeu vrias atualizaes, incluindo um dispositivo de entrada / sada de cartes perfurados em 1953, a
memria adicional em um cilindro magntico em 1954 e uma unidade de aritmtica de ponto flutuante em 1958.
EDVAC funcionou at 1961, quando foi substitudo pelo BRLESC. No seu perodo de operao, provou ser
altamente confivel e produtivo.
Referncias
31
os anos 40
Plankalkl
O Plankalkl uma linguagens de programao criada pelo cientista alemo Konrad Zuse, entre os anos 1942-1946
no desenvolvimento dos primeiros computadores. A linguagem considerada de alto nvel, mas s foi publicada
amplamente em 1972, e o compilador em 1998. Uma implementao independente foi lanada em 2000 pela
Universidade Livre de Berlim.
Desenvolvimento do projeto
Konrad Zuse construiu vrios computadores de rels eletromagnticos complexos, mas em 1945, a guerra destruiu
tudo, excepto um modelo, o Z4. Aps a destruio de seus equipamentos, Konrad mudou-se para uma cidade
chamada Hintersteiner, onde comeou a trabalhar sozinho em seu projeto para desenvolver a sua linguagem de
programao, um projeto que comeou em 1943 como uma proposta para sua tese de doutorado que desenvolveu sua
linguagem de programao Plankalkl, o que significa calculadora.
Zuse em 1948 publicou um artigo no Archiv der Mathematik - um jornal que publica trabalhos de alta qualidade em
todas as reas da matemtica - mas sua publicao no produziu interesse acadmico. Heinz Rutishauser
(co-fundador do ALGOL) disse: "A primeira tentativa de desenvolver uma linguagem algortmica foi realizado em
1948 por K. Zuse Sua notao foi geral, mas a proposta nunca alcanou a considerao que merece.."
A linguagem era muito complementar a sua poca de reproduo e teve alguns de seus recursos mais avanados na
rea de estruturas de dados. O tipo mais simples o de um nico bit, mas tambm construiu os tipos de nmeros
inteiros e reais. O tipo real usado um esquema de classificao e os dois "um pouco escondido", que atualmente
usado para evitar armazenar os bits da parte fracionria de um valor normalizado. A linguagem tem trs variveis
especficas para o desenvolvimento de um programa, entre elas podemos destacar as letras V (passagem de
parmetros), Z (o armazenamento de valores intermedirios) e R (ver resultados).
Implementao da linguagem
Um dos maiores obstculos para a implementao da linguagem Plankalkl ocorreu porque ele usa a mesma sintaxe
difcil de entender, isto , um desenvolvedor em particular levaria muito tempo para entender as sequncias lgicas
usadas no programa. Normalmente, as variveis que determina o idioma usado por quatro linhas.
A primeira linha foi declarada uma das letras V, Z ou R, a segunda linha da varivel ndice declarado, foi declarado o
terceiro componente da varivel, e, finalmente, a quarta linha o tipo declarado da varivel, por exemplo, 5,0 (cinco
bits), mas tambm podemos encontrar exemplos de programas escritos em forma linear.
Linguagem completa
Alm desses tipos mais comuns, o Planklakl incluiu tambm matrizes e registros. Pode-se resumir dizendo que a
ideia incorporou muitas ideias Plankalkl muito importante. Ao concluir seus algoritmos de trabalho Zuse
desenvolveu para classificao, testar a conectividade de grficos para aritmtica de inteiros (inclusive raiz
quadrada) e at mesmo um jogo de xadrez onde o artigo foi encontrado em uma seo de 60 pginas sobre como
desenvolver a aplicao e outros. Infelizmente, a maioria destas coisas no so conhecidas at 1972, e desenvolveu o
primeiro compilador em 1998 e uma posterior aplicao em 2000 na Universidade Livre de Berlim. Portanto,
pode-se identificar a viso de longo prazo de Konrad Zuse de propriedade de uma declarao em que ele enfatizou a
Plankalkl
32
sua linguagem: "Depois de algum tempo, como a bela adormecida, ainda est para vir para a vida".
A linguagem era notavelmente completa para sua poca de criao e tinha alguns de seus recursos mais avanados na
rea das estruturas de dados. O tipo mais simples era o bit nico e a partir dele eram construdos tipos para nmeros
inteiros e reais. O tipo real usava uma notao de dois e o esquema de "bit oculto", que atualmente usado para
evitar armazenar o bit mais significativo da parte fracionria normalizada de um valor. A linguagem Plankalkl
possui trs variveis especficas para o desenvolvimento de um programa, entre elas podemos destacar as letras V
(passagem de parmetros), Z (armazenamento de valores intermedirios), e R (exibio de resultado).
Um dos maiores obstculos para a implementao da linguagem Plankalkl ocorria devido ao fato de a mesma
utilizar uma sntaxe de difcil compreenso, ou seja, um determinado desenvolvedor demoraria muito tempo para
compreender as seqncias lgicas utilizadas no programa. Geralmente as variveis nessa determinada linguagem
utilizavam aproximadamente quatro linhas. Na primeira linha era declarada algumas das letras V, Z, ou R, na
segunda linha era declarado o ndice da varivel, na terceira era declarado o componente da varivel, e por fim na
quarta linha declarava-se o tipo da varivel, por exemplo 5.0 (cinco bits), porm podemos tambm encontrar
exemplos de programas escritos de forma linearizada.
Ambiente da linguagem: Nunca implementada. Estruturas de dados avanadas: reais, arrays, records.
Principais caractersticas:
Esta linguagem de programao possui entre outras coisas indicaes de atribuio, chamadas da funo
(sub-rotinas);
Instrues condicionais;
Aritmtica de ponto flutuante;
Matrizes (arrays);
Operaes matemticas ou lgicas s podem ser aplicadas a variveis do mesmo tipo;
Tipos de dados compostos;
Tratamento de exceo, dentre outras caractersticas.
Vantagens de uso:
Execuo objetiva dirigida;
Estruturas record hierrquicas;
Aritmtica de ponto flutuante;
Estrutura de repetio (iterao);
Tratamento de exceo;
Programas so funes reutilizveis;
Variveis no precisam ser especificadas em um lugar especial do ambiente de desenvolvimento;
Funes no podem se repretir.
Desvantagem de uso:
No possvel definir um nome qualquer para uma varivel;
Linguagem exclusiva para tratamento com nmeros;
Falta de uma sintaxe de fcil interpretao;
Utilizao de um layout bidimensional e unidimensional.
Plankalkl foi uma linguagem de programao criada por Konrad Zuse nos anos 1942 a 1946. Foi a primeira
linguagem de programao de alto nvel do mundo.
Plankalkl
33
Atributos da linguagem
Esta linguagem de programao possui entre outras coisas indicaes de atribuio, chamadas da funo
(subrotinas), instrues condicionais, estrutura de repetio (iterao), aritmtica de ponto flutuante, matrizes
(arrays), tipos de dados compostos, tratamento de exceo, dentre outras caractersticas.
Zuse no pretendia usar a linguagem nos sucessores de seu Z3, mas os eventos da Segunda Guerra Mundial foraram
o seu uso por muito tempo. Durante anos esse trabalho permaneceu esquecido. Somente em 1972 foi publicada
completamente. No contexto de uma tese, Plankalkl foi descrito e implementado em 1975 por J. Hohmann. No final
dos anos 90 foram feitas implementaes alternativas independentes (1998 e dois anos mais tarde, na universidade
livre de Berlim), incluindo um editor de sinttico.
Exemplo
Abaixo temos um exemplo de um programa que calcula o valor mximo de 3 variveis pela chamada a funo max:
P1 max3 (V0[:8.0],V1[:8.0],V2[:8.0]) => R0[:8.0]
max(V0[:8.0],V1[:8.0]) => Z1[:8.0]
max(Z1[:8.0],V2[:8.0]) => R0[:8.0]
END
P2 max (V0[:8.0],V1[:8.0]) => R0[:8.0]
V0[:8.0] => Z1[:8.0]
(Z1[:8.0] <V1[:8.0]) V1[:8.0] => Z1[:8.0]
Z1[:8.0] => R0[:8.0]
END
Zuse, Konrad: Der Plankalkl. Gesellschaft fr Mathematik und Datenverarbeitung. Nr. 63, BMBW GMD
63, 1972
Genese.pdf (http:/ / www. zib. de/ zuse/ Inhalt/ Programme/ Plankalkuel/ Genese/ Genese. pdf)
Konrad Zuse e seu Plancalculus (http:/ / pt. scribd. com/ doc/ 58976247/ 24/ Konrad-Zuse-e-seu-Plancalculus)
Konrad Zuse (http:/ / user. cs. tu-berlin. de/ ~zuse/ Konrad_Zuse/ plank. html)
Knuth, D. E. & Pardo, L. T. [1980]. The early development of programming languages, apud A history of
computing in the twentieth century (a collection of essays). London: Academic Press, 1980.
Zuse (http:/ / www. epemag. com/ zuse/ default. htm#index)acedido em 12 de maro de 2005
L1 seminrio.pdf (http:/ / www. faccat. com. br/ dti/ l1_seminario_8. pdf)
Conceitos de linguagem de programao, por Robert W. Sebesta (Captulo 2)5 edio pg 47 a 50.
Ligaes externas
Giloi, Wolfgang, K.: Konrad Zuse's Plankalkl: The First High-Level "non von Neumann" Programming
Language. IEEE Annals of the History of Computing, Vol. 19, No. 2, 1997 (http:/ / csdl. computer. org/ comp/
mags/ an/ 1997/ 02/ a2017abs. htm)
Implementierung und Plankalkl-Programme der FU Berlin (http:/ / www. zib. de/ zuse/ Inhalt/ Programme/
Plankalkuel/ )
Dokumentation der ersten Plankalkl-Implementierung Documentos sobre Plankalfl (http:/ / projekte. mynetix.
de/ mauerer/ pk/ pk. ps)
34
Os anos 1950 - As primeiras linguagens
Short Code
Short Code
Paradigma procedural
Surgido em 1949
Criado por John Mauchly
Influenciada por ENIAK short code
Influenciou linguagens de programao de nvel intermedirio, OMNIBAC montador simblico
Short Code foi uma das primeiras linguagens de programao de alto nvel j desenvolvida para um computador.
[1]
Diferente de cdigo de mquina, seu o cdigo representado por expresses matemticas.
A linguagem foi proposta por John Mauchly em 1949, e conhecida originalmente como Brief Code. William Schmitt
implementou uma verso ainda no mesmo ano para o BINAC., mas ela nunca foi depurada ou testada. No ano
seguinte, Schmitt implementou uma nova verso para o Univac I, agora com o nome Short Code. Uma verso
revisada foi desenvolvida em 1952 para o Univac II, por A. B. Tonik e J. R Logan.
[2]
O Short Code implementado atravs de expresses matemtica, que devem ser convertidas manualmente para a
execuo. Os elementos de uma expresso so representados por cdigos de dois caracteres, e ento agrupados em
em conjuntos de seis cdigos. Com o agrupamento, forma-se ento palavras de doze bytes, de acordo com a
arquitetura do BINAC e do Univac.
[3]
Por exemplo:
a = (b+c)/b*c
convertido para Short Code usando uma sequncia de substituio e um agrupamento:
X3 = ( X1 + Y1 ) / X1 * Y1 substitutas de variveis
X3 03 09 X1 07 Y1 02 04 X1 Y1 substitutos de operadores e parnteses
07Y10204X1Y1 agrupamento em palavras de doze bytes
0000X30309X1
[1] [1] Sebesta, W.S Concepts of Programming languages. 2006;M6 14:18 pp.44.
[2] [2] Schmitt, William F. The UNIVAC SHORT CODE. Annals of the History of Computing (1988) 10: pp. 7-8
[3] [3] Schmitt, William F. The UNIVAC SHORT CODE. Annals of the History of Computing (1988) 10:p. 15
Short Code
35
Bibliografia
Wexelblat, Richard L. (Ed.) (1981). History of Programming Languages, p. 9. New York: Academic Press. ISBN
0-12-745040-8
Murdoch, Short Code (HOPL) (http:/ / hopl. murdoch. edu. au/ showlanguage. prx?exp=2707&
language=SHORT CODE)
Sistema A-0
O sistema A-0 (Arithmetic Language version 0), escrito por Grace Hopper em 1951 e 1952 para o UNIVAC I,
provavelmente, segundo Jean E. Sammet, foi o primeiro compilador j desenvolvido para um computador eletrnico.
O A-0 funcionava mais como um carregador ou ligador diferente da noo moderna de um compilador. Um
programa era especificado como uma seqncia de sub-rotinas e argumentos. As sub-rotinas eram identificadas por
um cdigo numrico e os argumentos para as sub-rotinas eram escritos logo aps cada cdigo de sub-rotina. O
sistema A-0 convertia a especificao em cdigo de mquina que podia ser armazenado em um computador uma
segunda vez para executar o programa.
Ao sistema A-0 se seguiram o A-1, A2, A-3 (lanado como Arith-Matic), AT-3 (lanado como Math-Matic) e o B-0
(lanado como Flow-Matic).
Personagem: John Backus
John Warner Backus
Cincia da computao
Nacionalidade Estadunidense
Nascimento 31 de Dezembro de 1924
Local Filadlfia
Morte 17 de Maro de 2007(82anos)
Local Ashland
Personagem: John Backus
36
Atividade
Campo(s) Cincia da computao
Prmio(s) Prmio W. Wallace McDowell (1967), Medalha Nacional de Cincias (1975), Prmio Turing (1977), Prmio
Charles Stark Draper (1993)
John Warner Backus (Filadlfia, 31 de Dezembro de 1924 Ashland, 17 de Maro de 2007) foi um cientista da
computao estadunidense.
Conhecido por criar a primeira linguagem de programao de alto nvel - o Fortran -, a notao BNF e o conceito de
programao em nvel de funes.
Recebeu em 1977 o Prmio Turing, por suas contribuies para o desenvolvimento de sistemas de programao de
alto nvel, principalmente por seu trabalho no Fortran e por publicaes sobre mtodos formais na especificao de
linguagens de programao.
Biografia
Backus nasceu em Filadlfia, Pensilvnia, mas cresceu em Wilmington, Delaware. Estudou na Hill School em
Pottstown. Aps entrar na Universidade da Virginia para estudar qumica e falhar nos estudos, entrou para as foras
armadas dos Estados Unidos e iniciou treinamento mdico. Durante seu estgio em um hospital, foi diagnosticado
com um tumor no crebro, que foi removido com sucesso; uma placa foi instalada em sua cabea, e ele largou o
treinamento mdico aps nove meses e uma nova operao para substituir a placa.
Aps mudar-se para Nova Iorque iniciou treinamento em tcnica de rdio, e descobriu interesse pela matemtica.
Graduou-se na Universidade de Columbia em matemtica em 1949, e entrou na IBM no ano seguinte. Durante seus
trs primeiros anos, John trabalhou no computador SSEC; seu primeiro grande projeto foi escrever um programa de
computador para calcular as posies da lua. Em 1953 Backus desenvolveu a linguagem Speedcoding, a primeira
linguagem de alto nvelcriada para um computador IBM.
As dificuldades contemporneas em programao eram grandes, e em 1954 Backus montou uma equipe para definir
e desenvolver o Fortran para o IBM 704. Apesar de no ser historicamente a primeira linguagem de programao de
alto nvel, o Fortran foi a primeira a ter grande uso. Durante a segunda metade da dcada de 1950, John serviu
comits internacionais para desenvolver o ALGOL 58 e o ALGOL 60, que tornou-se rapidamente o padro para a
publicao de algoritmos.
Posteriormente trabalhou em programao funcional.
Backus aposentou-se em 1991, e faleceu em sua residncia em Ashland, Oregon, em maro de 2007, aos 82 anos de
idade.
Precedido por
Michael Rabin e Dana Scott
Prmio
Turing
1977
Sucedido por
Robert Floyd
Speedcoding
37
Speedcoding
Speedcoding
Paradigma procedural
Surgido em 1953
Criado por John Backus e IBM
Influenciada por Assembly
Influenciou Fortran, ALGOL 58, BASIC, C, PL/I, PACT I, MUMPS, Ratfor
Speedcoding ou Speedcode foi a primeira linguagens de programao de alto nvel criada para um computador IBM.
A linguagem foi desenvolvida por John Backus em 1953 para o IBM 701 para dar suporte a programao em
nmeros de ponto flutuante.
A idia surgiu da dificuldade de programao da mquina IBM SSEC, quando Backus foi contratado para calcular
posies astronmicas no incio dos anos 1950. O sistema Speedcoding era um interpretador e focava na facilidade
de uso em detrimento dos recursos do sistema. Ela fornecia pseudo-instrues para funes matemticas comuns:
logaritmos, exponenciao e operaes trigonomtricas. O software residente analisava as pseudo-instrues, uma a
uma e chamava a subrotina apropriada. A Speedcoding tambm foi a primeira implementao de operaes decimais
de entrada/sada. Embora tenha reduzido substancialmente o esforo de escrita de muitas tarefas (jobs), o tempo de
execuo de um programa que era escrito com a ajuda de Speedcoding era geralmente 10-20 vezes maior do que se
fosse feito em cdigo de mquina.
[1]
O interpretador ocupava 310 palavras de memria, cerca de 30% da memria
disponvel em um IBM 701.
Ligaes externas
Backus, John, "The IBM 701 Speedcoding System"
[2]
, Journal of the ACM (JACM), Volume 1, Issue 1 (January
1954), pp. 4-6,
Backus, John W.; Harlan, Herrick (May 1954). "IBM 701 Speedcoding and Other Automatic-programming
Systems". Proc. Symp. on Automatic Programming for Digital Computer: 106113.
Sammet, Jean E.. Programming Languages: History and Fundamentals. [S.l.]:Prentice-Hall, 1969.
Referncias
[1] Emerson W. Pugh, Lyle R. Johnson, John H. Palmer, IBM's 360 and early 370 systems, MIT Press, 1991, ISBN 0262161230, p. 38
[2] http:/ / www. softwarepreservation. org/ projects/ FORTRAN/ paper/ p4-backus. pdf
Personagem: Grace Hopper
38
Personagem: Grace Hopper
Grace Murray Hopper
Nascimento 9 de dezembro de 1906
Nova Iorque, Estados Unidos
Morte 1 de janeiro de 1992(85anos)
Condado de Arlington, Estados Unidos
Nacionalidade Estadunidense
Prmios Prmio W. Wallace McDowell (1979), Medalha Nacional de Tecnologia e Inovao (1991)
Cargo Analista de Sistemas
Servio militar
Patente Almirante
Grace Murray Hopper (Nova Iorque, 9 de dezembro de 1906 Condado de Arlington, 1 de janeiro de 1992) foi
uma analista de sistemas da Marinha dos Estados Unidos nas dcadas de 1940 e 1950. Foi ela que criou a linguagem
de programao Flow-Matic, hoje extinta. Esta linguagem serviu como base para a criao do COBOL.
Dentre outras realizaes da Comodor est a criao do primeiro compilador, de COBOL, sendo a primeira
linguagem de programao de computadores a se aproximar da linguagem humana ao invs da linguagem de
mquina. Contudo, ela no participou efetivamente na criao da linguagem COBOL mas sim num subcomit que
foi originado de um dos trs comits (o de Curto Prazo) propostos numa reunio no Pentgono em Maio de 1959.
Este subcomit desenvolveu as especificaes da linguagem COBOL. Ele era formado por seis pessoas: William
Selden e Gertrude Tierney da IBM; Howard Bromberg e Howard Discount da RCA; Vernon Reeves e Jean E.
Sammet da Sylvania Electric Products.
A concepo de Hopper de que havia a necessidade de se criar uma linguagem orientada para negcios comuns deu
origem ao acrnimo COBOL (COmmon Business Oriented Language).
Tudo foi feito sem definir os comandos para minimizar melindres entre os tcnicos das empresas convocadas a
participar da criao de um denominador comum entre todos os fabricantes existentes na poca. Grace Hopper
participou contribuindo com a abertura dos comandos FLOW-MATIC.
dito que de autoria de Hopper o termo "bug" usado para designar uma falha num cdigo-fonte.
Personagem: Grace Hopper
39
Surgiu quando Grace tentava achar um problema no seu computador. Quando descobriu o problema, ela percebeu
que havia um inseto morto no computador. Desde ento o termo bug passou a ser usado.
Mas existem outras verses que contra dizem a origem verdadeira do termo "bug". Uma das verses de Thomas
Edisonque casualmente tem muita semelhana com a histria da Analista. Um inseto que causou problemas de
leitura em seufongrafoem1878
Em 1998, recebeu a honra de ter seu nome em um navio da Marinha. O contratorpedeiro USS Hopper entrou no
servio ativo em 1998.
Infncia e Educao
Grace Hopper nasceu em Grace Brewster Murray na cidade de Nova Iorque. Ela era a mais velha de trs irmos e
sempre foi uma criana curiosa, um trao que a marcou pela vida. Aos sete anos ela decidiu descobrir como
funcionava um despertador. Ela desmontou sete despertadores antes que sua me percebesse o que estava fazendo -
a Grace foi autorizada a mexer em apenas um despertador.
Grace Hopper foi Hartridge School em Plainfield, Nova Jersei. Foi inicialmente rejeitada no processo de admisso
no Vassar College aos 16 anos (suas notas em latim eram baixas), sendo admitida no ano seguinte. Ela se graduou
em 1928 como bacharel em Matemtica e Fsica e, em 1930, conclui seu mestrado na Yale University. Em 1934,
tambm na Yale University, ela conquistou seu Ph.D. em Matemtica sob a orientao de ystein Ore.
[1]
A
dissertao dela "Novos Critrios de Irredutibilidade" fui publicada no mesmo ano.
[2]
Ela comeou a ensinar
Matemtica no Vassar em 1931 e foi promovida a professora associada em 1941.
Ela foi casada com um professor da Universidade de Nova Iorque, Vincent Foster Hopper (19061976) de 1930 a
1945, quando se divorciou dele. Ela nunca se casou novamente, mas manteve o sobrenome Hopper.
Segunda Guerra Mundial e a Marinha dos Estados Unidos
Em 1943, Grace tirou uma licena de Vassar e foi empossada na Marinha dos Estados Unidos. Foi uma das vrias
mulheres a se voluntariarem no WAVES. Ela precisou de uma autorizao excepcional para alistar-se, pois estava
6,8kg abaixo do peso mnimo exigido pela Marinha (54kg). Apresentou-se em Dezembro, e treinou na Escola Naval
Reserve Midshipmen's do Smith College em Northampton, Massachusetts. Formou-se em 1944 como a primeira da
turma e foi designada para a Bureau of Ships Computation Project da Harvard University como tenente jnior.
Ela serviu na equipa de programao Mark I computer dirigida por Howard H. Aiken. Hopper e Aiken escreveram
trs artigos sobre o Mark I, tambm conhecido como a Calculadora Automtica Controlada por Sequncia. O pedido
de transferncia de Hopper para a Marinha regular no final da guerra foi recusado devido sua idade (38 anos). Ela
continuou a servir na Reserva da Marinha e permaneceu no Laboratrio de Computao de Harvard at 1949,
recusando uma ctedra em Vassar para trabalhar como pesquisadora num contrato da Marinha na Harvard
University.
Personagem: Grace Hopper
40
UNIVAC
Em 1949, Grace Hopper tornou-se empregada da corporao Eckert-Mauchly Computer como matemtica snior e
comps a equipa de desenvolvimento UNIVAC I. No comeo dos anos 1950 a empresa em que trabalhava foi
incorporada pela empresa Remington Rand e foi nesse perodo que desenvolveu seu compilador, que ficou
conhecido como O COMPILADOR e sua primeira verso foi em A-0.
Em 1952 ela teve um compilador operacional. "Ningum acreditava" disse Grace Hopper - "Eu tinha um compilador
rodando e ningum lhe tocava. Eles me diziam que computadores apenas podiam fazer aritmtica"
Em 1954, Hopper foi nomeada a primeira diretora de programao automtica, e seu departamento divulgou algumas
das primeiras linguagens de programao baseadas em compilador, incluindo ARITH-MATIC, MATH-MATIC e
FLOW-MATIC
[1] Though some books, including Kurt Beyer's Grace Hopper and the Invention of the Information Age, reported that Hopper was the first
woman to earn a Yale PhD in mathematics, the first of ten women prior to 1934 was Charlotte Cynthia Barnum (1860-1934).
[2] G. M. Hopper and O. Ore, "New types of irreducibility criteria," Bull. Amer. Math. Soc. 40 (1934) 216
Flow-Matic
Flow-Matic, originalmente chamada B-0, possivelmente a primeira linguagem de programao assemelhada ao
ingls. Criada e especificada a partir de 1955 por Grace Hopper, Flow-Matic foi uma das maiores influncias na
criao de COBOL.
Bibliografia
SAMMET, Jean E. Programming Languages: History and Fundamentals. Englewood Cliffs, New
Jersey:Prentice Hall, 1969.785 p. ISBN 0-13-729988-5
Fortran
41
Fortran
fortran
Paradigma procedural,
Orientao a objeto
Surgido em 1957
ltima verso Fortran 2008 (ISO/IEC 1539-1:2010)
Criado por John Backus & IBM
Estilo de
tipagem:
Forte, esttica e manifesta
Dialetos: Absoft, Cray, GFortran, G95, IBM, Intel, Lahey/Fujitsu, Open Watcom, Pathscale, PGI, Silverfrost, Oracle, XL
Fortran, Visual Fortran, outros
Influenciada por Speedcoding
Influenciou ALGOL 58, BASIC, C, PL/I, PACT I, MUMPS, Ratfor
A famlia de linguagens de programao conhecida globalmente como Fortran foi desenvolvida a partir da dcada
de 1950 e continua a ser usada hoje em dia. O nome um acrnimo da expresso "IBM Mathematical FORmula
TRANslation System"
As verses iniciais da linguagem eram conhecidas como FORTRAN, mas a capitalizao foi ignorada em verses
recentes da linguagem comeando a partir do Fortran 90. Os padres oficiais da linguagem referem-se a ela
atualmente como "Fortran".
A linguagem Fortran principalmente usada em Cincia da Computao e Anlise Numrica. Apesar de ter sido
inicialmente uma linguagem de programao procedural, verses recentes de Fortran possuem caractersticas que
permitem suportar programao orientada por objetos.
Fortran
42
Histria, verses e revises
An IBM 704 mainframe
Foi a primeira linguagem de
programao imperativa. O primeiro
compilador de FORTRAN foi
desenvolvido para o IBM 704 em
1954-57 por uma equipe da IBM
chefiada por John W. Backus. O
compilador era optimizado, pois os
autores acreditavam que ningum iria
usar essa linguagem se a sua prestao
no fosse comparvel com a da
linguagem assembly. Le langage
Fortran a connu de nombreuses
volutions
[1]
:
1956. Fortran II um liguagem de
programao criada aps sua
"original" FORTRAN em 1958. Esta originou outras linguagens como BASIC
1958. Fortran III Verso que nunca foi disponibilizada.
1962. Fortran IV A linguagem Fortran foi largamente adaptada por cientistas para a escrita de programas
numericamente intensivos, o que encorajou os produtores de compiladores a escrever compiladores que gerassem
cdigo mais rpido.
1965. Documento ECMA Fortran
1966. Fortran 66 (ANSI X3.9-1966), quando a primeira verso padronizada da linguagem, conhecida como
FORTRAN IV ou FORTRAN 66, estava disponvel, Fortran j era a linguagem mais usada pela comunidade
cientfica. FORTRAN IV foi padronizada pela American Standard Association (ASA). A ampla disponibilidade de
compiladores para diferentes computadores, a simplicidade da linguagem, facilidade para ensin-la, sua eficincia
e as vantagens introduzidas pelo uso de sub-rotinas e compilao independente destas e a capacidade de lidar com
nmero complexo, alm de muitas outras caractersticas, ajudaram em sua ampla difuso dentro da comunidade
cientfica.
1978. Fortran 77 (ANSI X3.9-1978),
entre outras melhorias, facilita a programao de estruturas com blocos. IF / THEN / ELSE / ENDIF . Em 1978,
uma extenso introduzia entre outros DO WHILE / END DO . Uma caracterstica marcante do FORTRAN 77 so
as regras de alinhamento das linhas do programa, uma herana da era dos cartes perfurados. Originalmente, a
sintaxe do FORTRAN 77 foi definida de forma que cada linha do programa fosse escrita em um carto perfurado,
com um carcter por coluna, obedecendo as seguintes regras:
Coluna 1 - usada para indicar linha de comentrio. Um carcter na coluna 1 (geralmente "C", "c" ou "*") indicava
que todos os demais caracteres a partir da coluna 2 constituam um comentrio e no um comando ou declarao.
Colunas 2-5 - reservadas para os "labels" das linhas (nmeros inteiros entre 1 e 9999). Os labels so usados para
identificar e referenciar linhas especficas do programa.
Coluna 6 - quando marcada por um carcter, indicava que a linha era uma continuao da linha anterior.
Colunas 7-72 - reservadas para os comandos e declaraes.
Colunas 73 em diante - reservadas para comentrios.
As mesmas regras continuaram em vigor , mesmo depois dos cartes perfurados terem cado em desuso e os
programas em FORTRAN 77 passarem a ser escritos diretamente em editores de texto.
Fortran
43
Na mesma poca que o FORTRAN 77 surgiu, j existiam outras linguagens de programao como o C, Pascal, Ada
e Modula, que haviam introduzido novos conceitos em programao ou fundamentado outros como a tipagem
explcita de variveis e a definio de novos tipos de dados, o que permitia ao programador definir estruturas de
dados mais adequadas para resolver problemas; alocao dinmica de dados; subprogramas recursivos; controle de
exceo (uma das principais caractersticas da linguagem Ada); e estabelecimento de mdulos.
O FORTRAN 77 no oferecia nenhum desses recursos e comeou a ser pouco a pouco abandonado pela comunidade
cientfica que passaram a recorrer a outras linguagens de programao.
1980. Fortran 8X. Durante a dcada de 1980, foi lanada uma nova reviso do 8x que incorporava todos os
conceitos acima citados (exceto a tipagem explcita e o controle de exceo).
1990. Fortran 90 (ANSI X3.198-1992) : O processo de definio do novo padro foi longo e demorado, mas
permitiu o amadurecimento de muitos dos novos conceitos que a linguagem apresentaria. A verso final desta
reviso foi apresentada com o nome de FORTRAN 90. FORTRAN 90 to eficiente quanto o C e o Pascal para
os fins a que ela se destina. FORTRAN 90 trouxe uma novidade para o mundo das linguagens de programao:
mecanismos para manipulao de arranjos, que no so oferecidos por nenhuma outra linguagem.
[2]
1995. Fortran 95 (ISO/IEC 1539-1:1997)O padro formal da linguagem mais recente, publicado em 1996,
conhecido como Fortran 95
[3]
. Esta reviso do FORTRAN acrescentou pequenas alteraes ao FORTRAN 90,
motivada pela necessidade de aproximar o padro linguagem High Performance Fortran ou HPF a qual
voltada para o uso de computadores com arquiteturas avanadas. A linguagem HPF uma espcie de extenso do
FORTRAN 90 e, atualmente, muitos fabricantes oferecem compiladores HPF baseados na linguagem FORTRAN
90.
2003. Fortran 2003 (ISO/IEC 1539-1:2004) : Desde 1997, o FORTRAN vem passando por um novo processo de
reviso. O FORTRAN 2003 ir incorporar um conjunto de novos comandos que permitiro, entre outras coisas, o
controle de excees e programao orientada a objetos.
2008. Fortran 2008 (ISO/IEC 1539-1:2010). O padro mais recente, a ISO/IEC 1539-1:2010, conhecido
informalmente como Fortran 2008, foi aprovado em Setembro de 2010.
[4]
Tal como o Fortran 95, sofreu
pequenos melhoramentos, incorporando clarificaes e correes ao Fortran 2003, assim como algumas novas
funcionalidades, tais como:
Submodulos facilidades estruturais adicionais para os mdulos; substitui ISO/IEC TR 19767:2005
Co-array Fortran um modelo de execuo paralela
A construo Scalable parallelism para iteraes sem interdependncias.
O atributo CONTIGUOUS especifica restries na definio da estrutura lgica
A construo Block ou Dynamic scoping pode obter declaraes de objetos com uso do escopo da construo
Tipo de dados ou componentes recursivos como alternativa a indicadores recursivos em pginas derivadas.
O padro Final Draft international Standard (FDIS) est disponvel como o documento N1830.
[5]
Outro importante
suplemento ao Fortran 2008 a especificao tcnica (TS) 29113 da ISO em Ingls Further Interoperability of
Fortran with C,
[6][7]
que foi submetida para aprovao do ISO em Maio de 2012. A especificao adiciona suporte
para acesso a descritores de array ou ve(c)tores da linguagem de programao C e permite ignorar o tipo e
importncia dos argumentos.
Fortran
44
Cdigo FORTRAN num Carto perfurado,
mostrando as colunas de texto especializadas 1-5,
6 e 73-80.
Compiladores
O compilador livre gcc permite a compilao com o Fortran 77
(compilador g77
[8]
, at ao 3.4.6) e depois o 90 e 95 (a partir de gcc
4.0.0, que substitui g77 para gfortran
[9]

[10]
), para as novas
plataformas, o compilador g95
[11]
tambm baseado no gcc, mas j
no era mantido depois de 2011. O compilador g77, agora distribudo
separadamente do gcc, pode ser includo no gcc para compilar
[12]
, e os
seus binrios so ainda disponibilizados para certos modelos de
computadores
[13]

[14]

[15]
. Outros compiladores, como o da empresa
IBM, nunca foram muito populares e esse aspecto foi especialmente notado no FORTRAN IV. WATFOR, a verso
do FORTRAN IV desenvolvida na Universidade de Waterloo, Canad, foi universalmente preferida, pois o
compilador produzia melhores relatrios dos erros de compilao. O software para a gerao automtica de
fluxogramas a partir de programas em FORTRAN tambm foi desenvolvido fora da IBM.
Compiladores Fortran para processamento paralelo e/ou distribudo em Cluster of Workstations (COW) ou Cluster
of PCs (agrupamentos de PCs):
gFortran -- g95 -- GNU Compiler Collection -- F2c -- Intel Fortran Compiler -- IBM VisualAge -- Open64
Caractersticas e extenses
O Fortran permite a criao de programas que primam pela velocidade de execuo. Da reside seu uso em
aplicaes cientficas computacionalmente intensivas como meteorologia, oceanografia, fsica, astronomia,
geofsica, engenharia, economia etc.
Inicialmente, a linguagem dependia da formatao precisa do cdigo-fonte e do uso extensivo de nmeros de
depoimento e de depoimentos goto. Estas idiossincrasias foram removidas de verses mais recentes da linguagem.
As diversas actualizaes tambm introduziram conceitos "modernos" de programao, tais como comentrios no
cdigo-fonte e sadas de texto, IF-THEN-ELSE (em FORTRAN 77), recursividade (em FORTRAN 90), e
construes paralelas, enquanto se tentava preservar o perfil "leve" e a prestao de alto rendimento que faziam a
imagem de marca do Fortran. Entre as linguagens especializadas mais populares baseadas em Fortran encontram-se a
linguagem SAS, para gerar relatrios estatsticos, e SIMSCRIPT, para simulao de processos onde esto envolvidas
listas de espera. Vendedores de computadores cientficos de alto rendimento (Burroughs, CDC, Cray, IBM, Texas
Instruments, ) adicionaram extenses linguagem Fortran para fazer uso de caractersticas especiais do hardware,
tais como: cache de instrues, pipeline da CPU, disposies de vectores, etc. Por exemplo, um dos compiladores de
Fortran da IBM (H Extended IUP) possua um nvel de optimizao que reordenava as instrues do cdigo para
manter as unidades aritmticas da mquina ocupadas simultaneamente, obtendo assim um rendimento mximo.
Outro exemplo CFD, uma "verso" especial da linguagem Fortran projectada especialmente para o
supercomputador ILLIAC IV, que se encontra no Centro de Pesquisa Ames da NASA. Estas extenses tm vindo
desde ento a desaparecer ou ento os seus elementos tm sido incorporados no padro principal da linguagem; a
extenso da linguagem que ainda persiste a OpenMP, que uma extenso multi-plataforma para programao de
memria partilhada. Uma extenso recente, CoArray Fortran, tem como objectivo a promoo de programao
paralela.
Fortran
45
Pontos fortes/fracos da sintaxe
No que foi a primeira tentativa de projeco de uma linguagem de programao de alto nvel, a sintaxe da linguagem
considerada arcaica por muitos programadores que aprenderam linguagens mais modernas. difcil escrever um
loop for, e erros na escrita de apenas um carcter podem levar a erros durante o tempo de execuo em vez de erros
de compilao, caso construes mais recentes no forem usadas, tais como estilo livre do cdigo fonte. Algumas
das verses anteriores no possuam facilidades que seriam tidas como teis em mquinas modernas, tais como a
alocao dinmica de memria. Deve-se, no entanto, ter em conta que a sintaxe de Fortran foi "afinada" para o uso
em trabalhos numricos e cientficos, e que muitas das suas deficincias tm sido abordadas em revises mais
recentes da linguagem. Por exemplo, Fortran 95 possui comandos muito breves para efectuar operaes
matemticas com matrizes e disposies de tipos, o que no s melhora em muito a leitura do programa como
tambm fornece informao til ao compilador, o que torna possvel a vectorizao de operaes. Por estas razes,
Fortran no muito utilizado fora dos campos da cincia da computao e da anlise numrica, mas permanece a
linguagem a escolher para desempenhar tarefas da rea da computao numrica de alto rendimento.
Padres
Os dois padres abaixo reflectem as implementaes actuais de Fortran:
ANSI X3.198-1992 (R1997). Ttulo: Programming Language "Fortran" Extended. informalmente conhecida
como Fortran 90.O padro publicado pela ANSI.
ISO/IEC 1539-1:1997. Ttulo: Information technology - Programming languages - Fortran - Part 1: Base
language. informalmente conhecido como Fortran 95. Existem mais duas partes deste padro. A Parte 1 foi
formalmente adoptada pelo ANSI.
Exemplos de cdigo
em FORTRAN 77
C 1 2 3 4
C234567890123456789012345678901234567890
PROGRAM HELLO
PRINT *, "HELLO WORLD!" ! USANDO COMANDO PRINT
END
Resolvendo uma equao de 2. grau
C 1 2 3 4 5 6
C2345678901234567890123456789012345678901234567890123456789012345
PROGRAM BASKHARA
C
REAL :: A,B,C, DELTA, X1,X2, RE, IM
C
PRINT *, "Este programa resolve uma equao de 2o.grau"
PRINT *, "no formato: a*x**2 + b*x + c = 0"
C
PRINT 10, "Digite a, b, c: "
10 FORMAT( A, 1X, $)
20 READ(*, *, ERR=20)A, B, C
C
DELTA= B**2-4.0*A*C
Fortran
46
C
IF( DELTA.GT.0 )THEN ! (DUAS RAZES REAIS)
X1= ( -B-SQRT(DELTA) ) / ( 2.0*A )
X2= ( -B+SQRT(DELTA) ) / ( 2.0*A )
PRINT *, "RAIZES: X1= ", X1
PRINT *, "X2= ", X2
ELSE
IF( DELTA.EQ.0 ) THEN ! (DUAS RAZES REAIS IGUAIS)
X1= -B / ( 2.0*A )
X2= X1
PRINT *, "RAIZES: X1=X2= ", X1
ELSE ! (DUAS RAZES COMPLEXAS)
RE= -B / ( 2.0*A )
IM= SQRT( -DELTA ) / ( 2.0*A )
PRINT *, "RAIZES COMPLEXAS: X1= ", RE,"- ", IM, "i"
PRINT *, "X2= ", RE, "+ ",IM, "i"
END IF
END IF
C
END PROGRAM BASKHARA
em Fortran 90
tabela de graus -> radians
PROGRAM DEGRAD
! Declaracao das variaveis
INTEGER DEG
REAL RAD, COEFF
! Inicio do programa
WRITE ( *, 10)
10 FORMAT (' ',20('*') /
&
& ' * Degres * Radians *' /
&
& ' ', 20('*') )

! Corpo do programa
COEFF = (2.0 * 3.1416) / 360.0
DO DEG = 0, 90
RAD = DEG * COEFF
WRITE ( *, 20) DEG, RAD
20 FORMAT (' * ',I4,' * ',F7.5,' *')
END DO
! Fim da tabela
WRITE ( *, 30)
30 FORMAT (' ',20('*') )
! Fim do programa
Fortran
47
STOP
END PROGRAM DEGRAD
em FORTRAN 95
program ola
print*,"Ol Mundo!"
end program ola
rea do cilindro
program cilindro
! Calcula a rea de um cilindro.
!
! Declara as variveis e constantes.
implicit none ! Requer que todas as variveis sejam declaradas --
Habilidade do Fortran 90.
integer :: ierr
real :: raio,altura,area
real , parameter :: pi = 3.14159
do
! Pergunta ao usurio o raio e a altura e l os valores.
write (*,*) "Entre com o raio e a altura, 'q' para sair."
read (*,*,iostat=ierr) raio,altura
!
! Se o raio e a altura no puderam ser lidos da entrada, termina o
programa.
if (ierr /= 0) stop "finalizando o programa"
!
! Calcula a rea. O sinal ** significa "eleva a uma potncia".
area = 2*pi*(raio**2 + raio*altura)
!
! Escreve as variveis de entrada (raio, altura) e a saida (rea) na
tela.
write (*,"(1x,'raio=',f6.2,5x,'altura=',f6.2,5x,'area=',f6.2)")
raio,altura,area
end do
end program cilindro
[1] Veja aqui o site de Working Group 5 (http:/ / www. nag. co. uk/ sc22wg5/ ) e de comit J3 (http:/ / www. j3-fortran. org/ ) para mais
informaes sobre a evoluo atual do Acordo
[2] da Cunha, Rudnei Dias, "Introduo Linguagem de Programao Fortran 90", Editora da UFRGS, Porto Alegre, 2005. ISBN
85-7025-829-1.
[3] da Cunha, Rudnei Dias, "Programao Cientfica em Fortran 95", Clube de Autores, Porto Alegre, 2010. ISBN 978-85-910277-0-5.
[4] [4] N1836, Summary of Voting/Table of Replies on ISO/IEC FDIS 1539-1, Information technology - Programming languages - Fortran - Part 1:
Base language
[5] N1830, Information technology Programming languages Fortran Part 1: Base language
[6] ISO page to ISO/IEC DTS 29113, Further Interoperability of Fortran with C (http:/ / www. iso. org/ iso/ iso_catalogue/ catalogue_tc/
catalogue_detail.htm?csnumber=45136)
[7] [7] Draft of the Technical Specification (TS) 29113
[8] Copia arquivo de site sobre g77 (http:/ / www. kilmnj. com/ g77/ )
[9] GCC Wiki - GFortran (http:/ / gcc. gnu.org/ wiki/ GFortran)
Fortran
48
[10] gfortran.org (http:/ / www. gfortran. org/ )
[11] Sitio oficial de g95 (http:/ / www.g95.org/ )
[12] Como compilar g77 com uma verso recente de gcc ? (http:/ / www. gfortran. org/ build-g77. shtml)
[13] g77 para o Windows (http:/ / www.mbr-pwrc.usgs. gov/ software/ g77. html) site oficial USGS
[14] g77 para MacOS X (http:/ / hpc. sourceforge.net/ )
[15] g77 para MS-DOS (ftp:/ / ftp.delorie. com/ pub/ djgpp/ current/ v2gnu/ ) no site da DJGPP
Ligaes externas
Programao em Fortran no Linux (http:/ / vivaolinux. com. br/ artigo/ Introducao-ao-Fortran-(parte-1)/ )
Curso de Fortran 77 e 90 em portugus (http:/ / www. geocities. com/ helder_pc/ fortran/ )
Early Fortran Manuals (http:/ / www. fh-jena. de/ ~kleine/ history/ )
The Fortran Company: compilers, books, tutorials, consulting (http:/ / www. fortran. com)
Fortran Open Directory category (http:/ / dmoz. org/ Computers/ Programming/ Languages/ Fortran/ )
Usenet forum: comp.lang.fortran (http:/ / groups-beta. google. com/ group/ comp. lang. fortran)
Fortran 90, 95 and 2003 information (http:/ / www. fortranplus. co. uk)
USER NOTES ON FORTRAN PROGRAMMING (UNFP) (http:/ / www. ibiblio. org/ pub/ languages/ fortran/
unfp.html)
Unit 7.1 FORTRAN 77 (http:/ / www. aspire. cs. uah. edu/ textbook/ index_f77. html) ; Part of ASPIRE (http:/ /
www. aspire. cs. uah. edu/ )'s textbook in Computational Science
Unit 7.2 FORTRAN 90 (http:/ / www. aspire. cs. uah. edu/ textbook/ index_f90. html) ; Ditto
How Not to Write FORTRAN in Any Language (http:/ / acmqueue. com/ modules. php?name=Content&
pa=showpage& pid=271) There are characteristics of good coding that transcend all programming languages.
Debugging tool for FORTRAN and its derivatives. (http:/ / www. allinea. com/ ?page=48)
Professional Programmer's Guide to Fortran77 (http:/ / rsusu1.rnd. runnet. ru/ develop/ fortran/ prof77/ prof77.
html)
COMTRAN
49
COMTRAN
COMTRAN (COMmercial TRANslator) uma linguagem de programao que serviu de base ao COBOL.
Desenvolvida em 1957 por Bob Bemer da IBM, a linguagem continha pela primeira vez um elemento chamado de
Picture Clause, que define o tamanho de quaisquer dados, tal como um dicionrio define as palavras. Em particular
o Picture Clause determina se os dados contm letras e nmeros, ou outras caracteristicas dos dados, incluindo
formato, tamanho ou tipo.
Bibliografia
SAMMET, Jean E. Programming Languages: History and Fundamentals. Englewood Cliffs, New
Jersey:Prentice Hall, 1969.785 p. ISBN 0-13-729988-5
WEXELBLAT, Richard L.(Editor). History of Programming Languages. New York:Academic Press, 1981.758
p. ISBN 0-12-745040-8
COMIT
COMIT
Surgido em 1957
Criado por Victor Yngve
Compiladores COMIT II
Influenciou SNOBOL
COMIT foi a primeira linguagem para processamento de cadeias de caracteres (strings) (compare SNOBOL, TRAC
e Perl), desenvolvida nos computadores da IBM, srie 700/7000 pelo Dr. Victor Yngve e colaboradores no MIT
entre 1957-1965. Yngve criou a linguagem para apoio pesquisa informatizada na rea de lingstica e, mais
especificamente, na rea de traduo automtica para processamento de linguagem natural. A criao de COMIT
levou criao de SNOBOL.
Bibliografia
REILLY, Edwin D.. Milestone in Computer Science and Information Technology. [S.l.]:Greenwood Prenn, 2003.
ISBN 1-57356-521-0
SAMMET, Jean E. Programming Languages: History and Fundamentals. Englewood Cliffs, New
Jersey:Prentice Hall, 1969.785 p. ISBN 0-13-729988-5
Yngve, V. "A programming language for mechanical translation," Mechanical Translation, Vol. 5, pp. 2541,
July, 1958.
YNGVE, Victor H.. Comit II: Computer Programming with COMIT II. Cambridge, Massachusetts:MIT Press,
1972.203 p. ISBN 0-262-74007-9
ALGOL 58
50
ALGOL 58
ALGOL 58, tambm conhecida como IAL, sigla para International Algorithmic Language foi a primeira verso da
linguagem de programao ALGOL.
FACT
FACT
Surgido em 1959
Criado por Diviso Datamatic da Minneapolis Honeywell
Influenciou COBOL
FACT foi uma das primeiras linguagens de programao de computador, criada pela Diviso Datamatic da
Minneapolis Honeywell para o seus modelos da srie 800 de computadores voltados a negcios em 1959 .FACT era
um acrnimo para "Fully Automated Compiling Technique". Ela exerceu influncia sobre o projeto da linguagem de
programao COBOL. Alguns aspectos do projeto de FACT foram baseados no projeto lingustico Ingls bsico,
desenvolvido cerca de 1925 por C.K. Ogden.
O software foi realmente concebido pela Computer Sciences Corporation (Fletcher Jones, Roy Nutt, and Robert L.
Patrick) sob contrato com Richard Clippinger da Honeywell. Muitos consideravam FACT melhor do que o COBOL
mas a linguagem no obteve o "imprimatur" do governo americano.
Contribuies ao COBOL
FACT foi uma influncia no projeto de COBOL, e uma das 3 linguagens antecessoras do COBOL segundo
creditado na maioria dos manuais da linguagem.
Vrios elementos da FACT , foram incorporados COBOL:
Definio de dados como os nveis, com itens de grupo e itens elementares.
Atribuio de valores literais de dados no momento da definio (clusula VALUE).
Permite a especificao de uma lista limitada de valores literais em um campo especfico (Nvel de itens de dados
88).
Um gerador de relatrios no-procedural baseado na especificao da aparncia do relatrio desejado (Report
Section).
Qualificao de nomes de dados (IN or OF clause).
Atribuies em grupo de itens semelhantes (clusula MOVE CORRESPONDING).
Verificaes de validade em comandos procedurais (clusula ON ERROR).
Funo de ordenao incorporada a linguagem (SORT).
Chegou a ter uma verso de trabalho?
H alguma questionamento se uma verso de trabalho de FACT chegou a ser lanada pela Honeywell. A linguagem
foi concebida, e uma especificao detalhada liberada (ver referncias), mas dito que "a Computer Sciences
Corporation tambm tem o contrato de implementao de FACT", que parece implicar que eles ainda esto
trabalhando em uma implementao. Naquele tempo, a comisso de curto alcance comeou a desenvolver COBOL,
e Roy Nutt, 1 dos 3 diretores da CSC comeou a trabalhar com este comit em COBOL. No est claro se ele nunca
voltou para implementar FACT, ou se a Honeywell concentrou seus esforos de programao em um compilador
FACT
51
COBOL.
Bibliografia
SAMMET, Jean E. Programming Languages: History and Fundamentals. Englewood Cliffs, New
Jersey:Prentice Hall, 1969.785 p. ISBN 0-13-729988-5
Referncias externas
Manual da linguagem FACT (http:/ / bitsavers. org/ pdf/ honeywell/ fact/ 160-2M_FACT_spec_1960. pdf) (1960)
(pdf)
Um programa simples em FACT (http:/ / bitsavers. org/ pdf/ honeywell/ fact/ 160-2M_FACT_spec_1960. pdf)
52
Outros paradigmas nos anos 50
IPL
Information Processing Language (IPL)
Surgido em 1956
Criado por Allen Newell, Cliff Shaw, Herbert Simon
Compiladores IPL-V, IPL-VI
Influenciou Lisp
Information Processing Language (IPL) uma linguagem de programao desenvolvida por Allen Newell, Cliff
Shaw, e Herbert Simon da RAND Corporation e do Carnegie Institute of Technology criada cerca de 1956. Newell
tinha o papel de especificador linguagem programador da aplicao, Shaw era o programador do sistema e Simon
assumiu o papel de programador do aplicativo do usurio. A linguagem inclui recursos destinados a apoiar
programas que poderiam executar programas para soluo geral de problemas(GPS - General Problem Solving),
incluindo listas, associaes, esquemas (frames), alocao dinmica de memria, tipos de dados, recursividade,
recuperao associativa, funes como argumentos, (geradores de fluxos), e multitarefa cooperativa. IPL foi pioneira
no conceito de processamento de listas, embora em um estilo de linguagem de montagem.
Um gosto da IPL
Uma computador IPL tem:
1. Um conjunto de smbolos. Todos os smbolos so endereos e nomes de clula. Ao contrrio dos smbolos nas
linguagens posteriores, smbolos consistem de caracteres seguido por um nmeros, e so escritos H1, A29, 9-7,
9-100.
1. Nomes de clulas comeando com uma letra so regionais, e so endereos absolutos.
2. Nomes de clulas comeando com "9 -" solocais, e so significativos dentro do contexto de uma lista nica.
Uma lista de 9-1 independente de outra lista 9-1.
3. Outros smbolos (por exemplo, puramente nmeros) so internos.
2. Um conjunto de clulas. As listas so construdas a partir de vrias clulas com referncia mtua. As clulas tm
vrios campos:
1. 1. P, um campo de 3 bits usado para um cdigo de operao quando a clula usada como uma instruo, e no
usado quando a clula de dados.
2. 2. Q, um campo com 3 valores usado para referncia indireta quando a clula usada como uma instruo, e no
usado quando a clula de dados.
3. 3. SYMB, um smbolo usado como o valor na clula.
3. Um conjunto de processos primitivos, que seriam chamados de funes primitivas nas lnguas modernas.
A estrutura de dados principal do IPL a lista, mas as listas de IPL so estruturas mais complexas do que em muitas
outras linguagens. Uma lista constituda por uma nica seqncia de smbolos ligados, como se poderia esperar --
acrescida de algumas listas de descrio, que so listas encadeadas subsidirias, isoladamente, interpretadas como
nomes de atributos e valores alternativos. IPL fornece primitivas para acessar e modificar o valor do atributo pelo
nome. As listas de descrio recebem nomes locais (da forma 9-1). Assim, uma lista chamada L1 contendo os
smbolos S4 e S5, e descrita pelo valor associado de V1 ao atributo A1 e V2 para A2, seria armazenada como se
IPL
53
segue. 0 indica o fim de uma lista, os nomes de clulas 100, 101, etc so smbolos internos gerados automaticamente
e cujos valores so irrelevantes. Essas clulas podem ser espalhadas por toda a memria; somente a L1, que usa um
nome regional que deve ser conhecida globalmente, tem de residir em um lugar especfico.
Exemplo de Lista Estruturada em IPL-V
Name SYMB LINK
L1 9-1 100
100 S4 101
101 S5 0
9-1 0 200
200 A1 201
201 V1 202
202 A2 203
203 V2 0
IPL uma linguagem de montagem para a manipulao de listas. Ela tem algumas clulas que so usadas como
registradores de propsito especial. H1, por exemplo, usada como contador de programa. O campo SYMB de H1
o nome da instruo atual. Contudo, H1 interpretada como uma lista; o LINK de H1, em termos atuais, um
ponteiro para a cabea da pilha de chamadas. Por exemplo, chamadas de subrotinas empilham o SYMB de H1 na
pilha.
H2 a lista vazia. Procedimentos que necessitam alocar memria obtm clulas fora de H2; procedimentos que j
terminaram com a utilizao da memria a colocam em H2. entrada para uma funo, a lista de parmetros dada
em H0, ao sair, os resultados devem ser devolvidos em H0. Muitos procedimentos retornam um resultado booleano
indicando o sucesso ou fracasso, que colocado em H5. Dez clulas, W0-W9, so reservados para armazenamento
de trabalho em rea pblica. Os procedimentos so "moralmente vinculados" (para citar o artigo da Comunications
of the ACM) para salvar e restaurar os valores destas clulas.
H oito instrues, com base nos valores de P: chamada de subrotinas, empilhar/desempilhar S para H0;
empilhar/desempilhar o smbolo em S para a lista anexa S; copiar valor para S; instruo de seleo condicional.
Nestas instrues, S o alvo. S tanto o valor do campo SYMB se Q = 0, o smbolo na clula nomeada como
SYMB se Q = 1, ou o smbolo na clula nomeada pelo smbolo que est na clula nomeada por SYMB se Q = 2. Em
todos os casos, exceto na ramificao condicional, o campo LINK da clula indica qual ser a prxima instruo a
ser executada.
IPL tem uma biblioteca de cerca de 150 operaes bsicas. Isso inclui operaes como:
Smbolos de teste para a igualdade
Pesquisar, definir ou apagar um atributo de uma lista
Localizar o prximo smbolo em uma lista; inserir um smbolo em uma lista, apagar ou copiar uma lista inteira.
Operaes aritmticas (em nomes simbollicos).
Manipulao de smbolos, por exemplo, testar se um smbolo representa um nmero inteiro, ou representa um
smbolo local.
Operaes de Entrada/Sada
"Geradores", que correspondem aos iteradores e os filtros na programao funcional. Por exemplo, um gerador
pode aceitar uma lista de nmeros e produzir a lista de seus quadrados. Um Geradore poderia aceitar funes
devidamente projetadas - rigorosamente, os endereos de cdigo das funes adequadamente concebidas - como
argumentos.
IPL
54
Histria
A primeira aplicao do IPL foi demonstrar que os teoremas de Principia mathematica que eram laboriosamente
comprovados a mo, por Bertrand Russell e Alfred North Whitehead, poderiam ser de fato provados por
computao. De acordo com a autobiografia de Simon Models of My Life, esta primeira aplicao foi desenvolvida
por meio de simulao manual, usando seus filhos como elementos de computao, enquanto escrevia sobre e
segurando cartes com anotaes como os registros que continham as variveis de estado do programa .
IPL foi utilizada para implementar vrios dos programas iniciais do campo da inteligncia artificial, tambm pelos
mesmos autores: o Logic Theory Machine (1956), o General Problem Solver (1957), e seus programas de
computador para jogos de xadrez NSS (1958).
Vrias verses do IPL foram criadas: IPL-I (nunca implementada), LPI-II (1957 por Johnniac), IPL-III (existiu
momentaneamente), IPL-IV, IPL-V (1958, para os computadores IBM 650, IBM 704, IBM 7090, e muitos outros.
Amplamente utilizada), IPL-VI.
No entanto, a linguagem foi rapidamente substituda pela linguagem de programao Lisp, que tinha caractersticas
muito mais poderosas, uma sintaxe mais simples, e os benefcios da coleta de lixo automtica coleta de lixo.
Legado para a programao de computadores
IPL provavelmente introduziu vrios recursos das linguagens de programao:
Manipulo de Listas (somente listas de tomos, no listas em geral)
Listas de propriedades (mas s quando ligado a outras listas)
Funes de ordem superior (excetuando-se o fato de que a linguagem de montagem sempre foi capaz de
calcular com endereos das funes de chamada; IPL foi uma tentativa de generalizar esta propriedade da
linguagem assembly e faz-la de maneira fundamentada.)
Computatao com smbolos (exceto que os smbolos so formados por nmero+letra e no palavras completas)
Mquina virtual
Muitos desses recursos foram generalizadas, clareados, e incorporados ao Lisp e do Lisp para uma ampla gama de
linguagens de programao ao longo das dcadas seguintes.
Publicaes
Newell, A. and F.C. Shaw. "Programming the Logic Theory Machine." Feb. 1957. Proceedings of the Western
Joint Computer Conference, pp. 230-240.
Newell, Allen, and Fred M. Tonge. 1960. "An Introduction to Information Processing Language V." CACM 3(4):
205-211.
Newell, Allen. 1964. Information processing language-v manual; Second Edition. Rand Corporation
[Allen Newell], Englewood Cliffs, NJ: Prentice-Hall.
Bibliografia
HOROWITZ, Ellis (editor). Programming Languages: A Grand Tour. 3ed. Rockvile:Computer Science Press,
1987.512 p.
Simon, Herbert A.; Newell, Allen. (janeiro 1986). "Information Processing Language V on the IBM 650" (em
ingles). Annals of The History of Computing 8 (1): 111. Arlington, VA: American Federation of Information
Processing Societies. ISSN 1058-6180 (http:/ / worldcat. org/ issn/ 1058-6180).
IPL
55
Ligaes externas
Allen Newell (http:/ / stills. nap. edu/ readingroom/ books/ biomems/ anewell. html), Herbert A. Simon,
Biographical Memoirs, National Academy of Sciences - inclui uma pequena seo sobre IPL.
History of Programming Languages: IPL (http:/ / hopl. murdoch. edu. au/ showlanguage. prx?exp=13&
language=IPL)
(http:/ / www-formal. stanford. edu/ jmc/ history/ lisp/ node2. html) influencia da IPL no LISP.
Personagem: John McCarthy
John McCarthy
Cincia da computao
John McCarthy, em 2006
Nacionalidade Estadunidense
Nascimento 4 de setembro de 1927
Local Boston
Morte 23 de outubro de 2011(84anos)
Atividade
Campo(s) Cincia da computao
Instituies Universidade Stanford, Instituto de Tecnologia de Massachusetts, Dartmouth College, Universidade de
Princeton
Alma mater Universidade de Princeton, Instituto de Tecnologia da Califrnia
Orientador(es) Solomon Lefschetz
Orientado(s) Raj Reddy, Barbara Liskov, Ruzena Bajcsy
Conhecido(a) por Lisp
Prmio(s) Prmio Turing (1971), Prmio Pioneiro da Computao (1985), Prmio Kyoto (1988), Medalha Nacional de
Cincias (1990), Medalha Benjamin Franklin (2003)
John McCarthy (Boston, 4 de setembro de 1927 Stanford, Califrnia, 23 de outubro de 2011
[1]
) foi um cientista
da computao estadunidense.
Conhecido pelos estudos no campo da inteligncia artificial e por ser o criador da linguagem de programao Lisp.
Recebeu o Prmio Turing de 1972 e a Medalha Nacional de Cincias dos Estados Unidos de 1991.
Personagem: John McCarthy
56
Publicaes selecionadas
McCarthy, J. 1959. Programs with Common Sense
[2]
. In Proceedings of the Teddington Conference on the
Mechanization of Thought Processes, 756-91. London: Her Majesty's Stationery Office.
McCarthy, J. 1960. Recursive functions of symbolic expressions and their computation by machine
[3]
.
Communications of the ACM 3(4):184-195.
McCarthy, J. 1963a A basis for a mathematical theory of computation. In Computer Programming and formal
systems. North-Holland.
McCarthy, J. 1963b. Situations, actions, and causal laws. Technical report, Stanford University.
McCarthy, J., and Hayes, P. J. 1969. Some philosophical problems from the standpoint of artificial intelligence
[4]
. In Meltzer, B., and Michie, D., eds., Machine Intelligence 4. Edinburgh: Edinburgh University Press. 463-502.
McCarthy, J. 1977. Epistemological problems of artificial intelligence. In IJCAI, 1038-1044.
McCarthy, J. 1980. Circumscription: A form of non-monotonic reasoning. Artificial Intelligence 13(1-2):23-79.
McCarthy, J. 1986. Applications of circumscription to common sense reasoning. Artificial Intelligence
28(1):89-116.
McCarthy, J. 1990. Generality in artificial intelligence. In Lifschitz, V., ed., Formalizing Common Sense. Ablex.
226-236.
McCarthy, J. 1993. Notes on formalizing context. In IJCAI, 555-562.
McCarthy, J., and Buvac, S. 1997. Formalizing context: Expanded notes. In Aliseda, A.; van Glabbeek, R.; and
Westerstahl, D., eds., Computing Natural Language. Stanford University. Also available as Stanford Technical
Note STAN-CS-TN-94-13.
McCarthy, J. 1998. Elaboration tolerance. In Working Papers of the Fourth International Symposium on Logical
formalizations of Commonsense Reasoning, Commonsense-1998.
Costello, T., and McCarthy, J. 1999. Useful counterfactuals. Electronic Transactions on Artificial Intelligence
3(A):51-76
McCarthy, J. 2002. Actions and other events in situation calculus. In Fensel, D.; Giunchiglia, F.; McGuinness, D.;
and Williams, M., eds., Proceedings of KR-2002, 615-628.
[1] Morre John McCarthy, pioneiro da Inteligncia Artificial e pai do Lisp (http:/ / g1. globo. com/ tecnologia/ noticia/ 2011/ 10/
morre-john-mccarthy-pioneiro-da-inteligencia-artificial. html)
[2] http:/ / www-formal.stanford. edu/ jmc/ mcc59. html
[3] http:/ / www-formal.stanford. edu/ jmc/ recursive. html
[4] http:/ / www-formal.stanford. edu/ jmc/ mcchay69.pdf
Ligaes externas
Literatura de e sobre John McCarthy (https:/ / portal. d-nb. de/ opac. htm?query=Woe=123999553&
method=simpleSearch) no catlogo da Biblioteca Nacional da Alemanha
John McCarthy (http:/ / genealogy. math. ndsu. nodak. edu/ id. php?id=22145& fChrono=1) em Mathematics
Genealogy Project
Precedido por
James Hardy Wilkinson
Prmio
Turing
1971
Sucedido por
Edsger Dijkstra
LISP
57
LISP
Lisp
Paradigma multiparadigma: funcional, procedural, orientada a objetos
Surgido em 1958
Criado por John McCarthy
Compiladores internos
Dialetos: Common Lisp, Scheme, Emacs Lisp, Autolisp, Arc, Clojure, Newlisp, Lush, Arc
Influenciou Logo, Smalltalk, Ruby, Dylan
Lisp uma famlia de linguagens de programao concebida por John McCarthy em 1958. Num clebre artigo, ele
mostra que possvel usar exclusivamente funes matemticas como estruturas de dados elementares (o que
possvel a partir do momento em que h um mecanismo formal para manipular funes: o Clculo Lambda de
Alonzo Church). A linguagem Lisp foi projetada primariamente para o processamento de dados simblicos. Ela
uma linguagem formal matemtica. Durante os anos de 1970 e 1980, Lisp se tornou a principal linguagem da
comunidade de inteligncia artificial, tendo sido pioneiro em aplicaes como administrao automtica de
armazenamento, linguagens interpretadas e programao funcional.
O seu nome vem de LISt Processing (a lista a estrutura de dados fundamental desta linguagem). Tanto os dados
como o programa so representados como listas, o que permite que a linguagem manipule o cdigo fonte como
qualquer outro tipo de dados.
Existem diversos dialetos de Lisp, sendo os mais conhecidos o Common Lisp e o Scheme.
Histria
Lisp uma famlia de linguagens que possui uma longa histria. As primeiras idias-chave para a linguagem foram
desenvolvidas por John McCarthy em 1956, durante um projeto de pesquisa em inteligncia artificial. A primeira
implementao da linguagem se d no inverno de 1958. A motivao de McCarthy surgiu da idia de desenvolver
uma linguagem algbrica para processamento de listas para trabalho em IA (inteligncia artificial). Esforos para a
implementao de seus primeiros dialetos foram empreendidos no IBM 704, IBM 7090, DEC PDP-1, DEC PDP-6 e
DEC PDP-10. O dialeto principal entre 1960 e 1965 foi o Lisp 1.5.No incio dos anos 1970, houve outros dois
dialetos predominantes, desenvolvidos atravs de esforos anteriores: MacLisp e Interlisp.
Apesar das primeiras implementaes do Lisp terem sido realizados nos IBM 704 e 7090, trabalhos posteriores
concentraram-se nos DEC PDP-6 e PDP-10, este ltimo sendo o baluarte do Lisp e das pesquisas em IA (inteligncia
artificial) em lugares como o MIT (Massachussets Institute of Tecnology) e as Universidades de Stanford e
Carnegie-Mellon at metade dos anos 1970. O computador PDP-10 e seu antecessor, o PDP-6 eram por definio,
especialmente adequados para o Lisp, por possuirem palavras de 36 bits e endereos de 18 bits. Esta arquitetura
permitia um registro de um cons cell (par pontuado) em uma nica palavra de memria, em instrues simples
extraam o seu car e cdr. Esses computadores possuam tambm poderosas instrues de pilha, que proporcionavam
rpida chamada a funes; porm suas limitaes em 1973 eram evidentes: suportavam um pequeno nmero de
pesquisadores utilizando o Lisp e seu endereamento em 18 bits limitava o espao dos programas. Uma resposta para
o problema de endereamento foi o desenvolvimento do "Lisp Machine",um computador dedicado especialmente
tarefa de trabalhar com a linguagem. Outra soluo foi a utilizao de computadores de uso geral com maior
capacidade de endereamento, como o DEC VAX e o S1 Mark IIA.
LISP
58
Dialetos historicamente significativos
LISP 1
[1]
Primeira Implementao.
LISP 1.5 Primeira verso amplamente distribuda, desenvolvida por McCarthy e outros do MIT. Assim
chamada porque continha vrias melhorias no interpretador "LISP 1" original, mas no foi uma grande
reestruturao como planejado que fosse ser o LISP 2.
Stanford LISP 1.6 Este foi uma sucessora para o LISP 1.5 desenvolvida no Stanford AI Lab, e amplamente
distribuda para sistemas PDP-10 rodando o sistema operacional TOPS-10. Se tornou obsoleta com o advento do
Maclisp e do InterLisp.
Aplicabilidade
Lisp uma linguagem madura, concebida atenciosamente, altamente portvel, linguagem de fora industrial com a
qual desenvolvedores em todo o mundo contam para:
Ferramenta rpida e altamente personalizvel para fazer coisas do dia a dia.
Aplicaes grandes, complexas e crticas as quais seriam impossveis desenvolver em outra linguagem.
Prototipao rpida e Rapid Application Development (RAD).
Aplicaes de alta disponibilidade, principalmente aquelas que necessitam de mudanas aps a etapa inicial.
A linguagem teve um grande sucesso em software do ramo de negcios, engenharia, processamento de documentos,
hipermdia (incluindo a Web), matemtica, grficos e animao (Mirai), inteligncia artificial e processamento de
linguagem natural. Uma das grandes vantagens de Lisp que ela trata o programa como dado, possibilitando assim
um programa inteiro ser dado como entrada de um outro, coisa que no acontece em outras linguagens como C e
Pascal. E usada algumas vezes para definir todos os aspectos de uma aplicao, ou apenas o motor de processamento
interno, ou apenas a interface do usurio; e ainda usada com rotina para prover linguagens de comando interativas,
linguagens de macro ou script e linguagens extensoras de sistemas comerciais.
Caractersticas Tcnicas
A linguagem LISP interpretada, onde o usurio digita expresses em uma linguagem formal definida e recebe de
volta a avaliao de sua expresso. Deste ponto de vista podemos pensar no LISP como uma calculadora, que ao
invs de avaliar expresses aritmticas avalia expresses simblicas, chamadas de expresses. Cada programa em
LISP, , portanto, uma expresso. As expresses so de tamanho indefinido e tem uma estrutura de rvore binria. A
estrutura de utilizao da memria disponvel na forma de listas, pois livra o programador da necessidade de alocar
espaos diferentes para o programa e para os dados, fazendo com que os dados e os programas sejam homogneos,
caracterstica nica da linguagem LISP. Suas principais caractersticas so:
Tipos de dados: tomo e a lista. com apenas esses dois tipos de dados que se constroem as expresses-S, as
estruturas basilares de LISP.
Fraca Tipagem: LISP, em relao a outras linguagens funcionais mais recentes, fracamente tipado, o que causa
complicaes, j que operaes que acessam as suas estruturas de dados so tratadas como funes.
Funes de ordem elevada: Linguagens funcionais tipicamente suportam funes de ordem elevada (exemplo:
funo de uma funo de uma funo de uma).
Avaliao Ociosa: o que ocorre quando uma funo aninhada executa uma computao desnecessria para a
avaliao da funo que a chama, aumentando o tempo de execuo.
Concorrncia (multitarefa): A concorrncia nas linguagens imperativas tradicionais relativamente complexa; o
programador o responsvel pela sincronizao de todas as tarefas (a multitarefa no paradigma procedural to
sofisticada quanto um GOTO). Em contraste, as linguagens funcionais intrinsecamente nos oferecem
oportunidades para a concorrncia: A partir do momento em que uma funo tem mais de um parmetro, estes
parmetros devem em princpio ser avaliados simultaneamente (note que os parmetros seriam as funes
LISP
59
correspondentes s tarefas a serem executadas); A partir deste ponto, a responsabilidade pela sincronizao das
tarefas passa do programador para o compilador (as modernas linguagens funcionais orientadas a multitarefa
dispe de mecanismos atravs dos quais o programador pode guiar o compilador). Todavia, as linguagens
funcionais orientadas a multitarefa permitem ao programador trabalhar em um nvel muito mais elevado do que as
linguagens imperativas destinadas a este mesmo fim.
Um alto nvel de abstrao, especialmente quando as funes so utilizadas, suprimindo muitos detalhes da
programao e minimizando a probabilidade da ocorrncia de muitas classes de erros;
A no dependncia das operaes de atribuio permite aos programas avaliaes nas mais diferentes ordens. Esta
caracterstica de avaliao independente da ordem torna as linguagens funcionais as mais indicadas para a
programao de computadores maciamente paralelos;
A ausncia de operaes de atribuio torna os programas funcionais muito mais simples para provas e anlises
matemticas do que os programas procedurais.
E como desvantagem, destacamos:
Uma menor eficincia para resolver problemas que envolvam muitas variveis (ex. contas de banco) ou muitas
atividades seqenciais so muitas vezes mais fceis de se trabalhar com programas procedurais ou programas
orientados a objeto.
O Common Lisp permite vrias representaes diferentes de nmeros. Estas representaes podem ser divididas em
4 tipos: hexadecimais, octais, binrios e decimais. Estes ltimos podem ser divididos em 4 categorias: inteiros,
racionais, ponto flutuante e complexos.
Implementao das Listas
Originalmente, em Lisp havia duas estruturas de dados fundamentais: o tomo e a lista; o tomo pode ser numrico,
ou alfanumrico. Exemplos de tomos: atomo1, a, 12, 54, bola, nil.
O tomo nil representa o valor nulo e ao mesmo tempo representa uma lista vazia. A lista a associao de
tomos ou outras listas (numa lista chamamos de elementos a cada um dos itens) representandos entre parntesis.
Exemplo de lista:
(esta lista contm 5 tomos)
((jose (22 solteiro)) (antonio (15 casado)))
Normalmente a implementao de uma lista um encadeamento de pares em que o ponteiro esquerda do par
aponta para o elemento correspondente da lista e em que o ponteiro direita do par aponta para a restante lista.
[ . ]
| |
| +---- ponteiro para a restante lista (quando for o ltimo, aponta para nil)
+-------- ponteiro para o contedo do elemento
[ . ] +[ . ] +[ . ] +[ . ] +[ . ]
| | | | | | | | | | | | | |
| +---+ | +---+ | +---+ | +---+ | +--> nil
esta lista contm 5 tomos
Avaliao dados: os tomos quando avaliados retornam eles mesmos. As listas, quando avaliadas, so funes, onde
o primeiro elemento representa o nome da funo e os elementos seguintes so os argumentos para esta funo.
Exemplos de funo:
(+ 3 4)
> 7
(* 5 (+ 2 5))
LISP
60
> 35
(car (quote (a b)))
> a
Normalmente, as implementaes de Lisp providenciam um ambiente interactivo de avaliao de expresses. Os
exemplos acima apresentam a interaco com uma implementao de Lisp. Como pode ser visto tambm, um
programa Lisp pode confundir um programador inexperiente porque requer o uso de muitos parnteses, o que lhe
rendeu um trocadilho anglfono para o nome da linguagem: LISP = Lots of Irritating Stupid Parentheses (traduo:
Montes de Irritantes Parnteses Estpidos), ou ento LISP = Linguagem Infernal Somente de Parnteses.
Existe o mito de que Lisp uma linguagem que s funciona com um interpretador. Na realidade, todos os dialetos
relevantes de Lisp tm compiladores. Alguns dialetos, o compilador uma funo que se pode invocar a partir de
cdigo normal para transformar uma lista (que descreve uma funo) numa funo invocvel. Programas Lisp
comerciais so tipicamente compilados por motivos de eficincia, mas a semntica do Lisp permite que o
programador possa usar programas interpretados e programas compilados ao mesmo tempo. A maioria dos usos
interpretados ocorrem interativamente, para invocar programas compilados a partir de cdigo escrito por um
programador. H exemplos disso acima onde se apresenta o resultado interactivo de invocar funes compiladas.
Exemplos de Funes
(quote expresso)
Retorna a expresso diretamente, sem tentar qualquer forma da avaliao. Ex: (quote jose) retorna jose, e
(quote (jose silva)) retorna (jose silva).
'expresso
Significa o mesmo que (quote expresso). Ex: 'jose retorna jose, e '(jose silva) retorna (jose
silva).
(eval expresso)
fora a avaliar a expresso. Ex: Embora '(+ 3 4) simplesmente retorna (+ 3 4), (eval '(+ 3 4)) fora
a avaliar o (+ 3 4) e portanto retorna 7.
(car lista)
Retorna o primeiro elemento da lista. Ex: (car '(jose silva)) retorna jose. Entre os vrios dialetos de
Lisp, h alguns (por exemplo, ISLISP) que permitem o nome first como alternativa para car.
(cdr lista)
Retorna a lista sem o primeiro elemento. Ex: (cdr '(jose da silva)) retorna (da silva). H dialetos
que usam o nome rest como alternativa para cdr.
(cons atomo lista)
Adiciona tomo ao incio da lista. Ex: (cons 'jose '(da silva)) retorna (jose da silva).
Funes matemticas:
+ (Adio)
- (Subtrao)
* (Multiplicao)
/ (Diviso)
LISP
61
Macros
O grande diferencial de Lisp so as macros. As macros so completamente diferentes das que se encontram em C,
pois estas somente fazem substituio de texto, enquanto que em Lisp as macros so programas que geram
programas.
Uso de Lisp
Lisp foi utilizado para desenvolver o primeiro sistema computacional de matemtica simblica, o Macsyma.
Ele tambm utilizado como linguagem de extenso do software de CAD AutoCAD, desenvolvido pela AutoDesk.
O editor de textos Emacs tambm utiliza Lisp como linguagem de extenso. Segundo o seu prprio autor, Richard
Stallman, Lisp foi o responsvel por tornar o Emacs to popular, pois o fato da linguagem de extenso dele ser to
poderosa permite que ele seja estendido muito alm do que se imaginava que ele originalmente poderia fazer.
A ITA software desenvolveu um sistema de reserva de passagens chamado Orbitz em LISP, ele utilizado por
diversas companhias areas. A Symbolics criou um sistema de modelagem 3D que depois foi adquirido pela IZWare
e atualmente se chama Mirai, ele foi utilizado nos efeitos do filme Senhor dos Anis.
O LISP foi utilizado pelo Paul Graham para desenvolver o sistema de e-commerce da Viaweb, que posteriormente
foi vendido para o Yahoo por US$ 40 milhes, na poca da bolha da internet.
Exemplos de cdigo
Expresses Lambda
((lambda (arg) (+ arg 1)) 5)
Resultado: 6
Fatorial
Common Lisp:
(defun fatorial (n)
(if (= n 0)
1
(* n (fatorial (- n 1)))))
Scheme:
(define fatorial
(lambda (n)
(if (= n 0)
1
(* n (fatorial (- n 1))))))
Embora as definies acima paream correctas, para evitar o transbordamento da pilha pode ser prefervel usar as
seguintes.
Common Lisp:
(defun fatorial (n)
(do ((i n (- i 1))
(resultado 1 (* resultado i)))
((= i 0) resultado)))
LISP
62
Scheme:
(define fatorial
(lambda (n)
(let f ((i n) (resultado 1))
(if (= i 0)
resultado
(f (- i 1) (* resultado i))))))
Na maioria dos dialetos modernos de Lisp usam-se inteiros de preciso numrica indefinida:
(fatorial 40)
815915283247897734345611269596115894272000000000
(length (write-to-string (fatorial 10000)))
35660 ; dgitos no resultado de (fatorial 10000)
(/ (fatorial 10000) (fatorial 9998))
99990000 ; resultado exato
Naqueles dialetos tambm usam-se nmeros racionais de preciso numrica indefinida. Por exemplo, no Common
Lisp se pode ter esta interaco:
pi
3.141592653589793
(rationalize pi) ; aproximao do valor como nmero racional
245850922/78256779
(* (rationalize pi) (fatorial 40)) ; o resultado um nmero racional
66864508220128937516859865761265220075208572928000000000/26085593
(- (/ (* (rationalize pi) (fatorial 40))
(fatorial 40))
(rationalize pi))
0 ; o resultado da aritmtica racional exato
[1] [1] Acessado em 11 de maio de 2010.
Ligaes externas
http:/ / www-formal. stanford. edu/ jmc/ history/ lisp/ lisp. html
http:/ / www-formal. stanford. edu/ jmc/ lisp20th/ lisp20th. html
http:/ / www. gigamonkeys. com/ book/
http:/ / www. paulgraham. com/ onlisp. html
Linguagem LISP (http:/ / www. dca. ufrn. br/ ~adelardo/ lisp/ ) (em Common Lisp)
Introduo Linguagem Lisp (http:/ / www. dca. fee. unicamp. br/ courses/ EA072/ lisp9596/ Lisp9596. html)
Grupo de usurios no Brasil (http:/ / lisp-br. void. cc/ )
Usando Linguagem AutoLISP (http:/ / docs. autodesk. com/ ACD/ 2011/ ENU/ filesALG/
WSfacf1429558a55de185c428100849a0ab7-4130. htm) (Site em ingls da Autodesk)
COMIT
63
COMIT
COMIT
Surgido em 1957
Criado por Victor Yngve
Compiladores COMIT II
Influenciou SNOBOL
COMIT foi a primeira linguagem para processamento de cadeias de caracteres (strings) (compare SNOBOL, TRAC
e Perl), desenvolvida nos computadores da IBM, srie 700/7000 pelo Dr. Victor Yngve e colaboradores no MIT
entre 1957-1965. Yngve criou a linguagem para apoio pesquisa informatizada na rea de lingstica e, mais
especificamente, na rea de traduo automtica para processamento de linguagem natural. A criao de COMIT
levou criao de SNOBOL.
Bibliografia
REILLY, Edwin D.. Milestone in Computer Science and Information Technology. [S.l.]:Greenwood Prenn, 2003.
ISBN 1-57356-521-0
SAMMET, Jean E. Programming Languages: History and Fundamentals. Englewood Cliffs, New
Jersey:Prentice Hall, 1969.785 p. ISBN 0-13-729988-5
Yngve, V. "A programming language for mechanical translation," Mechanical Translation, Vol. 5, pp. 2541,
July, 1958.
YNGVE, Victor H.. Comit II: Computer Programming with COMIT II. Cambridge, Massachusetts:MIT Press,
1972.203 p. ISBN 0-262-74007-9
RPG
64
RPG
RPG, das iniciais de Report Program Generator uma linguagem de programao atravs da qual se especificam
os campos a partir dos quais deveriam ser obtidos os dados para gerar relatrios impressos. Foi criada pela IBM em
1959 e comercializada a partir de 1961
[1]
visando facilitar o desenvolvimento de programas. Era tambm usada,
entre outras, nas mquinas de segunda gerao da Burroughs Corporation: os mainframes B-200, B-300 e B-500.
Aplicaes RPG II ainda so suportadas nos sistemas operacionais IBM z/VSE, IBM z/OS, HP MPE, OpenVMS e
Unisys MCP.
Histria
RPG uma das poucas linguagens criadas para mquinas de cartes perfurados que ainda est em uso hoje em dia.
Isso acontece porque a linguagem evoluiu consideravelmente ao longo do tempo. Ela foi originalmente desenvolvida
pela IBM na dcada de 1960. O nome Report Program Generator descrevia a finalidade da linguagem: gerao de
relatrios a partir de arquivos de dados, incluindo correspondncia total de sub-registro e relatrios.
Fargo (Fourteen-o-one Automatic Report Generation Operation) foi o antecessor de RPG. Tanto Fargo e RPG foram
destinadas a facilitar a transio para a mquina de tabulao IBM da unidade de equipamentos tcnicos para a nova
srie de computadores IBM 1401.
Os tcnicos de mquina de tabulao estavam habituados a plugar fios em painis de comando ou plug-pranchas para
programar a entrada, sada, controlar e executar operaes de somar, subtrair, multiplicar e dividir. Programas em
mquinas de tabulao eram executados por impulsos emitidos em uma mquina ciclo; da, Fargo e RPG emulavam
a noo de ciclo de mquina no ciclo de programa. RPG foi superior e rapidamente e substituiu Fargo como
programa gerador de relatrios.
composta de 05(cinco) tipos de folhas para programar, tais como: File description - voc listava os perifricos e as
identificaes das unidades fsicas,
ex. Reader.....2560 ou 2301
Printer....1403
File extension - voc colocava as tabelas existentes definidas
ex.Tabela IR - Imposto de renda
File Input - descrio de todos os arquivos de entrada.
ex. Cadastro P codigo 06 N
Nome 30 A
valab 08 02 N
e assim sucessivamente
File Calculation
- colocao das frmulas
ex. valor total=a + valab
File output - a gerao do layout do formulario a ser impresso.
Relao Geral de cliente
cdigo Nome valor
________________________________________________
RPG
65
x...x x..........................x xxx.xxx,xx
x...x x..........................x xxx.xxx,xx
total geral........................ xxx.xxx,xx
Bibliografia
Shelly, Gary B.; Cashman, Thomas J.. Introduction to Computer Programming RPG (em ingls).
Fullerton:Anaheim Publishing Company, 1972. ISBN 0-88236-225-9
[1] RPG (ID:207/rpg001) Report Program Generator (http:/ / hopl. murdoch. edu. au/ showlanguage2. prx?exp=207)
66
Os anos 60 e o paradigma imperativo
COBOL
COBOL
Paradigma procedural,
Orientao a objeto
Surgido em 1959
ltima
verso
COBOL2002
Criado por Grace Hopper, William Selden, Gertrude Tierney, Howard Bromberg, Howard Discount, Vernon Reeves, Jean E.
Sammet.
Estilo de
tipagem:
Forte e esttica
Dialetos: HP3000 COBOL/II, COBOL/2, IBM OS/VS COBOL, IBM COBOL/II, IBM COBOL SAA, IBM Enterprise COBOL,
IBM COBOL/400, IBM ILE COBOL, Unix COBOL X/Open, Micro Focus COBOL, Microsoft COBOL, Ryan
McFarland RM/COBOL, Ryan McFarland RM/COBOL-85, DOSVS COBOL, UNIVAC COBOL, Realia COBOL,
Fujitsu COBOL, ICL COBOL, ACUCOBOL-GT, COBOL-IT, DEC COBOL-10, DEC VAX COBOL, Wang VS
COBOL, Visual COBOL, Tandem (NonStop) COBOL85, Tandem (NonStop) SCOBOL (um variante de COBOL74
para criar consolas em terminais baseados em texto)
Influenciada
por
FLOW-MATIC, COMTRAN, FACT
Influenciou PL/I, CobolScript, ABAP
COBOL (sigla de COmmon Business Oriented Language) - Linguagem Comum Orientada para os Negcios uma
linguagem de programao orientada para o processamento de banco de dados comerciais.
[1]
a linguagem de
programao inteira mais usada, produto do Departamento de Defesa norte-americano sob a direo da
contra-almirante Grace Murray Hopper.
As especificaes do COBOL 2002 incluem suporte programao orientada a objetos e outras caractersticas das
linguagens modernas.
[2]
Histria e especificao
O COBOL foi criado por um comit de investigadores de vrias instituies civis e governamentais durante o
segundo semestre de 1959. As especificaes eram em grande parte inspiradas na linguagem de programao
FLOW-MATIC inventada pela Grace Hopper - referida como "a me da lngua COBOL." A linguagem de
programao da IBM COMTRAN inventada pelo Bob Bemer tambm foi utilizada, mas a especificao da FACT da
Honeywell tinha sido distribuda at tarde aos membros do comit do processo, e teve relativamente pouco impacto.
O uso corrente e estudo do FLOW-MATIC como a nica linguagem do grupo de estudo que efetivamente tinha sido
utilizada numa situao real, fez com que fosse bastante atractiva ao comit.
[3]
Em 8 de abril de 1959, na CODASYL (Conference on Data Systems Language) destinada a usurios e pessoas da
universidade, no centro de computao da Universidade da Pensilvnia, o Departamento de Defesa dos Estados
Unidos, posteriormente, concordou em patrocinar e supervisionar as prximas atividades. A reunio presidida por
Charles A. Phillips foi realizada no Pentgono em 28/29 de maio de 1959 (exatamente um ano aps a reunio em
COBOL
67
Zurique do ALGOL 58), no foi decidido definir de trs comisses: de curto, mdio e longo alcance (a ltima nunca
foi realmente formada). Foi o Comit de Curto Prazo, presidido por Joseph Wegstein do National Bureau of
Standards que durante os meses seguintes criou uma descrio da primeira verso do COBOL. O comit foi
constitudo por membros representantes de seis fabricantes de computadores e trs rgos governamentais, a saber:
Burroughs Corporation, IBM, Minneapolis-Honeywell (Honeywell Labs), RCA, Sperry Rand, e Sylvania Electric
Products, e a Fora Area dos Estados Unidos, o David Taylor Model Basin e a Agncia Nacional de Padres
(National Bureau of Standards ou NBS). Este comit foi presidido por um membro do NBS. Um comit de Mdio
Prazo e outro de Longo Prazo foram tambm propostos na reunio do Pentgono. Entretanto, embora tenha sido
formado, o Comit de Mdio Prazo nunca chegou a funcionar; e o Comit de Longo Prazo nem chegou a ser
formado. Por fim, um subcomit do Comit de Curto Prazo desenvolveu as especificaes da linguagem COBOL.
Este subcomit era formado por seis pessoas:
William Selden e Gertrude Tierney da IBM
Howard Bromberg e Howard Discount da RCA
Vernon Reeves e Jean E. Sammet da Sylvania Electric Products
A deciso de usar o nome "COBOL" foi feita em uma reunio do comit realizada em 18 de setembro de 1959. O
subcomit completou as especificaes para o COBOL em dezembro de 1959.
O primeiro compilador para COBOL foi posteriormente implementado em 1960 e em 6/7 de dezembro,
essencialmente o mesmo programa COBOL funcionou em dois computadores diferentes, um computador RCA e
uma Remington-Rand Univac, demonstrando que a compatibilidade pode ser alcanada.
ANS COBOL 1968
Depois de 1959 o COBOL sofreu vrias modificaes e melhorias. Na tentativa de superar o problema da
incompatibilidade entre diferentes verses de COBOL, o American National Standards Institute (ANSI) desenvolveu
uma forma padro de lngua, em 1968, aps o lanamento da verso COBOL-61 que se tornou a pedra angular para
mais verses. Esta verso ficou conhecida como American National Standard (ANS) COBOL.
COBOL 1974
Em 1974, a ANSI publicou uma verso revista da (ANS) COBOL, que continha uma srie de recursos que no
estavam na verso 1968.
[]
COBOL 1985
Em 1985, a ANSI publicou ainda uma outra verso revista que tinha novas funcionalidades que no apareciam no
padro 1974, como construes de linguagem mais notavelmente estruturadas ("terminadores de escopo"), incluindo
END-IF, END-PERFORM, END-READ, etc.
COBOL 2002 e o COBOL orientado a objeto
A linguagem continua a evoluir at hoje. No incio de 1990, decidiu-se acrescentar a orientao a objetos na prxima
reviso completa do COBOL. A estimativa inicial era ter esta reviso concluda em 1997 e um ISO CD (Committee
Draft, rascunho do comit) disponvel at 1997. Alguns fornecedores (incluindo a Micro Focus, a Fujitsu, a Veryant
e a IBM) introduziram a sintaxe orientada a objetos com base nos rascunhos de 1997 ou outro da reviso completa.
A verso final aprovada no padro ISO (adotado como um padro ANSI por INCITS) foi aprovada e disponibilizado
em 2002.
Assim como a C++ e a Java, os compiladores COBOL esto disponveis enquanto a linguagem se move em direo
padronizao. A Fujitsu, a Micro Focus e a Raincode atualmente suportam os compiladores COBOL orientados a
objetos visando o .NET.
[4]
COBOL
68
O COBOL 2002 incluiu muitos outros recursos alm orientao a objetos, (mas no esto limitados a):
Suporte a idiomas (incluindo, mas no limitado a suporte ao Unicode)
Processamento baseado em Locale
Funes amigveis ao usurio
CALL (e funo) prottipos (para a verificao de parmetro em tempo de compilao)
Ponteiros e sintaxe para a obteno/liberao de armazenagem
Convenes de chamada de e para lnguas no-COBOL, como C
Suporte para execuo em ambientes estruturas como .NET e Java (incluindo COBOL instanciado como
Enterprise JavaBeans)
Suporte a Bit e Bool
Suporte a "True" (at esta melhoria, itens binrios eram truncados (pela especificao de base-10) dentro da
diviso de dados)
Suporte a ponto flutuante
Resultados aritmticos padro (ou portteis)
Gerao e parsing de XML
Histria de normas COBOL
As especificaes aprovadas por todo o Comit de Curto Prazo foram aprovadas pelo Comit Executivo em 3 de
janeiro de 1960, e enviadas para a grfica do governo que editou e imprimiu essas especificaes como COBOL 60.
O American National Standards Institute (ANSI) produziu vrias revises do padro COBOL, incluindo:
COBOL-68
COBOL-74
COBOL-85
Intrinsic Functions Amendment - 1989
Corrections Amendment - 1991
Aps as alteraes de 1985 o padro ANSI (que era adotado pela ISO), o desenvolvimento e a apropriao foi
assumida pela ISO. As seguintes edies e TRs (Relatrios Tcnicos) foram emitidas pelo padro ISO (e adotados
como ANSI):
COBOL 2002
Finalizer Technical Report - 2003
Native XML syntax Technical Report - 2006
Bibliotecas de coleo de classes orientadas a objeto - aprovao pendente
Desde 2002, o padro ISO tambm est disponvel para o pblico codificado como ISO / IEC 1989.
O trabalho progride na prxima reviso integral da norma COBOL. A aprovao e disponibilidade era esperado
primeiros em 2010. Para obter informaes sobre esta reviso, ver o mais recente projeto desta reviso, ou para ver o
que as outro trabalhos em progresso no padro COBOL, consulte o site de normas do COBOL
[5]
.
Legado
Programas em COBOL esto em uso globalmente em agncias governamentais e militares alm de empresas
comerciais, e esto sendo executados em sistemas operacionais como o da IBM z/OS e z/VSE, as famlias POSIX
(Unix / Linux, etc) e Windows da Microsoft, bem como Unisys OS 2200. Em 1997, o Gartner Group relatou que
80% dos negcios do mundo rodavam em COBOL com mais de 200 bilhes de linhas de cdigo existentes e cerca
de 5 bilhes de linhas de cdigo novo por ano.
COBOL
69
Caractersticas
O COBOL teve como meta servir como uma linguagem de programao para negcios. Os programas para negcios
no precisam de clculos to precisos como os encontrados em engenharia, assim o COBOL foi concebido
basicamente com as caractersticas:
[6]
Acesso rpido a arquivos e bases de dados
Atualizao rpida de arquivos e bases de dados
Gerao de uma grande quantidade de informaes
Sada com um formato compreensvel ao usurio
O COBOL geralmente a linguagem escolhida em clculos financeiros por suportar aritmtica inteira aplicada a
nmeros muito grandes (milhes, bilhes etc) ao mesmo tempo que capaz de lidar com nmeros muito pequenos
como fraes de centavos. Outra caracterstica a formatao, classificao e gerao de relatrios.
[]
Ol, mundo
Um exemplo do programa "Ol, Mundo" em COBOL:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-WORLD.
PROCEDURE DIVISION.
DISPLAY 'Ola, mundo'.
STOP RUN.
Existem vrios dialetos do COBOL. Alguns compiladores, por exemplo, permitem o uso de aspas duplas, alm do
padro de aspas simples:
DISPLAY "Hello, world".
Ol, OS/360 cerca de 1972
Em um IBM System/360 executando OS/360 MVT 21.8f, por volta de 1972, o teste Ol, Mundo teria levado
perfurado cartes de 80 colunas, contendo o cdigo-fonte semelhante a:
//COBUCLG JOB CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1)
//HELOWRLD EXEC COBUCLG,PARM.COB='MAP,LIST,LET'
//COB.SYSIN DD *
001 IDENTIFICATION DIVISION.
002 PROGRAM-ID. 'HELLO'.
003 ENVIRONMENT DIVISION.
004 CONFIGURATION SECTION.
005 SOURCE-COMPUTER. IBM-360.
006 OBJECT-COMPUTER. IBM-360.
0065 SPECIAL-NAMES.
0066 CONSOLE IS CNSL.
007 DATA DIVISION.
008 WORKING-STORAGE SECTION.
009 77 HELLO-CONST PIC X(12) VALUE 'HELLO, WORLD'.
075 PROCEDURE DIVISION.
090 000-DISPLAY.
100 DISPLAY HELLO-CONST UPON CNSL.
110 STOP RUN.
COBOL
70
//LKED.SYSLIB DD DSNAME=SYS1.COBLIB,DISP=SHR
// DD DSNAME=SYS1.LINKLIB,DISP=SHR
//GO.SYSPRINT DD SYSOUT=A
//
Estrutura bsica
No COBOL h trs tipos bsicos de dados usados nas instrues:
Numrico (sinalizado ou no, com decimal ou inteiros)
Alfanumrico
Constantes figurativas
O COBOL consiste basicamente em quatro divises separadas:
IDENTIFICATION DIVISION
A IDENTIFICATION DIVISION possui informaes documentais, como nome do programa, quem o codificou e
quando essa codificao foi realizada.
ENVIRONMENT DIVISION
A ENVIRONMENT DIVISION descreve o computador e os perifricos que sero utilizados pelo programa.
DATA DIVISION
A DATA DIVISION descreve os arquivos de entrada e sada que sero usadas pelo programa. Tambm define as
reas de trabalho e constantes necessrias para o processamento dos dados.
PROCEDURE DIVISION
A PROCEDURE DIVISION contm o cdigo que ir manipular os dados descritos na DATA DIVISION. nesta
diviso que o desenvolvedor descrever o algoritmo do programa.
IDENTIFICATION DIVISION
ENVIRONMENT DIVISION
* CONFIGURATION SECTION
* INPUT-OUTPUT SECTION
DATA DIVISION
* FILE SECTION
* WORKING-STORAGE SECTION
* LOCAL-STORAGE SECTION
* LINKAGE SECTION
* COMMUNICATION SECTION
* REPORT SECTION
* SCREEN SECTION
PROCEDURE DIVISION
rea de codificao no COBOL
Colunas Descrio
1 a 6 branco (ser preenchido com a numerao COBOL)
7 (branco) linha de codificao
* (asterisco) linha de comentrio
- (hfen) continuao de literal no numrico
8 a 72 instrues do COBOL iniciando na coluna 8
COBOL
71
Crticas e defesas
Falta de estruturalismos
Em sua carta a um editor em 1975, intitulado "Como que vamos dizer verdades que podem machucar?" que era
crtica a vrias linguagens de programao contemporneas como o COBOL, o cientista da computao e vencedor
do Prmio Turing, Edsger Dijkstra comentou que "O uso de COBOL mutila a mente, o seu ensino deve, portanto, ser
considerado como uma infrao penal".
Em sua resposta divergente ao artigo de Dijkstra e "declarao ofensiva", o cientista da computao Howard E.
Tompkins defendeu que COBOL era estruturada: "Os programas em COBOL com controle de fluxo complicado na
verdade tendem a "paralisar a mente'", mas isso foi porque "H muito muitos desses programas de aplicativos de
negcios escritos por programadores que nunca aprenderam corretamente sobre o benefcio de manter o COBOL
estruturado..."
[7]
Alm disso, a introduo de OO-COBOL adicionou suporte para cdigo orientada a objeto, bem como funes
definidas pelo usurio e tipos de dados definidos pelo usurio para o repertrio de COBOL.
Problemas de compatibilidade aps normalizao
O COBOL 85 no era totalmente compatvel com as verses anteriores, resultando nem um "parto de cesariana" do
COBOL 85. Joseph T. Brophy, CIO, Travelers Insurance, lideraram uma fora-tarefa para informar aos usurios de
COBOL dos pesados custos de reprogramao para implementar o novo padro. Como resultado, o Comit ANSI do
COBOL recebeu mais de 3.200 cartas do pblico, em sua maioria negativas, exigindo que o comit fizesse as
alteraes. Por outro lado, a converso para COBOL 85 foi pensada para aumentar a produtividade nos prximos
anos, justificando, assim, os custos de converso.
Sintaxe verbosa
A sintaxe da COBOL tem sido muitas vezes criticada por sua verbosidade.
[]
No entanto, os defensores notam que
isto foi intencional no projeto da linguagem, e muitos a consideram um dos pontos fortes da COBOL. Um dos
objetivos do projeto de COBOL foi que gerentes, supervisores e usurios no-programadores pudesse ler e entender
seu cdigo. por isso que a COBOL tem o ingls como sintaxe e elementos estruturais, incluindo: substantivos,
verbos, oraes, frases, sees e divises. Consequentemente, a COBOL considerada por pelo menos uma fonte a
ser "A linguagem de programao mais legvel, compreensvel e documentada em uso hoje. [...] No s este
legibilidade geralmente auxilia o processo de manuteno, mas quanto mais velho um programa se tornar, mais
valiosa se torna essa legibilidade."
[8]
Por outro lado, a mera capacidade de ler e entender algumas linhas de cdigo da
COBOL no concede a um executivo ou usurio final a experincia e os conhecimentos necessrios para projetar,
construir e manter sistemas de software de grande porte.
Outras defesas
Alm disso, tradicionalmente a COBOL uma linguagem simples, com alcance limitado da funo (sem ponteiros,
sem tipos definidos pelo usurio e sem funes definidas pelo usurio),
[9]
estimulando um estilo de codificao
simples. Isso fez com que seja bem adequada ao seu domnio principal de computao de negcios, onde a
complexidade do programa encontra-se em regras de negcio que precisam ser codificados em vez de sofisticados
algoritmos e estruturas de dados. E porque a norma no pertence a nenhum fornecedor em particular, os programas
escritos em COBOL so altamente portteis. A lngua pode ser utilizada numa grande variedade de plataformas de
hardware e sistemas operativos. E sua estrutura hierrquica rgida restringe a definio de referncias externas para a
Diviso de Ambiente (environment division), o que simplifica a mudana de plataforma em particular.
[1] Mrcia Regina Sawaya. Dicionario De Informatica & Internet (http:/ / books. google. com/ books?id=pJAnIST_RY0C& pg=PA83). NBL
Editora; 1999. ISBN 978-85-213-1099-0. p. 83.
COBOL
72
[2] Rui Bivar De Oliveira. The Power of Cobol: For Systems Developers of the 21st Century (http:/ / books. google. com/
books?id=K3pXAAAACAAJ). Booksurge Llc; 30 May 2006. ISBN 978-0-620-34652-8.
[3] Jean_Sammet, The Early History of COBOL (http:/ / portal. acm. org/ citation. cfm?id=1198367), p.121161, ACM SIGPLAN Notices,
Association for Computing Machinery, Inc., 1978
[4] NetCOBOL for .NET supports COBOL migration and software development in the .NET environment (http:/ / www. adtools. com/ products/
windows/ netcobol.html)
[5] http:/ / www. cobolstandard. info
[6] Behrouz A. Forouzan; Sophia Chung Fegan. Foundations of Computer Science: From Data Manipulation to Theory of Computation (http:/ /
books.google. com/ books?id=xu4jcMBih8QC& pg=PT197). Cengage Learning Editores; 2003. ISBN 978-970-686-285-3. p. 197.
[7] "In Defense of Teaching Structured COBOL as Computer Science," Howard E. Tompkins, ACM SIGPLAN Notices, Vol. 18, Issue 4, April
1983.
[8] COBOL Tutorial - Introduction to COBOL (http:/ / www. csis. ul. ie/ cobol/ course/ COBOLIntro. htm#part1)
[9] "Em COBOL no h funes, mas podemos utilizar o comando PER- FORM para executar sub-rotinas." Cleuton Sampaio. Web 2.0 e
Mashups - Reinventando a Internet (http:/ / books. google. com/ books?id=ziA1KREwEIAC& pg=PA46). Brasport; 2007. ISBN
978-85-7452-338-5. p. 46.
Lawrence R. Newcomer, Cobol Estruturado, Schaum McGraw-Hill, ISBN 0-07-450315-4
Renato Erich Kleiber, Carto de Referncia: Cobol 80, Livros Tcnicos e Cientficos Editora S/A, ISBN
85-216-0411-4
Ligaes externas
Associao Brasileira de Profissionais COBOL (http:/ / www. abpc. com. br/ )
Clube Cobol (http:/ / www. clubecobol. com. br)
(em ingls) COBOL-Standard Committee (http:/ / www. cobolstandards. com/ ) (em ingls)
(em ingls) COBOL Tutorial (http:/ / www. csis. ul. ie/ cobol/ default. htm) (em ingls)
(em ingls) COBOL Defined (http:/ / www. infogoal. com/ cbd/ cobol. htm) (em ingls)
(em ingls) The future's bright ... the future's Cobol (http:/ / www. techworld. com/ applications/ features/ index.
cfm?featureid=3056) (em ingls)
Personagem: Peter Naur
73
Personagem: Peter Naur
Peter Naur
Cincia da computao
Nacionalidade
dinamarqus
Nascimento 25 de outubro de 1928(85anos)
Local Frederiksberg
Atividade
Campo(s) Cincia da computao
Instituies Regnecentralen, Instituto Niels Bohr, Universidade Tcnica da Dinamarca, Universidade de Copenhague
Tese 1957: Minor planet 51 Nemausa and the fundamental system of declinations
Conhecido(a) por ALGOL, formalismo de Backus-Naur
Prmio(s) Prmio Pioneiro da Computao (1986), Prmio Turing (2005)
Peter Naur (Frederiksberg, 25 de outubro de 1928) um informtico dinamarqus.
um dos pioneiros no estudo da cincia da computao, agraciado com o Prmio Turing. Seu sobrenome representa
o N na notao BNF - Formalismo de Backus-Naur -, a qual usada na descrio da sintaxe da maioria das
linguagens de programao, tendo Naur contribudo para a criao da linguagem ALGOL 60.
Antes de atuar na cincia da computao Naur foi astrnomo, e em 1957 defendeu seu doutorado nesta rea. Durante
10 anos, de 1959 a 1969, trabalhou na Regnecentralen, o instituto de computao da Dinamarca, e ao mesmo tempo
lecionava no Instituto Niels Bohr e na Universidade Tcnica da Dinamarca. No perodo de 1969 a 1998, Naur foi
professor de Cincia da Computao na Universidade de Copenhaga.
Suas maiores reas de atuao foram no design, estruturao e desempenho de programas computacionais e
algoritmos. Naur tambm foi pioneiro em reas como Engenharia e Arquitetura de Software. Em seu livro
Computing: A Human Activity (1992), que uma coleo de suas contribuies para a cincia da computao, ele
rejeitou a escola formalista de programao que considerava a programao como uma ramificao da matemtica.
Naur no gostava de ter sido associado a BNF (a ele atribuda por Donald Knuth) e dizia que preferiria que a BNF se
Personagem: Peter Naur
74
chamasse Forma Normal de Backus.
Naur no gostava do termo cincia da computao, chegando a sugerir que este fosse chamado datalogia, termo este
que foi adotado em muitos paises escandinavos (na Dinamarca e na Sucia usa-se datalogi).
Em anos posteriores, Naur falou abertamente sobre a investigao cientfica em geral. Naur poderia ser identificado
com a escola Empirista, segundo a qual uma pessoa no deve procurar conexes profundas entre coisas que se
manifestam no mundo, mas se ater aos fatos observveis. Naur atacava certos ramos da filosofia e da psicologia a
partir desse ponto de vista. Uma das ltimas coisas em que trabalhou foi no desenvolvimento de uma teoria de
pensamento humano que ele chamava de Synapse-State Theory of Mental Life.
Peter Naur ganhou em 2005 o Prmio Turing, por seu trabalho no desenvolvimento da linguagem de programao
ALGOL 60. Reconheceu-se em particular seu papel como editor do influente Report on the Algorithmic Language
ALGOL 60 o qual abre caminho no uso da BNF. Naur tornou-se o primeiro dinamarqus a receber este prmio.
Referncias
Minor planet 51 Nemausa and the fundamental system of declinations, tese de doutorado, 1957
Report on the algorithmic language ALGOL 60, publicado em vrios jornais, incluindo Communication of the
ACM 3,1960.
Revised report on the algorithmic language ALGOL 60, Communications of the ACM 6, 1963.
Go to statements and good Algol style, BIT 3, 1963.
Software Engineering (editado com auxlio de B. Randell e J. N. Buxton), 1969, republicado em 1976
Studentlitteratur (com C. Gram, J. Hald, H. B. Hansen e A. Wessel), Datamatik, 1969.
Matematik 4 kursusbog (com B. Pedersen), 2 volumes, Universidade de Copenhague, 1971, 2a. edio, 1972.
Studentlitteratur, Concise Survey of Computer Methods, 1974.
Datalogi 2 1975/76, Universidade de Copenhague, 1975, nova edio 1976.
ACM Press/Addison-Wesley, Computing: A Human Activity, 1992.
Kluwer Academic Publishers, Knowing and the Mystique of Logic and Rules, 1995.
Antifilosofisk leksikon: Tnkning - sproglighed - videnskabelighed , 1999, ISBN 87-987221-0-7; edio em ingls
2001, ISBN 87-987221-1-5
Psykologi i videnskabelig rekonstruktion, 2002, ISBN 87-987221-2-3
Naur, P.. Computing versus human thinking. ACM 50, 2007. DOI= http:/ / doi. acm. org/ 10. 1145/ 1188913.
1188922
Ligaes externas
http:/ / www. naur. com/
Precedido por
Vint Cerf e Robert Kahn
Prmio
Turing
2005
Sucedido por
Frances Allen
ALGOL 60
75
ALGOL 60
ALGOL 60, nome criado a partir de ALGOrithmic Language, a linguagem de programao normalmente
conhecida como ALGOL, porm apenas uma das linguagens existentes nessa famlia.
Para maiores detalhes, ver ALGOL
SNOBOL
SNOBOL 4
Paradigma multiparadigma
Surgido em 1962
Criado por David J. Farber, Ralph E. Griswold e Ivan P. Polonsky
Compiladores SNOBOL, SPITBOL, Vanilla (DOS)
Influenciada por COMIT
Influenciou Icon, Lua
A linguagem de programao SNOBOL 4 (StriNg Oriented symBOlic Language number 4) a quarta e ltima
encarnao de uma srie de linguagens de programao especficas destinadas manipulao de sequncias de
caracteres. baseada nos princpios de correspondncia de padres (Em ingls: pattern matching) para solucionar
problemas de manipulao de seqencias. Estas linguagens foram desenvolvidas entre 1962 e 1967 nos Laboratrios
Bell, da AT&T, por D. J. Farber, R. E. Griswold, e F. P. Polensky.
A linguagem SNOBOL 4 suporta alguns tipos de dados pr-definidos, tais como nmeros inteiros e reais de preciso
simples, sequncias de caracteres, modelos, matrizes e tabelas, e tambm permite ao programador a definio de
tipos de dados adicionais e de novas funes. Distingue-se das linguagens de programao principais do tempo por
incluir modelos (i.e., um tipo de dados cujos valores podem ser manipulados de todas as formas permitidas para
todos os outros tipos de dados existentes na linguagem) como um tipo de dados de primeira classe e por
disponibilizar operadores para a concatenao e alterao de modelos. As sequncias de caracteres geradas durante a
execuo podem ser tratadas como programas e executadas.
Um modelo SNOBOL 4 tanto pode ser muito simples como extremamente complexo. Um modelo simples apenas
uma sequncia de texto (ex: "ABCD"), mas um modelo complexo pode ser uma estrutura de grandes dimenses
descrevendo, por exemplo, a gramtica completa de uma linguagem de computador.
Nos anos 70 e 80, o SNOBOL 4 foi muito usado nas cincias humanas como linguagem de manipulao de texto.
Em anos mais recentes, a sua popularidade decaiu, ao mesmo tempo que linguagens mais novas e eficientes, tais
como o Awk e o Perl, tornaram popular a manipulao de sequncias de caracteres por meio de expresses comuns.
O SNOBOL 4 agora uma linguagem de interesse especial, utilizada principalmente por entusiastas.
Exemplos de cdigo
Mdia e Somatrio de N Inteiros
* PROGRAMA QUE CALCULA A MEDIA E O SOMATRIO DE N NUMEROS
I = 0
SOMA = 0
TOPO NUMERO = TRIM(INPUT) :F(FIM)
SNOBOL
76
I = I + 1
SOMA = SOMA + NUMERO :(TOPO)
FIM MEDIA = SOMA / I
OUTPUT = 'SOMATORIO = ' SOMA
OUTPUT = 'MEDIA = ' MEDIA
END
Bibliografia
GRISWOLD, Ralph E.; POAGE, J. F.; POLONSKY, I. P.. The SNOBOL4 Programming Language. 2ed.
Englewood Cliffs, New Jersey:Prentice Hall, 1971.256 p. ISBN 0-13-815373-6
ORGANICK, E. I.;FORSYTHE, A. I.;PLUMMER, R. P.. Programming Language Structures. New
York:Academic Press, 1978.659 p. ISBN 0-12-528260-5
TUCKER Jr., Allen B.. Programming Languages. 2ed. New York:McGraw-Hill, 1986.590 p. ISBN
0-07-065416-6
WEXELBLAT, Richard L.. History of Programming Languages. New York:Academic Press, 1981.758 p. ISBN
0-12-745040-8
CPL
A Linguagem de Programao Combinada (CPL) foi uma linguagem de programao desenvolvida no
Laboratrio de Matemtica da Universidade de Cambridge juntamente com a Universidade de Londres, durante a
dcada de 1960. O esforo na colaborao das duas universidades foi responsvel pelo Combinada no nome da
Linguagem de Programao (anteriormente o nome era Cambridge Programming Language).
Foi influenciada pela ALGOL 60, mas, ao invs de ser extremamente pequena, elegante e simples, a CPL era grande,
moderadamente elegante e complexa. Tinha a inteno de ser boa para programao cientfica (como FORTRAN e
ALGOL) e tambm para programao comercial (como COBOL).
A CPL foi um pouco demais para os computadores e para a tecnologia imatura de compiladores da poca.
Compiladores que funcionavam devidamente foram desenvolvidos prximo de 1970, mas a linguagem CPL, nunca
foi muito popular e parece ter desaparecido, sem deixar vestgios, nessa mesma poca.
A BCPL foi uma linguagem baseada na CPL (que significava Basic CPL, mas originalmente Bootstrap CPL) e era
mais simples e direcionada para a programao de sistemas, particularmente para desenvolver compiladores. A
BCPL influenciou a criao da Linguagem B que influenciou por sua vez a Linguagem C, uma das mais importantes
linguagens de programaes at hoje.
Referncias
"The main features of CPL" by D.W. Barron, J.N. Buxton, D.F. Hartley, E. Nixon, and C. Strachey. The
Computer Journal, volume 6, issue 2, pp.134-143 (1963).
BASIC
77
BASIC
BASIC
Paradigma Imperativo, estruturado, procedural
Surgido em 1964
Criado por John G. Kemeny, Thomas E. Kurtz
Estilo de tipagem: Forte, esttica, explcita
Dialetos: Just BASIC, RealBasic, Vintage BASIC
Influenciada por ALGOL 60, Fortran II, JOSS
Influenciou DarkBASIC, Euphoria, Logic Basic, Perl, REXX, VBScript, Visual Basic, Visual Basic .NET
BASIC (acrnimo para Beginner's All-purpose Symbolic Instruction Code; em portugus: Cdigo de Instrues
Simblicas de Uso Geral para Principiantes), uma linguagem de programao, criada com fins didticos, pelos
professores John George Kemeny e Thomas Eugene Kurtz em 1964 no Dartmouth College. BASIC tambm o
nome genrico dado a uma grande famlia de linguagens de programao derivadas do BASIC original.
Provavelmente existem mais variaes de BASIC do que de qualquer outra linguagem de programao.
[carecede
fontes?]
Caracterizao da linguagem
BASIC uma linguagem imperativa de alto nvel, pertencente terceira gerao, originalmente compilada (apesar
de suas implementaes em microcomputadores ter disseminado a verso interpretada) e no estruturada, por ter sido
fortemente baseada em Fortran II.
[carecede fontes?]
O fato de sua verso original ser compilada se explica por ter sido
implementada num sistema de tempo compartilhado, o que faz bastante sentido.
Com o tempo, BASIC evoluiu, criando condies para a programao estruturada e at mesmo para a programao
orientada a objetos, como o caso das ltimas verses do Visual Basic.
Evoluo
Um programa em BASIC tradicional tem suas linhas numeradas, sendo que quase que padro usar nmeros de 10
em 10 (o que facilita a posterior introduo de linhas intermedirias, se necessrio). Os comandos so poucos,
simples e facilmente compreensveis na lngua inglesa (LET, IF,...). Um programa em BASIC, que imprime todos os
nmeros pares entre A e B, lidos do teclado, seria escrito como:
10 INPUT A,B
20 FOR I=A TO B STEP 1
30 IF MOD(I,2)>0 THEN 50
40 PRINT I
50 NEXT I
60 END
O programa demonstra a falta de estruturao da linguagem original, pois o IF funciona como um GOTO
condicional, o que favorece o cdigo espaguete.
Com o tempo os nmeros das linhas sumiram (ou se tornaram opcionais) e as instrues estruturadas foram
aparecendo, com vrias outras modificaes. O mesmo programa poderia ser escrito como:
[carecede fontes?]
BASIC
78
INPUT A,B
FOR I=A TO B
IF MOD(I,2)=0 THEN PRINT I
NEXT
J em Visual Basic, as coisas se complicam se estivermos usando programao visual e componentes. Um programa
em Visual Basic for Applications usando 3 componentes de texto e um boto poderia ter a seguinte aparncia:
Private Sub CommandButton1_Click()
For I = Val(Text1.Text) To Val(Text2.Text)
If I Mod 2 = 0 Then
Text3.Text = Text3.Text + Str(I)
End If
Next
End Sub
Veja que nesse programa so usados componentes, que so objetos, e suas propriedades. O comando print foi
substitudo por no ser adequado ao ambiente de janelas tpico da linguagem. A sub-rotina ativada quando um
boto chamado.
Aprendizado
Todas as verses de BASIC so geralmente fceis de aprender, principalmente por serem muito permissivas quando
comparadas a linguagens fortemente estruturadas e tipadas, como Pascal. Porm, o aprendizado de BASIC muitas
vezes informal e por muitos considerado prejudicial, por no reforar as regras tradicionais de programao
estruturada e outros cuidados de programao que se tornaram prtica quase que obrigatria com o tempo.
[carecede
fontes?]
Por sua extrema simplicidade, o BASIC permitia a implementao de interpretadores razoavelmente poderosos em
memrias mnimas, o que era uma vantagem enorme em relao aos micro-computadores.
[carecede fontes?]
Um interpretador BASIC pode ser escrito com 25 linhas de cdigo C (intencionalmente compactado). Um cdigo em
Pascal que interpreta Tiny Basic, bem estruturado e comentado tem apenas 1300 linhas.
Um Sinclair ZX80, por exemplo, possua 1K de RAM e 4K de ROM, que continha um interpretador BASIC, um
editor de programao e o sistema operacional. O uso de compactao permitia que o programa a seguir contivesse
apenas 39 bytes.
[carecede fontes?]
10 FOR A=16424 TO 17424 18 Bytes
20 PRINT PEEK(A); 12 Bytes
30 NEXT A 5 Bytes
40 STOP 4 Bytes
A linguagem
Sintaxe
Cada instruo em BASIC ocupa uma linha. Para usar mais de uma linha necessrio usar um caractere de
continuao. Um dos aspectos mais conhecidos de BASIC era a utilizao de numerao para as linhas. A maioria
dos interpretadores possui um comando RENUMBER que permite renumerar todas as linhas de acordo com um
intervalo pr-determinado (como em RENUMBER 10). Alguns, mas no todos, dialetos mais modernos
abandonaram os nmeros e suportam a maioria, ou todas, as instrues de controle estruturada e declarao de
dados, permitindo a construo de programas estruturados como em Pascal.
[carecede fontes?]
BASIC
79
Variantes recentes, como Visual Basic, introduziram caractersticas de orientao a objeto. A gerncia de memria
mais fcil que na maioria das linguagens de procedimentos, pois normalmente existe um coletor de lixo.
[carecede
fontes?]
Procedimentos e controle de fluxo
Ao contrrio de outras linguagens, como C, a biblioteca de funes de BASIC no externa, mas considerada parte
intrnseca da linguagem.
[carecede fontes?]
Tipos de dado
No BASIC original existem apenas dois tipos de variveis, as textuais e as numricas. Para declarar uma varivel
numrica voc precisa escrever uma caractere alfabtico seguido ou no de um numrico. E para as variveis textuais
voc deve escrever caracteres alfabticos e no final o smbolo $.
[carecede fontes?]
O BASIC, mesmo o original,
oferece bons recursos para a manipulao de "strings" (variveis alfanumricas, de tipo texto) e esta uma facilidade
prevista no projeto da linguagem. A evoluo da linguagem, entretanto, possibilitou que novos tipos de dados fossem
acrescentados, como a manipulao de ponto flutuante.
Criao
A linguagem original foi projetada em 1963 por John George Kemeny e Thomas Eugene Kurtz, sendo implementada
por uma equipe de estudantes de Dartmouth sob sua direo. BASIC foi projetado para permitir que os estudantes
escrevessem programas para o Dartmouth Time-Sharing System. Em 1 de maio, s 4 horas, dois programas
[1]
escritos em BASIC correram ao mesmo tempo nos computadores de Dartmouth. A linguagem atacava a
complexidade das linguagens existentes na poca e se destinada a uma nova classe de usurios que passava a ter
acesso ao computador com o aparecimentos dos sistemas de tempo compartilhado, isto , usurios que no estavam
to interessados na velocidade, mas sim em usar a mquina, e que no pretendiam dedicar suas vidas computao,
conforme Kurtz. A ideia por trs da criao de BASIC permitir principalmente a estudantes
[2]
de diferentes reas
de conhecimento escreverem simples programas que no dependam de profundos conhecimentos tcnicos. Nos anos
seguintes, com o aparecimento de outros dialetos da linguagem, a verso original passou a ser conhecida como
Darthmouth BASIC.
Os oito princpios de projeto de BASIC foram:
ser fcil, para ser utilizada por iniciantes;
ser uma linguagem de programao de uso geral;
permitir que especialistas adicionassem caractersticas avanadas, sem tornar a linguagem mais complicada para
os iniciantes;
ser interativa;
fornecer mensagens de erro claras e amigveis;
responder rapidamente para programas pequenos;
no exigir o conhecimento do hardware do computador;
proteger o sistema operacional do usurio.
BASIC
80
Precursores
A linguagem foi criada a partir de Fortran II e parcialmente inspirada em ALGOL 60, com adies para torn-la
adequada ao time-sharing, tendo sido consideradas caractersticas de outros sistemas como JOSS, CORC e at
mesmo LISP.
[carecede fontes?]
Em Dartmouth, a linguagem foi precedida de outros experimentos destinados ao ensino de programao, como as
implementaes de SAP e DART (um Fortran II simplificado) DARSIMCO e DOPE.
[carecede fontes?]
Inicialmente a linguagem se concentrava apenas em trabalho matemtico, incluindo uma extenso para aritmtica de
matrizes, sendo que o suporte completo a manipulao de cadeias de caracteres em ASCII foi adicionado em
1965.
[carecede fontes?]
Sua primeira implementao foi em um mainframe GE-265, que suportava mltiplos terminais. Ao contrrio do que
se tornaria mais tarde comum, sua primeira verso era compilada, sendo bastante eficiente e mais rpida que Fortran
II e ALGOL 60 no GE-265 em muitas tarefas razoveis de programao, como maximizar a regra de
Simpson.
[carecede fontes?]
Os projetistas da linguagem decidiram que ela devia permanecer em domnio pblico, para que pudesse se espalhar.
Tambm a tornar disponvel para escolas de ensino mdio (high schools) na regio de Darthmouth, e fizeram um
esforo considervel para promover a linguagem. Como resultado, o conhecimento de BASIC se tornou
razoavelmente comum para uma linguagem de programao da poca e ela passou a ser implementada por vrios
fabricantes, sendo bastante popular nos minicomputadores mais novos como os PDPs da DEC e o Nova da Data
General. Nesses computadores era normal a linguagem ser interpretada em vez de compilada.
[carecede fontes?]
O BASIC original
O BASIC original possua apenas 15 comandos:
LET, para atribuio, como em:
10 LET A=1
READ, para ler o valor de uma ou mais variveis de declaraes DATA, como em:
20 READ B,C,D
DATA, para definir listas de valores a serem usados lidos pelo READ, como em:
30 DATA 10,20,30
PRINT, para imprimir no dispositivo de sada o valor de expresses, como em:
40 PRINT A,"VALOR DE ",B+C
GOTO, para redirecionar a execuo do programa para outra linha, como em:
50 GOTO 500
IF-THEN, para redirecionar um programa para outra linha, de acordo com o valor de uma expresso lgica, como
e:
500 IF B<C THEN GOTO 20
FOR-TO-STEP, para iniciar uma repetio, como em:
510 FOR I=1 to 7 STEP 2
NEXT, para indicar a continuao de uma repetio, como em:
BASIC
81
600 NEXT I
END, que deve acabar todo o programa e indica seu fim se o processamento l chegar.
STOP, que equivale a um GOTO para a linha contendo o END
DEF, para definir uma funo.
GOSUB, para pular para um ponto do programa com a semntica de sub-rotina.
RETURN, para voltar de uma sub-rotina.
DIM, para definir vetores e matrizes.
REM, para comentrios.
Um programa em BASIC composto de linhas numeradas, possivelmente com intervalos entre os nmeros. Era
normal numerar as linhas dos programas de 10 em 10. Alm disso, a linguagem fornecia funes como SIN (seno) e
ABS (valor absoluto). O prprio manual j apresenta algumas extenses, como a capacidade de manipular matrizes
em CARDBASIC.
[carecede fontes?]
Tpico programa em BASIC
Um tpico programa em BASIC (original), seria o seguinte:
10 REM RESOLVE EQUACAO DO SEGUNDO GRAU
20 READ A,B,C
30 IF A=0 THEN GOTO 400
40 LET D=B*B-4*A*C
50 IF D<0 THEN GOTO 420
60 PRINT "SOLUCAO"
70 IF D=0 THEN GOTO 200
80 PRINT "PRIMEIRA SOLUCAO",(-B+SQR(D))/(2*A)
90 PRINT "SEGUNDA SOLUCAO",(-B-SQR(D))/(2*A)
100 GOTO 20
200 PRINT "SOLUCAO UNICA",(-B)/(2*A)
300 GOTO 20
400 PRINT "A DEVE SER DIFERENTE DE ZERO"
410 GOTO 20
420 PRINT "NAO HA SOLUCOES REAIS"
430 GOTO 20
490 DATA 10,20,1241,123,22,-1
500 END
Note que o BASIC original no tinha uma instruo de entrada de dados (que mais tarde seria nomeada de INPUT),
e que o READ, ao no encontrar mais dados para ler (em uma declarao DATA), considerava o programa
terminado. Alm disso, note que a forma de programar escolhida para esse exemplo tpica da um programa BASIC,
o que leva questo do cdigo espaguete.
[carecede fontes?]
O comando INPUT foi acrescentado linguagem em sua
verso 4, conforme o manual
[3]
de 1968.
BASIC
82
Clculos matemticos em BASIC
O programa abaixo foi interpretado em Vintage Basic e calcula os primeiros n nmeros perfeitos.
1000 INPUT "DIGITE UM NUMERO"; N%
1010 LET D1%=1
1020 LET Ni%=0
1030 LET D2%=1
1040 LET S1%=0
1050 LET Q%=D1%/D2%
1060 IF Q%*D2%=D1% THEN S1%=S1%+D2%
1080 IF S1%>D1% THEN GOTO 1120
1090 D2%=D2%+1
1100 IF D2%<D1% THEN GOTO 1050
1110 IF S1%=D1% AND D1%<>1 THEN Ni%=Ni%+1 : PRINT "N"Ni%":" D1%
1120 D1%=D1%+1
1130 IF Ni%<N% THEN GOTO 1030
1140 END
A era de ouro do BASIC
Apesar do uso da linguagem em vrios minicomputadores, foi a introduo do Altair 8800 e a posterior exploso dos
computadores pessoais a partir de 1975 que iniciou a disseminao do BASIC. Praticamente todo microcomputador
fornecia um ambiente de programao BASIC residente j em suas ROMs.
[carecede fontes?]
A maioria das linguagens de programao muito grande para caber na pequena memria que a maioria dos usurios
tinha condio de comprar para suas mquinas. Alm disso, as baixssimas velocidades da memria secundria
utilizadas, fitas de papel e cassetes de udio, faziam com que uma linguagem pequena como BASIC fosse uma boa
opo.
[carecede fontes?]
Esse BASIC, acrescido de comandos tpicos de sistemas operacionais (mesmo que simplssimos) e de edio,
residente em ROM, funcionava como uma espcie de linguagem prpria do computador, o mais prximo existente
do que hoje chamamos de sistema operacional, e a maioria das aplicaes da poca seria escrita no dialeto de BASIC
especfico da mquina.
[carecede fontes?]
Outra vantagem da linguagem que ela era razoavelmente bem conhecida pelos jovens projetistas que se
interessaram pelos microcomputadores naquela poca, como resultado do proselitismo de Kemeny e Kurtz.
[carecede
fontes?]
Um dos primeiros interpretadores a aparecer para o Altair 8800 foi o Tiny Basic, uma implementao simples
originalmente escrita por Doutor Li-Chen Wang, e portada para o Altair por Dennis Allison sob pedido de Bob
Albrecht (que mais tarde fundaria o Dr. Dobb's Journal. Em 1976 o projeto e cdigo completo de Tiny Basic foram
publicados nessa revista.
[carecede fontes?]
Companhias mais novas tentaram seguir o sucesso da MITS, IMSAI, North Star e Apple Inc., criando ento a
revoluo dos microcomputadores. Simultaneamente, vrias firmas lanaram outras verses de BASIC, alm das
empresas de computadores, algumas empresas de software apresentavam interpretadores com melhorias sobre as
verses que vinham com as mquinas, e outras para algumas mquinas que vinham sem o apoio da linguagem, como
as verses baseadas em CP/M-80. Breve, havia muitos milhes de mquinas rodando BASIC no mundo, certamente
com mais programadores do que todas as outras linguagens somadas.
[carecede fontes?]
BASIC
83
Exemplos de cdigos
Ol Mundo
10 PRINT "Ol, Mundo!"
20 END
ANSI BASIC
INPUT "Qual o seu nome"; UserName$
PRINT "Hello "; UserName$
DO
INPUT "Quantas estrelas voc quer"; NumStars
Stars$ = ""
Stars$ = REPEAT$("*", NumStars)
REM em MS BASIC a instruo seria Stars$ = STRING$(NumStars, "*")
PRINT Stars$
DO
INPUT "Voc quer mais estrelas"; Answer$
LOOP UNTIL Answer$<> ""
Answer$ = LEFT$(Answer$, 1)
LOOP WHILE UCASE$(Answer$) = "Y"
PRINT "Adeus ";
FOR I = 1 TO 200
PRINT UserName$; " ";
NEXT I
PRINT
Crticas
Muitos anos aps seu lanamento, profissionais respeitados da computao, especialmente Edsger W. Dijkstra,
expressaram a opinio que o uso da expresso GOTO, que existia em vrias linguagens alm de BASIC, promovia
prticas no desejveis de programao. Alguns tambm acusaram BASIC de ser muito simples ou muito
lenta.
[carecede fontes?]
Um dos principais problemas com as verses originais de BASIC era a falta de uma estrutura re-entrante de chamada
de sub-rotinas ou funes, como acontece ALGOL, Pascal e na maioria das linguagens modernas de programao
(mesmo em verses mais modernas de BASIC). Isso uma propriedade similar a dos Fortran originais e um grande
entrave modularizao de programas.
[carecede fontes?]
Durante algum tempo, BASIC foi a linguagem de escolha para ensinar programao, porm hoje em dia
considerada uma linguagem pouco adequada para o ensino, pois a facilidade e permissividade da linguagem permitia
a construo de programas que no seguem princpios bsicos de programao, o que se reflete mais tarde na
construo de programas mais complexos por aqueles que foram ensinados com BASIC. Como linguagem de
aprendizado, BASIC foi substituda principalmente por Pascal.
[carecede fontes?]
BASIC
84
Bibliografia
BASIC version 2 manual
[4]
. Dartmouth College Computation center, 1964. (PDF)
BASIC version 4 manual
[5]
. Dartmouth College Computation center, 1968. (PDF)
Lien, David A. (1986). The Basic Handbook: Encyclopedia of the BASIC Computer Language (3rd ed.).
Compusoft Publishing. ISBN 0-932760-33-3. Documents dialect variations for over 250 versions of BASIC.
Jean E. Sammet. Programming languages: History and fundamentals. Prentice-Hall, Englewood Cliffs, N.J.
1969.
Padres
ANSI/ISO/IEC Standard for Minimal BASIC:
ANSI X3.60-1978 "FOR MINIMAL BASIC"
ISO/IEC 6373:1984 "DATA PROCESSING - PROGRAMMING LANGUAGES - MINIMAL BASIC"
ANSI/ISO/IEC Standard for Full BASIC:
ANSI X3.113-1987 "PROGRAMMING LANGUAGES FULL BASIC"
ISO/IEC 10279:1991 "INFORMATION TECHNOLOGY - PROGRAMMING LANGUAGES - FULL
BASIC"
ANSI/ISO/IEC Addendum Defining Modules:
ANSI X3.113 INTERPRETATIONS-1992 "BASIC TECHNICAL INFORMATION BULLETIN # 1
INTERPRETATIONS OF ANSI 03.113-1987"
ISO/IEC 10279:1991/ Amd 1:1994 "MODULES AND SINGLE CHARACTER INPUT ENHANCEMENT"
[1] http:/ / www. computer. org/ portal/ web/ awards/ cp-kurtz"
[2] http:/ / cis-alumni.org/ TKurtz.html
[3] http:/ / www. bitsavers. org/ pdf/ dartmouth/ BASIC_4th_Edition_Jan68. pdf
[4] http:/ / www. bitsavers. org/ pdf/ dartmouth/ BASIC_Oct64. pdf
[5] http:/ / www. bitsavers. org/ pdf/ dartmouth/ BASIC_4th_Edition_Jan68. pdf
Ligaes externas
BASIC - Beginners All-purpose Symbolic Instruction Code (http:/ / hopl. murdoch. edu. au/ showlanguage.
prx?exp=176) (em ingls)
Lista de dialetos de BASIC (http:/ / en. wikipedia. org/ wiki/ List_of_BASIC_dialects) (em ingls)
Retrobits (http:/ / forum. retrobits. com. br/ viewtopic. php?f=35& t=6773) (em portugus) - pgina sobre a
histria da linguagem BASIC, com imagens dos autores e os alunos que participaram da construo da linguagem
MSX.bas (http:/ / www. basic. msxall. com/ ) (em portugus) - Jogos, aplicativos e muitos outros programas MSX
Basic para download
Vintage BASIC (http:/ / www. vintage-basic. net/ ) (em ingls) - Pgina do interpretador Vintage BASIC
PL/I
85
PL/I
PL/I
Surgido em 1964
Criado por IBM e o comit de desenvolvimento de linguagens de programao SHARE
Estilo de tipagem: procedural, imperativa, estruturada
Influenciada por COBOL, Fortran, ALGOL
Influenciou SP/k, B, REXX, AS/400 Linguagem controle
PL/I (alternativamente PL/1, l-se p-ele-um) significa Programming Language One e uma linguagem de
programao desenvolvida pela IBM em meados de 1960. A previso da IBM era que a linguagem fosse utilizada
em cincias, inteligncia artificial e negcios. Por um perodo de tempo foi a principal linguagem ensinada na
Universidade de Michigan Dearborn. Entretanto, a popularidade declinou nos anos recentes, devido introduo de
lnguagens de programao mais modernas voltadas para o ambiente Mainframe. Sua principal funco o
processamento/manipulao de dados; suporta recurso e alocao dinmica.
Principais caractersticas
Linguagem de programao imperativa e estruturada, de controle e recursividade do ALGOL 60
Fortemente tipada
Subprogramas e E/S formatadas do FORTRAN
Manipulao de arquivos e registros do COBOL
Alocao dinmica de memria e estruturas encadeadas do LISP
Operaes de arrays do APL
Contribuies de PL/I para futuras linguagens
Tratamento de interrupo - execuo de procedimentos especficos quando uma condio excepcional ocorre
Multitarefa - especificao de tarefas que podem ser executadas concorrentemente
Sintaxe do comando PL/I
<instruo> ;
Qualquer comando / comentrio PL/I devero ser codificados entre as colunas 2 a 72
O trmino de qualquer comando PL/I identificado por ponto e vrgula (;)
Um comando PL/I poder ser codificado em uma ou mais linhas
No h posio nem caracter para indicar a continuao de um comando PL/I
O comentrio em PL/I dever estar codificado entre os caracteres "/*" (abre comentrio) e os caracteres "*/"
(fecha comentrio)
O comentrio PL/I poder ser condificado em qualquer ponto do fonte e poder ser de uma ou mais linhas
No existem palavras reservadas no PL/I
O ponto decimal no PL/I sempre o ponto (.)
PL/I
86
Estrutura padro
LABEL: PROC OPTIONS (MAIN) ; Identificao do programa
DECLARE arquivos , Declarao de variveis
campos ,
PICTUREs de edio ,
tabelas ,
estruturas ,
inicializaes ,
redefinies ,
funes (BUILT-IN) ,
rotinas externas;
ON CONDITIONS ; Tratamento de condies
COMANDOS ; Comandos / Instrues
movimentaes ;
expresses ;
concatenao ;
condies ;
LOOPs ;
manipulao de arquivos ;
manipulao de banco de dados ;
chamadas de rotinas internas;
chamadas de rotinas externas;
COMANDOS ;
ROT-LABEL: PROC ; Identificao da
Sub-rotina interna
END ROT-LABEL ; Finalizao da
Sub-rotina interna
END LABEL ; Finalizao do programa
Operadores de comparao
= Igual
^= diferente
> maior
>= maior ou igual
< menor
<= menor ou igual
COMANDO "SELECT"
SELECT (<campo>);
WHEN (<valor> ou <condio>) --<comando>--;
...
WHEN (<valor> ou <condio>) --<comando>--;
OTHERWISE --<comando>--;
END;
PL/I
87
COMANDO "IF"
IF --<condio>-- THEN --<comando>--;
ELSE --<comando>--;
COMANDO "WHILE"
DO WHILE (--CONDICAO--);
--COMANDOS--;
END;
Nome de variveis
O compilador PL/I permite usar variveis que so consideradas "reservadas" em outras linguagens (como IF, ELSE,
THEN,etc) e usa o mesmo smbolo('=') para verificar a igualdade e atribuio. Por exemplo:
IF IF = THEN THEN THEN = ELSE; ELSE ELSE = IF;
Exemplos de cdigo
Procura por uma string
FINDSTRINGS:
PROCEDURE OPTIONS(MAIN);
/* READ A STRING, THEN PRINT EVERY */
/* SUBSEQUENT LINE WITH A MATCH */
DECLARE PAT VARYING CHARACTER(100),
LINEBUF VARYING CHARACTER(100),
(LINENO, NDFILE, IX) FIXED BINARY;
NDFILE = 0;
ON ENDFILE(SYSIN) NDFILE=1;
GET EDIT(PAT) (A);
LINENO = 1;
DO WHILE (NDFILE=0);
GET EDIT(LINEBUF) (A);
IF LENGTH(LINEBUF) > 0
THEN
DO;
IX = INDEX(LINEBUF, PAT);
IF IX > 0
THEN
DO;
PUT SKIP EDIT (LINENO,LINEBUF)(F(2),A);
END;
END;
LINENO = LINENO + 1;
END;
END FINDSTRINGS;
PL/I
88
Hello World
HELLO: PROCEDURE OPTIONS (MAIN);
/* A PROGRAM TO OUTPUT HELLO WORLD */
FLAG = 0;
LOOP: DO WHILE (FLAG = 0);
PUT SKIP LIST('HELLO WORLD!');
END;
END HELLO;
N-Primeiros Nmeros Perfeitos
program nperfeitos
declare
n,qtd,soma,contador,i,j: int;
numeros: array[1..40] of int;
begin
display('Valor de N')
reply(n);
qtd=0;
i=2;
while qtd<n do
begin
soma=0;
j=1;
while j<i do
begin
if (i%j=0) then
begin
soma=soma+j;
end;
else
j=j+1;
endif;
if (soma=i) then
begin
numeros[qtd+1]=i;
qtd=qtd+1;
end;
else i=i+1;
endif;
for contador=1 to n do
begin
display(numeros[contador]);
end;
PL/I
89
Bubble Sort
SHELL: PROCEDURE OPTIONS (MAIN);
DECLARE
ARRAY(50) FIXED BIN(15),
(K,N) FIXED BIN(15);
GET LIST(N);
GET EDIT((ARRAY(K) DO K = 1 TO N));
PUT EDIT((ARRAY(K) DO K = 1 TO N));
CALL BUBBLE(ARRAY,N);
END BUBBLE;
BUBBLE: PROCEDURE(ARRAY,N); /* BUBBLE SORT*/
DECLARE (I,J) FIXED BIN(15);
DECLARE S BIT(1); /* SWITCH */
DECLARE Y FIXED BIN(15); /* TEMPO */
DO I = N-1 BY -1 TO 1;
S = '1'B;
DO J = 1 TO I;
IF X(J)>X(J+1) THEN DO;
S = '0'B;
Y = X(J);
X(J) = X(J+1);
X(J+1) = Y;
END;
END;
IF S THEN RETURN;
END;
RETURN;
END SRT;
Ligaes externas
Compilador PL/I IBM Rational Developer for i V7.5 (http:/ / www. ibm. com/ developerworks/ downloads/ r/ rdi/
index. html)
PL/i Programming Language for i.CanDoIt (http:/ / www. csimn. com/ CSI_pages/ PLI_1. html)
PL/I RESOURCES PAGE (http:/ / members. dodo. com. au/ ~robin51/ resource. htm)
BCPL
90
BCPL
BCPL
Surgido em 1966
Criado por Martin Richards
Influenciada por CPL
Influenciou B, C, C++
BCPL uma linguagem de programao, criada por Martin Richards, da Universidade de Cambridge em 1966.
Anos depois foi utilizada por Ken Thompson para desenvolver a B, que se tornaria a base para a C.
O nome BCPL um acrnimo para Basic Combined Programming Language (Linguagem de Programao Bsica
Combinada).
Hello World
O famoso Programa Ol Mundo, escrito em BCPL:
GET "LIBHDR"
LET START () BE
$(
WRITES ("Ol Mundo!*N")
$)
Icon
91
Icon
Icon
Paradigma Programao estruturada
Programao imperativa
Programao procedural
Surgido em 1977
ltima verso 9.5.0 (12 de abril de 2010)
Criado por Ralph E. Griswold
Estilo de tipagem: Dinmica, Fraca
Dialetos: Unicon
Influenciada por ALGOL, C, Pascal, SNOBOL 4
Influenciou Lua, Python
Licena: Domnio pblico
Pgina oficial
www.cs.arizona.edu/icon/
[1]
Icon uma linguagem de programao interpretada de alto nvel, derivada do ALGOL. Tambm herdou
propriedades do SNOBOL 4 (processamento de cadeias de caracteres). Por ser derivada do ALGOL, faz parte de
uma classe de linguagens de programao estruturadas, tendo assim, uma sintaxe similar a de C e Pascal. A partir de
Icon, descende a linguagem de programao Unicon, que adiciona orientao a objetos. Icon foi implementado em
C; em sua pgina oficial, esto disponveis, alm do cdigo fonte e binrios, alguns livros, dentre os quais um
descreve o processo da implementao de Icon.
Sintaxe bsica
De muitas maneiras, Icon partilha caractersticas de uma linguagem de script: as variveis no precisam ser
declaradas, os tipos so definidos de forma automtica, e os nmeros podem ser convertidos para strings e de volta
automaticamente. Outra caracterstica comum a muitas linguagens de script, mas no a todas, a falta de um caracter
de fim de linha. Em Icon as linhas que no terminam com ponto-e-vrgula so terminadas por um ponto-e-vrgula
implcito, se fizer sentido. Os procedimentos so as construes de blocos bsicas na linguagem Icon, e apesar de
utilizarem a sintaxe do Pascal funcionam mais como funes de C e podem retornar valores. Em Icon no h a
palavra-chave function.
Uma caracterstica interessante de Icon que a linguagem reconhee que em muitas computaes existe mais de um
valor a ser retornado. Um exemplo tpico das razes reais de uma equao de 2 grau, que, nos casos onde o valor
de delta positivo, retorna duas respostas. Uma das operaes de manipulao de cadeias de caracteres de Icon a
funo find(l, s) que encontra as posies na sequncia s onde l ocorre. A expresso:
write(find("a", "banana"))
ir escrever 2. Mas a expresso:
every write(find("a", "banana"))
ir escrever 2, 4 e 6. O motivo para isto que a funo find retorna uma sequncia de resultados (2|4|6).
Icon
92
Histria
Icon o ltimo de uma srie de linguagens de alto nvel da programao destinada a facilitar as tarefas de
programao envolvendo strings e estruturas. A linguagem original, SNOBOL, foi desenvolvida no Bell Telephone
Laboratories no incio dos anos 1960. SNOBOL evoluiu para SNOBOL4, que ainda est em uso. Linguagens
subsequentes foram desenvolvidas na Universidade do Arizona, com o apoio da National Science Foundation.
Embora tenha objetivos semelhantes e muitos recursos semelhantes, Icon tem pouca semelhana superficial com
SNOBOL4.
Implementaes Icon foram desenvolvidas por professores, funcionrios e estudantes da Universidade do Arizona,
com contribuio significativa de voluntrios ao redor do mundo. O Icon history de Ralph e Madge Griswold
aparecem nas pr-publicaes da segunda History of Programming Languages Conference (HOPL-II), ACM
SIGPLAN Notices, Maro de 1993 (Vol. 28, n 3).
O nome Icon no uma sigla, nem representam nada em particular, embora a palavra iconoclastic foi mencionado
quando o nome foi escolhido. O nome precede ao uso comum de cones para referir-se a pequenas imagens usadas
em interfaces grficas de usurio de agora. Isso s vezes induz as pessoas a pensar que Icon projetado para criar ou
manipular cones, mas no h nenhuma boa soluo para esse problema.
Caractersticas
Execuo voltada a um objetivo
Um dos conceitos chaves do Icon que as estruturas de controle so baseadas em expresses de "sucesso" ou
"falha", ao invs de lgica booleana, como na maioria das outras linguagens de programao. Sob este modelo,
simples comparaes como if a < b no significa "se a operao a direita for verdade" como seriam na maioria das
linguagens; ao invs disso, significa algo mais parecido com "se a operao a direita for um sucesso". Nesse caso o
operador < sucede se a comparao for verdadeira, ento no final o resultado o mesmo. Alm disso, o operador <
retorna seu segundo argumento se for bem sucedido, permitindo coisas como a < b < c, um tipo comum de
comparao que no pode ser diretamente declarada na maioria das linguagens. A utilidade desse conceito se torna
mais clara quando se considera exemplos prticos. Como Icon usa sucesso ou falha para todo o controle de fluxo,
este simples cdigo:
if a := read() then write (a)
ir copiar uma linha da sua entrada padro para sua sada padro. O que interessante sobre este exemplo que o
cdigo ir funcionar mesmo se o read() causar um erro, por exemplo, se o arquivo no existir. Neste caso a
declarao a := read() ir falhar, e write(a) simplesmente no ser chamado.
Sucessos e falhas so passadas "para cima" atravs de funes, isso quer dizer que uma falha numa funo aninhada
far com que as funes que esto chamando-a iro falhar tambm. Por exemplo, no podemos escrever um
programa para copiar um arquivo de entrada inteiro em apenas uma linha:
while write(read())
Quando o comando read() falhar, no final do arquivo por exemplo, a falha ser transmitida at a cadeia e write()
tambm ir falhar. O while, sendo a estrutura de controle, pra em caso de falha, o que significa que ir parar quando
o arquivo estiver vazio. Para efeito de comparao, considere um exemplo semelhante escrito em pseudocdigo
baseado em Java:
try {
while ((a = read()) != EOF) {
write(a);
Icon
93
}
} catch (Exception e) {
// no faz nada, sai do loop
}
Neste caso, h duas comparaes necessrias, uma para fim de arquivo (EOF) e outra para todos os outros erros.
Como Java no permite que os erros sejam comparados como elementos lgicos, conforme previsto na Icon, o longa
sintaxe try / catch deve ser usada. Blocos try tambm impe uma penalidade de desempenho por simplesmente
us-los, mesmo se nenhum erro ocorrer, um custo distribudo que a Icon evita.
Icon refere-se a este conceito como execuo voltada a um objetivo, referindo-se maneira que a execuo continua
at que algum objetivo seja alcanado. No exemplo acima, o objetivo ler todo o arquivo, o comando read()
continua a ter sucesso enquanto h informaes para ser lida, e falha quando no h. O objetivo , portanto,
codificado diretamente na linguagem, em vez de usar declaraes para verificar cdigos de retorno ou construes
semelhantes.
Geradores (Generators)
Expresses em Icon muitas vezes retornam um nico valor, por exemplo, x <5 ir avaliar e ter sucesso com o valor 5
ou falhar. No entanto, vrios dos exemplos abaixo dependem do fato de que muitas expresses no retornam
imediatamente sucesso ou falha, retornando valores durante o mesmo. Isso leva os exemplos com every e to, every
causa to a continuar a retornar os valores at que ele falhar.
Este um conceito-chave na Icon, conhecidos como generators(geradores). Generators conduzem muitas das
funcionalidades de lao na linguagem, mas fazem mais diretamente, o programador no escreve um lao depois tira e
comparar os valores, Icon ir fazer de tudo isto para voc.
Na linguagem de Icon, a avaliao de uma expresso ou funo resulta em uma sequncia de resultados. Uma
sequncia de resultados contm todos os valores possveis que podem ser gerados pela expresso ou funo. Quando
a sequncia de resultados est esgotada (por exemplo, no existem mais valores na sequncia de resultados), a
expresso ou funo falha. Iterao sobre a sequncia de resultado obtida de forma explcita atravs da avaliao
voltada a um objetivo do Icon ou explicitamente, por meio da clusula every.
Icon inclui vrios geradores-construtores. A sintaxe alternadora permite uma srie de itens serem gerados em
sequncia at que um falha:
1 | "hello" | x < 5
pode gerar "1", "hello" e "5" se x for menor que 5. Alternadores pode ser lido como "ou" em muitos casos, por
exemplo:
if y < (x | 5) then write("y=", y)
ir escrever o valor de y, se for menor do que x ou 5. Internamente Icon verifica todos os valores da esquerda para a
direita at uma ser bem sucedida ou acabar a lista e ele retorna uma falha. Lembre-se que as funes no sero
chamadas a menos que a chamada de dentro no falhar, de modo que este exemplo pode ser reduzido para:
write("y=", (x | 5) > y)
Outro gerador simples o to, que gera listas de inteiros, every write (1 to 10) ir fazer exatamente o que parece. A
sintaxe-bang gera todos item de uma lista, every write (!aString) ir ter como saida cada caractere de aString em uma
nova linha. Para demonstrar o poder deste conceito, considere operaes com strings. A maioria das linguagens
incluem uma funo conhecida como find ou indexOf que retorna a localizao de uma string de outra. Considere:
Icon
94
s = "All the world's a stage. And all the men and women merely players";
i = indexOf("the", s)
Este cdigo ir retornar 4, a posio da primeira ocorrncia da palavra "the". Para obter a prxima instncia "the"
uma forma alternativa deve ser utilizada, i = indexOf("the", s, 5) o 5 no final dizendo que ele deveria
olhar a partir da posio 5 para frente. A fim de extrair todas as ocorrncias de "the", um lao deve ser usado:
s = "All the world's a stage. And all the men and women merely players";
i = indexOf("the", s)
while i != -1 {
write(i);
i = indexOf("the", s, i+1);
}
Em Icon a funo find um gerador, e ir retornar a prxima ocorrncia da string cada vez que for reiniciada antes
de finalmente falhar depois que ela passar no final da string. O mesmo cdigo em Icon pode ser escrito:
s := "All the world's a stage. And all the men and women merely players"
very write(find("the",s))
find ir retornar o ndice da prxima instncia "the" cada vez que ele reiniciado por every, finalmente passando
pelo final da string e falhar. Como no exemplo anterior, isso far com que write falhe, e saia do lao every. Claro que
h momentos em que voc deliberadamente quer encontrar uma string aps algum ponto de entrada, por exemplo,
voc pode estar varrendo um arquivo texto contendo os dados em vrias colunas. Execuo voltada a um objetivo
funciona aqui tambm, e pode ser utilizado da seguinte maneira:
write(5 < find("the", s))
A posio s ser retornada se "the" aparecer depois de posio 5, a comparao falhar caso contrrio, passando a
falha para write() como antes. Icon adiciona vrias estruturas de controle para fazer loops dentro de geradores. O
operador every semelhante ao while, fazendo loops em cada item devolvido por um gerador e saindo em caso de
falha:
every k := i to j do
write(someFunction(k))
Por que usar every ao invs de um lao while neste caso? Porque while reavalia o primeiro resultado, mas every
produz todos os resultados. A sintaxe every na verdade injeta valores na funo de forma semelhante aos blocos em
Smalltalk. Por exemplo, o lao acima pode ser reescrito da seguinte maneira:
every write(someFunction(i to j))
Os usurios podem construir novos geradores facilmente usando a palavra-chave suspend:
procedure findOnlyOdd(pattern, theString)
every i := find(pattern, theString) do
if i % 2 = 1 then suspend i
end
Este exemplo faz um loop sobre theString usando find para procurar padres. Quando um encontrado, e a posio
par, a localizao retornada da funo com suspend. Ao contrrio do return, suspend escreve onde est nos
geradores internos, bem como, permitindo que ele continue onde parou na prxima iterao.
Icon
95
Strings
De acordo com sua funcionalidade parecida com script, Icon adiciona uma srie de recursos para tornar o trabalho
com strings mais fcil. O mais notvel o sistema de varredura, que repetidamente chama funes em uma string:
s ? write(find("the"))
Nesse caso o sujeito da funo find colocada fora dos parmetros, em frente ao ponto de interrogao. Funes em
Icon so deliberadamente (ao contrrio do automtico) escritas para identificar o sujeito em listas de parmetros e
permitir-lhes ser retirado desta forma. Substrings podem ser extradas de uma string usando uma especificao de
intervalo entre colchetes. A especificao de intervalo pode retornar um ponto para um nico caractere, ou um
pedao da string. Strings podem ser indexadas tanto da direita quanto da esquerda. importante observar que as
posies dentro de uma sequncia esto entre os caracteres
1
A
2
B
3
C
4
e podem ser especificados a partir da direita
-3
A
-2
B
-1
C
0
.
Por exemplo:
"Wikipedia"[1] "W"
"Wikipedia"[3] "k"
"Wikipedia"[0] "a"
"Wikipedia"[1:3] "Wi"
"Wikipedia"[-2:0] "ia"
"Wikipedia"[2+:3] "iki"
Onde o ltimo exemplo mostra o uso de um comprimento, em vez de uma posio final.
A especificao de subscripting pode ser usado como um Lvalue dentro de uma expresso. Isso pode ser usado para
inserir uma string em outra string ou apagar partes de uma string. Por exemplo:
s := "abc"
s[2] := "123"
agora s tem o valor "a123c"
s := "abcdefg"
s[3:5] := "ABCD"
agora s tem o valor "abABCDefg"
s := "abcdefg"
s[3:5] := ""
agora s tem o valor "abefg"
Outras estruturas
Icon tambm permite ao usurio facilmente construir suas prprias listas (ou arrays):
aCat := ["muffins", "malhado", 2002, 8]
Os itens de uma lista podem ser de qualquer tipo, incluindo outras estruturas. Para criar rapidamente listas maiores, o
Icon inclui o gerador de lista; i := list (10, "palavra") gera uma lista contendo 10 cpias de "palavra". Como arrays
em outras linguagens, Icon permite que itens sejam pesquisados por posio, por exemplo, peso: = aCat [4]. A
sintaxe-bang, por exemplo, every write (!aCat), ir imprimir quatro linhas, cada uma com um elemento. Icon inclui
funes como pilha, push e pop que lhes permitam formar a base de pilhas e filas. Icon tambm inclui uma
funcionalidade para os conjuntos e tabelas (conhecido como hashes, arrays associativos, dicionrios, etc.):
simbolos := table(0)
simbolos["ali"] := 1
Icon
96
simbolos["aqui"] := 2
Esse cdigo cria uma tabela que vai usar zero como o valor padro de uma chave desconhecida. Em seguida,
adiciona dois itens nela, com as chaves "ali" e "aqui", e os valores 1 e 2.
Exemplos de cdigos
Programa Ol Mundo
procedure main()
write("Ol, Mundo!")
end
N-primeiros nmeros perfeitos
Um exemplo de cdigo que encontra os n primeiros nmeros perfeitos:
procedure main()
write("Digite a quantidade de numeros perfeitos:")
n := read()
i := 2
qtd := 0
while qtd < n do {
soma := 0
j := 1
while j < i do {
if i%j = 0 then
soma := j + soma
j := j + 1
}
if soma = i then{
write(i)
qtd := qtd +1
}
i := i + 1
}
end
[1] http:/ / www. cs. arizona. edu/ icon/ index. htm
Icon
97
Bibliografia
The Icon Programming Language (terceira edio) por Ralph E. Griswold and Madge T. Griswold, ISBN
1-57398-001-3.
Ligaes externas
Pgina oficial (http:/ / www. cs. arizona. edu/ icon/ index. htm) (em ingls)
Icon Programming (http:/ / en. wikibooks. org/ wiki/ Icon_Programming) (em ingls) Wikilivro de Icon
Jcon (http:/ / www. cs. arizona. edu/ icon/ jcon/ index. htm) (em ingls) Implementao de Icon, em Java
ALGOL 68
Algol 68
Paradigma imperativo.
Abstrao de dados,
Programao
estruturada,
Programao
procedural,
ortogonal
Surgido em 1968
Criado por Comit Internacional
Estilo de tipagem: forte
Compiladores algol68toc
Influenciada por ALGOL
Influenciou C, Bash
ALGOL 68, sigla ALGOrithmic Language 1968, uma das linguagens de programao da famlia de ALGOL,
sendo uma estruturada e imperativa, que foi concebida como sucessora de ALGOL 60, sendo projetada com os
objetivos de atender um escopo muito maior de aplicaes e possuir uma sinttica e semntica mais rigorosas.
ALGOL 68
uma linguagem de programao imperativa que foi concebida como uma sucessora linguagem de programao
ALGOL 60, projetada com a meta de um escopo muito maior de aplicaes e uma sintaxe e semntica mais
rigorosamente definida. Contribuies de ALGOL 68 para o campo de informtica so profundos, embora alguns
deles no foram identificados publicamente at que foram passados, de uma forma ou outra, para uma de muitas
linguagens de programao desenvolvidas subseqentemente.
Algol 68 uma linguagem de programao de alto nvel. Seu nome provm das palavras "Algorithmic Language
68" (Linguagem Algortmica 68).
A linguagem ALGOL comeou a ser formulada em 1957, na Europa, por um grupo internacional de cientistas de
computao que finalmente, em 1960, definiram o Algol 60 atravs de um documento curto, conciso e preciso, o
"Revised Report on the Algorithmic Language Algol 60", que foi publicado em 1963 na revista Communications of
the ACM. A definio do Algol 60 foi um evento-chave na histria das linguagens de programao. Nenhuma outra
linguagem teve influncia to importante nos projetos de novas linguagens. Contudo ALGOL 68 uma continuao
do desenvolvimento de ALGOL 60, mas no um super conjunto dela.
ALGOL 68
98
Os principais alvos e princpios
1. 1. Perfeio e claridade de projeto;
2. 2. Projeto Ortogonal
3. 3. Segurana
4. 4. Eficincia
5. 5. Verificao de modo esttico,
Analise gramatical de modo independente,
Compilao independente,
Otimizao de lao,
Representaes em conjuntos de caracteres maisculos e minsculos.
Histria
Uma reviso extensa de ALGOL 60 feita por Adriaan van Wijngaarden, discutida em 1963 pelo Grupo de Trabalho
2.1 da IFIP (International Federation for Information Processing). Essa definio foi aceita em Dezembro de 1968.
Em um congresso em Zurich, um comit internacional designou o ALGOL como uma linguagem independente de
plataforma. Isto deu mais liberdade para as caractersticas que eles poderiam colocar na linguagem, mas tambm
tornou mais difcil a escrita de compiladores para ela. Muitos fabricantes de computador no fizeram compiladores.
A carncia de compiladores em muitas plataformas, combinada com sua carncia de ponteiros e muitos tipos de
dados bsicos tais como caracteres, fez com que ALGOL no fosse amplamente aceito. Cientistas e engenheiros
migraram para o FORTRAN, uma linguagem de programao que estava disponvel em muitas plataformas. O
ALGOL acabou quase totalmente abandonado exceto como uma linguagem para a descrio de algoritmos.
Caractersticas
Ao contrrio de ALGOL 60 que era uma linguagem de programao voltada para computao cientfica, ALGOL 68
foi uma linguagem de propsito geral que foi projetada para a comunicao de algoritmos, para sua execuo
eficiente em vrios computadores e para ajudar seu ensino a estudantes. ALGOL era uma linguagem de alto nvel,
que permitia ao programador trabalhar "longe da mquina", sem se preocupar com os aspectos de como cada
comando ou dado era armazenado ou processado. Foi criado para substituir o FORTRAN. Implementava o conceito
de estrutura de blocos, onde variveis, procedimentos, etc., poderiam ser declarados onde quer que o programa os
necessitasse.
Algol-68, juntamente com Pascal, est entre as primeiras linguagens com uma ampla gama de instrues para
controle de fluxo, definio e construo de novos tipos de dados.
A linguagem ALGOL-68 foi a primeira linguagem a ser completamente descrita em uma gramtica formal,
chamada gramtica-W, inventada por A. van Wijngaarden.
Gramticas-W, conhecidas tambm como gramticas de dois nveis, so um formalismo que permite gerar
linguagens recursivamente enumerveis; assim sendo, elas possuem o poder computacional da Mquina de Turing.
Uma gramtica-W consiste de dois conjuntos finitos de regras: as metaprodues e as hiper-regras. As
metaprodues so produes livres de contexto, com o sinal :: separando seu lado esquerdo do direito, ;
separarando alternativas no lado direito, e . indicando o final do lado direito; os no-terminais das metaprodues
so denominadas meta-noes, e so escritos em letras maisculas; os terminais das metaprodues so chamados
proto-noes, e so escritos em letras minsculas, com brancos permitidos por exemplo:
[MP1] ALPHA :: a; b; c; d; e; f; g; h; i; j; k; 1; m; n; o; p; q; r; s; t; u; v; w; x; y; z.
[MP2] NOTION:: ALPHA; NOTION ALPHA.
As hiper-regras so prottipos para produes livres de contexto nas quais encontramos meta-noes definidas em
alguma metaproduo; para as hiper-regras o separador entre os seus lados esquerdo e direito :, o separador de
ALGOL 68
99
alternativas no lado direito ; , o smbolo , usado para separar diferentes proto-noes dentro da mesma
alternativa e . tem a mesma funo que para as metaprodues; por exemplo:
[HR1] NOTION sequence: NOTION ; NOTION sequence, NOTION.
Essas meta-noes podem serem substitudas por alguma palavra que elas definem, segundo alguma metaproduo,
de acordo com a regra de substituio uniforme: Todas as ocorrncias da mesma meta-noo na hiper-regra devem
ser substitudas obrigatoriamente pela mesma proto-noo; deste modo pode-se obter um novo conjunto de
produes em tempo de derivao. Assim, por exemplo, usando as metaprodues [MP1] e [MP2] para derivar as
palavras value e identifier, podemos obter, da hiper-regra [HR1], as seguintes duas produes livres de contexto:
value sequence : value ; value sequence, value
identifier sequence : identifier ; identifier sequence, identifier
Uma das caractersticas que foram almejadas na construo do ALGOL 68 foi a ortogonalidade. A ortogonalidade
significa que qualquer composio de elementos bsicos possvel. Entre os recursos introduzidos pela linguagem
ALGOL-68, est a possibilidade de criao de novos operadores e a possibilidade de redefinio da precedncia de
operadores j existentes. Visto as dificuldades encontradas com PL/I, Algol-68 tentou buscar poder expressivo
atravs da utilizao de outra filosofia: escolher um conjunto adequado e coerente de conceitos e combin-los
sistematicamente. A filosofia utilizada por PL/I foi simplesmente juntar as caractersticas das vrias linguagens de
programao.
O ALGOL 68 foi a fonte de diversas idias novas no projeto de linguagens, algumas das quais subseqentemente
adotadas por outras linguagens. Uma das inovaes mais interessantes do ALGOL 68 um de seus principais
critrios de projeto: a ortogonalidade. Um resultado importante da ortogonalidade no ALGOL 68 foi sua incluso
dos tipos de dados definidos pelo usurio. As linguagens anteriores, como o FORTRAN, incluam somente algumas
estruturas de dados bsicas. Uma outra iniciativa pioneira na rea dos tipos de dados do ALGOL 68 foi a introduo
do tipo de arrays dinmicos, chamados de heap. Um array dinmico aquele em que a declarao no especifica
limites de subscrito. O ALGOL 68 no se tornou uma linguagem muito popular, um pouco por falta de apoio da
IBM, mas apesar disso influiu muito as linguagens posteriores, principalmente devido ao uso que ele faz da
ortogonalidade.
Algol 68 era complexo e imps dificuldades tanto para implementadores quanto para usurios. Ela caracterizou
equivalncia estrutural; converso de tipo automtica ("coero"); arrays flexveis; laos generalizados
(for-from-by-to-while-do-od), if-then-elif-fi, uma declarao de caso inteiro com uma clusula 'out'; declaraes skip
e goto; blocos; procedures; operadores definidos pelo usurio; parmetros de procedure; execuo simultnea
(cobegin/coend); geradores "heap" and "loc" for alocao dinmica. No possua tipos de dados abstratos ou
compilao separada.
"Bold" smbolos
H 61 tais smbolos bold(realce) (alguns com equivalentes breves do smbolo) no sub-language padro:
mode, op, prio, proc,
flex, heap, loc, long, ref, short,
bits, bool, bytes, char, compl, int, real, sema, string, void,
channel, file, format, struct, union,
of, at "@", is ":=:", isnt ":/=:", true, false, empty, nil "", skip "~",
co "", comment "", pr, pragmat,
case in ouse in out esac "( ~ | ~ |: ~ | ~ | ~ )",
for from to by while do od,
if then elif then else fi "( ~ | ~ |: ~ | ~ | ~ )",
par begin end "( ~ )", go to, goto, exit "".
ALGOL 68
100
Vantagens e Desvantagens
Vantagens
Algol-68, juntamente com Pascal, est entre as primeiras linguagens com uma ampla gama de instrues para
controle de fluxo, definio e construo de novos tipos de dados.
Embora ALGOL-68 no tenha tido muita popularidade, principalmente nos Estados Unidos, muitos dos seus
recursos foram utilizados em linguagens posteriores.
Ortogonalidade: uma LP que ortogonal tem um nmero de construtores bsicos e um conjunto de regras para
combin-los relativamente pequeno (oposto a PL/I)
ALGOL tambm foi utilizado como base para outra linguagem de programao, o Pascal.
Contribuies:
Estrutura de dado definida pelo utilizador;
O tipo referencia;
Arrays dinmicos (chamados flex arrays).
Procedimentos de alta ordem,
Tipos de dados definidos pelo usurio
Desvantagens
ALGOL no teve sucesso, talvez por tentar ser de muito alto nvel em uma poca em que a maioria dos sistemas
operacionais exigiam do usurio um grande conhecimento de hardware;
Foi menos utilizada que ALGOL 60;
Difcil de aprender, implementar e entender a descrio.
Exemplo de Programa
BEGIN
[10]CHAR s1, s2, s3;
read((s1, s2, s3));
IF s1 < s2
THEN
IF s2 < s3
THEN print((s1, s2, s3))
ELIF s1 < s3
THEN print((s1, s3, s2))
ELSE print((s3, s1, s2))
FI
ELIF s1 < s3
THEN print((s2, s1, s3))
ELIF s2 < s3
THEN print((s2, s3, s1))
ELSE print((s3, s2, s1))
FI
END
ALGOL 68
101
Exemplo de representaes diferentes do programa
Algol68 como publicado tipicamente
int sum sq:=0;
for i
while
sum sq1000
do
sum sq+:=i2
od
Cdigo para um compilador 7-bit/ascii
INT sum sq:=0;
FOR i
WHILE
sum sq<=1000
DO
sum sq+:=i**2
OD
Cdigo para um compilador 6-bit
.INT SUM SQ:=0;
.FOR I
.WHILE
SUM SQ .LE 1000
.DO
SUM SQ .PLUSAB I .UP 2
.OD
Bibliografia
PAGAN, Frank G.. A Practical Guide to Algol 68. London:John Wiley & Sons, 1976.213 p.
VAN WIJNGAARDEN, A.; MAILLOUX, B.J.; PECK, J.E.L.; KOSTER, C.H.A; SINTZOFF, M.; LINDSEY,
C.H.; MEERTENS, L.G.L.T.; FISKER, R.G.. Revised Report on the Algorithmic Language Algol 68. New
York:Springer-Verlag, 1976.236 p. ISBN 0-387-07592-5
Ligaes externas
Projeto Algol 68 no Sourceforge
[1]
Referncias
[1] http:/ / sourceforge. net/ projects/ algol68/
B
B
Paradigma imperativo
Surgido em 1969
Criado por Ken Thompson e Dennis Ritchie
Influenciada por BCPL
Influenciou C
B uma linguagem de programao na qual pertence ao paradigma imperativo e que foi desenvolvida nos Bell Labs
de 1969, apesar de que hoje j tenha se tornado obsoleta, foi a predecessora da linguagem de programao C, que at
hoje uma das mais populares. Foi maioritariamente um trabalho de Ken Thompson com contribuies de Dennis
Ritchie, projetada e implementada em Murray Hill, New Jersey nos Estados Unidos.
B
102
Histria
Ken Thompson e Dennis M. Ritchie, criadores da
linguagem B
B foi essencialmente uma simplificao da linguagem BCPL,
quitando qualquer componente que Thompson considerasse
prescindvel de jeito que coubesse na memria dos
minicomputadores da poca, uma linguagem recomendada para
computaes no-numricas. Tambm se realizaram algumas
mudanas segundo as preferncias de Thompson (a maioria das
quais eram para reduzir o nmero de caracteres em um programa
tpico).
Como BCPL, B s tinha um tipo de dado, que correspondia com
uma palavra de mquina. A maioria de operadores o manipulavam
como um inteiro; por exemplo + (adio), - (subtraco), *
(multiplicao) ou / (diviso). O sistema de tipos empregado em B se caracteriza por tipagem fraca, dinmica e
tambm implcita.
Outros operadores o manipulavam como um endereo de memria ao que fazer referncia: um Ponteiro. B oferecia
operadores que permitiam obter o endereo duma determinada varivel, ou escrever no endereo apontado por uma
varivel apontadora ou ponteiro.
As primeiras implementaes foram para os minicomputadores PDP-7 e PDP-11 executando verses antigas do
UNIX; e para os mainframes de 36 bits Honeywell executando o sistema GCOS.
Evoluo
A natureza sem tipos dizer, com um s tipo correspondente palavra de mquina de B tinha sentido no
Honeywell, no PDP-7 e noutros computadores antigos, mas foi um problema no PDP-11 j que era difcil aceder a
caracteres individuais, um novo tipo de dado que ofertava o PDP-11 assim como a maioria dos computadores
modernos. Comeando no 1971, Ritchie fez mudanas linguagem ao mesmo tempo que convertia o seu compilador
para produzir linguagem de mquina de forma nativa. A mais notvel foi a adio de tipos de dado diferentes para as
variveis.
A linguagem B foi implementada no PDP-11, que foi uma mquina da DEC usada para fazer o primeiro arcade
operado por moedas,com o Jogo Galaxy.
Durante 1971 e 1972 B evolucionou primeiro em Novo B (New B, NB) e depois em C. Mais tarde, comeando
1973p, foi adicionado um pr-processador, a petio de Alan Snyder. O esforo foi o suficiente neste ano como para
que durante o vero o ncleo do UNIX para o PDP-11 fosse rescrito em C.
Durante o perodo 1972-1973 foi preciso port-lo ao Honeywell 635 e ao IBM 360/370, razo pela qual Mike Lesk
escreveu o pacote de entrada/sada portvel que se trocaria na conhecida E/S padro (standard I/O ou stdio) da
linguagem C.
B seguiu-se a utilizar at os anos 1990 nos mainframes Honeywell e em certos sistemas embarcados por uma
variedade de razes, incluindo o uso de hardware limitado nesses sistemas; bibliotecas, ferramentas, problemas de
custos excessivos; ou simplesmente porque era o suficientemente bom como para fazer o trabalho.
O AberMUD, de muita influncia, foi escrito em B.
B
103
Nome
B teve uma enorme influncia de BCPL, e o seu nome foi provavelmente uma contraco de BCPL. Porm,
possvel que o seu nome baseara-se no da linguagem de programao Bon, uma linguagem mais antiga e no
relacionada com B, desenhada por Thompson para usar-se no MULTICS.
Exemplos
Um exemplo simples, chamado de programa Ol Mundo.
main( ) {
extrn a, b, c;
putchar(a); putchar(b); putchar(c); putchar('!*n');
}
a 'hell';
b 'o, w';
c 'orld';
Ou, equivalente:
main() {
putchar('Ol, Mundo!*n');
}
Programa que imprime os N primeiros nmeros perfeitos, onde N a entrada do usurio:
main()
{
auto n,num,soma,cont;

num = 0;
cont = 0;
printf( "Digite um valor para N: *n*n");
n=getchar();

printf( "\nOs primeiros numeros perfeitos sao:\n");
while (cont != n);
{
num =num+1;
soma = 0;
auto i=1;
while(i <= num-1)
{
if( (num % i) == 0 )
{
soma =soma+ i;
}
B
104
i=i+1;
}
if ( soma == num )
{
printf("%d*n",soma);
cont =cont+1;
}
}
}
A seguinte funo de exemplo est tirada do Users' Reference to B por Ken Thompson:
/* A seguinte funo imprime um nmero no-negativo, n, na
base b, no qual 2<=b<=10. Esta rotina basea-se no facto
de que no jogo de caracteres ASCII, os dgitos do 0 ao
9 tm valores de cdigo sequenciais.
*/
printn(n,b) {
extrn putchar;
auto a;
if(a=n/b) /* atribuio, no comprovao de igualdade */
printn(a, b); /* recursivo */
putchar(n%b + '0');
}
Funo que substitui cada letra maiscula de uma string de entrada s, por uma letra minscula correspondente.
lower(s) {
auto c,i;
i = 1;
while( (c=char(s,++i)) != *e )
if( c >= A & c <= Z ) lchar(s~i~cA+a);
}
Este programa de exemplo em B emprega a funo anterior para somar trs nmeros imprimindo no ecr o resultado.
main( ) {
extrn printn;
auto a, b, c, sum;
a = 1; b = 2; c = 3;
sum = a+b+c;
printn(sum,10);
}
B
105
Compilando
Algumas verses do Unix possuem o compilador de B. Para compilar e executar um cdigo B, basta digitar estes
comandos no shell, desde que, claro, seu sistema operacional possua este compilador.
SYSTEM? filsys cf bsource,b/1,100/
SYSTEM? filsys cf bhs,b/6,6/,m/r/
SYSTEM? ./bj (w) bsource bhs
SYSTEM? /bhs
Ligaes externas
The Development of the C Language
[1]
, Dennis M. Ritchie. Pe B no contexto de BCPL e C.
Users' Reference to B
[2]
, Ken Thompson. Descreve a verso para o PDP-11.
The Programming Language B
[3]
, S. C. Johnson & B. W. Kernighan, Technical Report CS TR 8, Bell Labs
(Enero 1973). Descreve a verso para o GCOS.
The A Tutorial Introduction to The Language B
[4]
, B. W. Kernighan. Um timo tutorial feito por Kernighan.
Referncias
[1] http:/ / cm.bell-labs. com/ cm/ cs/ who/ dmr/ chist.html
[2] http:/ / cm.bell-labs. com/ cm/ cs/ who/ dmr/ kbman.html
[3] http:/ / cm.bell-labs. com/ cm/ cs/ who/ dmr/ bintro.html
[4] http:/ / cm.bell-labs. com/ cm/ cs/ who/ dmr/ btut.pdf
106
Outros paradigmas nos anos 60
APL
APL
Surgido em 1964
Criado por Kenneth Iverson
Estilo de tipagem: dinmica
Compiladores IBM APL2
Influenciada por Notao Matemtica
Influenciou J
APL uma linguagem de programao destinada a operaes matemticas.
Ela nasceu do trabalho do professor de matemtica canadense Kenneth Iverson. A linguagem APL foi formalmente
definida e introduzida por Iverson em seu livro A Programming Language de 1962. Sua proposta original era a de
produzir uma nova notao matemtica, menos sujeita s ambigidades da notao convencional. Segundo Iverson,
foi projetada com o objetivo de ser matematicamente concisa.
Na dcada de 1960, trabalhando na IBM em conjunto com Adin Falcoff, ambos produziram a primeira verso de
APL, quando um interpretador da linguagem ficou disponvel.
Programas em APL em geral sempre so muito pequenos, embora poderosos. A linguagem est preparada para tratar
arranjos de grandes dimenses. Por exemplo, quando em APL se escreve A+B, se A e B forem escalares (isto um
nmero nico), a resposta tambm o ser. Se A e B so vetores de 100 nmeros, a resposta tambm o ser. Idem para
matrizes e at arrays-nd. Em algumas verses de APL este n chega a 256 dimenses.
O Conjunto de Caracteres APL
A principal caracterstica de APL o uso de um conjunto especial de caracteres que incluem algumas letras gregas
(rho, iota), smbolos matemticos convencionais (o sinal de vezes, o de dividido) e alguns smbolos
especialmente inventados. Este fato sempre limitou a disseminao da linguagem. At o advento das interfaces
grficas (windows, por exemplo), exigia-se um hardware especial para poder programar em APL. A linguagem APL
recebeu muitas crticas pelo fato de usar este conjunto de caracteres no padronizado. Tal nmero de caracteres
adicionais pode levar a um grau de complexidade alto resultando em uma baixa legibilidade. Por outro lado, o
conjunto adicional de caracteres d a linguagem uma elegncia e a tornam concisa, o que mais difcil de se
conseguir em linguagens com um conjunto de caracteres reduzido.
Smbolos APL e os Layouts de Teclado
Para solucionar o problema da falta de caracteres especiais nos conjuntos padro (como o ASCII, por exemplo)
alguns interpretadores APL tem mapeamentos ou conjuntos de teclas simultneas para a entrada destes. Uma das
associaes que se procurou fazer, para facilitar a busca, relacionar os smbolos com as suas respectivas letras
iniciais como no caso do smbolo de interrogao '?' em cima da letra 'Q' (Em ingls question mark) ou o smbolo ''
em cima da letra 'G' (Em ingls: gradient). A figura abaixo ilustra um exemplo de teclado com os smbolos APL:
APL
107
Exemplos de cdigo
Funo Fatorial
FATORIAL []
Z FATORIAL N
[1] (N 0) / A
[2] 0,Z 1
[3] A:ZNFATORIAL(N-1)

Soma dos Elementos de um Vetor
[10] VETOR 10 1 2 3 4 5 6 7 8 9 10
[11] SOMA 0
[12] I 1
[13] VOLTA: (I > VETOR) / SAI
[14] SOMA SOMA + VETOR[I]
[15] I I + 1
[16] VOLTA
[17] SAI:
Bibliografia
IVERSON, Kenneth E.. A Programming Language. New York:John Wiley and Sons, 1962.286 p. ISBN
0-47143014-5
TUCKER Jr., Allen B.. Programming Languages. 2ed. New York:McGraw-Hill, 1986.590 p. ISBN
0-07-065416-6
ZIMMERMANN, Carlos Jorge. Processamento Interativo: a Linguagem de Programao APL. Rio de
Janeiro:LTC, 1981. ISBN 85-216-0138-7
Simula
108
Simula
Simula
Paradigma Orientada a objetos
Surgido em 1967
Criado por Ole-Johan Dahl, Kristen Nygaard
Compiladores
GNU Cim
[1]
Influenciada por ALGOL 60
Influenciou Linguagens de programao orientadas a objetos
Simula uma famlia de linguagens de programao, projetadas para apoiar a simulao de eventos discretos, criada
entre 1962 e 1968 por Kristen Nygaard e Ole-Johan Dahl no Centro Noruegus de Computao em Oslo.
Simula I, criada em 1962, baseada em ALGOL 60
Simula 67, cuja primeira verso foi apresentada em 1966 foi a 1 linguagem orientada a objetos e introduziu os
conceitos de classes e herana.
Simula 87
Sintaticamente, Simula um super-conjunto de ALGOL 60.
Histria
Kristen Nygaard comeou a escrever programas de simulao computacional em 1957. Nygaard viu a necessidade de
uma melhor forma de descrever a heterogeneidade e o funcionamento de um sistema. Para ir mais longe com suas
idias em linguagem de computador formal para descrever um sistema, Nygaard percebeu que ele precisava de
algum com mais habilidades do que ele tinha em programao. Ole-Johan Dahl juntou-se ao seu trabalho em
janeiro de 1962. A deciso de estabelecer uma relao entre a lnguagem e o Algol 60 foi feita um pouco depois. Por
Maio de 1962 os principais conceitos para uma linguagem simulao foram definidos. "Simula I" nasceu.
Kristen Nygaard foi convidado a Univac por Maio de 1962 em conexo com o marketing do seu novo computador
UNIVAC 1107. Na visita que Nygaard apresentou as idias do Simula para Robert Bemer, o diretor de sistemas de
programao da Univac. Bemer era f de Algol e achou o Projeto Simula atraente. Bemer tambm estava presidindo
uma sesso na segunda conferncia internacional sobre o tratamento de informaes hospedado pelo IFIP. Ele
convidou Nygaard, que apresentou o documento "SIMULA - An Extension of ALGOL to the Description of
Discrete-Event Networks".
O Centro Noruegus de Computao obteve um UNIVAC 1107 em Agosto de 1963 a um desconto considervel, e
Dahl implementou Simula I sob contrato com a Univac. A implementao foi baseada no compilador UNIVAC
Algol 60. Simula I estava totalmente operacional no UNIVAC 1107 em janeiro de 1965. Nos dois anos seguintes
Dahl e Nygaard gastaram muito tempo ensinando Simula. Simula foi ensinado a vrios pases espalhados por todo o
mundo e Simula I foi posteriormente executado em computadores Burroughs B5500 e do computador russo
URAL-16.
Em 1966 C. A. R. Hoare introduziu o conceito de registro classe construir, que Dahl e Nygaard estenderam com o
conceito de prefixo e outros recursos para satisfazer as suas exigncias de um processo generalizado conceito. Dahl e
Nygaard apresentaram seus artigos em Declaraes de classe e subclasses na Conferncia IFIP Simulao de
Linguagens em Oslo, em maio de 1967. Este trabalho se tornou a primeira definio formal de Simula 67. Em junho
de 1967 uma conferncia foi realizada para uniformizar a linguagem e iniciar uma srie de implementaes. Dahl fez
a proposta de unificar o Tipo e concepo da classe. Isto levou a srias discusses, e a proposta foi rejeitada pelo
Simula
109
conselho de administrao. Simula 67 foi formalmente padronizado sobre a primeira reunio de Simula Standards
Group (SSG) em fevereiro de 1968.
Simula foi influente no desenvolvimento de Smalltalk e, mais tarde na programao orientada a objetos. Ele tambm
ajudou a inspirar o modelo de computao concorrente, embora Simula apenas suporta co-rotinas e no verdadeiros
concorrentes.
No fim da dcada de sessenta e incio da dcada de setenta, houve quatro principais implementaes do Simula:
UNIVAC 1100 feito pelo Centro Noruegus de Computao
System/360 e System/370, pelo Instituto suco de pesquisa de defesa nacional (FOA)
CDC 3000 pela Universidade de Oslo
TOPS-10 pelo ENEA AB
Estas implementaes foram portadas para uma srie de plataformas. O TOPS-10 implementou o conceito de
variveis e mtodos pblicos, protegidos e privados, que mais tarde foram integrados no Simula-87.
Simula 87 o ltimo padro e foi portado para diversas plataformas. As trs principais implementaes so:
Simula AS
Lund Simula
GNU Cim
[1]
Em novembro de 2001, Dahl e Nyggard foram premiados com a medalha IEEE John von Neumann do Instituto de
Engenheiros Eletricistas e Eletrnicos (IEEE), pela introduo dos conceitos fundamentais da programao orientada
a objetos atravs do desenho e implementao do SIMULA 67. Em fevereiro de 2002, eles receberam o premio 2001
Turing A.M. pela Associao para Maquinaria da Computao. Infelizmente tanto Dahl como Nygaard no puderam
presenciar a homenagem que foi agendada na conferncia OOPSLA 2002 em Seattle, pois ambos faleceram
respectivamente em Junho e Agosto daquele ano.
Exemplos de cdigo
Hello world
BEGIN
WHILE 1=1 DO
BEGIN
outtext("Hello World!");
outimage;
END;
END;
Ou tambm:
Begin
OutText("Hello World!");
OutImage;
End do programa;
Simula
110
Classes, subclasses e mtodos virtuais
Um exemplo com uso de classes, subclasses e mtodos virtuais:
Begin
Class Glyph;
Virtual: Procedure print Is Procedure print;;
Begin
End;
Glyph Class Char (c);
Character c;
Begin
Procedure print;
OutChar(c);
End;
Glyph Class Line (elements);
Ref (Glyph) Array elements;
Begin
Procedure print;
Begin
Integer i;
For i:= 1 Step 1 Until UpperBound (elements, 1) Do
elements (i).print;
OutImage;
End;
End;
Ref (Glyph) rg;
Ref (Glyph) Array rgs (1 : 4);
! Main program;
rgs (1):- New Char ('A');
rgs (2):- New Char ('b');
rgs (3):- New Char ('b');
rgs (4):- New Char ('a');
rg:- New Line (rgs);
rg.print;
End;
O exemplo acima tem uma superclasse (Glyph) com duas subclasses (Char e Line). H um mtodo virtual com duas
implementaes. A execuo se inicia no bloco Main program.
Simula no tem o conceito de classes abstratas, j que classes com mtodos virtuais puros podem ser instanciadas.
Isto significa que no exemplo acima, todas as classes podem ser instanciadas. No entanto, a chamada de um mtodo
virtual puro produzir um erro em Run time.
Simula
111
Passagem de parmetros por nome
Simula suporta passagem de parmetros por nome, portando a tcnica Aparelho de Jensen
[2]
pode ser facilmente
implementada. No entanto, a passagem de parmetros padro por valor, diferentemente de ALGOL que usa por
padro a passagem de parmetros por nome.
Ligaes externas
Introduction to OOP in Simula
[3]
Por J.Sklenar, baseado no seminrio de 1997 "30 Years of Object Oriented
Programming (OOP)" na Universidade de Malta.
How Object-Oriented Programming Started
[4]
Por Dahl e Nygaard, verso abreviada de um artigo de
enciclopdia; da home page de Nygaard.
Simula at the Universit de Montral
[5]
Tutoriais, documentao e links, em Ingls e Francs.
An Introduction to Programming in Simula
[6]
Um livro-texto escrito por Rob Pooley, agora disponvel em
HTML.
Referncias
[1] http:/ / gnu. gds. tuwien. ac.at/ software/ cim/ cim.html
[2] http:/ / en. wikipedia. org/ wiki/ Jensen%27s_Device
[3] http:/ / staff. um. edu. mt/ jskl1/ talk. html
[4] http:/ / heim. ifi. uio. no/ ~kristen/ FORSKNINGSDOK_MAPPE/ F_OO_start. html
[5] http:/ / www. iro. umontreal. ca/ ~simula/
[6] http:/ / www. macs.hw.ac. uk/ ~rjp/ bookhtml/
Logo
Logo
Paradigma funcional, procedural, reflexo
Surgido em 1967
Criado por Wally Feurzeig e Seymour Papert
Estilo de tipagem: dinmica, implicita, forte
Compiladores UCBLogo, SUPER logo, outros
Influenciada por Lisp
Influenciou Smalltalk, Etoys, Scratch, NetLogo
Logo
112
Grfico produzido com um "tartaruga" Logo.
Em informtica, Logo uma linguagem de programao
interpretada, voltada para crianas, jovens e at adultos.
utilizada com grande sucesso como ferramenta de apoio ao ensino
regular e por aprendizes em programao de computadores. Ela
implementa, em certos aspectos, a filosofia construcionista,
segundo a interpretao de Seymour Papert, co-criador da
linguagem junto com Wally Feurzeig.
Papert, matemtico que trabalhou com Jean Piaget (donde a idia
da filosofia construtivista), co-fundador do Media Lab no
Massachusetts Institute of Technology (MIT).
O ambiente Logo tradicional envolve uma tartaruga grfica, um
rob pronto para responder aos comandos do usurio. Uma vez
que a linguagem interpretada e interativa, o resultado mostrado
imediatamente aps digitar-se o comando incentivando o
aprendizado. Nela, o aluno aprende com seus erros. Aprende vivenciando e tendo que repassar este conhecimento
para o LOGO. Se algo est errado em seu raciocnio, isto claramente percebido e demonstrado na tela, fazendo com
que o aluno pense sobre o que poderia estar errado e tente, a partir dos erros vistos, encontrar solues corretas para
os problemas. A maioria dos comandos, pelo menos nas verses mais antigas, refere-se a desenhar e pintar. Mas em
verses mais atuais, como o AF LOGO, podem ser muito mais abrangentes, trabalhando com textos, frmulas e at
IA, servindo como excelente ferramenta para o ensino regular.
Existem tambm comandos para se controlar a porta paralela do computador, fazendo com que seus pinos de I/O's
(Input/Output - Entrada/Sada) adquiram nveis lgicos 0 ou 1, o que permite escola ou instituio facilmente
desenvolver projetos de robtica utilizando o LOGO, que pode passar a controlar robs e mecanismos de desenho,
gerando uma interao entre o conhecimento adquirido e demonstrado e o "mundo fsico", entre outras coisas.
possvel escrever programas mais complexos no-interativamente, executando blocos de instrues de uma vez.
A linguagem Logo adaptada nos diversos pases em que utilizada. Assim, no Brasil, algumas verses da
linguagem foram "traduzidas" em suas palavras-chave e comandos; j outras verses, como o AF LOGO, foram
totalmente reescritas, possuindo um vasto dicionrio, incluindo palavras e expresses novas, particulares de nosso
idioma. O AF LOGO considerado a mais completa linguagem LOGO, desenvolvida por um analista de sistemas
autnomo da cidade de Nova Friburgo no estado do Rio de Janeiro, criada exclusivamente para a lngua portuguesa,
podendo ainda "entender" outros dialetos LOGO, como o Micromundos (Microworlds), MSWLogo, SuperLogo, etc.
O AF Logo possui ainda mdulos para aplicaes em IA (Inteligncia Artificial), manipulao de textos e frmulas e
cenrios para aplicao da ferramenta em todas as matrias da grade curricular do ensino fundamental, mdio e at
universitrio. Nos programas que foram simplesmente traduzidos por exemplo, "to" foi traduzido para "aprenda",
"forward" foi traduzido para "parafrente", etc. Mas mesmo em portugus, o vocabulrio limitado e inflexvel se torna
um empecilho para os alunos, pois ao contrrio do ingls, no portugus temos muito mais variaes de escrita e
expresses para dizer a mesma coisa. No AF LOGO, o comando para mandar a Tartaruga andar para frente, pode ser
escrito e entendido com diversas grafias, ex: PARA FRENTE, PARA_FRENTE, PARAFRENTE, FRENTE,
ANDE, ANDAR, ANDA, etc...
Logo
113
Exemplos
Um Simples Hello World
O seguinte programa imprime Hello World na tela:
print [Hello World!]
Um quadrado
O seguinte programa faz a tartaruga grfica desenhar um quadrado:
REPEAT 4 [PF 350 PD 90]
Uma circunferncia
O seguinte programa gera um circulo utilizando a tartaruga grfica:
REPEAT 360 [PF 1 PD 1]
Ou ainda pode-se simplesmente digitar: "circle :t", sendo :t um nmero qualquer, pois este ser o tamanho do raio da
sua circunferncia.
360 [PF 0.5 PD 1]
Uma estrela
O seguinte programa faz a tartaruga grfica desenhar uma estrela:
REPEAT 5 [PD 15 PF 100 PD 150 PF 100 PE 78]
Seymour Papert Logo: computadores e educao. So Paulo: Brasiliense, 1988.
Katia Simes de Queiroz - "LOGO, O PRIMEIRO PASSO" So Paulo: Saraiva, 1987
Katia Simes de Queiroz - "LOGO, UM PASSO CRIATIVO" So Paulo: Saraiva, 1988
Allen Downey & Guido Gay, Lulu How to Think Like a Computer Scientist: Logo Version (Paperback)
Ligaes externas
Logo (http:/ / www. dmoz. org/ Computers/ Programming/ Languages/ Lisp/ Logo/ / ) no Open Directory Project
A Brief History Of Logo (http:/ / fmslogo. sourceforge. net/ history. shtml) (em ingls)
Por que Logo? (http:/ / projetologo. webs. com/ texto2. html)
Academia da Tat (aprender Logo gratuitamente) (http:/ / turtleacademy. com/ language/ pt)
Linguagem LOGO, Perspectiva Construtivista (computador como ferramenta) (http:/ / sites. google. com/ site/
infoeducunirio/ perspectiva-construtivista/ linguagem-logo)
114
Os anos 70, a programao estruturada e a
simplicidade
Personagem: Niklaus Wirth
Niklaus Emil Wirth
Cincia da computao
Niklaus Wirth em 2005
Nacionalidade
Suo
Nascimento 15 de Fevereiro de 1934(80anos)
Local Winterthur
Atividade
Campo(s) Cincia da computao
Instituies Instituto Federal de Tecnologia de Zurique, Universidade Stanford, Universidade de Zurique, Xerox PARC
Alma mater Instituto Federal de Tecnologia de Zurique, Universidade Laval, Universidade da Califrnia em Berkeley
Tese 1963: A Generalization of Algol
Orientador(es) Harry Douglas Huskey e Edward Feigenbaum
Conhecido(a) por Algol-W, Pascal, Modula, Modula-2
Prmio(s) Prmio Turing (1984), Prmio Pioneiro da Computao (1987), Prmio Marcel Benoist (1989), Prmio SIGPLAN
(2007)
Niklaus Emil Wirth (Winterthur, 15 de Fevereiro de 1934) um professor de informtica suo.
Criador das lnguagens de programao Pascal, Modula-2, e Oberon.
Graduado em engenharia eletrnica pelo Instituto Federal de Tecnologia de Zurique em 1959, M.Sc. na
Universidade Laval em 1960, e Ph.D. na Universidade da Califrnia em Berkeley em 1963.
Wirth foi um Professor/Assistente na cincia de computadores na Universidade de Stanford (1963 - 1967), e em
seguida na Universidade de Zurique. Em 1968 tornou-se professor de informtica na ETH Zurique. Ele permaneceu
Personagem: Niklaus Wirth
115
dois anos na Xerox PARC, na Califrnia, e aposentou-se em abril de 1999.
Bibliografia
Wirth, Niklaus. Programao sistemtica. Rio de Janeiro:Campus da Univag, 1978.197 p. CDD 001.642 CDU
681.3.06
Jensen, Kathleen; Wirth, Niklaus. Pascal User manual and Report (em ingls). 2ed. New
York:Springer-Verlag, 1974.167 p. ISBN 0-387-90144-2
Ligaes externas
Niklaus Wirth (http:/ / genealogy. math. ndsu. nodak. edu/ id. php?id=61847& fChrono=1) em Mathematics
Genealogy Project
Biografia (http:/ / www. verw. ethz. ch/ cgi-win/ whoShow. exe/ ws7?ID=806& lang=engl) na ETH Zurich (em
ingls)
Pgina pessoal (http:/ / www. cs. inf. ethz. ch/ ~wirth/ ) na ETH Zurich (em ingls)
Pascal e os seus sucessores (http:/ / www. swissdelphicenter. ch/ en/ niklauswirth. php), trabalho por Niklaus
Wirth
Precedido por
Ken Thompson e Dennis Ritchie
Prmio
Turing
1984
Sucedido por
Richard Karp
Pascal
Pascal
Paradigma Abstrao de dados,
Programao estruturada,
Programao procedural
Surgido em 1970, ltima reviso em 2002
Criado por Niklaus Wirth
Estilo de tipagem: forte
Compiladores Delphi, Free Pascal, GNU Pascal, MIDletPascal, Palm & Pascal, Turbo Pascal
Dialetos: Macintosh Pascal, Turbo Pascal, UCSD
Influenciada por ALGOL
Influenciou Ada, Component Pascal, Icon, Java, Modula-2, Oberon, Oberon-2, Object Pascal, Oxygene
Pascal uma linguagem de programao estruturada, que recebeu este nome em homenagem ao matemtico Blaise
Pascal. Foi criada em 1970 pelo suo Niklaus Wirth, tendo em mente encorajar o uso de cdigo estruturado.
O prprio Niklaus Wirth diz que Pascal foi criada simultaneamente para ensinar programao estruturada e para ser
utilizada em sua fbrica de software. Simultaneamente, a linguagem reflete a liberao pessoal de Wirth das
restries impostas aps seu envolvimento com a especificao de ALGOL 68, e sua sugesto para essa
especificao, o ALGOL W.
Pascal originou uma enorme gama de dialetos, podendo tambm ser considerada uma famlia de linguagens de
programao. Grande parte de seu sucesso se deve a criao, na dcada de 1980, da linguagem Turbo Pascal,
inicialmente disponvel para computadores baseados na na arquitetura 8086 (com verses para 8080 no seu incio).
Pascal
116
Pascal normalmente uma das linguagens de escolha para ensinar programao, junto com Scheme, C e Fortran.
Comercialmente, a linguagem foi sucedida pela criao da linguagem Object Pascal, atualmente utilizada nos IDEs
Embarcadero Delphi (Object Pascal), Kylix e Lazarus. Academicamente, seus sucessores so as linguagens
subsequentes de Niklaus Wirth: Modula-2 e Oberon. A partir da verso 2005, o Delphi passou a se referir a sua
linguagem de programao como Delphi Language.
Assim como a linguagem C, que foi padronizado pela ANSI (ANSI C), o Pascal possui padres pela ISO, como o
Pascal Standard e o Advanced Pascal.
Implementaes
O primeiro compilador Pascal foi desenvolvido em Zurique para a famlia de computadores CDC 6000, sendo
lanado em 1970. Tambm em 1970 foi desenvolvido o primeiro compilador Pascal norte americano, na
Universidade de Illinois por Donald B. Gillies, que gerava cdigo de mquina nativo para o mini-computador
PDP-11.
Pensando-se em propagar rapidamente o uso da linguagem, foi criado, em Zurique, um "kit de converso" que
incluia um compilador que gerava cdigo intermedirio, e um simulador para ele. Esse kit foi batizado de p-System,
e foi utilizado, entre outras coisas, para criar um sistema operacional para mini-computadores chamado UCSD
p-System, desenvolvido pelo Instituto de Sistemas de Informao da Universidade da Califrnia em San Diego.
Segundo o prprio Niklaus Wirth, o p-System e o UCSD foram instrumentais na popularizao do Pascal. No padro
UCSD, as Strings passaram a ser tipos prdefinidos (no Pascal padro era utilizados packed-arrays).
Nos anos 80, Anders Hejlsberg desenvolveu o compilador Blue Label Pascal o Nascom-2. Depois, ele foi trabalhar
na Borland e reescreveu seu compilador transformando-o no Turbo Pascal para a plataforma IBM PC (e tambm
CP/M 80), que era vendido a US$ 49,95, muito mais barato do que o Blue Label. Uma caracterstica muito
importante que o Turbo Pascal uma linguagem compilada, que gera cdigo de mquina real para a arquitetura
Intel 8088, tornando-a muito mais rpida do que as linguagens interpretadas.
Por ser mais barato, o Turbo Pascal passou a ter uma grande influncia na comunidade Pascal, que comeou a se
concentrar na plataforma IBM PC no fim dos anos 80. Muitos usurios de PC da poca migraram para o Turbo
Pascal, em busca de uma linguagem estruturada que no fosse interpretada, para substituir, por exemplo, o BASIC.
Pode se afirmar que o sucesso comercial de Turbo Pascal foi definitivo para a ampla divulgao da linguagem Pascal
entre os usurios de micro-computador.
Outra variante era o Super Pascal, que adicionava labels no numricas, o comando return e expresses como nomes
de tipos.
Durante os anos 90, compiladores que podiam ser modificados para trabalhar com arquiteturas diferentes tiveram
grande destaque, incluindo nessa lista o Pascal.
O prximo grande passo para a linguagem, foi a implementao da orientao a objeto (OO ou OOP em ingls) na
sua estrutura, comeando com a verso 5.5 do Turbo Pascal. Mais tarde, ao projetar o Delphi, querendo
funcionalidades mais elaboradas da orientao a objeto, a Borland utilizou o conceito Object Pascal criado pela
Apple Inc., utilizando-o como base para uma nova linguagem, que nas verses iniciais era chamado de Object Pascal
foi rebatizado como Delphi Programming Language nas verses posteriores. As maiores diferenas em relao s
implementaes OO das verses mais antigas foram a adio do conceito de objetos por referncia, construtores,
destrutores e propriedades, entre outros.
Pascal
117
Padres/Normas
Em 1983, a linguagem foi padronizada, na norma internacional ISO / IEC 7185, assim como vrios padres locais
especficos de cada pas, incluindo a norma americana ANSI/IEEE770X3.97-1983, e ISO 7185:1983. A diferena
entre as duas normas que a padro ISO possui o nvel 1, extenso do arrays conformantes, enquanto a ANSI no
permitiu esta extenso linguagem original (verso Wirth). Em 1989, foi revista ISO 7185 (ISO 7185:1990) para
corrigir vrios erros e ambiguidades encontradas no documento original
Em 1990, foi criado uma norma ISO / IEC 10206 padronizando o Pascal. Em 1993, o padro ANSI foi substitudo
pelo ANSI organizao com um "ponteiro" para a norma ISO 7185:1990, que termina efetivamente o seu estatuto
como um padro diferente.
A norma ISO 7185 foi indicado para ser uma clarificao de Wirth da linguagem como detalhado em 1974 Manual
do Usurio e Relatrio [Jensen e Wirth], mas tambm foi notvel pela incluso de "Parmetros de array
conformantes" como um nvel 1 da norma, sendo nvel 0 Pascal sem Conformantes Arrays.
Note que o prprio Niklaus Wirth se refere linguagem 1974 como o padro, por exemplo, para diferenci-la das
caractersticas especficas de implementao em nvel de mquina do compilador CDC 6000. Esta linguagem foi
documentada em "The Pascal Report", a segunda parte do "Pascal users manual and report".
Nas grandes mquinas (mainframes e minicomputadores) originadas pelo Pascal, eram seguidos padres gerais. Na
IBM-PC, no eram. No IBM-PC, o Turbo Pascal e Delphi, padro Borland, tem o maior nmero de usurios. Assim,
de extrema importncia entender se uma determinada aplicao corresponde a linguagem original Pascal, Borland
ou um dialeto do mesmo.
As verses da linguagem do IBM-PC comearam a divergir com a vinda da UCSD Pascal, uma aplicao que
implementou ao programa vrias prorrogaes para a linguagem, juntamente com vrias omisses e mudanas.
Muitas caractersticas da linguagem UCSD sobrevivem atualmente, inclusive em linguagens Borlands.
Sintaxe
A linguagem Pascal foi criada para incentivar a programao modular e estruturada, facilitando a criao de
procedimentos com baixo acoplamento e alta coeso. Um programa em Pascal composto de constantes e variveis
globais, procedimentos e funes re-entrantes e um programa principal.
Procedimentos no retornam valores, funes sim. Tanto em procedimentos quanto em funes os parmetros
podem ser passados por referncia ou por valor. possvel passar vetores e matrizes com o tamanho, mas no a
quantidade de dimenses, especificado no tempo de execuo.
Procedimentos e funes podem conter, dentro de seu escopo, novos procedimentos e funes. Dentro de qualquer
parte do programa tambm podem ser criados blocos com os comandos BEGIN e END, que tambm possuem seu
prprio escopo. Nas verses originais, as variveis s podiam ser declaradas em posies especficas e no ao
decorrer do programa, o que limitava a regra de escopo.
O conjunto de procedimentos e funes pr-definidos fixo e inclui as funes read, readln, write e writeln, para
realizar E/S.
Pascal
118
Exemplos de cdigo
Nota importante: Os programas foram desenvolvidos com o Turbo Pascal (Borland). Para funcionarem com outros
compiladores, devem ser feitas as seguintes alteraes:
Linha inicial passa de program name; para program name (input,output);
A instruo readkey desaparece
A directiva uses desaparece porque prpria do Turbo Pascal, bem como a biblioteca crt
A instruo clrscr desaparece porque faz parte da biblioteca crt
A declarao string passa para array [1..255] of char (supondo que iriam ser usados at 255 caracteres) j que o
Pascal no suporta strings nativamente.
As instrues readln para ler cadeias de caracteres, tm de estar todas dentro de ciclos, para ler um caracter de
cada vez.
Programa Ol Mundo
program OlaMundo;
begin
WriteLn('Ol, Mundo!');
end.
Nmeros perfeitos
program numerosPerfeitos;
uses crt;
var
ate, x, soma, i: integer;
begin
clrscr;
x := 0;
writeln('Numeros perfeitos abaixo de');
Readln(ate);
repeat
x := x + 1;
soma := 0;
for i := 1 to x - 1 do
begin
if x mod i = 0 then
soma := soma + i;
end;
if soma = x then
begin
writeln(x);
end;
until (x > ate);
writeln('Pressione qualquer tecla para finalizar');
Pascal
119
readkey;
end.
Repetio
Soma dos nmeros pares.
program Soma_Pares;
uses crt;
var
superior, soma, num: integer;
begin
soma:=0;
write ('Entre com o limite superior');
readln (superior);
num:=2;
repeat
soma:=soma+num;
num:=num+2;
until (num > superior);
writeln('A soma dos nmeros pares de 2 at ', superior,' ', soma);
readln;
end.
Nmeros pares entre dois valores inteiros
program pares;
var
x, y: integer;
begin
writeln('Digite os dois valores');
readln(x, y);
if (x mod 2)<> 0 then
x := x + 1;
while x<= y do
begin
writeln(x, ' - ');
x := x + 2;
end;
writeln('Fim da Lista');
end.
Pascal
120
Teste lgico
program Teste;
var
a, b:integer;
begin
writeln('Digite um nmero para A');
readln(a);
writeln('Digite o nmero para B');
readln(b);
if (a > b) then { Se A maior que B ento }
writeln('A maior que B')
else { Seno }
if (a < b) then
writeln('B maior que A')
else
writeln('B igual A');
end.
Compiladores Gratuitos
H vrios compiladores Pascal gratuitos, como por exemplo:
Chrome
[1]
a prxima gerao do Object Pascal para as plataformas .NET e Mono, desenvolvida pela
RemObjects Software
[2]
Free Pascal
[3]
um poderoso compilador escrito em Pascal, distribuido sob a licena de uso GNU GPL. Pode ser
utilizado em conjunto com cdigo escrito em Turbo Pascal ou Delphi, e pode ser usados em vrias plataformas e
sistemas operacionais
GNU Pascal Compiler (GPC)
[4]
o compilador padro da GNU Compiler Collection (GCC). O compilador foi
escrito em C, mas a maior parte da biblioteca de funes da linguagem escrita em Pascal. Ele segue os padres
ANSI/ISO e grande parte dos padres Borland/Turbo Pascal. O suporte ao Delphi ainda limitado
Kylix
[5]
uma verso do Delphi para o sistema operacional Linux, sendo que seu compilador e sua interface de
desenvolvimento so gratuitas para uso no comercial, mas sua biblioteca de componentes no. Espera-se que o
cdigo-fonte do compilador seja aberto em breve
P4 compiler
[6]
, utilizado para o desenvolvimento de vrios compiladores Pascal escritos em Pascal, incluindo o
UCSD p-System
O Pascalzim um compilador gratuito que foi desenvolvido na Universidade de Braslia e utilizado em vrias
disciplinas de introduo a programao na UnB e outras universidades.
Turbo Pascal era o principal compilador Pascal para PCs durante os anos 80 e incio dos anos 90, devendo sua
popularidade ao seu grande poder e pequeno tempo de compilao. Hoje em dia, suas verses mais antigas (at a
verso 5.5) podem ser baixadas gratuitamente no site da Borland (exige registro)
Virtual Pascal
[7]
foi criado por Vitaly Miryanov em 1995 como um compilador nativo para OS/2, compatvel
com a sitaxe do Pascal da Borland. Mais tarde foi comercialmente lanado pela fPrint, adicionando a ele suporte
para Win32, tornando-se um freeware em 2000. Atualmente, ele pode ser compilado para as plataformas Win32,
OS/2 e Linux, sendo compatvel em grande parte com o Pascal da Borland e o Delphi
Uma extensa lista de compiladores pode ser encontrada na Pascaland
[8]
. O site escrito em francs, mas isso no faz
muita diferena, j que apenas uma lista de URLs para os compiladores.
[1] http:/ / www. chromesville.com
[2] http:/ / www. remobjects.com
Pascal
121
[3] http:/ / www. freepascal.org
[4] http:/ / www. gnu-pascal. de/
[5] http:/ / www. borland.com/ kylix/
[6] http:/ / homepages.cwi.nl/ ~steven/ pascal/
[7] http:/ / www. vpascal. com/
[8] http:/ / pascaland. org
Eber Assis Schmitz/Antonio Anibal de Souza Teles, Pascal e Tcnicas de Programao, Livros Tcnicos e
Cientficos Editora S/A, IBPI Instituto Brasileiro de Pesquisa em Informtica, Apndice Turbo Pascal, 2a. Edio,
ISBN 85-216-0475-0
Ian Mecler/Luiz Paulo Maia, Programao e Lgica com Turbo Pascal, Editora Campus, ISBN 85-7001-560-7
Ligaes externas
Free Pascal (http:/ / www. freepascal. org/ ) (em ingls) - compilador cdigo aberto
The Pascal Programming Language (http:/ / pascal-central. com/ ppl/ index. html) (em ingls) por Bill Catambay
Sinuca (https:/ / sites. google. com/ site/ sinucapascal/ sinuca) (em portugus) - jogo feito em Pascal, com cdigo
fonte
Tutorial de Pascal (http:/ / wiki. portugal-a-programar. org/ dev_geral:pascal:tutorial_2010:indice) (em portugus)
na Wiki P@P, do Portugal-a-Programar(R)
Personagem: Dennis Ritchie
Dennis Ritchie
Fsica, matemtica aplicada, cincia da computao
Dennis Ritchie em 1998
Nacionalidade norte-americano(a)
Nascimento 9 de Setembro de 1941
Local Bronxville, Nova Iorque
Estados Unidos
Morte 12 de Outubro de 2011(70anos)
Personagem: Dennis Ritchie
122
Local Berkeley Heights, Nova Jersey
Estados Unidos
Atividade
Campo(s) Fsica, matemtica aplicada, cincia da computao
Instituies Lucent Technologies
Bell Labs
Alma mater Universidade de Harvard
Conhecido(a) por Linguagem de programao B
Linguagem de programao C
Multics
Unix
Prmio(s) Prmio Turing (1983)
Medalha Richard W. Hamming (1990)
Prmio Pioneiro da Computao (1994)
Medalha Nacional de Tecnologia e Inovao (1998)
Prmio Japo (2011)
Dennis MacAlistair Ritchie (Bronxville, 9 de Setembro de 1941 Berkeley Heights, 12 de Outubro de 2011) foi
um cientista da computao estadunidense, notvel pela sua influncia em linguagens de programao como
ALTRAN, B, BCPL e C, e em sistemas operacionais como o Multics e o UNIX.
Nascido em Bronxville, Nova Iorque, Ritchie formou-se em fsica e matemtica aplicada pela Universidade de
Harvard. Em 1967 comeou a trabalhar no Centro de Investigao de Cincias Computacionais dos laboratrios Bell.
Foi chefe do Departamento de Investigao de Software de Sistemas da Lucent Technologies. Em 1983, ele e Ken
Thompson receberam o Prmio Turing "pelo seu desenvolvimento de teoria de sistemas operativos genricos e
especialmente pela sua implementao do sistema operativo UNIX."
C e UNIX
Ao perguntarem-lhe sobre o que lhe influenciou a desenvolver a linguagem C da maneira que ele a fez, Ritchie teria
respondido que "parecia a coisa certa a ser feita" e que qualquer pessoa que se encontrasse na mesma altura e no
mesmo lugar que ele teria feito a mesma coisa. Um dos seus colegas dos laboratrios Bell, Bjarne Stroustrup, que
desenvolveu e projectou a linguagem C++, uma verso da linguagem C mais vocacionada para a programao
orientada a objetos, supostamente disse que "se o Dennis tivesse optado por dedicar-se naquela dcada matemtica
esotrica, o UNIX teria sido um natimorto." Certamente, sendo o inventor da linguagem de programao C e o
co-inventor (juntamente com Ken Thompson) do sistema operativo UNIX, Ritchie ganhou um lugar importante na
histria da indstria informtica. A linguagem C continua a ser largamente utilizada no desenvolvimento de
aplicaes e sistemas operativos e a sua influncia pode ser vista em linguagens de programao mais recentes, tais
como C++, Java, C#, PHP e JavaScript.
No mundo dos sistemas operativos, o UNIX tambm muito influente. A partir da linguagem C foram
desenvolvidos vrios sistemas operativos inspirados do UNIX sistemas ditos unix-like . At a Microsoft, cujo
sistema operativo Windows compete com o UNIX, desenvolveu ferramentas de compatibilidade de UNIX e
compiladores de C para desenvolvedores dos seus produtos.
Personagem: Dennis Ritchie
123
Ken Thompson e Dennis Ritchie em 1984
Alcunhas
Dennis Ritchie era frequentemente referido como "DMR" em vrios
grupos de discusso da Usenet (tais como comp.lang.c); ele era o "R"
do K&R.
Morte e legado
Dennis Ritchie foi encontrado morto em 12 de outubro de 2011, aos 70
anos, em sua casa em Berkeley Heights, Nova Jersey, onde ele vivia
sozinho. A primeira notcia de sua morte veio de seu ex-colega, Rob Pike. A causa e a hora exata da morte no foram
divulgados. Ele tinha uma sade frgil aps vrios anos de tratamento para cncer de prstata e doenas cardacas.
Sua morte, que veio uma semana depois da morte de Steve Jobs, no recebeu tanta cobertura da mdia.
Publicaes
"The C Programming Language", Dennis Ritchie, Brian Kernighan, (1978) (No Brasil: C - A Linguagem de
Programao - Ed. Campus, 1986)
"Unix Programmer's Manual", Dennis Ritchie (1971)
Ligaes externas
Pgina pessoal (http:/ / www. cs. bell-labs. com/ who/ dmr/ )
Ritchie e Thompson a receber a medalha nacional da tecnologia do Presidente Clinton (http:/ / www. bell-labs.
com/ news/ 1999/ april/ 28/ 1. html)
Unix's founding fathers - Economist.com, July 12, 2004 (http:/ / economist. com/ science/ tq/ displayStory.
cfm?story_id=2724348)
Precedido por
Stephen Cook
Prmio Turing
1983
com Ken Thompson
Sucedido por
Niklaus Wirth
Personagem: Ken Thompson
124
Personagem: Ken Thompson
Kenneth Thompson
Engenharia, cincia da computao
Ken Thompson (esquerda) e Dennis Ritchie (direita)
Nascimento 4 de fevereiro de 1943(71anos)
Local Nova Orleans
Atividade
Campo(s) Engenharia, cincia da computao
Instituies Bell Labs, Entrisphere Inc, Google Inc
Alma mater Universidade da Califrnia em Berkeley
Conhecido(a) por Unix, B (linguagem de programao), UTF-8, Tabelas de finais (enxadrismo)
Prmio(s) Prmio Turing (1983), Medalha Richard W. Hamming (1990), Prmio Pioneiro da Computao (1994),
Medalha Nacional de Tecnologia e Inovao (1998), Prmio Tsutomu Kanai (1999), Prmio Japo (2011)
Kenneth Thompson (Nova Orlees, 4 de fevereiro de 1943) um cientista da computao, conhecido pela sua
influncia no sistema operacional UNIX.
Bachelor e master, ambos em engenharia electrotcnica, na UC Berkeley. Em 1969, enquanto trabalhava nos
laboratrios Bell, Thompson e Dennis Ritchie foram os principais criadores do sistema operacional UNIX.
Thompson tambm criou a linguagem de programao B, uma precursora da linguagem C de Dennis Ritchie, uma
das linguagens de programao mais utilizadas. Mais tarde, enquanto se encontrava ao servio dos laboratrios Bell,
ele e Rob Pike foram os principais criadores do sistema operacional Plan 9. Durante o seu trabalho, ele tambm criou
a codificao de caracteres UTF-8 para uso no sistema operacional Plan 9. Ele tambm escreveu programas para a
enumerao completa de finalizaes de xadrez, para todas as finalizaes de 4, 5 e 6 peas. Recorrendo a esse
programa, um programa de jogo de xadrez tem a capacidade de jogar perfeitamente ao atingir-se uma das situaes
pr-definidas. Thompson e Ritchie receberam conjuntamente o Prmio Turing em 1983 "pelo seu desenvolvimento
de teoria de sistemas operacionais genricos e especialmente pela sua implementao do sistema operacional UNIX".
Thompson reformou-se dos laboratrios Bell em 1 de dezembro de 2000.
C
125
C
C
Paradigma Programao estruturada
Programao imperativa
Programao procedural
Surgido em 1972
ltima verso C11 (dezembro de 2011)
Criado por Dennis Ritchie
Estilo de tipagem: Esttica, Fraco
Compiladores Borland C, GNU GCC, Microsoft Visual Studio, Turbo C, Watcom C, Tiny C Compiler
Dialetos: ANSI C, C99, C11, ISO C, K&R C
Influenciada por ALGOL 68, Assembly, B, BCPL, CPL, Fortran, PL/I
Influenciou AWK, BitC, C++, C, C Shell, D, Euphoria, Go, Java, JavaScript, Limbo, Logic Basic, Objective-C, Perl, PHP
Licena: Dependente de implementao
C uma linguagem de programao compilada de propsito geral, estruturada, imperativa, procedural, padronizada
pela ISO, criada em 1972, por Dennis Ritchie, no AT&T Bell Labs, para desenvolver o sistema operacional Unix
(que foi originalmente escrito em Assembly).
C uma das linguagens de programao mais populares e existem poucas arquiteturas para as quais no existem
compiladores para C. C tem influenciado muitas outras linguagens de programao, mais notavelmente C++, que
originalmente comeou como uma extenso para C.
Histria
Ken Thompson e Dennis Ritchie (da esquerda para direita), os criadores das
linguagens B e C, respectivamente.
O desenvolvimento inicial de C ocorreu no
AT&T Bell Labs entre 1969 e 1973. de
acordo com Ritchie, o perodo mais criativo
ocorreu em 1972. A linguagem foi chamada
"C", porque suas caractersticas foram
obtidas a partir de uma linguagem
anteriormente chamado de " B", que de
acordo com a Ken Thompson era verso
reduzida da linguagem de programao
BCPL.
[1]
A verso original PDP-11 do sistema Unix
foi desenvolvido em assembly. Em1973,
com a adio dos tipos struct, a
linguagem C tornou-se poderosa o suficiente
para que a maior parte do kernel do Unix
fosse reescrito em C. Este foi um dos primeiros ncleos de sistemas operacionais implementadas em uma linguagem
diferente da linguagem Assembly. Em 1977, foram feitas novas mudanas por Ritchie e Stephen C. Johnson para
facilitar a portabilidade do sistema operacional Unix. O Portable C Compiler' de Johnson serviu de base para vrias
implementaes de C em novas plataformas.
C
126
C K&R
A linguagem C no teve sucesso imediato aps sua criao e seu uso ficou restrito a alguns laboratrios mas em
1978 Brian Kerningham e Dennis Rithcie lanam o livro The C Programming Language. que serviu de tutorial e
mudou a histria da programao em C, de fato essa primeira verso da linguagem conhecida como "C Kernigham
e Ritchie" ou apenas "C K&R".
Esse livro, conhecido pelos programadores de C como "K&R", serviu durante muitos anos como uma especificao
informal da linguagem. A verso da linguagem C que ele descreve usualmente referida como "K&R C". A
segunda edio do livro cobriu o padro posterior, o ANSI C. K&R C introduziu as seguintes caractersticas na
linguagem:
Biblioteca padro de E/S
Tipos de dado struct
Tipos de dado long int
Tipos de dado unsigned int
O operador =+ foi alterado para +=, e =- para -= (o analisador lxico do compilador fazia confuso entre i
=+ 10 e i = +10. O mesmo acontecia com =-)
K&R C frequentemente considerado a parte mais bsica da linguagem, cujo suporte deve ser assegurado por um
compilador C. Durante muitos anos, mesmo aps a introduo do padro ANSI C, K&R C foi considerado o "menor
denominador comum", em que programadores de C se apoiavam quando uma portabilidade mxima era desejada, j
que nem todos os compiladores eram actualizados o bastante para suportar o padro ANSI C.
Nos anos que se seguiram publicao do K&R C, algumas caractersticas "no-oficiais" foram adicionadas
linguagem, suportadas por compiladores da AT&T e de outros vendedores. Estas incluam:
Funes void e tipos de dados void *
Funes que retornam tipos struct ou union
Campos de nome struct num espao de nome separado para cada tipo struct
Atribuio a tipos de dados struct
Qualificadores const para criar um objecto s de leitura
Biblioteca padro, que incorpora grande parte da funcionalidade implementada por vrios vendedores
Enumeraes
Clculos de ponto-flutuante em preciso simples (no K&R C, os clculos intermedirios eram feitos sempre em
double, porque era mais eficiente na mquina onde a primeira implementao do C foi feita)
ANSI C e ISO C
Durante os finais da dcada de 1970, a linguagem C comeou a substituir a linguagem BASIC como a linguagem de
programao de microcomputadores mais usada. Durante a dcada de 1980, foi adaptada para uso no PC IBM, e a
sua popularidade comeou a aumentar significativamente. Ao mesmo tempo, Bjarne Stroustrup, juntamente com
outros nos laboratrios Bell, comeou a trabalhar num projecto onde se adicionavam construes de linguagens de
programao orientada por objectos linguagem C. A linguagem que eles produziram, chamada C++, nos dias de
hoje a linguagem de programao de aplicaes mais comum no sistema operativo Windows da companhia
Microsoft; C permanece mais popular no mundo Unix.
Em 1983, o instituto norte-americano de padres (ANSI) formou um comit, X3J11, para estabelecer uma
especificao do padro da linguagem C. Aps um processo longo e rduo, o padro foi completo em 1989 e
ratificado como ANSI X3.159-1989 "Programming Language C". Esta verso da linguagem frequentemente
referida como ANSI C. Em 1990, o padro ANSI C, aps sofrer umas modificaes menores, foi adotado pela
Organizao Internacional para Padronizao (ISO) como ISO/IEC 9899:1990, tambm conhecido como C89 ou
C90. Um dos objetivos do processo de padronizao ANSI C foi o de produzir um sobreconjunto do K&R C,
C
127
incorporando muitas das caractersticas no-oficiais subsequentemente introduzidas. Entretanto, muitos programas
tinham sido escritos e que no compilavam em certas plataformas, ou com um certo compilador, devido ao uso de
bibliotecas de funes no-padro e ao fato de alguns compiladores no aderirem ao ANSI C.
C99
Aps o processo da padronizao ANSI, as especificaes da linguagem C permaneceram relativamente estticas por
algum tempo, enquanto a linguagem C++ continuou a evoluir. (em 1995, a Normative Amendment 1 criou uma
verso nova da linguagem C mas esta verso raramente tida em conta.) Contudo, o padro foi submetido a uma
reviso nos finais da dcada de 1990, levando publicao da norma ISO 9899:1999 em 1999. Este padro
geralmente referido como "C99". O padro foi adoptado como um padro ANSI em maro de 2000. As novas
caractersticas do C99 incluem:
Funes em linha
Remoo de restries sobre a localizao da declarao de variveis (como em C++)
Adio de vrios tipos de dados novos, incluindo o long long int (para minimizar problemas na transio
de 32-bits para 64-bits), um tipo de dado boolean explicito (chamado _Bool) e um tipo complex que representa
nmeros complexos
Vetores de dados de comprimento varivel (o vetor pode ter um tamanho diferente a cada execuo de uma
funo, mas no cresce depois de criado)
Suporte oficial para comentrios de uma linha iniciados por //, emprestados da linguagem C++
Vrias funes de biblioteca novas, tais como snprintf()
Vrios ficheiros-cabealho novos, tais como stdint.h
O interesse em suportar as caractersticas novas de C99 parece depender muito das entidades. Apesar do GCC e
vrios outros compiladores suportarem grande parte das novas caractersticas do C99, os compiladores mantidos pela
Microsoft e pela Borland suportam pouqussimos recursos do C99, e estas duas companhias no parecem estar muito
interessadas em adicionar tais funcionalidades, ignorando por completo as normas internacionais. A Microsoft
parece preferir dar mais nfase ao C++.
C11
Em 2007, se iniciou o trabalho em antecipao de outra reviso do padro de C, informalmente chamada de C11 ou
C1X. O comit dos padres de C adotou regras para limitar a insero de novos recursos que no tenham ainda sido
testados por implementaes existentes.
Em dezembro de 2011 foi publicada a verso estvel da especificao, como ISO/IEC 9899:2011.
Viso geral
C uma linguagem imperativa e procedural, para implementao de sistemas. Seus pontos de design foram para ele
ser compilado, fornecendo acesso de baixo nvel memria e baixos requerimentos do hardware. Tambm foi
desenvolvido para ser uma linguagem de alto nvel, para maior reaproveitamento do cdigo. C foi til para muitas
aplicaes que foram codificadas originalmente em Assembly.
Essa propriedade no foi acidental; a linguagem C foi criada com o objectivo principal em mente: facilitar a criao
de programas extensos com menos erros, recorrendo ao paradigma da programao procedural, mas sobrecarregando
menos o autor do compilador, cujo trabalho complica-se ao ter de realizar as caractersticas complexas da linguagem.
Para este fim, a linguagem C possui as seguintes caractersticas:
Uma linguagem extremamente simples, com funcionalidades no-essenciais, tais como funes matemticas ou
manuseamento de ficheiros (arquivos), fornecida por um conjunto de bibliotecas de rotinas padronizada
A focalizao no paradigma de programao procedural
C
128
Um sistema de tipos simples que evita vrias operaes que no fazem sentido
Uso de uma linguagem de pr-processamento, o pr-processador de C, para tarefas tais como a definio de
macros e a incluso de mltiplos ficheiros de cdigo fonte
Ponteiros do maior flexibilidade linguagem
Acesso de baixo-nvel, atravs de incluses de cdigo Assembly no meio do programa C
Parmetros que so sempre passados por valor para as funes e nunca por referncia ( possvel simular a
passagem por referncia com o uso de ponteiros)
Definio do alcance lexical de variveis
Estruturas de variveis, (structs), que permitem que dados relacionados sejam combinados e manipulados como
um todo
Algumas caractersticas teis, que faltam em C, podem ser encontradas em outras linguagens, que incluem:
Segurana de tipo
Coletor de lixo (mais comum em linguagens interpretadas)
Vetores que crescem automaticamete
Classes ou objetos com comportamento (ver Orientao a objetos)
Clausuras
funes aninhadas
Sobrecarga de operadores
Meta-programao
Apoio nativo de multithreading e comunicao por rede
Apesar da lista de caractersticas teis que C possui no ser longa, isso no tem sido um impedimento sua
aceitao, pois isso permite que novos compiladores de C sejam escritos rapidamente para novas plataformas, e
tambm permite que o programador permanea sempre em controle do que o programa est a fazer. Isto o que por
vrias vezes permite o cdigo de C correr de uma forma mais eficiente que muitas outras linguagens. Tipicamente,
s cdigo de Assembly "afinado mo" que corre mais rapidamente, pois possui um controle completo da
mquina, mas avanos na rea de compiladores juntamente com uma nova complexidade nos processadores
modernos permitiram que a diferena tenha sido rapidamente eliminada. Uma consequncia da aceitao geral da
linguagem C que frequentemente os compiladores, bibliotecas e at intrpretes de outras linguagens de nvel maior
sejam eles prprios implementados em C.
C tem como ponto forte, a sua eficincia, e a linguagem de programao preferida para o desenvolvimento de
sistemas e softwares de base, apesar de tambm ser usada para desenvolver programas de computador. tambm
muito usada no ensino de cincia da computao, mesmo no tendo sido projetada para estudantes e apresentando
algumas dificuldades no seu uso. Outra caracterstica importante de C, sua proximidade do cdigo de mquina, que
permite que um projetista seja capaz de fazer algumas previses de como o software ir se comportar, ao ser
executado.
C tem como ponto fraco, a falta de proteo que d ao programador. Praticamente tudo que se expressa em um
programa em C, pode ser executado, como por exemplo, pedir o vigsimo membro de um vetor com apenas dez
membros. Os resultados so muitas vezes totalmente inesperados, e os erros, difceis de encontrar.
Tipos de dados
C tem um sistema de tipos semelhante ao de alguns descendentes da linguagem ALGOL, tais como Pascal. Possui
tipos para nmeros inteiros de vrios tamanhos com e sem sinal, nmeros de ponto flutuante, caracteres e estruturas
(structs). C usa extensivamente ponteiros, um tipo muito simples de referncia que guarda o endereo de
memria da varivel. O ponteiro pode ser desreferenciado, uma operao que busca o objecto que se encontra na
morada da memria que o ponteiro possui, morada essa que pode ser manipulada atravs de aritmtica de ponteiros.
Durante o tempo de execuo, o ponteiro simplesmente uma morada de mquina tais como aquelas manipuladas
C
129
em Assembly, mas em tempo de compilao possui um tipo complexo que indica o tipo do objecto para onde ele
aponta, permitindo que se verifique o tipo de expresses, incluindo ponteiros. Os ponteiros so usados
extensivamente em C. O tipo linha de texto de C simplesmente um ponteiro para um vetor de caracteres e alocao
dinmica de memria, descrita abaixo, efectuada atravs de ponteiros.
Os ponteiros em C possuem um valor reservado especial, NULL, que indica que no esto a apontar para uma
morada. O uso desse valor como morada muito til na construo de vrias estruturas de dados, mas causa
comportamento no-definido (possivelmente uma falha de sistema) ao ser desreferenciado. Um ponteiro que possui o
valor NULL chamado ponteiro nulo. Os ponteiros so declarados (e desreferenciados) com um * (asterisco),
portanto o tipo int* denota um ponteiro para nmero(s) inteiro(s). A linguagem C tambm fornece um tipo especial
de ponteiros, o void*, que se traduz num ponteiro que aponta para um objecto de tipo desconhecido.
A linguagem C tambm tem apoio a nvel de linguagem para vetores estticas (de dimenso fixa) de tipos. As
disposies de tipos podem parecer ter mais que uma dimenso apesar de serem tecnicamente disposies de
disposies de tipos. Em memria, tais estruturas so posicionadas com as linhas uma depois da outra (a alternativa
seria armazenar os dados em colunas, usado em outras linguagens). O acesso a disposies de tipos feito atravs de
ponteiros e aritmtica de ponteiros; o nome da disposio tratado como se fosse um ponteiro que aponta para o
incio da disposio. Em certas aplicaes no razovel usarem-se disposies de tipos de dimenso fixa e por isso
a alocao dinmica de memria pode ser usada para criar disposies de tipos de dimenso varivel.
Como a linguagem C regularmente usada em programao de baixo-nvel de sistemas, h casos em que
necessrio tratar um nmero inteiro como sendo um ponteiro, um nmero de ponto flutuante como sendo um nmero
inteiro ou um tipo de ponteiro como sendo outro. Para estes casos, a linguagem C fornece a capacidade de
"moldagem" (tambm denominado "converso de tipo" ou casting), uma operao que, caso seja possvel, fora a
converso de um objecto de um tipo para outro. Apesar de ser por vezes necessrio, o uso de converses de tipo
sacrifica alguma segurana oferecida pelo sistema de tipos.
int
O tipo de dado int (inteiro) serve para armazenar valores numricos inteiros. Existem vrios tipos de inteiros, cada
um de um tamanho diferente (dependendo do sistema operacional e/ou arquitetura do processador):
int, pode possuir 16 bits, 32 bits ou 64 bits
short int, deve possuir tamanho de no mnimo 16 bits e no pode ser maior que int
long int, deve possuir tamanho mnimo de 32 bits
long long int, deve possuir tamanho mnimo de 64 bits
Todos estes tipos de inteiros podem ainda ser declarados precedidos da clusula unsigned, o que faz com que s
suporte nmeros positivos. Isto faz com que, com o mesmo tamanho, uma varivel suporte mais nmeros positivos
do que um signed (todos os inteiros so signed por omisso).
char
O tipo char ocupa 1 byte, e serve para armazenar caracteres ou inteiros. Isso significa que o programa reserva um
espao de 8 bits na memria RAM ou em registradores do processador para armazenar um valor (char de tamanho
maior que 8 bits permitido pela linguagem, mas os casos so raros). Com vetores do tipo char possvel criar
cadeias de caracteres (strings).
float
O tipo de dado float serve para armazenar nmeros de ponto flutuante, ou seja, com casas decimais. O padro mais
utilizado nos ltimos 10 anos o IEEE 754-1985.
double
O tipo de dado double serve para armazenar nmeros de ponto flutuante de dupla preciso, normalmente tem o
dobro do tamanho do float e portanto o dobro da capacidade. O padro mais adotado tambm o IEEE 754-1985.
C
130
struct
Em C podem ser usadas estruturas (chamados de registos em outras linguagens de programao). As estruturas so
grupos de variveis organizadas arbitrriamente pelo programador. Uma estrutura pode criar um novo tipo de
varivel caso typedef seja usado em sua declarao.
Relaes com C++
A linguagem de programao C++ foi originalmente derivada do C para suportar programao orientada a objetos.
medida que as linguagens C e C++ foram evoluindo independentemente, a diviso entre as duas veio a aumentar. O
padro C99 criou um nmero de caractersticas que entram em conflito. Hoje, as principais diferenas entre as duas
linguagens so:
inline - em C++, funes em linha encontram-se no espao global enquanto que em C encontram-se no espao
local. Por outras palavras, isso significa que, em C++, qualquer definio de qualquer funo em linha (sem ser a
respeito da sobrecarga de funes de C++) tem de estar em conformidade com a "regra de uma definio" da
linguagem C++. Mas em C, a mesma funo em linha pode ser definida de maneira diferente em diferentes
arquivos (ou ficheiros)
A palavra-chave bool, igual usada em C++, em C99 necessita que se inclua o ficheiro-cabealho
<stdbool.h> (_Bool est sempre disponvel). Padres anteriores de C no definiam um tipo booleano e vrios
(e incompatveis) mtodos foram usados para simular um tipo booleano
Algumas caractersticas originalmente desenvolvidas em C++ tambm apareceram em C. Entre elas encontram-se:
prottipos de funo (com declarao de tipos de parmetros) e remoo do "int" implcito
comentrios de linha, indicados por //; comentrios de linha terminam com um carcter de nova-linha
a palavra-chave inline
tipagem mais forte
Exemplos
Programa Ol Mundo
A seguinte aplicao foi publicada na primeira edio de C de K&R, e tornou-se no programa de introduo padro
da maior parte dos livros sobre C. O programa envia o texto "Ol, Mundo!" para a sada padro, que normalmente
o console, mas que tambm pode ser um ficheiro (ou arquivo), um outro dispositivo qualquer, ou at mesmo um bit
bucket, dependendo de como a sada-padro mapeada na altura em que o programa executado.
int main(void)
{
puts("Ol, Mundo!");
}
Apesar do programa acima correr corretamente, atualmente origina algumas mensagens de aviso quando compilado
como C ANSI. Essas mensagens podem ser eliminadas efectuando umas pequenas alteraes no programa original:
#include <stdio.h> /* Pacotes com funes de entrada e sada */
int main(void)
{
puts("Ol, Mundo!");
return 0; /* Retorna 0, pois `main` retorna um `int` */
}
C
131
/* Nova linha aps fechar a chave principal */
A primeira linha do programa uma diretiva de pr-processamento #include, que causa com que o
pr-processador substitua aquela linha pela totalidade do contedo do arquivo qual diretiva se refere. Neste caso o
arquivo padro stdio.h (que contm prottipos de funes para trabalho com entrada e sada) ir substituir a
linha. Os caracteres < e > indicam que o arquivo stdio.h encontra-se no local em que, quando da configurao do
compilador, se definiu como padro para localizao dos ficheiros de incluso (header files, geralmente com a
extenso .h).
A linha (no-vazia) seguinte indica que uma funo denominada main ser definida. A funo main tem um
significado especial nos programas em C, pois a funo que inicialmente executada (em ingls, entry point). Os
caracteres { e } delimitam a extenso da funo. O termo int define a funo main como sendo uma funo que
retorna um nmero inteiro. O termo void indica que a funo no aceita parmetros. A funo main, normalmente
aceita parmetros, que so passado pela linha de comando. Os compiladores e sistemas operacionais atuais
reconhecem as seguintes declaraes de main:
int main(void);
int main(int argc, char *argv[]);
int main(int argc, char **argv);
A linha seguinte "chama", ou executa uma funo chamada puts; o arquivo includo, stdio.h, contm a
informao que descreve a forma como a funo puts deve ser chamada. Nesta chamada, passado funo
printf um nico argumento, a linha de texto constante "Ol, Mundo!". A funo puts retorna um valor, um
int, mas como no usado, descartado pelo compilador. O comando return retorna o valor 0 para o sistema,
que interpretado pelo mesmo como que a funo main() foi executada e encerrada com sucesso (sem erros). Por
fim, o caracter } indica o fim da funo main. Note-se que texto rodeado por /* e */ (comentrios de texto)
ignorado pelo compilador. Os compiladores que obedecem norma C99 tambm aceitam como comentrios as
linhas de texto que so precedidos por //.
Matemtica
O seguinte cdigo realiza seis operaes matemticas, adio, subtrao, multiplicao, diviso, exponenciao e
radiciao, e em seguida envia os seus respectivos resultados para a sada padro (normalmente o console).
#include <math.h> // necessria para pow() e sqrt()
#include <stdio.h> // necessria para printf() e getchar()
int main()
{
int a = 2, b = 3;
printf("%d + %d = %d\n", a, b, a + b);
printf("%d - %d = %d\n", a, b, a - b);
printf("%d x %d = %d\n", a, b, a * b);
printf("%d / %d = %0.1f\n", a, b, (float) a / b); // resultado
fracionrio
printf("%d elevado a %d = %0.1f\n", a, b, pow(a, b)); // pow(base,
expoente)
printf("raiz quadrada de %d = %0.1f\n", a, sqrt(a));
getchar(); //O uso dessa funo necessria apenas nos sistemas
C
132
Windows, para manter o terminal (Prompt de comando) aberto
return 0;
}
Estruturas de dados
No exemplo seguinte, criada uma estrutura composta por 3 elementos de tipos diferentes. Aps ser declarada uma
varivel "x" do tipo struct "y", onde "y" o nome da estrutura, para se acessar os elementos usa-se a seguinte
sintaxe: x.elemento.
#include <stdio.h>
struct Pessoa
{
char nome[64]; // vetor de 64 chars para o nome
unsigned short int idade;
char rg[13];
};
int main()
{
struct Pessoa exemplo = {"Fulano", 16, "00.000.000-00"}; //
declarao da varivel "exemplo"
printf("Nome: %s\n", exemplo.nome);
printf("Idade: %hu\n", exemplo.idade);
printf("RG: %s\n", exemplo.rg);
getchar(); // desnecessrio, mas comumente utilizado em ambientes
windows para "segurar" o terminal aberto
return 0;
}
Ou, equivalente:
#include <stdio.h>
typedef struct Pessoa
{
char nome[64]; // vetor de 64 chars para o nome
unsigned short int idade;
char rg[13];
} Pessoa;
int main()
{
Pessoa exemplo = {"Felipe", 16, "00.000.000-00"}; // declarao da
varivel "exemplo"
printf("Nome: %s\n", exemplo.nome);
C
133
printf("Idade: %hu\n", exemplo.idade);
printf("RG: %s\n", exemplo.rg);
getchar();
return 0;
}
Baixo-nvel
O exemplo que se segue apresenta cdigo C de baixo-nvel, as funes read e write. Neste programa vamos ler de N
para buf, blocos de bufsize neste caso 1024, para O. Quando n for igual a 0, porque a leitura acabou, sai do ciclo
while e libera a memria ocupada por buf.
#include <unistd.h>
#define bufsize 1024;
int main(void)
{
int N,n,O;
char *buf;
buf = (char*) malloc (bufsize);
while(n=read(N, buf, bufsize))
write(O, buf,n)
free(buf);
return 0;
}
Ferramentas de programao
Bloodshed Dev-C++
Code::Blocks
GNU Compiler Collection
Make
Ligaes externas
Pgina oficial do ISO C Working Group
[2]
(em ingls)
C
[3]
no Open Directory Project
C
134
Referncias
[1] A Brief History of C (http:/ / www.le. ac. uk/ users/ rjm1/ cotter/ page_06. htm)
[2] http:/ / www. open-std.org/ jtc1/ sc22/ wg14/
[3] http:/ / www. dmoz. org/ Computers/ Programming/ Languages/ C/
Ada
Ada uma Linguagem de programao estruturada, de tipagem esttica, uma linguagem imperativa, orientada a
objetos e uma linguagem de alto nvel, originada de Pascal , Simula e outras linguagens. Foi originalmente
produzida por uma equipe liderada por Jean Ichbiah da CII Honeywell Bull, contratados pelo Departamento de
Defesa dos Estados Unidos durante a dcada de 70, com o intuito de substituir as centenas de linguagem de
programao usadas pelo DoD. Ada uma aplicao com compiladores validados para uso confivel em misses
criticas, tais como softwares de aviao. Normatizada internacionalmente pela ISO, sua verso mais atual de 2005.
O nome Ada vem de Ada Lovelace, a mulher conhecida por ter escrito o primeiro algoritmo para ser processado por
uma mquina na histria da computao.
Introduo
No ano de 1974, o Departamento de Defesa dos Estados Unidos, criou um grupo para por em ordem a situao em
que o DoD (Departament of Defense) se encontrava. Eles utilizavam por volta de 450 linguagens ou dialetos de
programao e no possuam uma linguagem adequada para sistemas embutidos.
Formou-se ento o Grupo de Trabalho de Linguagens de Alta Ordem (HOLWG, sigla em ingls). O resultado
principal desse grupo foi que em 1979, a empresa francesa CII Honeywell Bull foi a campe de uma disputa entre 17
empresas para o desenvolvimento de uma nova linguagem de programao, pois a idia de adotar uma j existente
havia sido descartada.
E tentando realizar um sonho de uma linguagem universal, reunindo vrios personagens desde a sua gestao at a
sua publicao, aps diversas propostas de desenvolvimento, vrias revises de especificaes, em 1982, em
homenagem a Condessa Ada Lovelace, que pode ser considerada a dama dos computadores pela sua contribuio a
computao, surgiu Ada, uma linguagem de programao patrocinada pelo Departamento de Defesa dos EUA, que
teve uma base de Cobol e Basic e que anos mais tarde serviria de base para o Ruby.
No ano de 1982, foi publicado seu primeiro padro ISO (Ada 83), que ficou conhecido como Manual de Referncia
Ada. No ano de 1995, houve a primeira reviso da linguagem (Ada 95) e em 2006 foi liberada a mais nova verso
(Ada 2005), que incluiu conceitos usados na linguagem Java e algumas bibliotecas do C++. A prxima reviso deve
ser liberada em meados de 2012 (atualmente chamada pela comunidade como Ada 2012). A linguagem foi tambm,
a primeira linguagem de programao orientada a objetos padronizada internacionalmente.
Por motivo de esclarecimento, a grafia correta para a linguagem a terminao Ada e no ADA como est referida
em alguns lugares, pois se refere homenageada Ada Lovelace.
Ada
135
Ada Lovelace
Estrutura Bsica
A estrutura bsica de um programa escrito em Ada a seguinte:
--Declaracoes de bibliotecas
Procedure nome_do_programa is
--Declaracoes de variaveis
begin
--Corpo do programa com as instrucoes e calculos
end nome_do_programa;
Todo e qualquer comentrio iniciado com dois traos seguidos -- e terminam no fim da linha.
Exemplos prticos de programas escritos em Ada
A partir de agora sero exemplificados alguns cdigos de programas escritos usando Ada 95 e o compilador
Ada+SQL Development Environment 3.0.
Programa Ol Mundo!
No exemplo abaixo, temos um cdigo bsico de um programa escrito em Ada, usando a biblioteca Text_IO, que
fornece procedimentos de entrada e sada para trabalhar com textos.
--Programa Alo Mundo
With Ada.Text_IO; Use Ada.Text_IO;
Procedure AloMundo is
begin
Put("Programao em Ada!");
New_Line;
Put_Line("Exemplo do Ol Mundo!!");
end AloMundo;
No cdigo acima, o comando Put_Line, imprime na tela toda a expresso que est entre aspas dentro dos parnteses,
seguido de uma quebra de linha no final da expresso. No caso de querer implementar uma nova linha para identar
melhor a sada, pode se fazer o uso do comando New_Line;. Esse comando realiza uma quebra de linha na sada do
Ada
136
texto na tela.
A linha do cdigo de sada poderia ser escrita da seguinte maneira, no sendo necessrio ento o uso da expresso
Use Ada.Text_IO;:
Ada.Text_IO.Put_Line("Programao em Ada!");
Uma sugesto ter cuidado ao usar a clausula USE, pois em programas complexos ou grandes, podemos ficar sem
saber de que biblioteca vem o comando ou procedimento usado.
Usando Variveis
A declarao de variveis em Ada feita da seguinte forma:
varivel : tipo de varivel;
Para fazer a declaraes de variveis globais, ou seja, que valem para o programa todo, deve-se declar-las entre o
nome do procedimento e o begin. Para usarmos variveis, devemos saber usar os comandos de entrada e sada. O
comando de entrada padro do Ada o Get, assim como o comando de sada padro o Put, esses comandos esto
dentro da biblioteca Text_IO. Vamos a um exemplo prtico:
With text_IO; Use text_IO;
With Ada.Integer_Text_IO; Use Ada.Integer_Text_IO;
Procedure uso_variaveis is
n: natural;
idade : integer;
nome: string(1..100);
begin
New_Line(3);
Put("Digite o seu nome. (Ate 100 caracteres): ");
Get_Line(nome,n);
New_Line;
Put("Digite sua idade: ");
Get(idade);
New_Line;
Put_Line("Voce disse que: ");
Put(" * Seu nome e': ");
Put_Line(nome(1..n));
Put(" * Sua idade e': ");
Put(idade);
Put(" anos.");
New_Line(4);
end uso_variaveis;
Ada
137
O Comando If
Para o uso de condies, a estrutura bsica a seguinte:
if condicao then
sequencia de comandos (executada se a condio verdadeira)
else
outra sequencia de comandos (executada se a condio falsa)
end if;
Vamos a um exemplo prtico, onde tambm ser usado o comando elsif:
With text_IO; Use text_IO;
With Ada.Integer_Text_IO; Use Ada.Integer_Text_IO;
Procedure usando_if is
x, y : integer;
begin
New_Line(3);
Put("Digite o primeiro valor: ");
Get(x);
Put("Digite o segundo valor: ");
Get(y);
New_Line;
if x>y then
Put_Line("O Primeiro valor digitado e' maior!");
elseif x<y then
Put_Line("O Segundo valor digitado e' maior!");
else
Put_line("Os dois valores so iguais.");
end if;
New_Line(3);
end usando_if;
Os comandos For, While e Loop
No exemplo abaixo, temos um cdigo que faz o uso dos trs comandos.
With text_IO; Use text_IO;
With Ada.Integer_Text_IO; Use Ada.Integer_Text_IO;
Procedure usando_for_while_loop is
a: natural;
begin
New_Line(3);
for a in 1..3 loop
Put_Line("Usando o Comando For em Ada.");
end loop;
New_Line(3);
a := 1;
Ada
138
while a /=5 loop
Put_Line("Usando o Comando While em Ada.");
a := a + 1;
end loop;
New_Line(3);
a := 1;
loop
Put_Line("Usando o Comando Loop em Ada.");
exit when a=5;
a := a + 1;
end loop;
New_Line(3);
end usando_for_while_loop;
Exemplo de tabuada
Com os comandos apresentados acima, j possvel escrever alguns pequenos programas, como por exemplo, um
cdigo que imprime na tela do console a tabuada do 1 ao 10. Veja abaixo o cdigo:
With Ada.Text_IO; Use Ada.Text_IO;
With Ada.Integer_Text_IO; Use Ada.Integer_Text_IO;
Procedure Tabuada is
A, B: Integer;
begin
for A in 1 .. 10 loop
New_Line(2);
Put(" Tabuada do ");
Put(A);
New_Line;
New_Line;
for B in 1 .. 10 loop
Put(A);
Put(" X");
Put(B);
Put(" =");
Put(A*B);
New_Line;
end loop;
New_Line;
end loop;
New_Line(2);
end Tabuada;
Ada
139
Ligaes externas
The Lovelace Tutorial Tutorial de Ada 95. (http:/ / www. adahome. com/ Tutorials/ Lovelace/ lovelace. htm) (em
ingls)
Libre Site onde pode ser encontrado um compilador Ada para diversas plataformas (http:/ / libre. adacore. com)
(em ingls)
Ada Programming Wikibook (http:/ / en. wikibooks. org/ wiki/ Ada_Programming) (em ingls)
Jean Ichbiah (http:/ / en. wikipedia. org/ wiki/ Jean_Ichbiah) (em ingls)
Groupe Bull (http:/ / en. wikipedia. org/ wiki/ Groupe_Bull) (em ingls)
140
Outros paradigmas nos anos 70
BLISS
BLISS
Surgido em 1970
Criado por W. A. Wulf, D. B. Russell, A. N. Habermann da Carnegie Mellon University
Estilo de tipagem: sem tipagem
Dialetos: Common BLISS
Influenciada por ALGOL
BLISS uma linguagem de programao de sistemas desenvolvida na Universidade Carnegie Mellon por W. A.
Wulf, D. B. Russell, e A. N. Habermann por volta do ano 1970. Ela foi talvez a mais conhecida linguagem de
programao de sistemas at o surgimento da linguagem C. Desde ento, C despontou e BLISS ficou legada ao
esquecimento. Quando C foi ainda estava em sua infncia, havia ainda debates em alguns projetos, no mbito dos
laboratrios da Bell, a cerca do mrito de BLISS vs C.
BLISS uma linguagem baseada em expresses em vez de declaraes, estruturada em blocos, sem tipos e inclui
construes de manipulao de excees, corotinas e macros. No inclui uma declarao goto. O nome dito vrias
vezes para ser uma sigla para "Basic Language for Implementation of System Software" ou "System Software
Implementation Language, Backwards". Foi por vezes chamado de "Bill's Language for Implementing System
Software", aps Bill Wulf. O compilador original feito em Carnegie Mellon foi notvel pela sua utilizao extensiva
de otimizaes, e formou a base do clssico livro The Design of an Optimizing Compiler. A DEC desenvolveu e
manteve compiladores BLISS para o PDP-10 e PDP-11, DEC Alpha, Intel IA-64 e VAX. A maior parte dos
programas utilitrios para o sistema operativo VMS foram escritos em BLISS-32.
Exemplo de Cdigo
O exemplo a seguir tomado textualmente do manual da linguagem Bliss citado acima:
MODULE E1 (MAIN = CTRL) =
BEGIN
FORWARD ROUTINE
CTRL,
STEP;
ROUTINE CTRL =
!+
! This routine inputs a value, operates on it, and
! then outputs the result.
!-
BEGIN
EXTERNAL ROUTINE
GETNUM, ! Input a number from terminal
PUTNUM; ! Output a number to terminal
LOCAL
BLISS
141
X, ! Storage for input value
Y; ! Storage for output value
GETNUM(X);
Y = STEP(.X);
PUTNUM(.Y)
END;
ROUTINE STEP(A) =
!+
! This routine adds 1 to the given value.
!-
(.A+1);
END
ELUDOM
Verses
BLISS-10
BLISS-11 - um cross compiler para o PDP-11
BLISS-16
BLISS-16C - Verso DEC de BLISS-11
BLISS-32
BLISS-36
BLISS-64
Ligaes externas
Manual de BLISS na DECUS
[1]
Manual de Referncia da Linguagem
[2]
"BLISS: A Language for Systems Programming" by W.A. Wulf, D.B. Russell, and A.N. Habermann. (PostScript)
[3]
Session notes for "Introduction to BLISS" by Matthew D. Madison. (PostScript)
[4]
Referncias
[1] http:/ / decus.decus.de:8080/ htbin/ webbook/ PUBLIC$ROOT%3a%5bUTIL. BLISS%5d4358pro. p7. #1
[2] http:/ / 63.249. 85. 132/ langs/ bliss/ bliss. pdf
[3] http:/ / vms. process. com/ scripts/ fileserv/ fileserv. com?BLISS-ARTICLE
[4] http:/ / vms. process. com/ scripts/ fileserv/ fileserv. com?BLISS-INTRO
Forth
142
Forth
Forth
Paradigma Orientado a Pilha
Surgido em Anos 70
Criado por Charles H. Moore
Estilo de tipagem: sem tipos
Compiladores GNU Forth, bigforth
Dialetos: ANS Forth, Colorforth
Influenciou Factor, Postscript
Forth uma linguagem de programao procedural baseada em pilhas de dados, com sintaxe em Notao polonesa
inversa (RPN) e com os comandos organizados em uma lista extensvel chamada de dicionrio. Os comandos so
chamados de "palavras". A partir do dicionrio bsico, so criados outros comandos.
Forth foi "descoberta" por Charles H. Moore ("Chuck" Moore) no final dos anos 1960, e serviu de inspirao para
linguagens como Transcript, Postscript, Open Firmware, a linguagem de inicializao de placas PCI em sistema
Macintosh, e Factor, desenvolvida recentemente por Slava Pestov. Tambm 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 interpretao/compilao pode ser feita
atravs de bytecode ou cdigo de mquina.
Em geral, Forth pode trabalhar facilmente com qualquer base numrica entre 2 e 36. As palavras podem ser
livremente redefinidas. Freqentemente, definida como uma mistura de linguagem de baixo nvel e de alto nvel,
ou um assembly de alto nvel. 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
aplicaes 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 corporao europia e em
uso at hoje, principalmente fora da Europa.
Exemplo de programa
O seguinte programa define uma palavra que gera o dobro do nmero deixado na pilha:
: dobro dup + ;
A palavra ":" pega o texto "dobro" e monta uma nova entrada no dicionrio. O contedo dessa nova entrada a
palavra "dup", que duplicar o nmero do topo da pilha, quando a palavra "dobro" for usada. A palavra "+" retirar
os dois nmeros do topo da pilha, os somar e devolver o resultado para o topo da pilha. A palavra ";" encerra a
definio da nova palavra "dobro".
Para usar este programa:
5 dobro
O resultado ser o nmero 10 no topo da pilha.
O seguinte programa imprime o texto "Hello, world!":
Forth
143
: hello ." Hello, World!" ;
A palavra '."' envia ao dispositivo de sada todo o texto at o caracter '"'.
O seguinte programa imprime dez vezes a frase "Hello, world":
: 10hellos 10 0 do hello cr loop ;
Quando a nova palavra "10hellos" for usada, a palavra "do" pegar o nmero 10 no topo da pilha e definir como a
quantidade de repeties. As palavras at "loop" sero repetidas (no caso, a palavra "hello" anteriormente criada no
exemplo). A palavra "cr" emitir um "retorno de carro e nova linha" ao dispositivo de sada.
O seguinte programa redefine a palavra '+':
: mais + ;
Links relacionados
Forth Interest Group
[1]
Forth Inc.
[2]
Chuck Moore
[3]
Referncias
[1] http:/ / www. forth. org
[2] http:/ / www. forth. com
[3] http:/ / www. colorforth. com/
Smalltalk
Smalltalk
Paradigma Orientao a Objetos
Surgido em Incio em 1969, tornou-se pblico em 1980
Criado por Alan Kay, Dan Ingalls, Adele Goldberg
Estilo de
tipagem:
dinmica
Compiladores Squeak, GNU Smalltalk, VisualWorks
Dialetos: Squeak
Influenciada por Lisp, Simula, Logo, Sketchpad
Influenciou Objective-C, Self, Java, Dylan, AppleScript, Lisaac, D, NewtonScript, Python, Ruby, Scala, Perl 6, CLOS, Falcon,
Io, Ioke
Smalltalk-80, ou simplesmente Smalltalk, uma linguagem de programao orientada a objeto dinamicamente
tipada.
Em Smalltalk tudo objeto: os nmeros, as classes, os mtodos, blocos de cdigo, etc. No h tipos primitivos, ao
contrrio de outras linguagens orientadas a objeto; strings, nmeros e caracteres so implementados como classes em
Smalltalk, por isso esta linguagem considerada puramente orientada a objetos. Tecnicamente, todo elemento de
Smalltalk um objeto de primeira ordem.
Os programadores definem classes de objetos em suas aplicaes para imitar (ou simular) o mundo real. Estas
classes de objeto so organizadas hierarquicamente, de modo que seja possvel fazer novos objetos com
Smalltalk
144
caractersticas de outros objetos, com poucas mudanas.
Smalltalk relativamente fcil de aprender comparado a linguagens como C++ e ADA. O cdigo-fonte Smalltalk
fcil de ler, o que o torna a linguagem de programao ideal para iniciantes.
Histria
O Smalltalk evoluiu atravs de vrias iteraes. Do Smalltalk-71 (que parecia um pouco com o Logo) e Smalltalk-72
(no qual muitas das funcionalidades de mdia foram implementadas, da capacidade de desenhar at programas de
msica e linguagens de programao icnicas) para chegar no Smalltalk-76, que foi o primeiro Smalltalk moderno.
Dan Ingalls foi o principal implementador nessa poca, e o criador do Smalltalk-76. Ted Kaehler foi outro
implementador do equipe original do Learning Research Group, desenvolvendo o sistema de msica para o
Smalltalk-72, uma verso da tartaruga do Logo para Smalltalk, alm da estrutura de memria orientada a objetos.
O Smalltalk-80 foi lanado para computadores de diversas companhias (Hewlett-Packard, DEC, Apple, IBM,
Tektronix) como um teste de portabilidade do ambiente. Ele foi implementado como um compilador de bytecode. O
cdigo era de fato compilado, porm no para a linguagem de mquina nativa do computador que executava
aplicao e, sim, compilado para uma linguagem de mquina de um computador que no existia: a mquina virtual.
A vantagem desse esquema que foi criado com o Smalltalk-80 que ele tornou-se extremamente portvel.
O Smalltalk-80 tornou-se um padro para as diversas verses de Smalltalk. Depois disso, a Xerox resolveu criar uma
empresa chamada ParcPlace para cuidar do desenvolvimento do Smalltalk, gerando novas verses como
ObjectWorks e, posteriormente, VisualWorks. Outras verses foram criadas por outras companhias, tais como:
Smalltalk/V da Digitalk e o SmalltalkAgents da Quasar; todos com sintaxe e estruturas semelhantes, porm o cdigo
da interface grfica era radicalmente diferente.
Sintaxe
A sintaxe de Smalltalk-80 bastante diferente das linguagens tradicionais.
Ao invs do que usado na maioria das linguagens tradicionais, em Smalltalk utiliza-se sempre a ordem <objeto
recebedor> <mensagem>.
No exemplo abaixo, o mtodo publish formado de uma linha, onde se envia a mensagem show para o objeto
Transcript, com o parmetro Hello, world (que um objeto).
publish
Transcript show: 'Hello, world!'
Polimorfismo
Em Smalltalk no h o Polimorfismo Universal Paramtrico nem o Ad-Hoc por Coero. Sendo assim s h
implementado o Universal por Incluso e o Ad-Hoc por Sobrecarga. Exemplos:
Incluso:
Numeros subclass: #Primos
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Numeros'

Initialize
super initialize.

Smalltalk
145
verificaSeEPrimo: temp "a funcao isPrime ja existe na classe Integer"
Transcript show: temp isPrime.
imprime
Transcript show:'sobrescrevi o metodo imprime da classe
pai(Numeros). Isso mostra que Smalltalk suporta
polimorfismo universal por inclusao'.
Sobrecarga:
Object subclass: #Numeros
instanceVariableNames: 'val'
classVariableNames: ''
poolDictionaries: ''
category: 'Numeros'

Initialize
super initialize.
val := 0.

getVal
^ val.

setVal: aValor
val := aValor.

verificaSeEMembro: aInteger
^Transcript show: self class == aInteger class
imprime
Transcript show: val.

imprime: aValor
"temos aqui uma sobrecarga do metodo imprimir na mesma classe, o que
prova que smalltalk suporta polimorfismo Ad-Hoc
por sobrecarga"
Transcript show: aValor.
Smalltalk
146
Regras bsicas da linguagem
Tudo representado como objetos. (De longe, a regra mais importante em Smalltalk)
Toda computao disparada pelo envio de mensagens. Uma mensagem enviada para um objeto fazer alguma
coisa.
Quase todas as expresses so da forma <recebedor> <mensagem>.
Mensagens fazem com que mtodos sejam executados, sendo que o mapeamento de mensagens para mtodos
determinado pelo objeto recebedor. Os mtodos so as unidades de cdigo em Smalltalk, equivalente a funes ou
procedimentos em outras linguagens.
Todo objeto uma instncia de alguma classe. 12 uma instncia da classe SmallInteger. 'abc' uma instncia da
classe String. A classe determina o comportamento e os dados de suas instncias.
Toda classe tem uma classe me, exceto a classe Object. A classe me define os dados e comportamento que so
herdados por suas classes filhas. A classe me chamada de superclasse e suas filhas, subclasses.
Exemplos de cdigo
Hello world
Transcript show: 'Hello, world!!!'
Nmero Perfeito
Integer extend [

"Traduzido da verso em C"
isPerfectC [ |tot| tot := 1.
(2 to: (self sqrt) + 1) do: [ :i |
(self rem: i) = 0
ifTrue: [ |q|
tot := tot + i.
q := self // i.
q > i ifTrue: [ tot := tot + q ]
]
].
^ tot = self
]

"Outra maneira"
isPerfect [
^ ( ( ( 2 to: self // 2 + 1) select: [ :a | (self rem: a) = 0 ] )
inject: 1 into: [ :a :b | a + b ] ) = self
]
].
Smalltalk
147
Classes
Object subclass: #MessagePublisher
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Smalltalk Examples'
Mtodos
publish
Transcript show: 'Hello, world!'
Invocao
MessagePublisher new publish
Ligaes externas
Smalltalk.org
[1]
Advocacy site.
GoodStart
[2]
Advocacy site.
Open Directory: Smalltalk
[3]
The Early History of Smalltalk
[4]
by Alan C. Kay.
Smalltalk-72 Instruction Manual
[5]
Free Smalltalk Books Online
[6]
Smalltalk information visualization tool
[7]
Squeak
[8]
(Smalltalk de cdigo aberto)
Tutorial de Smalltalk
[9]
Referncias
[1] http:/ / www. smalltalk. org/
[2] http:/ / www. goodstart.com/
[3] http:/ / dmoz. org/ Computers/ Programming/ Languages/ Smalltalk/
[4] http:/ / gagne.homedns. org/ %7etgagne/ contrib/ EarlyHistoryST. html
[5] http:/ / www. bitsavers. org/ pdf/ xerox/ alto/ Smalltalk72_Manual. pdf
[6] http:/ / www. iam. unibe.ch/ ~ducasse/ FreeBooks.html
[7] http:/ / www. softcentral. com/ informationspace/
[8] http:/ / www. squeak.org
[9] http:/ / www. inf. ufsc. br/ poo/ smalltalk/ ibm/
Prolog
148
Prolog
Prolog
Paradigma lgico, declarativo
Surgido em 1972
Criado por Alain Colmerauer e Robert Kowalski
Compiladores GNU Prolog, Quintus, SICStus, SWI-Prolog, YAP
Dialetos: ISO Prolog, Edinburgh Prolog
Influenciou Mercury, Oz
Prolog uma linguagem de programao que se enquadra no paradigma de Programao em Lgica Matemtica.
uma linguagem de uso geral que especialmente associada com a inteligncia artificial e lingustica computacional.
Consiste numa linguagem puramente lgica, que pode ser chamada de Prolog puro, e numa linguagem concreta, a
qual acrescenta o Prolog puro com componentes extra-lgicos.
O uso Prolog puro foi originalmente restrito em provas do teorema da resoluo com Clusulas de Horn do formato
H :- B
1
, , B
n
..
A aplicao do provador de teoremas trata estas clusulas como procedimentos
para mostrar/resolver H, mostrar/resolver B
1
and and B
n
.
O Prolog puro foi ento estendido para incluir a negao por falha, na qual condies negativas da forma not(B
i
) so
mostradas por tentativa e falha para resolver as condies positivas correspondentes B
i
).
O nome Prolog para a linguagem concreta foi escolhido por Philippe Roussel como uma abreviao de
PROgrammation en LOGique. Foi criada em meados de 1972 por Alain Colmerauer e Philippe Roussel, baseados
no conceito de Robert Kowalski da interpretao procedimental das clusulas de Horn. A motivao para isso veio
em parte da vontade de reconciliar o uso da lgica como uma linguagem declarativa de representao do
conhecimento com a representao procedimental do conhecimento, que era popular na Amrica do Norte no final
da dcada de 1960 para incio de 1970.
Muito do desenvolvimento moderno do Prolog veio dos projetos de computadores da quinta gerao (FGCS), que
desenvolveu uma variante do Prolog chamada Kernel Language para seu primeiro sistema operacional.
Apesar do longo tempo de desenvolvimento, Prolog ainda no uma linguagem portvel, j que cada implementao
usa rotinas completamente diferentes e incompatveis entre si. Por exemplo, um programa trivial que faz um loop de
ler uma linha da console e escreve a mesma linha, terminando quando for entrada uma linha vazia, impossvel de
ser escrito de forma que qualquer interpretador consiga rodar.
Histria
A linguagem de programao Prolog nasceu de um projeto que no tinha por foco a implementao de uma
linguagem de programao, mas o processamento de linguagens naturais. Na Universidade de Marselha, Alain
Colmerauer e Robert Pasero trabalhavam na parte de linguagem natural e Jean Trudel e Philippe Roussel
trabalhavam na parte de deduo do projeto. Interessado pelo mtodo de resoluo SL, Trudel persuadiu um dos seus
inventores, Robert Kowalski, que se uniu ao projeto. O projeto resultou em uma verso preliminar da linguagem
Prolog em fins de 1971 sendo que a verso definitiva apareceu em fins de 1972.
Prolog
149
Caractersticas
O Prolog uma linguagem declarativa, significando que em vez de o programa estipular a maneira de chegar
soluo, passo a passo, (como nas linguagens procedimentais ou imperativas), limita-se a fornecer uma descrio do
problema que se pretende computar. Usa uma coleo base de dados de fatos e de relaes lgicas (regras) que
exprimem o domnio relacional do problema a resolver.
Um programa pode rodar num modo interativo, a partir de consultas (queries) formuladas pelo usurio, usando a
base de dados (os 'fatos') e as regras relacionais (essencialmente implicaes lgicas: se.. ento), e o mecanismo de
unificao para produzir (por uma cadeia de dedues lgicas) a soluo.
O Prolog baseado num subconjunto do clculo de predicados de primeira ordem, o que definido por clusulas de
Horn. A execuo de um programa em Prolog efetivamente a prova de um teorema por resoluo de primeira
ordem. Alguns conceitos fundamentais so unificao, recurso, e backtracking.
Tipos de dados
Prolog no emprega tipos de dados do mesmo modo que as linguagens de programao mais comuns normalmente
fazem. Todos os dados so tratados como sendo de um nico tipo, Termo, cuja natureza depende da forma como
esse termo foi declarado. Ou seja, os elementos lxicos utilizados na sua declarao determinam se esse termo ser
um nmero, um texto, uma varivel, uma estrutura complexa e assim por diante.
Escopo dos identificadores
Com exceo de tomos numricos, funes ou predicados construdos, os nomes em Prolog para constantes,
variveis, funes e predicados, no tm nenhum significado intrnseco e podem ser escolhidos livremente pelo
programador. Em geral, duas notaes distintas denotaro ou sero objetos distintos. Como em qualquer linguagem
de programao, a cada nome deve ser dado um escopo.
Em Prolog, as regras de escopo so:
O escopo de uma varivel a assero (fato, regra, ou consulta) na qual aparece.
O escopo de qualquer outro nome (constante, nome de funo, ou nome de predicado) todo o programa.
Isto significa que um nome de varivel pode ser utilizado e reutilizado a vontade no programa para denotar variveis
diferentes, enquanto qualquer outra notao representa, ou , o mesmo objeto para o programa todo.
tomos
As constantes de texto so introduzidas por meio de tomos. Um tomo uma sequncia constituda de letras,
nmeros e underscore, mas iniciando com uma letra minscula. Se um tomo no alfanumrico necessrio, pode-se
usar qualquer sequncia entre aspas simples (ex: 'um tomo contendo espaos').
Um tomo pode ser definido das seguintes maneiras:
comeando com letra minscula:
pedro henrique_iv
como uma sequncia de caracteres entre aspas simples:
'quem voc?' 'eu no sei'.
Prolog
150
Nmeros
Um nmero uma sequncia de dgitos, permitindo tambm os sinais de . (para nmeros reais), - (nmero negativo)
e e (notao cientfica). Algumas implementaes do Prolog no fazem distino entre inteiros e nmeros reais.
exemplos:
321 3.21
Variveis
Variveis so declaradas da mesma forma que tomos, porm iniciando com uma letra maiscula ou underscore. No
ambiente Prolog uma varivel no um continer cujo valor pode ser atribudo (como ocorre nas linguagens
imperativas). Seu comportamento mais prximo de um padro, que incrementalmente especificado pela
unificao. Em outras palavras, uma varivel Prolog como uma incgnita, cujo valor desconhecido a princpio
mas, aps descoberto, no sofre mais mudanas.
Um tipo especial de varivel, a varivel annima (explicada mais adiante), uma expresso que significa 'qualquer
varivel', e escrita como um nico subtrao (_).
exemplos:
X Nome Rei_da_Espanha
Termos compostos
Termos compostos so a nica forma de se expressar estruturas de dados complexas em Prolog. Um termo composto
consiste de uma cabea, tambm chamada funtor (que obrigatoriamente um tomo) e parmetros (de quaisquer
tipos) listados entre parnteses e separados por vrgulas.
O nmero de parmetros, chamado aridade do termo, significativo. Um termo identificado por sua cabea e
aridade, normalmente escrita como funtor/aridade. tomos e nmeros tambm podem ser identificados dessa forma,
como um termo de aridade zero (ex: um_atomo/0).
Listas
Uma lista no um tipo de dados parte, mas sim definida por uma construo recursiva (usando o termo '.'/2):
1. 1. o tomo [] uma lista vazia;
2. se T uma lista e H um elemento, ento o termo '.'(H, T) uma lista.
O primeiro elemento, chamado cabea, H, que seguida pelo contedo do restante da lista, T, tambm chamado de
cauda. A lista [1, 2, 3] seria representada internamente como '.'(1, '.'(2, '.'(3, []))). Um atalho sinttico [H | T], que
mais usado para construir regras. Uma lista pode ser processada como um todo processando o primeiro elemento, e
em seguida o restante da lista, de forma recursiva.
Para convenincia do programador, as listas podem ser construdas e destrudas de vrias formas.
Enumerando os elementos: [abc, 1, f(X), Y, g(A,rst)]
Precedendo-a com um elemento: [abc | L1]
Precedendo-a com mltiplos elementos: [abc, 1, f(X) | L2]
Expandindo o termo: '.'(abc, '.'(1, '.'(f(X), '.'(Y, '.'(g(A,rst), [])))))
O predicado append
Prolog
151
Strings
Strings so normalmente escritas como uma sequncia de caracteres entre aspas. comum serem representadas
internamente como listas de cdigos de caracteres, em geral utilizando a codificao local ou Unicode, se o sistema
d suporte a Unicode. O ISO Prolog tambm permite que strings sejam representadas por uma lista de tomos com
um nico caractere.
Fatos
Programar em Prolog bem diferente de programar em uma linguagem procedimental. Em Prolog se fornece fatos e
regras para uma base de dados; ento se executam consultas ou (queries) a essa base de dados. A unidade bsica do
Prolog o predicado, que postulado verdadeiro. Um predicado consiste de uma cabea e um nmero de
argumentos. Por exemplo:
gato(tom).
Isso informa base de dados o fato que 'tom' um 'gato'. Formalmente, 'gato' a cabea e 'tom' o nico argumento
do predicado. Alguns exemplos de consultas que podem ser feitas ao interpretador Prolog baseado nesse fato:
tom um gato?
?- gato(tom).
yes.
que coisas (conhecidas) so gatos?
?- gato(X).
X = tom;
yes.
Predicados so normalmente definidos para expressar algum fato sobre o mundo que o programa deve conhecer. Na
maioria dos casos, o uso de predicados requer uma certa conveno. Por exemplo, qual das duas verses abaixo
significaria que Jos o pai de Ana?
pai(ana,jose).
pai(jose,ana).
Em ambos os casos 'pai' a cabea e 'ana' e 'jose' so argumentos. Entretanto, no primeiro caso Ana vem primeiro na
lista de argumentos, e no segundo, quem vem primeiro Jos (a ordem nos argumentos importante). O primeiro
caso um exemplo de definio na ordem Verbo Sujeito Objeto, e o segundo, na ordem Verbo Objeto Sujeito.
Como Prolog no entende portugus, ambas as verses esto corretas de acordo com seu escopo; no entanto uma
boa prtica de programao escolher uma nica conveno para ser usada no mesmo programa, para evitar escrever
algo como
pai(jose,ana).
pai(maria,joao).
Alguns predicados so pre-definidos na prpria linguagem, permitindo que os programas Prolog desempenhem
atividades rotineiras (como entrada/sada, uso de grficos e outros tipos de comunicao com o sistema operacional).
Por exemplo, o predicado write pode ser usado para sada na tela. Ento,
write('Ol').
vai exibir a palavra 'Ol' na tela.
Prolog
152
Regras
O segundo tipo de predicado no Prolog a regra, tambm chamada de "clusula". Um exemplo de uma regra :
luz(acesa) :- interruptor(ligado).
O ":-" significa "se"; essa regra significa que luz(acesa) verdadeiro se interruptor(ligado) verdadeiro. Regras
podem tambm fazer uso de variveis, como por exemplo,
avo(X,Z) :- pai(X,Y), pai(Y,Z).
(X av de Z se X pai de Y e Y pai de Z)
Isso significa "se algum pai de outra pessoa, que por sua vez pai de uma terceira, ento ele av". O antecedente
e o consequente esto na ordem inversa do que normalmente encontrado na notao da lgica: o consequente
escrito primeiro e chamado a cabea da regra, o antecedente chamado corpo. A conjuno (e) escrita como ",",
enquanto a disjuno (ou) escrita como ";". Tambm possvel colocar mltiplos predicados em um mesmo corpo,
unindo seus antecedentes por disjuno, como por exemplo:
a :- b;c;d.
que equivalente s trs regras separadas:
a :- b.
a :- c.
a :- d.
No entanto no so permitidas regras como:
a;b :- c.
Ou seja, "se c ento a ou b". Isso devido restrio s clusulas de Horn.
Uma maneira de simular tal regra, usando o operador de negao, :
a:-c,not(b).
Regras Recursivas
Regras recursivas devem ser permitidas a fim de tornar a linguagem til para muitas aplicaes. Um predicado
definido por uma regra recursiva deve necessariamente ter, no mnimo uma definio no recursiva. Se isto no
acontecer, a definio logicamente mal-formada e o programa ficaria em lao infinito. Um exemplo de regra
recursiva seria a definio de uma base de dados sobre relaes familiares que responda questes sobre
ancestralidade. Isto pode ser definido da seguinte forma:
ancestral(X,Y) :- me(X,Y).
ancestral(X,Y) :- pai(X,Y).
ancestral(X,Y) :- me(X,Z),ancestral(Z,Y).
ancestral(X,Y) :- pai(X,Z),ancestral(Z,Y).
Alm disso, necessrio tomar cuidado com a ordem na qual unificaes(ver Unificao em Prolog) so procurados
para objetivos. Se invertermos a ordem nas regras recursivas do predicado ancestral, isto
ancestral(X,Y) :- ancestral(Z,Y),me(X,Z).
ancestral(X,Y) :- ancestral(Z,Y),pai(X,Z).
a consulta resultar uma recurso infinita.
Prolog
153
Recurso em cauda
Uma funo pode ser definida por recurso em cauda da seguinte maneira:
f(x): se c(x) ento g(x) seno f(h(x))
onde: - algum tipo de condio sobre o valor de ; - so funes definidas com um
argumento no definido na funo .
A mesma sentena pode ser escrita em Prolog desta forma:
f(X, Z) :- c(X), g(X, Z).
f(X, Z) :- h(X, Y), f(Y, Z).
Recurso em cauda importante e prefervel sobre recurso no cauda pois pode ser implementada como uma
iterao que computada usando uma pilha esttica.
Recurso no em cauda
Recurso no em cauda pode ser definida pela sentena
f(x): se c(x) ento g(x) seno k(x, f(h(x)))
Isto significa que o valor da chamada de recurso modificado aps sua computao. Em Prolog, esta funo pode
ser implementada assim:
f(X, Y) :- c(X), g(X, Y).
f(X, Y) :- h(X, X1), f(X1, Y1), k(X, Y1, Y).
Recurso em no cauda usa um espao linear na pilha, consequentemente evitado caso no seja necessrio. Em
alguns casos possvel otimizar a implementao. Considere o esquema:
f(n): se n = 0 ento a seno k(n, f(n - 1))
Isto pode ser escrito em Prolog usando recurso no em cauda:
f(0, a).
f(X, Y) :- X1 is X - 1, f(X1, Y1), k(X, Y1, Y).
Este cdigo requer espao linear na pilha para guardar resultados temporrios de chamadas recursivas. Usando um
acumulador, o cdigo abaixo pode ser escrito usando recurso em cauda:
f(X, Y) :- f(X, 1, a, Y).
f(X, M, ACC, ACC) :- M > N.
f(X, M, ACC, Y) :- M <= N, k(M, ACC, ACC1), M1 is M + 1, f(N, M1, ACC1, Y)
Avaliao
Quando o interpretador recebe uma consulta, ele tenta encontrar predicados que se encaixam na consulta, sejam eles
fatos diretos ou regras que possuem o termo consultado como concluso. Por exemplo:
irmaos(X,Y) :- filho(X,Z), filho(Y,Z).
que em Lgica de Primeira ordem : X Y Z((filho(X,Z)^filho(Y,Z)) irmaos(X,Y))
filho(X,Y) :- pai(Y,X).
filho(X,Y) :- mae(Y,X).
mae(marcia, ana).
pai(tomas, ana).
Prolog
154
pai(tomas, erica).
pai(marcos, tomas).
De acordo com essa base, a seguinte consulta avaliada como verdadeira:
?- irmaos(ana, erica).
yes.
O interpretador chega a esse resultado utilizando a regra irmaos(X,Y), unificando ana com X e erica com Y. Isso
significa que a consulta pode ser expandida para filho(ana,Z), filho(erica,Z). A resoluo dessa conjuno feita
procurando-se todos os pais possveis para ana. Entretanto, filho(ana,marcia) no leva a uma soluo vivel, porque
se Z for substitudo por marcia, filho(erica,marcia) deveria ser verdadeiro, e nenhum fato que afirma (ou alguma
regra que pode satisfazer) isso est presente. Ento, em vez disso Z sustitudo por tomas, descobrindo-se que erica
e ana so irmos de qualquer forma. O cdigo
filho(X,Y) :- pai(Y,X).
pode parecer suspeito. Afinal, no s pais tem filhos. No entanto esse cdigo significa, na verdade, que todo pai tem
filhos (da mesma forma que a regra seguinte significa que toda me tem filhos). Para descobrir se algum pai,
pode-se usar o cdigo
?- pai(X,_).
ou
pai(X) :- pai(X,_).
que simplesmente no se importa com quem o filho (o underscore uma varivel annima).
Negao
Tipicamente, uma consulta avaliada como falsa no caso de no estar presente nenhuma regra positiva ou fato que
d suporte ao termo proposto. Isso chamado hiptese do mundo fechado; assume-se que tudo o que importante
saber est na base de dados, de modo que no existe um mundo exterior que pode possuir evidncias desconhecidas.
Em outras palavras, se um fato no conhecido ser verdadeiro (ou falso), assume-se que ele falso.
Uma regra como
legal(X) :- \+ ilegal(X).
pode ser avaliada somente pela busca exaustiva de todas as coisas que so ilegais e comparando elas com X, e se
nenhum fato ilegal for descoberto ser o mesmo que X, X legal. Isso chamado negao por falha. O operador
prefixo \+/1 (muitos dialetos do Prolog possuem pr-definido o comando not/1) usado acima implementa a negao
por falha em compiladores ISO Prolog.
Operadores de Controle
Backtracking
Backtracking um procedimento dentro da linguagem Prolog. Uma busca inicial em um programa nesta linguagem
segue o padro Busca em profundidade (depth-first search), ou seja, a rvore percorrida sistematicamente de cima
para baixo e da esquerda para direita. Quando essa pesquisa falha, ou encontrado um n terminal da rvore, entra
em funcionamento o mecanismo de backtracking. Esse procedimento faz com que o sistema retorne pelo mesmo
caminho percorrido com a finalidade de encontrar solues alternativas.
Exemplo:
Prolog
155
Considerando uma base de dados famlia, fazemos a seguinte consulta:
?- pai(roberto,X), mae(vera,X)
O compilador tenta satisfazer o primeiro objetivo. Quando conseguir, tenta satisfazer o segundo. Caso no consiga,
ele retorna ao ponto onde encontrou a soluo para o primeiro objetivo (backtracking).
Comando Cut
O comando cut permite indicar ao Prolog quais sub-objetivos j satisfeitos no necessitam ser reconsiderados ao se
realizar um backtracking. Isto , ele aborta o processo de backtracking. O uso do comando cut importante porque
permite que o programa rode mais rpido, sem perder tempo com sub-objetivos que no contribuem para determinar
a resposta do objetivo principal. Alm disso, o programa ocupar menos memria, pois no ser necessrio
armazenar todos os sub-objetivos considerados (pontos do backtracking). Em alguns casos, o cut evita que o
programa entre em lao infinito.
cabea :- objetivo<sub>1</sub>, ..., objetivo<sub>n</sub>, !, objetivo<sub>n+1</sub>, ..., objetivo<sub>n+m</sub>
Exemplo (o cdigo abaixo faz a consulta ao banco e para na primeira ocorrncia de filho do sexo masculino):
primogenito(X,Y) :- pai(Y,X), masculino(X), !
Algumas das principais aplicaes do cut so as seguintes:
Unificao de padres, de forma que quando um padro encontrado os outros padres poss-veis so descartados
Na implementao da negao como regra de falha
Para eliminar da rvore de pesquisa solues alternativas quando uma s suficiente
Para encerrar a pesquisa quando a continuao iria conduzir a uma pesquisa infinita, etc.
Sintaticamente o uso do cut em uma clusula tem a aparncia de um objetivo sem nenhum argumento, representado
por um ponto de exclamao "!".
Comando Fail
Inversamente ao comando cut, o predicado pr-definido fail sempre falha. O operador de corte pode ser combinado
com o predicado fail para produzir uma falha forada. Uma conjuno de objetivos da forma
cabea :- objetivo<sub>1</sub>, ..., objetivo<sub>n</sub>, !, fail.
usada para informar ao PROLOG: se a execuo chegou at esse ponto, ento pode abandonar a tentativa de
satisfazer a regra. A conjuno falha devido ao fail, e o objetivo-pai falha devido ao corte.
Exemplo (Ana gosta de mamferos exceto de gatos):
mamifero(X) :- gato(X).
mamifero(X) :- cachorro(X).
mamifero(X) :- rato(X).
gato(tom).
rato(jerry).
cachorro(spike).

gosta(ana,X) :- gato(X),!,fail.
gosta(ana,X) :- mamifero(X).
Prolog
156
%consultas
%gosta(ana,tom). % false
%gosta(ana,jerry). % true.
%gosta(ana,X). % false - resultado inadequado
Execuo
Prolog uma linguagem de programao lgica, portanto em teoria o programador no deveria ter de se preocupar
com o modo como ela executa. Entretanto, s vezes prudente levar em conta como o algoritmo de inferncia
funciona, para evitar que o programa Prolog execute por um tempo denecessariamente longo (ou mesmo infinito).
Por exemplo, pode-se escrever um cdigo para contar o nmero de elementos em uma lista.
elems([],0).
elems([H|T], X) :- elems(T, Y), X is Y + 1.
Isso simplesmente diz: Se a lista est vazia, o nmero de elementos zero. Se a lista no vazia, ento X um a
mais que Y, que por sua vez o nmero de elementos no restante da lista, excludo-se seu primeiro elemento.
Nesse caso, existe uma distino clara entre os casos no antecedente das regras. Mas no caso a seguir, onde se decide
por continuar ou no jogando em um cassino:
jogar(X) :- temdinheiro(X).
jogar(X) :- temcredito(X), \+ temdinheiro(X).
Se voc tem dinheiro, voc continua jogando. Se voc perdeu todo o dinheiro, voc precisa pegar emprestado, ou
ento no possvel jogar mais. temdinheiro(X) pode ser uma funo muito custosa - por exemplo, ela pode acessar
sua conta de banco na internet para verificar seu saldo, o que leva tempo. Entretanto, o mesmo pode-se dizer de
temcredito(X).
Em teoria, as implementaes Prolog poderiam avaliar essas regras fora de ordem, de modo que elas poderiam ser
escritas como:
jogar(X) :- temcredito(X), \+ temdinheiro(X).
jogar(X) :- temdinheiro(X).
Isso est correto, porque as duas opes se excluem mutuamente. Entretanto, verificar se voc precisa de um
emprstimo no necessrio se voc j sabe que tem dinheiro. Ento, na prtica, implementaes Prolog vo
verificar a primeira regra primeiro (de fato, a maioria delas vai sempre tentar as regras na ordem em que esto
presentes na base). Pode-se usar o operador de corte para informar ao interpretador para no testar a segunda opo
se a primeira suficiente. Por exemplo:
jogar(X) :- temdinheiro(X),!.
jogar(X) :- temcredito(X), \+ temdinheiro(X).
Isso chamado um operador de corte verde. O ! simplesmente informa ao interpretador para parar de buscar por
alternativas. Mas deve-se notar que se voc precisa de um emprstimo ser necessrio verificar a segunda regra, e
isso ser feito. Verificando o temdinheiro na segunda regra desnecessrio, j que conhecido o fato de que voc
no tem, ou a segunda regra no seria sequer avaliada. Ento pode-se modificar o cdigo para
jogar(X) :- temdinheiro(X),!.
jogar(X) :- temcredito(X).
Isso chamado um operador de corte vermelho, porque arriscado fazer isso. O programa agora depende da
colocao correta do operador de corte e da ordem das regras para determinar seu significado lgico. Acidentes de
Prolog
157
recorta-e-cola por exemplo so comuns e difceis de detectar. Se as regras forem misturadas, voc pode terminar
estourando seu carto de crdito antes de gastar seu dinheiro.
DCGs e parsing
Existe uma notao especial chamada gramtica de clusulas definidas (definite clause grammar - DCGs). Uma
regra definida via -->/2 em vez de :-/2 expandida pelo pr-processador (expand_term/2, uma facilidade anloga s
macros em outras linguagens) de acordo com algumas regras de reescrita, resultando em clusulas Prolog ordinrias.
DCGs so usadas para escrever parsers e geradores de listas, e tambm provm uma interface conveniente para
operaes sobre diferenas de listas.
Exemplos de cdigo
Seguem alguns exemplos de programas escritos em ISO-Prolog.
Quicksort
split(H, [A|X], [A|Y], Z) :-
order(A, H), split(H, X, Y, Z).
split(H, [A|X], Y, [A|Z]) :-
not(order(A, H)), split(H, X, Y, Z).
split(_, [], [], []).
quicksort([], X, X).
quicksort([H|T], S, X) :-
split(H, T, A, B),
quicksort(A, S, [H|Y]),
quicksort(B, Y, X).
Torres de Hanoi
hanoi(N) :- move(N, left, center, right).
move(0, _, _, _) :- !.
move(N, A, B, C) :-
M is N-1,
move(M, A, C, B), inform(A, B), move(M, C, B, A).
inform(X, Y) :-
write('move a disc from the '),write(X), write(' pole to the '),
write(Y), write(' pole'),
nl.
Mergesort
split([], K, [], []).
split(XS, K, [], XS) :-
K < 1.
split([X|XS], K, [X|YS], ZS) :-
K >= 1,
P is K -1,
split(XS, P, YS, ZS).
merge1([], [], []).
Prolog
158
merge1(XS, [], XS).
merge1([], YS, YS).
merge1([X|XS], [Y|YS], [X|ZS]) :-
X =< Y,
merge1(XS, [Y|YS], ZS).
merge1([X|XS], [Y|YS], [Y|ZS]) :-
Y < X,
merge1([X|XS], YS, ZS).
mergesort([], []).
mergesort([X], [X]).
mergesort([X, Y], [X, Y]) :-
X =< Y, !.
mergesort([X, Y], [Y, X]) :-
X > Y, !.
mergesort(XS, ZS) :-
length(XS, L),
L > 0,
K is L / 2,
split(XS, K, XS1, XS2),
mergesort(XS1, YS1),
mergesort(XS2, YS2),
merge1(YS1, YS2, ZS), !.
Implementaes
LPA Prolog (http:/ / www. lpa. co. uk/
[1]
)
Open Prolog (http:/ / www. cs. tcd. ie/ open-prolog/
[2]
)
Ciao Prolog (http:/ / www. clip. dia. fi. upm. es/ Software/ Ciao
[3]
)
GNU Prolog (http:/ / www. gprolog. org
[4]
)
YAP Prolog (http:/ / www. ncc. up. pt/ ~vsc/ Yap
[5]
)
SWI Prolog (http:/ / www. swi-prolog. org
[6]
)
Strawberry Prolog (http:/ / www. dobrev. com/
[7]
)
SICStus Prolog (http:/ / www. sics. se/ sicstus/
[8]
)
Amzi! Prolog (http:/ / www. amzi. com/
[9]
)
B-Prolog (http:/ / www. probp. com/
[10]
)
tuProlog (http:/ / tuprolog. sourceforge. net/
[11]
) - Cdigo Aberto integrvel ao Java
XSB (http:/ / xsb. sourceforge. net/
[12]
)
Trinc Prolog (http:/ / www. trinc-prolog. com
[13]
)
hProlog ( http:/ / www. cs. kuleuven. ac. be/ ~bmd/ hProlog/ )
ilProlog ( http:/ / www. pharmadm. com/ dmax. asp )
CxProlog ( http:/ / ctp. di. fct. unl. pt/ ~amd/ cxprolog/ )
NanoProlog ( http:/ / ctp. di. fct. unl. pt/ ~amd/ cxprolog/ )
Visual Prolog ( http:/ / visual-prolog. com/ )
Jekejeke Prolog ( http:/ / www. jekejeke. ch/ )
Prolog
159
Extenses
Visual Prolog (http:/ / www. visual-prolog. com/ ), tambm conhecido como PDC Prolog e Turbo Prolog. Visual
Prolog um dialeto de Prolog fortemente tipado que consideravelmente diferente do Prolog padro. Foi
desenvolvido e divulgado como Turbo Prolog enquanto sob controle da Borland, mas hoje desenvolvido pela
empresa Danish PDC (Prolog Development Center) que foi quem o criou.
Referncias
Runnable examples
[14]
A Prolog interpreter in a Java applet
[15]
Prolog: The ISO standard
[16]
Fundamental Prolog Tutorial
[17]
Prolog Tutorial
[18]
Visual Prolog Tutorial
[17]
Visual Prolog Examples
[19]
Prolog Development Center
[20]
Alain Colmerauer's and Philippe Roussel's account of the birth of Prolog
[21]
BEBREGAL, Benjamn Callejas; ACIOLY, Benedito Melo. Lgica para Cincia da Computao, verso
preliminar 2006.
Sterling, Leon; Shapiro, Ehud. The Art of Prolog: Advanced Programming Techniques. Cambridge:The MIT
Press, 1986.437 p. ISBN 0-262-19250-0
[1] http:/ / www. lpa. co.uk/
[2] http:/ / www. cs. tcd. ie/ open-prolog/
[3] http:/ / www. clip. dia. fi.upm. es/ Software/ Ciao
[4] http:/ / www. gprolog. org
[5] http:/ / www. ncc.up.pt/ ~vsc/ Yap
[6] http:/ / www. swi-prolog. org
[7] http:/ / www. dobrev.com/
[8] http:/ / www. sics. se/ sicstus/
[9] http:/ / www. amzi. com/
[10] http:/ / www.probp. com/
[11] http:/ / tuprolog. sourceforge. net/
[12] http:/ / xsb. sourceforge. net/
[13] http:/ / www.trinc-prolog. com
[14] http:/ / www.csse. monash. edu. au/ ~lloyd/ tildeLogic/ Prolog. toy/ Examples/
[15] http:/ / ktiml. mff. cuni.cz/ ~bartak/ prolog/ testing. html
[16] http:/ / pauillac. inria.fr/ ~deransar/ prolog/ docs. html
[17] http:/ / www.visual-prolog. com/ vip6/ tutorial/
[18] http:/ / cs. wwc. edu/ ~cs_dept/ KU/ PR/ Prolog.html
[19] http:/ / www.visual-prolog. com/ vip6/ community/ examples. htm
[20] http:/ / www.pdc. dk
[21] http:/ / www.lim.univ-mrs. fr/ ~colmer/ ArchivesPublications/ HistoireProlog/ 19november92. pdf
Scheme
160
Scheme
Scheme
Paradigma Multiparadigma: funcional e procedural
Surgido em 1975
ltima verso R6RS (2007)
Criado por Gerald Jay Sussman e Guy L. Steele, Jr.
Estilo de tipagem: dinmica, forte
Compiladores MIT/GNU Scheme, Chez Scheme, SCM, GNU Guile, Ypsilon, PLT Scheme
Dialetos: T
Influenciada por ALGOL, Lisp, MDL
Influenciou Common Lisp, EuLisp, JavaScript, R, Ruby, Dylan, Lua, Hop, Racket
Pgina oficial
www.scheme-reports.org
[1]
Scheme uma linguagem de programao multiparadigma que suporta programao funcional e procedural. Foi
criada por Guy L. Steele e Gerald Jay Sussman no outono de 1975, a partir da linguagem Lisp com o intuito de
estudar a teoria dos atores de Carl Hewitt. O modelo de Hewitt era orientado a objeto (e influenciado pelo
Smalltalk). Os objetos eram chamados atores e as mensagens eram tambm atores. Sussman e Steele tiveram algum
problema no entender algumas das conseqncias do modelo a partir dos artigos de Hewitt e decidiram construir
uma implementao de brinquedo de uma linguagem de atores visando experiment-la. Escreveram um pequeno
interpretador Lisp e adicionaram os mecanismos necessrios para a criao de atores e envio de mensagens. Existem
dois padres que definem a linguagem Scheme: o padro oficial IEEE e um padro popular chamado "Revised
n
Report on the Algorithmic Language Scheme", abreviado como RnRS, onde n o nmero de revises.
Caractersticas
Scheme adota uma filosofia minimalista, assim sendo, prov o mnimo de noes possveis, e, na prtica, qualquer
outra noo pode ser adicionada via bibliotecas, como todos os dialetos do Lisp, possui pouca sintaxe comparado
maioria das outras linguagens. Devido sua sintaxe completamete aninhada, no existem regras de precedncia de
operadores e sua notao parentizada usada para todas as chamadas de funo, desta forma no h ambigidades
como as que so encontradas nas linguagens de notao infixa. Porm em procedimentos que existam muitos fatores
a serem abordados, o programa pode ficar visualmente confuso e necessita ser analisado com mais cuidado.
Exemplos:
(5+3) seria assim: (+ 5 3)
(5+3)*2 seria assim: (* (+ 5 3) 2)
(8/2) seria assim: (/ 8 2)
Exemplo de um procedimento composto:
Scheme
161
((lambda (x) (+ x x)) (* 3 4))
neste caso:
3*4 = 12;
x = 12;
x + x = 12 + 12 = 24;
Algumas notaes da Linguagem
. + -: so usados em nmeros e podem ocorrer em qualquer lugar, exceto como primeiro caracter
(): parenteses so utilizados para agrupar e listas de dados
,: sozinho, utilizado para indicar dados literais
`: serve para indicar quase todos dados constantes
": delimitador de strings
#t #f: constantes boleanas
#\: serve para introduzir um caracter constante
#e #i #o #d #x: utilizados na notao de nmeros
Exemplos de cdigo em Scheme
Programa Ol Mundo
(define ola-mundo
(lambda ()
(display "Ol, Mundo!")
(newline)))
(ola-mundo)
ou, simplesmente:
(display "Ol, Mundo!")
Condicionais
(if (teste) (consequencia) (alternativa)) syntax
(if (teste) (consequencia)) syntax
Syntax: (Teste), (consequencia), e (alternativa) podem ser expresses arbitrrias.
Semantica: uma expresso if validada da sequinte forma: primeiro (teste) avaliado, se for verdadeiro, ento
(consequencia) avaliado e seu valor retornado. Caso contrrio (alternativa) avaliado e seu valor retornado. Se
o teste no possui (alternativa) especificado, ento o resultado da expresso no especificado.
(if (> 3 2) 'yes 'no) --> yes
(if (> 2 3) 'yes 'no) --> no
(if (> 3 2)
(- 3 2)
(+ 3 2)) --> 1
Scheme
162
Recursividade
Clculo do fatorial de um nmero:
(define (fatorial n)
(cond ((= n 0) 1)
(else (* n (fatorial (- n 1))))))
(fatorial 5)
;; => 120
Nmeros Perfeitos
Exemplo de programa que mostra os n primeiros nmeros perfeitos:
(define inverteListax
(lambda (lista1 lista2)
(if (null? lista1) lista2
(inverteListax (cdr lista1) (cons (car lista1) lista2)))))

(define inverteLista
(lambda (lista)
(inverteListax lista '())))

(define (perf n)
(let loop ((i 1)
(sum 0))
(cond ((= i n)
(= sum n))
(
(= 0 (modulo n i))
(loop (+ i 1) (+ sum i)))
(else
(loop (+ i 1) sum)))))

(define aux
(lambda (x n l)
(if (= x 0) l
(if (perf n) (aux (- x 1) (+ n 1) (cons n l))
(aux x (+ n 1) l)))))

(define main
(lambda (x)
(aux x 1 '())))

(define perfeitos
(lambda (n)
(inverteLista (main n))))
Scheme
163
Compiladores
Alguns compiladores de Scheme:
Bigloo
Chez Scheme
Chicken
Gambit
Gauche
Guile
Ikarus
JScheme
Kawa
Larceny
MIT/GNU Scheme
[2]
Mosh
[3]
PLT Scheme
[4]
Pvts
RScheme
Scheme 48
SCM
SISC
Stalin
STk
STklos
TinyScheme
Ypsilon
[5]
[1] http:/ / www. scheme-reports.org/
[2] http:/ / www. gnu. org/ software/ mit-scheme/
[3] http:/ / code. google. com/ p/ mosh-scheme/
[4] http:/ / www. plt-scheme. org/
[5] http:/ / code. google. com/ p/ ypsilon/
Bibliografia
DYBVIG, R. Kent. The Scheme Programming Language: Ansi Scheme. New Jersey:Prentice Hall PTR, 1996.
ISBN 0-13-454646-6
ABELSON, Harold; SUSSMAN, Gerald Jay; SUSSMAN Julie. Structure and Interpretation of Computer
Programs. New York:McGraw-Hill, 1996. ISBN 0-07-000484-6
Ligaes externas
Pgina oficial (http:/ / www. scheme-reports. org/ ) (em ingls)
Schemers (http:/ / www. schemers. org) (em ingls) Uma pgina de referncia da linguagem
TimeLine (http:/ / embed. verite. co/ timeline/
?source=0AiKv3gqIhXVbdGM2X3c1OEY1MXhfTUJ0TVFiSmFwV0E& font=Bevan-PotanoSans&
maptype=toner& lang=en& height=650)
ML
164
ML
ML
Paradigma programao funcional, programao imperativa
Surgido em 1973
Criado por Robin Milner e outros na Universidade de Edimburgo
Estilo de tipagem: esttica, forte
Dialetos: Standard ML, OCaml, F#
Influenciada por ISWIM
Influenciou Haskell, Cyclone, Nemerle
ML uma linguagem de programao funcional de proposta geral desenvolvida por Robin Milner e outros no final
dos anos 1970 na Universidade de Edimburgo, cuja sintaxe foi inspirada pelo ISWIM. considerada uma linguagem
funcional impura, por permitir a programao imperativa, ao contrrio de outras linguagens funcionais como
Haskell.
Histria
Standard ML foi criada por pesquisadores da LFCS (Laboratory for Foundations of Computer Science) na dcada de
1980. Em 1987, Robin Milner e LFCS ganharam o Prmio BCS Award for Technical Excellence por trabalhar no
Standard ML.
ML foi originalmente concebida como uma metalinguagem para o sistema de prova de teorema de Edimburgo LCF,
mas evoluiu para uma linguagem de propsito geral de sucesso. Esta linguagem foi padronizada em 1990 e revista
em 1997 como Standard ML 97.
Caractersticas
ML conhecida como uma linguagem funcional e impura, por permitir efeitos colaterais e, por esta razo tambm
considerada uma linguagem de programao multi-paradigma.
As caractersticas do ML so incluir chamada-a-valor avaliao e estratgia, em primeira classe funes de
gerenciamento automtico de memria atravs de coleta seletiva de lixo, polimorfismo paramtrico, tipagem
esttica, tipo inferncia, tipos de dados algbricos, correspondncia padro, exceo e manuseio.
Hoje existem vrios idiomas no ML famlia; os dois principais dialetos so Standard ML e Caml, mas existem outros
que influenciaram muitas outras lnguas, como Haskell, Cyclone, e Nemerle.
Os pontos fortes da ML so aplicados principalmente em lngua e manipulao (compiladores, analisadores,
provadores de teoremas), mas uma linguagem de aplicao geral tambm utilizado em bioinformtica, sistemas
financeiros, e aplicativos, incluindo um banco de dados genealgicos, um clienteP2P / programa servidor, etc..
ML
165
Exemplos de cdigo
Ol Mundo
O Programa Ol Mundo de linguagens funcionais tipicamente a funo Fatorial, como expressado abaixo em ML:
fun fac : (int -> int) 0 = 1
| fac n = n * fac (n-1);
O fatorial foi definido como uma funo recursiva, com uma nica condio de parada, assemelhando-se as
descries dessa funo em livros de Matemtica. Parte da primeira linha opcional, e descreve os tipos da funo.
Outros exemplos de funes
fun quadrado(x:real) = x*x;
fun reverso(L) =
if L = nil then nil
else reverso(tl(L)) @ [hd(L)];
(* mximo entre 3 reais - note que ML deduz que b e c so reais mesmo
sem declarao *)
fun maior3(a:real,b,c) =
if a>b then
if a>c then a
else c
else
if b>c then b
else c;
Bibliografia
ULLMAN, Jeffrey D.. Elements of ML Programming: ML97 Edition. Englewood Cliffs, New Jersey,
EUA:Prentice Hall, 1998.383 p. ISBN 0-13-790387-1
Ligaes externas
Laboratory for Foundations of Computer Science
[1]
(em ingls)
Moscow ML, uma implementao popular de ML
[2]
(em ingls)
Standard ML de New Jersey, outra popular implementao
[3]
(em ingls)
F#, uma implementao de ML utilizando o Microsoft .NET
[4]
(em ingls)
MLton, compilador ML com otimizadores
[5]
(em ingls)
ML
166
Referncias
[1] http:/ / www. lfcs.inf. ed. ac. uk/
[2] http:/ / www. dina. kvl. dk/ ~sestoft/ mosml.html
[3] http:/ / smlnj. sf. net/
[4] http:/ / research.microsoft. com/ projects/ ilx/ fsharp.aspx
[5] http:/ / mlton. org/
AWK
AWK
AWK tem a mesma pronncia de Auk, uma espcie de pssaro.
Paradigma Linguagem de script, procedural, orientada a eventos
Surgido em 1977
ltima verso
IEEE Std 1003.1-2004
[1]
(POSIX) / 1985
Criado por Alfred Aho, Peter Weinberger, and Brian Kernighan
Estilo de tipagem: Esttica e Fraca
Influenciada por C, SNOBOL4, Bourne shell
Influenciou Tcl, AMPL, Perl, Korn Shell (ksh93, dtksh, tksh), Lua
A linguagem de programao AWK foi criada em 1977 pelos cientistas Alfred Aho, Peter J. Weinberger e Brian
Kernighan no laboratrio Bell Labs. A palavra AWK uma abreviatura das iniciais dos sobrenomes dos criadores da
linguagem (Aho, Weinberger e Kernighan).
A linguagem interpretada linha por linha e tem como principal objetivo deixar os scripts de Shell no Unix/Linux
mais poderosos e com muito mais recursos sem utilizar muitas linhas de comando (podendo resolver infinidades de
problemas do dia-a-dia do desenvolvedor nesses sistemas operacionais). Ela muito utilizada para processar dados
com textos e manipulaes com arquivos.
Utilizada frequentemente pelos desenvolvedores para processar textos e manipular arquivos e fora que ela baseada
nos comandos de C/C++. Tem como os paradigmas Linguagem de script, procedural e orientada a eventos.
Esta linguagem considerada por muitos um importante marco para histria da programao, tendo tido bastante
influncia na criao de outras linguagens de programao, como, por exemplo, Perl e Lua.
AWK
167
Variantes do AWK
BWK: conhecido tambm como AWK ou NAWK se refere verso por Brian Kernighan . Ele foi apelidado de
"Um AWK True" por causa do uso do termo em associao com o livro que originalmente descrita a linguagem e
o fato de Kernighan ter sido um dos autores originais do AWK. Esta verso usada por exemplo nos sistemas
operativos FreeBSD, NetBSD, OpenBSD e OS X .
GAWK: (GNU AWK) outra implementao do software livre (open source) e da implementao nico que faz
grandes progressos implementao de internacionalizao e localizao e redes TCP/IP. Ele foi escrito antes da
implementao original se ter tornado livre. Ela inclui o seu prprio depurador, e seu perfil permite ao usurio
fazer melhorias de desempenho medidos para um script, e tambm permite que o usurio para estender a
funcionalidade atravs de bibliotecas compartilhadas. As distribuies Linux so em sua maioria de software
GNU, e assim eles incluem GAWK. FreeBSD antes da verso 5.0 tambm incluiu GAWK verso 3.0, mas as
verses posteriores do FreeBSD uso BWK para evitar a mais restritiva GNU General Public License licena
(GPL), bem como por suas caractersticas tcnicas.
MAWK: uma verso muito mais rpida implementao AWK por Mike Brennan com base em um cdigo de
bytes intrprete.
LIBAWK: um fork (comando para criar threads de um processo) do MAWK, permitindo que os aplicativos para
incorporar vrias instncias paralelas de intrpretes AWK.
AWKA: outro tradutor de scripts AWK em cdigo C. Quando compilado, estaticamente incluindo libawka.a do
autor, os executveis resultantes so consideravelmente acelerado e, de acordo com testes do autor, comparam
muito bem com outras verses do AWK, Perl , ou Tcl . Pequenos scripts vo se transformar em programas de
160-170 Kb.
TAWK: (Thompson AWK) um AWK compilador para Solaris , DOS , OS / 2 e do Windows , anteriormente
vendido por Thompson software de automao
JAWK: um projeto para implementar AWK em Java , hospedado no SourceForge, extenses linguagem so
adicionados para fornecer acesso a recursos do Java dentro de scripts AWK (ou seja, os encadeamentos Java,
soquetes, Colees, etc.)
XGAWK: um projeto baseado em SourceForge GAWK. Ela se estende GAWK com bibliotecas carregadas
dinamicamente.
QSEAWK: uma implementao intrprete incorporado AWK includos na biblioteca QSE que proporciona a
incorporao de interface de programao de aplicao (API) para C e C + + .
BusyBox: inclui um pouco documentada implementao AWK que parece ser completo, escrito por Dmitry
Zakharov. Esta uma implementao muito pequeno adequado para sistemas embarcados.
Variveis da Linguagem
Na Linguagem AWK so muitos utilizados argumentos j pre-definidos do sistema operacional (iremos utilizar
linux). Criamos a tabela abaixo que ficar mais fcil de entender os prximos exemplos.
-rw-r--r-- 1 Usuario root 7022 Jul 20 2011 Cygwin.ico
-rwxr-xr-x 1 Usuario root 57 Jul 20 2011 Cygwin.bat
drwxr-xr-x+ 1 Usuario root 0 Jul 21 2011 opt
$1 $2 $3 $4 $5 $6 $7 $8 $9
#$0 = Imprime toda a linha dependendo do modo que use
AWK
168
Exemplos de cdigo
Sintaxe
#Sintaxe da utilizao do AWK simples
awk <padrao-acao> [arquivo_1] [arquivo_2]... [arquivo_n]
Exemplo 1
#Exemplo abaixo ele imprime todos os clientes do arquivo lista_clientes (dentro do ambiente Unix/Linux)
bash-4.1$ awk '{print $0}' lista_clientes
Claudia Maria Salvador 555-6666
Eduardo Silva Campinas 222-3333
Juliano Mendes Manaus 333-2222
Luiz Carlos Curitiba 777-9999
Mario Sergio Florianopolis 888-7777
Maria Julia Salvador 666-8888
Exemplo 2
#Neste caso ele imprime somente o primeiro nome do cliente e o seu telefone referenciado
bash-4.1$ awk '{print $1,$4}' lista_clientes
Claudia 555-6666
Eduardo 222-3333
Juliano 333-2222
Luiz 777-9999
Mario 888-7777
Maria 666-8888
Exemplo 3
# No comando ele imprime toda linha que tiver a letra M
bash-4.1$ awk '/M/ {print}' lista_clientes
Claudia Maria Salvador 555-6666
Juliano Mendes Manaus 333-2222
Mario Sergio Florianopolis 888-7777
Maria Julia Salvador 666-8888
Exemplo 4
#AWK sendo utilizado em conjunto com o comando Unix ls ltr retornando os nomes dos arquivos do argumento $9
bash-4.1$ ls -ltr | awk '{print $9}'
Cygwin.ico
Cygwin.bat
opt
usr
AWK
169
sbin
home
lib
var
srv
dev
etc
Documentos_Linux
bin
tmp
proc
cygdrive
Exemplo 5
# AWK sendo utilizado em conjunto com o comando Unix ls ltr e o comando if/else retornando os nomes dos diretrios/arquivos
# com a ultima modificao em 2011. Lembrando que ele pode ser utilizado em conjunto com qualquer
# comando em unix, por exemplo os comandos: cat, more, ls e entre outros.
bash-4.1$ ls -ltr | awk '{if ($8 == "2011") print ($0)}'
-rw-r--r-- 1 Usuario root 7022 Jul 20 2011 Cygwin.ico
-rwxr-xr-x 1 Usuario root 57 Jul 20 2011 Cygwin.bat
drwxr-xr-x+ 1 Usuario root 0 Jul 21 2011 opt
drwxr-xr-x+ 1 Usuario root 0 Jul 21 2011 usr
drwxr-xr-x+ 1 Usuario root 0 Jul 21 2011 sbin
drwxrwxrwt+ 1 Usuario root 0 Jul 21 2011 home
drwxr-xr-x+ 1 Usuario root 0 Jul 21 2011 lib
drwxr-xr-x+ 1 Usuario root 0 Jul 21 2011 var
drwxr-xr-x+ 1 Usuario None 0 Jul 21 2011 srv
drwxr-xr-x+ 1 Usuario None 0 Jul 21 2011 dev
drwxrwxr-x+ 1 Usuario root 0 Jul 21 2011 etc
drwxrwxrw-+ 1 Usuario None 0 Jul 21 2011 Documentos_Linux
Exemplo 6
# O script inicializar a varivel i com 1 e o comando while, enquanto o valor de i for menor ou
# igual ao nmero de campos da linha atual, ir imprimir
# (print) cada campo em uma linha diferente, acrescentando 1 a i aps a
# impresso (print).
./camposcar.awk
awk { i = 1 while ( i <= NF ) { print $ i ++ } } carros
[1] http:/ / www. opengroup. org/ onlinepubs/ 000095399/ utilities/ awk. html
http:/ / people. cs. uu. nl/ piet/ docs/ nawk/ nawk_toc. html
http:/ / www. zago. eti. br/ script/ awk. html
http:/ / cvsserver. cnptia. embrapa. br/ files/ doc103_10_0. pdf
http:/ / www. vivaolinux. com. br/ artigo/ AWK-Introducao
http:/ / awk. freeshell. org/
AWK
170
http:/ / www. staff. science. uu. nl/ ~oostr102/ docs/ nawk/ nawk_2. html
http:/ / www. lpic. com. br/ shell/ comandos/ awk/ print/ print. pdf
http:/ / www. staff. science. uu. nl/ ~oostr102/ docs/ nawk/ nawkA4. pdf
Bibliografia
AHO, Alfred V.; KERNIGAN, Brian K.; WEINBERGER, Peter J.. The AWK Programming Language. Reading,
Massachusetts, EUA:Addison-Wesley, 1988.210 p. ISBN 0-201-07981-X
DOUGHERTY, Dale; ROBBINS, Arnold. Sed & Awk. Beijing:OReilly, 1997.407 p. ISBN 1-56592-225-5
Ligaes externas
TIMELINE = http:/ / embed. verite. co/ timeline/
?source=0Av7hMDYM3qWOdFpzZ3FYSWNqT0duU25idVM3VGpZMnc& font=Bevan-PotanoSans&
maptype=toner& lang=en& height=650
171
Os anos 80 e a orientao a objeto
Ada
Ada uma Linguagem de programao estruturada, de tipagem esttica, uma linguagem imperativa, orientada a
objetos e uma linguagem de alto nvel, originada de Pascal , Simula e outras linguagens. Foi originalmente
produzida por uma equipe liderada por Jean Ichbiah da CII Honeywell Bull, contratados pelo Departamento de
Defesa dos Estados Unidos durante a dcada de 70, com o intuito de substituir as centenas de linguagem de
programao usadas pelo DoD. Ada uma aplicao com compiladores validados para uso confivel em misses
criticas, tais como softwares de aviao. Normatizada internacionalmente pela ISO, sua verso mais atual de 2005.
O nome Ada vem de Ada Lovelace, a mulher conhecida por ter escrito o primeiro algoritmo para ser processado por
uma mquina na histria da computao.
Introduo
No ano de 1974, o Departamento de Defesa dos Estados Unidos, criou um grupo para por em ordem a situao em
que o DoD (Departament of Defense) se encontrava. Eles utilizavam por volta de 450 linguagens ou dialetos de
programao e no possuam uma linguagem adequada para sistemas embutidos.
Formou-se ento o Grupo de Trabalho de Linguagens de Alta Ordem (HOLWG, sigla em ingls). O resultado
principal desse grupo foi que em 1979, a empresa francesa CII Honeywell Bull foi a campe de uma disputa entre 17
empresas para o desenvolvimento de uma nova linguagem de programao, pois a idia de adotar uma j existente
havia sido descartada.
E tentando realizar um sonho de uma linguagem universal, reunindo vrios personagens desde a sua gestao at a
sua publicao, aps diversas propostas de desenvolvimento, vrias revises de especificaes, em 1982, em
homenagem a Condessa Ada Lovelace, que pode ser considerada a dama dos computadores pela sua contribuio a
computao, surgiu Ada, uma linguagem de programao patrocinada pelo Departamento de Defesa dos EUA, que
teve uma base de Cobol e Basic e que anos mais tarde serviria de base para o Ruby.
No ano de 1982, foi publicado seu primeiro padro ISO (Ada 83), que ficou conhecido como Manual de Referncia
Ada. No ano de 1995, houve a primeira reviso da linguagem (Ada 95) e em 2006 foi liberada a mais nova verso
(Ada 2005), que incluiu conceitos usados na linguagem Java e algumas bibliotecas do C++. A prxima reviso deve
ser liberada em meados de 2012 (atualmente chamada pela comunidade como Ada 2012). A linguagem foi tambm,
a primeira linguagem de programao orientada a objetos padronizada internacionalmente.
Por motivo de esclarecimento, a grafia correta para a linguagem a terminao Ada e no ADA como est referida
em alguns lugares, pois se refere homenageada Ada Lovelace.
Ada
172
Ada Lovelace
Estrutura Bsica
A estrutura bsica de um programa escrito em Ada a seguinte:
--Declaracoes de bibliotecas
Procedure nome_do_programa is
--Declaracoes de variaveis
begin
--Corpo do programa com as instrucoes e calculos
end nome_do_programa;
Todo e qualquer comentrio iniciado com dois traos seguidos -- e terminam no fim da linha.
Exemplos prticos de programas escritos em Ada
A partir de agora sero exemplificados alguns cdigos de programas escritos usando Ada 95 e o compilador
Ada+SQL Development Environment 3.0.
Programa Ol Mundo!
No exemplo abaixo, temos um cdigo bsico de um programa escrito em Ada, usando a biblioteca Text_IO, que
fornece procedimentos de entrada e sada para trabalhar com textos.
--Programa Alo Mundo
With Ada.Text_IO; Use Ada.Text_IO;
Procedure AloMundo is
begin
Put("Programao em Ada!");
New_Line;
Put_Line("Exemplo do Ol Mundo!!");
end AloMundo;
No cdigo acima, o comando Put_Line, imprime na tela toda a expresso que est entre aspas dentro dos parnteses,
seguido de uma quebra de linha no final da expresso. No caso de querer implementar uma nova linha para identar
melhor a sada, pode se fazer o uso do comando New_Line;. Esse comando realiza uma quebra de linha na sada do
Ada
173
texto na tela.
A linha do cdigo de sada poderia ser escrita da seguinte maneira, no sendo necessrio ento o uso da expresso
Use Ada.Text_IO;:
Ada.Text_IO.Put_Line("Programao em Ada!");
Uma sugesto ter cuidado ao usar a clausula USE, pois em programas complexos ou grandes, podemos ficar sem
saber de que biblioteca vem o comando ou procedimento usado.
Usando Variveis
A declarao de variveis em Ada feita da seguinte forma:
varivel : tipo de varivel;
Para fazer a declaraes de variveis globais, ou seja, que valem para o programa todo, deve-se declar-las entre o
nome do procedimento e o begin. Para usarmos variveis, devemos saber usar os comandos de entrada e sada. O
comando de entrada padro do Ada o Get, assim como o comando de sada padro o Put, esses comandos esto
dentro da biblioteca Text_IO. Vamos a um exemplo prtico:
With text_IO; Use text_IO;
With Ada.Integer_Text_IO; Use Ada.Integer_Text_IO;
Procedure uso_variaveis is
n: natural;
idade : integer;
nome: string(1..100);
begin
New_Line(3);
Put("Digite o seu nome. (Ate 100 caracteres): ");
Get_Line(nome,n);
New_Line;
Put("Digite sua idade: ");
Get(idade);
New_Line;
Put_Line("Voce disse que: ");
Put(" * Seu nome e': ");
Put_Line(nome(1..n));
Put(" * Sua idade e': ");
Put(idade);
Put(" anos.");
New_Line(4);
end uso_variaveis;
Ada
174
O Comando If
Para o uso de condies, a estrutura bsica a seguinte:
if condicao then
sequencia de comandos (executada se a condio verdadeira)
else
outra sequencia de comandos (executada se a condio falsa)
end if;
Vamos a um exemplo prtico, onde tambm ser usado o comando elsif:
With text_IO; Use text_IO;
With Ada.Integer_Text_IO; Use Ada.Integer_Text_IO;
Procedure usando_if is
x, y : integer;
begin
New_Line(3);
Put("Digite o primeiro valor: ");
Get(x);
Put("Digite o segundo valor: ");
Get(y);
New_Line;
if x>y then
Put_Line("O Primeiro valor digitado e' maior!");
elseif x<y then
Put_Line("O Segundo valor digitado e' maior!");
else
Put_line("Os dois valores so iguais.");
end if;
New_Line(3);
end usando_if;
Os comandos For, While e Loop
No exemplo abaixo, temos um cdigo que faz o uso dos trs comandos.
With text_IO; Use text_IO;
With Ada.Integer_Text_IO; Use Ada.Integer_Text_IO;
Procedure usando_for_while_loop is
a: natural;
begin
New_Line(3);
for a in 1..3 loop
Put_Line("Usando o Comando For em Ada.");
end loop;
New_Line(3);
a := 1;
Ada
175
while a /=5 loop
Put_Line("Usando o Comando While em Ada.");
a := a + 1;
end loop;
New_Line(3);
a := 1;
loop
Put_Line("Usando o Comando Loop em Ada.");
exit when a=5;
a := a + 1;
end loop;
New_Line(3);
end usando_for_while_loop;
Exemplo de tabuada
Com os comandos apresentados acima, j possvel escrever alguns pequenos programas, como por exemplo, um
cdigo que imprime na tela do console a tabuada do 1 ao 10. Veja abaixo o cdigo:
With Ada.Text_IO; Use Ada.Text_IO;
With Ada.Integer_Text_IO; Use Ada.Integer_Text_IO;
Procedure Tabuada is
A, B: Integer;
begin
for A in 1 .. 10 loop
New_Line(2);
Put(" Tabuada do ");
Put(A);
New_Line;
New_Line;
for B in 1 .. 10 loop
Put(A);
Put(" X");
Put(B);
Put(" =");
Put(A*B);
New_Line;
end loop;
New_Line;
end loop;
New_Line(2);
end Tabuada;
Ada
176
Ligaes externas
The Lovelace Tutorial Tutorial de Ada 95. (http:/ / www. adahome. com/ Tutorials/ Lovelace/ lovelace. htm) (em
ingls)
Libre Site onde pode ser encontrado um compilador Ada para diversas plataformas (http:/ / libre. adacore. com)
(em ingls)
Ada Programming Wikibook (http:/ / en. wikibooks. org/ wiki/ Ada_Programming) (em ingls)
Jean Ichbiah (http:/ / en. wikipedia. org/ wiki/ Jean_Ichbiah) (em ingls)
Groupe Bull (http:/ / en. wikipedia. org/ wiki/ Groupe_Bull) (em ingls)
Erlang
Erlang
Paradigma multi-paradigma: concorrente e funcional
Surgido em 1986
ltima verso R17.0 (9 de abril de 2014)
Criado por Ericsson
Estilo de tipagem: dinmica, forte
Influenciada por Prolog, ML
Influenciou F#, Clojure, Rust, Scala, Opa, Reia
Licena: MPL modificada
Pgina oficial
http:/ / www. erlang. org
[1]
LYME baseia Erlang e fornece uma alternativa para LAMP
Erlang uma linguagem de programao de
uso geral e um sistema para execuo. Foi
desenvolvida pela Ericsson para suportar
aplicaes distribudas e tolerantes a falhas a
serem executadas em um ambiente de tempo
real e ininterrupto. Ela suporta nativamente
hot swapping, de forma que o cdigo pode
ser modificado sem a parada do sistema.
Originalmente era uma linguagem
proprietria da Ericsson, mas foi lanada em
cdigo aberto em 1998.
A implementao da Ericsson executa um
cdigo interpretado em uma mquina virtual, mas tambm inclui um compilador para cdigo nativo (ainda que no
suportado para todas as plataformas).
Criar e gerenciar processos uma tarefa trivial em Erlang; de forma geral, threads so consideradas complicadas e
fontes de muitos erros de programao em linguagens. A comunicao entre processos feita por troca de
mensagens ao invs de variveis compartilhadas, o que remove a necessidade mecanismos explcitos de excluso
Erlang
177
mtua.
Histrico
O nome "Erlang", atribudo a Bjarne Dcker, foi compreendido tanto como uma referncia ao matemtico e
engenheiro Agner Krarup Erlang e tambm como uma abreviao de "Ericsson Language"
[2]
.
Erlang foi desenvolvido com o objetivo de melhorar o desenvolvimento de aplicaes de telefonia. A verso inicial
foi implementada em Prolog e foi influenciada pela linguagem de programao PLEX usada em centrais da Ericsson.
De acordo com Armstrong, a linguagem saiu do laboratrio para aplicaes reais aps descontinuarem a central
AXE, chamada AXE-N em 1995. Como resultado, Erlang foi escolhido para o prximo modelo chamado AXD.
Em 1998, a Ericsson anunciou a central AXD301 contendo mais de um milho de linhas de cdigo de Erlang, com
relatos de atingir confiablidade superior a nove "9"s. Logo a seguir o Erlang foi banido na Ericsson Radio System
para novos produtos devido a uma preferncia pelo uso de linguagens no proprietrias. A Ericsson voltou atrs mais
tarde e Armstrong foi re-admitido em 2004.
Em 2006, o suporte a multiprocessamento simtrico foi adicionado na mquina virtual e no runtime.
Estruturas de dados
A linguagem Erlang possui oito tipos de dados primitivos
Inteiros: Inteiros so escritos como sequncias de dgitos decimais, por exemplo, 12, 12375 e -23427 so inteiros.
A aritmtica de inteiros exata e de preciso arbitrria, limitada apenas pela memria disponvel ao programa.
tomos: tomos so usados nos programas para denotar valores distintos. So escritos como sequncias de
caracteres alfanumricos, sendo o primeiro uma letra minscula. tomos podem conter qualquer caractere se
forem fechados entre apstrofos.
Ponto flutuante: Nmeros de ponto flutuante na representao IEEE 754 em 64 bits.
Referncias: Referncias so smbolos globalmente nicos cuja nica propriedade a comparao para igualdade.
So criadas avaliando a primitiva make_ref().
Binrios: Um binrio uma sequncia de bytes. Binrios proveem um meio que utiliza o espao de maneira
eficaz para armazenar dados binrios. H primitivas em Erlang para compor e decompor binrios bem como fazer
a entrada e sada deles.
Pids: Pid uma abreviatura de Process Identifier (identificador de processo). So criados pela primitiva
spawn(...). Pids so referncias para processos Erlang.
Portas: Portas so utilizadas para se comunicar com o mundo externo. So criadas pela sub-rotina open_port.
A comunicao realizada por mensagens enviadas e recebidas pelas portas segundo o protocolo de portas do
Erlang.
Funs: Funs so fechamento de funes. Funs so criadas por expresses da forma: fun(...) -> ... end.
H dois tipos de dados compostos:
Tuplas: Tuplas so recipientes para um nmero fixo de tipos de dados Erlang, descritas pela sintaxe {D1, D2,
... , Dn}, que denota uma tupla cujos argumentos so D1, D2, ... Dn. Os argumentos podem ser tipos
de dados primitivos ou compostos. Os elementos das tuplas podem ser acessados em tempo constante.
Listas: Listas so recipientes para um nmero varivel de tipos de dados Erlang. A sintaxe [Dh|Dt] denota
uma lista cujo primeiro elemento Dh, e os demais elementos so a lista Dt. O primeiro elemento da lista e
chamado head (cabea) da lista. O restante da lista quando sua head foi removida chamada tail (cauda) da lista.
H dois acares sintticos:
Strings: Strings so escritos como uma lista de caracteres fechados entre aspas, como acar sinttico para uma
lista de inteiros com o cdigo ASCII dos caracteres. Por exemplo, a string "gato" na verdade a lista [103,
97, 116, 111]. H suporte incompleto para strings Unicode.
Erlang
178
Records: Records (registros) fornecem um meio conveniente para associar um nome a cada elemento de uma
tupla. Isso permite se referir a um elemento de uma tupla por nome e no por posio. O pr-compilador substitui
a definio dos registros e o substitui com as referncias de tupla apropriadas.
Linguagem Funcional
Veja o cdigo abaixo:
-module(fact).
-export([fac/1]).

fac(0) -> 1;
fac(N) -> N * fac(N-1).
Abaixo est a implementao de um algoritmo Quicksort
%% quicksort:qsort(List)
%% Classificar uma lista de itens
-module(quicksort).
-export([qsort/1]).

qsort([]) -> [];
qsort([Pivot|Rest]) ->
qsort([X || X <- Rest, X < Pivot]) ++ [Pivot] ++ qsort([Y || Y <- Rest, Y >= Pivot]).
O exemplo acima invoca a funo recursiva qsort at que no reste nada a ser classificado. A expresso [X ||
X <- Rest, X < Pivot] uma lista de abrangncia, o que significa construir uma lista de elementos X tal
que X pertence ao Resto e X menor que Pivot.
Uma funo de comparao pode ser usada, no entanto, a ordem em que se baseia o retorno do cdigo Erlang
(verdadeiro ou falso) precisa ser alterada. Se, por exemplo, queremos uma lista ordenada onde a < 1 seja
verdadeiro (true).
O seguinte cdigo pode classificar listas de acordo com o tamanho:
-module(listsort).
-export([by_length/1]).

by_length(Lists) ->
qsort(Lists, fun(A,B) when is_list(A), is_list(B) -> length(A) < length(B) end).

qsort([], _)-> [];
qsort([Pivot|Rest], Smaller) ->
qsort([X || X <- Rest, Smaller(X,Pivot)], Smaller)
++ [Pivot] ++
qsort([Y ||Y <- Rest, not(Smaller(Y, Pivot))], Smaller).

Erlang
179
Distribuio e Linguagem Orientada a Concorrncia
A principal vantagem de Erlang suporte a concorrncia. Tem um pequeno, mas poderoso, conjunto de funes
primitivas para criar processos e fazer com que eles se comuniquem. Processos so o principal meio de criar uma
aplicao em Erlang.
Processos, como o sistema operacional (ao contrrio de Green threads e threads do sistema operacional), no so
compartilhadas entre si.
A sobrecarga mnima estimada para cada um de 300 palavras (4 bytes por palavra sobre plataformas 32-bit, 8 bytes
por palavra sobre plataformas 64-bit), e por isso muitas delas podem ser criadas sem degradar o desempenho (foi
possvel executar 20 milhes de processos).Erlang suporta processamento simtrico na verso R11B desde maio de
2006.
O processo de comunicao feito atravs de uma mensagem no-compartilhada em um sistema assncrono: cada
processo tem uma caixa postal, uma fila de mensagens enviadas por outros processos, que ainda no foram
consumidos.
Um processo utiliza um meio primitivo para recuperar mensagens que correspondam aos padres desejados.
Uma mensagem de rotina examina mensagens em cada turno, at que um deles seja correspondente. Quando a
mensagem consumida (retirada da caixa postal), o processo recomea sua execuo.Uma mensagem pode incluir
qualquer estrutura de Erlang, incluindo funes primitivas (inteiros, ponto flutuante, caracteres,tomos), tuplas, listas
e funes.
Exemplo de cdigo:
% cria um processo e chama a funo web:start_server(Port,
MaxConnections)
ServerProcess = spawn (web, start_server, [Port, MaxConnections]),

% cria um processo remoto e chama a funo web:start_server(Port,
MaxConnections) na mquina RemoteNode
RemoteProcess = spawn(RemoteNode, web, start_server, [Port,
MaxConnections]),

% envia para {pause, 10} a mensagem (uma tupla com o tomo "pause" e
um nmero "10") para ServerProcess (assincronamente)
ServerProcess ! {pause, 10},

% recebe as mensagens enviadas para este processo
receive
a_message -> do_something;
{data, DataContent} -> handle(DataContent);
{hello, Text} -> io:format("Ola tenho mensagem: ~s", [Text]);
{goodbye, Text} -> io:format("Tenho mensagem de sadae: ~s",
[Text])
end.
Tal como mostra o exemplo, existe um suporte de processos distribudos. Processos podem ser criados em nodos
remotos, e a comunicao com eles transparente (ou seja, a comunicao com os processos remotos feita
exatamente como a comunicao entre os processos locais).
Erlang
180
A Concorrncia suporta o mtodo primrio para tratamento de erro em Erlang. Quando um processo falha, ele
fechado e envia uma mensagem para o processo controlador tomar alguma deciso.
Esta forma de controle de erros pode aumentar a durabilidade e reduzir a complexidade do cdigo.
[1] http:/ / www. erlang. org
[2] Joe Armstrong, "History of Erlang", em HOPL III: Proceedings of the third ACM SIGPLAN conference on History of programming
languages, 2007, ISBN 978-1-59593-766-X
Ligaes externas
Stio do cdigo aberto de Erlang (http:/ / www. erlang. org/ )
Stio da Ericsson para Erlang (http:/ / www. erlang. se/ )
Breve histria sobre Erlang (http:/ / www. erlang. se/ publications/ bjarnelic. pdf)
Erlang Style Concurrency (http:/ / www. defmacro. org/ ramblings/ concurrency. html)
Modula
Modula uma linguagem de programao projetada e descrita por Niklaus Wirth, descontinuada. Sua sucessora
Modula-2.
C++
C++
Programa Ol Mundo, escrito em C++
Paradigma Abstrao de dados,
Orientao a objeto,
Programao genrica,
Programao procedural
Surgido em 1985
ltima verso ISO/IEC 14882:2011 (setembro de 2011)
Criado por Bjarne Stroustrup
Estilo de tipagem: Esttica, fraca ou forte, segura
Compiladores G++, MinGW, Microsoft Visual C++, Clang
Dialetos: ISO/IEC 14882:1998
ISO/IEC 14882:2003
ISO/IEC 14882:2011
Influenciada por Ada 83, ALGOL 68, C, CLU, ML, Simula
Influenciou Ada 95, C, D, Java, PHP, Squirrel
C++ (em portugus l-se "c mais mais", em ingls l-se see plus plus) uma linguagem de programao
multi-paradigma e de uso geral. A linguagem considerada de mdio nvel, pois combina caractersticas de
C++
181
linguagens de alto e baixo nveis. Desde os anos 1990 uma das linguagens comerciais mais populares, sendo
bastante usada tambm na academia por seu grande desempenho e base de utilizadores.
Bjarne Stroustrup desenvolveu o C++ (originalmente com o nome C with Classes, que significa C com classes em
portugus) em 1983 no Bell Labs como um adicional linguagem C. Novas caractersticas foram adicionadas com o
tempo, como funes virtuais, sobrecarga de operadores, herana mltipla, gabaritos e tratamento de excees. Aps
a padronizao ISO realizada em 1998 e a posterior reviso realizada em 2003, uma nova verso da especificao da
linguagem foi lanada em setembro de 2011, conhecida informalmente como C++11 ou C++0x.
Histria
A evoluo da linguagem
O C++ foi inicialmente desenvolvido por Bjarne Stroustrup dos Bell Labs, durante a dcada de 1980 com o objetivo
implementar uma verso distribuda do ncleo Unix. Como o Unix era escrito em C, dever-se-ia manter a
compatibilidade, ainda que adicionando novos recursos. Alguns dos desafios incluam simular a infraestrutura da
comunicao entre processos num sistema distribudo ou de memria compartilhada e escrever drivers para tal
sistema. Stroustrup percebeu que a linguagem Simula 67 possua caractersticas bastante teis para o
desenvolvimento de software, mas que era muito lenta para uso prtico. Por outro lado, a linguagem BCPL era
rpida, mas possua demasiado baixo nvel, dificultando sua utilizao no desenvolvimento de aplicaes. A partir de
sua experincia de doutorado, comeou a acrescentar elementos do Simula 67 no C, especialmente os recursos de
criao e manipulao de objetos. O C foi escolhido como base de desenvolvimento da nova linguagem pois possua
uma proposta de uso genrico, era rpido e tambm portvel para diversas plataformas. Algumas outras linguagens
que tambm serviram de inspirao para o cientista da computao foram ALGOL 68, Ada, CLU e ML.
Bjarne Stroustrup em 2007
Ainda em 1983 o nome da linguagem foi alterado de C with Classes para
C++. Antes implementada usando um pr-processador, a linguagem passou a
exigir um compilador prprio, escrito pelo prprio Stroustrup. Novas
caractersticas foram adicionadas, como funes virtuais, sobrecarga de
operadores e funes, referncias, constantes, gerenciamento manual de
memria, melhorias na verificao de tipo de dado e estilo de comentrio de
cdigo de uma linha (//). Em 1985 foi lanada a primeira edio do livro
The C++ Programming Language, contendo referncias para a utilizao da
linguagem, j que ainda no era uma norma oficial. A primeira verso
comercial foi lanada em outubro do mesmo ano. Em 1989 a segunda verso
foi lanada, contendo novas caractersticas como herana mltipla, classes
abstratas, mtodos estticos, mtodos constantes e membros protegidos,
incrementando o suporte a orientao a objeto. Em 1990 foi lanado o livro
The Annotated C++ Reference Manual, que tornou-se base para o futuro
padro. Outras adies na linguagem incluem gabaritos, tratamento de
excees, espao de nomes, converso segura de tipo de dado e o tipo
booleano.
Assim como a linguagem, sua biblioteca padro tambm sofreu melhorias ao
longo do tempo. Sua primeira adio foi a biblioteca de E/S, e posteriormente
a Standard Template Library (STL); ambas tornaram-se algumas das principais funcionalidades que distanciaram a
linguagem em relao a C. Criada primordialmente na HP por Alexander Stepanov no incio da dcada de 1990 para
explorar os potenciais da programao genrica, a STL foi apresentada a um comit unificado ANSI e ISO em 1993
convite de Andrew Koenig. Aps uma proposta formal na reunio do ano seguinte, a biblioteca recebe o aval do
comit.
C++
182
Depois de anos de trabalho, o mesmo comit ANSI/ISO padronizou o C++ em 1998 (ISO/IEC 14882:1998). Aps
alguns anos foram reportados defeitos e imprecises no documento, e uma correo foi lanada em 2003.
Por muito tempo, o C++ foi encarado como um superconjunto do C.
[1]
Entretanto, em 1999 o novo padro ISO para
a linguagem C tornou as duas linguagens ainda mais diferentes entre si. Devido a essas incompatibilidades, muitas
empresas que desenvolvem compiladores no oferecem suporte verso mais recente da linguagem C.
Pode-se dizer que C++ foi a nica linguagem entre tantas outras que obteve sucesso como uma sucessora
linguagem C, inclusive servindo de inspirao para outras linguagens como Java, a IDL de CORBA e C.
Etimologia
Durante sua fase inicial de desenvolvimento, a linguagem era chamada "novo C", "C84" ou ainda "C com classes". O
termo "C++" creditado a Rick Mascitti, e foi utilizado pela primeira vez em dezembro de 1983. Ele uma
referncia ao operador de incremento ++, significando um acrscimo (uma evoluo) linguagem C. Em tom
humorado, desenvolvedores software e especialistas em informtica no incio da dcada de 1990 costumavam
relacionar o ++ do nome grande insistncia dos programadores em utilizar o C++ da mesma forma que a
linguagem C, no usufruindo das novas facilidades que a linguagem poderia fornecer. Assim como o ++ estava
sendo aplicado de maneira ps-fixa letra C, a linguagem C++ era uma evoluo do C ps-fixada, que s
tornar-se-ia realidade em algum futuro remoto, no naquele momento.
Trabalhos futuros
A linguagem continua evoluindo de forma a fornecer novas funcionalidades. O grupo de desenvolvimento Boost.org
trabalha para evoluir a biblioteca padro, informando o comit oficial da linguagem quais facilidades possuem maior
retorno positivo dos usurios, seja por qualidade ou por utilidade, e quais ainda devem ser desenvolvidas. Tudo
indica que o C++ continuar com sua natureza multiparadigma. Por exemplo, o trabalho da Boost.org dedica-se a
acrescentar as qualidades da programao funcional e genrica. O padro C++ no define a implementao para a
definio de nomes e tratamento de excees, entre outras facilidades especficas, o que frequentemente torna
incompatveis cdigos objeto produzidos por diferentes compiladores. Apesar disso, existem padres perifricos
especficos para certas plataformas ou sistemas operacionais para padronizar compiladores dessas plataformas, como
por exemplo o C++ ABI.
[2]
As empresas de desenvolvimento de compiladores ainda se esforam para suportar inteiramente o padro,
especialmente na rea de gabaritos. Uma das disputas se refere palavra reservada export, que permite que a
definio de um gabarito seja separada de sua declarao. O primeiro compilador a implementar export foi o
Comeau C++ em 2003 (cinco anos aps o lanamento do padro), e no ano seguinte uma verso beta do Borland
C++ Builder X tambm suportava a facilidade. Interessante notar que ambos os compiladores so baseados na verso
EDG do C++. Muitos livros fornecem exemplos de cdigos para implementar export
[3]
que no so compilveis,
mas no h referncias para o problema mencionado. Outros compiladores como o Microsoft Visual C++ e o GCC
no suportam a facilidade. O secretrio do comit oficial do C++ Herb Sutter recomendou que a palavra fosse
removida de verses futuras do padro da linguagem, mas aps discusso a deciso final foi mant-la.
Outras disputas relativas a gabaritos se referem especializao parcial, que foi pouco suportada por muitos anos
depois que o C++ padro foi lanado.
Atualmente a linguagem tem uma nova especificao, conhecida por C++11 e publicada como 14882:2011.
C++
183
Caractersticas
Filosofia
No livro In The Design and Evolution of C++ (1994), Bjarne Stroustrup descreve algumas regras que ele utiliza para
desenvolver a linguagem, como exemplificado abaixo:
C++ desenvolvido para ser uma linguagem tipada estaticamente e de propsito geral que to eficiente e
porttil quanto o C.
C++ desenvolvido para suportar mltiplos paradigmas.
C++ desenvolvido para fornecer ao programador escolhas, mesmo que seja possvel ao programador escolher a
opo errada.
C++ desenvolvido para ser o mais compatvel com C possvel, fornecendo transies simples para cdigo C.
C++ evita fornecer facilidades que so especficas a certas plataformas ou a certos grupos de desenvolvedores.
C++ no exige overhead para facilidades que no so utilizadas.
C++ desenvolvido para ser utilizado mesmo sem um ambiente de desenvolvimento sofisticado.
Stanley B. Lippman documenta em seu livro Inside the C++ Object Model (1996) como compiladores convertem
cdigo de programas C++ em mapeamentos de memria. Lippman trabalhou implementando e mantendo o C-front,
a implementao original do C++ nos Bell Labs.
Stroustrup sempre desejou que o C++ fosse mantido como uma linguagem de especificao pequena, apesar de
presses externas para adies de novas funcionalidades na especificao da prpria linguagem ao invs da
codificao de novas bibliotecas para a biblioteca padro. Brian Kernighan notou que enquanto em C existe
geralmente uma maneira de resolver problemas, em C++ existem vrias. Na maioria das linguagens de programao,
um padro ou um conjunto bastante restrito de padres de projeto de software escolhido para o desenvolvimento.
Entretanto, isso no acontece em C++, pois a escolha delegada ao desenvolvedor. um conceito que prega que no
existe paradigma de programao ou padro de desenvolvimento que resolva todos os problemas, por isso a
pluralidade e generalidade de aplicaes para a linguagem. Tal filosofia assusta iniciantes e professores, que sentem
que a linguagem deveria ser de fcil aprendizado, algo que o C++ no .
Biblioteca padro
A biblioteca padro do C++ incorpora a biblioteca padro do C com algumas pequenas modificaes para trabalhar
melhor com as novas funcionalidades criadas pela linguagem. Outra grande parte da biblioteca composta pela
biblioteca padro de gabaritos (STL). Ela fornece ferramentas teis como containers (vetores, listas, entre outros),
algoritmos (filtragem de elementos de container, busca, ordenao, entre outros) e iteradores (ponteiros inteligentes
genricos para acessar tais containers e interlig-los aos algoritmos). Usando gabaritos possvel escrever
algoritmos genricos que funcionam para qualquer container ou sequncia definida por iteradores. Tendo em vista
que um iterador nada mais que um ponteiro encapsulado, possvel tambm utilizar os algoritmos genricos em
vetores C, utilizando-se ponteiros comuns para tal. Como em C, os mdulos da biblioteca so acessadas utilizando a
diretiva #include; ao todo so fornecidos 69 cabealhos-padro, dos quais 19 esto em depreciao.
Devido ao fato da biblioteca padro ter sido desenvolvida por especialistas e de j ter sido amplamente utilizada
comercialmente e academicamente, recomendado utilizar seus componentes ao invs de componentes prprios. Por
exemplo, utilizar std::vector e std::string ao invs de declarar vetores herdados do C no somente torna
o desenvolvimento mais simples, como tambm traz mais segurana e escalabilidade para o sistema.
A biblioteca STL foi originalmente desenvolvida pela HP e posteriormente pela SGI, antes de sua incorporao na
biblioteca padro do C++. O padro no a define como "STL", mas ainda utiliza-se esse termo para distingui-la do
resto da biblioteca. O projeto STLPort mantm uma implementao atualizada da biblioteca, e baseado na SGI
STL. O projeto Boost fornece elementos adicionais STL, dos quais alguns j so considerados a serem parte da
biblioteca padro no futuro.
C++
184
Operadores
Os operadores em C++ so um conjunto de todos os operadores do C mais novas adies linguagem. Um grupo de
novos operadores do C++ so os relativos converso de tipo de dado, e consistem em const_cast,
static_cast, dynamic_cast e reinterpret_cast. Eles so uma evoluo a converso de dados
utilizada em C, que limitava-se a oferecer um mtodo para converso tal qual static_cast. dynamic_cast
refere-se diretamente ao suporte de herana e polimorfismo oferecido pela linguagem, e est relacionado a outro
novo operador, typeid, que retorna informaes sobre o tipo de dado derivado pelo operando. Ambos os
operadores requerem a habilitao de RTTI para funcionar. Outro grupo de novos operadores so os relativos
alocao de memria, e consistem em new e delete. Assemelham-se s funes malloc e free
respectivamente, que esto presentes na biblioteca padro do C. Outro novo operador o de resoluo de mbito,
::, e que refere-se diretamente ao suporte de espao de nomes e orientao a objeto oferecido pela linguagem. Com
ele possvel declarar e acessar espaos de nomes, e tambm declarar classes e acessar objetos.
O C++ define que alguns dos operadores podem ser sobrecarregados, o que permite, assim como na sobrecarga de
funes, que diferentes tipos de dados sejam passados para um operador de forma a produzir diferentes resultados.
Essa tcnica tambm permite que classes definidas por utilizadores tambm possam usufruir de operadores prprios,
tornando possvel que uma classe Lista possa sobrecarregar o operador de apndice += para que diversos elementos
possam ser adicionados a lista, como elementos ou outras listas. Alguns operadores de classes definidas pelo
utilizador devem ser obrigatoriamente sobrecarregados (definidos) a fim de poderem ser utilizados pela STL. Por
exemplo, uma classe Funcionario deve fornecer o operador menor que (<) para ser utilizada pela funo de
ordenao (sort). De acordo com o padro atual da linguagem, este requerimento implcito durante a compilao:
caso a funo sort seja invocada para a um container da classe Funcionario e esta no define o operador <, h erro
de compilao. Para padres futuros planeja-se introduzir os "conceitos", que auxiliaram a programao genrica na
especificao dos requerimentos de um tipo de dado para que ele seja usado em uma funo. Por exemplo, os
iteradores passados para sort estaro associados ao conceito "tipo de dado comparvel", isto , um tipo de dado
que declara o operador <. Ao explicitar essa relao o cdigo se torna mais consistente, e o compilador auxiliado a
fim de retornar uma mensagem de erro mais adequada ao utilizador caso haja problemas durante a compilao.
Pr-processador
O C++ compilado em trs fases: pr-processamento, compilao propriamente dita (traduo para cdigo objeto) e
ligao. Durante a primeira fase, as diretivas de pr-processamento so aplicadas atravs de transformaes lxicas
no prprio cdigo fonte, que ento alimenta as prximas fases de compilao. Elas so identificadas no cdigo
atravs do caractere #. O pr-processamento utilizado para substituir partes de cdigo, para inutilizar partes de
cdigo e para importar mdulos externos.
Por exemplo, o cdigo #define PI 3.1415926535897932384626433 far com que sempre que PI
aparecer no cdigo, este ser substitudo por 3.1415926535897932384626433 e isso ocorre antes de comear
a compilar, como se o usurio tivesse digitado o valor de PI ao invs do texto PI. Outro uso do pr-processador
o que segue: #include <iostream> far com que seja includo (importado) todo o contedo da cabealho
iostream da biblioteca libc.
Gabaritos
Os gabaritos so diferentes de macros de programao (que tambm podem ser usadas em C++, um artifcio herdado
do C): enquanto ambas as facilidades podem ser utilizadas para produzir cdigo em tempo de compilao, gabaritos
no restringem-se substituies lxicas. Eles possuem conhecimento da semntica e do sistema de tipagem da
linguagem, e so utilizados principalmente para polimorfismo esttico (ver exemplo em anexo) e programao
genrica. Um gabarito tambm uma mquina de Turing completa.
C++
185
No campo de programao genrica, um tipo de dado parametrizado em C++ chamado uma classe gabarito. Ela
define atravs de parmetros como devem ser os tipos de dado internos utilizados ao instanciar o objeto. Dessa
maneira possvel codificar uma classe genrica arranjo, que ao ser instanciada pode tornar-se um arranjo de
nmeros inteiros ou um arranjo de carros de corrida (desde que carro de corrida esteja definido no mbito da
instancializao).
Objetos
O C++ introduziu alguns conceitos de orientao a objetos ao C, como exemplificado pelas classes, que apresentam
quatro caractersticas comumente presentes em linguagens de programao orientadas a objeto: abstrao,
encapsulamento, herana e polimorfismo. Cada vez que uma classe instanciada criado um objeto na memria,
que basicamente um conjunto de atributos e operaes reunidos.
Encapsulamento
O encapsulamento permite que os atributos de classes possam ser declarados como pblicos, privados ou protegidos.
Um atributo pblico (o menos restrito) pode ser acessado a partir de qualquer mtodo que tenha acesso ao objeto.
Um atributo privado (o mais restrito) s pode ser acessado por mtodos da prpria classe e por mtodos
explicitamente declarados como permitidos para tal (utilizando a palavra reservada friend). Atributos protegidos
s podem ser acessados por mtodos da mesma classe, por mtodos de classes herdadas e por mtodos
explicitamente declarados (utilizando a palavra reservada friend). considerado como uma boa prtica de
programao restringir ao mximo o acesso aos atributos, de forma a isolar detalhes de implementao de uma
classe, tornando pblicas somente as funes membro que realizam uma interface mnima da classe com outros
componentes.
O isolamento dos dados proposto pelo encapsulamento no infalvel, podendo ser contornado ao realizar operaes
de baixo nvel em objetos. Dessa maneira, um atributo privado pode ser acessado e modificado a partir de um
ponteiro para seu endereo de memria sem problemas, ainda que isso seja considerado uma m prtica de
programao. Tal caracterstica, herdada da linguagem C, reflexo direto da liberdade que o C++ fornece ao
desenvolvedor em relao a padres de projeto de software, cabendo a ele decidir qual o mais adequado para seu
algoritmo. O desenvolvedor tanto pode esquecer tal caracterstica, atendo-se somente a detalhes de especificao em
alto nvel, quanto adequar tais caractersticas em sua especificao de forma mais baixo nvel, visando desempenho
ou algum outro objetivo.
Herana
A herana de uma classe para com outra pode ser declarada como pblica, protegida ou privada. Isso determina o
quo relacionadas as classes sero entre si. Somente a herana pblica corresponde ao conceito usual de herana,
pois permite acesso total aos atributos da classe-base. Entretanto, pode-se tambm declarar heranas protegidas e
privadas, com caractersticas parecidas como as detalhadas anteriormente sobre encapsulamento. Essa
funcionalidade adicionou ao C++ a possibilidade de criao de classes abstratas, que no podem ser instanciadas,
mas que oferecem interfaces de funcionamento para suas respectivas classes herdadas. Ela um princpio bsico da
orientao a objeto para a reutilizao de cdigo, pois permite que classes (possivelmente escritas por outros
desenvolvedores e ento no modificveis) possam ser herdadas de forma a ser incrementadas em funcionalidade.
A herana mltipla uma das caractersticas do C++ mais controversas. Ela permite que uma classe possa ser
derivada de mais de uma classe base, o que pode resultar em um complicado grafo de herana e relacionamento entre
classes. Por exemplo, uma classe Gato voador pode ser derivada tanto das classes Gato quanto Mamfero voador. A
mistura de heranas reflete em uma mistura de espaos de nomes na classe herdada, o que pode ser resolvido atravs
da declarao local de espao de nomes, como explicado adiante.
C++
186
Polimorfismo
Polimorfismo a capacidade de usar um operador ou uma funo de diferentes maneiras, permitir fornecer diferentes
significados de acordo com o contexto. Uma vez que um aplicativo escrito utilizando o conceito de polimorfismo,
pode ser facilmente estendido, oferecendo novos objetos que estejam em conformidade com a interface original. No
necessrio recompilar programas originais, adicionando novos tipos. Apenas a re-vinculao necessria para
expor as novas mudanas juntamente com a antiga aplicao. Ele auxilia na reutilizao de cdigo e contribui para a
criao de aplicaes robustas. C++ suporta diversos tipos de polimorfismos, sejam estticos (resolvidos em tempo
de compilao de cdigo) ou dinmicos (resolvidos em tempo de execuo de cdigo).
Esttico
A sobrecarga de funes um polimorfismo esttico que permite que um programa possa declarar vrias funes
com o mesmo nome, diferenciando entre si pela quantidade de parmetros apresentados e por seus respectivos tipos
de dado. Assim, o mesmo nome de funo pode referir-se a diferentes funes dependendo do contexto em que ela
usada. O tipo retornado pela funo no utilizado para distinguir funes sobrecarregadas. A sobrecarga de
operadores tambm um polimorfismo esttico que permite que a definio de certos operadores resultem em uma
chamada de funo que depende dos tipos de dado dos operadores sendo utilizados.
O C++ tambm suporta argumentos padro para os parametros das funes, o que permite omitir tal parmetro na
invocao da funo. Quando uma funo chamada com menos argumentos que o esperado e os argumentos
explcitos so compatveis com os parmetros da esquerda direita, os ltimos parmetros so atribudos de acordo
com o argumento padro. Semanticamente parecida com a sobrecarga de funes, essa tcnica permite simplificar
situaes em que uma funo declarada somente para invocar uma sobrecarga dela prpria com algum parmetro
especificado.
O C++ implementa polimorfismo paramtrico atravs de gabaritos, que fazem o compilador gere uma instncia
separada da classe ou funo usada como gabarito para cada permutao de parmetros de tipo usado com ele, o que
pode levar a dificultar a depurao de cdigo. Um benefcio que os gabaritos C++ tm sobre Java e C permitir a
metaprogramao por gabaritos, uma forma de pr-avaliao de parte do cdigo em tempo de compilao ao invs
de tempo de execuo.
Os gabaritos em C++ fornecem um mecanismo sofisticado para a criao de cdigo genrico polimrfico. Em
particular, por meio da tcnica Curiously Recurring Template Pattern possvel implementar uma forma de
polimorfismo esttico que imita a sintaxe para substituir as funes virtuais. Uma vez que gabaritos so sensveis aos
tipos de dados e tambm so Turing completos, tambm podem ser usados para permitir que o compilador resolva
condicionais recursivas e gerar programas substanciais atravs de metaprogramao por gabaritos.
Entre os usos de polimorfismo esttico, inclui-se funes com o mesmo nome mas que tratam de diferentes
parmetros, como soma(int, int) e soma(double, double) (o que, entretanto, ignora as facilidades
dos gabaritos.) Tambm, verses novas da mesma funo que recebem parmetros adicionais, como
ExportarDados(void* buffer, int tamanho) e ExportarDados(void* buffer, int
tamanho, unsigned long opcoes). Mais um uso um mesmo nome de mtodo para atribuir ou obter o
valor de uma propriedade, como Classe::Propriedade(int x) e int x Class::Property()
const.
Dinmico
O polimorfismo por herana um exemplo de polimorfismo dinmico no qual ponteiros de uma classe base podem
referenciar objetos de classes derivadas, o que permite que uma chamada de funo virtual seja resolvida em tempo
de execuo de cdigo. Ponteiros e referncias de uma classe base podem referenciar objetos de qualquer classe
derivada de si, o que permite que arranjos e outros containers de um dado tipo possam armazenar ponteiros de
diversos tipos de dados, o que no poderia ser feito de outra maneira em C++. Como no possvel descobrir se a
C++
187
converso do tipo base para o tipo derivado segura em tempo de compilao, a verificao deve ser feita durante a
execuo do cdigo. Para isso fornecido o operador dynamic_cast, que permite tentar a converso segura de
uma classe mais abstrata (classe base) para outra mais especfica (classe derivada). Para sua utilizao a linguagem
dispe do RTTI, uma tcnica para manter em memria informaes sobre o tipo de dado de objetos. Caso a
converso no seja possvel uma exceo especfica lanada.
Normalmente, quando uma funo em uma classe derivada substitui uma funo em uma classe base, a funo
chamada determinada pelo tipo do objeto. Uma dada funo sobrescrita quando no existe nenhuma diferena no
nmero ou tipo de parmetros, entre duas ou mais definies para aquela funo. Assim, em tempo de compilao
pode no ser possvel determinar o tipo do objeto e, portanto, a funo a ser chamada, tendo apenas um ponteiro de
classe base, a deciso adiada at o tempo de execuo. Isso chamado de despache dinmico. Funes ou mtodos
virtuais permitem a implementao mais especfica da funo a ser chamada, de acordo com o tipo do objeto em
tempo real. Em C++, isto geralmente feito usando tabelas de funes virtuais. Se o tipo de objeto conhecido, isso
pode ser contornado, antecipando o nome da classe antes da chamada de funo, mas, em geral chamadas de funes
virtuais so resolvidas em tempo de execuo.
Alm das funes de membro padro, sobrecargas do operador e destrutores podem ser virtuais. A regra geral que,
se todas as funes da classe so virtuais, o destrutor tambm deve ser assim. Como o tipo de criao de um objeto
conhecido em tempo de compilao, construtores de cpia e de extenso, no pode ser virtuais. No entanto pode
acontecer de uma cpia de um objeto ser criado quando um ponteiro para um objeto derivado passado como um
ponteiro para um objeto base. Nesse caso, uma soluo comum criar um clone() (ou similar) e declarar que a
funo como virtual. O mtodo clone() cria e retorna uma cpia da classe quando chamado.
Um membro da funo tambm pode ser declarado puramente virtual, acrescentando = 0 aps o parntese de
fechamento e antes do ponto e vrgula. Os objetos no podem ser criados de uma classe com uma funo virtual pura
e so chamados de tipos de dados abstratos. Esses tipos de dados abstratos s podem ser derivados. Qualquer classe
derivada herda a funo virtual pura deve apresentar uma definio no-pura (e todas as outras funes virtuais
puras), antes de objetos da classe derivada poderem ser criados.
Regra dos trs
Uma regra informal no desenvolvimento orientado a objeto em C++ clama que se uma classe ou estrutura possui um
dos seguintes itens, ela provavelmente deveria ter todos os trs: destrutor, construtor de cpia e operador de
atribuio (=).
Esse trs mtodos so funes membros especiais criadas pelo compilador automaticamente se no so definidas
pelo desenvolvedor.
[4]
Se um desses mtodos definido explicitamente pelo desenvolvedor, isso significa que a
verso gerada pelo compilador no serve para um dos casos, e portanto muito provavelmente tambm no serve para
os outros casos.
Um adendo a essa regra diz respeito tcnica RAII: se ela for usada ento o destrutor pode ser deixado sem definio
(tambm conhecida como "regra dos dois").
C++
188
Tratamento de excees
O tratamento de exceo um mecanismo desenvolvido para lidar com a ocorrncia de algumas condies
(chamadas excees) que alteram o funcionamento normal do fluxo de um programa de computador. O C++ suporta
tal tratamento, de forma que o estado atual de um programa aps uma exceo alterado automaticamente para outro
estado pr-definido para a recuperao do sistema.
Para isso foram adicionadas linguagem as palavras reservadas try e catch. A primeira especifica um bloco de
cdigo que ser vigiado em relao excees, de forma que se uma for identificada, o fluxo de programa ser
desviado para um bloco especificado pela segunda palavra reservada. Para um dado bloco try podem existir
diversos blocos catch, capturando excees de diferentes tipos de dado. Alternativamente, a sintaxe catch()
foi introduzida para especificar um bloco de tratamento de exceo independente do tipo da exceo, genrico.
O conceito puro da cincia da computao para tratamento de excees ainda inclui o bloco de instrues finally,
que indica um bloco de cdigo executado aps um bloco try caso nenhuma exceo tenha sido lanada, indicando
sucesso na operao. Tal abordagem no foi adicionada ao C++, sendo substituvel por outras tcnicas como RAII
[5]
.
De qualquer forma, possvel que essa funcionalidade seja adicionada na prxima especificao da linguagem.
Espao de nomes
O C++ introduziu os espaos de nomes para a organizao das bibliotecas, e sua funo agrupar um contexto para
identificadores (variveis, funes, classes, estruturas, entre outros). No contexto de sistemas operativos, o espao de
nomes poderia ser representado por diretrios. Toda a biblioteca padro est contida no espao de nomes std
(abreviao de standard, que em ingls significa padro). Para utilizar um espao de nomes pode ser feita tanto uma
declarao global dos espaos quanto local. Uma declarao global normalmente inserida no incio dos mdulos,
aps a importao dos mdulos externos, utilizando a palavra reservada using (como em using namespace
std;, ver exemplo contextualizado em anexo). Ela tambm pode ser usada em um mbito pr-determinado por um
bloco de cdigo. Uma declarao local inserida antes de invocar o identificador envolvido, utilizando o operador
de resoluo de mbito :: (como em std::cout, ver exemplo contextualizado em anexo). A declarao global
til para reduzir a quantidade de cdigo produzido, sub entendendo a origem dos identificadores utilizados em todo
um mbito. Apesar disso, ela deixa margem ambiguidades, pois possvel que um mesmo identificador esteja
presente em mais de um espao de nome importado no mdulo. Para eliminar esse problema deve-se, alm de
utilizar a declarao global, declarar o identificador ambguo localmente cada vez que ele for utilizado.
Em determinadas ocasies, espaos de nome no considerados durante a primeira verificao do espao de nomes de
uma funo podem tambm ser utilizados na busca, dependendo dos tipos de dados utilizados nos argumentos. A
tcnica, chamada busca de nomes dependente de argumento ou Koening lookup, ocorre quando a busca explcita pela
funo no encontra correspondente, comeando ento a procurar por espaos de nomes associados. Um padro
muito utilizado pela Standard Template Library declarar sobrecarga de operadores que somente so encontrados
pelo compilador atravs dessa tcnica.
Ponteiros e referncias
O C++ herdou a funcionalidade de ponteiros do C e toda a aritmtica de ponteiros disponvel para aquela linguagem:
tratando um ponteiro como um tipo inteiro possvel mover-se facilmente por regies de memria. A instncia de
um ponteiro em C++ uma varivel que armazena um endereo de memria, e que pode ser nula. A biblioteca
padro ainda fornece auto_ptr, uma espcie de ponteiro inteligente para contagem de referncias que pode ser
utilizado em algumas situaes como uma alternativa segura aos ponteiros primitivos do C, automatizando o
processo de desalocao de memria do objeto apontado pelo ponteiro.
Por questes de segurana, o C++ introduziu tambm o tipo de dado referncia, um tipo mais restrito de ponteiro.
Uma referncia definida para outro objeto no pode ser mais referenciada, qualquer ocorrncia do nome no cdigo
diz respeito ao objeto referenciado. Como consequncia, no possvel realizar "aritmtica de referncias". Outra
C++
189
consequncia que no possvel alterar uma referncia para que ela defina outro objeto; aps definida, essa relao
vale para todo o tempo de vida. Em contrapartida, um mesmo ponteiro frequentemente aponta para diferentes reas
de memria.
Apesar de teoricamente possvel
[6]
, a existncia de referncias nulas no considerada, podendo-se assumir que uma
referncia sempre indica um objeto vlido em memria.
Incompatibilidade com C
incorreto considerar o C++ como um super conjunto de C, isto , uma linguagem que implementa o C
completamente e que adiciona novas funcionalidades. Grande parte de cdigo C pode ser perfeitamente compilado
em C++, mas existem algumas pequenas diferenas sintticas e semnticas entre as linguagens que tornam alguns
trechos de cdigo C vlidos em cdigo C++ invlido, ou cdigos que exibem comportamentos diferentes em cada
linguagem.
Talvez a diferena mais comum que C permite a converso implcita entre o tipo de dado void* para ponteiros
para outros tipos, algo que o C++ no permite. Logo, o seguinte cdigo em C vlido:
int *i = malloc(sizeof(int) * 5); /* converso implcita de
void* para int* */
Para assegurar-se que o cdigo funcione tanto em C quanto C++ necessrio explicitar a converso, acrescentando o
que chamado de "cast":
int *i = (int *) malloc(sizeof(int) * 5); /* converso explcita de
void* para int* */
Outra questo de portabilidade entre as linguagens o fato do C++ adicionar vrias novas palavras reservadas, como
new e class, que podem ser utilizadas como identificadores (por exemplo nomes de variveis) em C, gerando
incompatibilidade.
Algumas outras incompatibilidades foram removidas no padro C99, que agora suporta facilidades como
comentrios por //. Tanto C99 quanto C++ definem o tipo de dado bool e suas respectivas constantes true e
false. Apesar disso, enquanto a definio no C++ embarcada na prpria linguagem, tornando tais elementos
palavras reservadas, em C tais identificadores so declarados atravs da biblioteca padro stdbool.h.
Algumas construes sintticas so vlidas tanto em C quanto C++, mas produzem resultado diferente. Por exemplo,
o valor literal 'a' possui tipo de dado int em C e char em C++, o que significa que uma chamada
sizeof('a'), que retorna a quantidade de bytes ocupada pelo identificador, pode resultar em resultados
diferentes entre as duas linguagens. Na prtica, esse exemplo especfico no realmente um problema j que
caracteres literais so convertidos para o tipo int implicitamente pelo compilador tanto em C quanto em C++.
Anlise sinttica do cdigo fonte
Como a gramtica C++ bastante complexa, difcil construir um bom analisador sinttico para cdigo fonte C++
utilizando algoritmos clssicos como o LALR(1). Por exemplo, com o LALR possvel analisar cdigo Java. A
flexibilidade da linguagem tambm fruto de ambiguidades que um analisador simples no consegue distinguir. Por
esse motivo, existem poucas ferramentas para anlise e transformao no trivial de cdigo, como refatorao. Em
suas primeiras especificaes o C++ era uma gramtica LALR, entretanto, com a adio de funcionalidades como
espao de nomes, excees, gabaritos e o tipo bool, essa caracterstica logo se tornou invlida.
A anlise sinttica no a tarefa mais difcil na construo de uma ferramenta C++. Outras tarefas incluem entender
o significado dos identificadores do programa que um compilador deve possuir. Sistemas prticos de processamento
no devem somente analisar o cdigo fonte, mas tambm compreender exatamente cada identificador em diferentes
usos, lidando com as regras de mbito de identificadores (ver um cdigo contextualizado em anexo).
C++
190
O grupo Boost possui um projeto para a construo de um analisador sinttico C++ com base na biblioteca Spirit, de
forma que se torna um mtodo padro e livre de anlise sinttica para a linguagem.
Exemplos de cdigo
Exemplo de um programa que imprime na tela "Ol, Mundo!".
#include <iostream>
int main()
{
std::cout << "Ol, Mundo!" << std::endl;
return 0;
}
Crticas
C faz com que dar um tiro no p seja fcil; C++ torna isso mais difcil, mas quando ns o fazemos arrebentamos com a
perna toda.
Bjarne
Stroustrup
A citao de Stroutrup trata com humor o fato de o C++, ao possibilitar a programao de alto nvel, ter facilitado a
codificao de algoritmos e organizao de projetos em relao ao C, uma linguagem que requer constante ateno
contra erros lgicos de programao devido sua alta flexibidade. Por outro lado, o C++ possui nuances da sintaxe e
semntica da linguagem muito sutis, difceis de serem identificados, e que quando no percebidos podem levar a
comportamentos indesejados no cdigo.
Pontos positivos do C++ incluem a produo de cdigo o quanto mais eficiente possvel, fazendo uso de otimizaes
agressivas e sofisticadas dos compiladores. Entretanto, a linguagem ainda mantem alta flexibilidade, portabilidade e
consistncia. Um exemplo da flexibilidade a possibilidade de programao de alto e baixo nvel. Outro exemplo a
possibilidade de metaprogramao e programao genrica. Mais um ponto positivo ampla disponibilidade e
suporte, devido principalmente grande base de desenvolvedores. Alm disso, a compatilidade com C, resultando
em vasta base de cdigo. Fora do lado tcnico, um positivo que a linguagem no est sob o domnio duma empresa
(em contraste do Java Sun Microsystems (atualmente pertencente a Oracle Corporation) ou Visual Basic
Microsoft); a padronizao responsabilidade da ISO.
Por outro lado, pontos negativos do C++ incluem grande perodo para o aprendizado devido complexidade da
linguagem. Tambm, os compiladores atuais, que nem sempre produzem o cdigo mais otimizado, tanto em
velocidade quanto tamanho do cdigo, e que geralmente produzem mensagens de erro difceis de serem interpretadas
em problemas relacionados com gabaritos. Ainda relacionado a aprendizado e uso, a biblioteca padro no cobre
reas importantes da programao, como threads (suportada por C++11), conexes TCP/IP, interface grfica e
manipulao de sistemas de arquivos, o que implica na necessidade de criao de bibliotecas prprias para tal, que
pecam em portabilidade e padronizao. Apesar da ampla base de cdigo legada do C, o C++ tambm herdou
daquela linguagem problemas de entendimento de sintaxe do mesmo. Mais um ponto negativo que devido grande
flexibilidade no desenvolvimento, recomendado o uso de padres de programao mais amplamente que em outras
linguagens.
C++
191
Comunidade de desenvolvimento
Pessoas notveis
O desenvolvimento da linguagem C++ fruto do trabalho de milhares de pessoas associadas academia e indstria
de software, e pode consistir na utilizao da linguagem, em seu ensino, na construo de bibliotecas de rotinas ou
na participao no comit de padronizao, entre outras atividades. Algumas pessoas tiveram participao
fundamental durante a histria para o desenvolvimento. Primeiramente, o prprio Bjarne Stroustrup, criador da
linguagem e de seu primeiro compilador. O cientista ainda participa na padronizao e divulga o C++ no meio
acadmico. Andrew Koenig outro pesquisador notvel, bastante atuante na padronizao e creditado pela tcnica
Koenig lookup (demonstrada em anexo). J Scott Meyers um doutor em cincia da computao, e escritor de
diversos livros sobre o desenvolvimento de software utilizando a linguagem. Assim como Meyers, Herb Sutter
escritor de diversos livros sobre C++ e centenas de colunas e artigos, e um notvel pesquisador sobre programao
concorrente e multitarefa. Andrei Alexandrescu considerado um dos maiores especialistas em programao C++
avanada. Na rea de programao genrica destaca-se o programador russo Alexander Stepanov, a figura chave na
criao da Standard Template Library.
Bibilioteca Boost
Parte da comunidade de desenvolvimento do C++ foi responsvel pela criao da Boost, um conjunto de bibliotecas
que estendem a funcionalidade da linguagem, mais especificamente, da bibilioteca padro. O processo de
disponibilizao de bibliotecas da Boost mais rpido do que o do comit de padronizao da linguagem, e o projeto
acaba servindo como uma forma de teste em campo das bibliotecas, que eventualmente podem ser migradas para a
especificao da linguagem. Para o TR1 do C++0x, pelo menos dez bibliotecas j foram aceitas. A base de usurios
da Boost grande, o que reflete no controle de qualidade. Funcionalidades oferecidas vo desde bibliotecas gerais
como smart_ptr a abstraes do sistema operacional como o filesystem a bibliotecas para usurios avanados como a
MPL.
Ferramentas
Ambientes de desenvolvimento
Abaixo mostrada uma lista dos principais ambientes de desenvolvimento C++, sejam eles compiladores ou
ambientes de desenvolvimento integrado (IDE).
Nome Comentrio Tipo de licena
compilador?

IDE?

depurador?
Plataformas
G++ Um componente do GCC, compilador padro do
Projecto GNU
Livre Unix, Linux, Mac
OS X, Windows e
AmigaOS
Dev-C++ IDE livre famosa entre iniciantes. Seu compilador
o MinGW, uma verso do G++ para Windows.
Livre
Windows
[7]
Ultimate++ U++ um framework C++ multi-plataforma, para
desenvolvimento rpido de aplicaes, focado na
produtividade de programadores.
Livre Unix, Linux, Mac
OS X e Windows
Intel C++ Produz cdigo otimizado para processadores Intel Proprietria Windows e Linux
Microsoft
Visual C++
o mais conhecido para a plataforma Windows,
com ferramentas e tecnologias auxiliares para
desenvolvimento nessa plataforma (como MFC,
ATL, COM, entre outras). Oferece ainda uma
verso gratuita com restries de uso
Proprietria Windows
C++
192
C++ Builder Ferramenta da Embarcadero (anteriormente da
Borland), que compartilha a mesma IDE do Delphi
chamada de RAD Studio, sendo possvel a
utilizao dos mesmos componentes visuais do
Delphi (VCL) em um cdigo C++.
Proprietria Windows
Qt Creator IDE especializada em (mas no restrita a)
desenvolvimento na plataforma Qt. Utiliza o g++
como compilador e o gdb como depurador (ou seus
equivalentes para MinGW em Windows).
Livre/Proprietria Linux, Windows e
Mac OS X
Open Watcom Suporta plataformas antigas, at ento sem suporte
completo biblioteca padro
Livre DOS, Windows,
OS/2 e Netware
Comeau C++ Pode ser experimentado pela Internet Proprietria Windows, Linux e
Solaris
Turbo C++ Possui verso gratuita no stio oficial e tambm
uma verso paga. similar ao C++ Builder.
Proprietria Windows
Eclipse Disponvel para C++ atravs da extenso CDT. Livre Windows, Linux,
JVM
NetBeans Possui verso especializada para C++ e tambm
disponvel atravs de um plugin.
Livre Windows, Linux,
Mac OS X, JVM
Anjuta Suporta muitas capacidades avanadas como
gerenciamento de projetos e um poderoso editor de
cdigo fonte. Uma nova verso do Anjuta (Anjuta
2.*) que integra o Glade est em desenvolvimento
ativo.
Livre Linux
Code::Blocks Ambiente aberto e multi-plataforma, em sua verso
para Windows utiliza o compilador MinGW,
apesar de tambm suportar outros compiladores
como o Visual C++, Digital Mars, Borland C++ 5.5
e Open Watcom.
Livre Windows, Linux,
Mac OS X
Digital Mars Proprietria Windows, DOS
Codelite Livre Windows, Linux,
Mac OS X
Geany Livre Windows, Linux
GNAT
Programming
Studio
Utiliza o compilador GCC Livre Windows, Linux,
Solaris
KDevelop Utiliza o compilador GCC Livre Windows, Linux
Aplicativos desenvolvidos em C++
Abaixo segue uma lista de exemplos de aplicativos parcial ou totalmente escritos em C++, de acordo com Bjarne
Stroustrup, que no garante sua preciso e veracidade, ainda que seja responsvel por sua publicao.
C++
193
Adobe Acrobat Maya
Adobe Illustrator Mars Pathfinder, Opportunity e outras sondas da NASA
Adobe Photoshop Microsoft Office
Amazon Microsoft Visual Studio (Visual Basic, Visual FoxPro, Visual C++)
BeOS Microsoft Windows (diversas verses)
Blender Mozilla Firefox
Common Desktop Environment Mozilla Thunderbird
Doom III (motor de jogo) MySQL
eMule Mquina virtual Java
Motores de busca Google, em especial Googlebot LibreOffice
Srie Half-Life Outlook Express
Internet Explorer PCSX2 (Emulador de Playstation 2)
iPod (GUI) SETI@home
KDE (Qt) Symbian OS
Lunar Magic Winamp
Mac OS X Tibia
Bibliografia
Bjarne Stroustrup. The Design and Evolution of C++. [S.l.]:Addison-Wesley, 1994. ISBN 0-201-54330-3
Andrei Alexandrescu e Herb Sutter. C++ Design and Coding Standards: Rules and Guidelines for Writing
Programs. [S.l.]:Addison-Wesley, 2004. ISBN 0-321-11358-6
Livro: Programao em C++ Builder 3, Autor: Roberto Falanga Jnior, Visual Books, Editora Catarinense de
Informtica, ISBN 85-85943-51-3
Ligaes externas
Material de estudo
Pgina oficial do comit C++ JTC1/SC22/WG21
[8]
(em ingls)
Happy Codings
[9]
(em ingls) algoritmos em C++
Comparativo entre compiladores
[10]
(em ingls)
Problemas de compatibilidade binria em C++
[11]
(em ingls)
Exemplos de compatibilidade binria em C++
[12]
(em ingls)
Bibliotecas e repositrios de cdigo
Poco Project
[13]
(em ingls) conjunto de bibliotecas C++ revisadas por especialistas.
csourcesearch.net
[14]
(em ingls) repositrio de cdigo livre C e C++
CommonCPP
[15]
(em ingls) classes fundamentais portveis da GNU
STLSoft
[16]
(em ingls) bibliotecas livres, compostas somente de cabealhos, com o intuito de servir como
extenso STL
C/C++ Reference
[17]
(em ingls) referncias de C e C++
C++
194
Referncias
[1] [1] Uma discusso sobre o tema encontra-se na seo de incompatibilidades.
[2] [2] Mais informaes sobre o C++ ABI podem ser obtidas no
[3] [3] Um exemplo o livro de Ivor Horton:
[4] [4] O construtor padro tambm criado automaticamente pelo compilador caso o desenvolvedor no tenha definido nenhum outro construtor
para a classe.
[5] Herb Sutter realiza uma comparao entre as tcnicas RAII e Dispose (que depende do conceito de finally) em seu blog pessoal:
[6] Dado um tipo de dado T, uma referncia pode ser definida para nulo atravs de T& var = *(T*)0;. Notar entretanto que obter o
contedo de nulo resulta em comportamento indefinido, o que indica m prtica de programao.
[7] Uma verso para Linux (http:/ / freshmeat.net/ projects/ dev-cpp) comeou a ser desenvolvida, mas foi abandonada em 2002
[8] http:/ / www. open-std.org/ jtc1/ sc22/ wg21/
[9] http:/ / www. cplusplus. happycodings. com/ Algorithms/
[10] http:/ / cmeerw. org/ prog/ freecpp/
[11] http:/ / techbase. kde. org/ Policies/ Binary_Compatibility_Issues_With_C+ +
[12] http:/ / techbase. kde. org/ Policies/ Binary_Compatibility_Examples
[13] http:/ / www.pocoproject. org/
[14] http:/ / csourcesearch. net/
[15] http:/ / www.gnu. org/ software/ commoncpp/
[16] http:/ / stlsoft.org/
[17] http:/ / www.cppreference.com/
Common Lisp
Common Lisp
Paradigma Multiparadigma, funcional, Orientao a Objetos
Surgido em 1984, 1994 para o ANSI Common Lisp
Criado por Comit ANSI X3J13, presidido por Guy L. Steele Jr.
Estilo de
tipagem:
forte, dinmica
Compiladores CLISP, Steel Bank Common Lisp, Embeddable Common Lisp, Armed Bear Common Lisp, Clozure Common Lisp,
Allegro Common Lisp, GNU Common Lisp, Corman Common Lisp, LispWorks
Influenciada
por
Lisp, Scheme, Smalltalk
Influenciou Dylan, Clojure, Ruby
Common Lisp uma implementao especfica da linguagem de programao Lisp multi-paradigma que suporta
programao funcional e procedural. Foi criada por Guy L. Steele nos anos 1980 a partir da linguagem Lisp com o
intuito de combinar aspectos de diversos dialetos Lisp anteriores, incluindo Scheme. Foi proposto inicialmente o
nome de "Standard Lisp" para a linguagem, mas em virtude de de um dialeto Lisp j existir com este nome, se
buscou um nome similar, resultando no nome "Common Lisp". Em 1994 foi publicada no padro ANSI Information
Technology - Programming Language - Common Lisp, registro X3.226-1994 (R1999).
[1]
. bem maior e
semnticamente mais complexa que Scheme uma vez que foi projetada para ser uma linguagem comercial e ser
compatvel com os diversos dialetos Lisp dos quais derivou.
Common Lisp
195
Exemplos de cdigo
Ol mundo
(defun ol-mundo
(format t "Ol mundo"))
Entrada e Sada
(defun pergunta (string)
(format t "~%~%~A" string)
(read))
(pergunta "Quantos anos voce tem? ")
Loops
(defun quadrados (inicio fim)
(do ((i inicio (+ i 1)))
((> i fim) 'fim)
(format t "~A ~A~%" i (* i i))))
Bibliografia
SEIBEL, PETER.(2005); Practical Common Lisp. Apress, 2005.
GRAHAM, Paul. Ansi Common Lisp. New Jersey:Prentice Hall, 1996. ISBN 0-13-370875-6
GRAHAM, PAUL.(1993); On Lisp. Prentice Hall, 1993. (Descreve tcnicas avanadas para uso de macros)
STEELE, Guy L.. Common Lisp - The Language. Lexington:Digital Press, 1990. ISBN 1-55558-041-6
TOURETZKY, DAVID S.(1990); Common Lisp - A Gentle Introduction to Symbolic Computation. Benjamin
Cummings, Redwood City, 1990. ISBN 0-8053-0492-4
Ligaes externas
Site do autor David S. Touretzky
[2]
Livro em pdf "Common Lisp: A Gentle Introduction to Symbolic Computation de David S. Touretzky"
[3]
Livro "Common Lisp - The Language" disponvel em formato HTML
[4]
Livro "Common Lisp The Language" pela Google books
[5]
Implementaes de Common Lisp
[6]
Livro do Paul Graham em pdf "On Lisp"
[7]
Common Lisp
196
Referncias
[1] Pgina do Documento (http:/ / webstore.ansi.org/ RecordDetail. aspx?sku=ANSI+ INCITS+ 226-1994+ (R2004)) no stio da ANSI
[2] http:/ / www. cs. cmu. edu/ ~dst/ LispBook/ index.html
[3] http:/ / www. cs. cmu. edu/ ~dst/ LispBook/ book. pdf
[4] http:/ / www. cs. cmu. edu/ Groups/ AI/ html/ cltl/ clm/ clm. html
[5] http:/ / books. google. com. br/ books?id=FYoOIWuoXUIC& dq=Common+ Lisp+ the+ Language& printsec=frontcover& source=bn&
hl=pt-BR& ei=SwcHSoP6GZuqtgfL0emdBw& sa=X& oi=book_result& ct=result& resnum=4#PRA1-PA780,M1
[6] http:/ / common-lisp. net/ ~dlw/ LispSurvey. html
[7] http:/ / lib.store. yahoo. net/ lib/ paulgraham/ onlisp. pdf
Miranda
Miranda
Surgido em 1985
Criado por David Turner
Estilo de tipagem: esttica, fortemente tipada
Compiladores Miranda
Influenciada por KRC, SASL, ML
Influenciou Haskell
Miranda uma linguagem de programao funcional, no restrita desenvolvida por David Turner, usando alguns
conceitos das linguagens de programao anteriores como SASL e KRC, utilizando alguns conceitos de ML e Hope.
Comercializada pela Research Software Ltda. da Inglaterra, da qual a palavra "Miranda" uma marca registrada, ela
foi a primeira linguagem puramente funcional, a ser utilizada como ferramenta comercial, e no para fins
acadmicos.
A soluo para a maioria dos problemas mais simples e sucinta em Miranda do que na maior parte das linguagens
de programao, exceto a APL, e algumas outras linguagens funcionais, relatam seus usurios, que lhes permite
produzir programas mais confiveis em menos tempo do que com o desenvolvimento da programao imperativa,
linguagens que eles tinham anteriormente utilizado.
Foi lanado em 1985, como um rpido interpretador em C para sistema operacional Unix-flavour, com subsequente
liberao, em 1987 e 1989. Mais tarde a linguagem de programao Haskell semelhante a muitos formatos de
Miranda.
Bibliografia
THOMPSON, Simon. Miranda: The Craft of Functional Programming. Reading,
Massachusetts:Addison-Wesley, 1995.451 p. ISBN 0-201-42279-4
Eiffel
197
Eiffel
A Wikipdia possui o portal:
Portal das tecnologias de informao
Eiffel uma linguagem de programao puramente orientada a objeto, que implementa as teorias sobre a orientao
a objeto de Bertrand Meyer.
Sendo Bertrand Meyer um terico francs da orientao a objeto, o nome da linguagem obviamente uma aluso
famosa Torre Eiffel, um dos smbolos de Paris e, portanto, da Frana.
Sendo este autor muito atento aos fundamentos tericos, a linguagem de programao Eiffel tem, ao lado de muitas
inovaes polmicas, um retorno aos clssicos. Especificamente, so usadas nela conceitos de linguagens muito mais
antigas, como Simula 67 (a primeira linguagem de programao orientada a objeto) e CLU, linguagem de
programao modular devida a Barbara Liskov, outra importante terica de tcnicas de projeto e programao de
software.
Dados
Eiffel uma linguagem orientada a objeto. Sua sintaxe similar ao PASCAL e ALGOL. Algumas de suas
caractersticas so: projeto por contrato, heranas multiplas, overload de operador e classes genricas. Entende-se por
projeto por contrato como uma forma de explicitar as condies de uso dos componentes (mdulos) de programas e
os resultados dos mesmos, estabelecendo prs e ps-condies que devem ser satisfeitas. Eiffel tem um tipo nico de
dados - todos os tipos so classes - ento possvel criar subclasses de classes bsicas como a classe "INTEGER". A
linguagem se prope a ser de uso geral, podendo ser usada para desenvolvimento de aplicaes financeiras, indstria,
sistemas de telecomunicaes, etc.
Histrico
Adaptao do texto do site da Eiffel Software:
A linguagem Eiffel foi concebida pela Eiffel Software (ento conhecida como ISE) em 1985, inicialmente como uma
ferramenta interna para desenvolver diversas aplicaes prprias. Os engenheiros de software da Eiffel necessitavam
de um poderoso ambiente para integrar os modernos conceitos da engenharia de software e orientao a objetos e
no havia simplesmente nada disponvel. Por esta razo, o Dr. Bertrand Meyer, fundador da Eiffel Software,
concebeu o compilador Eiffel 1. Ele foi apresentado ao pblico na primeira The International Conference on Object
Oriented Programming, Systems, Languages and Applications (OOPSLA)
[1]
em outubro de 1986, onde ele atraiu
considervel ateno, levando o Dr. Meyer a divulg-lo como um produto comercial, no final de 1986. A tecnologia
se espalhou rapidamente ao longo dos anos seguintes, com um histrico de sucesso em diversos projetos industriais
nos EUA, Canad, Europa e Extremo Oriente. Logo no incio, Eiffel tambm atraiu a ateno da comunidade
acadmica como uma ferramenta ideal para o ensino de programao em todos os nveis. Vrias universidades de
todo o mundo a tm usado no ensino primrio de linguagens de programao.
As sucessivas verses do ambiente surgiam em mdia de uma vez por ano. Eiffel tornou-se objeto de maior
visibilidade com a publicao, em 1988, do livro Object-Oriented Software Construction pelo Dr. Bertrand Meyer,
que rapidamente se tornou um best-seller e foi traduzido para oito lnguas, o livro utiliza Eiffel para explicar e
ilustrar os conceitos fundamentais de orientao a objeto e Design by Contract
[2]
.
A ltima iterao envolvendo a tecnologia original do Eiffel foi a verso 2.3, lanada em meados de 1990. A
prxima verso, Eiffel 3, foi escrito inteiramente em Eiffel. Eiffel 3 apresenta o Melting Ice Technology para
recompilao rpida, um ambiente grfico com interface totalmente inovadora para o usurio, com base em
Eiffel
198
conceitos e avanos considerveis em bibliotecas (grficos, rede ...) e otimizao do cdigo gerado. As primeiras
verses foram lanadas em Unix e seguido pelo Linux, VMS, OS / 2, Windows (Windows 3.1, Windows 95,
Windows NT),. NET, e Mac OS X.
Hoje, a tecnologia Eiffel continua a empurrar as fronteiras do desenvolvimento de software. Com a introduo do
EiffelStudio , os programadores podem tirar partido de uma IDE eficiente para alcanar a mais alta qualidade,
robustez, escalabilidade de aplicaes reutilizveis - em todas as principais plataformas. Com EiffelEnvision , os
programadores podem ainda usar o poder da linguagem Eiffel dentro do popular ambiente do Microsoft Visual
Studio. NET.
Caractersticas
Eiffel no case-sensitive. Alm disso, o uso de um smbolo de fim-de-instruao opcional e deixado a critrio do
programador. Muitos programadores em Eiffel optam por omitir o ponto-e-vrgula exceto quando colocam mais de
uma instruo numa linha. O fato dela nao ser case-sensitive favorece bastante a sua redigibilidade.
Simplicidade
Eiffel tem apenas seis instrues de execuao bsicas:
* Atribuio
* Criao de um objeto
* Chamada de rotina
* Condicional
* Iterao
* Escolha (case)
Ao contrrio de muitas outras linguagens O.O., mas similar ao SmallTalk?, Eiffel no permite modificar campos de
objetos que no sejam do objeto atual. O mesmo ocorre com variveis locais da rotina atual. Qualquer modificao
em outros objetos devem ser feitas atravs de seus respectivos mtodos.
Compiladores para a linguagem Eiffel podem ser encontrados para diversos sistemas operacionais e plataformas de
hardware, destacando-se as seguintes: PC: DOS, OS/2, Windows 3.1, Windows 95, Windows NT, PC
Unix(Interactive, SCO, and ESIX), Nextstep, Linux Outras plataformas de Hardware: Sparc (SunOS & Solaris),
NeXTStep, HP9000, DEC 5xxx, Sony News, DG Aviion, DEC Alpha OSF-1, DEC OpenVMS, RS6000, Pyramid,
QNX, Silicon Graphics, Macintosh (Motorola& PowerPC).
Tipos
S h um tipo de dado em Eiffel: a classe. Optando por essa metodologia, a linguagem tem uma alta ortogonalidade,
favorecendo a legibilidade e redigibilidade, pois no h tantos critrios a serem aprendididos, para ento ser escrito
um cdigo ou ento ser feita a manuteno do mesmo. Toda modelagem de outros tipos de dados deve partir de uma
classe. Todo cdigo deve existir sob o contexto de uma classe. Ela uma linguagem estaticamente tipada e todos os
erros de tipos so verificados em tempo de compilao. Ela tambm fortemente tipada. Eiffel tem um nmero de
tipos bsicos (algumas vezes chamados de "embedded types")embutidos. Estes tipos bsicos incluem: BOOLEAN,
CHARACTER, INTEGER, REAL. Uma operao de atribuiao s permitida se os tipos envolvidos sejam
concordantes. Vamos explicar cmo se d isso:
* Uma classe A um ancestral da classe B se A e B so da mesma classe ou A um ancestral
de um pai de B.
* Uma classe B um descendente da classe A se A um ancestral de B.
A Classe B concorda com a classe A se e somente se B um descendente de A.
Eiffel
199
Tipos de Polimorfismo
Polimorfismo Universal Paramtrico
Uma funo ou uma classe que siga o polimorfismo universal paramtrico tem um parmetro de tipo (implcito ou
explcito), que determina o tipo de argumento para cada aplicao dessa funo /classe.
Exemplo:
class Complexo
creation
initComplexo
feature
parteReal, parteImag : REAL
feature
initComplexo (r, i : REAL) is
do
parteReal := r;
parteImag := i;
end;
Referncia ao objeto Complexo e a inicializao deste objeto:
c1: Complexo;
!!c1.initComplexo(2.4, -3.2);
Polimorfismo Universal por Incluso
Um objeto pode ser visto como pertencendo a diferentes classes que no precisam ser disjuntas
class A
create make
feature
make is do end
metodo is do
print("Classe A%N")
end
end
class B inherit A
redefine metodo end
create make
feature
metodo is do
print("Classe B%N")
end
end
Referncia aos objetos e inicializao deles
!!ca.make
!!cb.make
ca:=cb
ca.metodo
Eiffel
200
Ser impresso Classe B
Sobrecarga
A linguagem Eiffel no suporta duas funes/mtodos com o mesmo nome mas assinaturas diferentes.
Coero
A linguagem Eiffel no permite que um argumento seja convertido para o tipo esperado por uma funo, evitando
assim um erro de tipo.
Projeto Por Contrato
Texto retirado do site da Eiffel Software:
" Um conceito revolucionrio para se fazer softwares confiveis, introduzido pela Eiffel e apenas implementada na
Eiffel. A idia bsica que para fazer software confivel no suficiente ser "cuidadoso" e utilizar todo tipo de
checagem ao longo do cdigo. Uma abordagem mais sistemtica essencial. Atravs do conceito de projeto por
contrato, voc enxerga seu sistema como feito de um nmero de componentes complementares - as classes em Eiffel
- os quais cooperam baseados em declaraes precisas de obrigaes e benefcios mtuos: contratos, assim como
contratos entre cliente e empresa. Eiffel obriga diretamente o projeto por contrato atravs de construes como class
invariants , pr-condies e ps-condies. Admita por exemplo, que ns queremos que nossos contadores sejam
sempre no-negativos. A classe ter agora uma invariante :
indexing ... class
COUNTER
feature
...
invariant
item >=0
end
e a feature decremento agora neceessita de uma pr-condio, para certificar-se de que o cliente no realiza uma
operao ilegal. A palavra-chave require inicia a pre-condio.
decrement is
-- Decrease counter by one
require
item > 0
do
item := item -1
ensure
item= old item -1
end.


-- old "item" representa o valor de "item" antes do mtodo ser chamado.
A palavra-chave ensure inicia a ps-condio.
A pr-condio diz ao cliente:
* "Nem pense em me chamar se no tiver absoluta certeza de que counter estritamente positivo"
A ps-condio diz:
Eiffel
201
* "Se voc for um bom garoto( cumpriu a pr-condio ), aqui est o que eu prometo fazer para
voc quando retornar: eu irei decrementar counter em uma unidade."
Pr-condies, ps-condies e invariantes so chamadas asseres. "
Asseres
Segundo a Sun: "Uma assero um comando contendo uma expresso booleana que o programador acredita ser
verdadeira no momento que o comando executado". Ou seja, a assero um recurso da linguagem para testar as
suposies feitas pelo programador dentro do cdigo.
Verificao de asseres
* Asseres como pr e ps-condies tem um primeiro papel de documentar o mtodo.
* A verificao de asseres pode ser habilitada em tempo de execuo.
* Se uma assero no satisfeita, ento
o Se for uma pr-condio, o cliente do mtodo possui uma falha.
o Se for uma ps-condio, o mtodo provedor falho.
A assero favorece em muito a confiabilidade de um programa, devido as suas prs e ps condies.
"Hello World"
class HELLO_WORLD
create

make
feature
make is

do

io.put_string("Hello World!%N")
end
end
Eiffel
202
Bibliografia
MEYER, Bertrand. Eiffel the Language. Hemel Hempstead:Prentice Hall International(UK), 1992.594 p. ISBN
0-13-247925-7
WIENER, Richard. An Object-Oriented Introduction to Computer Science Using Eiffel. Upper Saddle River, New
Jersey, EUA:Prentice Hall, 1996.378 p. ISBN 0-13-183872-5
Referncias
Eiffel Software [3]
Projeto Por Contrato, David Dharbe, DIMAp/UFRN [4]
GabrielRocha - 17 Oct 2005 [5]
TWiki [6]
Trabalho acadmico sobre Eiffel apresentado na disciplina de Linguagem de Programao na Escola Politcnica
da USP [7]
Ligaes externas
(em ingls) Pgina oficial da linguagem
[3]
Referncias
[1] http:/ / en. wikipedia. org/ wiki/ OOPSLA
[2] http:/ / en. wikipedia. org/ wiki/ Design_by_Contract
[3] http:/ / www. eiffel.com/
[4] http:/ / monolith. consiste.dimap. ufrn. br/ ~david/ ENSEIGNEMENT/ SUPPORT/ 0805-projeto-por-contrato. pdf
[5] http:/ / twiki.dcc. ufba. br/ bin/ view/ Main/ GabrielRocha
[6] http:/ / twiki.dcc. ufba. br/ bin/ view/ MAT052/ Eiffel
[7] http:/ / linguagemeiffel. wordpress. com
Perl
203
Perl
Perl
Paradigma Multiparadigma: funcional, imperativo, Orientao a objetos, reflexivo, estruturado, genrico
Surgido em 1987
ltima verso 5.16.0 (20 de maio de 2012)
Verso em teste 5.17.0 (20 de maio de 2012)
Criado por Larry Wall
Estilo de tipagem: dinmica
Influenciada por AWK, C, C++, Lisp, Pascal, sed, Smalltalk, Shell do Unix
Influenciou Python, PHP, Ruby, ECMAScript, JavaScript, Falcon, Perl 6
Licena: GNU General Public License, Licena Artstica
Pgina oficial
www.perl.org
[1]
Perl uma linguagem de programao estvel e multiplataforma, usada em aplicaes de misso crtica em todos os
setores, sendo destacado o seu uso no desenvolvimento web de todos os tipos. Permite a criao de programas em
ambientes UNIX, MSDOS, Windows, Macintosh, OS/2 e outros sistemas operacionais. Alm de ser muito utilizada
para programao de formulrios www e em tarefas administrativas de sistemas UNIX - onde a linguagem nasceu e
se desenvolveu - possui funes muito eficientes para manipulao de textos.
Perl uma das linguagens preferidas por administradores de sistema e especialmente verstil no processamento de
cadeias (strings), manipulao de texto e no pattern matching implementado atravs de expresses regulares, alm
de ser bastante adequada para o desenvolvimento de projetos utilizando uma metodologia gil.
Seu slogan "There's more than one way to do it"(Existe mais de uma maneira de fazer isso) demonstra exatamente o
propsito da linguagem: sua flexibilidade e capacidade de fazer cdigos funcionais.
A linguagem Perl j foi portada para mais de 100 diferentes plataformas e bastante usada em desenvolvimento
web, finanas e bioinformtica.
Origem
A linguagem Perl foi desenvolvida por Larry Wall. Seu lanamento deu-se em 1987 (4 anos antes do Linux) quando
Larry postou o Perl no grupo de notcias da Usenet "comp.sources". Antes disso, praticamente todo processamento
de texto em sistemas baseados em Unix era feito com uma poro de ferramentas, tais como o AWK, 'sed', C e
diversas linguagens shell script. A ideia de Wall foi juntar as principais vantagens de todas essas linguagens:
expresses regulares do 'sed'; a identificao de padres de AWK; a profundidade de C; alm da sintaxe baseada
tanto em C quanto em Shell Script.
Pouco tempo depois de sua primeira verso, Perl se popularizou. Em 1992, encontrava-se j na verso 4 e tornou-se
uma linguagem padro para Unix. Porm, foi tambm nessa poca que a linguagem de Larry comeou a mostrar suas
limitaes. Apesar de ser excelente para administradores de sistemas escreverem pequenos e poderosos cdigos, era
invivel desenvolver programas maiores com o Perl. Foi quando a equipe, ainda liderada por Larry Wall, comeou a
desenvolver a verso 5, lanada em 1994. A partir de ento, a linguagem subiu de patamar; tornou-se, como muitos
acreditam, uma linguagem completa, e no apenas auxiliar.
Obs.: Para mais informaes, vide a timeline do Perl nos Links Externos
Perl
204
Caractersticas da linguagem
Atractor de Lorenz calculado com octave e convertido para SVG
utilizando um script Perl
No geral, a sintaxe de um programa em Perl se
parece muito com a de um programa em C: existem
variveis, expresses, atribuies, blocos de cdigo
delimitados, estruturas de controle e sub-rotinas.
Alm disso, Perl foi bastante influenciado pelas
linguagens de shell script: todas as variveis
escalares so precedidas por um cifro ($). Essa
marcao permite identificar perfeitamente as
variveis num programa, onde quer que elas estejam.
Um dos melhores exemplos da utilidade desse
recurso a interpolao de variveis diretamente no
contedo de strings. Perl tambm possui muitas
funes integradas para tarefas comuns como
ordenao e acesso de arquivos em disco.
Perl pega emprestado as listas de Lisp, as arrays
associativas (tabelas hash) de awk e as expresses
regulares de sed. Isso tudo simplifica e facilita
qualquer forma de interpretao e tratamentos de
textos e dados em geral.
A linguagem suporta estruturas de dados arbitrariamente complexas. Ela tambm possui recursos vindos da
programao funcional (as funes so vistas como um outro valor qualquer para uma subrotina, por exemplo) e um
modelo de programao orientada a objetos. Perl tambm possui variveis com escopo lxico, que tornam mais fcil
a escrita de cdigo mais robusto e modularizado.
Todas as verses de Perl possuem gerenciamento de memria automtico e tipagem dinmica. Os tipos e
necessidades de cada objeto de dados no programa so determinados automaticamente; memria alocada ou
liberada de acordo com o necessrio. A converso entre tipos de variveis feita automaticamente em tempo de
execuo e converses ilegais so erros fatais.
Pontos Fortes
Foi feito para fcil compreenso humana;
Perl muito porttil;
Perl excelente para manipulao de textos e arquivos;
Perl uma Linguagem de programao de alto nvel, tirando do programador muitas preocupaes referentes a
aspectos mais baixos;
Por conta da facilidade em seu aprendizado, inmeros cdigos so escritos para uso pessoal e, assim, no possuem a
preocupao da legibilidade. Por isso, muitas pessoas acabaram por dar linguagem a fama de ser mal estruturada e
ilegvel; o que errado, pois Perl admite uma boa escrita e estruturao, como muitas outras linguagens.
A linguagem Perl foi criada e desenvolvida com o ideal de Software livre. Esse aspecto tornou-se uma caracterstica
intrnseca e os programadores contam com uma ampla comunidade, que ajuda no desenvolvimento e manuteno da
linguagem e dos cdigos. Exemplo disso a CPAN, Comprehensive Perl Archive Network (rede de repositrios de
Perl). Este repositrio possui mais de 100 mil mdulos para Perl, bem como suas documentaes.
Perl
205
Resumo
Sua interface de integrao com banco de dados (DBI e DBIx::Class) suporta muitos bancos de dados, incluindo
Oracle, Sybase, PostgreSQL, MySQL e outros
Perl tem mdulos para trabalhar com HTML, XML, e outras linguagens de markup
Perl suporta Unicode
Perl permite programao procedural e orientada a objetos
Perl pode acessar bibliotecas externas em C/C++ atravs de XS ou SWIG
Perl extensvel. Existem milhares de mdulos disponveis no Comprehensive Perl Archive Network (CPAN)
O interpretador Perl pode ser embutido em outros sistemas
Perl e a World Wide Web
Perl conhecida como o "Canivete Suo da Internet";
O mdulo Perl CGI.pm, que faz parte da distribuio padro, serve como script do lado do servidor
Perl pode manipular dados criptografados, incluindo transaes de comrcio eletrnico;
mod perl permite que o servidor web Apache possa interpretar cdigos Perl diretamente;
O pacote DBI do Perl faz com que a integrao com banco de dados seja muito simples. E com pacote
DBIx::Class, utiliza-se orientao a objetos para trabalhar diretamente com bancos de dados;
Existe um Web Framework (servidores web) chamado Catalyst que feito em Perl, bastante utilizado;
Perl pode ser usado em praticamente todas as reas relacionadas Internet.
Portabilidade
Perl , seno a mais, uma das linguagens mais portteis;
Pode ser portada para mais de 100 Sistemas Operacionais diferentes;
Tipos de dados
O Perl tem uma srie de tipos de dados fundamentais, porm considerada uma linguagem no-tipada, ou seja, as
variveis no so restringidas a usar um nico tipo. Os mais utilizados so: escalar, vetor (array), hash (vetor
associativo), handle de um arquivo e sub-rotinas.
Escalar: um valor nico, que pode ser um nmero, uma string ou uma referncia. declarada com um '$', como:
$num
$joe
$pointer
Array: um conjunto sequencial ordenado de escalares. O ndice inicial de uma varivel array zero (0).
declarada com um '@', como:
@v
@list
@variable
Hash: Um hash, ou array associativo, um mapeamento (ou seja, chaves de referncias) de strings para escalares.
Representa uma coleo de pares de chave/valor. So declarados com um '%', como:
%people
%x
%this_is_a_hash
Handle: um mapeamento para um arquivo, dispositivo ou pipe, que aberto para leitura, escrita, ou ambos
Perl
206
Sub-rotina: um trecho de cdigo que pode ser executado, para o qual podem ser passados argumentos, e do qual
podem ser recebidos resultados
Exemplos de cdigo
A primeira linha de um cdigo em Perl deve sempre comear com o shebang:
#!/usr/bin/perl
Esta linha informa onde est localizado o compilador do Perl e pode variar de sistema para sistema.
Programa Ol Mundo!
#!/usr/bin/perl
print "Ol, Mundo!\n";
Comentrio
# Isto um comentrio em Perl
Note o ponto-e-vrgula no final de cada expresso. Assim como em C e C++, Perl exige que o usemos para indicar o
final de uma expresso. A ltima linha a que apaga o arquivo. unlink equivale a 'rm' e $0 uma referncia simples
ao arquivo que est sendo executado.
Expresso regular - Filtro
Um dos pontos fortes de Perl o eficiente uso de expresses regulares no tratamento de textos e arquivos.
Identificamos essas expresses pelos delimitadores "/.../", ou seja, tudo o que estiver entre essas barras ser tratado
como um pattern (padro) para ser encontrado em determinado texto. O programa a seguir l um texto e busca
exatamente a expresso "foo":
while(<>) {
/foo/;
print;
}
Assim como as expresses regulares de Linguagens Regulares, Perl admite alguns smbolos especiais que facilitam a
descrio de um padro. So eles:
"."
"*"
"?"
"+"
"[" e "]"
"(" e ")"
"{" e "}"
"^"
"$"
"|"
"\"
Se quisermos utilizar o real significado de um desses smbolos, basta colocarmos uma barra invertida exatamente
antes do mesmo.
O cdigo abaixo busca o padro assim descrito: nenhum ou muitos '+' seguido de um ou nenhum 'b'
Perl
207
while (<>) {
/\+*b?/
print;
}
possvel obter o mesmo resultado com uma nica linha (um "one-liner"):
perl -pi -e '/\+*b?/' arquivo.txt
De fato, comum a ocorrncia de problemas que exigem dezenas de linhas em outras linguagens de programao
mas que podem ser resolvidos com uma nica linha de cdigo em Perl, especialmente na rea de ETL.
Estruturas de controle
Perl tem as estruturas bsicas esperadas em qualquer linguagem de programao:
if
while
for
until
Perl tira boas idias de linguagens naturais, como a possibilidade de inverter a ordem dos elementos em uma frase.
Por exemplo:
if ($DEBUG) {
print "ouch!";
}
Pode ser reescrita como:
print "ouch!" if $DEBUG;
Mdulos e frameworks
Perl conseguiu reunir mdulos, classes, scripts e frameworks desenvolvidos pela comunidade em um s lugar, este
lugar chama-se CPAN, repositrio onde encontra-se quase tudo j desenvolvido para a linguagem:
Catalyst (software) - Framework MVC para aplicaes Web
DBIx::Class - Modelo de mapeamento Objeto Relacional
Template Toolkit - Sistema de processamento de templates
WWW::Mechanize - Simula um navegaror Web em um objeto Perl
POE - Framework para aplicaes multitarefa e em rede portveis
Perl
208
Interpretador Perl
Se voc est num sistema Linux (ou a maioria dos sistemas UNIX, incluindo Mac Os X), provavelmente j h uma
instalao do compilador Perl includa no seu sistema. Digite o seguinte comando no terminal para descobrir qual
verso voc tem instalada:
perl -v
Aplicaes
TWiki - Sistema Wiki de escrita de contedo colaborativo
RT - Sistema de processamento de Tickets
Apache Spam Assassin - Sistema extensvel de filtro de Spam em email
dvd::rip - Programa para cpias de DVD
AWStats - "Advanced Web Statistics" (AWStats) um sistema de anlise de logs de servidores Web e de gerao
de estatsticas
Comunidade
Um dos pontos mais fortes da linguagem Perl a comunidade de usurios em todo o mundo. Segundo a tradio
internacional, esses grupos so denominados Perl Mongers.
Um grande ponto de encontro da comunidade o YAPC. YAPCs so encontros promovidos pela comunidade para
discutir coisas sobre Perl, os encontros podem ter carter regional ou nacional. No Brasil ocorre uma vez por ano o
YAPC::Brasil "Encontro Brasileiro de Programadores Perl". Em 2009 o YAPC::Brasil aconteceu de 29 de outubro a
1 de novembro em Niteri, Rio de Janeiro
[2]
. Em 2010 o evento ocorreu de 25 a 31 de outubro em Fortaleza,
Cear
[3]
. Em 2013, o evento ocorrer nos dias 15 e 16 de Novembro, na cidade de Curitiba, Paran.
[1] http:/ / www. perl. org/
[2] Site do YAPC::Brasil 2009 (http:/ / www. yapcbrasil.org. br/ 2009)
[3] Site do YAPC::Brasil 2010 (http:/ / www. yapcbrasil.org. br/ 2010)
Bibliografia
Livro: PERL Guia de Consulta Rpida, Autor: Dcio Jr., Editora Novatec, ISBN 85-85184-80-9
Ligaes externas
Pgina oficial (http:/ / www. perl. org/ ) (em ingls)
Documentao da linguagem (http:/ / perldoc. perl. org/ ) (em ingls)
Introduo Linguagem Perl (http:/ / www. perl. org. br/ Perldoc/ V500807/ Perlintro) (em portugus)
Pgina da comunidade Perl em Portugal (http:/ / perl. pt/ ) (em portugus)
Pgina do Perl no Brasil (http:/ / perl. org. br) (em portugus brasileiro)
Timeline da Linguagem Perl (http:/ / embed. verite. co/ timeline/
?source=0Amb3R5QS8hjQdHp5YnBRT1B6bUptaUFneUxXVmhMQlE& font=Bevan-PotanoSans&
maptype=toner& lang=pt-br& height=650) (em portugus brasileiro)
Tutorial Perl Maven em Portugus (http:/ / br. perlmaven. com/ ) (em portugus brasileiro)
FL
209
FL
FL
Surgido em 1989
Criado por John Backus, John Williams, Edward Wimmers
Influenciada por FP
Influenciou J
FL (de Function Level) uma linguagem de programao criada no Almaden IBM Research Center por John
Backus, John Williams, e Wimmers Edward em 1989.
FL foi concebido como um sucessor da linguagem de programao anterior FP de Backus, proporcionando um apoio
especfico para o que denominou Backus funo da programao de nvel.
FL uma linguagem de tipagem dinmica, rigorosamente funcional, com uma semntica de lanar e capturar
excees bem parecida com a linguagem ML. Cada funo tem um argumento histrico implcito que usado para
fazer coisas como entradas/sadas estritamente funcionais, mas tambm utilizado para efetuar ligaes com cdigos
em linguagem C. Para fazer otimizaes, existe um sistema de tipagem que uma extenso do mecanismo de
inferncia de tipos de Hindley-Milner. Muitas das idias da linguagem, j foram implementadas na linguagem J de
Kenneth E. Iverson.
Referncias externas
The FL Project: Design of a Functional Language
[1]
(postscript)
Referncias
[1] http:/ / theory. stanford. edu/ ~aiken/ publications/ trs/ FLProject. pdf
210
Os anos 90 - linguagens multiparadigma
Dylan
Dylan
Paradigma Multiparadigma
Surgido em Incio dos anos 1990s
Criado por Apple Computer
Estilo de tipagem: dinmica, forte
Compiladores Open Dylan
Influenciada por ALGOL, Scheme
Influenciou Ruby
Dylan uma linguagem de programao Multiparadigma criada pela Apple Computer.
Histria
A Linguagem DYLAN foi criada nos anos 90 pela Apple Computer, nome vem da juno de DYNAMIC
LANGUAGE (Linguagem Dinmica), para ser implementada ao projeto Newton MessagePad da Apple. Pode-se
utilizar programao funcional (clculos matemticos) e orientada objeto Porm o projeto no atingiu maturidade
suficiente para ser implementado no prazo e em 1995 a Apple substitui DYLAN por uma mistura de C e
NewtonScript em seu tablet. A Apple acabou disponibilizando uma verso da linguagem para uso livre, alm do
manual de refrencia do Dylan escrito por (David Moon e Orca Starbcuk). A partir desse momento, a Harlequin
(Empresa de Software) lanou uma IDE Dylan comercial para Microsoft Windows e Carnegie Mellon University
lanou um compilador de cdigo aberto para o sistema Unix. Aps o fechamento e diviso da Harlequin, surgiu uma
comunidade forte de cdigo aberto em 2003, responsvel por reviver o Dylan, elaborando o projeto e compilador
Opendylan, disponvel no site http:/ / opendylan. org.
Exemplos de cdigo
Hello world
module: hello
format-out("Hello, world\n");
Bibliografia
Feinberg, Neal; Keene, Sonya E.; Mathews, Robert O.; Withington, P. Tucker. Dylan Programming.
Massachusetts:Addison Wesley, 1997.412 p. ISBN 0-201-47976-1
Dylan
211
Ligaes externas
Manual de referncia (http:/ / www. opendylan. org/ books/ drm/ )
Tutorial (http:/ / www. opendylan. org/ gdref/ tutorial/ )
Haskell
Haskell
Paradigma funcional, no rgida, modular
Surgido em 1990
Criado por
Simon Peyton-Jones, Paul Hudak,
[1]
Philip Wadler, et al.
Estilo de tipagem: forte, esttica, inferida
Compiladores GHC, Hugs, nhc
Dialetos: Helium, O'Haskell, Template Haskell, PolyP
Influenciada por Miranda, ML
Influenciou C, Cat, Clojure, F, Python, Scala
Haskell uma linguagem de programao puramente funcional, de propsito geral, nomeada em homenagem ao
lgico Haskell Curry. Como uma linguagem funcional, a estrutura de controle primria a funo; a linguagem
baseada nas observaes de Haskell Curry
[2]
e seus descendentes intelectuais.
[3]
Seu ltimo padro semi-oficial o
Haskell 98, destinado a especificar uma verso mnima e portvel da linguagem para o ensino e como base para
futuras extenses.
Histria
O conceito de avaliao preguiosa j estava difundido no meio acadmico desde o final da dcada de 1970.
Esforos nessa rea incluam tcnicas de reduo de grafo e a possibilidade de uma mudana radical na arquitetura
de von Neumann.
[4]
Aps o lanamento de Miranda em 1985, diversas outras linguagens funcionais de semntica
no rgida proliferaram, como Lazy ML, Orwell, Alfl, Id, Clean, Ponder e Daisy (um dialeto de Lisp). Mesmo aps
dois anos, Miranda ainda era a mais usada, mas no estava em domnio pblico.
Em setembro 1987 foi realizada uma conferncia Functional Programming Languages and Computer Architecture
(FPCA '87), em Oregon, o consenso foi a criao de um comit com o objetivo de construir um padro aberto para
tais linguagens.
[5]
Isso consolidaria as linguagens existentes, servindo como base para pesquisas futuras no
desenvolvimento de linguagens. A primeira reunio do comit foi realizada em janeiro de 1988, e algumas das metas
da linguagem foram discutidas. A linguagem deveria ser de fcil ensino, deveria ser completamente descrita atravs
de uma sintaxe e semntica formal, deveria estar disponvel livremente.
A primeira verso de Haskell foi definida em 1 de abril de 1990. Seguiu-se a verso 1.1 em agosto de ano seguinte, a
verso 1.2 em maro de 1992, a verso 1.3 em maio de 1996 e a verso 1.4 em abril de 1997.
[6]
Esforos posteriores
culminaram no Haskell 98, publicado em janeiro de 1999 e que especifica uma verso mnima, estvel e portvel da
linguagem e a biblioteca para ensino. Esse padro sofreu uma reviso em janeiro de 2003.
Haskell
212
A linguagem continua evoluindo, sendo as implementaes Hugs e GHC consideradas os padres de facto. A partir
de 2006 comeou o processo de definio de um sucessor do padro 98, conhecido informalmente por Haskell
("Haskell Prime").
Caractersticas
Caractersticas do Haskell incluem o suporte a funes recursivas e tipos de dados, casamento de padres, list
comprehensions, guard statements e avaliao preguiosa, esta, um elo em comum entre os diversos grupos de
desenvolvimento da linguagem.
[7]
A combinao destas caractersticas pode fazer com que a construo de funes
que seriam complexas em uma linguagem procedimental de programao tornem-se uma tarefa quase trivial em
Haskell. Segundo dados de 2002, a linguagem funcional sobre a qual mais pesquisa est sendo realizada. Muitas
variantes tem sido desenvolvidas: verses paralelizveis do MIT e Glasgow, ambas chamadas Parallel Haskell,
outras verses paralelas e distribudas chamadas Distributed Haskell (anteriormente Goffin) e Eden, uma verso
chamada Eager Haskell e vrias verses orientadas a objetos: Haskell++, O'Haskell e Mondrian.
Uma verso educacional do Haskell chamada Gofer foi desenvolvida por Mark Jones. Ela oferecida pelo HUGS.
Existe tambm uma verso do Haskell que permite orientao a aspectos (POA), chamada AspectH.
Sintaxe
Em Haskell existem apenas funes, e todas as funes so unrias. O que, em outras linguagens de programao
seriam funes binrias, ternrias, etc, em Haskell so funes cujo valor de retorno so outras funes - o que se
chama currying, termo derivado de Haskell Curry.
Uma funo que, dados dois nmeros, retorna sua soma poderia ser declarada como:
soma x y =x+y
O que parece ser uma funo binria , logicamente, uma funo unria (soma, cuja entrada x) que retorna outra
funo. Em outras palavras, soma x a funo unria que, dado y retorna x + y, e soma a funo unria que, dado
x, retorna x +.
Em Haskell no existem variveis globais, apenas funes e variveis locais, definidas dentro do escopo de cada
funo.
Tambm no h estruturas de loop, ou instrues do tipo goto.
O if implementado atravs de |, que significa a restrio do domnio do argumento da funo.
O exemplo abaixo mostra uma implementao do fatorial que usa a recursividade e o if:
fat 0 = 1
fat n | n > 0 = n*fat(n-1)
Em palavras: a primeira linha diz que o fatorial de zero um; a segunda linha diz que o fatorial de um nmero n
qualquer, desde que n seja maior que zero, pode ser calculado a partir do fatorial de (n-1). Esta implementao no
eficiente, mas serve como exemplo didtico.
Listas
H duas funcionalidades importantes para a construo de listas. A primeira a list comprehension, que permite
construir listas sob forma de conjuntos. Por exemplo, o cdigo [ x | x <- [0..], x^2>3 ] cria uma lista
de elementos x a partir do gerador <- [0..] (o conjunto dos nmeros naturais), que atendam o predicado
x^2>3 (o smbolo <- representa o pertence, , da teoria dos conjuntos). Pode-se combinar geradores numa mesma
list comprehension.
Haskell
213
A segunda funcionalidade a sequncia aritmtica, que permite construir listas sob forma de intervalos. Por
exemplo, o cdigo [2..10] cria uma lista de inteiros de 2 a 10. Pode-se omitir o fim do intervalo; [2..] gera
uma lista infinita de inteiros a partir de 2.
H trs funes primordiais sobre listas em Haskell, das quais outras funes podem ser combinadas.
[8]
A primeira
foldl, que adiciona um operador dado entre cada elemento da lista, retornando o resultado da expresso gerada.
Para concatenar uma lista de cadeias de caracteres cadeia = ["Uma", " ", "cadeia"] pode-se usar
foldr1 (++) cadeia. A segunda map, que executa uma funo a todos os elementos da lista, retornando uma
nova lista. A terceira filter, que filtra a lista a partir de um predicado.
Tipos de dado
A tipagem de Haskell forte. Cada expresso possui um tipo, e possvel obt-lo em tempo de compilao atravs
de inferncia de tipo. Os tipos bsicos da linguagem incluem:
Tipo de
dado
Descrio Classes Exemplo da sintaxe
Bool Enumerao de valores booleanos, que permitem certas operaes
lgicas, como conjuno (&&), disjuno (||) e negao (not).
Read, Show,
Eq, Ord, Enum,
Bounded
True
False
Char Enumerao de caracteres 16-bit, Unicode. A faixa dos primeiro 128
caracteres idntica ao ASCII.
Read, Show,
Eq, Ord, Enum,
and Bounded
'a'
Double Ponto flutuante com maior intervalo e preciso que Float RealFloat
Either Eq, Ord, Read,
Show
Float Ponto flutuante RealFloat 6553.612
321.6e-3
IO Tipo abstrato para operaes de E/S, como putStr, print, getChar,
getLine e readIO.
Monad, Functor
IOError Tipo abstrato para erros nas operaes de E/S com IO. Show, Eq
Int Inteiro que cobre, pelo menos, o intervalo de valores [-2^29, 2^29 - 1]. Integral 123
Integer Inteiro de preciso ilimitada, com as mesmas funes e operadores de
Int
Integral 123
Maybe Lida com valores opcionais ou ilegais sem terminar o programa e sem
usar o IOError de IO.
Eq, Ord, Read,
Show
Ordering Eq, Ord,
Bounded,
Enum, Read,
Show
String Cadeia de caracteres, representada sob forma de lista de Char. A sintaxe
tanto pode ser de lista quanto a abreviao, entre aspas.
"Texto"
['T','e','x','t','o']
Tuplas
Tipo de dado algbrico de definio de registros heterogneos, tuplas. A
quantidade mxima de elementos depende da implementao, mas a
quantidade mnima de quinze elementos sempre garantida.
[9]
Eq, Ord,
Bounded, Read,
Show
('A',11,True)
Listas Tipo de dado algbrico de definio de registros homogneos listas. Entre
os operadores disponveis encontra-se !!, que retorna o n-simo
elemento da lista, e ++, que concatena duas listas distintas de mesmo tipo.
Relacionado a concatenao, h o operador :, que adiciona um elemento
no topo de uma lista.
Eq, Ord [1,2,3,4]
[1..4]
(1:(2:(3:(4:[]))))
Haskell
214
A linguagem ainda define diversas classes padro:
Tipo de dado Descrio Prove
Bounded Delimita um tipo de dado
Enum Prove operaes em tipo sequencialmente ordenados. succ, pred, toEnum, enumFrom
Eq Prove operadores de igualdade. ==, /=
Floating
Fractional
Functor Usado por tipos que podem ser mapeados.
Integral
Ord Prove operadores de ordenao. , <, >=, >
Monad Prove operaes sobre mnadas.
MonadPlus
Num
Read
Real
RealFloat
RealFrac
Show
Operadores
Alm dos operadores especficos de certos tipos de dado supracitados, vale notar tambm alguns outros. O operador
. realiza a composio de funes. Por exemplo, a expresso ((2+).(3*).(4-)) 2 retorna 8, e significa
.
A potenciao pode ser feita atravs do operador **. Entretanto esto disponveis tambm duas verses mais
eficientes. Para ^^, o expoente deve ser um inteiro; para ^, o expoente deve ser um inteiro no negativo.
Aplicaes
Os pontos fortes da linguagem Haskell tm sido bem aplicados em alguns projetos. cada vez mais utilizada em
aplicaes comerciais. O compilador e interpretador Pugs criado por Audrey Tang uma verso completa da
linguagem Perl 6. Darcs um sistema de controle de verses baseado em mudanas (change-based) com vrias
caractersticas inovadoras. A Linspire GNU / Linux escolheu Haskell para desenvolvimento das ferramentas do
sistema . Xmonad um gerenciador de janelas "tile-based" para o X Window System escrito inteiramente em
Haskell. Bluespec SystemVerilog uma linguagem feita como uma extenso do Haskell.
Haskell
215
Exemplos
O difundido caso do Programa Ol Mundo pode ser exemplificado em Haskell da seguinte forma:
olamundo :: IO()
olamundo = putStrLn "Ol, Mundo!"
A clssica definio da funo fatorial:
fatorial :: Integer -> Integer
fatorial 0 = 1
fatorial n | n > 0 = n * fatorial (n-1)
Ou em uma linha:
fatorial n = if n > 0 then n * fatorial (n-1) else 1
Este artigo descreve o fatorial como uma funo recursiva, terminando com um caso que serve como base.
semelhante ao encontrado nas descries de fatoriais em livros didticos de matemtica. Grande parte do cdigo
Haskell semelhante ao padro da notao matemtica na potencialidade expressiva e na sintaxe. A primeira linha
da funo fatorial descreve os tipos desta funo; embora seja opcional, considerado bom estilo
[10]
inclu-la. Ela
pode ser lida como a funo fatorial (fatorial) tem tipo (::) inteiro para inteiro (Integer -> Integer). Ou seja, ele tem
um inteiro como um argumento e retorna outro inteiro. O tipo de uma definio inferido automaticamente se o
programador no forneceu uma notao de tipo.
A segunda linha depende de um casamento de padres (pattern matching), uma caracterstica importante do Haskell.
Note que os parmetros da funo so separados por parnteses e no por espaos. Quando o argumento da funo
0 (zero) ser devolvido o inteiro 1 (um). Para todos os outros casos, a terceira linha tentada. Esta a recursividade,
e executa a funo novamente at que um caso que sirva como base seja atingido.
Um "guard" protege a terceira linha de nmeros negativos, sendo que um fatorial no permite nmeros negativos,
indefinido-o. Sem um "guard" essa funo seria recursiva "fatorando" todos os nmeros negativos, sem nunca chegar
base 0. Se um inteiro negativo passado para o fatorial funcionar como um argumento, o programa ir falhar com
um erro "runtime". De ltimo caso, poderia ser tratada esta condio de erro e imprimir uma mensagem de erro
adequada em seu lugar.
A descrio acima parecida com as descries matemtica, tais como definies de uma funo e no
como uma atribuio de um valor numrico para uma varivel.
Uma outra definio da funo fatorial (usando uma notao de lista em Haskell e a funo padro product):
fatorial n = product [1..n]
A mesma funo mas agora no estilo point-free. Repare-se que os argumentos desaparecem (o ponto significa
composio de funes):
fatorial = product . enumFromTo 1
Uma implementao da funo que retorna o n-simo termo na seqncia de Fibonacci:
fib 0 = 0
fib 1 = 1
fib n = fib (n - 2) + fib (n - 1)
Uma funo que retorna uma lista dos nmeros de Fibonacci:
fibs@(_:rest) = 0 : 1 : (zipWith (+) fibs rest)
Haskell
216
A funo anterior cria uma lista infinita, que possvel graas a avaliao preguiosa. Poderia-se implementar fib
como:
fib n = fibs !! n
O algoritmo quicksort pode ser elegantemente escrito em Haskell:
qsort [] = []
qsort (h:t) = qsort menores_que_h ++ [h] ++ qsort maiores_que_h
where
menores_que_h = [x | x <- t, x < h]
maiores_que_h = [x | x <- t, x >= h]
Uma forma mais compacta desse mesmo algoritmo seria:
quicksort [] = []
quicksort (s:xs) = quicksort [x|x <- xs,x < s] ++ [s] ++ quicksort [x|x <- xs,x >= s]
Nota: Por causa das excessivas cpias e concatenaes de listas, este cdigo pode ser lento.
Aqui tem um exemplo de Nmeros Perfeitos:
divisor x d | mod(x d)==0=n
| otherwise=0
soma_d _ 1 =1
soma_d 1 _ =1
soma_d n x = divisor(n x)+soma_d(n-1 x)
NP 0 _ = []
NP n x |soma_d(x/2 x)== x=(x:NP(n-1 x+1)
|otherwise=NP(n x+1)
Implementaes
As seguintes implementaes esto totalmente, ou quase, de acordo com o padro Haskell 98. Todas so distribudas
sob licenas cdigo aberto.
GHC. O Glasgow Haskell Compiler gera cdigo nativo de diferentes arquitecturas e pode tambm gerar cdigo C.
Ele provavelmente o mais popular compilador Haskell, e algumas bibliotecas (como bindings para OpenGL)
funcionam apenas com ele.
Hugs um interpretador de bytecode. Oferece rpida compilao dos programas e razovel velocidade de
execuo. Tambm dispe de uma simples biblioteca grfica. Hugs ideal para pessoas que esto aprendendo os
bsicos de Haskell. a mais portvel e leve das implementaes de Haskell.
nhc98 outro compilador que gera bytecode. O bytecode resultante executa significativamente mais rpido do
que o equivalente do Hugs. Nhc98 foca na minimizao do uso de memria, e uma boa escolha para mquinas
velhas/lentas.
HBC outro compilador Haskell para cdigo nativo. Seu desenvolvimento no est ativo, mas ele funcional.
Helium um novo dialecto do Haskell. O foco na facilidade de aprendizado. Actualmente carece de typeclasses,
tornando-o incompatvel com muitos programas Haskell.
Haskell
217
Leitura adicional
Pgina do livro: Haskell: Uma Abordagem Prtica
[11]
, um livro de nvel introdutrio a mdio sobre a linguagem
Haskell, com uma apresentao crescente as principais caractersticas da linguagem.
[1] Stio de Paul Hudak (http:/ / www. cs.yale. edu/ homes/ hudak-paul/ )
[2] [2] , with 2 sections by William Craig, see paragraph 9E
[3] De Bruijn, Nicolaas (1968), Automath, a language for mathematics, Department of Mathematics, Eindhoven University of Technology,
TH-report 68-WSK-05. Reprinted in revised form, with two pages commentary, in: Automation and Reasoning, vol 2, Classical papers on
computational logic 1967-1970, Springer Verlag, 1983, pp. 159-200.
[4] [4] Hudak 2007, p. 2
[5] [5] Hudak 2007, p. 3
[6] [6] Hudak 2007, p. 5
[7] [7] Hudak 2007, p. 8
[8] [8] Du Bois
[9] [9] The Haskell 98 Report, s. 6.1.4
[10] HaskellWiki: Type signatures as good style (http:/ / www. haskell. org/ haskellwiki/ Type_signatures_as_good_style)
[11] http:/ / www2.joinville. udesc.br/ ~coca/ index.php/ Main/ PaginaDoLivroDeHaskell
Referncias bibliogrficas
Naomi Hamilton (19 de setembro de 2008). The A-Z of Programming Languages: Haskell (http:/ / www.
computerworld. com. au/ index. php/ id;1974033854;fp;;fpid;;pf;1) (em ingls). Computerworld. Pgina visitada
em 29 de setembro de 2008.
Paul Hudak, John Hughes, Simon Peyton Jones, Philip Wadler (16 de abril de 2007). A History of Haskell: Being
Lazy With Class (http:/ / research. microsoft. com/ ~simonpj/ papers/ history-of-haskell/ history. pdf) (em ingls).
Third ACM SIGPLAN History of Programming Languages Conference (HOPL-III). Pgina visitada em 29 de
setembro de 2008.
Andr Rauber Du Bois. Programao Funcional com a Linguagem Haskell (http:/ / www. macs. hw. ac. uk/
~dubois/ ProgramacaoHaskell. pdf) (em ingls). Universidade de Heriot-Watt. Pgina visitada em 30 de setembro
de 2008.
The Haskell 98 Report: Predefined Types and Classes (http:/ / www. haskell. org/ onlinereport/ basic. html) (em
ingls). Stio oficial (Dezembro de 2002). Pgina visitada em 30 de setembro de 2008.
Ligaes externas
Pgina oficial (http:/ / www. haskell. org) (em ingls)
Introduo ao Haskell 98 (http:/ / www. haskell. org/ tutorial/ haskell-98-tutorial. pdf) (em ingls)
Outros exemplos de cdigos em Haskell (http:/ / www. ntecs. de/ old-hp/ uu9r/ lang/ html/ haskell. en. html) (em
ingls)
Tutorial, em http:/ / www. lisperati. com/ haskell/ (http:/ / www. lisperati. com/ haskell/ ) (em ingls)
Python
218
Python
Python
Paradigma Multiparadigma:
Orientao a objetos
Programao imperativa
Programao funcional
Surgido em 1991
ltima verso 3.3.3 (19 de novembro de 2013)
Verso em teste 3.4.0b3 (26 de janeiro de 2014)
Criado por Guido van Rossum
Estilo de tipagem: Dinmica, forte
Dialetos: CPython, IronPython, Jython, PyPy
Influenciada por ABC, ALGOL 68, C, Haskell, Icon, Java, Lisp, Modula-3, Perl, Smalltalk
Influenciou Boo, D, Falcon, Fantom, Groovy, JavaScript, Nimrod, Py, Ruby, Squirrel
Pgina oficial
www.python.org
[1]
Python uma linguagem de programao de alto nvel, interpretada, imperativa, orientada a objetos, funcional, de
tipagem dinmica e forte. Foi lanada por Guido van Rossum em 1991. Atualmente possui um modelo de
desenvolvimento comunitrio, aberto e gerenciado pela organizao sem fins lucrativos Python Software
Foundation. Apesar de vrias partes da linguagem possurem padres e especificaes formais, a linguagem como
um todo no formalmente especificada. O padro de facto a implementao CPython.
A linguagem foi projetada com a filosofia de enfatizar a importncia do esforo do programador sobre o esforo
computacional. Prioriza a legibilidade do cdigo sobre a velocidade ou expressividade. Combina uma sintaxe
concisa e clara com os recursos poderosos de sua biblioteca padro e por mdulos e frameworks desenvolvidos por
terceiros.
O nome Python teve a sua origem no grupo humorstico britnico Monty Python, criador do programa Monty
Python's Flying Circus, embora muitas pessoas faam associao com o rptil do mesmo nome (em portugus, pton
ou pito).
Python
219
Histria
Guido van Rossum, So Francisco, Califrnia
Python foi concebido no final de 1989 por Guido van
Rossum no Instituto de Pesquisa Nacional para
Matemtica e Cincia da Computao (CWI), nos
Pases Baixos, como um sucessor da ABC capaz de
tratar excees e prover interface com o sistema
operacional Amoeba atravs de scripts. Tambm da
CWI, a linguagem ABC era mais produtiva que C,
ainda que com o custo do desempenho em tempo de
execuo. Mas ela no possua funcionalidades
importantes para a interao com o sistema
operacional, uma necessidade do grupo. Um dos focos
primordiais de Python era aumentar a produtividade do
programador.
Em 1991, Guido publicou o cdigo (nomeado verso 0.9.0) no grupo de discusso alt.sources. Nessa verso j
estavam presentes classes com herana, tratamento de excees, funes e os tipos de dado nativos list, dict,
str, e assim por diante. Tambm estava presente nessa verso um sistema de mdulos emprestado do Modula-3. O
modelo de excees tambm lembrava muito o do Modula-3, com a adio da opo else clause. Em 1994 foi
formado o principal frum de discusso do Python, comp.lang.python, um marco para o crescimento da base de
usurios da linguagem.
A verso 1.0 foi lanada em janeiro de 1994. Novas funcionalidades incluam ferramentas para programao
funcional como lambda, map, filter e reduce. A ltima verso enquanto Guido estava na CWI foi o Python
1.2. Em 1995, ele continuou o trabalho no CNRI em Reston, Estados Unidos, de onde lanou diversas verses. Na
verso 1.4 a linguagem ganhou parmetros nomeados (a capacidade de passar parmetro pelo nome e no pela
posio na lista de parmetros) e suporte nativo a nmeros complexos, assim como uma forma de encapsulamento.
Ainda na CNRI, Guido lanou a iniciativa Computer Programming for Everybody (CP4E; literalmente,
"Programao de Computadores para Todos"), que visava tornar a programao mais acessvel, um projeto
financiado pela DARPA. Atualmente o CP4E encontra-se inativo.
Em 2000, o time de desenvolvimento da linguagem se mudou para a BeOpen a fim de formar o time PythonLabs. A
CNRI pediu que a verso 1.6 fosse lanada, para marcar o fim de desenvolvimento da linguagem naquele local. O
nico lanamento na BeOpen foi o Python 2.0, e aps o lanamento o grupo de desenvolvedores da PythonLabs
agrupou-se na Digital Creations.
Python 2.0 implementou list comprehension, uma relevante funcionalidade de linguagens funcionais como SETL e
Haskell. A sintaxe da linguagem para essa construo bastante similar a de Haskell, exceto pela preferncia do
Haskell por caracteres de pontuao e da preferncia do python por palavras reservadas alfabticas. Essa verso 2.0
tambm introduziu um sistema coletor de lixo capaz de identificar e tratar ciclos de referncias.
J o 1.6 incluiu uma licena CNRI substancialmente mais longa que a licena CWI que estavam usando nas verses
anteriores. Entre outras mudanas, essa licena inclua uma clusula atestando que a licena era governada pelas leis
da Virgnia. A Free Software Foundation alegou que isso era incompatvel com a GNU GPL. Tanto BeOpen quanto
CNRI e FSF negociaram uma mudana na licena livre do Python que o tornaria compatvel com a GPL. Python
1.6.1 idntico ao 1.6.0, exceto por pequenas correes de falhas e uma licena nova, compatvel com a GPL.
Python 2.1 era parecido com as verses 1.6.1 e 2.0. Sua licena foi renomeada para Python Software Foundation
License. Todo cdigo, documentao e especificao desde o lanamento da verso alfa da 2.1 propriedade da
Python Software Foundation (PSF), uma organizao sem fins lucrativos fundada em 2001, um modelo tal qual da
Apache Software Foundation. O lanamento incluiu a mudana na especificao para suportar escopo aninhado,
Python
220
assim como outras linguagens com escopo esttico. Esta funcionalidade estava desativada por padro, e somente foi
requerida na verso 2.2.
Uma grande inovao da verso 2.2 foi a unificao dos tipos Python (escritos em C) e classes (escritas em Python)
em somente uma hierarquia. Isto tornou o modelo de objetos do Python consistentemente orientado a objeto.
Tambm foi adicionado generator, inspirado em Icon.
O incremento da biblioteca padro e as escolhas sintticas foram fortemente influenciadas por Java em alguns casos:
o pacote logging introduzido na verso 2.3, o analisador sinttico SAX, introduzido na verso 2.0 e a sintaxe de
decoradores que usa @, adicionadas na verso 2.4.
Em 1 de outubro de 2008 foi lanada a verso 2.6, j visando a transio para a verso 3.0 da linguagem. Entre
outras modificaes, foram includas bibliotecas para multiprocessamento, JSON e E/S, alm de uma nova forma de
formatao de cadeias de caracteres.
Atualmente a linguagem usada em diversas reas, como servidores de aplicao e computao grfica. Est
disponvel como linguagem de script em aplicaes como OpenOffice (Python UNO Bridge), Blender e pode ser
utilizada em procedimentos armazenados no sistema gerenciador de banco de dados PostgreSQL (PL/Python).
A terceira verso da linguagem foi lanada em dezembro de 2008, chamada Python 3.0 ou Python 3000. Com
noticiado desde antes de seu lanamento, houve quebra de compatibilidade com a famlia 2.x para corrigir falhas que
foram descobertas neste padro, e para limpar os excessos das verses anteriores. A primeira verso alfa foi lanada
em 31 de agosto de 2007, a segunda em 7 de dezembro do mesmo ano.
Mudanas da verso incluem a alterao da palavra reservada print, que passa a ser uma funo, tornando mais
fcil a utilizao de uma verso alternativa da rotina. Em Python 2.6, isso j est disponvel ao adicionar o cdigo
from __future__ import print_function. Tambm, a mudana para Unicode de todas as cadeias de
caracteres.
Filosofia
Parte da cultura da linguagem gira ao redor de The Zen of Python, um poema que faz parte do documento "PEP 20
(The Zen of Python)", escrito pelo programador em Python de longa data Tim Peters, descrevendo sumariamente a
filosofia do Python. Pode-se v-lo atravs de um easter egg do Python pelo comando:
>>> import this
Caractersticas
Construes
Construes de Python incluem: estrutura de seleo (if, else, elif); estrutura de repetio (for, while),
que itera por um container, capturando cada elemento em uma varivel local dada; construo de classes (class);
construo de subrotinas (def); construo de escopo (with), como por exemplo para adquirir um recurso.
Tipos de dado
A tipagem de Python forte, pois os valores e objetos tm tipos bem definidos e no sofrem coeres como em C ou
Perl. So disponibilizados diversos tipos de dados nativos:
Python
221
Tipo de dado Descrio Exemplo da sintaxe
str, unicode Uma cadeia de caracteres imutvel 'Wikipedia', u'Wikipedia'
list Lista heterognea mutvel [4.0, 'string', True]
tuple Tupla imutvel (4.0, 'string', True)
set,
frozenset
Conjunto no ordenado, no contm elementos duplicados set([4.0, 'string', True])
frozenset([4.0, 'string',
True])
dict conjunto associativo {'key1': 1.0, 'key2':
False}
int Nmero de preciso fixa, transparentemente convertido para long caso
no caiba em um int.
42
2147483648L
float Ponto flutuante 3.1415927
complex Nmero complexo 3+2j
bool Booleano True ou False
Python tambm permite a definio dos tipos de dados prprios, atravs de classes. Instncias so construdas
invocando a classe (FooClass()), e as classes so instncia da classe type, o que permite metaprogramao e
reflexo. Mtodos so definidos como funes anexadas classe, e a sintaxe
instncia.mtodo(argumento) um atalho para Classe.mtodo(instncia, argumento). Os
mtodos devem referenciar explicitamente a referncia para o objeto incluindo o parmetro self como o primeiro
argumento do mtodo.
Antes da verso 3.0, Python possua dois tipos de classes: "old-style" e "new-style". Classes old-style foram
eliminadas no Python 3.0, e todas so new-style. Em verses entre 2.2 e 3.0, ambos tipos de classes podiam ser
usadas. A sintaxe de ambos estilos a mesma, a diferena acaba sendo de onde objeto da classe herdado, direta ou
indiretamente (todas classes new-style herdam de object e so instancias de type). As classes new-styles nada mais
so que tipos definidos pelo usurio.
Palavras reservadas
O Python 2.5.2 define as seguintes 31 palavras reservadas:
and del from not while
as elif global or with
assert else if pass yield
break except import print
class exec in raise
continue finally is return
def for lambda try
Operadores
Os operadores bsicos de comparao como ==, <, >=, entre outros so usados em todos os
tipos de dados, como nmeros, cadeias de texto, listas e mapeamentos.
Comparaes em cadeia como a < b < c possuem o mesmo significado bsico que na
matemtica: os termos so comparadas na ordem. garantido que o processamento
da expresso lgica ir terminar to cedo o veredito claro, o princpio da
avaliao mnima. Usando a expresso anterior, se a < b falso, c no
avaliado.
Python
222
Quanto aos operadores lgicos, at Python 2.2 no havia o tipo de dado booleano. Em todas as verses da linguagem
os operadores lgicos tratam "", 0, None, 0.0, [] e {} como falso, enquanto o restante tratado como
verdadeiro de modo geral. Na verso 2.2.1 as constantes True e False foram adicionadas (subclasses de 1 e 0
respectivamente). A comparao binria retorna uma das duas constantes acima.
Os operadores booleanos and e or tambm seguem a avaliao mnima. Por exemplo, y == 0 or x/y >
100 nunca lanar a exceo de diviso por zero.
Interpretador interativo
O interpretador interativo uma caracterstica diferencial da linguagem, porque h a possibilidade de testar o cdigo
de um programa e receber o resultado em tempo real, antes de iniciar a compilao ou inclu-las nos programas. Por
exemplo:
>>> 1+1
2
>>>
>>> a = 1+1
>>> print a
2
>>> print(a)
2
>>>
Anlise lxica
Exemplo de script
No segundo captulo do Manual de
Referncia da Linguagem Python citado
que a anlise lxica uma anlise do
interpretador em si, os programas so lidos
por um analisador sinttico que divide o
cdigo em tokens.
Todo programa dividido em linhas lgicas
que so separadas pelo token NEWLINE ou NOVA LINHA, as linhas fsicas so trechos de cdigo divididos pelo
caractere ENTER. Linhas lgicas no podem ultrapassar linhas fsicas com exceo de juno de linhas, por
exemplo:
if resultado > 2 and \
1 <= 5 and \
2 < 5:
print ('Resultado: %f' % d)
ou
MESES_DO_ANO = ['janeiro', 'fevereiro', 'maro',
'abril', 'maio', 'junho',
'julho', 'agosto', 'setembro',
'outubro', 'novembro', 'dezembro']
Para a delimitao de blocos de cdigos os delimitadores so colocados em uma pilha e diferenciados por sua
indentao. Iniciando a pilha com valor 0 (zero) e colocando valores maiores que os anteriores na pilha. Para cada
Python
223
comeo de linha, o nvel de indentao comparado com o valor do topo da pilha. Se o nmero da linha for igual ao
topo da pilha, a pilha no alterada. Se o valor for maior a pilha recebe o nvel de indentao da linha e o nome
INDENT (empilhamento) se o nvel de indentao for menor, ento desempilhado at chegar a um nvel de
indentao recebendo o nome DEDENT (desempilhamento) e se no encontrar nenhum valor gerado um erro de
indentao.
Abaixo um exemplo de permutao, retirado do captulo 2.1 sobre Estrutura de linhas na Anlise lxica do Manual
de Referncia da linguagem (Language Reference Manual):
def perm(l): NOVA LINHA
INDENT if len(l) <= 1: NOVA LINHA
INDENT return[1] NOVA LINHA
DEDENT r = [ ] NOVA LINHA
for i in range(len(l)): NOVA LINHA
INDENT s = l[:i] + l[i+1:] NOVA LINHA
p = perm(s) NOVA LINHA
DEDENT for x in p: NOVA LINHA
INDENT r.append(l[i:i+1]+x) NOVA LINHA
DEDENT return r
Indentao
Python foi desenvolvido para ser uma linguagem de fcil leitura, com um visual agradvel, frequentemente usando
palavras e no pontuaes como em outras linguagens. Para a separao de blocos de cdigo, a linguagem usa
espaos em branco e indentao ao invs de delimitadores visuais como chaves (C, Java) ou palavras (BASIC,
Fortran, Pascal). Diferente de linguagens com delimitadores visuais de blocos, em Python a indentao obrigatria.
O aumento da indentao indica o incio de um novo bloco, que termina da diminuio da indentao.
Usando um editor de texto comum muito fcil existir erros de indentao, o recomendado configurar o editor
conforme a anlise lxica do Python ou utilizar uma IDE. Todas as IDE que suportam a linguagem fazem indentao
automaticamente.
Exemplo:
Indentao correta
def valor1():
while True:
try:
c = int(raw_input('Primeiro Valor: '))
return c
except ValueError:
print 'Invlido!'
Indentao incorreta
def valor1():
while True:
try:
c = int(raw_input('Primeiro Valor: '))
return c
except ValueError:
print 'Invlido!'
O cdigo est correto para os dois exemplos, mas o analisador lxico verificar se a indentao est coerente. O
analisador reconhecer as palavras reservadas while, def, try, except, return, print e as cadeias de
caracteres entre aspas simples e a indentao, e se no houver problemas o programa executar normalmente, seno
apresentar a exceo: "Seu programa est com erro no bloco de indentao".
Python
224
Compilador de bytecode
A linguagem de altssimo nvel, como j dito, mas ela tambm pode compilar seus programas para que a prxima
vez que o executar no precise compilar novamente o programa, reduzindo o tempo de carga na execuo.
Utilizando o interpretador interativo no necessrio a criao do arquivo de Python compilado, os comandos so
executados interativamente. Porm quando um programa ou um mdulo evocado, o interpretador realiza a anlise
lxica e sinttica, compila o cdigo de alto nvel se necessrio e o executa na mquina virtual da linguagem.
O bytecode armazenado em arquivos com extenso .pyc ou .pyo, este ltimo no caso de bytecode otimizado.
Interessante notar que o bytecode da linguagem tambm de alto nvel, ou seja, mais legvel aos seres humanos
que o cdigo de byte do C, por exemplo. Para descompilar um cdigo de byte utilizado o mdulo dis da
biblioteca padro da linguagem e existem mdulos de terceiros que tornam o bytecode mais confuso, tornando a
descompilao ineficaz.
Normalmente, o Python trabalha com dois grupos de arquivos:
1. Os mdulos do ncleo da linguagem, sua biblioteca padro e os mdulos independentes, criados pelo usurio.
2. No ncleo do interpretador existe o analisador lxico, o analisador sinttico que utiliza Estruturas de Objetos
(tempo de execuo), o Compilador que aloca memria (tempo de execuo) e depois do Avaliador de cdigo
que modifica o estado atual do programa (tempo de execuo), mostrando resultado para o usurio.
Polimorfismo
O conceito de polimorfismo descreve como objetos podem ser manipulados e acessados usando atributos e
comportamentos em comum sem considerar sua classe especfica e indica a presena de late binding, permitindo
sobrecarga e determinao de tipos em tempo de execuo e verificao.
Muitas linguagens orientadas a objeto utilizam assinaturas de funo para determinar qual verso de um mtodo
sobrecarregado chamar. No entanto, as chamadas de funo em Python so universais ou genricas sem
determinao de tipo. Por isso, sobrecarga no suportada na linguagem.
Orientao a objetos
Python suporta a maioria das tcnicas da programao orientada a objeto. Qualquer objeto pode ser usado para
qualquer tipo, e o cdigo funcionar enquanto haja mtodos e atributos adequados. O conceito de objeto na
linguagem bastante abrangente: classes, funes, nmeros e mdulos so todos considerados objetos. Tambm h
suporte para metaclasses, polimorfismo, e herana (inclusive herana mltipla). H um suporte limitado para
variveis privadas.
Na verso 2.2 de Python foi introduzido um novo estilo de classes em que objetos e tipos foram unificados,
permitindo a especializao de tipos. J a partir da verso 2.3 foi introduzido um novo mtodo de resoluo de
ambiguidades para heranas mltiplas.
Uma classe definida com class nome:, e o cdigo seguinte a composio dos atributos. Todos os mtodos da
classe recebem uma referncia a uma instncia da prpria classe como seu primeiro argumento, e a conveno que
se chame este argumento self. Assim os mtodos so chamados objeto.mtodo(argumento1,
argumento2, ...) e so definidos iguais a uma funo, como mtodo(self, argumento1,
argumento2, ...). Veja que o parmetro self conter uma referncia para a
instncia da classe definida em objeto quando for efetuada esta chamada. Os
atributos da classe podem ser acessados em qualquer lugar da classe, e os
atributos de instncia (ou varivel de instncia) devem ser declarados dentro
dos mtodos utilizando a referncia instncia atual (self) (ver cdigo
contextualizado em anexo).
Python
225
Em Python no existe proteo dos membros duma classe ou instncia pelo interpretador, o chamado
encapsulamento. Convenciona-se que atributos com o nome comeando com um _ so de uso privado da classe, mas
no h um policiamento do interpretador contra acesso a estes atributos. Uma exceo so nomes comeando com
__, no caso em que o interpretador modifica o nome do atributo (ver cdigo contextualizado em anexo).
Python permite polimorfismo, que condiz com a reutilizao de cdigo. fato que funes semelhantes em vrias
partes do software sejam utilizadas vrias vezes, ento definimos esta funo como uma biblioteca e todas as outras
funes que precisarem desta a chamam sem a necessidade de reescrev-la (ver cdigo contextualizado em anexo).
Programao funcional
Uma das construes funcionais de Python compreenso de listas, uma forma de construir listas. Por exemplo,
pode-se usar a tcnica para calcular as cinco primeiras potncias de dois. O algoritmo quicksort tambm pode ser
expressado usando a mesma tcnica (ver cdigos contextualizados para ambos os casos em anexo).
Em Python, funes so objetos de primeira classe que podem ser criados e armazenados dinamicamente. O suporte
funes annimas est na construo lambda (clculo Lambda). No h disponibilidade de funes annimas de
fato, pois os lambdas contm somente expresses e no blocos de cdigo.
Python tambm suporta clausuras lxicas desde a verso 2.2 (ver cdigos contextualizados para ambos os casos em
anexo). J geradores foram introduzidos na verso 2.2 e finalizados na verso 2.3, e representam o mecanismo de
Python para a avaliao preguiosa de funes (ver cdigos contextualizados para ambos os casos em anexo).
Tratamento de excees
Python suporta e faz uso constante de tratamento de excees como uma forma de testar condies de erro e outros
eventos inesperados no programa. inclusive possvel capturar uma exceo causada por um erro de sintaxe. O
estilo da linguagem apia o uso de excees sempre que uma condio de erro pode aparecer. Por exemplo, ao invs
de testar a disponibilidade de acesso a um recurso, a conveno simplesmente tentar usar o recurso e capturar a
exceo caso o acesso seja rejeitado (recurso inexistente, permisso de acesso insuficiente, recurso j em uso, ...).
Excees so usadas frequentemente como uma estrutura de seleo, substituindo blocos if-else, especialmente
em situaes que envolvem threads. Uma conveno de codificao o EAFP, do ingls, " mais fcil pedir perdo
que permisso". Isso significa que em termos de desempenho prefervel capturar excees do que testar atributos
antes de os usar. Segue abaixo exemplos de cdigo que testam atributos ("pedem permisso") e que capturam
excees ("pedem perdo"):
Teste de atributo
if hasattr(spam, 'eggs'):
ham = spam.eggs
else:
handle_error()
Captura de exceo
try:
ham = spam.eggs
except AttributeError:
handle_error()
Ambos os cdigos produzem o mesmo efeito, mas h diferenas de desempenho. Quando spam possui o atributo
eggs, o cdigo que captura excees mais rpido. Caso contrrio, a captura da exceo representa uma perda
considervel de desempenho, e o cdigo que testa o atributo mais rpido. Na maioria dos casos o paradigma da
captura de excees mais rpido, e tambm pode evitar problemas de concorrncia. Por exemplo, num ambiente
multitarefa, o espao de tempo entre o teste do atributo e seu uso de fato pode invalidar o atributo, problema que no
acontece no caso da captura de excees.
Python
226
Biblioteca padro
Python possui uma grande biblioteca padro, geralmente citada como um dos maiores triunfos da linguagem,
fornecendo ferramentas para diversas tarefas. Recentemente, a biblioteca Boost do C++ incluiu uma biblioteca para
permitir a interoperabilidade entre as duas linguagens. Por conta da grande variedade de ferramentas fornecida pela
biblioteca padro, combinada com a a habilidade de usar linguagens de nvel mais baixo como C e C++, Python pode
ser poderosa para conectar componentes diversos de software.
A biblioteca padro conta com facilidades para escrever aplicaes para a Internet, contando com diversos formatos
e protocolos como MIME e HTTP. Tambm h mdulos para criar interfaces grficas, conectar em bancos de dados
relacionais e manipular expresses regulares.
Algumas partes da biblioteca so cobertas por especificaes (por exemplo, a implementao WSGI da wsgiref
segue o PEP 333), mas a maioria dos mdulos no segue.
Comentrios
Python fornece duas alternativas para documentar o cdigo. A primeira o uso de comentrios para indicar o que
certo cdigo faz. Comentrios comeam com # e so terminados pela quebra da linha. No h suporte para
comentrios que se estendem por mais de uma linha; cada linha consecutiva de comentrio deve indicar #. A
segunda alternativa o uso de cadeias de caractere, literais de texto inseridos no cdigo sem atribuio. Cadeias de
caracteres em Python so delimitadas por " ou ' para nica linha e por """ ou ''' para mltiplas linhas.
Entretanto, conveno usar o mtodos de mltiplas linhas em ambos os casos.
Diferente de comentrios, a cadeias de caracteres usadas como documentao so objetos Python e fazem parte do
cdigo interpretado. Isso significa que um programa pode acessar sua prpria documentao e manipular a
informao. H ferramentas que extraem automaticamente essa documentao para a gerao da documentao de
API a partir do cdigo. Documentao atravs de cadeias de caracteres tambm pode ser acessada a partir do
interpretador atravs da funo help().
Plataformas disponveis
A linguagem e seu interpretador esto disponveis para as mais diversas plataformas, desde Unix (Linux, FreeBSD,
Solaris, MacOS X, etc.), Windows, .NET, verses antigas de MacOS at consoles de jogos eletrnicos ou mesmo
alguns celulares, como a srie 60, N8xx(PyMaemo) da Nokia e palmtops.
Para algum sistema operacional no suportado, basta que exista um compilador C disponvel e gerar o Python a
partir do fonte. O cdigo fonte traduzido pelo interpretador para o formato bytecode, que multiplataforma e pode
ser executado e distribudo sem fonte original.
Implementaes
A implementao original e mais conhecida do Python o CPython, escrita em C e compatvel com o padro C89,
sendo distribuda com uma grande biblioteca padro escrita em um misto de Python e C. Esta implementao
suportada em diversas plataformas, incluindo Microsoft Windows e sistemas Unix-like modernos.
Stackless Python uma variao do CPython que implementa microthreads (permitindo multitarefa sem o uso de
threads), sendo suportada em quase todas as plataformas que a implementao original.
Existem tambm implementaes para plataformas j existentes: Jython para a Plataforma Java e IronPython para
.NET.
Em 2005 a Nokia lanou um interpretador Python para os telefones celulares S60, chamado PyS60. Essa verso
inclui vrios mdulos das implementaes tradicionais, mas tambm alguns mdulos adicionais para a integrao
com o sistema operacional Symbian. Uma implementao para Palm pode ser encontrada no Pippy. J o PyPy, a
Python
227
linguagem Python totalmente escrita em Python.
Diversas implementaes, como CPython, pode funcionar como um interpretador de comandos em que o usurio
executa as instrues sequencialmente, recebendo o resultado automaticamente. A execuo compilada do cdigo
oferece um ganho substancial em velocidade, com o custo da perda da interatividade.
Desenvolvimento
O desenvolvimento de Python conduzido amplamente atravs do processo Python Enhancement Proposal ("PEP"),
em portugus Proposta de Melhoria do Python. Os PEPs so documentos de projeto padronizados que fornecem
informaes gerais relacionadas ao Python, incluindo propostas, descries, justificativas de projeto (design
rationales) e explicaes para caractersticas da linguagem. PEPs pendentes so revisados e comentados por Van
Rossum, o Benevolent Dictator For Life (lder arquiteto da linguagem) do projeto Python. Desenvolvedores do
CPython tambm se comunicam atravs de uma lista de discusso, python-dev, que o frum principal para
discusso sobre o desenvolvimento da linguagem. Questes especficas so discutidas no gerenciador de erros
Roundup mantido em python.org. O desenvolvimento acontece no auto-hospedado svn.python.org
Licena
Python possui uma licena livre aprovada pela OSI e compatvel com a GPL, porm menos restritiva. Ela prev
(entre outras coisas) que binrios da linguagem sejam distribudos sem a necessidade de fornecer o cdigo fonte
junto.
Mdulos e frameworks
Ao longo do tempo tm sido desenvolvidos pela comunidade de programadores muitas bibliotecas de funes
especializadas (mdulos) que permitem expandir as capacidades base da linguagem. Entre estes mdulos
especializados destacam-se:
Descrio Campos de atuao
Django Framework para desenvolvimento gil de aplicaes web; desenvolvimento web
Pylons Framework para desenvolvimento de aplicaes web; desenvolvimento web
TurboGears Framework baseado em vrias outras tecnologias existentes no mundo que
gira em torno da linguagem Python;
desenvolvimento web
Matplotlib - Matplotlib
/ Pylab
biblioteca para manipulao de grficos 2D; processamento de imagem
Python Imaging Library biblioteca para manipulao de imagens digitais; processamento de imagem
PyOpenGL - Python
OpenGL Binding
suporte multiplataforma ao OpenGL; computao grfica
Pygame Conjunto de mdulos para o desenvolvimento de jogos eletrnicos,
incluindo grficos SDL;
desenvolvimento de jogos
eletrnicos; computao grfica
Twisted Framework para o desenvolvimento de aplicaes de rede. Inclui mdulos
para servidor web, de aplicao, SSH e diversos outros protocolos;
desenvolvimento de software;
desenvolvimento web
PYRO - Python Remote
Objects
Framework para o desenvolvimento de sistemas distribudos; computao distribuda
ZODB Sistema de persistncia e banco de dados orientado a objetos; banco de dados
Plone SGC - Sistema de gerenciamento de contedo; desenvolvimento web
CherryPy Framework para aplicaes web; desenvolvimento web
Python
228
Web2py Framework para aplicaes web; desenvolvimento web
Visual Python Framework 3D de alto nvel; computao grfica
SQLObject Mapeador objeto-relacional: traduz estruturas relacionais para objetos
Python e manipula o banco de dados de forma transparente;
banco de dados
Numarray Mdulo para manipulao de vetores e computao cientfica. computao cientfica
Interfaces grficas
Exemplos de bibliotecas de GUI disponveis para Python incluem:
Descrio
Etk interface para a biblioteca EFL
PyGTK interface para a biblioteca GTK
PyQT interface para a biblioteca QT
Tkinter Mdulo padro para GUI no Python
wxPython interface para a biblioteca wxWidgets
Wax Construdo para simplificar o uso do wxPython
Ambientes de desenvolvimento integrado
Existem vrios ambientes de desenvolvimento integrado (IDE) disponveis para Python:
Desenvolvedor ltima verso Platforma Toolkit Licena
Boa Constructor Team 0.6.1 Independente wxPython GPL
Eric Python IDE Detlev Offenbach 4.1.2 Independente Qt GPL
Geany Team 1.23 Independente GTK2 GPL
IDLE Guido van Rossum et
al.
3.0 / 2008 Independente Tkinter PSFL
IronPython Studio Clarius Labs 1.0 / 10 de dezembro de
2007
Windows VS2008 Shell
Runtime
Microsoft Public
License
Komodo ActiveState 4.1.1 / junho de 2007 multiplataforma Plataforma Mozilla Propretrio
PyDev (Eclipse) Fabio Zadrozny 1.3.13 multiplataforma SWT EPL
PythonCard Alex Tweedly 0.8.2 multiplataforma wxPython Licena BSD
PyScripter mmm-experts 1.7.2 / outubro de 2006 Windows MIT
Stani's Python
Editor
Stani 0.8.4c / 14 de fevereiro de
2008
Independente wxPython GPL
Wing IDE Wingware 3.0.2-1 / 27 de novembro
de 2007
Windows, Linux, OS
X
PyGTK Propretrio
Python
229
Aplicaes
Alguns dos maiores projetos que utilizam Python so o servidor de aplicao Zope, o compartilhador de arquivos
Mnet, o stio YouTube e o cliente original do BitTorrent. Grandes organizaes que usam a linguagem incluem
Google (parte dos crawlers), Yahoo! (para o stio de grupos de usurios) e NASA. O sistema de gerenciamento de
reservas da Air Canada tambm usa Python em alguns de seus componentes. A linguagem tambm tem bastante uso
na indstria da segurana da informao.
A linguagem tem sido embarcada como linguagem de script em diversos softwares, como em programas de edio
tridimensional como Maya, Autodesk Softimage, TrueSpace e Blender. Programas de edio de imagem tambm a
usam para scripts, como o GIMP. Para diversos sistema operacionais a linguagem j um componente padro,
estando disponvel em diversas distribuies Linux. O Red Hat Linux usa Python para instalao, configurao e
gerenciamento de pacotes.
Outros exemplos incluem o Plone, sistema de gerenciamento de contedo desenvolvido em Python e Zope e a
Industrial Light & Magic, que produz filmes da srie Star Wars usando extensivamente Python para a computao
grfica nos processos de produo dos filmes.
[1] http:/ / www. python.org/
Bibliografia
Pilgrim, Mark. Dive into Python (http:/ / diveintopython. net) (em ingls). 2ed. Nova Iorque:Apress, 2004.413
p. ISBN 978-1-5905-9356-1
Pilgrim, Mark. Dive into Python 3 (http:/ / www. diveinto. org/ python3/ ) (em ingls). 2ed. Nova Iorque:Apress,
2009.360 p. ISBN 978-1-4302-2415-0
Menezes, Nilo Ney Coutinho. Introduo Programao com Python. So Paulo:Novatec, 2010.224 p. ISBN
978-85-7522-250-8 (Ideal para quem nunca teve contato com programao)
Downey, Allen B.. Think Python (http:/ / shop. oreilly. com/ product/ 0636920025696. do) (em ingls).
Sebastopol (Califrnia):O'Reilly, 2012.300 p. ISBN 978-1-4493-3072-9
Lutz, Mark. Learning Python (http:/ / shop. oreilly. com/ product/ 0636920028154. do) (em ingls). 5ed.
Sebastopol (Califrnia):O'Reilly, 2013.1600 p. ISBN 978-1-4493-5573-9
Lutz, Mark. Programming Python (http:/ / shop. oreilly. com/ product/ 9780596158118. do) (em ingls). 4ed.
Sebastopol (Califrnia):O'Reilly, 2010.1632 p. ISBN 978-0-596-15810-1
David Beazley e Brian K. Jones. Python Cookbook (http:/ / shop. oreilly. com/ product/ 0636920027072. do) (em
ingls). 3ed. Sebastopol (Califrnia):O'Reilly, 2013.706 p. ISBN 978-1-4493-4037-7
Ligaes externas
Pgina oficial (http:/ / www. python. org/ ) (em ingls)
Wiki da comunidade brasileira de usurios (http:/ / www. python. org. br/ )
Site da comunidade portuguesa de usurios (http:/ / python. pt/ )
Python (http:/ / www. dmoz. org/ Computers/ Programming/ Languages/ Python/ ) no Open Directory Project
Gdel
230
Gdel
Gdel
Paradigma lgico, declarativo
Surgido em 1992
ltima verso 1.5 (11/8/1995)
Criado por John Lloyd & Patricia Hill
Estilo de tipagem: forte
Gdel um linguagem de programao declarativa, de propsito geral que adere ao paradigma lgico. uma
linguagem fortemente tipada, o sistema de tipos baseado em muitos ordenados da lgica com polimorfismo
paramtrico. Seu nome uma homenagem ao lgico Kurt Gdel.
Caractersticas
Gdel tem um sistema de mdulos, e suporta inteiros de preciso arbitrria, racionais de preciso arbitrria, e
tambm nmeros de ponto flutuante. Pode resolver restries sobre domnios finitos de inteiros e tambm restries
racionais lineares. Ele suporta o processamento de conjuntos finitos. Ele tambm tem uma regra de computao
flexvel e um operador de poda que generaliza a consignao (em ingls: commit) das linguagens de programao
lgica concorrente.
As instalaes meta-lgicas da linguagem Gdel fornecem suporte para meta-programas que fazem anlise,
transformao, compilao, verificao e depurao, entre outras tarefas.
Cdigo de exemplo
O mdulo de Gdel que se segue uma especificao do maior divisor comum (mdc) de dois nmeros. Pretende-se
demonstrar a natureza declarativa de Gdel, e no, o ser particularmente eficaz. O predicado CommonDivisor diz
que se i e j no so zero, ento d um divisor comum de i e j se situa entre 1 e os menores entre i e j e
divide ambos i e j exatamente. O predicado Mdc diz que d um mximo divisor comum de i e j se for um
divisor comum de i e j, e no h e que tambm um divisor comum de i e j e maior do que d.
MODULE MDC.
IMPORT Integers.
PREDICATE Mdc : Integer * Integer * Integer.
Mdc(i,j,d)
CommonDivisor(i,j,d) &
~ SOME [e] (CommonDivisor(i,j,e) & e > d).
PREDICATE CommonDivisor : Integer * Integer * Integer.
CommonDivisor(i,j,d)
IF (i = 0 \/ j = 0) THEN
d = Max(Abs(i),Abs(j))
ELSE
1 =< d =< Min(Abs(i),Abs(j)) &
i Mod d = 0 &
j Mod d = 0.
Gdel
231
Bibliografia
Hill, Patricia; Lloyd, John. The Gdel Programming Language (em ingls). Cambridge:The MIT Press,
1994.350 p. ISBN 0-262-08229-2
Ligaes externas
Pgina oficial
[1]
(em ingls)
Referncias
[1] http:/ / www. scs. leeds. ac.uk/ hill/ GOEDEL/ expgoedel. html
Lua
Lua
Paradigma Abstrao de dados
Programao imperativa
Programao procedural
Surgido em 1993
ltima verso 5.2.2 (27 de maro de 2013)
Criado por Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes
Estilo de tipagem: Fraca, Dinmica, Implcita
Dialetos:
Metalua
[1]
Influenciada por Icon, Pascal, Scheme
Influenciou Dao, Io, Squirrel
Licena: Licena MIT
Pgina oficial
www.lua.org
[2]
Lua uma linguagem de script imperativa, procedural, pequena, reflexiva e leve, projetada para expandir aplicaes
em geral, por ser uma linguagem extensvel (que une partes de um programa feitas em mais de uma linguagem), para
prototipagem e para ser embarcada em softwares complexos, como jogos . Assemelha-se com Python, Ruby e Icon,
entre outras.
Lua foi criada por um time de desenvolvedores do Tecgraf
[3]
da PUC-Rio, a princpio, para ser usada em um projeto
da Petrobras. Devido sua eficincia, clareza e facilidade de aprendizado, passou a ser usada em diversos ramos da
programao, como no desenvolvimento de jogos (a Blizzard Entertainment, por exemplo, usou a linguagem no jogo
World of Warcraft), controle de robs, processamento de texto, etc. Tambm frequentemente usada como uma
linguagem de propsito geral.
Lua
232
Lua combina programao procedural com poderosas construes para descrio de dados, baseadas em tabelas
associativas e semntica extensvel. tipada dinamicamente, interpretada a partir de bytecodes, e tem gerenciamento
automtico de memria com coleta de lixo. Essas caractersticas fazem de Lua uma linguagem ideal para
configurao, automao (scripting) e prototipagem rpida.
Histria
Lua foi criada em 1993 por Roberto Ierusalimschy, Luiz Henrique de Figueiredo e Waldemar Celes, membros do
Computer Graphics Technology Group na PUC-Rio, a Pontifcia Universidade Catlica do Rio de Janeiro, no Brasil.
Verses de Lua antes da verso 5.0 foram liberadas sob uma licena similar licena BSD. A partir da verso 5.0,
Lua foi licenciada sob a licena MIT.
Alguns de seus parentes mais prximos so o Icon, por sua concepo, e Python, por sua facilidade de utilizao por
no-programadores. Em um artigo publicado no Dr. Dobb's Journal, os criadores de Lua tambm afirmam que Lisp
e Scheme foram uma grande influncia na deciso de desenvolver a tabela como a principal estrutura de dados de
Lua. Lua tem sido usada em vrias aplicaes, tanto comerciais como no-comerciais.
O primeiro projeto utilizando a linguagem em jogos foi em 1997 quando a LucasArts a utilizou como linguagem de
script no jogo Grim Fandango.
Caractersticas
Lua normalmente descrita como uma linguagem de mltiplos paradigmas, oferecendo um pequeno conjunto de
caractersticas gerais que podem ser estendidas para encaixar diferentes tipos de problemas, em vez de fornecer uma
especificao mais complexa e rgida para combinar com um nico paradigma. Lua, por exemplo, no contm apoio
explcito herana, mas permite que ela seja executada com relativa facilidade com metatables. Do mesmo modo,
Lua permite que programadores quando implementam nomes, classes, e outras funes, empreguem poderosas
tcnicas de programao funcional e completos escopos lexicais.
Lua uma linguagem que suporta apenas um pequeno nmero de estruturas, tais como dados atmicos, valores
booleanos, nmeros (dupla preciso em ponto flutuante por padro), e strings. As estruturas de dados comuns, tais
como matrizes, conjuntos, tabelas, listas, e registros podem ser representados por meio de Lua. Lua no foi
construda com suporte para programao orientada a objeto.
Exemplos
O Programa Ol Mundo pode ser escrito da seguinte forma:
print "Ol, Mundo!"
A funo fatorial recursiva:
function fact(n)
if n == 0 then
return 1
else
return n * fact(n - 1)
end
end
O clculo dos n primeiros nmeros perfeitos:
function perfeitos(n)
cont=0
Lua
233
x=0
print('Os numeros perfeitos sao ')
repeat
x=x+1
soma=0
for i=1,(x-1) do
if math.mod(x,i)==0 then soma=soma+i;
end
end
if soma == x then
print(x)
cont = cont+1
end
until cont==n
print('Pressione qualquer tecla para finalizar...')
end
O tratamento das funes como variveis de primeira classe mostrado no exemplo a seguir, onde o comportamento
da funo print modificado:
do
local oldprint = print -- Grava a varivel print em oldprint
print = function(s) -- Redefine a funo print
if s == "foo" then
oldprint("bar")
else
oldprint(s)
end
end
end
Qualquer chamada da funo print agora ser executada atravs da nova funo, e graas ao escopo lxico de Lua,
a funo print antiga s ser acessvel pelo nova.
Lua tambm suporta funes closure, como demonstrado abaixo:
function makeaddfunc(x) -- Retorna uma nova funo que adiciona x ao
argumento
return function(y)
return x + y
end
end
plustwo = makeaddfunc(2)
print(plustwo(5)) -- Prints 7
Um novo closure criado para a varivel x cada vez que a funo makeaddfunc chamada, de modo que a
funo annima a ser retornada sempre ir acessar seu prprio parmetro x. O closure gerenciado pelo coletor de
lixo (garbage collector) da linguagem, tal como qualquer outro objeto.
Uma caracterstica essencial de Lua a semntica Extensvel, e o conceito de metatables permite que as tabelas
Lua sejam personalizadas em poderosas e exclusivas formas. O exemplo a seguir mostra uma tabela infinita. Para
Lua
234
qualquer valor n, fibs [n] dar o ensimo nmero Fibonacci usando programao dinmica.
fibs = { 1, 1 } -- Valores iniciais de fibs[1] e fibs[2].
setmetatable(fibs, {
__index = function(name, n) -- Funo chamada se fibs[n] no existir
name[n] = name[n - 1] + name[n - 2] -- Calcula e grava fibs[n].
return name[n]
end
})
Tabelas
As tabelas so as estruturas de dados mais importantes (e, por concepo, a nica estrutura de dados complexas) em
Lua, e so a base de todos os tipos de usurio criada.
A tabela um conjunto de chaves e pares de dados (tambm conhecido como hashed heterogeneous associative
array), onde os dados so referenciados por chave. A chave (ndice) pode ser de qualquer tipo de dados exceto nulo.
Um inteiro com chave valor 1 considerada distinta da chave de uma string "1".
As tabelas so criadas usando a seguinte sintaxe: {}
a_table = {} -- Creates a new, empty table
Tabelas sempre so passadas por referncia:
a_table = {x = 10} -- Creates a new table, with one associated entry.
The string x mapping to the number 10.
print(a_table["x"]) -- Prints the value associated with the string key,
in this case 10.
b_table = a_table
a_table["x"] = 20 -- The value in the table has been changed to 20.
print(a_table["x"]) -- Prints 20.
print(b_table["x"]) -- Prints 20, because a_table and b_table both
refer to the same table.
Tabelas como estrutura
As tabelas so freqentemente utilizadas como estruturas (ou objetos), utilizando strings como chaves, porque este
tipo de uso muito comum, e Lua apresenta uma sintaxe especial para acessar esses tipos de domnios. Exemplo:
point = { x = 10, y = 20 } -- Create new table
print(point["x"]) -- Prints 10
print(point.x) -- Has exactly the same meaning as line above
Tabela como matriz
Atravs da utilizao de uma tecla numrica, a tabela lembra um tipo de dados de matriz. So de base 1, o primeiro
ndice 1 em vez de 0 como para muitas linguagens de programao. Exemplo de strings de uma simples matriz:
array = { "a", "b", "c", "d" } -- Indices are assigned automatically.
print(array[2]) -- Prints "b". Automatic indexing in Lua
starts at 1.
print(#array) -- Prints 4. # is the length operator
for tables and strings.
Lua
235
array[0] = "z" -- Zero is a legal index.
print(#array) -- Still prints 4, as Lua arrays are
1-based.
Exemplo de um vetor de objetos:
function Point(x, y) -- "Point" object constructor
return { x = x, y = y } -- Creates and returns a new object (table)
end
array = { Point(10, 20), Point(30, 40), Point(50, 60) } -- Creates
array of points
print(array[2].y) -- Prints 40
Projetos que utilizam Lua
Em 2013, a Wikimedia Foundation comeou a utilizar a linguagem nas predefinies.
Projetos
Adobe Photoshop Lightroom
Celestia
Cheat Engine
ClanLib
CryEngine 3
Corona SDK
Damn Small Linux
Ginga
Kepler (software)
lighttpd
Liquid Feedback
MinGW
Monotone
Nmap
PlayStation Home
Jogos
Exemplos de empresas que desenvolvem jogos usando a linguagem Lua: LucasArts, BioWare, Microsoft, Relic
Entertainment, Absolute Studios, Monkeystone Games, Blizzard.
Angry Birds
Baldur's Gate
The Battle for Wesnoth
Civilization V
Escape from Monkey Island
Fable II
Far Cry
FlyFF
Freeciv
Freelancer
Grim Fandango
Lua
236
Impossible Creatures
Lego Universe
MapleStory
MDK2
Monopoly Tycoon
Multi Theft Auto
Psychonauts
Ragnarok Online
Roblox
Tibia
World of Warcraft
Bibliografia
Ierusalimschy, Roberto; Figueiredo, Luiz Henrique de; Celes, Waldemar. Lua Reference manual. Rio de
Janeiro:Lua.org, 2006.103 p. ISBN 85-903798-3-3
Ierusalimschy, Roberto. Programming in Lua. Rio de Janeiro:Lua.org, 2006.252 p. ISBN 85-903798-2-5
Jung, Kurt; Brown, Aaron. Beginning Lua Programming. Indianapolis:Wiley Publishing, 2007.644 p. ISBN
0-470-06917-2
[1] http:/ / metalua.luaforge. net/
[2] http:/ / www. lua. org/
[3] http:/ / www. tecgraf. puc-rio.br
Ligaes externas
Pgina oficial (http:/ / www. lua. org/ ) (em ingls)
Pgina oficial (http:/ / www. lua. org/ portugues. html) (em portugus)
Manual de Referncia de Lua 5.1 (http:/ / www. lua. org/ manual/ 5. 1/ pt/ ) (em portugus)
Demonstrao online (http:/ / www. lua. org/ cgi-bin/ demo) (em ingls)
Lua Wiki (http:/ / lua-users. org/ wiki) (em ingls) - Wiki oficial
LuaForge - hospedagem e catlogo de projetos que usam Lua (http:/ / luaforge. net/ ) (em ingls)
Lua (http:/ / www. dmoz. org/ Computers/ Programming/ Languages/ Lua/ ) no Open Directory Project
Java
237
Java
Java
Duke, o mascote do Java
Paradigma Orientao a objetos, estruturada, imperativa
Surgido em 1995
ltima verso 1.7.5 (12 de junho de 2012)
Criado por James Gosling e Sun Microsystems
Estilo de tipagem: esttica, forte
Compiladores GCJ, Javac
Influenciada por Ada 83, C++, C, Eiffel, Generic Java, Mesa, Modula-3, Object Pascal, Objective-C, UCSD Pascal, Smalltalk
Influenciou Ada 2005, BeanShell, C, Clojure, D, ECMAScript, Fantom, Groovy, J#, JavaScript, PHP, Python, Scala
Licena: GNU General Public License/Java Community Process
Pgina oficial
www.oracle.com/technetwork/java/index.html
[1]
Java uma linguagem de programao orientada a objeto desenvolvida na dcada de 90 por uma equipe de
programadores chefiada por James Gosling, na empresa Sun Microsystems. Diferentemente das linguagens
convencionais, que so compiladas para cdigo nativo, a linguagem Java compilada para um bytecode que
executado por uma mquina virtual. A linguagem de programao Java a linguagem convencional da Plataforma
Java, mas no sua nica linguagem.
Histria
Em 1991, na Sun Microsystems, foi iniciado o Green Project, o bero do Java, uma linguagem de programao
orientada a objetos. Os mentores do projeto eram Patrick Naughton, Mike Sheridan, e James Gosling. Eles
acreditavam que, em algum tempo, haveria uma convergncia dos computadores com os equipamentos e
eletrodomsticos comumente usados pelas pessoas no seu dia-a-dia.
Para provar a viabilidade desta ideia, 13 pessoas trabalharam arduamente durante 18 meses. No vero de 1992 eles
emergiram de um escritrio de Sand Hill Road, no Menlo Park, com uma demonstrao funcional da ideia inicial. O
prottipo se chamava *7 (l-se StarSeven), um controle remoto com uma interface grfica touchscreen. Para o *7,
foi criado um mascote, hoje amplamente conhecido no mundo Java, o Duke. O trabalho do Duke no *7 era ser um
guia virtual ajudando e ensinando o usurio a utilizar o equipamento. O *7 tinha a habilidade de controlar diversos
dispositivos e aplicaes. James Gosling especificou uma nova linguagem de programao para o *7. Gosling
decidiu batiz-la de Oak, que quer dizer carvalho, uma rvore que ele podia observar quando olhava atravs da sua
janela.
Java
238
O prximo passo era encontrar um mercado para o *7. A equipe achava que uma boa ideia seria controlar televises
e vdeo por demanda com o equipamento. Eles construram uma demonstrao chamada de MovieWood, mas
infelizmente era muito cedo para que o vdeo por demanda bem como as empresas de TV a cabo pudessem viabilizar
o negcio. A ideia que o *7 tentava vender, hoje j realidade em programas interativos e tambm na televiso
digital. Permitir ao telespectador interagir com a emissora e com a programao em uma grande rede de cabos, era
algo muito visionrio e estava muito longe do que as empresas de TV a cabo tinham capacidade de entender e
comprar. A ideia certa, na poca errada.
Entretanto, o estouro da internet aconteceu e rapidamente uma grande rede interativa estava se estabelecendo. Era
este tipo de rede interativa que a equipe do *7 estava tentando vender para as empresas de TV a cabo. E, da noite
para o dia, no era mais necessrio construir a infraestrutura para a rede, ela simplesmente estava l. Gosling foi
incumbido de adaptar o Oak para a internet e em janeiro 1995 foi lanada uma nova verso do Oak que foi
rebatizada para Java. A tecnologia Java tinha sido projetada para se mover por meio das redes de dispositivos
heterogneos, redes como a internet. Agora aplicaes poderiam ser executadas dentro dos navegadores nos Applets
Java e tudo seria disponibilizado pela internet instantaneamente. Foi o esttico HTML dos navegadores que
promoveu a rpida disseminao da dinmica tecnologia Java. A velocidade dos acontecimentos seguintes foi
assustadora, o nmero de usurios cresceu rapidamente, grandes fornecedores de tecnologia, como a IBM
anunciaram suporte para a tecnologia Java.
Desde seu lanamento, em maio de 1995, a plataforma Java foi adotada mais rapidamente do que qualquer outra
linguagem de programao na histria da computao. Em 2004 Java atingiu a marca de 3 milhes de
desenvolvedores em todo mundo. Java continuou crescendo e hoje uma referncia no mercado de desenvolvimento
de software. Java tornou-se popular pelo seu uso na internet e hoje possui seu ambiente de execuo presente em
navegadores, mainframes, sistemas operacionais, celulares, palmtops, cartes inteligentes etc.
Padronizao
Em 1997 a Sun Microsystems tentou submeter a linguagem a padronizao pelos rgos ISO/IEC e ECMA, mas
acabou desistindo.
[2][3][4]
Java ainda um padro de fato, que controlada atravs da JCP Java Community
Process.
[5]
Em 13 de novembro de 2006, a Sun lanou a maior parte do Java como Software Livre sob os termos da
GNU General Public License (GPL). Em 8 de maio de 2007 a Sun finalizou o processo, tornando praticamente todo
o cdigo Java como software de cdigo aberto, menos uma pequena poro da qual a Sun no possui copyright.
[6]
Caractersticas
A linguagem Java foi projetada tendo em vista os seguintes objetivos:
Orientao a objetos - Baseado no modelo de Simular
Portabilidade - Independncia de plataforma - "escreva uma vez, execute em qualquer lugar" ("write once, run
anywhere")
Recursos de Rede - Possui extensa biblioteca de rotinas que facilitam a cooperao com protocolos TCP/IP, como
HTTP e FTP
Segurana - Pode executar programas via rede com restries de execuo
Alm disso, podem-se destacar outras vantagens apresentadas pela linguagem:
Sintaxe similar a C/C++
Facilidades de Internacionalizao - Suporta nativamente caracteres Unicode
Simplicidade na especificao, tanto da linguagem como do "ambiente" de execuo (JVM)
distribuda com um vasto conjunto de bibliotecas (ou APIs)
Possui facilidades para criao de programas distribudos e multitarefa (mltiplas linhas de execuo num mesmo
programa)
Java
239
Desalocao de memria automtica por processo de coletor de lixo
Carga Dinmica de Cdigo - Programas em Java so formados por uma coleo de classes armazenadas
independentemente e que podem ser carregadas no momento de utilizao
Licena
A Sun disponibiliza a maioria das distribuies Java gratuitamente e obtm receita com programas mais
especializados como o Java Enterprise System. Em 13 de novembro de 2006, a Sun liberou partes do Java como
software livre, sob a licena GNU General Public License. A liberao completa do cdigo fonte sob a GPL ocorreu
em maio de 2007.
Exemplos de cdigo
Mtodo main
O mtodo main onde o programa inicia. Pode estar presente em qualquer classe. Os parmetros de linha de
comando so enviados para o array de Strings chamado args.
public class OlaMundo {
/**
* Mtodo que executa o programa
* public = visto em qualquer lugar da aplicao. o modificador
de acesso
* static = iniciado automaticamente pela JVM, sem precisar de uma
instncia
* void = Mtodo sem retorno (retorno vazio)
* main = Nome do mtodo, que obrigatorio ser este. Recebe como
parmetro um array de String.
* String[] args = Array de argumentos que podem ser repassados na
chamada do programa.
*/
public static void main(String[] args) {
System.out.println("Ol, Mundo!"); //Imprime na tela a frase
}
}
Classes
Exemplo:
public abstract class Animal {
public abstract void fazerBarulho();
}
public class Cachorro extends Animal {
public void fazerBarulho() {
System.out.println("AuAu!");
}
}
public class Gato extends Animal {
Java
240
public void fazerBarulho() {
System.out.println("Miau!");
}
}
O exemplo acima cria a classe Animal e duas classes derivadas de Animal. importante observar que nas classes
derivadas temos a redefinio do mtodo fazerBarulho(). Esta redefinio classificada como uma sobreposio
(override) de mtodos. O conceito de sobreposio somente pode ser identificado e utilizado quando temos classes
dispostas em um relacionamento de herana.
Java no suporta herana mltipla, devido a possibilidade de uma classe pai ter um mtodo com o mesmo nome de
outra classe pai, e gerar possveis falhas ao chamar o mtodo, e todas as classes em Java derivam da classe Object. A
nica possibilidade de se ver herana mltipla em Java no uso de interfaces, pois uma classe pode implementar
vrias interfaces.
Classes internas
Java pode ter classes internas. Exemplos:
public class Cavalo extends Animal {
public void fazerBarulho() {
System.out.println("RIINCH!");
}
// Classe interna e privada. Existe s no contexto da classe
"Cavalo".
private class Parasita extends Animal {
public void fazerBarulho() {
System.out.println("SQRRT");
}
}
}
Interfaces
Uma interface modela um comportamento esperado. Pode-se entend-la como uma classe que contenha apenas
mtodos abstratos. Embora uma classe no possa conter mais de uma super classe, a classe pode implementar mais
de uma interface. Exemplo:
public interface Pesado {
double obterPeso();
}

public interface Colorido {
Color obterCor();
}

public class Porco extends Animal implements Pesado, Colorido {
public void fazerBarulho() {
System.out.println("inc!");
}
Java
241

// Implementao da interface Pesado
public double obterPeso() {
return 50.00;
}

// Implementao da interface Colorido
public Color obterCor() {
return Color.BLACK;
}

// Uma propriedade s do porco
public boolean enlameado() {
return true;
}
}
Objetos annimos
Podemos ter tambm objetos annimos, onde no necessrio instanciar o objeto em uma varivel para utiliz-lo.
Exemplo:
public class MostraBarulho {
public static void main(String args[]) {
new Cavalo().fazerBarulho(); // Objeto annimo.

// Abaixo um obj new Animal() {
public void fazerBarulho() {
System.out.println("QUAC!");
}
}.fazerBarulho();
}
}
Ferramentas
Frameworks
possvel utilizar frameworks para facilitar o desenvolvimento de aplicaes. Dentre os mais utilizados pode-se
destacar:
Hibernate ferramenta para ORM
Junit ferramenta para auxiliar na criao de testes unitrios
Log4j ferramenta para facilitar a criao de logs na aplicao
Spring ferramenta que auxilia principalmente implementao de injeo de dependncias e inverso de controle
Struts controlador MVC (Model 2) web
Java
242
Ambientes de desenvolvimento
possvel desenvolver aplicaes em Java atravs de vrios ambientes de desenvolvimento integrado (IDEs). Dentre
as opes mais utilizadas pode-se destacar:
BlueJ um ambiente desenvolvido por uma faculdade australiana (considerado muito bom para iniciantes)
JCreator (gratuito/shareware) um ambiente desenvolvido pela Xinox (recomendado para programadores
iniciantes)
jEdit (recomendado para programadores iniciantes)
Eclipse (recomendado para programadores fluentes)
Emulador do Android no Eclipse, exibindo um simples "Hello
World", escrito em JAVA e XML
IDEs completas (recomendado para programadores
profissionais)
Eclipse um projeto aberto iniciado pela IBM
IntelliJ IDEA (comercial) uma IDE desenvolvida
pela JetBrains
JBuilder um ambiente desenvolvido pela empresa
Borland
JDeveloper (gratuito OTN) uma IDE
desenvolvida pela empresa Oracle
NetBeans (software livre) uma IDE desenvolvida
pela Sun Microsystems
Outras IDEs (menos populares)
Gel (IDE) open source
Greenfoot bem parecido com o BlueJ
JGRASP bom para intermedirios, feito pela equipe do Projeto GRASP
Java Studio Creator/Enterprise (gratuito SDN) um ambiente criado pela empresa Sun Microsystems
Workshop for WebLogic (comercial/desenvolvedor) um ambiente criado pela empresa Oracle
WebSphere Studio Application Developer um ambiente criado pela empresa IBM
Extenses
Extenses em Java:
J2ME (Micro-Edition for PDAs and cellular phones)
J2SE (Standard Edition)
J3D (A high level API for 3D graphics programming)
JAAS (Java Authentication and Authorization Service)
JAIN (Java API for Integrated Networks)
Java Card
JMX (Java Management Extensions)
JavaFX
JSF (JavaServer Faces)
JSP (JavaServer Pages)
JavaSpaces
JCE (Java Cryptography Extension)
JDBC (Java Database Connectivity)
JDMK (Java Dynamic Management Kit)
JDO (Java Data Objects)
JEE (Enterprise Edition)
Java
243
Jini (a network architecture for the construction of distributed systems)
Jiro
JMF (Java Media Framework)
JMI (Java Metadata Interface)
JMS (Java Message Service)
JNDI (Java Naming and Directory Interface)
JNI (Java Native Interface)
JOGL (A low level API for 3D graphics programming, using OpenGL)
JSML (Java Speech API Markup Language)
JXTA (open source-based peer-to-peer infrastructure)
MARF (Modular Audio Recognition Framework)
OSGi (Dynamic Service Management and Remote Maintenance)
SuperWaba (JavaVMs for handhelds)
Certificaes
Existem 8 tipos de certificaes
[7]
da Sun Microsystems para Java:
Oracle Certified Enterprise Architect (OCEA)
Oracle Certified Mobile Application Developer (OCMAD)
Oracle Certified Developer For Java Web Services (OCDJWS)
Oracle Certified Business Component Developer (OCBCD)
Oracle Certified Web Component Developer (OCWCD)
Oracle Certified Java Developer (OCJD)
Oracle Certified Java Programmer (OCJP)
Oracle Certified Java Associate (OCJA)
Cada certificao testa algum tipo de habilidade dentro da plataforma e linguagem Java. Todos os testes so
realizados pela empresa Person VUE e so reconhecidos internacionalmente.
Comunidade
A comunidade de desenvolvedores Java rene-se em grupo denominados JUGs (Java User Groups). No Brasil o
movimento de grupos de usurios expandiu-se bastante e tem formado alguns dos maiores grupos de usurios Java
do mundo
[8]
, como por exemplo o PortalJava, GUJ e o JavaFree.
[1] http:/ / www. oracle. com/ technetwork/ java/ index.html
[2] Java Study Group (http:/ / www. open-std. org/ JTC1/ SC22/ JSG/ )
[3] Why Java Was - Not - Standardized Twice (http:/ / csdl2. computer. org/ comp/ proceedings/ hicss/ 2001/ 0981/ 05/ 09815015. pdf)
[4] What is ECMA--and why Microsoft cares (http:/ / techupdate. zdnet. com/ techupdate/ stories/ main/ 0,14179,2832719,00. html)
[5] Java Community Process website (http:/ / www. jcp.org/ en/ home/ index)
[6] open.itworld.com - JAVAONE: Sun - The bulk of Java is open sourced (http:/ / open. itworld. com/ 4915/ 070508opsjava/ page_1. html)
[7] Java Certification (http:/ / www.sun.com/ training/ certification/ java/ index. xml)
[8] Profissao Java - Pgina 13- Java no Brasil (http:/ / www. profissaojava. com. br/ arquivos/ ProfissaoJava-Abertura. pdf)
Java
244
Bibliografia
Harvey M. Deitel. Java: Como Programar. 6ed. So Paulo:Pearson education do Brasil, 2005.1097 p.
Apostila Java e Orientao a Objetos (http:/ / www. caelum. com. br/ apostila-java-orientacao-objetos/ ), licena
Creative Commons, 7 edio, pela Caelum - Ensino e Inovao.
Patrick Naughton, Dominando o Java, Guia Autorizado da Sun Microsystems, Editora Makron Books, 1997,
Osborne, ISBN 80025-75540
Brian Jepson, Java Database Programming Master Next Generation Web Database Techniques, 1997, Editora:
Wiley Computer Publishing, ISBN 0-471-16518-2
Ligaes externas
Pgina oficial (http:/ / www. oracle. com/ technetwork/ java/ index. html) (em ingls)
Pgina oficial (http:/ / www. oracle. com/ br/ technologies/ java/ index. html) (em portugus)
Tutoriais oficiais (http:/ / download. oracle. com/ javase/ tutorial/ ) (em ingls)
Java (http:/ / www. dmoz. org/ Computers/ Programming/ Languages/ Java/ ) no Open Directory Project
PHP
PHP
Paradigma procedural, reflexo, orientao a objetos, funcional
Surgido em 1995
ltima verso 5.5.11 (2 de abril de 2014)
Criado por Rasmus Lerdorf
Estilo de tipagem: dinmica
Compiladores Linguagem interpretada
Influenciada por C, C++, Perl, Java, Tcl
Pgina oficial
www.php.net
[1]
PHP (um acrnimo recursivo para "PHP: Hypertext Preprocessor", originalmente Personal Home Page) uma
linguagem interpretada livre, usada originalmente apenas para o desenvolvimento de aplicaes presentes e atuantes
no lado do servidor, capazes de gerar contedo dinmico na World Wide Web. Figura entre as primeiras linguagens
passveis de insero em documentos HTML, dispensando em muitos casos o uso de arquivos externos para
eventuais processamentos de dados. O cdigo interpretado no lado do servidor pelo mdulo PHP, que tambm gera
a pgina web a ser visualizada no lado do cliente. A linguagem evoluiu, passou a oferecer funcionalidades em linha
de comando, e alm disso, ganhou caractersticas adicionais, que possibilitaram usos adicionais do PHP, no
relacionados a web sites. possvel instalar o PHP na maioria dos sistemas operacionais, gratuitamente. Concorrente
direto da tecnologia ASP pertencente Microsoft, o PHP utilizado em aplicaes como o MediaWiki, Facebook,
Drupal, Joomla, WordPress, Magento e o Oscommerce.
Criado por Rasmus Lerdorf em 1995, o PHP tem a produo de sua implementao principal referncia formal da
linguagem, mantida por uma organizao chamada The PHP Group. O PHP software livre, licenciado sob a PHP
PHP
245
License, uma licena incompatvel com a GNU General Public License (GPL) devido a restries no uso do termo
PHP.
Histria
A linguagem surgiu em meados de 1994, como um pacote de programas CGI criados por Rasmus Lerdorf, com o
nome Personal Home Page Tools, para substituir um conjunto de scripts Perl que ele usava no desenvolvimento de
sua pgina pessoal. Em 1997 foi lanado o novo pacote da linguagem com o nome de PHP/FI, trazendo a ferramenta
Forms Interpreter, um interpretador de comandos SQL. Mais tarde, Zeev Suraski desenvolveu o analisador do PHP
3 que contava com o primeiro recurso de orientao a objetos, que dava poder de alcanar alguns pacotes, tinha
herana e dava aos desenvolvedores somente a possibilidade de implementar propriedades e mtodos.
[2][3]
Pouco
depois, Zeev e Andi Gutmans, escreveram o PHP 4, abandonando por completo o PHP 3, dando mais poder
mquina da linguagem e maior nmero de recursos de orientao a objetos. O problema srio que apresentou o PHP
4 foi a criao de cpias de objetos, pois a linguagem ainda no trabalhava com apontadores ou handlers, como so
as linguagens Java, Ruby e outras. O problema fora resolvido na verso atual do PHP, a verso 5, que j trabalha
com handlers. Caso se copie um objeto, na verdade copiaremos um apontador, pois, caso haja alguma mudana na
verso original do objeto, todas as outras tambm sofrem a alterao, o que no acontecia na PHP 4.
Trata-se de uma linguagem extremamente modularizada, o que a torna ideal para instalao e uso em servidores web.
Diversos mdulos so criados no repositrio de extenses PECL (PHP Extension Community Library) e alguns
destes mdulos so introduzidos como padro em novas verses da linguagem. muito parecida, em tipos de dados,
sintaxe e mesmo funes, com a linguagem C e com a C++. Pode ser, dependendo da configurao do servidor,
embarcada no cdigo HTML. Existem verses do PHP disponveis para os seguintes sistemas operacionais:
Windows, Linux, FreeBSD, Mac OS, OS/2, AS/400, Novell Netware, RISC OS, AIX, IRIX e Solaris.
Construir uma pgina dinmica baseada em bases de dados simples com PHP, (em parte, vale lembrar), este prov
suporte a um grande nmero de bases de dados: Oracle, Sybase, PostgreSQL, InterBase, MySQL, SQLite, MSSQL,
Firebird, etc., podendo abstrair o banco com a biblioteca ADOdb, entre outras. A Wikipdia funciona sobre um
software inteiramente escrito em PHP, usando bases de dados MySQL: o MediaWiki.
PHP tem suporte aos protocolos: IMAP, SNMP, NNTP, POP3, HTTP, LDAP, XML-RPC, SOAP. possvel abrir
sockets e interagir com outros protocolos. E as bibliotecas de terceiros expandem ainda mais estas funcionalidades.
Existem iniciativas para utilizar o PHP como linguagem de programao de sistemas fixos. A mais notvel a
PHP-GTK. Trata-se de um conjunto do PHP com a biblioteca GTK, portada do C++, fazendo assim softwares
inter-operacionais entre Windows e Linux. Na prtica, essa extenso tem sido muito pouco utilizada para projetos
reais.
Licena
PHP um software gratuito e de cdigo aberto publicado sob a PHP License, que afirma:
Produtos derivados deste software no devem ser chamado de PHP, nem pode conter "PHP" em seu nome,
sem prvia permisso por escrito da group@php.net. Voc pode indicar que o software funciona em conjunto
com o PHP, dizendo "Foo para PHP", em vez de cham-lo "PHP Foo" ou "phpfoo".
Esta restrio no uso do nome PHP o torna incompatvel com a GNU General Public License (GPL).
PHP
246
PHP 6 e Unicode
PHP recebeu diversas crticas por no ter suporte nativo a Unicode. Em 2005, um projeto liderado por Andrei
Zmievski foi iniciado para trazer esse dito suporte ao PHP atravs da incorporao da biblioteca International
Components for Unicode (ICU) para poder passar-se a usar a codificao UTF-16. Uma vez que isso causaria
grandes mudanas tanto no cdigo fonte como para o usurio, foi planejado lan-la na verso 6.0 em conjunto com
outros importantes recursos, ento em desenvolvimento, em vez da 5.5.
Entretanto, devido a falta de desenvolvedores que entendessem as mudanas necessrias e problemas de desempenho
decorrentes da converso para UTF-16, que raramente usado em um contexto web, levou a atrasos no projeto.
Como resultado, o PHP 5.3 foi lanado em 2009, sem total suporte ao Unicode, mas contendo algumas das
novidades que seriam lanadas no PHP 6.0. Em maro de 2010, o projeto em sua forma atual foi oficialmente
abandonado, e uma verso 5.4 do PHP foi feita ainda sem total suporte a Unicode, tambm contendo as novidades
que seriam lanadas no PHP 6.0. Esperanas iniciais eram de que um novo plano seria formado para ter a integrao
Unicode, mas a partir de 2014 nenhum foi adotado.
Durante os anos, antes do lanamento do PHP 5.3 e 5.4, alguns livros foram publicados com base no conjunto de
recursos esperado de PHP 6.0, incluindo o suporte a Unicode e os recursos que depois foram trazidos para outros
lanamentos. H, portanto, algum debate sobre se uma nova verso principal do PHP, com ou sem suporte a
Unicode, deve ser chamado de "PHP 6", ou se a nomenclatura deve ser ignorado para evitar confuso.
Histrico de verses
Legenda
Vermelho Verso no mais suportada
Verde Verso suportada
Azul Prximas verses
Verso
principal
Verso
intermediria
Data de
lanamento
Notas
1 1.0.0 1995-06-08 Oficialmente chamado de "Personal Home Page Tools (PHP Tools)" (Ferramentas para pgina
pessoal). Este foi o primeiro uso para o nome "PHP".
2 2.0.0 1997-11-01 Considerado pelo seu criador como a "mais rpida e simples ferramenta" para criar pginas dinmicas
para a Web.
3 3.0.0 1998-06-06 O desenvolvimento passou a ser feito por vrios desenvolvedores em colaborao. Zeev Suraski e
Andi Gutmans reescreveram toda a base do PHP nesta verso.
3.0.18 2000-10-20
ltima verso para do PHP 3.0.x. Unsupported Historical Releases
[4]
4 4.0.0 2000-05-22 Foi adicionado um melhor sistema de anlise sinttica (parser) chamado de motor Zend (Zend engine).
4.1.0 2001-12-10 Introduzidas as 'superglobais' ($_GET, $_POST, $_SESSION, etc.)
4.2.0 2002-04-22 A register_globals passou agora a estar desativada por padro. Dados recebidos via rede so
mais inseridos no escopo de varivel global, fechando possveis brechas de segurana.
4.3.0 2002-12-27 Introduziu sua interface de linha de comando (command-line interface - CLI), para complementar o
CGI.
4.4.0 2005-07-11 Adicionadas as pginas do manual para os script phpize e php-config.
4.4.9 2008-08-07 Melhorias na segurana e correo de bugs. ltima verso do PHP 4.4.x.
PHP
247
5 5.0.0 2004-07-13 Zend Engine II com um novo modelo de objeto.
5.1.0 2005-11-24 Melhorias na performance com a introduo de variveis de compilao na reengenharia do motor
PHP. Adicionada biblioteca PHP Data Objects (PDO) como uma nova interface de acesso aos bancos
de dados.
5.2.0 2006-11-02 Habilitado por padro o filtro de extenses. Suporte JSON nativo.
5.2.16 2010-12-16
ltima verso para a srie 5.2.
[5]
5.2.17 2011-01-06 Correo de vulnerabilidade crtica relacionada a ponto flutuante.
5.3.0 2009-06-30 Suporte a nomes de espao (namespace), Vinculao de nomes (late static bindings), rtulos de salto
de cdigo (goto limitado), clausura nativa, arquivos PHP nativos (phar), coletor de lixo para
referncias circulares, suporte Windows melhorado, sqlite3, mysqlnd em substituio a
libmysql como biblioteca de extenso de trabalho com MySQL, fileinfo em substituio ao
mime_magic para um melhor suporte MIME, extenso de internacionalizao, e descontinuidade da
extenso ereg/.
5.3.1 2009-11-19
Mais de 100 conrrees de problemas
[6]
, dentre eles algumas falhas de segurana.
5.3.2 2010-03-04 Grande nmero de correo de bugs.
5.3.3 2010-07-22 Principalmente correes de bugs e segurana; FPM SAPI.
5.3.4 2010-12-10 Principalmente correes de bugs e segurana; FPM SAPI melhorado.
5.3.5 2011-01-06 Conserto de erro crtico relacionado a ponto flutuante.
5.3.6 2011-03-10 Mais de 60 correes de bug reportados em verses anteriores.
5.3.7 2011-08-18 Esta verso focou-se na melhoria da estabilidade da srie PHP 5.3.x com mais de 90 correes de bug,
algumas relacionadas tambm segurana.
5.3.8 2011-08-23 Esta verso corrigiu dois problemas introduzidos na verso PHP 5.3.7.
5.3.9 2012-01-10 Esta verso focou-se na melhoria da estabilidade da srie PHP 5.3.x.
5.3.10 2012-02-02 Corrigida execuo remota arbitrria reportada por Stefan Esser, CVE-2012-0830.
5.3.13 2012-05-08 Corrigida vulnerabilidade nas instalaes utilizando CGI.
5.3.14 2012-06-06
bugs corrigidos
[7]
.
5.3.15 2012-07-19
bugs corrigidos
[8]
.
5.3.16 2012-08-16
bugs corrigidos
[9]
.
PHP
248
5.3.17 2012-09-13
bugs corrigidos
[10]
.
5.3.21 2013-01-17
bugs corrigidos
[11]
.
5.4.0 2012-03-01 Suporte Trait, suporte a uma verso mais curta na sintaxe de vetores. Items removidos:
register_globals, safe_mode, allow_call_time_pass_reference,
session_register(), session_unregister() and session_is_registered().
Servidor web embutido.. Vrias melhorias nas fucionalidades j existentes e na performance. Reduo
dos requerimentos de memria.
5.4.1 2012-04-26
correes de bugs
[12]
.
5.4.2 2012-05-03 Pacote de segurana para corrigir vulnerabilidade em chamadas PHP-CGI.
5.4.3 2012-05-08 Correo de vulnerabilidade relacionada s instalaes baseadas em CGI e correo em
vulnerabilidade de buffer overflow na funo apache_request_headers().
5.4.4 2012-06-06
correes de bugs
[13]
.
5.4.5 2012-07-19
correes de bugs
[14]
.
5.4.6 2012-08-16
correes de bugs
[15]
.
5.4.7 2012-09-13
correes de bugs
[16]
.
5.4.11 2013-01-17
correes de bugs
[17]
.
5.5.0 2013-06-20
correes de bugs
[18]
.
6 6.0.0 Sem data
prevista
O desenvolvimento do PHP 6 foi adiado pois os desenvolvedores decidiram que a abordagem atual de
tratamento das instncias unicode no est boa e esto considerando novas alternativas na nova verso
do PHP. As atualizaes pretendidas no PHP 6 foram includas ao PHP PHP 5.3.0 (suporte a
namespace, late static bindings, funces lambda, clausuras, goto) e 5.4.0 (traits, closure
rebinding).
Principais caractersticas
A linguagem PHP uma linguagem de programao de domnio especfico, ou seja, seu escopo se estende a um
campo de atuao que o desenvolvimento web, embora tenha variantes como o PHP-GTK. Seu propsito principal
de implementar solues web velozes, simples e eficientes. Caractersticas:
Velocidade e robustez.
Estruturado e orientao a objetos.
Portabilidade - independncia de plataforma - escreva uma vez, rode em qualquer lugar.
Tipagem dinmica.
Sintaxe similar a C/C++ e o Perl.
Open-source.
Server-side (O cliente manda o pedido e o servidor responde em pagina HTML)
PHP
249
Vetores e matrizes
Os vetores e matrizes em PHP, diferente do que ocorre em C/C++ e Pascal, uma estrutura dinmica, o que pode
facilitar muito o trabalho do programador.
Um exemplo:
<?php
$vet01 = array();
$vet01[] = "Sistemas operacionais";
$vet01[] = "Compiladores";
$vet01[] = "Bancos de dados";
$vet02 = array(1, 2, 3, 4, 5);
$vet03 = array( 0 => 0, 2 => 3, 10 => "item 10");
for ($i = 0; $i < count($vet01); $i++) {
echo $vet01[$i] . "<br />";
}
?>
O exemplo acima demonstra trs maneiras diferentes de declarar vetores.
PHP 5
Em junho de 2004 foi lanada a verso 5 do PHP, introduzindo um novo modelo de orientao a objeto, incluindo a
reformulao dos construtores e adio de destrutores (ver exemplo contextualizado em anexo), visibilidade de
acesso, abstrao de objeto e interfaces de objetos.
O tratamento de objetos do PHP foi completamente reescrito, permitindo um desempenho melhor e mais vantagens.
Enquanto na verso anterior era preciso muito esforo para atender orientao a objetos e aos padres de projectos
(alguns no eram possveis), o PHP 5 veio para sanar essa deficincia. Ainda sofre nesse sentido, contudo, por
problemas devido a ser uma linguagem de tipagem fraca.
Induo de tipo
Nesse sentido, foi adicionada uma caracterstica chamada de induo de tipo, de acordo com a qual podemos ter uma
certa tipagem quando passamos objetos aos parmetros de uma funo (ou mtodo), algo inconcebvel na verso
anterior. Ver exemplo contextualizado em anexo.
[carecede fontes?]
Visibilidade
A visibilidade de uma propriedade ou mtodo pode ser definida com os seguintes modificadores de acesso: public,
protected ou private. Itens declarados como pblicos podem ser acessados pelo objeto (instncia da classe).
Membros protegidos esto acessveis s classes filhas (herdadas). A visibilidade privada limita a apenas a classe que
define o atributo ou mtodo. Ver exemplo contextualizado em anexo.
[carecede fontes?]
PHP
250
Polimorfismo
Polimorfismo Paramtrico
No polimorfismo paramtrico, um mesmo objeto pode ser utilizado uniformemente como parmetro em diferentes
contextos sem necessidade de alteraes. Um mtodo que exibe polimorfismo paramtrico (tambm chamada de
mtodo genrico) permite que o tipo do seu argumento seja determinado por um parmetro de tipo implcito ou
explcito, executando uma mesma operao, independente do tipo do argumento. O PHP no requer (ou suporta) a
definio de tipo explcita na declarao de variveis: o tipo de uma varivel determinado pelo:
[carecede fontes?]
contexto em que a varivel utilizada. Isto significa que, se voc atribuir um valor string para a varivel $var,
$var se torna uma string
Se voc ento atribuir um valor inteiro para $var, ela se torna um inteiro. Por isso o PHP no adota este tipo de
polimorfismo, pois no possui parmetros genricos
Polimorfismo por Incluso
No polimorfismo por incluso um objeto pode ser visto como pertencendo a diferentes classes que no precisam ser
disjuntas. O PHP adota esse tipo de polimorfismo, pois uma linguagem orientada a objeto que permite recursos de
herana.
Polimorfismo por Coero
O PHP tambm suporta o polimorfismo por coero, no qual a linguagem dispe de uma operao semntica para
converter um argumento para um tipo esperado por uma funo, em uma situao que de outra forma resultaria em
um erro de tipo.
[carecede fontes?]
Extenses
Extenses do PHP:
Funes de compresso de bzip2
Funes de converso de Calendar
Funes de ClibPDF
Funes de crack
Famlia de funes ctype
Biblioteca de rotinas de cliente URL - CURL
Funes de pagamento Cybercash
Funes DBM
Camada de funes de abstrao de banco de dados DBA
Funes de dBase
Funes dbx
Funes DOM XML
Funes .NET
Funes EXIF
Funes FrontBase
Funes de formato de dados de formulrios (Forms Data Format) FDF.
Funes de filePro
Funes de FTP
Funes da biblioteca de imagens GD
Funes de Gettext
PHP
251
Funes de HyperWave
Converso de tabela de caracteres ICONV
Funes de Informix
Funes de manuseio de IIS
Funes de IMAP POP3 e NNTP
Funes de Ingres II
Funes de InterBase
Funes de Java
Funes de LDAP
Funes de Multi-Byte String
Funes de Mcrypt Encryption
Funes de Mhash
Funes de Mimetype
Funes de Ming para Flash
Funes de mSQL
Funes de MSSQL
Funes de MySQL
Funes de MySQLi
Funes de Oracle 8
Funes de OpenSSL
Funes de Oracle
Funes de sobrecarga de objectos
Funes de PDF
Funes de PostgreSQL
Funes de impressora
Funes de memria Compartilhada
Funes de get and walk de SNMP
Funes de SOAP
Funes de socket
Funes de Sybase
Funes de Tidy
Funes de Tokenizer
Funes de W32api
Funes de XML-RPC
Funes de XSLT
Funes do YAZ
Funes para Arquivos Zip
Funes de compresso de ZLib
PHP
252
Bibliografia
SICA, Carlos. PHP COM TUDO. 1ed. Rio de Janeiro - RJ:Cincia Moderna, 2011.552 p. 1vol. vol.1. ISBN
978-85-399-0002-2
SICA, Carlos. PHP Orientado a Objetos: Fale a Linguagem da Internet. 1ed. Rio de Janeiro - RJ:Cincia
Moderna, 2006.216 p. 1vol. vol.1. ISBN 978-85-7393-553-0
SICA, Carlos. Programao Segura Utilizando PHP: Fale a Linguagem da Internet. 1ed. Rio de Janeiro -
RJ:Cincia Moderna, 2007.100 p. 1vol. vol.1. ISBN 978-85-7393-608-7
DALL'OGLIO, Pablo. PHP Programando com Orientao a Objetos
[19]
: Inclui Design Patterns. 1ed. So
Paulo:Novatec, 2007.576 p. ISBN 978-85-7522-137-2
DALL'OGLIO, Pablo. PHP-GTK Criando Aplicaes Grficas com PHP
[20]
. 2ed. So Paulo:Novatec,
2007.445 p. ISBN 978-85-7522-110-5
MELO, Alexandre Altair de; NASCIMENTO, Mauricio G. F. PHP Profissional
[21]
: Aprenda a desenvolver
sistemas profissionais orientados a objetos com padres de projeto. 1ed. So Paulo:Novatec, 2007.464 p. ISBN
978-85-7522-141-9
Herbert G. Fisher, PHP Guia de Consulta Rpida, Editora Novatec, ISBN 85-85184-69-8
Ligaes externas
Pgina oficial
[1]
(em ingls)
PHP
[22]
no Open Directory Project
Referncias
[1] http:/ / www. php. net/
[2] PHP on Hormones de Rasmus Lerdorf (http:/ / itc.conversationsnetwork. org/ shows/ detail3298. html)
[3] slides for 'PHP on Hormones' talk por Lerdorf (http:/ / talks. php. net/ show/ mysql07key/ 3)
[4] http:/ / php. net/ releases/ index.php
[5] PHP: News Archive - 2010 (http:/ / www. php.net/ archive/ 2010. php#id2010-12-16-1)
[6] http:/ / www. php. net/ ChangeLog-5. php#5.3.1
[7] http:/ / www. php. net/ ChangeLog-5. php#5.3.14
[8] http:/ / www. php. net/ ChangeLog-5. php#5.3.15
[9] http:/ / www. php. net/ ChangeLog-5. php#5.3.16
[10] http:/ / www.php. net/ ChangeLog-5. php#5.3.17
[11] http:/ / www.php. net/ ChangeLog-5. php#5.3.21
[12] http:/ / www.php. net/ ChangeLog-5. php#5.4.1
[13] http:/ / www.php. net/ ChangeLog-5. php#5.4.4
[14] http:/ / www.php. net/ ChangeLog-5. php#5.4.5
[15] http:/ / www.php. net/ ChangeLog-5. php#5.4.6
[16] http:/ / www.php. net/ ChangeLog-5. php#5.4.7
[17] http:/ / www.php. net/ ChangeLog-5. php#5.4.11
[18] http:/ / www.php. net/ ChangeLog-5. php#5.5.0
[19] http:/ / www.adianti.com.br/ phpoo
[20] http:/ / www.php-gtk. com. br/ book
[21] http:/ / www.novatec. com. br/ livros/ phppro
[22] http:/ / www.dmoz. org/ Computers/ Programming/ Languages/ PHP/
Ruby
253
Ruby
Ruby
Paradigma Multiparadigma
Surgido em 1995
ltima verso 2.1.1 (24 de Fevereiro de 2014)
Criado por Yukihiro Matsumoto
Estilo de tipagem: dinmica, forte
Dialetos: YARV, Ruby MRI, JRuby, Rubinius, IronRuby, MacRuby e HotRuby, RGSS
Influenciada por Ada, CLU, Dylan, Eiffel, Lisp, Perl, Python, Scheme, Smalltalk
Influenciou Falcon, Fantom, Groovy, Ioke, Nu
Licena: Dupla: Ruby License / FreeBSD License
Pgina oficial
www.ruby-lang.org
[1]
Ruby uma linguagem de programao interpretada multiparadigma, de tipagem dinmica e forte, com
gerenciamento de memria automtico, originalmente planejada e desenvolvida no Japo em 1995, por Yukihiro
"Matz" Matsumoto, para ser usada como linguagem de script. Matz queria uma linguagem de script que fosse mais
poderosa do que Perl, e mais orientada a objetos do que Python. Ruby suporta programao funcional, orientada a
objetos, imperativa e reflexiva. Foi inspirada principalmente por Python, Perl, Smalltalk, Eiffel, Ada e Lisp, sendo
muito similar em vrios aspectos a Python. Atualmente, Ruby a 11 linguagem de programao mais popular do
mundo, de acordo com o ndice Tiobe.
A implementao 1.8.7 padro escrita em C, como uma linguagem de programao de nico passe. No h
qualquer especificao da linguagem, assim a implementao original considerada de fato uma referncia.
Atualmente, h vrias implementaes alternativas da linguagem, incluindo YARV, JRuby, Rubinius, IronRuby,
MacRuby e HotRuby, cada qual com uma abordagem diferente, com IronRuby, JRuby e MacRuby fornecendo
compilao Just-In-Time e, JRuby e MacRuby tambm fornecendo compilao Ahead-Of-Time. A srie 1.9 usa
YARV (Yet Another Ruby VirtualMachine), como tambm a 2.0, substituindo a lenta Ruby MRI (Matz's Ruby
Interpreter).
Ruby
254
Histria
Yukihiro Matsumoto, criador da linguagem
Ruby
A linguagem Ruby foi concebida em 24 de fevereiro de 1993 por Yukihiro
Matsumoto, que pretendia criar uma nova linguagem que balanceava
programao funcional com a programao imperativa. Matsumoto
afirmou: "Eu queria uma linguagem de script que fosse mais poderosa do
que Perl, e mais orientada a objetos do que Python. por isso que eu decidi
desenvolver minha prpria linguagem.".
Aps o lanamento do Ruby 1.3 em 1999, iniciou-se a primeira lista de
discusso em ingls chamada Ruby-Talk, marcando um interesse crescente
na linguagem fora do Japo. Em setembro de 2000, o primeiro livro em
ingls, Programming Ruby
[2]
, foi impresso, sendo mais tarde liberado
gratuitamente para o pblico, ajudando no processo de adoo de Ruby por
falantes do ingls.
Por volta de 2005, o interesse pela linguagem Ruby subiu em conjunto com
o Ruby on Rails, um framework de aplicaes web popular escrito em
Ruby. Rails frequentemente creditada como a aplicao que tornou Ruby
"famosa" e a associao to forte que ambos so muitas vezes
confundidos por programadores que so novos a Ruby.
At a verso 1.9.2-p290, a linguagem era lanada sob a licena dupla Ruby License / GNU General Public License.
A partir da verso 1.9.3-p0, passou a ser lanada sob a licena dupla Ruby License / FreeBSD License (tambm
conhecida como 2-clause BSDL).
A partir da verso 2.1.0, o projeto passou a utilizar versionamento semntico.
Suporte oficial para a verso 1.9.3 se encerrar dia 23 de fevereiro de 2015.
Etimologia do nome "Ruby"
O nome "Ruby", foi decidido durante uma sesso de bate-papo online entre Matsumoto (Matz) e Keiju Ishitsuka em
24 de fevereiro de 1993, antes que qualquer linha de cdigo tivesse sido escrita para a linguagem. Inicialmente foram
propostos dois nomes: "Coral" e "Ruby", sendo esse ltimo nome proposto escolhido mais tarde por Matz em um
e-mail para Ishitsuka. Matsumoto explicou mais tarde que o motivo de ter escolhido o nome "Ruby" foi porque essa
era a pedra zodiacal de um de seus colegas.
Caractersticas
Uma srie de caractersticas foram definidas para atender s propostas do Ruby:
Todas as variveis so objetos, onde at os "tipos primitivos" (tais como inteiro, real, entre outros) so classes
Mtodos de gerao de cdigo em tempo real, como os "attribute accessors"
Atravs do RubyGems, possvel instalar e atualizar bibliotecas com uma linha de comando, de maneira similar
ao APT do Debian Linux
Code blocks (blocos de cdigo) passados como parmetros para mtodos; permite a criao de clausuras
Mixins, uma forma de emular a herana mltipla
Tipagem dinmica, mas forte. Isso significa que todas as variveis devem ter um tipo (fazer parte de uma classe),
mas a classe pode ser alterada dinamicamente
Ruby est disponvel para diversas plataformas, como Microsoft Windows, Linux, Solaris e Mac OS X, alm de
tambm ser executvel em cima da mquina virtual Java (atravs do JRuby) e haver um projeto para ser executvel
em cima da mquina virtual Microsoft .NET, o IronRuby.
Ruby
255
Tipos de dados
No existem "tipos primitivos" em Ruby; todos os tipos so classes:
Object a classe me de todas as outras classes em Ruby
Numeric uma classe abstrata que representa nmeros
Integer uma classe que representa nmeros inteiros
Fixnum representa nmeros inteiros de preciso fixa
Bignum representa nmeros inteiros de preciso infinita, dependente apenas da memria disponvel
Float uma classe que representa nmeros de ponto flutuante (nmeros reais)
String uma cadeia de caracteres. Pode ser delimitado por apstrofes (') ou aspas ("). Tudo o que h entre
apstrofes interpretado literalmente, entre aspas o programador deve se utilizar de smbolos para representar
caracteres especficos, como em C. Exemplos: 'azul', "a\nb\nc"
Symbol semelhante a uma string, mas dois smbolos iguais possuem o mesmo endereo de memria, sendo
assim timo para se utilizar como ndice numa Hash. Porm, devido sua natureza, o coletor de lixo do Ruby
no os elimina. definido com um sinal de dois pontos (:), por exemplo, :nome
Array so arrays dinmicos, que podem ser usados para representar matrizes e vetores. delimitado por
colchetes ([]) e cada valor separado por vrgula. Exemplo: [4, 'azul', :termometro]
Hash representa um vetor associativo, e, assim como as Arrays, dinmica. delimitada por chaves ({}), e o
ndice precede o valor com um sinal '=>'. Exemplo: {:controller => 'user', :action => 'index'}. Qualquer objeto
pode ser um ndice, mas os mais usados so as Strings e os Symbols
Regexp representa expresses regulares, delimitadas por //. Funciona de forma semelhante a Perl. Exemplo:
/a|ae/
Declarao de variveis
Um objeto em Ruby declarado com uma atribuio comum:
var1 = 2
var2 = Classe.new
var3 = Classe2.new(parametro)
Uma varivel local declarada normalmente. Uma varivel de instncia declarada com um "@" no nome. Uma
varivel de classe declarada com "@@", e uma varivel global declarada com "$". Variveis que iniciam com
uma letra maiscula so consideradas constantes.
local = "local"
@instancia = 42
@@classe = /f+/
$Pi = 3.1415926
Ruby
256
Exemplos de cdigo
Programa Ol Mundo
puts "Ol, Mundo!"
Strings
H uma variedade de mtodos para definir strings em Ruby. As definies a seguir so equivalentes e suportam
interpolao. Note a diferena entre resultados dos comandos "print", "puts" e "p":
print a = "\nIsto uma string de aspas duplas\n"
puts a = %Q{\nIsto uma string de aspas duplas\n}
p a = %{\nIsto uma string de aspas duplas\n}
p a = %/\nIsto uma string de aspas duplas\n/
p a = <<BLOCO

Isto uma string de aspas duplas
BLOCO
O cdigo a seguir define duas strings "cruas" que so equivalentes:
p a = 'Isto uma string de aspas simples'
p a = %q{Isto uma string de aspas simples}
Colees
Array
a = [1, 'oi', 3.14, 1, 2, [4, 5]]
a[2] # => 3.14
a.reverse # => [[4, 5], 2, 1, 3.14, 'oi', 1]
a.flatten.uniq # => [1, 'oi', 3.14, 2, 4, 5]
a.push(23) # a = [1, 'oi', 3.14, 1, 2, [4, 5], 23]
a << 22 # a = [1, 'oi', 3.14, 1, 2, [4, 5], 23, 22]
Hash
hash = {'gua' => 'molhada', 'fogo' => 'quente'}
puts hash['fogo'] # "quente"
hash.each_pair do |chave, valor|
puts "#{chave} #{valor}"
end
# Imprime:
# gua molhada
# fogo quente
hash.delete_if {|chave, valor| chave == 'gua'} # Apaga 'gua' =>
Ruby
257
'molhada'
Blocos e iteradores
Blocos de cdigo (ou code blocks) so trechos de cdigo que so passados como parmetros para mtodos. Blocos
so extremamente usados em Ruby.
class Paises
@paises = ["Argentina", "Brasil", "Paraguai", "Uruguai"]
def self.each
for pais in @paises
yield pais
end
end
end
Paises.each do |pais|
puts "Ol, #{pais}!"
end
Iterando em arrays usando blocos:
array = [1, 'oi', 3.14]
array.each do |item|
puts item
end
# => 1
# => 'oi'
# => 3.14
# Equivalente, usando chaves:
array.each { |item|
puts item
}
# => 1
# => 'oi'
# => 3.14
Em Ruby, a estrutura de repetio for apenas acar sinttico para acessar o mtodo each, existente em iteratores.
array = [1, 'oi', 3.14]
for item in array
puts item
end
# => 1
# => 'oi'
# => 3.14
Ruby
258
Blocos funcionam com muitos mtodos padro; no exemplo a seguir, o uso de blocos com arquivos:
File.open('arquivo.txt', 'w') do |arquivo|
for i in (1..3) do
arquivo.puts 'Ol, Mundo!'
end
end # O arquivo fechado
automaticamente aqui
File.readlines('arquivo.txt').each do |linha|
puts linha
end
# => Ol, Mundo!
# => Ol, Mundo!
# => Ol, Mundo!
Criando uma funo annima:
proc {|arg| print arg}
Proc.new {|arg| print arg}
lambda {|arg| print arg}
Classes
O cdigo a seguir define uma classe chamada Pessoa. Alm de initialize, o construtor para criar novos objetos, essa
classe tem dois mtodos: um que sobre-escreve o operador de comparao > (maior), e sobre-escreve o mtodo
to_s (assim o comando puts pode formatar a sada). Aqui attr_reader um exemplo de metaprogramao
em Ruby: attr_reader define o mtodo getter, attr_writer define o mtodo setter, e attr_accessor
define ambos. Em Ruby, todos os atributos so privados e todos os mtodos pblicos, por padro. Ruby permite
definir opcionalmente o tipo de acesso usando trs palavras-chave: public (pblico), private (privado) e protected
(protegido). Ruby no suporta sobrecarga de mtodos, mas suporta argumentos padro, que podem ser utilizados
para o mesmo fim. Tambm, o ltimo comando em um mtodo considerado o seu valor de retorno, permitindo a
omisso de um explcito return.
class Pessoa
attr_reader :nome, :idade

def initialize(nome = "Desconhecido", idade)
@nome, @idade = nome, idade
end

def >(pessoa)
if self.idade > pessoa.idade
return true
else
return false
end
end
Ruby
259
def to_s # Mtodo usado pelo mtodo puts() para formatar a sada
"#@nome (#@idade anos)"
end
end

pessoas = [
Pessoa.new("Ricardo", 19),
Pessoa.new(idade = 25)
]

puts pessoas[0]
puts pessoas[1]
puts pessoas[0] > pessoas[1] # O mesmo que: pessoas[0].>(pessoas[1])
O cdigo acima ir imprimir:
Ricardo (19 anos)
Desconhecido (25 anos)
false
Classes abertas
Em Ruby, as classes nunca so fechadas: voc pode sempre adicionar novos mtodos a uma classe. Isso se aplica
tanto para classes criadas por voc, quanto para as classes padro. Um exemplo simples de adio de um novo
mtodo a classe padro String:
class String
def iniciais
ini = String.new
for nome in self.split do
ini += nome[0]
end
return ini
end
end
puts "Ricardo Silva Veloso".iniciais # Imprime RSV
Herana
Ruby no suporta herana mltipla. Ao invs disso, Ruby usa Mixins para emular herana mltipla:
class Pessoa < Mamifero # Herana de Mamifero
include Humano # Emulando herana mltipla
end
No exemplo acima, "Humano" um mdulo (module).
Ruby
260
Modules
Alm das classes normais, Ruby possui os "Modules", que so classes de classes, permitindo espao de nomes:
module Humano
class Classe1
def info
"#{self.class} (\##{self.object_id}): #{self.to_s}"
end
end
end
Tratamento de excees
Como a maioria das linguagens modernas, Ruby tambm possui suporte para tratamento de exceo. As
palavras-chave para isto so "begin", "rescue" e "ensure". "Begin" inicia um trecho que pode cair em alguma
exceo (opcional), "Rescue" determina o comportamento em caso de uma exceo especfica ou no e, "Ensure" o
cdigo que ser executado independente de ter havido exceo ou no.
begin
# Faa algo
rescue
# Trata alguma exceo
else
# Faa isto se nenhuma exceo for lanada
ensure
# Faa isto se alguma ou nenhuma exceo for lanada
end
Ruby para administradores de sistemas
A maioria dos administradores de sistemas Unix utilizam Perl ou Shell Script como ferramenta para resolver os
problemas. Mas possvel usar Ruby e Python para os mesmos fins. Abaixo, a idia fazer um pequeno script que
verifica se o servio da porta 80 (Web) de alguns servidores estavam ativos.
require 'net/http'
File.open("hosts.txt", "r").each_line do | host |
conexao = Net::HTTP.new(host.chomp, 80)
resposta, conteudo = conexao.get("/", nil)
if resposta.code.to_i > 400
# aqui vai a rotina pra enviar email...
end
end
Ruby
261
Repositrios e bibliotecas
Ruby possui repositrios de bibliotecas disponveis em sites como Ruby Forge e The Ruby Toolbox; um bastante
popular, Ruby Application Archive (RAA), foi descontinuado em agosto de 2013. Existe, ainda, uma ferramenta de
instalao de bibliotecas, chamada RubyGems, semelhante aos gerenciadores de pacotes do Linux, como o APT.
Muitos projetos foram movidos para o GitHub, focado em Git, que tinha suporte nativo ao empacotamento do
RubyGems. Porm, esse servio de empacotamento foi descontinuado, em prol de Jeweler e Gemcutter.
O projeto mais famoso desenvolvido em Ruby o meta-framework Ruby on Rails.
Ligaes externas
Pgina oficial
[1]
(em japons, em ingls e em portugus)
Ruby
[3]
no GitHub
The Book Of Ruby
[4]
(em ingls)
O Guia (comovente) de Ruby do Why
[5]
(em portugus)
Aprenda a Programar
[6]
(em portugus)
Ruby
[7]
no Open Directory Project
Referncias
[1] https:/ / www. ruby-lang. org/
[2] http:/ / ruby-doc. org/ docs/ ProgrammingRuby/
[3] https:/ / github.com/ ruby/ ruby
[4] http:/ / www. sapphiresteel. com/ the-book-of-ruby
[5] http:/ / why. nomedojogo. com/
[6] http:/ / aprendaaprogramar.rubyonrails. pro. br
[7] http:/ / www. dmoz. org/ Computers/ Programming/ Languages/ Ruby/
262
Os anos 2000
C
1. REDIRECIONAMENTO C Sharp
Clojure
Clojure
Paradigma funcional
Surgido em 2007
Criado por Rich Hickey
Estilo de tipagem: forte, dinmica
Compiladores JVM, CLR
Dialetos: Lisp, Scheme, Common Lisp
Influenciada por Lisp, Prolog, ML, Haskell, Erlang
Licena: Eclipse Public License
Clojure, na informtica, uma variante moderna de Lisp, desenvolvida por Rich Hickey. Clojure roda sobre a Java
Virtual Machine (JVM).
Introduo
Clojure um dialeto moderno da linguagem de programao Lisp, Scheme e Common Lisp e roda na Java Virtual
Machine ou CLR (Common Language Runtime). um paradigma de linguagem de programao funcional. Como a
linguagem Lisp, a sintaxe Clojure construda em S-expressions.
Rich Hickey desenvolveu Clojure porque queria um Lisp moderno em programao funcional, que tivesse simbitica
a plataforma Java e concebido para multiconcorrncia. Esta concorrncia caracteriza pelo conceito de identidades,
que representam uma srie de estados imutveis ao longo do tempo e, tendo os valores imutveis, qualquer nmero
pode trabalhar em paralelo. Clojure fornece vrios tipos de referncia mutveis para transio entre estados.
Clojure
263
Caracterstica da Linguagem
Uma linguagem compilada produzindo um bytecode JVM
Desenvolvimento dinmico
nfase na recursividade
Concorrncia
Exemplos de cdigo
(println "Ol, Mundo!")
Ligaes externas
Pgina oficial
[1]
(em ingls)
Referncias
[1] http:/ / clojure. org/
264
Extenses orientadas aspectos
AspectJ
Geral
AspectJ uma linguagem de programao pertencente ao paradigma orientado aspectos, que consiste basicamente
em retirar os interesses transversais(crosscutting ou separation of concerns) de um programa em Java.
Um fator que difere o AspectJ das demais linguagens de programao, o fato de no ser possvel construir
programas usando somente o AspectJ, sendo necessrio tambm utilizar [Java]. Isso vem pela prpria idia do
paradigma orientado aspectos, sendo usada para "customizar" programas em Java, solucionando alguns problemas
decorrentes da Orientao a objetos.
Alguns exemplos de problemas da Orientao a objetos so os logs das aplicaes e a parte de segurana. Nesses
casos, por se trabalhar com objetos, inevitvel a dependncia excessiva dos objetos que fazem os logs e a parte de
segurana, o que conhecido como interesse tranversal, os logs e segurana, no fazem parte do core-business da
aplicao, porm so extremamente necessrios. Para solucionar esses problemas foi criado o conceito do paradigma
orientado aspectos e da linguagem "auxiliar" AspectJ.
AspectJ no possui um sistema de tipos.
Histria
Foi desenvolvida por uma diviso de pesquisa da Xerox, chamado Xerox PARC. Hoje mantido pela Eclipse
Fundation, mantenedora de alguns projetos de cdigo aberto e integrado na ferramenta de desenvolvimento Eclipse
(IDE). Foi idealizada por Gregor Kiczales, professor da University of British Columbia no Canad.
Como o AspectJ funciona
Um aspecto age, interferindo no programa original, utilizando a ideia de join point, onde o aspecto descrito. Nessa
descrio, defini-se algumas regras de interferncia, como:
* pointcuts.
* advices.
* declarao de inter-tipos.
Exemplos de Sintaxe
Um exemplo bsico de um aspecto:
aspect VisitAspect {
void Point.acceptVisitor(Visitor v) {
v.visit(this);
}
}
Hello World em AspectJ:
AspectJ
265
public class HelloWorld {
public static void main(String[] args) {
}
}
public aspect HelloFromAspectJ {
pointcut mainMethod() : execution(public static void main(String[]));
after() returning : mainMethod() {
System.out.println("Hello World");
}
}
Por ser uma linguagem que no existe por si s, ou seja depende do Java, no possvel ter resolues de alguns
algortmos simples como por exemplo calcular os nmeros perfeitos.
Ligaes externas
Pgina da Eclipse Fundation: [1]
Artigo do JavaFree: [2]
Artigo(em ingls) sobre uso do AspectJ no Spring: [3]
Referncias
[1] http:/ / www. eclipse.org/ aspectj/
[2] http:/ / javafree. uol. com.br/ artigo/ 871488/ AspectJ-em-20-minutos. html
[3] http:/ / www. infoq.com/ articles/ Simplifying-Enterprise-Apps
Fontes e Editores da Pgina
266
Fontes e Editores da Pgina
Histria das Linguagens de Programao Fonte: http://pt.wikipedia.org/w/index.php?oldid=38060147 Contribuidores: Dbastro, Fvmp, Jrgdelrisco, Lechatjaune, Ricardo Augustinis, Ricardo
Ferreira de Oliveira, Sandro Madruga Silveira, Stuckkey, Zdtrlik, 11 edies annimas
Charles Babbage Fonte: http://pt.wikipedia.org/w/index.php?oldid=38347731 Contribuidores: Agil, Beremiz, Castelobranco, Celiofranco, Claudios, Dtavares, Eduardo Henrique Rivelli Pazos,
Fernaodias, Giro720, Jonas AGX, JustinDecker1, Kaktus Kid, Laobc, Lechatjaune, MarioM, Mesh, Mschlindwein, Mwaldeck, Nuno Tavares, OTAVIO1981, Petrus Yuri, Rei-artur, Ricardo
Ferreira de Oliveira, Simoes, Xexeo, 40 edies annimas
Ada Lovelace Fonte: http://pt.wikipedia.org/w/index.php?oldid=38782027 Contribuidores: !Silent, Agil, Biologo32, Carlos Luis M C da Cruz, Crash Overclock, Diraol, Dvulture, Ednei da
Silva Rosa, Fabsouza1, Francisco Leandro, Geovani.s, Giro720, Hallel, I2bdad, Indech, Joao4669, Jovem Werther, Joo Carvalho, Kaktus Kid, Less, Luckas Blade, LusaMFerreira,
Mschlindwein, Nuno Tavares, Onjacktallcuca, Pedro Listel, Petrus Yuri, Raphael Figueira, Regi-Iris Stefanelli, Rei-artur, Reporter, Ricardo Ferreira de Oliveira, Rvnovaes, Salgueiro, Simoes,
Stuckkey, Thom, Troll, Wikipedista, 54 edies annimas
Herman Hollerith Fonte: http://pt.wikipedia.org/w/index.php?oldid=38238078 Contribuidores: Agil, Bruno Ishiai, CapEnt, Dantadd, Darwinius, Eduardoferreira, Jic, Kaktus Kid,
Mschlindwein, OS2Warp, Palica, RafaAzevedo, Renato de carvalho ferreira, Ritateixeira28, Sam, Skoll, Triquetra, Zoldyick, 26 edies annimas
Alan Turing Fonte: http://pt.wikipedia.org/w/index.php?oldid=38923244 Contribuidores: !Silent, Agil, Ale vx, Alexg, Antero de Quintal, Argenti, Belanidia, Bem bom, Bepp, Bisbis, Bitolado,
Castrolobo, ChristianH, Ci.cp, Danilomath, Devilwar, Diego Queiroz, Dmozglbtbr, Ddi's, E2m, Eonzoikos, Eric Duff, Feen, GilliamJF, Giro720, Gustavo Destro, Helder.wiki, Jbribeiro1,
Jefferson055, Jjesuswiki, Jmx, Joseolgon, Juntas, Kaktus Kid, Kenchikka, LP Srgio LP, Laobc, Leandrogpp, Leonardo.stabile, LeonardoRob0t, MCarsten, MachoCarioca, Matheus S,
Mschlindwein, Nice poa, Nuno Tavares, OTAVIO1981, Osias, Petrus Yuri, PortugalSuperGay, Prowiki, Quiumen, Rafael.afonso, Ricardo Ferreira de Oliveira, Salgueiro, Simoes, Sowiki50,
Stuckkey, Sturm, Teles, Vanthorn, Yone Fernandes, Zoldyick, 81 edies annimas
Alonzo Church Fonte: http://pt.wikipedia.org/w/index.php?oldid=37833810 Contribuidores: Agil, Ale vx, Arthur Buchsbaum, Beria, Daniel Feliciano, Diego Queiroz, Eonzoikos,
Humbertobrandao, Kaktus Kid, Lijealso, Patrick, Thebext, 4 edies annimas
Konrad Zuse Fonte: http://pt.wikipedia.org/w/index.php?oldid=37894291 Contribuidores: 4you, Adailton, Agil, Joaotg, Kaktus Kid, Rodrigolopes, Rubens Luccas, Simoes, Theus PR,
Wikipedista, 19 edies annimas
Z1 Fonte: http://pt.wikipedia.org/w/index.php?oldid=34934443 Contribuidores: Adailton, Al Lemos, Ciro, Dbastro, Eberval.castro, Jic, Leonardo.stabile, LeonardoG, Ricardo Ferreira de
Oliveira, Samuelpeixoto, 3 edies annimas
Z2 Fonte: http://pt.wikipedia.org/w/index.php?oldid=34936405 Contribuidores: Adailton, Ciro, Dbastro, DoubleG2, Fs almeida bf, Leonardo.stabile, Rfdias, Samuelpeixoto, Tonyjeff, 2 edies
annimas
Z3 Fonte: http://pt.wikipedia.org/w/index.php?oldid=36642034 Contribuidores: Ciro, Dbastro, Geovani.s, Hermgenes Teixeira Pinto Filho, Vinicius Paulo Seze, 3 edies annimas
Z4 Fonte: http://pt.wikipedia.org/w/index.php?oldid=35050810 Contribuidores: Daimore, Dbastro, Fs almeida bf
O Colossus Fonte: http://pt.wikipedia.org/w/index.php?oldid=38631990 Contribuidores: Albmont, Ale vx, Alexg, Cainamarques, Dbastro, DoubleG2, Hyju, Leonardo.stabile, Mont4nha, Nuno
Tavares, Sturm, Xexeo, 10 edies annimas
Harvard Mark I Fonte: http://pt.wikipedia.org/w/index.php?oldid=34974975 Contribuidores: Dbastro, Leonardo.stabile, Lus Felipe Braga, Yanguas, Yvanici, Zoldyick, 3 edies annimas
ENIAC Fonte: http://pt.wikipedia.org/w/index.php?oldid=38739917 Contribuidores: !Silent, 333, Arges, Caio.gallo, Carlos28, Chicocvenancio, Clara C., Cleberjean, Cleitonx1, Colaborador Z,
CorreiaPM, Dbastro, Devilr0ck123, Devoglio, Edinaldo B. Freitas, GOE, Gean, HVL, JotaCartas, Kaktus Kid, Kleiner, Leonardo.stabile, Lijealso, Lus Felipe Braga, Lpton, Mvdiogo,
OS2Warp, PatrciaR, PauloEduardo, Plataformista, Prima.philosophia, Py4nf, Rafaelguita00, Raul Caarvalho, Reporter, Ricardo Augustinis, Rui Malheiro, Rush, Staab, Stuckkey, Teles,
Themafiakiller, Victor R12, Viniciusmc, Vitor Mazuco, Zoldyick, 240 edies annimas
EDVAC Fonte: http://pt.wikipedia.org/w/index.php?oldid=38922035 Contribuidores: !Silent, Al Lemos, MisterSanderson, 9 edies annimas
Plankalkl Fonte: http://pt.wikipedia.org/w/index.php?oldid=38512236 Contribuidores: !Silent, Adailton, Clarice Reis, Davemustaine, Dbastro, Eamaral, Jjfreitas, Mschlindwein, Ruy Pugliesi,
Stuckkey, UN Jose Freitas, Wikipedista, 4 edies annimas
Short Code Fonte: http://pt.wikipedia.org/w/index.php?oldid=36857491 Contribuidores: Dbastro, Leonardo.stabile, Ricardo Ferreira de Oliveira
Sistema A-0 Fonte: http://pt.wikipedia.org/w/index.php?oldid=38869683 Contribuidores: Dbastro, Fvmp, Ricardo Ferreira de Oliveira, Vitor Mazuco, 1 edies annimas
Personagem: John Backus Fonte: http://pt.wikipedia.org/w/index.php?oldid=34923642 Contribuidores: 333, Beto, Clarice Reis, Kaktus Kid, Leonardo.stabile, Rafael.afonso, Ricardo Ferreira
de Oliveira, Rigolin, 3 edies annimas
Speedcoding Fonte: http://pt.wikipedia.org/w/index.php?oldid=35447655 Contribuidores: Ricardo Ferreira de Oliveira
Personagem: Grace Hopper Fonte: http://pt.wikipedia.org/w/index.php?oldid=38647951 Contribuidores: Antero de Quintal, Coltsfan, Daemorris, Deniscostadsc, Filipe Saraiva, Hsvab,
Jjesuswiki, Jos Carlos J. Vital, Kaktus Kid, Leonardo.stabile, Luckas Blade, Lus Felipe Braga, Mwaldeck, Orelhas, Stuckkey, Victorwss, rico Jnior Wouters, 37 edies annimas
Flow-Matic Fonte: http://pt.wikipedia.org/w/index.php?oldid=36857359 Contribuidores: Dbastro, Ricardo Ferreira de Oliveira, Xexeo
Fortran Fonte: http://pt.wikipedia.org/w/index.php?oldid=38543892 Contribuidores: Alchimista, Clara C., CommonsDelinker, CostaJES, Dbastro, Drenoel, Eamaral, EduM, EduRihan, Eisdur,
FSogumo, Fernando S. Aldado, Fortranplus, Gbiten, Helderpc, Hugocanalli, JMGM, Joaopchagas2, Kaktus Kid, Lameiro, Leonardo.stabile, LeonardoG, Lijealso, Lipehauss, Lus Felipe Braga,
Master, Mecanismo, Mschlindwein, Pcosmo, Quinelato, Rafael.afonso, Ricardo Ferreira de Oliveira, Rudnei.cunha, Sampayu, Tuga1143, Xexeo, 80 edies annimas
COMTRAN Fonte: http://pt.wikipedia.org/w/index.php?oldid=36929133 Contribuidores: Dbastro, Gunnex, Ricardo Ferreira de Oliveira, Yanguas, 3 edies annimas
COMIT Fonte: http://pt.wikipedia.org/w/index.php?oldid=34866524 Contribuidores: Ricardo Ferreira de Oliveira, Santana-freitas
ALGOL 58 Fonte: http://pt.wikipedia.org/w/index.php?oldid=37940104 Contribuidores: Eisdur, Rodrigo Padula, Xexeo, 1 edies annimas
FACT Fonte: http://pt.wikipedia.org/w/index.php?oldid=37094406 Contribuidores: Dbastro, J. A. S. Ferreira, Ricardo Ferreira de Oliveira
IPL Fonte: http://pt.wikipedia.org/w/index.php?oldid=36929098 Contribuidores: Dbastro, Eduardofeld, Hyju, J. A. S. Ferreira, Ricardo Ferreira de Oliveira
Personagem: John McCarthy Fonte: http://pt.wikipedia.org/w/index.php?oldid=38216740 Contribuidores: !Silent, 333, Beto, Eric Duff, FSogumo, Fabiano Tatsch, Hum Milho, Jayjr, Joo
Sousa, Kaktus Kid, Kolja21, LPrati, Leonardo.stabile, Lijealso, Lus Felipe Braga, Nice poa, Pepita Negra, Py4nf, Ricardo Ferreira de Oliveira, 5 edies annimas
LISP Fonte: http://pt.wikipedia.org/w/index.php?oldid=545211 Contribuidores: Alchimista, Alexg, Antoniopessoa, Antnio Leito, Carlos28, E2mb0t, FML, GOE, Icoeng, Jonas AGX, Joyo,
Joo Carvalho, Juntas, Kensu, Leonardo.stabile, LeonardoG, LeonardoRob0t, Lvaruzza, Manuel Anastcio, Master, Mecanismo, Mschlindwein, Netsettler, OS2Warp, Rafael.afonso, Ricardo
Ferreira de Oliveira, Rita.dos.santos, SallesNeto BR, Waldir, 77 edies annimas
COMIT Fonte: http://pt.wikipedia.org/w/index.php?oldid=34866524 Contribuidores: Ricardo Ferreira de Oliveira, Santana-freitas
RPG Fonte: http://pt.wikipedia.org/w/index.php?oldid=37094424 Contribuidores: !Silent, Adailton, Cesarious, Dbastro, FML, Leonardo.stabile, LeonardoG, Lus Felipe Braga, Nuno Tavares,
Ricardo Ferreira de Oliveira, Ricvelozo, 13 edies annimas
Fontes e Editores da Pgina
267
COBOL Fonte: http://pt.wikipedia.org/w/index.php?oldid=38749204 Contribuidores: !Silent, Amgauna, ChristianH, CommonsDelinker, Daimore, Daniloajoliveira, Dantadd, Dbastro, Dianakc,
E2m, Edermachado, Edu Niccio, Facc1986, Fneto, Francisco Leandro, Fvmp, GOE, Gbiten, Gerbilo, Get It, Guilherme, Ivnogueira, Jmbgouveia, Jos Carlos J. Vital, Jvdm, LeonardoG,
Lijealso, LonE, Lus Felipe Braga, Marcioadroaldo, Mschlindwein, Muriel Gottrop, Mrio e Drio, OS2Warp, Onjacktallcuca, Orium, Porantim, Projrev2, Raphael.lorenzeto, Rei-artur, Reporter,
Ricardo Ferreira de Oliveira, Rnbastos, Rui Silva, Stuckkey, Tiago Zeni, Tschulz, Tullez, Tumnus, Vicentesloboda, Yachee, Yanguas, Zumg, 132 edies annimas
Personagem: Peter Naur Fonte: http://pt.wikipedia.org/w/index.php?oldid=38215360 Contribuidores: 333, CommonsDelinker, Eric Duff, Hivakun, Kaktus Kid, Leonardo.stabile, Nice poa,
Renato Bullio, 9 edies annimas
ALGOL 60 Fonte: http://pt.wikipedia.org/w/index.php?oldid=37940105 Contribuidores: Malafaya, Ricardo Ferreira de Oliveira, Rodrigo Padula, Xexeo
SNOBOL Fonte: http://pt.wikipedia.org/w/index.php?oldid=36913638 Contribuidores: 213.58.49.xxx, Dbastro, Dvulture, JoaoMiranda, Jorge, Lameiro, Litrogenio89, Ricardo Ferreira de
Oliveira, Tsferreira, 4 edies annimas
CPL Fonte: http://pt.wikipedia.org/w/index.php?oldid=36872746 Contribuidores: Dbastro, Giro720, Pcromano, 2 edies annimas
BASIC Fonte: http://pt.wikipedia.org/w/index.php?oldid=38771486 Contribuidores: !Silent, Andre nho, Bons, Ciro, Dbastro, Der kenner, Diotti, Disnei, Eamaral, Edgard.magalhaes,
Emersongois, Ensjo, Felipe S Matos, Felipegaucho, Gbiten, Gunnex, Helder.wiki, Hyju, Jorge, JotaCartas, Kascyo, Leonardo.stabile, LeonardoG, LeonardoRob0t, Lgrave, Mara Silva, Matheus
Faria, Nice poa, Panglossa, Prima.philosophia, Raimundo Norberto, Reporter, Rhe, Ricardo Ferreira de Oliveira, Ricvelozo, Rjclaudio, Stuckkey, Willian cruz, Xandi, Xexeo, Xos, 49 edies
annimas
PL/I Fonte: http://pt.wikipedia.org/w/index.php?oldid=36928088 Contribuidores: 555, Capmo, CommonsDelinker, Czy, Czyyyy, Dbastro, Eclesiastes, Helder.wiki, Jorge, Kherrman,
LeonardoG, Liber7, OS2Warp, Palica, Ricardo Ferreira de Oliveira, Thevirus, ThiagoRuiz, Xexeo, 10 edies annimas
BCPL Fonte: http://pt.wikipedia.org/w/index.php?oldid=37094144 Contribuidores: Dbastro, Leonardo.stabile, LeonardoG, Orium, Rafael.afonso, Ricardo Ferreira de Oliveira, Ricvelozo, 3
edies annimas
Icon Fonte: http://pt.wikipedia.org/w/index.php?oldid=34430549 Contribuidores: !Silent, Ahyama, E2m, Jorge, Leonardo.stabile, LeonardoRob0t, Nuno Tavares, Rafael.afonso, Ricardo
Ferreira de Oliveira, Ricvelozo, Sturm, ThiagoRuiz, Vanthorn, Xexeo, 6 edies annimas
ALGOL 68 Fonte: http://pt.wikipedia.org/w/index.php?oldid=37940106 Contribuidores: Burmeister, Camponez, Joo Carvalho, NevilleDNZ, Oscar Antunes, Ricardo Ferreira de Oliveira,
Rodrigo Padula, Ttravesso, Xexeo, 3 edies annimas
B Fonte: http://pt.wikipedia.org/w/index.php?oldid=34740449 Contribuidores: !Silent, Bons, Daemorris, Fvmp, Leonardo.stabile, LeonardoG, Luis Dantas, Orium, Ricardo Ferreira de
Oliveira, Ricvelozo, Xexeo, Zamirvarandas, 11 edies annimas
APL Fonte: http://pt.wikipedia.org/w/index.php?oldid=37983529 Contribuidores: Ana couto, Castelobranco, Ciro, Dbastro, Kaktus Kid, Leonardo.stabile, Pkantek, Ricardo Ferreira de Oliveira,
Rodrigo Padula, 3 edies annimas
Simula Fonte: http://pt.wikipedia.org/w/index.php?oldid=36539631 Contribuidores: Agil, Eamaral, Fabiano Tatsch, Fabiogramos, Fvmp, Get It, Kaktus Kid, LeonardoG, Marcoapc,
Mschlindwein, Stevansilva, Xexeo, 7 edies annimas
Logo Fonte: http://pt.wikipedia.org/w/index.php?oldid=38711958 Contribuidores: !Silent, Adrianfreitas, Bisbis, Capmo, Carlos Luis M C da Cruz, CasperBraske, Dbastro, Der kenner,
Devoglio, Fernando S. Aldado, Fvmp, Gunnex, Israel77, Juliano.Bittencourt, Ka barros, Kakisson, Laura Nielsen, Lechatjaune, LeonardoG, Lord Mota, Lusitana, Marcelo Reis, MisterSanderson,
Mosca, Mpbarbosa, OS2Warp, Pauloslomp, Porantim, Rafael.afonso, Slomp, Sturm, Tiago.bentivegna, 89 edies annimas
Personagem: Niklaus Wirth Fonte: http://pt.wikipedia.org/w/index.php?oldid=38216701 Contribuidores: !Silent, Agil, DeathGhost, Get It, Kaktus Kid, Luckas Blade, Nice poa, Orium,
Ricardo Ferreira de Oliveira, Xandi, Zdtrlik, 3 edies annimas
Pascal Fonte: http://pt.wikipedia.org/w/index.php?oldid=38566412 Contribuidores: !Silent, Agil, Amgauna, Andr Koehne, Baseador, Belanidia, Bitolado, Cacatdias, Carlos Rosa PT,
Carlosnatal, CasperBraske, Circular, Dancunha98, Dbastro, E2m, Eclesiastes, Edu Niccio, Eduardo, Eduardoferreira, Enderson, Flaviocruz1, Francisco Leandro, Furadrae, Gean, Get It,
Gibanauts, Gladstone, Guilherme Paula, Higorrg, IcaroBragana, Indech, JSSX, Jorge Morais, Joo Carvalho, Kascyo, Lameiro, Leonardo.stabile, LeonardoG, Leuadeque, Lflrocha, Lijealso,
LordTuga, Lus Felipe Braga, Marcric, Mariolui, Mautf, Menezes1992, NH, Nunof, OS2Warp, Pipas1234, RafaAzevedo, Rafael.afonso, Rafaelrosa, Ramosinfo, Ricardo Ferreira de Oliveira,
Ricvelozo, Roberto Cruz, Rsjuliao, Rdi, Sekelsenmat, Shadlan, Stegop, Stuckkey, ThiagoRuiz, Tilgon, Tumnus, Valdirsjr, Vanthorn, Vini 175, VonNaturAustreVe, Waldir, Waltercruz, Xexeo,
219 edies annimas
Personagem: Dennis Ritchie Fonte: http://pt.wikipedia.org/w/index.php?oldid=38216537 Contribuidores: 333, Agil, ChristianH, CommonsDelinker, Daemorris, Fabsouza1, Kaktus Kid,
Leandrorr, LeonardoRob0t, Lus Felipe Braga, Manuquadros, Mecanismo, Mschlindwein, Orium, Rachmaninoff, Rafael.afonso, Ricvelozo, Santana-freitas, X spager, Zumg, 23 edies annimas
Personagem: Ken Thompson Fonte: http://pt.wikipedia.org/w/index.php?oldid=38216572 Contribuidores: !Silent, 333, Agil, Bolsoni, ChristianH, Heitor, Joaotg, Juliano, Kaktus Kid,
Mecanismo, Mschlindwein, Orium, Rafael.afonso, Repontin, Wa59, Xandi, 2 edies annimas
C Fonte: http://pt.wikipedia.org/w/index.php?oldid=38932433 Contribuidores: !Silent, 333, Alchimista, Alquimista Digital, Amgauna, AndreHahn, AndrelmGomes, Arges, Bacar machado,
Bencz, Bisbis, Chgsantos, Clara C., Claudiobl2010, Daemorris, Daimore, Darwinius, Dbastro, Dianakc, Dobau, Eamaral, ElementoX, Fnds, Francisco Paiva Junior, GOE, Get It, Gfc, Gil
mnogueira, Gravena, HVL, Heiligenfeld, Helder Ribeiro, Hexa, Hjxkyw, Ismaelbarbosa, Italo maia, JEduardo, JMCF125, Jack Bauer00, Jeferson, Joaodaveiro, Joaosilvakle, Jorge, Jorge.roberto,
Joo Carvalho, Juntas, Lameiro, Leonardo.stabile, LeonardoG, LeonardoRob0t, Leslie, Lgrave, Lijealso, Link88, Lopesmaio, Lucas Avano, Lucasridg, Luiz Jr, Lus Felipe Braga, Mago
Aprendiz, Manomauricio, Marcelo Meneses, Marcelo Reis, Master, Maxtremus, Mecanismo, Mosca, Mschlindwein, Nuno Tavares, OS2Warp, Orium, Panga, Patrick, Pedro.haruo, Phius, Piccilli,
Porantim, Profvalente, R.rvidal, Rafael Vargas, Rautopia, Ricardo Ferreira de Oliveira, Ricvelozo, Rjclaudio, Rui Malheiro, Ruy Pugliesi, Salamat, Salgueiro, Stego, Stuckkey, Tonyjeff, Tork,
Valdinilson, Vasconde, Victorwss, Vini 175, Viniciusmc, Vitor Mazuco, Waldir, Wbrito, Xandi, Xexeo, Yuu eo, 326 edies annimas
Ada Fonte: http://pt.wikipedia.org/w/index.php?oldid=37008116 Contribuidores: !Silent, Dbastro, Felipebarros.ti, FernandoPohl, Indech, Leonardo.stabile, LeonardoG, Lijealso, Lucasnar,
Nuno Tavares, OS2Warp, Opraco, Rafael.afonso, Rei-artur, Reporter, Reynaldo, Ricardo Ferreira de Oliveira, Rustin, Vargenau, Viniciusmc, Xexeo, 24 edies annimas
BLISS Fonte: http://pt.wikipedia.org/w/index.php?oldid=34739482 Contribuidores: JotaCartas, Myst, Ricardo Ferreira de Oliveira
Forth Fonte: http://pt.wikipedia.org/w/index.php?oldid=38541965 Contribuidores: !Silent, Bons, CasperBraske, Drruggeri, LeonardoG, Meira, 9 edies annimas
Smalltalk Fonte: http://pt.wikipedia.org/w/index.php?oldid=38342976 Contribuidores: !Silent, Agil, CommonsDelinker, EduM, Eduacsp, FML, Fabsouza1, Fvmp, Grillow, LeonardoG, Lus
Felipe Braga, Marcoapc, Mpbarbosa, Opraco, Rafaelmrossi, Ricardo Ferreira de Oliveira, Ricvelozo, Roma6, Saulod2, Slomp, Stuckkey, Sturm, Waltercruz, Xexeo, 23 edies annimas
Prolog Fonte: http://pt.wikipedia.org/w/index.php?oldid=38635906 Contribuidores: !Silent, Adolfont, Albmont, ChristianH, Deliodavidmz, FML, Fabsoad, Fvmp, Gean, Gentiljr, Get It, Hashar,
Izabest, JMGM, Janburse, Juntas, Kleuske, Leonardo.stabile, LeonardoG, LipeFontoura, Lus Felipe Braga, Mschlindwein, Nosbig, OS2Warp, Ozymandias, PedR, Pietro Roveri, Rafael.afonso,
Ricardo Ferreira de Oliveira, Waldir, Whooligan, 88 edies annimas
Scheme Fonte: http://pt.wikipedia.org/w/index.php?oldid=38654538 Contribuidores: !Silent, FML, Fredmaranhao, Jonas AGX, Jovica, Leonardo.stabile, LeonardoG, Marcelo Reis, Mirelli
Navarra, Rafael.afonso, Ricardo Ferreira de Oliveira, Ricvelozo, TwYao, Villarinho, Waltercruz, WikiFer, 28 edies annimas
ML Fonte: http://pt.wikipedia.org/w/index.php?oldid=34609153 Contribuidores: Leonardo.stabile, Ricardo Ferreira de Oliveira, Roma6, Waldir, 4 edies annimas
AWK Fonte: http://pt.wikipedia.org/w/index.php?oldid=37299101 Contribuidores: !Silent, CommonsDelinker, Dbastro, Ebalter, FSogumo, Jonas AGX, Kaktus Kid, Leonardo.stabile,
LeonardoG, MPF-UK, Manuel Anastcio, Marcoapc, Nuno Tavares, Pmsm1100, Rafael.afonso, Rafael.alcantara.silva, Reporter, Ricardo Ferreira de Oliveira, Ricvelozo, Thiele41, Tiago de Jesus
Neves, 30 edies annimas
Ada Fonte: http://pt.wikipedia.org/w/index.php?oldid=37008116 Contribuidores: !Silent, Dbastro, Felipebarros.ti, FernandoPohl, Indech, Leonardo.stabile, LeonardoG, Lijealso, Lucasnar,
Nuno Tavares, OS2Warp, Opraco, Rafael.afonso, Rei-artur, Reporter, Reynaldo, Ricardo Ferreira de Oliveira, Rustin, Vargenau, Viniciusmc, Xexeo, 24 edies annimas
Fontes e Editores da Pgina
268
Erlang Fonte: http://pt.wikipedia.org/w/index.php?oldid=38922337 Contribuidores: !Silent, Biktora, Cigano, FSogumo, Helder.wiki, Leonardo.stabile, Neustradamus, Porantim, Ricardo
Ferreira de Oliveira, Ricvelozo, ScotXW, 12 edies annimas
Modula Fonte: http://pt.wikipedia.org/w/index.php?oldid=34927712 Contribuidores: 555, LeonardoG, Rei-artur, Xexeo
C++ Fonte: http://pt.wikipedia.org/w/index.php?oldid=38875897 Contribuidores: !Silent, 333, Adailton, Aeliazat, Alexandresk, Alexlaier, Amgauna, Antero de Quintal, Atilatt, Augusto
Reynaldo Caetano Shereiber, Banaipe, Bgazoli, Bigown, Biologo32, Br marko3, Bruno Meireles, Cesar s, Claudio Rogerio Carvalho Filho, Colaborador Z, Daemorris, Daimore, Dmelorj,
Eamaral, Euzebiod, FML, Fabiojosue, Gaf.arq, Get It, Giro720, Gughenrique, HeitorLM, Helder.wiki, Ikaro C., Ikarohuhuhu, Ikescs, Ishii, JCOlivie, JMGM, Jbribeiro1, JoaoMiranda, Jonathan
Queiroz, Jorl17, Kleiner, Lameiro, Leandrocauvilla, Leonardo.stabile, LeonardoG, LeonardoRob0t, Lgrave, Lus Felipe Braga, Marcoapc, Matheus Faria, Maxtremus, MisterSanderson,
Mschlindwein, Muriel Gottrop, Nikk5, OS2Warp, Oblita, Onjacktallcuca, Opraco, PequijanFAP, Piccilli, Rachmaninoff, Rafael.afonso, Rei-artur, Reicesar, Reynaldo, Ricardo Ferreira de
Oliveira, Ricvelozo, Rmallmann, Rodrigozanatta, Rui Silva, Ruy Pugliesi, Senhor teclado, Stuckkey, Thiagomael, Tiago.bentivegna, Tumnus, Vitor Mazuco, Waldir, Wbrito, Williamdot, rico
Jnior Wouters, 215 edies annimas
Common Lisp Fonte: http://pt.wikipedia.org/w/index.php?oldid=36179545 Contribuidores: !Silent, FML, Leonardo.stabile, Marcelo-Silva, Marcoapc, Paulo Jorge Tom, Ricardo Ferreira de
Oliveira, Vargenau, 13 edies annimas
Miranda Fonte: http://pt.wikipedia.org/w/index.php?oldid=34671927 Contribuidores: Beria, Ricardo Ferreira de Oliveira, 7 edies annimas
Eiffel Fonte: http://pt.wikipedia.org/w/index.php?oldid=38185663 Contribuidores: Ahyama, Czyyyy, Dangelo.max, Fvmp, Hgfernan, Higorrg, Izabest, Jos Roberto A. JR., Leonardo.stabile,
LeonardoG, Marcoapc, Opraco, Rachmaninoff, Rafael.afonso, Rei-artur, Ricardo Ferreira de Oliveira, Rshin, 37 edies annimas
Perl Fonte: http://pt.wikipedia.org/w/index.php?oldid=38899566 Contribuidores: !Silent, Adailton, Agil, Albmont, Alchimista, Alquimista Digital, Amgauna, Arianemoliveira, Belanidia, Beria,
Carlos Rosa, CasperBraske, Cobrettibr, CommonsDelinker, Copat, Cvalente, Dpc01, Ebalter, Espardo, FelipeAragao, Giro720, Hgfernan, IamPortuguese, Joaotg, Joenio, Jonas kam, Keplerbr,
Leonardo.stabile, LeonardoG, Macae, Malafaya, Marcoapc, Mosca, Nilsonsfj, OS2Warp, Osias, Piccilli, Poodle, Porantim, Rafael.afonso, RaphaelJubram, Ricvelozo, Rjclaudio, Rodrigo.siqueira,
Sturm, Waltercruz, Wikifriend pt001, Yone Fernandes, Zam, riobranco.dpi.ufv.br, 116 edies annimas
FL Fonte: http://pt.wikipedia.org/w/index.php?oldid=36333240 Contribuidores: J. A. S. Ferreira, Ricardo Ferreira de Oliveira, 1 edies annimas
Dylan Fonte: http://pt.wikipedia.org/w/index.php?oldid=35125266 Contribuidores: Albmont, Ricardo Ferreira de Oliveira, 1 edies annimas
Haskell Fonte: http://pt.wikipedia.org/w/index.php?oldid=37940218 Contribuidores: !Silent, Albmont, Dbastro, Dirceu Jnior, Dorivaldalbelojunior, Gbiten, Ivo Rocha, JorgePeixoto,
Juanmaiz, Lechatjaune, Leonardo.stabile, LeonardoG, Lusitana, Lus Felipe Braga, Rafael.afonso, Renancaldeira, Ricardo Ferreira de Oliveira, Rickgauden, Ricvelozo, Rodrigo Padula, Stuckkey,
Waldir, Zuke, Zumg, 52 edies annimas
Python Fonte: http://pt.wikipedia.org/w/index.php?oldid=38112495 Contribuidores: !Silent, 333, Aeroparque, Alberto Fabiano, Albmont, Alexg, Arcf br, BackstageEL, Belanidia, Bisbis,
Bmxer, Bons, Brandizzi, Brk0 0, Ccero, Daemorris, Dantadd, Dbastro, Der kenner, Diogo RBG, Diogocolla, Emersongois, Ericof, FML, FelipeVargasRigo, Fernando S. Aldado, Ferri, Fnds,
Gbiten, Girino, Helder.wiki, Holdfz, Hugo Dionizio Santos, HumbertoDiogenes, Ivanildo Filho, JMGM, Jobs1, JosemarLohn, Lameiro, Lawrence, Leonardo.stabile, LeonardoG, LeonardoRob0t,
Lijealso, Luiz Eduardo Borges, Lus Felipe Braga, Lpton, Maddox, Marcoapc, Mecanismo, Miozzo, Mvdiogo, Natashas, Nuno Tavares, Onjacktallcuca, Opraco, Patrick, PatrciaR,
PauloEduardo, Philipi, Piccilli, Pietro Roveri, Porantim, Pythonbr, Rafaelmrossi, Rei-artur, Ricardo Ferreira de Oliveira, Ricvelozo, Riverfl0w, Roberto Cruz, Sniper3000, TheVulcan, Thiago R
Ramos, Tiago de Jesus Neves, Vanthorn, Villarinho, Viniciusmc, Vitor Mazuco, Waldir, Waltercruz, Xqt, ZeroUm, 131 edies annimas
Gdel Fonte: http://pt.wikipedia.org/w/index.php?oldid=38454301 Contribuidores: Fvmp, Ricardo Ferreira de Oliveira, Ricvelozo, 1 edies annimas
Lua Fonte: http://pt.wikipedia.org/w/index.php?oldid=38788447 Contribuidores: !Silent, Antero de Quintal, Belanidia, Brmassa, Burngianecchini, Carlos-alberto-teixeira, CaroLPunk,
CommonsDelinker, Daniel Estill, Dbastro, Dermeister, Dpc01, FelipeVargasRigo, FlavioMattos, Fvmp, Gbiten, HVL, Israel77, Israel77br, Jml3, Keplerbr, Kolega2357, Leandro Guedes,
Leandromartinez, Leonardo.stabile, LeonardoG, LucianoMaia, Marcoapc, Meira, Moretti, Raphaeldantas, Ricardo Ferreira de Oliveira, Ricvelozo, Robertogerson, TheVulcan, Vanthorn,
Waltercruz, Xfalcox, Yurik, Yuu eo, 78 edies annimas
Java Fonte: http://pt.wikipedia.org/w/index.php?oldid=38565506 Contribuidores: !Silent, 191228.telemar.net.br, 200.246.143.xxx, 333, Adrianoucam, Alchimista, Alexanderps,
Alexandredinizrodrigues, Amgauna, Bertoche, Bigs, Bihaiko, Bitolado, Bjverde, Bolhones, BrunoSupremo, Brurei, Carlos-PC, Chico, Cidandrade, Claudio Rogerio Carvalho Filho, Claudomiro
Jr, Ccero, Daimore, Daniel Silverio, Dbastro, Dmendes, Dripssouza, Dudu 18, Eduacsp, EduardoCruz, Eduardofeld, Eduardoferreira, Ematsu, Espardo, EuTuga, Euproprio, FML, Feen, Fernando
S. Aldado, Fernando123d, Filosoficos, FlavioMattos, Frhakamine, Gdamasceno, George.foreman.jr, Get It, Girino, Giro720, Gladstone, HVL, Hbdbim, Helder.wiki, I32542, Italo maia, Jcmo,
Jonas AGX, Jonex, Jorge.roberto, JorgeGG, L'AngeRouge, Leitoxx, Leonardo.stabile, LeonardoG, LeonardoRob0t, Liclopes, Lijealso, Luckas Blade, Lus Felipe Braga, Manuel Anastcio,
MarcioFElias, Marcoapc, Marcobiscaro2112, Marcos Elias de Oliveira Jnior, Marcric, Math2202, Maxtremus, Meira, Mike.lifeguard, Mkasa, Mrcl, Mschlindwein, NH, Nortisop, Nuno Tavares,
OS2Warp, Onjacktallcuca, Opraco, Orlando, Osias, Ozielneto, Patrias, Paulo Eduardo Azevedo Silveira, PauloColacino, Pedro Henrique Oliveira dos santos, Pepinho, Pietro Roveri, Polonio,
Porantim, Prima.philosophia, Profvalente, Rafael.afonso, Raphael csg, Raul Caarvalho, Ricardo Caetano de Moraes, Ricardo Ferreira de Oliveira, Ricvelozo, Rising Force, Roberto Cruz, Rod,
Rodrigo Padula, Rodrigocansian, Ruy Pugliesi, Salamat, Samuel.klein, Sandr0G, Stuckkey, Tetri, Thevirus, Thiago-manel, Trakinator, Tribal, Truehalley, Tumnus, Vanthorn, Victor R12,
Villarinho, ViniGodoy, Viniciusmc, Vitor Mazuco, Waldir, Wanderson2, Wbrito, Wikifriend pt001, X spager, YuriSanCa, Zoldyick, Zuke, talo de Pontes Oliveira, , 480 edies
annimas
PHP Fonte: http://pt.wikipedia.org/w/index.php?oldid=38898587 Contribuidores: !Silent, 333, Actualmind, Adailton, Ademirfer, Agil, Alchimista, Alisson Acioli, Alppedroso, Amgauna,
Andreduartesp, Antero de Quintal, Arges, Armagedon, Batcaverna, Beto, Biktora, Brauliobh, Bruno.pedrozo, Brunoric, Cereso, ChameleonBR, ChristianH, Clara C., Daimore, Darkelder,
Darwinius, David71rj, Dbastro, Defender, Digenes Sobral, Dougsouza01, Dudu 18, Duranduran, Eamaral, Edenfall, Elementox, Emilianoeloi, Euproprio, FSogumo, Fabiobaldins, Fabiobasso,
Fabiosoaza, Felipe Pena, Felipepereira, Fernando S. Aldado, Fmy 1, Fnds, GRS73, Gabrielmsf, Gasdafantauva, Gauss, Gdamasceno, Gean, Get It, Gil mnogueira, Girino, Guilherme, Guithack,
HVL, Hahahaip, Helder.wiki, Hostbra, Ikaro C., Inerte, Inox, Ivansb, J Daglees, J Kikuchi, J0s3l1t0, Joao Junior, Joaotg, Jonas AGX, Jorl17, Juliano Caetano, Kenowlee, Keplerbr, Kinux,
Kmiksi, Ksombrah, Kulluctarus, Leonardo.stabile, LeonardoG, Leslie, Lfva.amorim, Lgrave, Lijealso, Linkprotegido, Luvittor, Lus Felipe Braga, M. B., Jr., Manuel Anastcio, Marc-Andr
Abrock, Marcoapc, Mariana Silveira Tavares, Mauriciofauth, Mecanismo, Metzen, Mschlindwein, Nuno Tavares, OS2Warp, Oalexandrino, Onjacktallcuca, Orlando, Osias, Pablodalloglio,
Patsy, PauloEduardo, Pedromerces, Pietro Roveri, Poolborges, Porantim, Prima.philosophia, Psico, RBM0407, Raafael, Rafael.afonso, Rafatz, Rei-artur, Ricardo Augustinis, Ricardo Ferreira de
Oliveira, Ricvelozo, Robertorsc, Robsjc, Rodrigo Antonioli, Rodrigoluis, Ruy Pugliesi, Ryonagana, Samorimweb, Samuelgeek, Santista1982, Santosga, Senhor teclado, Sica, Sobrinhodasilva,
Stuckkey, Surkamp, Tiagolimsan, Tiagowebmaster, Tumnus, V1d4l0k4, Villarinho, Viniciusmc, Waldir, Waltercruz, Webarthur, Wendell.souza, Wikipedista, Xicouto, 528 edies annimas
Ruby Fonte: http://pt.wikipedia.org/w/index.php?oldid=38747312 Contribuidores: !Silent, Actualmind, Andr Koehne, Betateschter, CasperBraske, Dbastro, Denommus, Diogocolla, Dirceu
Jnior, Ed.resende82, Fabiano Tatsch, Feezih, Fvmp, Gandbranco, Get It, Gfc, Goulart ed, Grillow, J0s3l1t0, JMGM, Jorge, Jose130, Kpinheiro, Lechatjaune, Leonardo.stabile, LeonardoG,
Lijealso, LonE, Lucasnar, Luiz Eduardo Borges, Lus Felipe Braga, M4c0, Marcoapc, Marcos Silva Pereira, Mecanismo, Mestre bira, Mschlindwein, Nuno Tavares, OS2Warp, Onjacktallcuca,
Opraco, Partenon, Plinio89s, Porantim, Rafael.afonso, Rbeninca, Ricardo Ferreira de Oliveira, Ricvelozo, Ruy Pugliesi, Sr X, Teles, The fabio, Tintazul, Vitorpamplona, Waltercruz, XFalcox,
Zamirvarandas, 98 edies annimas
C Fonte: http://pt.wikipedia.org/w/index.php?oldid=35979680 Contribuidores: !Silent, Ajabutres, Al28051, Alchimista, AndreHahn, Arianemoliveira, Bevis, Blamoo, Cereso,
CommonsDelinker, Daemorris, Danielalencarbr, Darwinius, Dbastro, Der kenner, DiegoBlanco, Dougsouza01, Eduacsp, Euproprio, Fmcosta, Foxfirediego, Francisco Leandro, Fbio Sold,
HVL, Hermgenes Teixeira Pinto Filho, Indech, Jorge.roberto, Laobc, Leandro.almeidaraphael, Leandro.gimenes, Leonardo.stabile, LeonardoG, Lijealso, Lmbassman, Looping, Luis ferreira86,
LuizM, Manuel Anastcio, Marciamm6, Marcoapc, Matheus Faria, Maurcio I, Mecanismo, Mike.lifeguard, Morebros, Nuno Tavares, OS2Warp, Onjacktallcuca, Opraco, Pcosmo, Porantim,
RafaAzevedo, Rafael.afonso, Rafrancoso, Reporter, Ricardo Ferreira de Oliveira, Ricvelozo, Rjclaudio, Tiagogodinho3, Victor Master, Vitor canova, Waldir, Wazms, Zoldyick, 153 edies
annimas
Clojure Fonte: http://pt.wikipedia.org/w/index.php?oldid=34997181 Contribuidores: Albmont, CommonsDelinker, Lzuliani, Marcoapc, Mateus RM, PL Przemek, Ricvelozo, ThiagoRuiz, 3
edies annimas
AspectJ Fonte: http://pt.wikipedia.org/w/index.php?oldid=36826693 Contribuidores: CommonsDelinker, Fvmp, LuanSP, Machadoae, Marcoapc, Ricardo Ferreira de Oliveira, Tiago de Jesus
Neves, Vanthorn, 4 edies annimas
Fontes, Licenas e Editores da Imagem
269
Fontes, Licenas e Editores da Imagem
Ficheiro:Charles Babbage - 1860.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Charles_Babbage_-_1860.jpg Licena: Public Domain Contribuidores: Connormah,
Materialscientist
Ficheiro:Flag of the United Kingdom.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Flag_of_the_United_Kingdom.svg Licena: Public Domain Contribuidores: Original flag
by Acts of Union 1800SVG recreation by User:Zscout370
Ficheiro:Charles Babbage Signature.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Charles_Babbage_Signature.svg Licena: Public Domain Contribuidores: Charles Babbage
Ficheiro:Charles Babbage 1860.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Charles_Babbage_1860.jpg Licena: Public Domain Contribuidores: Unknown staff artist for
The Illustrated London News
Ficheiro:Babbage Charles grave.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Babbage_Charles_grave.jpg Licena: Public Domain Contribuidores: Astrochemist
Ficheiro:Ada lovelace.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Ada_lovelace.jpg Licena: Public Domain Contribuidores: Aavindraa, Coyau, Dcoetzee, DutchHoratius,
Kaldari, Kelson, Kilom691, Michael Barera, 1 edies annimas
Imagem:Ada Lovelace color.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Ada_Lovelace_color.svg Licena: Creative Commons Zero Contribuidores: Original watercolor
portrait (Ada lovelace.jpg): Alfred Edward Chalon Woodcut-style graphic (Ada Lovelace.tif): Colin Adams, for the Ada Initiative SVG conversion (Ada Lovelace.svg): Fred the Oyster
Colorization: Kaldari
Ficheiro:Hollerith.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Hollerith.jpg Licena: Public Domain Contribuidores: Bell, C. M. (Charles Milton), ca. 1849-1893,
photographer.
Ficheiro:Flag of the United States.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Flag_of_the_United_States.svg Licena: Public Domain Contribuidores: Dbenbenn,
Zscout370, Jacobolus, Indolences, Technion.
Imagem:Hollerith Herman grave.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Hollerith_Herman_grave.jpg Licena: Public Domain Contribuidores: Author and original
uploader is Astrochemist at en.wikipedia
Ficheiro:Alan Turing cropped.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Alan_Turing_cropped.jpg Licena: Creative Commons Attribution 2.0 Contribuidores:
Alan_Turing.jpg: Jon Callas from San Jose, USA derivative work: OS (talk)
Ficheiro:Silver - replace this image male.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Silver_-_replace_this_image_male.svg Licena: Public Domain Contribuidores:
Replace_this_image_male_(blue).svg: Lord Leatherface derivative work: Dove (talk)
Imagem:Flag of the United States.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Flag_of_the_United_States.svg Licena: Public Domain Contribuidores: Dbenbenn,
Zscout370, Jacobolus, Indolences, Technion.
Ficheiro:Konrad Zuse (1992).jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Konrad_Zuse_(1992).jpg Licena: GNU Free Documentation License Contribuidores: A.Savin,
GeorgHH, Gildemax, Mentifisto, RHunscher, Siebrand, Vuk, 7 edies annimas
File:Flag of Germany.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Flag_of_Germany.svg Licena: Public Domain Contribuidores: User:Madden, User:SKopp
Imagem:Zuse Z1-2.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Zuse_Z1-2.jpg Licena: GNU Free Documentation License Contribuidores: ComputerGeek
Ficheiro:Z3 Deutsches Museum.JPG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Z3_Deutsches_Museum.JPG Licena: GNU Free Documentation License Contribuidores:
User:Teslaton
Imagem:Zuse-Z4-Totale deutsches-museum.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Zuse-Z4-Totale_deutsches-museum.jpg Licena: Creative Commons Attribution 2.5
Contribuidores: Clemens PFEIFFER
Ficheiro:Colossus.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Colossus.jpg Licena: Public Domain Contribuidores: Conscious, Edward, FSII, F, Hellisp, Ian Dunster,
Ibonzer, Man vyi, Mr impossible, Nixn, PKM, TedColes, 3 edies annimas
Imagem:Harvard Mark I Computer - Right Segment.JPG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Harvard_Mark_I_Computer_-_Right_Segment.JPG Licena: GNU Free
Documentation License Contribuidores: Solon, Waldir
Imagem:Two women operating ENIAC.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Two_women_operating_ENIAC.gif Licena: Public Domain Contribuidores: United
States Army
Imagem:Edvac.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Edvac.jpg Licena: Public Domain Contribuidores: ArnoldReinhold, Infrogmation, Kersti Nebelsiek, Medium69,
Tothwolf
Ficheiro:Grace Hopper.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Grace_Hopper.jpg Licena: Public Domain Contribuidores: James S. Davis
Ficheiro:Flag_of_the_United_States.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Flag_of_the_United_States.svg Licena: Public Domain Contribuidores: Dbenbenn,
Zscout370, Jacobolus, Indolences, Technion.
Ficheiro:Fortran acs cover.jpeg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Fortran_acs_cover.jpeg Licena: Public Domain Contribuidores: Boshomi, Closeapple
Ficheiro:IBM_704_mainframe.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:IBM_704_mainframe.gif Licena: Attribution Contribuidores: Lawrence Livermore National
Laboratory
Ficheiro:FortranCardPROJ039.agr.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:FortranCardPROJ039.agr.jpg Licena: Creative Commons Attribution-Sharealike 2.5
Contribuidores: Arnold Reinhold
Ficheiro:John McCarthy Stanford.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:John_McCarthy_Stanford.jpg Licena: Creative Commons Attribution-Sharealike 2.0
Contribuidores: "null0"
Ficheiro:Peternaur.JPG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Peternaur.JPG Licena: Creative Commons Attribution-Sharealike 2.5 Contribuidores: Original uploader
was Eriktj at en.wikipedia
Ficheiro:Flag of Denmark.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Flag_of_Denmark.svg Licena: Public Domain Contribuidores: User:Madden
File:Ken_n_dennis.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Ken_n_dennis.jpg Licena: Public Domain Contribuidores: 32X, Bastique, DenisKrivosheev, Ebcdic, Lzur,
Mormegil, Quibik, Reisio, Skim, Sven, 1 edies annimas
Ficheiro:APL-keybd2.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:APL-keybd2.svg Licena: GNU Free Documentation License Contribuidores: User:Rursus
Ficheiro:Remi turtlegrafik.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Remi_turtlegrafik.png Licena: GNU Free Documentation License Contribuidores: remi
Ficheiro:Niklaus Wirth, UrGU.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Niklaus_Wirth,_UrGU.jpg Licena: Copyrighted free use Contribuidores: Thuresson, 2 edies
annimas
Ficheiro:Flag of Switzerland.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Flag_of_Switzerland.svg Licena: Public Domain Contribuidores: User:Marc Mongenet Credits:
User:-xfi- User:Zscout370
Ficheiro:Dennis MacAlistair Ritchie.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Dennis_MacAlistair_Ritchie.jpg Licena: Public Domain Contribuidores: Medal_lg.jpeg:
Original uploader was Ems2 at en.wikipedia derivative work: Materialscientist (talk)
Imagem:Ken n dennis.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Ken_n_dennis.jpg Licena: Public Domain Contribuidores: 32X, Bastique, DenisKrivosheev, Ebcdic,
Lzur, Mormegil, Quibik, Reisio, Skim, Sven, 1 edies annimas
Ficheiro:Ken n dennis.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Ken_n_dennis.jpg Licena: Public Domain Contribuidores: 32X, Bastique, DenisKrivosheev, Ebcdic,
Lzur, Mormegil, Quibik, Reisio, Skim, Sven, 1 edies annimas
Ficheiro:Ada Lovelace 1838.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Ada_Lovelace_1838.jpg Licena: Public Domain Contribuidores: Dcoetzee, Deadstar, Ecummenic,
Erik Baas, Gene.arboit, Herbythyme, Hsarrazin, Kaldari, Kilom691, ManuelGR, PMG, Pierpao, Poolio Bluxo, SarahStierch, Seanturvey, SterkeBak, Thuresson, Vonvon, 6 edies annimas
Imagem:Lambda lc.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Lambda_lc.svg Licena: Public Domain Contribuidores: Cathy Richards, Luks, Vlsergey, 2 edies
annimas
Imagem:AlleAlle 2.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:AlleAlle_2.jpg Licena: GNU Free Documentation License Contribuidores: GeorgHH, Michael Haferkamp,
Rooivalk
Fontes, Licenas e Editores da Imagem
270
Ficheiro:Erlang logo.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Erlang_logo.png Licena: Trademarked Contribuidores: Butko, Kyro, WikipediaMaster, 3 edies
annimas
File:LYME_software_bundle.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:LYME_software_bundle.svg Licena: Creative Commons Attribution-Sharealike 3.0
Contribuidores: User:ScotXW
Ficheiro:Hello World C++.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Hello_World_C++.png Licena: Creative Commons Zero Contribuidores: User:Kleiner
Ficheiro:Stroustrup kent state edit.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Stroustrup_kent_state_edit.jpg Licena: Creative Commons Attribution 3.0 Contribuidores:
TheTrueAPlus (cropped by Matt.a.w.)
Imagem:cquote1.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Cquote1.svg Licena: Public Domain Contribuidores: Adambro, Editor at Large, Infrogmation, Jianhui67, P
96glin, Waldir, 4 edies annimas
Imagem:cquote2.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Cquote2.svg Licena: Public Domain Contribuidores: Editor at Large, Infrogmation, Waldir, 1 edies
annimas
Imagem:Yes check.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Yes_check.svg Licena: Public Domain Contribuidores: SVG by (modified by )
Imagem:X mark.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:X_mark.svg Licena: Public Domain Contribuidores: User:Gmaxwell
Imagem:Portal.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Portal.svg Licena: Creative Commons Attribution-ShareAlike 3.0 Unported Contribuidores: Portal.svg: Pepetps
derivative work: Bitplane (talk)
Imagem:Lorenz attractor.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Lorenz_attractor.svg Licena: Creative Commons Attribution-ShareAlike 3.0 Unported
Contribuidores: User:Dschwen
Ficheiro:Haskell-Logo.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Haskell-Logo.svg Licena: Public Domain Contribuidores: Thought up by Darrin Thompson and
produced by Jeff Wheeler
Imagem:Python logo.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Python_logo.svg Licena: desconhecido Contribuidores: -
Imagem:He invented Python.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:He_invented_Python.jpg Licena: Creative Commons Attribution 2.0 Contribuidores: FlickrLickr,
FlickreviewR, Legoktm, Michael Reschke, Red Rooster
Imagem:Python script.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Python_script.svg Licena: desconhecido Contribuidores: Ae, Bibi Saint-Pol
Imagem:Lua-logo-nolabel.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Lua-logo-nolabel.svg Licena: Public Domain Contribuidores: AnonMoos, Franois Melchior, Iketsi,
Kephir, Leyo, Moogsi, Qgil, Rezonansowy
Imagem:Wave.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Wave.svg Licena: desconhecido Contribuidores: sbmehta converted to SVG from Sun Microsystems AI version.
Imagem:Helloworldjava.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Helloworldjava.jpg Licena: Public Domain Contribuidores: talo de Pontes Oliveira
Imagem:PHP-logo.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:PHP-logo.svg Licena: Public Domain Contribuidores: Biktora, Chealer, Pixewakb, 1 edies annimas
Imagem:Ruby logo.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Ruby_logo.svg Licena: Creative Commons Attribution-Sharealike 2.5 Contribuidores: Yukihiro Matsumoto,
Ruby Visual Identity Team
Imagem:Yukihiro Matsumoto.JPG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Yukihiro_Matsumoto.JPG Licena: Public Domain Contribuidores: Cep21
Ficheiro:Clojure-glyph.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Clojure-glyph.svg Licena: desconhecido Contribuidores: Tom Hickey and Rich Hickey
Licena
271
Licena
Creative Commons Attribution-Share Alike 3.0
//creativecommons.org/licenses/by-sa/3.0/

Você também pode gostar