Sie sind auf Seite 1von 113

Programao de Computadores

Conceitos bsicos de programao

PDF gerado usando o pacote de ferramentas em cdigo livre mwlib. Veja http://code.pediapress.com/ para mais informao. PDF generated at: Sun, 16 May 2010 14:10:50 UTC

Contedo
Pginas
Programao de computadores Linguagem de programao Linguagem funcional Linguagem natural Programao lgica Programao imperativa Programao estruturada Orientao a objeto Linguagem de programao de baixo nvel Linguagem de programao de alto nvel Linguagem de programao de primeira gerao Linguagem de programao de segunda gerao Linguagem de programao de terceira gerao Linguagem de programao de quarta gerao Paradigma de programao Programao declarativa Programao procedural Programao funcional Programao restritiva Programao orientada a aspecto Programao genrica Programao multiparadigma Orientao a objetos Python Java (linguagem de programao) Compilador Software Programador Cincia da computao PHP Engenharia de software Cdigo de mquina Linguagem de montagem 1 4 8 10 11 15 16 16 19 20 21 22 22 23 25 27 28 30 32 33 41 44 45 48 61 71 77 79 80 88 93 100 102

Referncias
Fontes e Editores da Pgina Fontes, licenas e editores da imagem 107 109

Licenas das pginas


Licena 110

Programao de computadores

Programao de computadores
Programao o processo de escrita, teste e manuteno de um programa de computador. O programa escrito em uma linguagem de programao, embora seja possvel, com alguma dificuldade, escrev-lo directamente em linguagem de mquina. Diferentes partes de um programa podem ser escritas em diferentes linguagens. Diferentes linguagens de programao funcionam de diferentes modos. Por esse motivo, os programadores podem criar programas muito diferentes para diferentes linguagens; muito embora, teoricamente, a maioria das linguagens possa ser usada para criar qualquer programa. Para mais informaes sobre estes mtodos, veja Linguagem de programao. Software um nome colectivo para programas de computadores e dados. H vrias dcadas se debate se a programao mais semelhante a uma arte (Donald Knuth), a uma cincia, matemtica (Edsger Dijkstra), engenharia (David Parnas), ou se um campo completamente novo.

Programas ou algoritmos?

Pequeno programa em linguagem de programao C que imprime na tela se o nmero passado a ele como argumento primo ou no. O cdigo fonte est sendo visualizado em um IDE com suporte a colorizao e indentao de cdigo.

Um algoritmo uma sequncia de passos para realizar uma tarefa ou resolver um problema. Em nosso dia a dia utilizamos algoritmos para realizar nossas atividades, definindo a sequncia de atividades que devemos fazer para atingir um objetivo. Um algoritmo , num certo sentido, um programa abstrato dizendo de outra forma, um programa um algoritmo concretizado. No entanto, os programas so, excepo dos menores, visualizados mais facilmente como uma coleco de algoritmos menores combinados de um modo nico da mesma forma que uma casa construda a partir de componentes. Dessa forma, um algoritmo uma descrio de como um computador pode ser levado a executar uma operao simples e especfica, como, por exemplo, uma ordenao. Um programa, por outro lado, uma entidade que na verdade implementa uma ou mais operaes de forma que seja til para as pessoas.

Programao de computadores

Engenharia de software
A criao de um programa de computador consiste de cinco passos principais: 1. 2. 3. 4. Reconhecer a necessidade de um programa para resolver um problema. Planificar o programa e seleccionar as ferramentas necessrias para resolver o problema. Escrever o programa na linguagem de programao escolhida. Compilao: traduo do cdigo fonte legvel pelo homem em cdigo executvel pela mquina, o que feito atravs de compiladores e outras ferramentas. 5. Testar o programa para ter a certeza de que funciona; se no, regressar ao passo 3. Estes cinco passos so colectivamente conhecidos como engenharia de software. A programao pe nfase nos passos 2, 3 e 4. A codificao pe nfase no passo 3. O termo coder, por vezes usado como sinnimo para programador, pode tornar-se aviltante porque ignora as capacidades necessrias para lidar com os outros quatro passos.

Histria
Heron de Alexandria no sculo primeiro inventou teatros automatizados que usavam programao anloga para controlar os fantoches, portas, luzes e efeitos de som. A mais antiga programadora de computadores que se conhece Ada Lovelace, filha de Anabella e de Lord Byron (o poeta). Anabella transmitiu a Ada o seu amor matemtica, a qual, depois de conhecer Charles Babbage, traduziu e expandiu uma descrio da sua mquina analtica. Muito embora Babbage nunca tenha completado a construo de nenhuma das suas mquinas, o trabalho que ele e Ada desenvolveram sobre elas, garantiu a Ada o ttulo de primeira programadora de computadores do mundo (veja as notas de Ada Byron sobre a mquina analtica. A linguagem de programao Ada recebeu o seu nome. Um dos primeiros programadores que se tem notcia de ter completado todos os passos para a computao sem auxlio, incluindo a compilao e o teste, Wallace J. Eckert. O trabalho deste homem antecede a ascenso das linguagens de computador, porque ele usou a linguagem da matemtica para solucionar problemas astronmicos. No entanto, todos os ingredientes estavam l: ele trabalhou um laboratrio de computao para a Universidade de Columbia com equipamentos fornecidos pela IBM, completos com uma diviso de servio de atendimento ao cliente, e consultores de engenharia para propsitos especiais, na cidade de Nova York, na dcada de 1930, usando cartes perfurados para armazenar os resultados intermedirios de seus clculos, e ento formatando os cartes perfurados para controlar a impresso das respostas, igual ao trabalho para os censos dcadas antes. Tinha tcnicas de debug tais como cdigos de cores, bases cruzadas, verificao e duplicao. Uma diferena entre Eckert e os programadores dos dias de hoje que o exemplo do seu trabalho influenciou o projeto Manhattan. Seu trabalho foi reconhecido por astrnomos do Observatrio da Universidade de Yale, Observatrio da Universidade de Princeton, Observatrio da Marinha dos EUA, Observatrio da Faculdade Harvard, Observatrio dos estudantes da Universidade da Califrnia, Observatrio Ladd da Universidade de Brown e Observatrio Sproul da Faculdade de Swarthmore. Alan Turing frequentemente encarado como o pai da cincia de computadores e, por afinidade, da programao. Ele foi responsvel por ajudar na elaborao e programao de um computador destinado a quebrar o cdigo alemo ENIGMA durante a Segunda Guerra Mundial ver Mquina Enigma.

Programao de computadores

Lista de linguagens
Existem vrias linguagens de programao. As mais populares so: Java, C, C++, Visual Basic, PHP, Perl, Python, C#, JavaScript, Ruby, Delphi , D e ActionScript.[1]
[1] Linguagens de programao populares. (http:/ / www. tiobe. com/ index. php/ content/ paperinfo/ tpci/ index. html).

Ver tambm
Callback Cincia de computadores Documentao de software Engenharia de software Falha de segmentao Lista de linguagens de programao Orientao a objeto Programao baseada em ARS Programao estruturada Programao funcional Programao imperativa Programao em Lgica (Prolog) Programao orientada por acontecimentos Software Testes de caixa negra

Ligaes externas
CS101 Tutorial by Lynn Andrea Stein, Ph.D (http://www.cs101.org/tutorial/index) Popular Computer Programming Language Timelines (http://home.cfl.rr.com/eaa/Languages.htm) Power Programming Methods (http://www.bitesizeinc.net/power.programming.html)

Linguagem de programao

Linguagem de programao
Uma linguagem de programao um mtodo padronizado para expressar instrues para um computador. um conjunto de regras sintticas e semnticas usadas para definir um programa de computador. Uma linguagem permite que um programador especifique precisamente sobre quais dados um computador vai atuar, como estes dados sero armazenados ou transmitidos e quais aes devem ser tomadas sob vrias circunstncias. O conjunto de palavras (tokens), compostos de acordo com essas regras, constituem o cdigo fonte de um software. Esse cdigo fonte depois traduzido para cdigo de mquina, que executado pelo processador. Uma das principais metas das linguagens de programao permitir que programadores tenham uma maior produtividade, permitindo expressar suas intenes mais facilmente do que quando comparado com a linguagem que um computador entende nativamente (cdigo de mquina). Assim, linguagens de programao so projetadas para adotar uma sintaxe de nvel mais alto, que pode ser mais facilmente entendida por programadores humanos. Linguagens de programao so ferramentas importantes para que programadores e engenheiros de software possam escrever programas mais organizados e com maior rapidez. Linguagens de programao tambm tornam os programas menos dependentes de computadores ou ambientes computacionais especficos (propriedade chamada de portabilidade). Isto acontece porque programas escritos em linguagens de programao so traduzidos para o cdigo de mquina do computador no qual ser executado em vez de ser diretamente executado. Uma meta ambiciosa do Fortran, uma das primeiras linguagens de programao, era esta independncia da mquina onde seria executada.

Histria
O primeiro projeto de linguagem de programao surgiu para um computador que no existia, sendo idealizada por Ada Lovelace, esposa de William King-Noel. O projeto do primeiro computador foi idealizado por Charles Babbage que, aps gastar fortunas e um longo tempo, no conseguiu concretizar o projeto. A linguagem de programao ADA foi batizada em homenagem a esta primeira programadora. Uma das primeiras linguagens de programao para computadores foi provavelmente Plankalkl, criada por Konrad Zuse na Alemanha Nazi, mas que teve pouco ou nenhum impacto no futuro das linguagens de programao. A primeira linguagem de programao de alto nvel amplamente usada foi Fortran, criada em 1954. Em 1957 foi criada B-0, que daria origem a Flow-Matic (1958), antecessor imediato de COBOL, de 1959. Lisp e ALGOL foram criadas em 1958. Veja um mapa[1] da histria das linguagens de programao.

Interpretao e compilao
Uma linguagem de programao pode ser convertida, ou traduzida, em cdigo de mquina por compilao ou interpretao, que juntas podem ser chamadas de traduo. Se o mtodo utilizado traduz todo o texto do programa (tambm chamado de cdigo), para s depois executar (ou rodar, como se diz no jargo da computao) o programa, ento diz-se que o programa foi compilado e que o mecanismo utilizado para a traduo um compilador (que por sua vez nada mais do que um programa). A verso compilada do programa tipicamente armazenada, de forma que o programa pode ser executado um nmero indefinido de vezes sem que seja necessria nova compilao, o que compensa o tempo gasto na compilao. Isso acontece com linguagens como Pascal e C. Se o texto do programa traduzido medida que vai sendo executado, como em Javascript, Python ou Perl, num processo de traduo de trechos seguidos de sua execuo imediata, ento diz-se que o programa foi interpretado e que o mecanismo utilizado para a traduo um interpretador. Programas interpretados so geralmente mais lentos do que os compilados, mas so tambm geralmente mais flexveis, j que podem interagir com o ambiente mais

Linguagem de programao facilmente. Embora haja essa distino entre linguagens interpretadas e compiladas, as coisas nem sempre so to simples. H linguagens compiladas para um cdigo de mquina de uma mquina virtual (sendo esta mquina virtual apenas mais um software, que emula a mquina virtual sendo executado em uma mquina real), como o Java e o Parrot. E tambm h outras formas de interpretar em que os cdigos-fontes, ao invs de serem interpretados linha-a-linha, tm blocos "compilados" para a memria, de acordo com as necessidades, o que aumenta a performance dos programas quando os mesmos mdulos so chamados vrias vezes, tcnica esta conhecida como JIT. Como exemplo, podemos citar a linguagem Java. Nela, um compilador traduz o cdigo java para o cdigo intermedirio (e portvel) da JVM. As JVMs originais interpretavam esse cdigo, de acordo com o cdigo de mquina do computador hospedeiro, porm atualmente elas compilam, segundo a tcnica JIT o cdigo JVM para cdigo hospedeiro. A traduo tipicamente feita em vrias fases, sendo as mais comuns a Anlise lxica, a Anlise sinttica ou Parsing, a Gerao de cdigo e a Otimizao. Em compiladores tambm comum a Gerao de cdigo intermedirio. Veja tambm Compilador.

Classificao
As linguagens de programao podem ser classificadas e sub-classificadas de vrias formas.

Conceitos
1. Tcnica de Programao Linear Em matemtica, problemas de Programao Linear so problemas de otimizao nos quais a funo objetivo e as restries so todas lineares. Programao Linear uma importante rea da otimizao por vrias razes. Muitos problemas prticos em pesquisa operacional podem ser expressos como problemas de programao linear. Certos casos especiais de programao linear, tais como problemas de network flow e problemas de multicommodity flow so considerados importantes o suficiente para que se tenha gerado muita pesquisa em algoritmos especializados para suas solues. Vrios algoritmos para outros tipos de problemas de otimizao funcionam resolvendo problemas de PL como sub-problemas. Historicamente, idias da programao linear inspiraram muitos dos conceitos centrais de teoria da otimizao, tais como dualidade, decomposio, e a importncia da convexidade e suas generalizaes. 2. Tcnica de Programao Modular Programao modular um paradigma de programao no qual o desenvolvimento das rotinas de programao feito atravs de mdulos, que so interligados entre si atravs de uma interface comum. Foi apresentado originalmente pela Information & Systems Institute, Inc. no National Symposium on Modular Programming em 1968, com a liderana de Larry Constantine. 3. Tcnica de Programao Estruturada Programao estruturada uma forma de programao de computadores que preconiza que todos os programas possveis podem ser reduzidos a apenas trs estruturas: sequncia, deciso e iterao. Tendo, na prtica, sido transformada na Programao modular, a Programao estruturada orienta os programadores para a criao de estruturas simples em seus programas, usando as sub-rotinas e as funes. Foi a forma dominante na criao de software entre a programao linear e a programao orientada por objetos. Apesar de ter sido sucedida pela programao orientada por objetos, pode-se dizer que a programao estruturada ainda marcantemente influente, uma vez que grande parte das pessoas ainda aprendem programao atravs dela. Porm, a orientao a objetos superou o uso das linguagens estruturadas no mercado[2] . 4. Tcnica de Programao Orientada a Objeto Orientao a objetos, tambm conhecida como Programao Orientada a Objetos (POO) ou ainda em ingls Object-Oriented Programming (OOP) um paradigma de anlise, projeto e programao de sistemas de software

Linguagem de programao baseado na composio e interao entre diversas unidades de software chamadas de objetos. Em alguns contextos, prefere-se usar modelagem orientada ao objeto, em vez de programao. De fato, o paradigma "orientao a objeto" tem bases conceituais e origem no campo de estudo da cognio, que influenciou a rea de inteligencia artificial e da lingstica no campo da abstrao de conceitos do mundo real. Na qualidade de mtodo de modelagem, tida como a melhor estratgia, e mais natural, para se eliminar o "gap semntico", dificuldade recorrente no processo de modelar o mundo real, no domnio do problema, em um conjunto de componentes de software que seja o mais fiel na sua representao deste domnio. Facilitaria a comunicao do profissional modelador e do usurio da rea alvo, na medida em que a correlao da simbologia e conceitos abstratos do mundo real e da ferramenta de modelagem (conceitos, terminologia, smbolos, grafismo e estratgias) fosse a mais bvia, natural e exata possvel. A anlise e projeto orientados a objetos tem como meta identificar o melhor conjunto de objetos para descrever um sistema de software. O funcionamento deste sistema se d atravs do relacionamento e troca de mensagens entre estes objetos. Na programao orientada a objetos, implementa-se um conjunto de classes que definem os objetos presentes no sistema de software. Cada classe determina o comportamento (definido nos mtodos) e estados possveis (atributos) de seus objetos, assim como o relacionamento com outros objetos.

Classificao da ACM
A ACM mantm um sistema de classificao[3] com os seguintes sub-itens: Linguagens aplicativas, ou de aplicao Linguagens concorrentes, distribudas e paralelas Linguagens de fluxo de dados Linguagens de projeto Linguagens extensveis Linguagens de montagem e de macro Linguagens de microprogramao Linguagens no determinsticas Linguagens no procedurais Linguagens orientadas a objeto Linguagens de aplicao especializada Linguagens de altssimo nvel

Quanto ao paradigma
Diferentes linguagens de programao podem ser agrupadas segundo o paradigma que seguem para abordar a sua sintaxe: Linguagem funcional Linguagem natural Programao lgica Programao imperativa Programao estruturada Linguagem orientada a objetos

Linguagem de programao

Quanto a estrutura de tipos


Fracamente tipada, como Smalltalk, onde o tipo da varivel muda dinamicamente conforme a situao. Fortemente tipada, como Java, Ruby, onde o tipo da varivel, uma vez atribudo, se mantm o mesmo at ser descartada da memria. Dinamicamente tipada, como Perl, Python ou Ruby, onde o tipo da varivel definido em tempo de execuo. Estaticamente tipada, como Java e C, onde o tipo da varivel definido em tempo de compilao.

Quanto ao grau de abstrao


Linguagem de programao de baixo nvel, cujos simbolos so uma representao direta do cdigo de mquina que ser gerado, onde cada comando da linguagem equivale a um "opcode" do processador, como Assembly. Linguagem de programao de mdio nvel, que possui smbolos que podem ser convertidos diretamente para cdigo de mquina (goto, expresses matemticas, atribuio de variveis), mas tambm smbolos complexos que so convertidos por um compilador. Exemplo: C, C++. Linguagem de programao de alto nvel, composta de smbolos mais complexos, inteligvel pelo ser humano e no-executvel diretamente pela mquina, no nvel da especificao de algoritmos, como Pascal, Fortran, ALGOL e SQL.

Quanto gerao
Primeira gerao, as linguagens de baixo nvel (Assembly) Segunda gerao, as primeiras linguagens (Fortran, ALGOL,...) Terceira gerao, as procedurais e estruturadas (Pascal, C). Quarta gerao, linguagens que geram programas em outras linguagens (Java, C++), linguagens de consulta (SQL). Quinta gerao, linguagens lgicas (Prolog).

Ver tambm
Linguagem compilada Linguagem de script Linguagem interpretada Lista de linguagens de programao Sintaxe de linguagens de programao Paradigmas de programao

[1] (em ingls) Mapa da histria das linguagens de programao (http:/ / www. levenez. com/ lang/ history. html). [2] TIOBE Software (http:/ / www. tiobe. com/ index. php/ content/ paperinfo/ tpci/ index. html) [3] Sistema de classificao da ACM (http:/ / www. acm. uiuc. edu/ signet/ JHSI/ cr. D. 3. 2. html)

Linguagem de programao

Ligaes externas
Todas as Linguagens de Programao catalogadas pelo Google (http://directory.google.com/Top/Computers/ Programming/Languages/). Enciclopdia de linguagens de programao (http://www.scriptol.org/encyclopedia.html) (em ingls)

Bibliografia
ORGANICK, E. I.;FORSYTHE, A. I.;PLUMMER, R. P.. Programming Language Structures.New York:Academic Press, 1978.pp.659. ISBN 0-12-528260-5 WEXELBLAT, Richard L.. History of Programming Languages.New York:Academic Press, 1981.pp.758. ISBN 0-12-745040-8

Linguagem funcional
Em cincia da computao, programao funcional um paradigma de programao que trata a computao como uma avaliao de funes matemticas e que evita estados ou dados mutveis. Ela enfatiza a aplicao de funes, em contraste da programao imperativa, que enfatiza mudanas no estado do programa[1] . Uma funo, neste sentido, pode ter ou no ter parmetros e um simples valor de retorno. Os parmetros so os valores de entrada da funo, e o valor de retorno o resultado da funo. A definio de uma funo descreve como a funo ser avaliada em termos de outras funes. Por exemplo, a funo definida em termos de funes de exponenciao e adio. Do mesmo modo, a linguagem deve oferecer funes bsicas que no requerem definies adicionais. Linguagens de programao funcionais, especialmente as puramente funcionais, tem sido mais usadas academicamente que no desenvolvimento comercial de software. Entretanto, algumas linguagens notveis usadas na indstria e no comrcio incluem Erlang (aplicaes concorrentes)[2] , R (estatstica), Mathematica (matemtica simblica)[3] J e K (anlise financeira) e XSLT.[4] [5] Importantes influncias na programao funcional foram o clculo lambda, as linguagens de programao APL e Lisp, e mais recentemente ML, Haskell, OCaml e F#.

Desenvolvimento
As funes podem ser manipuladas em uma grande variedade de formas em uma linguagem de programao funcional. As funes so tratadas como valores de primeira importncia, o que o mesmo que dizer que funes podem ser parmetros ou valores de entrada para outras funes e podem ser os valores de retorno ou sada de uma funo. Ento podemos entender paradigma funcional como um mapeamento dos valores de entrada nos valores de retorno, atravs de funes. Isso permite que funes como mapcar em LISP e map em Haskell que tomam ambos uma funo e uma lista como entrada e aplicam a funo de entrada a cada elemento da lista. Funes podem ser nomeadas, como em outras linguagens, ou definidas anonimamente (algumas vezes durante a execuo do programa) usando uma abstrao lambda e usadas como valores em outras funes. Linguagens funcionais tambm permitem que funes sejam do tipo curry. Currying uma tcnica para reescrita de funes com mltiplos parmetros como a composio de funes de um parmetro. A funo do tipo curry pode ser aplicada apenas a um subconjunto de seus parmetros. O resultado uma funo onde os parmetros neste subconjunto so agora fixados como constantes, e os valores do resto dos parmetros ainda no so especificados. Esta nova funo pode ser aplicada aos parmetros restantes para obter o valor da funo final. Por exemplo, uma funo adiciona(x,y) = x + y pode ser do tipo curry de forma que o valor de retorno adiciona(2) note que que no h um parmetro y ser uma funo annima, o que equivalente funo adiciona2(y) = 2 + y. Esta nova funo tem apenas um parmetro e corresponde a adicionar 2 a um nmero. Novamente, isso apenas possvel porque as funes so tratadas como

Linguagem funcional valores de primeira importncia. O clculo lambda pode ser considerado a primeira linguagem de programao funcional, embora nunca tenha sido projetada para ser realmente executada em um computador. um modelo de computao projetado por Alonzo Church nos anos 1930 que oferece um modo muito formal de descrever um clculo de uma funo. A primeira linguagem de programao funcional criada para computadores foi LISP, desenvolvida por John McCarthy no Instituto de Tecnologia de Massachusetts (MIT) no fim dos anos 1950. Mesmo no sendo uma linguagem de programao puramente funcional, LISP introduziu a maioria das caractersticas hoje encontradas nas modernas linguagens de programao funcional. Scheme foi uma tentativa posterior de simplificar e melhorar LISP. Nos anos 1970 a linguagem ML foi criada pela Universidade de Edimburgo, e David Turner desenvolveu a linguagem Miranda na Universidade de Kent. A linguagem Haskell foi lanada no fim dos anos 1980 em uma tentativa de juntar muitas idias na pesquisa de programao funcional.

Contraste com a programao imperativa


A programao funcional pode ser contrastada com a programao imperativa. Na programao funcional parecem faltar diversas construes freqentemente (embora incorretamente) consideradas essenciais em linguagens imperativas, como C ou Pascal. Por exemplo, em uma programao estritamente funcional, no h alocao explcita de memria, nem declarao explcita de variveis. No entanto, essas operaes podem ocorrer automaticamente quando a funo invocada; a alocao de memria ocorre para criar espao para os parmetros e para o valor de retorno, e a declarao ocorre para copiar os parmetros dentro deste espao recm-alocado e para copiar o valor de retorno de volta para dentro da funo que a chama. Ambas as operaes podem ocorrer nos pontos de entrada e na sada da funo, ento efeitos colaterais no clculo da funo so eliminados. Ao no permitir efeitos colaterais em funes, a linguagem oferece transparncia referencial. Isso assegura que o resultado da funo ser o mesmo para um dado conjunto de parmetros no importando onde, ou quando, seja avaliada. Transparncia referencial facilita muito ambas as tarefas de comprovar a correo do programa e automaticamente identificar computaes independentes para execuo paralela. Laos, outra construo de programao imperativa, est presente atravs da construo funcional mais geral de recursividade. Funes recursivas invocam-se a si mesmas, permitindo que uma operao seja realizada vrias vezes. Na verdade, isso prova que laos so equivalentes a um tipo especial de recursividade chamada recursividade reversa. Recursividade em programao funcional pode assumir vrias formas e em geral uma tcnica mais poderosa que o uso de laos. Por essa razo, quase todas as linguagens imperativas tambm a suportam (sendo Fortran 77 e COBOL excees notveis).
[1] Paul Hudak (setembro de 1989). " Conception, evolution, and application of functional programming languages (http:/ / www. cs. berkeley. edu/ ~jcondit/ pl-prelim/ hudak89functional. pdf)" (pdf). ACM Computing Surveys. [2] Who uses Erlang for product development? (http:/ / www. erlang. org/ faq/ t1. html#AEN50) (em ingls). Pgina visitada em 27 de junho de 2006. [3] Departmento de Matemtica Aplicada, Universidade do Colorado. Functional vs. Procedural Programming Language (http:/ / amath. colorado. edu/ computing/ mmm/ funcproc. html) (em ingls). Pgina visitada em 28 de agosto de 2006. [4] Dimitre Novatchev. The Functional Programming Language XSLT - A proof through examples (http:/ / www. topxml. com/ xsl/ articles/ fp/ ) (em ingls). Pgina visitada em 27 de maio de 2006. [5] David Mertz. XML Programming Paradigms (part four): Functional Programming approached to XML processing (http:/ / gnosis. cx/ publish/ programming/ xml_models_fp. html) (em ingls). Pgina visitada em 27 de maio de 2006.

Cousineau, Guy and Michel Mauny. The Functional Approach to Programming. Cambridge, UK: Cambridge University Press, 1998. Graham, Paul. ANSI Common LISP. Englewood Cliffs, New Jersey: Prentice Hall, 1996. Hudak, Paul. "Conception, Evolution, and Application of Functional Programming Languages". ACM Computing Surveys 21, no. 3 (1989): 359-411. Pratt, Terrence, W. and Marvin V. Zelkowitz. Programming Languages: Design and Implementation. 3rd ed. Englewood Cliffs, New Jersey: Prentice Hall, 1996.

Linguagem funcional Salus, Peter H. Functional and Logic Programming Languages. Vol. 4 of Handbook of Programming Languages. Indianapolis, Indiana: Macmillan Technical Publishing, 1998. Thompson, Simon. Haskell: The Craft of Functional Programming. Harlow, England: Addison-Wesley Longman Limited, 1996.

10

Ver tambm
Clculo lambda

Linguagem natural
O termo lngua natural usado para distinguir as lnguas faladas por seres humanos e usadas como instrumento de comunicao daquelas que so linguagens formais construdas. Entre estas ltimas contam-se as linguagens de programao de computadores e as linguagens usadas pela lgica formal ou lgica matemtica. Na filosofia da linguagem de tradio anglo-saxnica, o termo lngua ordinria por vezes usado como sinnimo da lngua natural. As lnguas naturais so estudadas pela lingustica e pela inteligncia artificial, entre outras disciplinas. As lnguas de sinais ou lnguas gestuais so tambm lnguas naturais, visto possurem as mesmas propriedades caractersticas: gramtica e sintaxe com dependncias no locais, infinidade discreta e generatividade/criatividade. Lnguas de sinais ou gestuais como a norte-americana [1], a francesa [2], a brasileira ou a portuguesa esto devidamente documentadas na literatura cientfica.

Ver tambm
Lnguas de sinais LIBRAS Lngua Gestual Portuguesa (LGP) Lngua de Sinais Inteligncia Artificial PLN Text Mining Linguagens de programao LISP Prolog Rede social para aprender lnguas Livemocha

Linguagem natural

11

Ligaes externas
Qual a diferena entre lngua, idioma e dialeto? [3] (em portugus)

Referncias
[1] http:/ / en. wikipedia. org/ wiki/ American_Sign_Languageamericana [2] http:/ / fr. wikipedia. org/ wiki/ Langue_des_signes_fran%C3%A7aisefrancesa [3] http:/ / revistaescola. abril. uol. com. br/ lingua-portuguesa/ fundamentos/ qual-diferenca-lingua-idioma-dialeto-427786. shtml

Programao lgica
Programao lgica um paradigma de programao que faz uso da lgica matemtica. John McCarthy [1958] foi o primeiro a publicar uma proposta de uso da lgica matemtica para programao. A primeira linguagem de programao lgica foi a Planner, a qual permitia a invocao orientada a padres de planos procedimentais de asseres e de objetivos. Com a necessidade de adaptao aos sistemas de memria muito limitada, que eram disponveis quando ela foi desenvolvida. A linguagem Planner usava estruturas de controle de backtracking, de tal forma que apenas um nico caminho computacional tinha que ser armazenado por vez. Em seguida, o Prolog foi desenvolvido como uma simplificao do Planner que permitia a invocao orientada a padres apenas a partir de objetivos (tambm baseado em backtracking). A partir do Planner, foram desenvolvidas as linguagens de programao QA-4, Popler, Conniver, e QLISP. As linguagens de programao Mercury, Visual Prolog, Oz e Frill, foram desenvolvidas a partir do Prolog. Atualmente existem linguagens de programao lgica concorrente (no baseadas em backtracking) derivadas do Planner (por exemplo, a Ether) e derivadas do Prolog (ver Shapiro 1989 para um apanhado geral).

Histria
A programao lgica uma idia que tem sido investigada no contexto da inteligncia artificial pelo menos desde o momento em que John McCarthy [1958] props: "programas para manipular com sentenas instrumentais comuns apropriadas linguagem formal (muito provavelmente uma parte do clculo de predicado)". O programa bsico formar concluses imediatas a partir de uma lista de premissas. Essas concluses sero tanto sentenas declarativas quanto imperativas. Quando uma sentena imperativa deduzida, o programa toma uma ao correspondente.

Base na lgica matemtica


O sentido da programao lgica trazer o estilo da lgica matemtica programao de computadores. Matemticos e filsofos encontram na lgica uma ferramenta eficaz para desenvolvimento de teorias. Vrios problemas so naturalmente expressos como teorias. Dizer que um problema precisa de soluo frequentemente equivale a perguntar se uma nova hiptese consistente com uma teoria existente ou se conseqncia dela. A lgica proporciona uma maneira de demonstrar se uma questo verdadeira ou falsa. O processo de construir uma demonstrao bem conhecido, portanto a lgica um meio confivel de responder perguntas. Sistemas de programao lgica automatizam este processo. A inteligncia artificial teve uma influncia importante no desenvolvimento da programao lgica.

Programao lgica

12

Prolog
A linguagem de programao Prolog foi explicitamente apresentada como baseada na lgica matemtica. A base dessa alegao era que um programa Prolog podia literalmente ser lido como um conjunto de frmulas em um fragmento da lgica de primeira ordem, herdando o modelo de teoria e demonstrao da lgica de primeira ordem. Prolog foi desenvolvida em 1972 por Alain Colmerauer. Ela veio de uma colaborao entre Colmerauer em Marselha e Robert Kowalski em Edinburgo. Colmerauer estava trabalhando na compreenso da linguagem natural, usando lgica para representar semnticas e usando resoluo para questionamento-resposta. Durante o vero de 1971, Colmerauer e Kowalski descobriram que a forma clausal da lgica poderia ser usada para representar gramticas formais e que demonstraes do teorema da resoluo poderia ser usado para anlise gramatical. Eles observaram que algumas demonstraes de teoremas, como o da hiper-resoluo, comportavam-se como analisadores ascendentes e outros, como resoluo-SL (1971), comportavam-se como analisadores descendentes. Durante o seguinte vero de 1972, Kowalski, novamente trabalhando com Colmerauer, observou que resoluo-SL trata clusulas universalmente quantificadas na forma declarativa de implicaes B1 e e Bn implica H como procedimentos de objetivo-reduo para mostrar/resolver H, mostrar/resolver B1 e e Bn. Essa interpretao dupla declarativa/procedimental depois foi formalizada na notao do Prolog H :- B1, , Bn. que pode ser lida (e usada) tanto declarativamente como procedimentalmente. Tornou-se tambm claro que tais clusulas poderiam ser restringidas para definir clusulas ou clusulas de Horn, em que H, B1, , Bn so todos os predicados atmicos, e que resoluo-SL poderia ser restrita (e gerada) para LUSH ou resoluo-SLD. Colmerauer, com Philippe Roussel, usou essa interpretao dupla de clusulas assim como a base do Prolog, a qual foi implementada no vero e outono de 1972. O primeiro programa na linguagem, tambm escrito em 1972 e implementado em Marseille, foi um sistema francs de pergunta-resposta. A interpretao procedimental de Kowalski e LUSH foi depois descrita em um memorando em 1973, publicado em 1974. A relao prxima entre interpretao declarativa e processual resulta numa caracterstica tpica das linguagens de programao lgica, embora a relao se torne mais complexa quando h negao, disjuno e outros quantificadores so permitidos em programas.

Negao por falha


Micro-Planner teve uma construo, chamada "thnot", que quando aplicada a uma expresso retorna o valor verdadeiro se (e somente se) a avaliao da expresso falha. Um operador equivalente normalmente construdo em implementaes do Prolog moderno e tem sido chamado "negao por falha". Ele normalmente escrito como not(p), onde p um tomo cujas variveis foram normalmente instanciadas no momento que not(p) invocado. Uma sintaxe mais complexa (mas padro) \+ p . Literais de negao por falha podem ocorrer como condies not(Bi) no corpo das clusulas do programa. Ainda que incompleta, a regra de negao como falha uma slida regra de inferncia (sob certas restries) respeitando a concluso de um programa. Concluso de um programa lgico foi inicialmente definida por Keith Clark basicamente assemelhava-se a considerar o conjunto de todas as clusulas do programa, com o mesmo predicado, do lado esquerdo, H :- Corpo1

Programao lgica H :- Corpok Como uma nica frmula equivalente H sse (Corpo1 ou ou Corpok) Escrever o completamento tambm requer o uso explcito de predicado de igualdade e a incluso de um conjunto de axiomas apropriados por igualdade. A noo de concluso estreitamente relacionada tcnica de circunscrio de McCarty para desenvolver um raciocnio no monotnico, e a suposio de um mundo fechado. Como uma alternativa para semnticas de completamento, negao por falha tambm pode ser interpretada epistemologicamente, assim como na semntica de modelo estvel do conjunto de respostas. Nesta interpretao, not(Bi) significa literalmente que Bi no conhecido ou no acreditado. A interpretao epistmica tem a vantagem que pode ser combinada muito simplesmente com a negao clssica, assim como na "lgica de programao estendida", para formalizar frases como "o contrrio no pode ser mostrado", onde "contrario" est a negao clssica e "que no pode ser mostrado" a interpretao epistmica da negao por falha.

13

Implementaes
A primeira implementao do Prolog foi a Marseille Prolog, desenvolvida em 1972. O uso do Prolog como uma linguagem de programao prtica teve seu pice com o desenvolvimento de um compilador por David Warren em Edinburgo, em 1977. Alguns experimentos demonstraram que o Edinburgh Prolog podia competir com a velocidade de processamento de outras linguagens de programao simblica tais como Lisp. O Edinburgh Prolog tornou-se o padro de facto e influenciou a definio de Prolog padro ISO.

Limitaes do uso da lgica matemtica para a programao


John MacCarthy props que a lgica matemtica fosse usada como o fundamento para a epistemologia de sistemas de computadores. Sob a liderana de Marvin Minsky e Seymour Papert, uma abordagem diferente baseada em procedimentos processuais foi desenvolvida no MIT. Quando o Planner foi desenvolvido, levantou-se o a questo sobre o relacionamento entre as duas abordagens. Robert Kowalski desenvolveu a tese que "computao pode concebida deduo" teve boa aceitao ao citar o slogan "a computao uma deduo controlada," que ele atribuiu a Pat Hayes em seu artigo de 1988 no incio da histria do Prolog. Ao contrrio de Kowalski e Hayes, Carl Hewitt desenvolveu a tese de que a deduo lgica era incapaz de executar computao concorrente em sistemas abertos. A resposta questo sobre a relao entre as abordagens lgica e procedimental que a abordagem procedimental tem uma semntica matemtica diferente (ver semntica denotacional) da semntica da lgica matemtica (ver teoria dos modelos).

Programao lgica concorrente


Keith Clark, Herv Gallaire, Steve Gregory, Vijay Saraswat, Udi Shapiro, Kazunori Ueda, etc. desenvolveram uma famlia de sistemas concorrentes de passagem de mensagens do tipo Prolog, usando unificao de variveis compartilhadas e fluxo de estrutura de dados para mensagens. Esforos foram feitos para basear esses sistemas em lgica matemtica, e elas foram usadas como a base para o Projeto Japons da Quinta Gerao de Computadores. Como o modelo de atores, os sistemas com o Prolog concorrente so baseados em passagem de mensagens e conseqentemente estavam sujeitos mesma indeterminao. Esta foi a base de um argumento de Carl Hewitt e Gul Agha [1998] sugerindo que os sistemas com Prolog concorrente nem eram dedutivos nem lgicos.

Programao lgica

14

Programao de lgica de ordem superior


Diversos pesquisadores estenderam a programao lgica com as caractersticas da programao de ordem superior derivadas da lgica de ordem superior, tais como variveis de predicado. Tais linguagens incluem as extenses do Prolog HiLog e Prolog.

Programao lgica linear


Basear a programao lgica na lgica linear resultou no projeto de linguagens de programao lgica que so consideravelmente mais custosas do que aquelas baseadas na lgica clssica. Programas com clusulas de Horn (Prolog) podem apenas representar uma mudana de estado pela mudana em argumentos para predicados. Na programao lgica linear, pode-se usar a lgica linear como ambiente para dar suporte mudana de estado. Alguns projetos iniciais das linguagens de programao lgica baseadas na lgica linear, incluem LO [Andreoli & Pareschi, 1991], Lolli [Hodas & Miller, 1994], ACL [Kobayashi & Yonezawa, 1994], e Forum [Miller, 1996].O Frum proporciona a interpretao direcionada a objetivos de toda a lgica linear.

Domnios das aplicaes


Sistema especialista, em que o programa gera uma recomendao ou resposta para um modelo grande do domnio de aplicao. Demonstrao automatizada de teorema, em que o programa gera teoremas, estendendo os existentes no corpo da teoria.

Ver tambm
Teoria da computao Teoria dos conjuntos Lgica Linguagem de programao Mtodos formais Paradigma de programao Programao funcional

Ligaes externas
Logic Programming Virtual Library entry [1] Bibliographies on Logic Programming [2] Association for Logic Programming (ALP) [3] Theory and Practice of Logic Programming [4] journal

Referncias
[1] [2] [3] [4] http:/ / vl. fmnet. info/ logic-prog/ http:/ / liinwww. ira. uka. de/ bibliography/ LogicProgramming/ http:/ / www. cs. kuleuven. be/ ~dtai/ projects/ ALP/ http:/ / www. cs. kuleuven. be/ ~dtai/ projects/ ALP/ TPLP/

Programao imperativa

15

Programao imperativa
Programao imperativa (ou programao procedural) um paradigma de programao que descreve a computao como aes (comandos) que mudam o estado (variveis) de um programa. Muito parecido com o comportamento imperativo das linguagens naturais que expressam ordens, programas imperativos so uma sequncia de comandos para o computador executar. As linguagens de programao imperativa contrastam com outros tipos de linguagem, tais como linguagens de programao declarativa, funcional e lgica. Linguagens de programao funcional, como por exemplo Haskell, no so uma sequncia de afirmaes e no possuem, por consequncia, um estado global como as linguagens imperativas. Linguagens de programao lgica, como exemplo Prolog, frequentemente definem "o que" para ser computado, mais do que "como" computar, como seria normal em uma linguagem imperativa.

Vantagens
Eficincia (embute o modelo Von Neumann) Paradigma dominante e bem estabelecido Natural e tambm muito flexivel

Desvantagens
Focaliza o "como" e no o "qu" Relacionamento indireto com a E/S (induo a erros/estados)

Linguagens de programao
Alguns exemplos de linguagens de programao que baseiam-se no modelo imperativo: Ada ALGOL Basic C Cobol Fortran Pascal Python Lua Mathematica

Programao estruturada

16

Programao estruturada
Programao estruturada uma forma de programao de computadores que preconiza que todos os programas possveis podem ser reduzidos a apenas trs estruturas: sequncia, deciso e iterao, desenvolvida por Michael A. Jackson no seu livro "Principles of Program Design" de 1975. Tendo, na prtica, sido transformada na Programao modular, a Programao estruturada orienta os programadores para a criao de estruturas simples em seus programas, usando as subrotinas e as funes. Foi a forma dominante na criao de software anterior programao orientada por objetos. Apesar de ter sido sucedida pela programao orientada por objetos, pode-se dizer que a programao estruturada ainda muito influente, uma vez que grande parte das pessoas ainda aprendem programao atravs dela. Alm disso, por exigir formas de pensar relativamente complexas, a programao orientada a objetos at hoje ainda no bem compreendida ou usada pela maioria.

Orientao a objeto
Orientao a objetos Objeto Classe Instncia

Abstrao Mtodos Atributo Encapsulamento Herana Herana mltipla

Polimorfismo Outras referncias Padres de projeto UML Engenharia OO

A orientao a objetos, tambm conhecida como Programao Orientada a Objetos (POO), ou ainda em ingls Object-Oriented Programming (OOP) um paradigma de anlise, projeto e programao de sistemas de software baseado na composio e interao entre diversas unidades de software chamadas de objetos. Em alguns contextos, prefere-se usar modelagem orientada ao objeto, em vez de programao. De fato, o paradigma "orientao a objeto", tem bases conceituais e origem no campo de estudo da cognio, que influenciou a rea de inteligencia artificial e da lingustica, no campo da abstrao de conceitos do mundo real. Na qualidade de mtodo de modelagem, tida como a melhor estratgia para se eliminar o "gap semntico", dificuldade recorrente no processo de modelar o mundo real do domnio do problema em um conjunto de componentes de software que seja o mais fiel na sua representao deste domnio. Facilitaria a comunicao do profissional modelador e do usurio da rea alvo, na medida que a correlao da simbologia e conceitos abstratos do mundo real e da ferramenta de modelagem (conceitos, terminologia, smbolos, grafismo e estratgias) fosse a mais bvia, natural e exata possvel.

Orientao a objeto A anlise e projeto orientados a objetos tm como meta identificar o melhor conjunto de objetos para descrever um sistema de software. O funcionamento deste sistema se d atravs do relacionamento e troca de mensagens entre estes objetos. Na programao orientada a objetos, implementa-se um conjunto de classes que definem os objetos presentes no sistema de software. Cada classe determina o comportamento (definido nos mtodos) e estados possveis (atributos) de seus objetos, assim como o relacionamento com outros objetos. C++, C#, Java, Object Pascal, Objective-C, Python, SuperCollider, Ruby e Smalltalk so exemplos de linguagens de programao orientadas a objetos. ActionScript, ColdFusion, Javascript, PHP (a partir da verso 4.0), Perl (a partir da verso 5) e VB.NET so exemplos de linguagens de programao com suporte a orientao a objetos.

17

Conceitos essenciais
Classe representa um conjunto de objetos com caractersticas afins. Uma classe define o comportamento dos objetos atravs de seus mtodos, e quais estados ele capaz de manter atravs de seus atributos. Exemplo de classe: Os seres humanos. Subclasse uma nova classe originada de sua classe pai. Objeto uma instncia de uma classe. Um objeto capaz de armazenar estados atravs de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. Exemplo de objetos da classe Humanos: Joo, Jos, Maria. Atributos so caractersticas de um objeto. Basicamente a estrutura de dados que vai representar a classe. Exemplos: Funcionrio: nome, endereo,telefone, CPF,....; Carro: nome, marca, ano, cor, ; Livro: autor, editora, ano. Por sua vez, os atributos possuem valores. Por exemplo, o atributo cor pode conter o valor azul. O conjunto de valores dos atributos de um determinado objeto chamado de estado. Mtodos definem as habilidades dos objetos. Bidu uma instncia da classe Cachorro, portanto tem habilidade para latir, implementada atravs do mtodo deUmLatido. Um mtodo em uma classe apenas uma definio. A ao s ocorre quando o mtodo invocado atravs do objeto, no caso Bidu. Dentro do programa, a utilizao de um mtodo deve afetar apenas um objeto em particular; Todos os cachorros podem latir, mas voc quer que apenas Bidu d o latido. Normalmente, uma classe possui diversos mtodos, que no caso da classe Cachorro poderiam ser sente, coma e morda. Mensagem uma chamada a um objeto para invocar um de seus mtodos, ativando um comportamento descrito por sua classe. Tambm pode ser direcionada diretamente a uma classe (atravs de uma invocao a um mtodo esttico). Herana (ou generalizao) o mecanismo pelo qual uma classe (sub-classe) pode estender outra classe (super-classe), aproveitando seus comportamentos (mtodos) e variveis possveis (atributos). Um exemplo de herana: Mamfero super-classe de Humano. Ou seja, um Humano um mamfero. H Herana mltipla quando uma sub-classe possui mais de uma super-classe. Essa relao normalmente chamada de relao " um". Associao o mecanismo pelo qual um objeto utiliza os recursos de outro. Pode tratar-se de uma associao simples "usa um" ou de um acoplamento "parte de". Por exemplo: Um humano usa um telefone. A tecla "1" parte de um telefone. Encapsulamento consiste na separao de aspectos internos e externos de um objeto. Este mecanismo utilizado amplamente para impedir o acesso direto ao estado de um objeto (seus atributos), disponibilizando externamente apenas os mtodos que alteram estes estados. Exemplo: voc no precisa conhecer os detalhes dos circuitos de um telefone para utiliz-lo. A carcaa do telefone encapsula esses detalhes, provendo a voc uma interface mais amigvel (os botes, o monofone e os sinais de tom).

Orientao a objeto Abstrao a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando caractersticas menos importantes ou acidentais. Em modelagem orientada a objetos, uma classe uma abstrao de entidades existentes no domnio do sistema de software. Polimorfismo consiste em quatro propriedades que a linguagem pode ter (atente para o fato de que nem toda linguagem orientada a objeto tem implementado todos os tipos de polimorfismo): Universal: Incluso: um ponteiro para classe me pode apontar para uma instncia de uma classe filha (exemplo em Java: "List lista = new LinkedList();" (tipo de polimorfismo mais bsico que existe). Paramtrico: se restringe ao uso de templates (C++, por exemplo) e generics (Java). Ad-Hoc: Sobrecarga: duas funes/mtodos com o mesmo nome mas assinaturas diferentes. Coero: a linguagem que faz as converses implicitamente (como por exemplo atribuir um int a um float em C++, isto aceito mesmo sendo tipos diferentes pois a converso feita implicitamente). Interface um contrato entre a classe e o mundo externo. Quando uma classe implementa uma interface, ela est comprometida a fornecer o comportamento publicado pela interface.[1] Pacotes so referncias para organizao lgica de classes e interfaces.[1]
[1] http:/ / java. sun. com/ docs/ books/ tutorial/ java/ concepts/

18

Ver tambm
Padres de projeto de software Framework Classe

Ligaes externas
Pgina oficial da UML (http://www.uml.org/) (em ingls) cfoop.org OOP para ColdFusion (http://www.cfoop.org/) (em ingls) Conceitos de OOP em Java (http://java.sun.com/docs/books/tutorial/java/concepts/index.html) (em ingls) (Site oficial do Java na Sun Microsystems) Guia do Hardware: Programao Orientada a Objetos (http://www.guiadohardware.net/artigos/ programacao-orientada-objetos/) (em portugus) Conceitos de OOP em C++ (http://www.cplusplus.com/doc/tutorial/) (em ingls)

Referncias bibliogrficas
Carlos Sica. PHP Orientado a Objetos - Fale a Linguagem da Internet.1.ed.Rio de Janeiro:Cincia Moderna, 2006. Pablo Dall'Oglio. PHP Programando com Orientao a Objetos (http://www.adianti.com.br/phpoo): Inclui Design Patterns.1.ed.So Paulo:Novatec, 2007.pp.576. ISBN 978-85-7522-137-2 Alexandre Altair de Melo e Mauricio G. F. Nascimento. PHP Profissional (http://www.novatec.com.br/livros/ phppro): Aprenda a desenvolver sistemas profissionais orientados a objetos com padres de projeto.1.ed.So Paulo:Novatec, 2007.pp.464. ISBN 978-85-7522-141-9

Linguagem de programao de baixo nvel

19

Linguagem de programao de baixo nvel


Linguagem de programao de baixo nvel trata-se de uma linguagem de programao que compreende as caractersticas da arquitetura do computador. Assim, utiliza somente instrues do processador, para isso necessrio conhecer os registradores da mquina. Nesse sentido, as linguagens de baixo nvel esto diretamente relacionadas com a arquitetura do computador. Um exemplo a linguagem Assembly (no Assembler) que trabalha diretamente com os registradores do processador, manipulando dados. As linguagens de baixo nvel so divididas em duas categorias: primeira gerao e segunda gerao.

Primeira Gerao
A linguagem de primeira gerao, ou 1GL, o cdigo de mquina. a nica linguagem que um microprocessador pode entender nativamente. O cdigo de mquina no pode ser escrito ou lido por um editor de texto, e portanto raramente usado por uma pessoa diretamente. Exemplos: 1 - instruo de adio dos computadores B-200, B-300 e B-500 da Burroughs Corporation: O=Op Code M e N variaveis que definem os campos dos endereos AAA e BBB AAA, BBB e CCC campos com os endereos dos operandos Campo O M N AAA BBB CCC Cdigo: 1 2 3 100 200 300 Interpretao: 1. 2. 3. 4. 5. 6. O - 1 Cdigo da instruo de adio M - 2 Quantidade de dgitos da parcela 1, em AAA N - 3 Quantidade de dgitos da parcela 2, em BBB AAA - 100 endereo da parcela 1 BBB - 200 endereo da parcela 2 CCC - 300 endereo onde deve ser armazenado o resultado da adio da parcela 1 com a parcela 2.

2 - uma das instrues de adio do microprocessador de sinal digital (DSP) TMS-320C54x da Texas Instruments: 0000000SIAAAAAAA Interpretao: 0000000 - Cdigo desta instruo de adio. S - define qual dos dois acumuladores ser usado: 0 acumulador "A", 1 acumulador "B" I - indica o modo de endereamento: 0 endereamento direto, 1 indireto. AAAAAAA - Address (endereo) Esta instruo soma um valor de 16 bits da memria (cujo endereo est no apontador) ao acumulador selecionado

Segunda Gerao
A linguagem de segunda gerao, ou 2GL, a linguagem Assembly. considerada de segunda gerao pois embora no seja uma linguagem nativa do microprocessador, uma linguagem Assembly ainda deve compreender as caractersticas da arquitetura do microprocessador (como registradores e instrues).

Ver tambm
Linguagem de programao de alto nvel

Linguagem de programao de alto nvel

20

Linguagem de programao de alto nvel


Linguagem de programao de alto nvel o que se chama na Cincia da Computao de linguagens de programao com um nvel de abstrao relativamente elevado, longe do cdigo de mquina e mais prximo linguagem humana. Desse modo, as linguagens de alto nvel no esto diretamente relacionadas arquitetura do computador. O programador de uma linguagem de alto nvel no precisa conhecer caractersticas do processador, como instrues e registradores. Essas caractersticas so abstradas na linguagem de alto nvel. Por se tratar de uma classificao subjetiva, isto , sem limites bem definidos, no possvel afirmar que "determinada linguagem pode ser mais humana que outra". Apesar disso, por questo de praticabilidade e objetividade, a classificao geralmente se limita em "linguagem de alto nvel" e "linguagem de baixo nvel". Alguns exemplos de linguagens de alto nvel: ASP ActionScript C/C++ C# Pascal/Object Pascal Euphoria Java PHP Python Tcl Basic/Visual Basic

Ver tambm
Linguagem de mquina Linguagem de programao de baixo nvel Linguagem de programao

Linguagem de programao de primeira gerao

21

Linguagem de programao de primeira gerao


A primeira gerao de linguagem de programao ou 1GL conhecida como linguagem de mquina (ou binria), que usa apenas 0 (zero) e 1 (um) para programar softwares.

Histria
Originalmente nenhum tradutor foi usado para compilar ou montar as linguagens de primeira gerao. As instrues de programao eram submetidas atravs dos interruptores localizados no painel frontal de sistemas de computadores. O principal benefcio na primeira gerao que o cdigo escrito pelo usurio muito rpido e eficiente, desde que este cdigo seja diretamente executado pela CPU. O surgimentos de linguagens de programao com maior capacidade de abstrao e menor ocorrncia de erros levaram a linguagem de mquina a cair em desuso rapidamente, sendo usada hoje apenas de modo indireto (atravs de tradutores).

Desvantagens
No entanto, linguagem de mquina muito menos intuitivo de se utilizar do que linguagens de alto nvel, e elas so em grande parte mais difceis de editar se erros acontecerem. Alm disso, se instrues precisam ser armazenadas na memria, ento todas as instrues aps o ponto de insero precisam ser movidas para baixo para acomodar as novas instrues. Fazendo isso em switches localizados no painel frontal pode ser muito difcil. Alm disso, a portabilidade significativamente reduzida ao transferir cdigo para um computador diferente o cdigo tem que ser completamente reescrito visto que a linguagem de mquina de um computador para outro poderia ser significativamente diferente. Consideraes de arquitetura tornam a portabilidade algo muito difcil. Por exemplo, o nmero de registradores em uma arquitetura de CPU poderia ser diferentes das outras arquiteturas.

Linguagem de programao de segunda gerao

22

Linguagem de programao de segunda gerao


A segunda gerao representada pela linguagem de montagem ou assembly, que uma notao legvel por humanos para o cdigo de mquina que uma arquitetura de computador especfica usa. A linguagem de mquina, que um mero padro de bit, torna-se legvel pela substituio dos valores em bruto por smbolos chamados mnemnicos, ou seja, enquanto um computador sabe o que a instruo-mquina IA-21 (10110000 01100001) faz, para os programadores mais fcil recordar a representao equivalente em instrues mnemnicas (MOV AL, 61h), por exemplo. Ao contrrio do que acontece nas linguagens de alto nvel, existe (at certo ponto) uma correspondncia de 1 para 1 entre a linguagem de montagem simples e a linguagem de mquina. Por isso a traduo do cdigo de montagem em cdigo de mquina no chamada compilao, mas montagem. Consegue-se transformar a linguagem de montagem em linguagem de mquina recorrendo a um montador (ou assembler), e a transformao inversa faz-se recorrendo a um desmontador (ou disassembler). Cada arquitetura de computador tem a sua prpria linguagem de mquina e, portanto, sua prpria linguagem de montagem. Essas linguagens de montagem diferem no nmero e tipo de operaes que suportam. Tambm tm diferentes tamanhos e nmeros de registros, e diferentes representaes dos tipos de dados armazenados. Enquanto todos os computadores de utilizao genrica so capazes de desempenhar essencialmente as mesmas funes, o modo como o fazem diferente. Alm disso, podem existir conjuntos mltiplos de mnemnicas, ou sintaxes de linguagem de montagem, para um nico conjunto de instrues. Nestes casos, o conjunto mais popular aquele que utilizado pelo fabricante na sua documentao. A maioria dos processadores s consegue manipular os dados que esto em registradores e a linguagem de montagem facilita o trabalho direto com os registradores.

Linguagem de programao de terceira gerao


Uma linguagem de terceira gerao (3GL, em ingls) uma linguagem de programao projetada para ser facilmente entendida pelo ser humano, incluindo coisas como variveis com nomes. Um exemplo disso seria: COMPUTE COMISSAO = VENDA * 0,5 Fortran, ALGOL e COBOL so algumas das primeiras linguagens desse tipo. A maioria das linguagens "modernas" (BASIC, C, C++) so de terceira gerao. A maioria das linguagens de terceira gerao suportam programao estruturada.

Linguagem de programao de quarta gerao

23

Linguagem de programao de quarta gerao


As linguagens de programao de quarta gerao, ou 4GLS em sua abreviatura de origem inglesa, so linguagens de programao de alto-nvel com objetivos especficos, como o desenvolvimento de softwares comerciais de negcios. Elas permitem o programador especificar o que deve ser feito visando um resultado imediato. O termo 4GL foi usado primeiramente por James Martin em seu livro publicado em 1982 "Applications Development Without Programmers" para se referir a estas linguagens no-procedimentais e de alto-nvel. Alguns acreditam que a primeira 4GL foi uma linguagem chamada Ramis, desenvolvida por Gerald C. Cohen na empresa Mathematica (uma companhia de software matemticos). Cohen deixou Mathematica e fundou a Information Builders, para criar uma 4GL similar, chamada FOCUS. A principal diferena entre as linguagens de terceira e quarta gerao, que estas primeiras so linguagens procedurais que descrevem como fazer algo, enquanto a 4GL descreve o que voc quer que seja feito. Uma 4GL que se popularizou foi a linguagem SQL (Structured Query Language), que se tornou um padro para manipulao e consulta de bancos de dados, sendo hoje em dia muito usada em conjunto com as linguagens de terceira gerao.

Algumas linguagens de quarta gerao bem-sucedidas


Database query languages FOCUS Oracle PL/SQL NATURAL Progress 4GL SQL

Report generators BuildProfessional GEMBase IDL-PV/WAVE LINC Metafont NATURAL Oracle Reports PostScript Progress 4GL Query/Results RPG-II S Gauss Mathematica

Linguagens de manipulao de dados, anlise e criao de reports Clarion Programming Language Ab Initio ABAP Aubit-4GL

DASL FOCUS GraphTalk

Linguagem de programao de quarta gerao Informix-4GL NATURAL Nomad Progress 4GL Ramis SAS Synon CorVision LANSA XML Linguagens para Data-stream APE AVS Iris Explorer Geradores e desenhadores de Ecrs Oracle Forms Progress 4GL ProVision Unify Accell Criao de GUI 4th Dimension (Software) Delphi programming language eDeveloper MATLAB's GUIDE Progress 4GL AppBuilder Revolution programming language Visual Basic's form editor Windows Forms (part of the .NET Framework) OpenROAD

24

Ligaes externas
Fourth Generation Environments [1] 4GL GPL/GNU OpenSource development tools project [2] Domain-Specific Languages for Software Engineering [3] (Compares 4GLs to DSLs)

Referncias
[1] http:/ / www. soi. city. ac. uk/ ~tony/ dbms/ 4ges. html [2] http:/ / aubit4gl. sourceforge. net/ [3] http:/ / www. google. com/ url?sa=t& ct=res& cd=10& url=http%3A/ / csdl. computer. org/ comp/ proceedings/ hicss/ 2002/ 1435/ 09/ 14350279. pdf& ei=pgcWQ6CwKsKYYMfF9OAI

Paradigma de programao

25

Paradigma de programao
Um paradigma de programao fornece e determina a viso que o programador possui sobre a estruturao e execuo do programa. Por exemplo, em programao orientada a objetos, programadores podem abstrair um programa como uma coleo de objetos que interagem entre si, enquanto em programao funcional os programadores abstraem o programa como uma sequncia de funes executadas de modo empilhado. Assim como diferentes grupos em engenharia de software propem diferentes metodologias, diferentes linguagens de programao propem diferentes paradigmas de programao. Algumas linguagens foram desenvolvidas para suportar um paradigma especfico (Smalltalk e Java suportam o paradigma de orientao a objetos enquanto Haskell e Scheme suportam o paradigma funcional), enquanto outras linguagens suportam mltiplos paradigmas (como o LISP, Perl, Python, C++ e Oz). Os paradigmas de programao so muitas vezes diferenciados pelas tcnicas de programao que probem ou permitem. Por exemplo, a programao estruturada no permite o uso de goto. Esse um dos motivos pelo qual novos paradigmas so considerados mais rgidos que estilos tradicionais. Apesar disso, evitar certos tipos de tcnicas pode facilitar a prova de conceito de um sistema, podendo at mesmo facilitar o desenvolvimento de algoritmos. O relacionamento entre paradigmas de programao e linguagens de programao pode ser complexo pelo fato de linguagens de programao poderem suportar mais de um paradigma.

Histria
Inicialmente, os computadores eram programados atravs de cdigo binrio, que representava as sequncia de controle alimentadas CPU. Tal processo era difcil e propenso a erros; os programas estavam em cdigo de mquina, que um paradigma de programao de muito baixo nvel. Para facilitar a programao foram desenvolvidas linguagens de montagem. Elas substituam as funes do cdigo de mquina por mnemnicos, endereos de memria absolutos por identificadores. A linguagem de montagem ainda considerada de baixo nvel, ainda que seja um paradigma da "segunda gerao" das linguagens. Mesmo linguagens de montagem da dcada de 1960 suportavam geraes condicionais de macros bastante sofisticadas. Tambm suportavam recursos de programao modular tais como CALL (para suportar subrotinas), variveis externas e sees comuns (globais); isso permitia o reuso de cdigo e o isolamento de caractersticas especficas do hardware, atravs do uso de operadores lgicos como READ, WRITE, GET e PUT. A linguagem de montagem foi e ainda usada para sistemas crticos, e frequentemente usada em sistemas embarcados. O prximo avano foi o desenvolvimento das linguagens procedurais. As primeiras a serem descritas como de alto nvel, essas linguagens da terceira gerao usam um vocabulrio relativo ao problema sendo resolvido. Por exemplo, COBOL usa termos como file (para identificar arquivos), move (para mover arquivos) e copy (para copiar arquivos). Tanto FORTRAN quanto ALGOL usam terminologia matemtica, tendo sido desenvolvidas principalmente para problemas comerciais ou cientficos. Tais linguagens procedurais descrevem, passo a passo, o procedimento a ser seguido para resolver certo problema. A eficcia e a eficincia de cada soluo subjetiva e altamente dependente da experincia, habilidade e criatividade do programador. Posteriormente, linguagens orientadas a objeto foram criadas. Nelas, os dados e as rotinas para manipul-los so mantidos numa unidade chamada objeto. O utilizador s pode acessar os dados atravs das subrotinas disponveis, chamadas mtodos, o que permite alterar o funcionamento interno do objeto sem afetar o cdigo que o consome. Ainda h controvrsia por programadores notveis como Alexander Stepanov, Richard Stallman[1] entre outros, questionando a eficcia desse paradigma em comparao do paradigma procedural. A necessidade de cada objeto de ter mtodos associados tornaria os programas muito maiores. o conceito de polimorfismo foi desenvolvido como tentativa de solucionar tal dilema. Tendo em vista que a orientao a objeto um paradigma e no uma linguagem, possvel criar at mesmo uma linguagem de montagem orientada a objeto, como o High Level Assembly.

Paradigma de programao Independente do ramo das linguagens imperativas, baseadas nas linguagens procedurais, paradigmas de programao declarativa tambm foram desenvolvidos. Nessa linguagens se descreve o problema ao computador, no como resolv-lo. O programa estruturado como uma coleo de propriedades para encontrar o resultado esperado, e no um procedimento a se seguir. Dado um banco de dados ou um conjunto de regras, o computador tenta encontrar a soluo ao casar todas as propriedades desejadas. Um exemplo o SQL, assim como a famlia das linguagens funcionais e lgicas. Programas escritos em programao funcional usam funes, blocos de cdigo construdos para agir como funes matemticas. Desencoraja-se a mudana do valor das variveis atravs de atribuio, fazendo grande de uso de recursividade para isso. Na programao lgica, fatos sobre o domnio do problema so expressados como frmulas lgicas, e os programas so executados ao se aplicar regras de inferncia nas frmulas at que uma resposta encontrada, ou a coleo de frmulas provada inconsistente.

26

Exemplos
Programao estruturada, em contraste a Programao orientada a objetos Programao imperativa, em contraste de programao declarativa Programao de passagem de mensagens, em contraste de programao imperativa Programao procedural, em contraste de programao funcional Programao orientada a fluxos, em contraste de programao orientada a eventos Programao escalar, em contraste de programao vetorial Programao restritiva, que complementa a programao lgica Programao orientada a aspecto (como em AspectJ) Programao orientada a regras (como em Mathematica) Programao orientada a tabelas (como em Microsoft FoxPro) Programao orientada a fluxo de dados (como em diagramas) Programao orientada a polticas Programao orientada a testes Programao genrica Programao multiparadigma (como em Scala)

[1] Mode inheritance, cloning, hooks & OOP (Google Groups Discussion) (http:/ / groups. google. com/ group/ comp. emacs. xemacs/ browse_thread/ thread/ d0af257a2837640c/ 37f251537fafbb03?lnk=st& q="Richard+ Stallman"+ oop& rnum=5& hl=en#37f251537fafbb03).

Programao declarativa

27

Programao declarativa
Programao declarativa um paradigma de programao baseado em programao funcional, programao lgica ou programao restritiva). Tal termo utilizado para discernir tais linguagens em relao linguagens de programao imperativa. Outra definio determina que um programa declarativo se descreve o que e no como seus procedimentos funcionam. Dessa forma, linguagens de marcao so declarativas pois descrevem o que so suas estruturas e no como elas sero utilizadas. Tal definio foge do escopo pois no trata-se de linguagens de programao. Em particular, a programao restritiva e a programao lgica descrever propriedades da soluo desejada, no especificando como o algoritmo em si deve agir. Apesar disso a maioria das linguagens desse paradigmas permitem que os algoritmos sejam implementados com detalhes, ento no constituem uma linguagem declarativa pura por definio. Similarmente, possvel escrever programas de forma declarativa utilizando linguagens de programao imperativas. Isso pode ser obtido utilizando mtodos como encapsulamento para esconder detalhes de implementao fora de uma biblioteca. linguagens funcionais que admitem tal abordagem incluem Erlang, Haskell e Lisp. Linguagens lgicas que admitem tal abordagem incluem Prolog e Mercury. Linguagens restritivas que admitem tal abordagem incluem Oz.

Linguagens especficas por domnio


Uma forma popular de programao declarativa o uso de linguagens especficas por domnio, no qual domnio refere-se ao domnio de discurso, isto , o assunto o qual a linguagem est descrevendo. Exemplos de linguagens nessa categoria incluem XSLT (para transformar documentos XML), SQL (para realizar requisies a bancos de dados) e TK Solver.

Ver tambm
Paradigma de programao Programao funcional Programao lgica Programao restritiva

Referncias
(em ingls) Linguagem declarativa [1] - em Free On-line Dictionary of Computing (em ingls) Linguagem relacional [2] - em Free On-line Dictionary of Computing (em ingls) Programao lgica [3] - em Free On-line Dictionary of Computing (em ingls) Programao funcional [4] - em Free On-line Dictionary of Computing

Ligaes externas
(em ingls) Frans Coenen. Caractersticas de linguagens de programao declarativas [5]. 1999. (em ingls) David Mertz. POO avanado: programao declarativa e mini-linguagens [6]. 2003-07-31.

Programao declarativa

28

Referncias
[1] [2] [3] [4] [5] [6] http:/ / ftp. sunet. se/ foldoc/ foldoc. cgi?declarative+ language http:/ / ftp. sunet. se/ foldoc/ foldoc. cgi?relational+ language http:/ / ftp. sunet. se/ foldoc/ foldoc. cgi?logic+ programming http:/ / ftp. sunet. se/ foldoc/ foldoc. cgi?functional+ programming http:/ / www. csc. liv. ac. uk/ ~frans/ OldLectures/ 2CS24/ declarative. html#detail http:/ / www. onlamp. com/ pub/ a/ python/ 2003/ 07/ 31/ declarative_python. html

Programao procedural
O termo Programao procedural (ou programao procedimental) as vezes utilizado como sinnimo de Programao imperativa (Paradigma de programao que especifica os passos que um programa deve seguir para alcanar um estado desejado), mas o termo pode se referir (como neste artigo) a um paradigma de programao baseado no conceito de chamadas a procedimento. Procedimentos, tambm conhecidos como rotinas, subrotinas, mtodos, ou funes (que no devem ser confundidas com funes matemticas, mas so similares quelas usadas na programao funcional) simplesmente contm um conjunto de passos computacionais a serem executados. Um dado procedimento pode ser chamado a qualquer hora durante a execuo de um programa, inclusive por outros procedimentos ou por si mesmo. A programao procedural geralmente uma escolha melhor que programao sequencial e no estruturada em muitas situaes que envolvem uma complexidade mdia e requerem facilidade de manuteno. Possveis benefcios so: A habilidade de reutilizar o mesmo cdigo em diferentes lugares no programa sem copi-lo. Uma forma mais fcil de organizar o fluxo do programa que uma coleo de comandos "goto" ou "jump" (que podem transformar um programa grande e complicado no assim chamado Cdigo espaguete). A habilidade de ser fortemente modular e estruturado.

Procedimentos e Modularidade
A Modularidade uma caracterstica geralmente desejvel, especialmente em programas grandes e complicados. Ela pode ser alcanada com a utilizao de procedimentos com canais de entrada e sada estritamente definidos, usualmente acompanhados de regras claras sobre quais tipos de entrada e sada so permitidos ou esperados. As entradas costumam ser especificadas sintaticamente na forma de argumentos, e as sadas entregues na forma de valores de retorno. O gerenciamento de escopo outra tcnica que ajuda a manter procedimentos fortemente modulares. Ela impede que o procedimento acesse variveis de outros procedimentos (e vice-versa), incluindo instncias anteriores de si mesmo, sem autorizao explcita. Isto ajuda a impedir confuses entre variveis com o mesmo nome sendo utilizadas em locais diferentes, e tambm que os procedimentos atrapalhem a execuo um do outro. Procedimentos menos modulares, freqentemente utilizados em programas pequenos ou escritos rapidamente, tendem a interagir com um grande nmero de variveis no ambiente de execuo, que tambm podem ser modificadas por outros procedimentos. O fato de que muitas variveis agem como pontos de contato entre as vrias partes do programa o que o torna menos modular. Por causa da habilidade de especificar uma interface simples, de serem auto-contidos, e de serem reutilizados, procedimentos facilitam a criao de programas ou bibliotecas de programao por vrias pessoas ou grupos diferentes. (Ver Mdulo (programao) e Pacote de Software.)

Programao procedural

29

Comparao com a Programao Imperativa


Todas (ou pelo menos a maioria) das linguagens procedurais tambm so linguagens imperativas, pois fazem referncias explcitas ao estado do ambiente de execuo. Isto pode significar desde variveis (que podem corresponder aos registradores do processador) a algo como a posio da "tartaruga" na linguagem de programao Logo (que por sua vez pode ser desde um cursor na tela a um dispositivo fsico que se move no cho de uma sala). Algumas formas de programao imperativa, como a programao orientada a objetos no so necessariamente procedurais.

Linguagens de Programao Procedural


Para ser considerada procedural, uma linguagem de programao deve suportar o conceito de procedimentos, e possuir uma sintaxe para defini-los. Idealmente, ela deve suportar a especificao de tipos de argumentos, variveis locais, chamadas recursivas e o uso de procedimentos em mdulos distintos de um programa. Ela tambm pode suportar a distino entre argumentos de entrada e de sada. O exemplo cannico de uma linguagem de programao procedural ALGOL. Uma linguagem em que a nica forma de procedimento um mtodo geralmente considerada orientada a objetos ao invs de procedural, e no ser includa nesta lista. Isto se aplica a C# e Java, mas no a C++. Ada ALGOL BASIC C C++ ColdFusion COBOL Component Pascal D Delphi ECMAScript (e.g., ActionScript, DMDScript, JavaScript, JScript) Forth Fortran F Lasso Linoleum Maple Mathematica MATLAB Modula-2 Oberon (Oberon-1 e Oberon-2) Occam M Pascal Perl PHP PL/C

Python PL/I Rapira

Programao procedural VBScript Visual Basic

30

Ver tambm
Programao funcional Programao imperativa Programao orientada a objetos Paradigma de programao Linguagem de programao Programao estruturada

Ligaes externas
Open Directory: Programming: Languages: Procedural [1]

Referncias
[1] http:/ / dmoz. org/ Computers/ Programming/ Languages/ Procedural/

Programao funcional
Em cincia da computao, programao funcional um paradigma de programao que trata a computao como uma avaliao de funes matemticas e que evita estados ou dados mutveis. Ela enfatiza a aplicao de funes, em contraste da programao imperativa, que enfatiza mudanas no estado do programa[1] . Uma funo, neste sentido, pode ter ou no ter parmetros e um simples valor de retorno. Os parmetros so os valores de entrada da funo, e o valor de retorno o resultado da funo. A definio de uma funo descreve como a funo ser avaliada em termos de outras funes. Por exemplo, a funo definida em termos de funes de exponenciao e adio. Do mesmo modo, a linguagem deve oferecer funes bsicas que no requerem definies adicionais. Linguagens de programao funcionais, especialmente as puramente funcionais, tem sido mais usadas academicamente que no desenvolvimento comercial de software. Entretanto, algumas linguagens notveis usadas na indstria e no comrcio incluem Erlang (aplicaes concorrentes)[2] , R (estatstica), Mathematica (matemtica simblica)[3] J e K (anlise financeira) e XSLT.[4] [5] Importantes influncias na programao funcional foram o clculo lambda, as linguagens de programao APL e Lisp, e mais recentemente ML, Haskell, OCaml e F#.

Desenvolvimento
As funes podem ser manipuladas em uma grande variedade de formas em uma linguagem de programao funcional. As funes so tratadas como valores de primeira importncia, o que o mesmo que dizer que funes podem ser parmetros ou valores de entrada para outras funes e podem ser os valores de retorno ou sada de uma funo. Ento podemos entender paradigma funcional como um mapeamento dos valores de entrada nos valores de retorno, atravs de funes. Isso permite que funes como mapcar em LISP e map em Haskell que tomam ambos uma funo e uma lista como entrada e aplicam a funo de entrada a cada elemento da lista. Funes podem ser nomeadas, como em outras linguagens, ou definidas anonimamente (algumas vezes durante a execuo do programa) usando uma abstrao lambda e usadas como valores em outras funes. Linguagens funcionais tambm permitem que funes sejam do tipo curry. Currying uma tcnica para reescrita de funes com mltiplos parmetros como a composio de funes de um parmetro. A funo do tipo curry pode ser aplicada apenas a um

Programao funcional subconjunto de seus parmetros. O resultado uma funo onde os parmetros neste subconjunto so agora fixados como constantes, e os valores do resto dos parmetros ainda no so especificados. Esta nova funo pode ser aplicada aos parmetros restantes para obter o valor da funo final. Por exemplo, uma funo adiciona(x,y) = x + y pode ser do tipo curry de forma que o valor de retorno adiciona(2) note que que no h um parmetro y ser uma funo annima, o que equivalente funo adiciona2(y) = 2 + y. Esta nova funo tem apenas um parmetro e corresponde a adicionar 2 a um nmero. Novamente, isso apenas possvel porque as funes so tratadas como valores de primeira importncia. O clculo lambda pode ser considerado a primeira linguagem de programao funcional, embora nunca tenha sido projetada para ser realmente executada em um computador. um modelo de computao projetado por Alonzo Church nos anos 1930 que oferece um modo muito formal de descrever um clculo de uma funo. A primeira linguagem de programao funcional criada para computadores foi LISP, desenvolvida por John McCarthy no Instituto de Tecnologia de Massachusetts (MIT) no fim dos anos 1950. Mesmo no sendo uma linguagem de programao puramente funcional, LISP introduziu a maioria das caractersticas hoje encontradas nas modernas linguagens de programao funcional. Scheme foi uma tentativa posterior de simplificar e melhorar LISP. Nos anos 1970 a linguagem ML foi criada pela Universidade de Edimburgo, e David Turner desenvolveu a linguagem Miranda na Universidade de Kent. A linguagem Haskell foi lanada no fim dos anos 1980 em uma tentativa de juntar muitas idias na pesquisa de programao funcional.

31

Contraste com a programao imperativa


A programao funcional pode ser contrastada com a programao imperativa. Na programao funcional parecem faltar diversas construes freqentemente (embora incorretamente) consideradas essenciais em linguagens imperativas, como C ou Pascal. Por exemplo, em uma programao estritamente funcional, no h alocao explcita de memria, nem declarao explcita de variveis. No entanto, essas operaes podem ocorrer automaticamente quando a funo invocada; a alocao de memria ocorre para criar espao para os parmetros e para o valor de retorno, e a declarao ocorre para copiar os parmetros dentro deste espao recm-alocado e para copiar o valor de retorno de volta para dentro da funo que a chama. Ambas as operaes podem ocorrer nos pontos de entrada e na sada da funo, ento efeitos colaterais no clculo da funo so eliminados. Ao no permitir efeitos colaterais em funes, a linguagem oferece transparncia referencial. Isso assegura que o resultado da funo ser o mesmo para um dado conjunto de parmetros no importando onde, ou quando, seja avaliada. Transparncia referencial facilita muito ambas as tarefas de comprovar a correo do programa e automaticamente identificar computaes independentes para execuo paralela. Laos, outra construo de programao imperativa, est presente atravs da construo funcional mais geral de recursividade. Funes recursivas invocam-se a si mesmas, permitindo que uma operao seja realizada vrias vezes. Na verdade, isso prova que laos so equivalentes a um tipo especial de recursividade chamada recursividade reversa. Recursividade em programao funcional pode assumir vrias formas e em geral uma tcnica mais poderosa que o uso de laos. Por essa razo, quase todas as linguagens imperativas tambm a suportam (sendo Fortran 77 e COBOL excees notveis).
[1] Paul Hudak (setembro de 1989). " Conception, evolution, and application of functional programming languages (http:/ / www. cs. berkeley. edu/ ~jcondit/ pl-prelim/ hudak89functional. pdf)" (pdf). ACM Computing Surveys. [2] Who uses Erlang for product development? (http:/ / www. erlang. org/ faq/ t1. html#AEN50) (em ingls). Pgina visitada em 27 de junho de 2006. [3] Departmento de Matemtica Aplicada, Universidade do Colorado. Functional vs. Procedural Programming Language (http:/ / amath. colorado. edu/ computing/ mmm/ funcproc. html) (em ingls). Pgina visitada em 28 de agosto de 2006. [4] Dimitre Novatchev. The Functional Programming Language XSLT - A proof through examples (http:/ / www. topxml. com/ xsl/ articles/ fp/ ) (em ingls). Pgina visitada em 27 de maio de 2006. [5] David Mertz. XML Programming Paradigms (part four): Functional Programming approached to XML processing (http:/ / gnosis. cx/ publish/ programming/ xml_models_fp. html) (em ingls). Pgina visitada em 27 de maio de 2006.

Programao funcional Cousineau, Guy and Michel Mauny. The Functional Approach to Programming. Cambridge, UK: Cambridge University Press, 1998. Graham, Paul. ANSI Common LISP. Englewood Cliffs, New Jersey: Prentice Hall, 1996. Hudak, Paul. "Conception, Evolution, and Application of Functional Programming Languages". ACM Computing Surveys 21, no. 3 (1989): 359-411. Pratt, Terrence, W. and Marvin V. Zelkowitz. Programming Languages: Design and Implementation. 3rd ed. Englewood Cliffs, New Jersey: Prentice Hall, 1996. Salus, Peter H. Functional and Logic Programming Languages. Vol. 4 of Handbook of Programming Languages. Indianapolis, Indiana: Macmillan Technical Publishing, 1998. Thompson, Simon. Haskell: The Craft of Functional Programming. Harlow, England: Addison-Wesley Longman Limited, 1996.

32

Ver tambm
Clculo lambda

Programao restritiva
Programao com restries um paradigma de programao que se refere ao uso de restries na construo de relaes entre variveis. Consiste em especificar, para uma soluo, que critrios (restries) esta tem de cumprir. Surgiu inicialmente contido no contexto da programao lgica, apesar de actualmente existirem implementaes baseadas em programao funcional (como em Oz) e programao imperativa (como em Kaleidoscope). De forma geral, as restries so implementadas como uma extenso de uma linguagem j existente. Estas, operam sobre domnios especficos, sendo os mais usuais os seguintes: booleanos nmeros inteiros e racionais lineares finitos mistos (vrios dos anteriores)

Apesar dos vrios domnios disponveis, o mais usado actualmente o domnio finito, devido principalmente sua versatilidade. Na prtica, o interpretador cria inicialmente o domnio para cada varivel do problema e vai restringindo cada domnio medida que avalia cada restrio. No fim deste processo, obter-se- uma ou vrias solues que satisfaam as restries ou, caso estas no sejam satisfazveis, nenhuma soluo.

Ligaes externas
(em ingls) Guia para a programao com restries [1]

Referncias
[1] http:/ / kti. ms. mff. cuni. cz/ ~bartak/ constraints/ index. html

Programao orientada a aspecto

33

Programao orientada a aspecto


Em cincia da computao, programao orientada a aspectos ou POA, um paradigma de programao de computadores que permite aos desenvolvedores de software separar e organizar o cdigo de acordo com a sua importncia para a aplicao (separation of concerns). Todo o programa escrito no paradigma orientado a objetos possui cdigo que alheio a implementao do comportamento do objeto. Este cdigo todo aquele utilizado para implementar funcionalidades secundrias e que encontra-se espalhado por toda a aplicao (crosscutting concern). A POA permite que esse cdigo seja encapsulado e modularizado. O conceito foi criado por Gregor Kiczales e a sua equipe na Xerox PARC, a diviso de pesquisa da Xerox. Eles desenvolveram o AspectJ, a primeira e mais popular linguagem POA. Os paradigmas de programao mais antigos, como a programao procedural e programao orientada a objeto, implementam a separao do cdigo, atravs de entidades nicas. Por exemplo, a funcionalidade de log de dados, numa linguagem orientada a objetos, implementada em uma nica classe, que referenciada em todos os pontos onde necessrio fazer log de dados. Como praticamente todo mtodo necessita que alguns dados sejam registrados em log, as chamadas a essa classe so espalhadas por toda a aplicao. Tipicamente uma implementao da POA busca encapsular essas chamadas atravs de uma nova construo chamada de "aspecto". Um aspecto pode alterar o comportamento de um cdigo (a parte do programa no orientada a aspectos) pela aplicao de um comportamento adicional, advice, sobre um "ponto de execuo", ou join point. A descrio lgica de um conjunto de join points chamada de pointcut. Em muitas linguagens POA, a execuo de um mtodo e referncias a atributos so exemplos de join points. Um pointcut consiste, por exemplo, de todas as referncias a um conjunto de atributos.

Motivao e conceitos bsicos


A programao orientada a aspectos tem como objetivo a separao do cdigo segundo a sua importncia para a aplicao, permitindo que o programador encapsule o cdigo secundrio em mdulos separados do restante da aplicao. Por exemplo, considere uma aplicao bancria escrita em Java que possui um mtodo que simplesmente transfere um valor de uma conta para outra: void transferir(Conta origem, Conta destino, int valor) { if (origem.getSaldo() < valor) { throw new SaldoInsuficienteException(); } origem.debitar(valor); destino.creditar(valor); } Porm, numa aplicao bancria construda para o mundo real, este mtodo de transferncia est longe do adequado. necessrio incluir verificaes de segurana, que determinam se o usurio possui autorizao para realizar a operao. preciso tambm "envolver" a operao em uma transao para prevenir perda de dados. Finalmente, preciso fazer o log dos dados da aplicao. Uma verso simplificada que contm estes novos objetivos (concerns) mostrada abaixo: void transferir(Conta origem, Conta destino, int valor) { if (!getUsuarioCorrente().temPermissao(OP_TRANSFERENCIA)) { throw new PermissaoException(); }

Programao orientada a aspecto

34

if (valor < 0) { throw new TransferenciaNegativaException(); } if (origem.getSaldo() < valor) { throw new SaldoInsuficienteException(); } Transaction tx = database.newTransaction(); try { origem.debitar(valor); destino.creditar(valor); tx.commit(); logger.logOperation(OP_TRANSFERENCIA, origem, destino, valor); } catch(Exception e) { tx.rollback(); } } Comparando com a primeira verso, o cdigo perdeu a sua elegncia e simplicidade, depois que o cdigo voltado para outros objetivos foi "misturado" com aquele que implementa as regras do negcio. As transaes, segurana, log de dados, etc. so exemplos de cdigo chamado de crosscutting concerns. Tambm deve-se considerar o que ocorre quando necessrio alterar, por exemplo, a implementao de segurana da aplicao. No exemplo mostrado, o cdigo espalhado por vrios mtodos, e qualquer mudana significa um grande esforo de codificao. Pode-se dizer que esse cdigo no est devidamente encapsulado nos seus prprios mdulos. Isto aumenta a complexidade do sistema e torna a manuteno do sistema muito mais difcil. A POA busca resolver esse problema permitindo que o programador implemente essas questes (segurana, log, transaes, e etc) atravs de aspectos. Em muitas linguagens POA, o aspecto constitudo de uma ou mais peas de advices (fragmentos de cdigo, como mtodos) e uma lista de join points (pontos no programa principal na qual os advices so inseridos). Por exemplo, um mdulo de segurana pode incluir um advice que faz uma verificao de segurana, com instrues para inserir este fragmento de cdigo no incio dos mtodos a(), b() e c() de algumas classes. Alguns mecanismos poderosos so utilizados, para que o desenvolvedor no precise definir os "pontos de insero" manualmente. Estes mecanismos so conhecidos como linguagens de especificao de pointcuts.

Modelos de join point


Fundamentalmente, o modo como o aspecto interage com o programa definido como modelo de join point (join point model, ou JPM) no qual o aspecto escrito. Este modelo define trs coisas: onde o aspecto pode ser aplicado. Os chamados join points. um modo para especificar, ou quantificar, mltiplos join points, os chamados pointcuts. Os pointcuts so na verdade uma consulta sobre todos os join points de um programa para selecionar um conjunto menor deles. um meio para alterar o comportamento dos join points. Em AspectJ, este meio chamado de advice. O AspectJ tem dois JPMs: pointcuts e advice, e declaraes inter-tipo. Outras linguagens orientadas a aspecto tem JPMs diferentes.

Programao orientada a aspecto

35

Os pointcuts e advices no AspectJ


os join points so pontos bem definidos ao longo da execuo do programa. Incluem: execuo de mtodos, criao de objetos e lanamento de excees. Notar que esses join points so dinmicos, e portanto, s podem ser descobertos em tempo de execuo. Por esta razo, os pointcuts e advices do AspectJ so conhecidos como um modelo de join points dinmico. pointcuts so especificados por uma consulta sobre o programa. Um exemplo de pointcut: pointcut set() : execution(* *.set*(..) ) && this(Point); Este pointcut define todos os join points correspondentes "execuo" de qualquer mtodo cujo nome iniciado com set de um objeto cujo tipo Point. advice definido de maneira similar ao mtodo. Porm, o advice nunca invocado explicitamente. Ele invocado somente quando um pointcut ligado a ele tem resultado igual a true (verdadeiro). after() : set() { <code>Display.update(); } O significado deste trecho de cdigo : aps set() resultar em true execute o comando dentro do advice.

Declaraes inter-tipos no AspectJ


O segundo JPM no AspectJ conhecido como declarao inter-tipo. um mecanismo que permite que um aspecto adicione outras declaraes numa classe ou objeto existente. Este conceito conhecido como "classes abertas". Um exemplo de declarao inter-tipo: aspect VisitAspect { Point.acceptVisitor(Visitor v) { v.visit(this); } } Este trecho de cdigo adiciona o mtodo acceptVisitor na classe Point. Os join points so todos de tipos no annimos. Os pointcuts so nomes de classes ou interfaces. Um meio de provocar alguma mudana nos pointcuts adicionar uma declarao de corpo no tipo.

A insero dos advices


A insero, a incluso dos advices do aspecto nos join points especificados. Na introduo original da POA, Kiczales e sua equipe listaram as seguintes possibilidades para essa insero: um pr-processador do cdigo fonte (similar as implementaes originais do C++). um ps-processador que incluiria patches em arquivos binrios um compilador que suportasse a POA e gerasse arquivos binrios com os advices inseridos. em tempo de carregamento (no caso do Java, os advices seriam inseridos assim que as classes fossem carregadas na mquina virtual (JVM). em tempo de execuo (detectar cada join point em tempo de execuo e executar todos os advices relevantes). As primeiras duas opes dificultam o processo de desenvolvimento, enquanto as duas ltimas causam impacto no desempenho do programa. Alm disso a ltima requer um ambiente especial para execuo. No mundo Java,

Programao orientada a aspecto implicaria no uso de uma JVM especial ou de algum framework de suporte. O AspectJ utiliza um compilador dedicado como soluo. O compilador gera cdigo Java padro em arquivos binrios de classe, que qualquer JVM padro pode executar. A insero em tempo de carregamento ser adicionada numa prxima verso como resultado da fuso do AspectJ e do AspectWerkz. Todas as opes de insero, exceto a ltima, implicam na mudana do cdigo em algum ponto. O cdigo gerado pelo compilador para uma dada classe Java (aps o processamento e/ou carregamento) no igual aquele que um compilador padro Java geraria, j que ele no contm pores de cdigo de advice. Muitos vem isto como um problema da POA, devido ao fato disto dificultar o entendimento do modelo de execuo do programa por parte do programador e dificultar a utilizao de ferramentas de depurao. (ver "Problemas" abaixo) Cohen e Gil produziram uma nova alternativa: eles apresentaram a noo de "insero em tempo de instalao" ( deploy-time weaving [1]). Basicamente um ps-processador, mas ao invs de aplicar patches ao cdigo gerado, ele sugere a criao de sub classes das classes existentes, fazendo com que as modificaes sejam inseridas atravs de mtodos redefinidos. As classes originais permanecem intocadas, mesmo em tempo de execuo; e todas as ferramentas (depuradores, etc) podem ser utilizadas durante o desenvolvimento. Uma abordagem similar foi implementada em alguns servidores de aplicao, como o WebSphere da IBM.

36

Exemplos de linguagens que permitem POA


AspectJ e AspectH so as implementaes mais conhecidas deste paradigma de programao. Ambas so extenses de outras linguagens de programao. AspectJ uma extenso orientada a aspecto para a linguagem Java, enquanto que AspectH uma extenso de Haskell, que permite POA no modelo funcional, atravs de mnadas. AspectH menos conhecida por estar no ramo acadmico, enquanto que AspectJ j tem uma histria maior.

POA e outros paradigmas de programao


A programao orientada a aspecto difere muito do conceito da programao orientada a objeto e tem funcionalidade similar aos protocolos de meta-objeto. Os aspectos so prximos de conceitos de programao como subjects, mixins e delegao. Outros modos de se utilizar a programao orientada a aspecto incluem: composition filters e abordagem por hyperslices. Do ponto de vista matemtico, os aspectos formam uma extenso de lgica de segunda ordem para qualquer paradigma de programao: enquanto paradigmas usuais levam a um raciocnio baseado em funes, mensagens e assim por diante, atravs de uma assinatura funo/mensagem, a POA possibilita um raciocnio baseado em conjuntos destas entidades utilizando pointcuts com um caracter de substituio (wildcard) na sua assinatura. Portanto, pode-se enxergar a POA mais como uma extenso lgica poderosa, do que como um paradigma de programao. Esta viso foi proposta por Friedrich Steimann, por exemplo. Porm os defensores da POA a promovem como um pacote externo que pode ser entregue junto com a aplicao. Por exemplo, se um programa por si no tem suporte segurana, um pacote POA pode servir como uma extenso modular para a aplicao, disponibilizando a segurana.

Problemas da POA
A depurao um dos maiores problemas. Enquanto no nvel sinttico o cdigo POA aparece em separado, ele est junto do restante do cdigo em tempo de execuo. A insero de advices pode se tornar imprevisvel se no ficar definido que aspecto deve dominar. Os designers de software devem considerar meios alternativos para conseguir a separao do cdigo, como os tipos parciais do C#. Porm, estas abordagens no tem um mecanismo de quantificao que permite que o programador chegue a diversos join points com apenas uma declarao.

Programao orientada a aspecto Outro problema com a POA a captura no intencional de join points atravs dos wildcards. Por exemplo, suponha que seja especificado um determinado pointcut com um advice associado, e um wildcard para todos os mtodos que tenham certo padro de nomenclatura. Um programador desavisado pode criar um mtodo cujo nome seja compatvel com esse wildcard, sem que seja essa a sua inteno, levando execuo inadvertida do advice. Da mesma forma, ao renomear um mtodo, pode-se alterar completamente a sua semntica. Todos os programadores tem que conhecer o padro escolhido para a nomenclatura dos mtodos para que problemas sejam evitados. Uma ferramenta de desenvolvimento poderia criar condies para deixar os advices mais visveis, mas essa questo ainda permanece em aberto.

37

Implementaes
Para C#/VB.NET: [2] Aspect.NET [3] LOOM.NET [4] Enterprise Library 3.0 Policy Injection Application Block [5] Puzzle.NAspect [6] AspectDNG [7] Aspect# [8] Encase [9] Compose* [10] [11] PostSharp (veja tambm sua wiki para as tcnicas AOP no .NET ) [12] Seasar.NET [13] DotSpect (.SPECT) [14] The Spring.NET Framework como parte de sua funcionalidade [15] Wicca e Phx.Morph [16] Uma anlise exaustiva nas solues AOSD para .NET esta disponvel na Universidade Twente Para Java: AspectJ [19] AspectWerkz (Agora combinado com AspectJ) [20] Azuki [21] CaesarJ [9] Compose* [22] Dynaop [23] JAC [24] Guice [25] Jakarta Hivemind [26] Javassist Home Page [27] JAsCo (and AWED) [28] JAML [29] JBoss AOP [30] LogicAJ [31] Object Teams [32] PROSE [33] Reflex [34] The AspectBench Compiler for AspectJ (abc) The Spring Framework [35] The JMangler Project [36] InjectJ [37] GluonJ [38] Steamloom [18] Para ColdFusion: [17] ColdSpring

Para Common Lisp: [39] AspectL

Para Flash ActionScript 2.0 [40] as2lib

Para Delphi: InfraAspect [41]

Programao orientada a aspecto

38

Para C/C++: AspectC++ ([42]) [43] XWeaver project [44] FeatureC++ [45] AspectC [46] AspeCt-oriented C [47] Aspicere2

Para JavaScript: [48] Ajaxpect [49] AOP Fun with JavaScript (Substituido pelo Ajaxpect) [50] jQuery AOP Plugin [51] Dojo Toolkit [52] Aspectes [53] AspectJS [54] Humax Web Framework [55] Cerny.js [56] Advisable Para Common Lisp: [58] AspectL Para Lua: [60] AspectLua RE-AspectLua (verso voltada para Reuso) [61]

Para Cobol: [57] Cobble Para Cocoa: AspectCocoa [59]

Para make: MAKAO

Para ML: AspectML [62]

Para Perl: The Aspect Module [63]

Para PHP: [64] PHPaspect [65] Aspect-Oriented PHP [66] Seasar.PHP [67] AOP API para PHP [68] Transparent PHP AOP [69] PHP-AOP [70] Aspyct AOP [71] Lightweight Python AOP [72] Logilab's aspect module [73] Python/Transwarp AOP Tutorial (Substituido por PEAK) [74] PEAK [75] Pythius [76] Spring Python's AOP module [77] Experimental aspect programming for PyPy [78] AspectR [79] Aquarium

Para Python:

Para Ruby:

Para Squeak Smalltalk [80] AspectS [81] MetaclassTalk Para XML: AspectXML [82]

PAra UML 2.0: [83] WEAVR

Programao orientada a aspecto

39

Para mais informaes (implementaes do mundo real): [84] AOSD.net

Referncias
[1] http:/ / www. forum2. org/ tal/ AspectJ2EE. pdf [2] https:/ / www. academicresourcecenter. net/ curriculum/ pfv. aspx?ID=6801 [3] http:/ / www. rapier-loom. net [4] http:/ / www. codeplex. com/ entlib [5] http:/ / www. puzzleframework. com/ forum/ forum. aspx?Forum=24 [6] http:/ / sourceforge. net/ projects/ aspectdng/ [7] http:/ / www. castleproject. org/ aspectsharp/ [8] http:/ / theagiledeveloper. com/ articles/ Encase. aspx [9] http:/ / composestar. sourceforge. net/ [10] http:/ / www. postsharp. org/ [11] http:/ / www. postsharp. org/ aop. net [12] http:/ / www. seasar. org/ en/ dotnet/ [13] http:/ / dotspect. tigris. org/ [14] http:/ / www. springframework. net/ [15] http:/ / www. cs. columbia. edu/ ~eaddy/ wicca [16] http:/ / janus. cs. utwente. nl:8000/ twiki/ bin/ view/ AOSDNET/ CharacterizationOfExistingApproaches [17] http:/ / www. coldspringframework. org [18] http:/ / eclipse. org/ aspectj/ [19] http:/ / aspectwerkz. codehaus. org/ [20] http:/ / www. azuki-framework. org/ [21] http:/ / www. caesarj. org [22] http:/ / dynaop. dev. java. net/ [23] http:/ / jac. objectweb. org [24] http:/ / code. google. com/ p/ google-guice/ [25] http:/ / hivemind. apache. org/ [26] http:/ / www. csg. is. titech. ac. jp/ ~chiba/ javassist/ [27] http:/ / ssel. vub. ac. be/ jasco/ [28] http:/ / www. ics. uci. edu/ ~trungcn/ jaml/ [29] http:/ / labs. jboss. com/ portal/ jbossaop [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] http:/ / roots. iai. uni-bonn. de/ research/ logicaj http:/ / www. objectteams. org/ http:/ / prose. ethz. ch/ http:/ / reflex. dcc. uchile. cl/ http:/ / www. aspectbench. org/ http:/ / roots. iai. uni-bonn. de/ research/ jmangler/ http:/ / injectj. sourceforge. net/ http:/ / www. csg. is. titech. ac. jp/ projects/ gluonj/ http:/ / www. st. informatik. tu-darmstadt. de/ static/ pages/ projects/ AORTA/ Steamloom. jsp http:/ / common-lisp. net/ project/ closer/ aspectl. html http:/ / www. as2lib. org/ http:/ / code. google. com/ p/ infra/ http:/ / www. aspectc. org/ http:/ / www. pnp-software. com/ XWeaver/ index. html http:/ / wwwiti. cs. uni-magdeburg. de/ iti_db/ forschung/ fop/ featurec/ http:/ / www. cs. ubc. ca/ labs/ spl/ projects/ aspectc. html http:/ / www. aspectc. net http:/ / users. ugent. be/ ~badams/ aspicere2/ http:/ / code. google. com/ p/ ajaxpect/ http:/ / www. jroller. com/ page/ deep?entry=aop_fun_with_javascript http:/ / plugins. jquery. com/ project/ AOP http:/ / dojotoolkit. org http:/ / aspectes. tigris. org/

Programao orientada a aspecto


[53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] http:/ / www. aspectjs. com/ http:/ / humax. sourceforge. net http:/ / www. cerny-online. com/ cerny. js/ http:/ / i. gotfresh. info/ 2007/ 12/ 7/ advised-methods-for-javascript-with-prototype/ http:/ / users. ugent. be/ ~kdschutt/ cobble/ http:/ / common-lisp. net/ project/ aspectl/ http:/ / www. ood. neu. edu/ aspectcocoa/ http:/ / luaforge. net/ projects/ aspectlua/ http:/ / users. ugent. be/ ~badams/ makao/ http:/ / www. cs. princeton. edu/ sip/ projects/ aspectml/ http:/ / search. cpan. org/ perldoc?Aspect http:/ / phpaspect. org http:/ / www. aophp. net/ http:/ / www. seasar. org/ en/ php5/ index. html http:/ / www. phpclasses. org/ browse/ package/ 2633. html http:/ / www. phpclasses. org/ browse/ package/ 3215. html http:/ / php-aop. googlecode. com http:/ / www. aspyct. org http:/ / www. cs. tut. fi/ ~ask/ aspects/ aspects. html http:/ / www. logilab. org/ projects/ aspects http:/ / zope. org/ Members/ pje/ Wikis/ TransWarp/ AOPTutorial/ HomePage http:/ / peak. telecommunity. com/ http:/ / pythius. sourceforge. net/ http:/ / springpython. webfactional. com/ wiki/ AspectOrientedProgramming http:/ / codespeak. net/ pypy/ dist/ pypy/ doc/ aspect_oriented_programming. html http:/ / aspectr. sourceforge. net/ http:/ / aquarium. rubyforge. org/ http:/ / www. prakinf. tu-ilmenau. de/ ~hirsch/ Projects/ Squeak/ AspectS/ http:/ / csl. ensm-douai. fr/ MetaclassTalk http:/ / www. aspectXML. org http:/ / www. iit. edu/ ~concur/ weavr http:/ / www. aosd. net

40

Programao genrica

41

Programao genrica
Programao genrica um paradigma de programao no qual os algoritmos so escritos em uma gramtica estendida de forma a adaptar-se atravs da especificao das partes variveis que so definidas na instncia do algoritmo. Especificamente, a gramtica estendida eleva um elemento no varivel ou uma construo implcita na gramtica base para uma varivel ou constante, permitindo a utilizao do cdigo genrico. diferente da forma normal de programao na medida que invoca de certa forma as facilidade de metaprogramao da linguagem. Como isso ocorre em uma extenso da linguagem, novas semnticas so introduzidas e a linguagem enriquecida no processo. relacionada com a metaprogramao, mas no envolve a gerao de cdigo fonte, pelo menos visivelmente ao programador. diferente tambm da programao por macros, j que esta refere-se somente a busca e substituio de termos, no fazendo parte da gramtica da linguagem, implementada somente na fase de pr-processamento do cdigo. Para efeitos prticos, o paradigma permite que um parmetro assuma diferentes tipos de dados desde que certas regras sejam mantidas, como sub-tipos e assinaturas. Por exemplo, para criar uma lista usando programao genrica, uma possvel declarao seria List<T>, no qual T o tipo de dado. Para instanciar, poderia-se usar List<Inteiro> ou List<Animal>, j que o conceito de lista independe do tipo utilizado. Entre linguagens orientadas a objeto, C++, Linguagem D, BETA, Eiffel e verses de Java (1.5 e acima) fornecem o paradigma genrico. Visual Basic .NET, C# e Delphi.Net comearam a fornecer o paradigma a partir do .NET 2.0. Muito antes de todas as linguagens mencionadas, programao genrica j havia sido implementada na dcada de 1970 em linguagens como CLU e Ada. Mas somente o conceito de templates do C++ que popularizou o conceito. A tcnica permite que algoritmos sejam escritos independente dos tipos de dados utilizados. Os autores do conceituado livro de 1995 Design Patterns[1] referem-se programao genrica como tipos parametrizados, o que permite que um tipo possa ser definido sem especificar todos os outros tipos que ele utilizada. Os autores ainda descrevem que tal tcnica muito poderosa, especialmente quando combinada com o padro Delegar.

Utilizao em C++: templates


Templates so de grande utilidade para programadores C++, especialmente quando combinado com herana mltipla e sobrecarga de operadores. A biblioteca padro do C++ fornece vrias funes teis dentro de uma rede de templates conectados. Templates em C++ podem tambm serem usados para funes diversas programao genrica. Um exemplo a meta programao por templates, um mtodo para executar algoritmos em tempo de compilao ao invs de execuo.

Viso geral
Existem dois tipos de templates. Uma funo template se comporta como uma funo que pode aceitar argumentos de vrios tipos diferentes. Por exemplo, a biblioteca STL do C++ contm funes template max(x, y) que retornam ou x ou y, qual for maior. max() poderia ser definida assim: template <typename T> T max(T x, T y) { if (x < y) return y;

Programao genrica else return x; } Esse template pode ser chamado para diversos tipos de dado: cout << max(3, 7); cout << max(3.239, 5.238); // imprime 7 -> tipo de dado ''int'' // imprime 5.238 -> tipo de dado ''float''

42

O compilador determina, ao examinar os argumentos, que a primeira chamada possui assinatura max(int, int) e instancia uma verso da funo no qual o tipo T int. Da mesma forma, ele determina que a segunda chamada possui assinatura max(float, float), e instancia a funo para float. Isso somente funciona pois os tipos int e float definem a operao <. Para tipos de dados prprios (como classes), possvel usar sobrecarga de operadores para definir < para seu tipo, permitindo que ele seja usado na funo max(). Apesar de parecer um benefcio simples, no contexto de bibliotecas como a STL isso permite que programadores tenham mais funcionabilidade para seus tipos definidos ao definir os operadores. Por exemplo, definir < permite que um tipo possa ser usado com as funes padro sort(), stable_sort(), e binary_search(); alm de estruturas de dados como sets, entre outras. Como exemplo contrrio, o tipo padro complex no define o operador <, pois no existe ordenao definida em nmeros complexos. Logo max(x, y) no poder ser utilizado se x e y so do tipo complex. Da mesma forma, outros templates que necessitam de < no podem ser utilizados com complex. Uma classe template amplia o mesmo conceito para classes. Elas so usadas geralmente para criar containers genricos. Por exemplo, a STL possui o container list, que representa uma lista encadeada. Para criar listas encadeadas de inteiros, utiliza-se list<int>. Da mesma forma, uma lista de cadeias de texto definida como list<string>. list possui um conjunto de funes padro associadas a ele, que funcionam independente do tipo utilizado para a lista.

Vantagens e desvantagens
Algumas aplicaes de templates, como a funo max(), eram anteriormente criadas por macros de funo: #define max(a,b) ( (a) < (b) ? (b) : (a) ) Tanto macros quanto templates so instanciados em tempo de compilao. Macros so sempre expandidas no prprio local onde foram utilizadas; templates tambm podem ser expandidos no prprio local onde foram utilizadas, se o compilador considerar adequado. Logo, tanto macros de funo quanto funes template no exigem mais processamento na execuo. Apesar disso, templates so considerados uma evoluo sobre macros nesse propsito. Eles verificam a tipagem de dados, evitam alguns dos erros mais comuns ao se utilizar macros excessivamente e so mais robustos que macros. Antigamente, os compiladores no tinham bom suporte para templates. No entanto, praticamente todos os compiladores atuais do mercado conseguem lidar com templates sem problemas. Ainda assim, existem duas desvantagens no uso de templates. Primeiro, quase todos os compiladores produzem mensagens de erros em templates que so confusas e de pouca ajuda, o que torna o desenvolvimento mais difcil. Segundo, quanto mais tipos de dados diferentes utilizados em templates, geralmente mais cdigo gerado pelo compilador (uma verso da funo ou classe para cada tipo de dado), logo, o uso indiscriminado pode levar a executveis excessivamente grandes. O primeiro problema mencionado ser elimiado com a chegada dos Conceitos novo padro C++ (C++0x, que est previsto para 2009). Atravs dos conceitos ser possvel estabelecer um mecanismo formal para verificao de tipos e operaes esperadas por um parmetro template. Com isso, mensagens de erro sero sempre claras e objetivas.

Programao genrica

43

Utilizao em Haskell
Em Haskell, algumas extenses linguagem foram desenvolvidas para a programao genrica. Alm disso a prpria linguagem contm alguns aspectos do paradigma includos.

Suporte na prpria linguagem


Dado a declarao de um tipo de dado definido pelo usurio (uma rvore binria com o tipo de dado a para os ns): data BinTree a = Leaf a | Node (BinTree a) a (Bintree a) deriving (Eq, Show) A palavra-chave deriving seguida de dois tipos de dados torna possvel para o programador ter uma funo definida para BinTree de igualdade (Eq) e sada padro (Show). Assim, o compilador Haskell pode gerar instncias de funes particulares para qualquer tipo de dado (com algumas restries).

Extenso PolyP
PolyP foi a primeira linguagem de extenso para programao genrica para Haskell. Nelas as funes so chamadas polytypic. A linguagem introduz uma construo especial no qual as funes polytypic podem ser definidas por indues estruturais sobre a estrutura do functor do padro de um tipo de dado. Tipos de dado regulares (nativos) so um sub-conjunto dos tipos regulares do Haskell. Um exemplo dado abaixo: flatten :: Regular d => d a -> [a] flatten = cata fl polytypic fl :: f a [a] -> [a] case f of g+h -> either fl fl g*h -> \(x,y) -> fl x ++ fl y () -> \x -> [] Par -> \x -> [x] Rec -> \x -> x d@g -> concat . flatten . pmap fl Con t -> \x -> [] cata :: Regular d => (FunctorOf d a b -> b) -> d a -> b

Utilizao em OCaml
Em OCaml, a programao genrica implementada atravs de polimorfismo. Apesar da linguagem ter tipagem esttica, os tipos no precisam ser declarados (a no ser no caso em que se pretende restringir a entrada ou sada de uma funo), ento sempre que possvel os cdigos escritos iro se aplicar a vrios tipos de dados. Como um exemplo, a funo: let duplicar lista = lista @ lista Ir duplicar a lista de entrada, ou seja, para uma lista que na sintaxe de OCaml seja escrita como [1; 2; 3], essa funo ir retornar [1; 2; 3; 1; 2; 3]. Essa funo tem o mesmo comportamento para lista de outros tipos de dados, como char e float.

Programao genrica Esse tipo indefinido chamado de tipo polimrfico. OCaml representa o polimorfismo por letra, de forma que a funo acima ir resultar na definio: val duplicar : 'a list -> 'a list = <fun> Indicando que a lista de entrada e a lista de sada so de um tipo indefinido (mas que so do mesmo tipo; caso fossem de tipos diferentes, uma seria 'a list, a outra 'b list).
[1] Erich Gamma et. al.. Design Patterns: Elements of Reusable Object-Oriented Software.Addison-Wesley Professional, 1994.pp.416. ISBN 978-0201633610

44

Leitura adicional
Gabriel Dos Reis, Jaakko Jrvi (2005). What is Generic Programming? (http://lcsd05.cs.tamu.edu/papers/ dos_reis_et_al.pdf) (PDF) (em ingls). Artigos do LCSD'05. OOPSLA (ACM). Pgina visitada em 21 de janeiro de 2008. Coleo de artigos de [[Alexander A. Stepanov (http://www.stepanovpapers.com/)] (conceituado autor e criador da Standard Template Library)] (em ingls)

Ligaes externas
Pgina de referncia sobre a tcnica (http://www.generic-programming.org) (em ingls)

Programao multiparadigma
Uma linguagem de programao multiparadigma uma linguagem que suporta mais de um paradigma de programao. A idia de uma linguagem multiparadigma, fornecer um framework no qual o programador possa trabalhar com vrios estilos, misturando livremente construtores de diferentes paradigmas. O objetivo em se projetar linguagens deste tipo, reservar aos programadores a melhor ferramenta para determinado trabalho, admitindo que nenhum paradigma resolva todos os problemas da maneira mais elegante, ou mesmo eficiente. Exemplos de linguagem multiparadigma so Scala e o Oz.

Orientao a objetos

45

Orientao a objetos
Orientao a objetos Objeto Classe Instncia

Abstrao Mtodos Atributo Encapsulamento Herana Herana mltipla

Polimorfismo Outras referncias Padres de projeto UML Engenharia OO

A orientao a objetos, tambm conhecida como Programao Orientada a Objetos (POO), ou ainda em ingls Object-Oriented Programming (OOP) um paradigma de anlise, projeto e programao de sistemas de software baseado na composio e interao entre diversas unidades de software chamadas de objetos. Em alguns contextos, prefere-se usar modelagem orientada ao objeto, em vez de programao. De fato, o paradigma "orientao a objeto", tem bases conceituais e origem no campo de estudo da cognio, que influenciou a rea de inteligencia artificial e da lingustica, no campo da abstrao de conceitos do mundo real. Na qualidade de mtodo de modelagem, tida como a melhor estratgia para se eliminar o "gap semntico", dificuldade recorrente no processo de modelar o mundo real do domnio do problema em um conjunto de componentes de software que seja o mais fiel na sua representao deste domnio. Facilitaria a comunicao do profissional modelador e do usurio da rea alvo, na medida que a correlao da simbologia e conceitos abstratos do mundo real e da ferramenta de modelagem (conceitos, terminologia, smbolos, grafismo e estratgias) fosse a mais bvia, natural e exata possvel. A anlise e projeto orientados a objetos tm como meta identificar o melhor conjunto de objetos para descrever um sistema de software. O funcionamento deste sistema se d atravs do relacionamento e troca de mensagens entre estes objetos. Na programao orientada a objetos, implementa-se um conjunto de classes que definem os objetos presentes no sistema de software. Cada classe determina o comportamento (definido nos mtodos) e estados possveis (atributos) de seus objetos, assim como o relacionamento com outros objetos. C++, C#, Java, Object Pascal, Objective-C, Python, SuperCollider, Ruby e Smalltalk so exemplos de linguagens de programao orientadas a objetos. ActionScript, ColdFusion, Javascript, PHP (a partir da verso 4.0), Perl (a partir da verso 5) e VB.NET so exemplos de linguagens de programao com suporte a orientao a objetos.

Orientao a objetos

46

Conceitos essenciais
Classe representa um conjunto de objetos com caractersticas afins. Uma classe define o comportamento dos objetos atravs de seus mtodos, e quais estados ele capaz de manter atravs de seus atributos. Exemplo de classe: Os seres humanos. Subclasse uma nova classe originada de sua classe pai. Objeto uma instncia de uma classe. Um objeto capaz de armazenar estados atravs de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e enviar mensagens a outros objetos. Exemplo de objetos da classe Humanos: Joo, Jos, Maria. Atributos so caractersticas de um objeto. Basicamente a estrutura de dados que vai representar a classe. Exemplos: Funcionrio: nome, endereo,telefone, CPF,....; Carro: nome, marca, ano, cor, ; Livro: autor, editora, ano. Por sua vez, os atributos possuem valores. Por exemplo, o atributo cor pode conter o valor azul. O conjunto de valores dos atributos de um determinado objeto chamado de estado. Mtodos definem as habilidades dos objetos. Bidu uma instncia da classe Cachorro, portanto tem habilidade para latir, implementada atravs do mtodo deUmLatido. Um mtodo em uma classe apenas uma definio. A ao s ocorre quando o mtodo invocado atravs do objeto, no caso Bidu. Dentro do programa, a utilizao de um mtodo deve afetar apenas um objeto em particular; Todos os cachorros podem latir, mas voc quer que apenas Bidu d o latido. Normalmente, uma classe possui diversos mtodos, que no caso da classe Cachorro poderiam ser sente, coma e morda. Mensagem uma chamada a um objeto para invocar um de seus mtodos, ativando um comportamento descrito por sua classe. Tambm pode ser direcionada diretamente a uma classe (atravs de uma invocao a um mtodo esttico). Herana (ou generalizao) o mecanismo pelo qual uma classe (sub-classe) pode estender outra classe (super-classe), aproveitando seus comportamentos (mtodos) e variveis possveis (atributos). Um exemplo de herana: Mamfero super-classe de Humano. Ou seja, um Humano um mamfero. H Herana mltipla quando uma sub-classe possui mais de uma super-classe. Essa relao normalmente chamada de relao " um". Associao o mecanismo pelo qual um objeto utiliza os recursos de outro. Pode tratar-se de uma associao simples "usa um" ou de um acoplamento "parte de". Por exemplo: Um humano usa um telefone. A tecla "1" parte de um telefone. Encapsulamento consiste na separao de aspectos internos e externos de um objeto. Este mecanismo utilizado amplamente para impedir o acesso direto ao estado de um objeto (seus atributos), disponibilizando externamente apenas os mtodos que alteram estes estados. Exemplo: voc no precisa conhecer os detalhes dos circuitos de um telefone para utiliz-lo. A carcaa do telefone encapsula esses detalhes, provendo a voc uma interface mais amigvel (os botes, o monofone e os sinais de tom). Abstrao a habilidade de concentrar nos aspectos essenciais de um contexto qualquer, ignorando caractersticas menos importantes ou acidentais. Em modelagem orientada a objetos, uma classe uma abstrao de entidades existentes no domnio do sistema de software. Polimorfismo consiste em quatro propriedades que a linguagem pode ter (atente para o fato de que nem toda linguagem orientada a objeto tem implementado todos os tipos de polimorfismo): Universal: Incluso: um ponteiro para classe me pode apontar para uma instncia de uma classe filha (exemplo em Java: "List lista = new LinkedList();" (tipo de polimorfismo mais bsico que existe). Paramtrico: se restringe ao uso de templates (C++, por exemplo) e generics (Java). Ad-Hoc: Sobrecarga: duas funes/mtodos com o mesmo nome mas assinaturas diferentes.

Orientao a objetos Coero: a linguagem que faz as converses implicitamente (como por exemplo atribuir um int a um float em C++, isto aceito mesmo sendo tipos diferentes pois a converso feita implicitamente). Interface um contrato entre a classe e o mundo externo. Quando uma classe implementa uma interface, ela est comprometida a fornecer o comportamento publicado pela interface.[1] Pacotes so referncias para organizao lgica de classes e interfaces.[1]
[1] http:/ / java. sun. com/ docs/ books/ tutorial/ java/ concepts/

47

Ver tambm
Padres de projeto de software Framework Classe

Ligaes externas
Pgina oficial da UML (http://www.uml.org/) (em ingls) cfoop.org OOP para ColdFusion (http://www.cfoop.org/) (em ingls) Conceitos de OOP em Java (http://java.sun.com/docs/books/tutorial/java/concepts/index.html) (em ingls) (Site oficial do Java na Sun Microsystems) Guia do Hardware: Programao Orientada a Objetos (http://www.guiadohardware.net/artigos/ programacao-orientada-objetos/) (em portugus) Conceitos de OOP em C++ (http://www.cplusplus.com/doc/tutorial/) (em ingls)

Referncias bibliogrficas
Carlos Sica. PHP Orientado a Objetos - Fale a Linguagem da Internet.1.ed.Rio de Janeiro:Cincia Moderna, 2006. Pablo Dall'Oglio. PHP Programando com Orientao a Objetos (http://www.adianti.com.br/phpoo): Inclui Design Patterns.1.ed.So Paulo:Novatec, 2007.pp.576. ISBN 978-85-7522-137-2 Alexandre Altair de Melo e Mauricio G. F. Nascimento. PHP Profissional (http://www.novatec.com.br/livros/ phppro): Aprenda a desenvolver sistemas profissionais orientados a objetos com padres de projeto.1.ed.So Paulo:Novatec, 2007.pp.464. ISBN 978-85-7522-141-9

Python

48

Python
Python

Paradigma Surgido em ltima verso Criado por

Multiparadigma: orientada a objeto, imperativa, funcional 1991 [1]

3.1.1 (17 de agosto de 2009) Guido van Rossum [1]

Estilo de tipagem: Dinmica, forte Dialetos: Influenciada por Influenciou CPython, IronPython, Jython, PyPy ABC [2] [2] [2] , C , Haskell, Icon, Lisp, Modula-3 , Perl, Smalltalk, Tcl

Boo, D, Fantom, Groovy, Nimrod, Py, Ruby, Cobra

Python uma linguagem de programao de alto nvel[3] , interpretada, imperativa, orientada a objetos, de tipagem dinmica e forte. Foi lanada por Guido van Rossum em 1991.[1] 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[4] , 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

49

Histria
Python foi concebido no final de 1989[3] [4] 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[5] 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.[4]

Guido van Rossum, So Francisco, Califrnia

Em 1991, Guido publicou o cdigo (nomeado verso 0.9.0) no grupo de discusso alt.sources.[1] 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.[5] 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 comolambda, 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.[6] 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.[7] Atualmente o CP4E encontra-se inativo. Em 2000, o time de desenvolvimento da linguagem se mudou para a BeOpen afim 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.[8] 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.[9] 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.[9] O lanamento incluiu a mudana na especificao para suportar escopo aninhado,

Python assim como outras linguagens com escopo esttico.[10] 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.[11] Tambm foi adicionado generator, inspirado em Icon.[12] O incremento da biblioteca padro e as escolhas sintticas foram fortemente influenciadas por Java em alguns casos: o pacote logging[13] introduzido na verso 2.3[14] , o analisador sinttico SAX, introduzido na verso 2.0 e a sintaxe de decoradores que usa @[15] , adicionadas na verso 2.4.[16] 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.[17] Atualmente a linguagem usada em diversas reas, como servidores de aplicao e computao grfica. Est disponvel como linguagem script em aplicaes como OpenOffice (Python UNO Bridge), Blender 3D 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.[18] , chamada Python 3.0 ou Python 3000. Com noticiado desde antes de seu lanamento[19] , 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.[4] 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.[20] Tambm, a mudana para Unicode de todas as cadeias de caracteres.

50

Filosofia
Parte da cultura da linguagem gira ao redor de The Zen of Python ,um poema (exceto a traduo) que faz parte do documento "PEP 20 (The Zen of Python)",[21] 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

51

Tipo de dado

Descrio

Exemplo da sintaxe

str, unicode list tuple set, frozenset

Uma cadeia de caracteres imutvel Lista heterognea mutvel Tupla imutvel Conjunto no ordenado, no contm elementos duplicados

'Wikipedia', u'Wikipedia' [4.0, 'string', True] (4.0, 'string', True) set([4.0, 'string', True]) frozenset([4.0, 'string', True]) {'key1': 1.0, 'key2': False} 42 2147483648L 3.1415927 3+2j True ou False

dict int

conjunto associativo Nmero de preciso fixa, transparentemente convertido para long caso no caiba em um int. Ponto flutuante Nmero complexo Booleano

float complex bool

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 sob forma de um dos argumentos, o parmetro self[22] . Antes da verso 3.0, Python possuia 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[23] : and as assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while with yield

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. 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

Python 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.

52

Interpretador interativo
O interpretador interativo uma caracterstica diferencial da linguagem, porque h a possibilidade de testar e modificar o cdigo de um programa antes de iniciar a compilao ou inclu-las nos programas, por exemplo: Ao incluir uma funo, o interpretador j nos gera o resultado: >>> 1+1 2 >>> >>> a = 1+1 >>> print a 2

Anlise lxica
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.

Exemplo de script

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', 'abril', 'julho', 'outubro', 'fevereiro', 'maio', 'agosto', 'novembro', 'maro', 'junho', 'setembro', '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 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.

Python 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): if len(l) <= 1: return[1] r = [ ] for i in range(len(l)): s = l[:i] + l[i+1:] p = perm(s) for x in p: r.append(l[i:i+1]+x) return r NOVA NOVA NOVA NOVA NOVA NOVA NOVA NOVA NOVA LINHA LINHA LINHA LINHA LINHA LINHA LINHA LINHA LINHA

53

INDENT INDENT DEDENT INDENT DEDENT INDENT DEDENT 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 Indentao incorreta

def valor1(): def valor1(): while True: while True: try: try: c = int(raw_input('Primeiro Valor: ')) c = int(raw_input('Primeiro Valor: ')) return c return c except ValueError: except ValueError: print 'Invlido!' 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".

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

Python 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.

54

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 objeto
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[24] . 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 um cdigo contextualizado em anexo.) 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 um 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 um cdigo contextualizado em anexo.)

Python

55

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 closure lxico 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 Captura de exceo

if hasattr(spam, 'eggs'): ham = spam.eggs else: handle_error()

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[25] . 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.

Biblioteca padro
Python possui uma grande biblioteca padro, geralmente citada como um dos maiores triunfos da linguagem,[26] 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 e dados relacionais e manipular expresses regulares.

Python Algumas partes da biblioteca so cobertas por especificaes (por exemplo, a implementao WSGI da wsgiref segue o PEP 333[27] ), mas a maioria dos mdulos no segue.

56

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,[28] 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 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.

Python

57

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[29] .

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 Django Pylons TurboGears Framework para desenvolvimento gil de aplicaes web; Framework para desenvolvimento de aplicaes web; Framework baseado em vrias outras tecnologias existentes no mundo que gira em torno da linguagem Python; biblioteca para manipulao de grficos 2D; Campos de atuao desenvolvimento web desenvolvimento web desenvolvimento web

Matplotlib - Matplotlib / Pylab Python Imaging Library PyOpenGL - Python OpenGL Binding Pygame

processamento de imagem

biblioteca para manipulao de imagens digitais; suporte multiplataforma ao OpenGL;

processamento de imagem computao grfica

Conjunto de mdulos para o desenvolvimento de jogos, incluindo grficos SDL; Framework para o desenvolvimento de aplicaes de rede. Inclui mdulos para servidor web, de aplicao, SSH e diversos outros protocolos; Framework para o desenvolvimento de sistemas distribudos;

desenvolvimento de jogos; computao grfica desenvolvimento de software; desenvolvimento web computao distribuda

Twisted

PYRO - Python Remote Objects ZODB Plone CherryPy Visual Python SQLObject

Sistema de persistncia e banco de dados orientado a objetos; SGC - Sistema de gerenciamento de contedo; Framework para aplicaes web; Framework 3D de alto nvel; Mapeador objeto-relacional: traduz estruturas relacionais para objetos Python e manipula o banco de dados de forma transparente; Mdulo para manipulao de vetores e computao cientifca.

banco de dados desenvolvimento web desenvolvimento web computao grfica banco de dados

Numarray

computao cientfica

Interfaces grficas
Exemplos de bibliotecas de GUI disponveis para Python incluem:

Python

58

Descrio Etk PyGTK PyQT Tkinter wxPython Wax interface para a biblioteca EFL interface para a biblioteca GTK interface para a biblioteca QT Mdulo padro para GUI no Python interface para a biblioteca wxWidgets Construdo para simplificar o uso do wxPython

Ambientes de desenvolvimento integrado


Existem vrios ambientes de desenvolvimento integrado (IDE) disponveis para Python:
Desenvolvedor Boa Constructor Eric Python IDE Geany IDLE Team Detlev Offenbach Team Guido van Rossum et al. Clarius Labs ltima verso 0.6.1 4.1.2 0.13 3.0 / 2008 Platforma Independente Independente Independente Independente Toolkit wxPython Qt GTK2 Tkinter Licena GPL GPL GPL

IronPython Studio Komodo

1.0 / 10 de dezembro de 2007 4.1.1 / junho de 2007

Windows

VS2008 Shell Runtime Plataforma Mozilla

Microsoft Public License Propretrio

ActiveState

multiplataforma

PyDev (Eclipse) PythonCard PyScripter Stani's Python Editor Wing IDE

Fabio Zadrozny

1.3.13

multiplataforma multiplataforma wxPython

EPL

mmm-experts Stani

1.7.2 / outubro de 2006 0.8.4c / 14 de fevereiro de 2008

Windows Independente wxPython

MIT GPL

Wingware

3.0.2-1 / 27 de novembro Windows, Linux, OS de 2007 X

PyGTK

Propretrio

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[30] (parte dos crawlers), Yahoo! (para o stio de grupos de usurios) e NASA.[31] O sistema de gerenciamento de reservas da Air Canada tambm usa Python em alguns de seus componentes.[32] 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[33] , Autodesk Softimage, TrueSpace e Blender[34] . Programas de edio de imagem tambm a usam para scripts, como o GIMP[35] . 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[36] , que produz filmes da srie Star Wars usando extensivamente Python para a

Python computao grfica nos processos de produo dos filmes.


[1] HISTORY (http:/ / svn. python. org/ view/ *checkout*/ python/ trunk/ Misc/ HISTORY) (em ingls). Python Software Foundation Fonte do Python. Pgina visitada em 2008-06-05. [2] Guido van Rossum (Maio de 1996). Foreword for "Programming Python" (1st ed.) (http:/ / www. python. org/ doc/ essays/ foreword/ ) (em ingls). Python Software Foundation. Pgina visitada em 12 de junho de 2008. [3] The Making of Python (http:/ / www. artima. com/ intv/ pythonP. html) (em ingls). Artima Developer. Pgina visitada em 2007-03-22. [4] Naomi Hamilton (5 de agosto de 2008). The A-Z of Programming Languages: Python (http:/ / www. computerworld. com. au/ index. php/ id;66665771;fp;4194304;fpid;1;pf;1) (em ingls). Computerworld. Pgina visitada em 17 de agosto de 2008. [5] Why was Python created in the first place? (http:/ / www. python. org/ doc/ faq/ general/ #why-was-python-created-in-the-first-place) (em ingls). Python FAQ. Pgina visitada em 2007-03-22. [6] LJ #37: Python 1.4 Update (http:/ / www. amk. ca/ python/ writing/ 12-14) (em ingls). Pgina visitada em 2007-04-29. [7] Guido van Rossum. Computer Programming for Everybody (http:/ / www. python. org/ doc/ essays/ cp4e. html) (em ingls). Pgina visitada em 2007-03-22. [8] A.M. Kuchling and Moshe Zadka. What's New in Python 2.0 (http:/ / www. amk. ca/ python/ 2. 0/ ) (em ingls). Pgina visitada em 2007-03-22. [9] History of the software (http:/ / www. python. org/ doc/ 2. 5/ lib/ node951. html) (em ingls) Referncia da Biblioteca Python. [10] Jeremy Hylton. Statically Nested Scopes (http:/ / www. python. org/ dev/ peps/ pep-0227/ ) (em ingls). Pgina visitada em 2007-03-22. [11] 2 PEPs 252 and 253: Type and Class Changes (http:/ / www. python. org/ doc/ 2. 2. 3/ whatsnew/ sect-rellinks. html) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [12] 4 PEP 255: Simple Generators (http:/ / www. python. org/ doc/ 2. 2. 3/ whatsnew/ node5. html) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [13] PEP 282 - A Logging System (http:/ / www. python. org/ dev/ peps/ pep-0282/ ) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [14] 8 PEP 282: The logging Package (http:/ / www. python. org/ doc/ 2. 3/ whatsnew/ node9. html) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [15] PEP 318 - Decorators for Functions and Methods (http:/ / www. python. org/ dev/ peps/ pep-0318/ ) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [16] 5 PEP 318: Decorators for Functions and Methods (http:/ / www. python. org/ doc/ 2. 4/ whatsnew/ node6. html) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [17] A.M. Kuchling (1 de outubro de 2008). Whats New in Python 2.6 (http:/ / docs. python. org/ whatsnew/ 2. 6. html) (em ingls). Python Software Foundation. Pgina visitada em 3 de outubro de 2008. [18] Python 3.0 Release (http:/ / www. python. org/ download/ releases/ 3. 0/ ) (em ingls). Python Software Foundation. Pgina visitada em 3 de dezembro de 2008. [19] Sarah Stokely (1 de fevereiro de 2008). Python 3.0 to be backwards incompatible (http:/ / www. itnews. com. au/ News/ 69326,breaking-the-python-code. aspx) (em ingls). iTnews. Pgina visitada em 11 de junho de 2008. [20] Georg Brandl. Make print a function (http:/ / www. python. org/ dev/ peps/ pep-3105/ ) (em ingls). Pgina visitada em 3 de outubro de 2008. [21] PEP 20 - The Zen of Python (http:/ / www. python. org/ dev/ peps/ pep-0020/ ) (em ingls). Python - Ncleo de Desenvolvimento. Pgina visitada em 2010-01-15. [22] Why must 'self' be used explicitly in method definitions and calls? (http:/ / www. python. org/ doc/ faq/ general/ #why-must-self-be-used-explicitly-in-method-definitions-and-calls) (em ingls). Python Software Foundation Python FAQ. [23] Keywords (http:/ / docs. python. org/ ref/ keywords. html) (em ingls). Manual de Referncia do Python. Python Software Foundation (21 de fevereiro de 2008). Pgina visitada em 12 de setembro de 2008. [24] Michele Simionato. The Python 2.3 Method Resolution Order (http:/ / www. python. org/ download/ releases/ 2. 3/ mro/ ) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [25] EAFP vs LBYL (http:/ / mail. python. org/ pipermail/ python-list/ 2003-May/ 205182. html) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [26] Przemyslaw Piotrowski (Julho de 2006). Build a Rapid Web Development Environment for Python Server Pages and Oracle (http:/ / www. oracle. com/ technology/ pub/ articles/ piotrowski-pythoncore. html) (em ingls). Oracle. Pgina visitada em 11 de junho de 2008. [27] Phillip J. Eby (7 de dezembro de 2003). PEP 333 -- Python Web Server Gateway Interface v1.0 (http:/ / www. python. org/ dev/ peps/ pep-0333/ ) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [28] Guido van Rossum (5 de julho de 2001). PEP 7 -- Style Guide for C Code (http:/ / www. python. org/ dev/ peps/ pep-0007/ ) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [29] Python License (http:/ / www. python. org/ psf/ license/ ) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [30] Quotes about Python (http:/ / python. org/ about/ quotes/ ) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008. [31] Daniel G. Shafer (17 de janeiro de 2003). Python Streamlines Space Shuttle Mission Design (http:/ / www. python. org/ about/ success/ usa/ ) (em ingls). Python Software Foundation. Pgina visitada em 11 de junho de 2008.

59

Python
[32] Darryl K. Taft (5 de maro de 2005). Python Slithers into Systems (http:/ / www. eweek. com/ c/ a/ Application-Development/ Python-Slithers-into-Systems/ ) (em ingls). eWEEK. Pgina visitada em 11 de junho de 2008. [33] Introduction to Maya Python API (http:/ / www. autodesk. com/ us/ maya/ docs/ Maya85/ wwhelp/ wwhimpl/ common/ html/ wwhelp. htm?context=DeveloperResources& file=Introduction_to_Maya_Python_API. html) (em ingls). Documentao do Maya. Autodesk. Pgina visitada em 18 de julho de 2008. [34] Python Scripts (http:/ / www. blender. org/ download/ python-scripts/ ) (em ingls). Blender. Pgina visitada em 18 de julho de 2008. [35] James Henstridge (16 de maio de 2006). GIMP Python Documentation (http:/ / www. gimp. org/ docs/ python/ index. html) (em ingls). Documentao do GIMP. GIMP. Pgina visitada em 18 de julho de 2008. [36] Robin Rowe (1 de julho de 2002). Industrial Light & Magic (http:/ / www. linuxjournal. com/ article/ 6011) (em ingls). Linux Journal. Pgina visitada em 18 de julho de 2008.

60

Referncias bibliogrficas
Alex Marteli e David Asher. Python Cookbook.O'Reilly, 2002.pp.574. ISBN 0596001673 Mark Pilgrin. Dive into Python.2.ed.Apress, 2004.pp.413. ISBN 1590593561

Ver tambm
Anexo:Lista de exemplos de cdigo Python Python Software Foundation

Ligaes externas
Pgina oficial (http://www.python.org/) (em ingls) Python Cookbook (http://aspn.activestate.com/ASPN/Python/Cookbook) (em ingls) Programao Python para redes (http://ilab.cs.byu.edu/python/) (em ingls) Comunidade brasileira de usurios (http://www.pythonbrasil.com.br/) (em portugus)

Java (linguagem de programao)

61

Java (linguagem de programao)


Java
Paradigma Surgido em Criado por orientao a objeto 1995,dcada de 1990 Sun Microsystems

Estilo de tipagem: esttica, forte Compiladores Influenciada por Influenciou GCJ, Javac Objective-C, C++, Smalltalk C#, Fantom, J#, Jython

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.

Histrico
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. O objetivo do projeto no era a criao de uma nova linguagem de programao, mas antecipar e planejar a prxima onda do mundo digital. 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 idia, 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 idia inicial. O prottipo se chamava *7 (leia-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 pela sua janela. O prximo passo era encontrar um mercado para o *7. A equipe achava que uma boa idia seria controlar televises e vdeo por demanda com o equipamento. Eles construram um demo chamado 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 idia 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 idia 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 infra-estrutura 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 browsers nos Applets

Java (linguagem de programao) Java e tudo seria disponibilizado pela Internet instantaneamente. Foi o esttico HTML dos browsers 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[1] . 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 web browsers, mainframes, SOs, celulares, palmtops, cartes inteligentes etc.

62

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 standard 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]

Principais Caractersticas da Linguagem Java


A linguagem Java foi projectada tendo em vista os seguintes objectivos: Orientao a objecto - Baseado no modelo de Simula67; 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 Linguagem 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); Desalocao de memria automtica por processo de coletor de lixo (garbage collector); Carga Dinmica de Cdigo - Programas em Java so formados por uma coleco de classes armazenadas independentemente e que podem ser carregadas no momento de utilizao.

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 a array args[], do tipo String. public class OlaMundo { /** * Mtodo que executa o programa

Java (linguagem de programao) * public = visto em qualquer lugar da aplicao * 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 } }

63

Criao de 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 { public void fazerBarulho() { System.out.println("Miau!"); } } O exemplo acima cria a classe Animal e duas classes derivadas de Animal. Java no suporta herana mltipla, e todas as classes em Java derivam de Object(Classe). A nica possibilidade de se ver herana mltipla em java no uso de interfaces, pois uma so interfaces pode herdar vrias outras interfaces.

Java (linguagem de programao)

64

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!"); } //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; } }

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"); } }

Java (linguagem de programao) }

65

Objetos annimos
Podemos ter tambm objetos annimos, aonde 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 objeto e classe annimos! new Animal() {//novo objeto public void fazerBarulho() { System.out.println("QUAC!");//imprime na tela } }.fazerBarulho(); } }

Programas simples
Programa em Java para somar dois nmeros inteiros: import javax.swing.JOptionPane; public class Soma{ public static void main(String[]args){ //declarao das variveis String numeroA, numeroB; int numero1, numero2, soma; //pede dois nmeros inteiros numeroA = JOptionPane.showInputDialog("Entre com o primeiro nmero inteiro"); numeroB = JOptionPane.showInputDialog("Entre com o segundo nmero inteiro"); //converte os nmeros de string para inteiro numero1 = Integer.parseInt(numeroA); numero2 = Integer.parseInt(numeroB); //outra forma de converso seria utilizar o mtodo valueOf numero1 = Integer.valueOf(numeroA); numero2 = Integer.valueOf(numeroB); //efetua a soma dos nmeros soma = numero1 + numero2;

Java (linguagem de programao) //mostra o resultado da soma para o usurio JOptionPane.showMessageDialog(null,"A soma dos nmeros : " + soma,"Resultado",JOptionPane.PLAIN_MESSAGE); } }

66

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) 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)

Java (linguagem de programao)

67

Polimorfismo
O Polimorfismo uma caracterstica muito importante em sistemas orientados a objetos. Termo proveniente do grego que significa "muitas formas". Atravs dele conseguimos realizar vrias tarefas. Existem 4 tipos de polimorfismo divididos em 2 categorias (todos eles so implementados em Java), so descritos a seguir:

Polimorfismo Universal
Como o prprio nome diz, ele universal, ou seja, ele pode ser aplicado em vrios casos, logo no consegue saber quantas vezes ser aplicado o polimorfismo. Trabalha potencialmente num conjunto infinito de tipos, de modo disciplinado. Este polimorfismo possui duas formas: (1) Paramtrico ou parametrizao A idia do polimorfismo universal paramtrico ao definir um elemento(que pode ser uma classe, um mtodo ou alguma outra estrutura da linguagem), a definio do tipo sozinha ela incompleta, ela precisa parametrizar este tipo, ou seja, teoricamente no existiria o tipo sozinho, o que sim existe e o tipo de alguma coisa de alguma coisa, por exemplo, uma list no seria s do tipo list, e sim do tipo list de elefantes. Vale lembrar que este polimorfismo s foi implementado em Java apartir da verso 1.5. Exemplo de Polimorfismo Paramtrico em Java

//Aqui no exemplo criado um ArrayList do tipo ArrayList de Aluno, e no ArrayList, isso o polimorfismo universal paramtrico ArrayList<Aluno> alunos = new ArrayList<Aluno>();//aqui ha o como aluno Aluno a = new Aluno("Rafael"); alunos.add( a ); Aluno x = alunos.get( 0 ); System.out.println("Nome: "+ x.getNome() ); (2)Incluso quando voc tem um ponteiro para me e ele consegue apontar para um objeto da filha, j que esse polimorfismo muito bsico, difcil voc conseguir outras coisas sem ele, por isso boa parte das linguagens orientadas a objetos conhecidas implementam esse polimorfismo. Exemplo em Cdigo: class Porca { int faces; void acopleETorca(); } class Porca8mm extends Porca { void acopleETorca(){ if (...) ... } } class Porca10mm extends Porca {

Java (linguagem de programao) void acopleETorca(){ for (...) ... } }

68

Polimorfismo Ad-Hoc
implementado quando queremos definir uma coisa especfica, ou seja, este polimorfismo, diferente do universal, no pode ser usado em todo lugar, logo sabemos quantas vezes ele ser aplicado. Este polimorfismo possui duas formas: (3) Sobrecarga (Overloading) Permite que um nome de funo seja utilizado mais de uma vez com diferentes assinaturas, ou seja, dois mtodos com o mesmo nome, porm com tipos de parmetros diferentes por quantidades ou por tipo. O compilador automaticamente chama a funo correta que deve ser utilizada. Exemplo em cdigo: Podemos citar como exemplo uma funo f aplicada aos parmetros reais a e b, onde, dependendo dos tipos dos parmetros, podemos ter a execuo da primeira ou da segunda funo, caracterizando o polimorfismo ad-hoc de overloading. class Aritmetica{ int f (int x, int y) { return x+y; } double f (double x, double y) { return x*x + y*y; } } class Testa{ public static void main(String[] args){ f(a,b); } } (4) Coero A idia dele que a linguagem quem faz uma coero de tipos e no o programador, ou seja, que esta no feita voluntariamente pelo programador e sim pela linguagem. Exemplo: se o operador + definido para somar dois nmeros reais, e um nmero inteiro passado como parmetro ento o inteiro "coergido" para real. Exemplo em cdigo: class Funcionario { protected String CPF, RG, telefone, nome; } class Gerente extends Funcionario { private String departamento; } class Supervisor extends Funcionario { private String setor; }

Java (linguagem de programao) class Auxiliar extends Funcionario { } public class TesteUpcasting { public static void main(String[] args) { Gerente ger = new Gerente(); Supervisor sup = new Supervisor(); Funcionario func = ger; } //func do tipo Funcionario, mas recebe uma instncia do tipo Gerente - no caso ocorre um UPCASTING }

69

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.

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); 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;

Java (linguagem de programao)

70

Certificaes
Existem 8 tipos de certificaes[7] da Sun Microsystems para Java: Sun Certified Enterprise Architect (SCEA) Sun Certified Mobile Application Developer (SCMAD) Sun Certified Developer For Java Web Services (SCDJWS) Sun Certified Business Component Developer (SCBCD) Sun Certified Web Component Developer (SCWCD) Sun Certified Java Developer (SCJD) Sun Certified Java Programmer (SCJP) Sun Certified Java Associate (SCJA)

Cada certificao testa algum tipo de habilidade dentro da plataforma e linguagem Java. Todos os testes so realizados pela empresa Prometric[8] 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[carecede fontes?], como por exemplo o PortalJava, GUJ e o JavaFree.

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, Sun liberou partes de Java como software livre, sob a licena GNU General Public License (GPL). A liberao completa dos programas fonte sob a GPL foi liberada no primeiro trimestre de 2007. [9]

Curiosidades
O nmero mgico de uma classe Java, quando representado em Hexadecimal fica 0xCAFEBABE. Leia abaixo:
Patrick Naughton Strangely enough the magic number for .class files was chosen long before the name Java was ever uttered in reference to this language. We were looking for something fun, unique and easy to remember. 0xcafebabe was better than the second runner-up, 0xdeadbabe. It is only a coincidence that the oblique reference to the cute barristas at Peet's Coffee was foreshadowing for the name Java.

Ver tambm
Java (plataforma de software)
[1] [2] [3] [4] [5] [6] [7] [8] [9] http:/ / www. sun. com/ 2004-0511/ feature/ Java Study Group (http:/ / www. open-std. org/ JTC1/ SC22/ JSG/ ) Why Java Was - Not - Standardized Twice (http:/ / csdl2. computer. org/ comp/ proceedings/ hicss/ 2001/ 0981/ 05/ 09815015. pdf) What is ECMA--and why Microsoft cares (http:/ / techupdate. zdnet. com/ techupdate/ stories/ main/ 0,14179,2832719,00. html) Java Community Process website (http:/ / www. jcp. org/ en/ home/ index) open.itworld.com - JAVAONE: Sun - The bulk of Java is open sourced (http:/ / open. itworld. com/ 4915/ 070508opsjava/ page_1. html) Java Certification (http:/ / www. sun. com/ training/ certification/ java/ index. xml) Prometric: Testing and Assessment (http:/ / www. prometric. com) Sun disponibilizada Java sob GPLv2 (http:/ / www. sun. com/ smi/ Press/ sunflash/ 2006-11/ sunflash. 20061113. 1. xml)

Java (linguagem de programao)

71

Ligaes externas
Pgina oficial da linguagem Java (http://java.sun.com/) Iniciando em Java (http://www.javafree.org/topic-850964-Iniciando-em-Java.html) Tutoriais oficiais da Sun (http://java.sun.com/docs/books/tutorial/) O que Java? (http://www.javafree.org/artigo/871498/Tutorial-Java-O-que-e-Java.html) Trabalho de Java Histrico sobre o Java - Thiago Marocki (http://www.javafree.org/wiki/Java.html) Caractersticas Bsicas (http://www.javafree.org/artigo/871496/Tutorial-Java-2-Caracteristicas-Basicas.html) Orientao a Objetos com Java (http://www.javafree.org/artigo/871497/ Tutorial-Java-3-Orientacao-a-Objetos.html)

Compilador
Um compilador um programa de computador (ou um grupo de programas) que, a partir de um cdigo fonte escrito em uma linguagem compilada, cria um programa semanticamente equivalente, porm escrito em outra linguagem, cdigo objeto. O nome "compilador" usado principalmente para os programas que traduzem o cdigo de fonte de uma linguagem de programao de alto nvel para uma linguagem de programao de baixo nvel (por exemplo, linguagem de montagem assembly ou cdigo de mquina). Um programa que traduz uma linguagem de programao de baixo nvel para uma linguagem de programao de alto nvel um descompilador. Um programa que faz uma traduo entre linguagens de alto nvel normalmente chamado um tradutor, filtro[1] ou conversor de linguagem. Um programa que faz uma traduo entre uma linguagem de montagem e o cdigo de mquina denominado montador[1] . Um programa que faz uma traduo entre o cdigo de mquina e uma linguagem de montagem denominado desmontador. Em portugus, Compilar significa por exemplo: Reunir obras literrias, documentos, escritos de vrios autores, entre outros, compondo uma obra com esse material. Um compilador um dos dois tipos mais gerais de tradutores, sendo que o segundo tipo que a ele deve ser comparado um interpretador.

Caractersticas Gerais
Normalmente, o cdigo fonte escrito em uma linguagem de programao de alto nvel, com grande capacidade de abstrao, e o cdigo objeto escrito em uma linguagem de baixo nvel, como uma sequncia de instrues a ser executada pelo processador.

O processo da compilao.

O processo de compilao composto de anlise e sntese. A anlise tem como objetivo entender o cdigo fonte e represent-lo em uma estrutura intermediria. A sntese constri o cdigo objecto a partir desta representao intermediria. A anlise pode ser subdividida ainda em anlise lxica, anlise sinttica e anlise semntica. A sntese mais variada, podendo ser composta pelas etapas de gerao de cdigo intermedirio, optimizao de cdigo e gerao de cdigo final (ou cdigo de mquina), e somente esta ltima etapa obrigatria. Classicamente, um compilador traduz um programa de uma linguagem textual facilmente entendida por um ser humano para uma linguagem de mquina, especfica para um processador e sistema operacional. Atualmente, porm,

Compilador so comuns compiladores que geram cdigo para uma mquina virtual que , depois, interpretada por um interpretador. Em linguagens hbridas, o compilador tem o papel de converter o cdigo fonte em um cdigo chamado de byte code, que uma linguagem de baixo nvel. Um exemplo deste comportamento o do compilador da linguagem Java que, em vez de gerar cdigo da mquina hospedeira (onde se est executando o compilador), gera cdigo chamado Java Bytecode. Um compilador chamado de Just-in-time compiler (JIT) quando seu processo de compilao acontece apenas quando o cdigo chamado. Normalmente, o usurio tem a percepo que um compilador JIT um interpretador. Muitos compiladores incluem um pr-processador. Um pr-processador normalmente responsvel por mudanas no cdigo fonte destinadas de acordo com decises tomadas em tempo de compilao. Por exemplo, um programa em C permite instrues condicionais para o pr-processador que podem incluir ou no parte do cdigo caso uma assertiva lgica seja verdadeira ou falsa, ou simplesmente um termo esteja definido ou no. Tecnicamente, pr-processadores so muito mais simples que compiladores e so vistos, pelos desenvolvedores, como programas parte, apesar dessa viso no ser necessariamente compartilhada pelo usurio. Outra parte separada do compilador que muitos usurios vem como integrada o linker, cuja funo unir vrios programas j compilados de uma forma independente e unific-los em um programa executvel. Isso inclui colocar o programa final em um formato compatvel com as necessidades do sistema operacional para carreg-lo em memria e coloc-lo em execuo.

72

Fases da Compilao
Anlise Lxica
A anlise lxica a primeira fase do compilador. A funo do analisador lxico, tambm denominado scanner, ler o cdigo fonte, caracter a caracter, buscando a separao e identificao dos elementos componentes do programa fonte, denominados smbolos lxicos ou tokens[2] . tambm de responsabilidade desta fase a eliminao de elementos "decorativos" do programa, tais como espaos em branco, marcas de formatao de texto e comentrios[3] .

Anlise Sinttica
A anlise sinttica, ou anlise gramatical o processo de se determinar se uma cadeia de smbolos lxicos pode ser gerada por uma gramtica[4] . No caso de analisadores sintticos top-down, temos a opo de escrev-los mo ou ger-los de forma automtica, mas os analisadores bottom-up s podem ser gerados automaticamente [5] . A maioria dos mtodos de anlise sinttica, cai em uma dessas duas classes denominadas top-down e bottom-up. Entre os mtodos top-down os mais importantes so a anlise sinttica descendente recursiva e a anlise sinttica preditiva no-recursiva. Entre os mtodos de anlise sinttica bottom-up os mais importantes so a anlise sinttica de precedncia de operadores, anlise sinttica LR cannico, anlise sinttica LALR e anlise sinttica SLR[4] .

Anlise Semntica
As anlises lxica e sinttica no esto preocupadas com o significado ou semntica dos programas que elas processam. O papel do analisador semntico prover mtodos pelos quais as estruturas construdas pelo analisador sinttico possam ser avaliadas ou executadas[6] . As gramticas livres de contexto no so suficientemente poderosas para descrever uma srie de construes das linguagens de programao, como por exemplo regras de escopo, regras de visibilidade e consistncia de tipos[7] . papel do analisador semntico assegurar que todas as regras sensveis ao contexto da linguagem estejam analisadas e verificadas quanto sua validade. Um exemplo de tarefa prpria do analisador semntico a checagem de tipos de variveis em expresses[8] . Um dos mecanismos comumente

Compilador utilizados por implementadores de compiladores a Gramtica de Atributos, que consiste em uma gramtica livre de contexto acrescentada de um conjunto finito de atributos e um conjunto finito de predicados sobre estes atributos[9] .

73

Gerao de Cdigo Intermedirio


Na fase de gerao de cdigo intermedirio, ocorre a transformao da rvore sinttica em uma representao intermediria do cdigo fonte. Um tipo popular de linguagem intermediria conhecido como cdigo de trs endereos. Neste tipo de cdigo uma sentena tpica tem a forma X := A op B, onde X,A e B so operandos e op uma operao qualquer. Uma forma prtica de representar sentenas de trs endereos atravs do uso de qudruplas (operador, argumento-1, argumento-2 e resultado). Este esquema de representao de cdigo intermedirio preferido por diversos compiladores, principalmente aqueles que executam extensivas otimizaes de cdigo, uma vez que o cdigo intermedirio pode ser rearranjado de uma maneira conveniente com facilidade[10] .

Optimizao de Cdigo
A Otimizao de cdigo a estratgia de examinar o cdigo intermedirio, produzido durante a fase de gerao de cdigo com objetivo de produzir, atravs de algumas tcnicas, um cdigo que execute com bastante eficincia[8] . O nome optimizador deve sempre ser encarado com cuidado, pois no se pode criar um programa que leia um programa P e gere um programa P equivalente sendo melhor possvel segundo o critrio adotado[3] . Vrias tcnicas e vrias tarefas se renem sob o nome de Optimizao. Estas tcnicas consistem em detectar padres dentro do cdigo produzido e substitu-los por cdigos mais eficientes[10] . Entre as tcnicas usadas esto a substituio de expresses que podem ser avaliadas durante o tempo de compilao pelos seus valores calculados, eliminao de sub-expresses redundantes, desmembramento de laos, substituio de operaes (multiplicao por shifts), entre outras[8] . Uma das tcnicas de optimizao mais eficazes e independente de mquina a otimizao de laos, pois laos internos so bons candidatos para melhorias. Por exemplo, em caso de computaes fixas dentro de laos, possvel mover estas computaes para fora dos mesmos reduzindo processamento[11] .

Gerao de Cdigo Final


A fase de gerao de cdigo final a ltima fase da compilao. A gerao de um bom cdigo objeto difcil devido aos detalhes particulares das mquinas para os quais o cdigo gerado. Contudo uma fase importante, pois uma boa gerao de cdigo pode ser, por exemplo, duas vezes mais rpida que um algoritmo de gerao de cdigo ineficiente[10] . Nem todas as tcnicas de optimizao so independentes da arquitetura da mquina-alvo. Optimizaes dependentes da mquina necessitam de informaes tais como os limites e os recursos especiais da mquina-alvo a fim de produzir um cdigo mais compacto e eficiente. O cdigo produzido pelo compilador deve se aproveitar dos recursos especiais de cada mquina-alvo[8] .

Bibliografia
Aho, Alfred V.; Ullman, Jeffrey D.. The Theory of Parsing, Translation, and Compiling, Vol. 1, Parsing.Englewood Cliffs, New Jersey, EUA:Prentice Hall, 1972.pp.542.2 v.v. 1 ISBN 0-13-914556-7 Aho, Alfred V.; Ullman, Jeffrey D.. The Theory of Parsing, Translation, and Compiling, Vol. 2, Compiling.Englewood Cliffs, New Jersey, EUA:Prentice Hall, 1972.pp.460.2 v.v. 2 ISBN 0-201-914564-8 Aho, Alfred V.; Ullman, Jeffrey D.. Principles of Compiler Design.Reading, Massachusetts, EUA:Addison-Wesley, 1977.pp.604. ISBN 0-201-00022-9 - Primeiro livro conhecido como livro do drago, devido figura na sua capa antes do advento do livro Compilers: Principles, Techniques, and Tools dos mesmos autores. Aho, Alfred V.; Sethi, Ravi; Ullman, Jeffrey D.. Compilers: Principles, Techniques and Tools.Reading, Massachusetts, EUA:Addison-Wesley, 1986.pp.796. ISBN 0-201-10088-6

Compilador - Conhecido como livro do drago, devido figura na sua capa. - H uma edio BEM mais nova, de 2006: ISBN 0-321-48681-1 Alblas, Henk; Nymeyer, Albert. Practice and Principles of Compiler Building with C.London:Prentice Hall, 1996.pp.427. ISBN 0-13-349267-2 Appel, Andrew W.. Modern Compiler Implementation in Java [12].Cambridge University Press, 1998.pp.548. ISBN 0-521-58388-8 Appel, Andrew W.. Modern Compiler Implementation in C: Basic Techiques.Cambridge University Press, 1997.pp.398. ISBN 0-521-58653-4 - Este livro editado para 3 tipos de linguagens (ML, Java e C) e em dois tipos de edico (padro e apenas as tcnicas bsicas). Brown, P. J.. Writing Interactive Compilers and Interpreters.Chichester:John Wiley & Sons, 1979.pp.265. ISBN 0-471-27609-X Cooper, Torczon. Engineering a Compiler.Morgan Kaufmann, 2003. ISBN 1-55860-698-X Crespo, Rui Gustavo. Processadores de Linguagens: da Concepo Implementao.Lisboa, Portugal:IST Press, 1998.pp.435. ISBN 972-8469-01-2 - Excelente livro sobre compiladores editado pelo Instituto Superior Tcnico. Delamaro, Marcio. Como Construir um Compilador Utilizando Ferramentas Java [13].Novatec, 2004. ISBN 85-7522-055-1 Elder, John. Compiler Conctruction: A Recursive Descent Model.Englewood Cliffs, New Jersey, EUA:Prentice Hall, 1994.pp.437.v. 1 ISBN 0-13-291139-6 Fischer, Charles N.; LeBlanc, Jr, Richard J.. Crafting a Compiler with C.Redwood City, California:Benjamin Cummings Publishing, 1991.pp.812. ISBN 0-8053-2166-7 Grune, Bal, Jacobs, Langendoen. Modern Compiler Design [14].Wiley, 2000. ISBN 0-471-97697-0 - Lanado em portugus, pela Campus, com ISBN 85-352-0876-3. Holmes, Jim. Object-Oriented Compiler Construction.Englewood Cliffs, New Jersey:Prentice Hall, 1995.pp.483. ISBN 0-13-630740-X Holub, Allen I.. Compiler Design in C.Englewood Cliffs, New Jersey:Prentice Hall, 1990.pp.924. ISBN 0-13-155045-4 Hunter, Robin. Compiladores: Sua Concepo e Programao em Pascal.Lisboa:Presena, 1987.pp.323. Kakde, O. G.. Algorithms for Compiler Design.Hingham:Charles River media, 2003.pp.334. ISBN 81-7008-100-6 Kaplan, Randy M.. Constructing Language Processors for Little Languages.New York:John Wiley & Sons, 1994.pp.452. ISBN 0-471-59754-6 Kowaltowski, Tomasz. Implementao de Linguagens de Programao.Guanabara Dois, 1983. ISBN 85-7030-009-3 Lee, John A. N.. The Anatomy of a Compiler.New York:Reinhold Publishing Company, 1967.pp.275. Library of Congress Catalog Card Number: 67-29207 - Livro antigo. Interessante por aspectos de compilao de comandos do Fortran como 'DO' e aspectos da mquina IBM 1401. Lemone, Karen A.. Fundamentals of Compilers: An Introduction to Computer Language Translation.Boca Raton:CRC, 1992.pp.184. ISBN 0-8493-7341-7 Levine, John R.. Linkers & Loaders.San Francisco:Morgan Kaufmann Publishers, 2000.pp.256. ISBN 1-55860-496-0

74

Compilador Louden, Kenneth C.. Compiladores: Princpios e Prticas.So Paulo:Pioneira Thompson Learning, 2004.pp.569. ISBN 85-221-0422-0 Mak, Ronald. Writing Compilers and Interpreters: An Applied Approach Using C++.New York:John Wiley and Sons, 1996.pp.838. ISBN 0-471-11353-0 Metsker, Steven John. Building Parsers with Java.Boston:Addison-Wesley, 2001.pp.371. ISBN 0-201-71962-2 Muchnick, Steven S.. Advanced Compiler Design Implementation.San Francisco, California:Morgan Kaufmann Publishers, 1997.pp.856. ISBN 1-55860-320-4 Neto, Joo Jos. Introduo Compilao.Rio de Janeiro:LTC, 1987.pp.222. ISBN 85-216-0483-1 Parsons, Thomas W.. Introduction to Compiler Construction.New York, EUA:Computer Science Press, 1992.pp.359. ISBN 0-7167-8261-8 Pittman, Thomas; Peters, James. The Art of Compiler Design: Theory and Practice.Englewood Cliffs, New Jersey, EUA:Prentice Hall, 1992.pp.419. ISBN 0-13-048190-4 Price, Ana M. A.; Toscano, Simo Sirineo. Implementao de Linguagens de Programao: Compiladores: Srie de Livros Didticos Nmero 9.Porto Alegre:Sagra Luzzatto, 2000.pp.195. ISBN 85-241-0639-5 Pyster, Arthur B.. Compiler Design and Construction: Tools and Techniques.New York, EUA:Van Nostrand Reinhold Company, 1988.pp.267. ISBN 0-442-27536-6 - Contm o exemplo de um mini-pr-processador para a linguagem C: Ginevra. Ricarte, Ivan. Introduo Compilao.Rio de Janeiro:Campus, Elsevier, 2008.pp.264. ISBN 978-85-352-3067-3 Terry, Patrick D.. Programming Language Translation: A Practical Approach.Wokingham:Addison-Wesley, 1986.pp.443. ISBN 0-201-18040-5 Tremblay, Jean-Paul; Sorenson, Paul G.. The Theory and Practice of Compiler Writing.New York:McGraw-Hill, 1989.pp.796. ISBN 0-07-065161-2 Waite, William M.; Goos, Gerhard. Compiler Construction.New York:Springer-Verlag, 1984.pp.446. ISBN 0-387-90821-8 Watson, Des. High-Level Languages and Their Compilers.Wokingham, England:Addison-Wesley, 1989.pp.337. ISBN 0-201-18489-3 Watt, David A.; Brown, Deryck F.. Programming Language Processors in Java.Harlow, England:Prentice Hall, 2000.pp.436. ISBN 0-130-25786-9 Wilhelm, Reinhard; Maurer, Dieter. Compiler Design.Harlow, England:Addison-Wesley, 1995.pp.606. ISBN 0-201-42290-5 Wirth, Niklaus. Compiler Construction [15].Addison-Wesley, 1996. ISBN 0-201-40353-6 - Veja o texto completo [16] deste livro em formato PDF. LAROUSSE CULTURAL. DICIONRIO DA LINGUA PORTUGUESA.NOVA CULTURAL LTDA, 1992. ISBN 85-85222-23-9
[1] Neto, Joo Jos. Introduo Compilao.Rio de Janeiro:LTC, 1987.pp.222. ISBN 85-216-0483-1 [2] Price, Ana M. A.; Toscano, Simo Sirineo. Implementao de Linguagens de Programao: Compiladores: Srie de Livros Didticos Nmero 9.Porto Alegre:Sagra Luzzatto, 2000.pp.195. ISBN 85-241-0639-5 [3] Compiladores - Pgina de Jos Lucas Mouro Rangel Netto (http:/ / www-di. inf. puc-rio. br/ ~rangel/ comp. html) (em portugus). PUC-Rio. Pgina visitada em 21 de junho de 2009. [4] Aho, Alfred V.; Sethi, Ravi; Ullman, Jeffrey D.. Compilers: Principles, Techniques and Tools.Reading, Massachusetts, EUA:Addison-Wesley, 1986.pp.796. ISBN 0-201-10088-6 [5] Grune, Dick; Bal, Henri E.; Jacobs, Ceriel J. H.; Langendoen, Koen G. Projeto Moderno de Compiladores.Campus, 2001. ISBN 85-352-0876-3 [6] Watson, Des. High-Level Languages and Their Compilers.Wokingham, England:Addison-Wesley, 1989.pp.337. ISBN 0-201-18489-3

75

Compilador
[7] Wilhelm, Reinhard; Maurer, Dieter. Compiler Design.Harlow, England:Addison-Wesley, 1995.pp.606. ISBN 0-201-42290-5 [8] Tremblay, Jean-Paul; Sorenson, Paul G.. The Theory and Practice of Compiler Writing.New York:McGraw-Hill, 1989.pp.796. ISBN 0-07-065161-2 [9] Pittman, Thomas; Peters, James. The Art of Compiler Design: Theory and Practice.Englewood Cliffs, New Jersey, EUA:Prentice Hall, 1992.pp.419. ISBN 0-13-048190-4 [10] Aho, Alfred V.; Ullman, Jeffrey D.. Principles of Compiler Design.Reading, Massachusetts, EUA:Addison-Wesley, 1977.pp.604. ISBN 0-201-00022-9 [11] Kakde, O. G.. Algorithms for Compiler Design.Hingham:Charles River media, 2003.pp.334. ISBN 81-7008-100-6 [12] http:/ / www. cs. princeton. edu/ ~appel/ modern/ java/ [13] http:/ / www. novateceditora. com. br/ livros/ compilador/ [14] http:/ / www. cs. vu. nl/ ~dick/ MCD. html [15] http:/ / www. cs. inf. ethz. ch/ ~wirth/ books/ CompilerConstruction [16] http:/ / www. oberon2005. ru/ book/ ccnw2005e. pdf

76

Ver tambm
Cincia da computao Compilador Just in Time (JIT) Linguagens formais Linguagem de programao

Interpretador Linker

Ligaes externas
Pgina com excelente material de compiladores do prof. Jos Lucas Mouro Rangel Neto (http://www-di.inf. puc-rio.br/~rangel/comp.html). Compilador Educativo Verto (http://verto.sf.net). Compiladores livres (http://www.thefreecountry.com/compilers/index.shtml).

Software

77

Software
Software, logicirio ou suporte lgico uma sequncia de instrues a serem seguidas e/ou executadas, na manipulao, redirecionamento ou modificao de um dado/informao ou acontecimento. Software tambm o nome dado ao comportamento exibido por essa seqncia de instrues quando executada em um computador ou mquina semelhante. Software tambm um produto e desenvolvido pela Engenharia de software, e inclui no s o programa de computador OpenOffice.org Writer. propriamente dito, mas tambm manuais e especificaes. Para fins contbeis e financeiros, o Software considerado um Bens de capital. Este produto passa por vrias etapas como: Anlise econmica, Anlise de requisitos, Especificao, Codificao, Teste, Documentao, Treinamento e Manuteno.

Software como programa de computador


Um programa de computador composto por uma seqncia de instrues, que interpretada e executada por um processador ou por uma mquina virtual. Em um programa correto e funcional, essa sequncia segue padres especficos que resultam em um comportamento desejado. Um programa pode ser executado por qualquer dispositivo capaz de interpretar e executar as instrues de que formado. Quando um software est representado como instrues que podem ser executadas diretamente por um processador dizemos que est escrito em linguagem de mquina. A execuo de um software tambm pode ser intermediada por um programa interpretador, responsvel por interpretar e executar cada uma de suas instrues. Uma categoria especial e notvel de interpretadores so as mquinas virtuais, como a Mquina virtual Java (JVM), que simulam um computador inteiro, real ou imaginado. O dispositivo mais conhecido que dispe de um processador o computador. Atualmente, com o barateamento dos microprocessadores, existem outras mquinas programveis, como telefone celular, mquinas de automao industrial, calculadora, etc.

A construo de um programa de computador


Um programa um conjunto de instrues para o processador (linguagem de mquina). Entretanto, pode-se utilizar linguagens de programao, que traduza comandos em instrues para o processador. Normalmente, programas de computador so escritos em linguagens de programao, pois estas foram projetadas para aproximar-se das linguagens usadas por seres humanos. Raramente a linguagem de mquina usada para desenvolver um programa. Alguns programas feitos para usos especficos, como por exemplo software embarcado ou software embutido, ainda so feitos em linguagem de mquina para aumentar a velocidade ou diminuir o espao consumido. Em todo caso, a melhoria dos processadores dedicados tambm vem diminuindo essa prtica, sendo a C uma linguagem tpica para

Software esse tipo de projeto. Essa prtica, porm, vem caindo em desuso, principalmente devido grande complexidade dos processadores atuais, dos sistemas operacionais e dos problemas tratados. Muito raramente, realmente apenas em casos excepcionais, utilizado o cdigo de mquina, a representao numrica utilizada diretamente pelo processador. O Programa inicialmente "carregado" na memria principal. Aps carregar o programa, o computador encontra o 'Entry Point' ou ponto inicial de entrada do programa que carregou e l as instrues sucessivamente byte por byte. As instrues do programa so passadas para o sistema ou processador onde so traduzidas da linguagens de programao para a linguagem de mquina, sendo em seguida executadas ou diretamente para o hardware, que recebe as instrues na forma de linguagem de mquina.

78

Tipos de programas de computador


Qualquer computador moderno tem uma variedade de programas que fazem diversas tarefas. Eles podem ser classificados em duas grandes categorias: 1. Software de sistema que incluiu o firmware (O BIOS dos computadores pessoais, por exemplo), drivers de dispositivos, o sistema operacional e tipicamente uma interface grfica que, em conjunto, permitem ao usurio interagir com o computador e seus perifricos. 2. Software aplicativo, que permite ao usurio fazer uma ou mais tarefas especficas. Aplicativos podem ter uma abrangncia de uso de larga escala, muitas vezes em mbito mundial; nestes casos, os programas tendem a ser mais robustos e mais padronizados. Programas escritos para um pequeno mercado tm um nvel de padronizao menor. Ainda possvel usar a categoria Software embutido ou Software embarcado, indicando software destinado a funcionar dentro de uma mquina que no um computador de uso geral e normalmente com um destino muito especfico Atualmente temos um novo tipo de software. O software como servio, que um tipo que roda diretamente na internet, no sendo necessrio instalar nada no computador do usurio. Geralmente esse tipo de software gratuito e tem as mesmas funcionalidades das verses desktop.

Licenas
Todo o software publicado sob uma licena. Essa licena define (e at restringe) qual a forma que se pode utilizar o software (nmeros de licenas, modificaes, etc.). Exemplos de licenas: GNU General Public License Licena BSD Licena Apache Licena comercial Licena de software Licena de software livre Software livre Freeware Shareware Demo Trial

Software

79

Ver tambm
Liberao de software Fabricantes de software

Programador
Em computao, programador ou desenvolvedor de software refere-se a algum que faz programao de computadores e desenvolve software. Um programador pode ser algum que desenvolve ou faz manuteno de software em um grande sistema mainframe ou algum que desenvolve software primariamente para uso em computadores pessoais. Neste sentido, um programador pode ser considerado um engenheiro de software ou desenvolvedor de software, programador considerado um dos cargos mais importantes da informtica por criarem programas que a comunidade necessita.

Primeiros programadores
Ada Lovelace historicamente considerada a primeira programadora. Ela foi a primeira a desenvolver um algoritmo para implantao em um computador, a mquina de anlise de Charles Babbage, em outubro de 1842. Os que possuem excelentes habilidades em programao de computadores podem se tornar famosos, apesar disto ser normalmente limitado aos crculos da engenharia de software. Muitos dos mais notveis programadores so chamados algumas vezes de "hackers" Programadores profissionais trabalham em vrios ambientes, incluindo departamentos de TI corporativos, grandes empresas de software e pequenas empresas de servios. Muitos programadores profissionais tambm trabalham para empresas de consultoria nas instalaes dos clientes.

Tipos de programadores
Engenheiro de software: So considerados programadores universais pois so excelentes,assim so considerados hackers pelo seu vastos conhecimentos. Programador Web: encarregado de desenvolver sites/sistemas para web, nas mais diversas linguagens (ASP.NET, JSP, PHP). Existem poucos programadores nesta rea que so realmente bons. Mas isso considerado um preconceito dos programadores com os web designers. Programador de segurana: um programador que faz programas para geralmente redes ou ate mesmo testar sistemas para ver se h existncia de defeitos. Tambm so considerados hackers por seu vasto conhecimento. Outros: Ainda existem muitos tipos de programadores como:Consultor de segurana ou Administradores de redes. J em msica, programador a pessoa encarregada da mdia digital, como Craig Jones no Slipknot.

Programador

80

Equipe
A equipe de programadores um conjunto de programadores que tem por finalidade a construo de algum sistema, tendo como lder um gerente de projetos.

Ver tambm
Anlise de Sistemas e Tecnologia da Informao Cincia da computao Computador Hacker Programao de computadores

Cincia da computao
Cincia da computao o estudo dos algoritmos, suas aplicaes e de sua implementao, na forma de software, para execuo em computadores eletrnicos. Desempenha um papel importante, na rea de cincia da computao, a formalizao matemtica de algoritmos, como forma de representar problemas decidveis, i.e., os que so susceptveis de reduo a operaes elementares bsicas, capazes de serem reproduzidas atravs de um qualquer dispositivo mecnico/eletrnico capaz de armazenar e manipular dados. Um destes dispositivos o computador digital, de uso generalizado, nos dias de hoje. Tambm de fundamental importncia para a rea de cincia da computao so as metodologias e tcnicas ligadas implementao de software que abordam a especificao, modelagem, codificao, teste e avaliao de sistemas de software. Os estudos oriundos da Cincia da Computao podem ser aplicados em qualquer rea do conhecimento humano em que seja possvel definir mtodos de resoluo de problemas baseados em repeties previamente observadas. Avanos recentes na cincia da computao tem impactado fortemente a sociedade contempornea, em particular as aplicaes relacionadas s reas de redes de computadores, Internet, Web e computao mvel que tm sido utilizadas por bilhes de pessoas ao redor do globo.

Histria
Incio da computao
A primeira ferramenta conhecida para a computao foi o baco, cuja inveno atribuda a habitantes da Mesopotmia, em torno de 27002300 a.C.. Seu uso original era desenhar linhas na areia com rochas. Verses mais modernas do baco ainda so usadas como instrumento de clculo. No sculo VII a.C., na antiga ndia, o gramtico Pnini formulou a gramtica de Snscrito usando 3959 regras conhecidas como Ashtadhyyi, de forma bastante sistemtica e tcnica. Pnini usou transformaes e recursividade com tamanha sofisticao que sua gramtica possua o poder computacional terico tal qual a Mquina de Turing. Entre 200 a.C. e 400, os indianos tambm inventaram o logaritmo, e partir do sculo XIII tabelas logartmicas eram produzidas por matemticos islmicos.
O baco, primeira ferramenta de computao, em sua forma moderna

Cincia da computao Quando John Napier descobriu os logaritmos para uso computacional no sculo XVI, seguiu-se um perodo de considervel progresso na construo de ferramentas de clculo.

81

Algoritmos
No sculo VII, o matemtico indiano Brahmagupta explicou pela primeira vez o sistema de numerao hindu-arbico e o uso do 0. Aproximadamente em 825, o matemtico persa Al-Khwarizmi escreveu o livro Calculando com numerais hindus, responsvel pela difuso do sistema de numerao hindu-arbico no Oriente Mdio, e posteriormente na Europa. Por volta do sculo XII houve uma traduo do mesmo livro para o latim: Algoritmi de numero Indorum. Tais livros apresentaram novos conceitos para definir sequncias de passos para completar tarefas, como aplicaes de aritmtica e lgebra. Por derivao do nome, atualmente usa-se o termo algoritmo.

Lgica binria
Por volta do sculo III a.C., o matemtico indiano Pingala inventou o sistema de numerao binrio. Ainda usado atualmente no processamento de todos computadores modernos, o sistema estabelece que sequncias especficas de uns e zeros podem representar qualquer informao. Em 1703 Gottfried Leibniz desenvolveu a lgica em um sentido formal e matemtico, utilizando o sistema binrio. Em seu sistema, uns e zeros tambm representam conceitos como verdadeiro e falso, ligado e Al-Khwarizmi desligado, vlido e invlido. Mais de um sculo depois, George Boole publicasse a lgebra booleana (em 1854), com um sistema completo que permitia a construo de modelos matemticos para o processamento computacional. Em 1801, apareceu o tear controlado por carto perfurado, inveno de Joseph Marie Jacquard, no qual buracos indicavam os uns e, reas no furadas, indicavam os zeros. O sistema est longe de ser um computador, mas ilustrou que as mquinas poderiam ser controladas pelo sistema binrio.

Cincia da computao

82

Engenho analtico
Foi com Charles Babbage que o computador moderno comeou a ganhar forma, atravs de seu trabalho no engenho analtico. O equipamento, apesar de nunca ter sido construdo com sucesso, possua todas as funcionalidades do computador moderno. Foi descrito originalmente em 1837, mais de um sculo antes que qualquer equipamento do gnero tivesse sido construdo com sucesso. O grande diferencial do sistema de Babbage era o fato que seu dispositivo foi projetado para ser programvel, item imprescindvel para qualquer computador moderno. Durante sua colaborao, a matemtica Ada Lovelace publicou os primeiros programas de computador em uma srie de notas para o engenho analtico. Por isso, Lovelace popularmente considerada como a primeira programadora.

Nascimento da cincia da computao


Ada Lovelace, primeira programadora. Antes da dcada de 1920, computador era um termo associado a pessoas que realizavam clculos, geralmente liderados por fsicos, em sua maioria mulheres. Milhares de computadores, eram empregados em projetos no comrcio, governo e stios de pesquisa. Aps a dcada de 1920, a expresso mquina computacional comeou a ser usada para referir-se a qualquer mquina que realize o trabalho de um profissional, especialmente aquelas de acordo com os mtodos da Tese de Church-Turing.

O termo mquina computacional acabou perdendo espao para o termo reduzido computador no final da dcada de 1940, com as mquinas digitais cada vez mais difundidas. Alan Turing, conhecido como pai da Cincia da Computao, inventou a Mquina de Turing, que posteriormente evoluiu para o computador moderno.

Trabalho terico
Os fundamentos matemticos da cincia da computao moderna comearam a ser definidos por Kurt Gdel com seu teorema da incompletude (1931). Essa teoria mostra que existem limites no que pode ser provado ou desaprovado em um sistema formal; isso levou a trabalhos posteriores por Gdel e outros tericos para definir e descrever tais sistemas formais, incluindo conceitos como recursividade e clculo lambda. Em 1936 Alan Turing e Alonzo Church independentemente, e tambm juntos, introduziram a formalizao de um algoritmo, definindo os limites do que pode ser computador e um modelo puramente mecnico para a computao. Tais tpicos so abordados no que atualmente chama-se Tese de Church-Turing, uma hiptese sobre a natureza de dispositivos mecnicos de clculo. Essa tese define que qualquer clculo possvel pode ser realizado por um algoritmo sendo executado em um computador, desde que haja tempo e armazenamento suficiente para tal. Turing tambm incluiu na tese uma descrio da Mquina de Turing, que possui uma fita de tamanho infinito e um cabeote para leitura e escrita que move-se pela fita. Devido ao seu carter infinito, tal mquina no pode ser construda, mas tal modelo pode simular a computao de qualquer algoritmo executado em um computador moderno. Turing bastante importante para a Representao visual da Mquina de Turing cincia da computao, tanto que seu nome usado para o Prmio Turing e o teste de Turing. Ele contribuiu para as quebras de cdigo da Gr-Bretanha na Segunda Guerra Mundial, e continuou a projetar computadores e programas de computador pela dcada de 1940; cometeu suicdio em 1954.

Cincia da computao

83

Shannon e a teoria da informao


At a dcada de 1930, engenheiros eletricistas podiam construir circuitos eletrnicos para resolver problemas lgicos e matemticos, mas a maioria o fazia sem qualquer processo, de forma particular, sem rigor terico para tal. Isso mudou com a tese de mestrado de Claude E. Shannon de 1937, A Symbolic Analysis of Relay and Switching Circuits. Enquanto tomava aulas de Filosofia, Shannon foi exposto ao trabalho de George Boole, e percebeu que poderia aplicar esse aprendizado em conjuntos eletro-mecnicos para resolver problemas. Shannon desenvolveu a teoria da informao no artigo de 1948: A Mathematical Theory of Communication, cujo contedo serve como fundamento para reas de estudo como compresso de dados e criptografia.

Realizaes para a sociedade


Apesar de sua pequena histria enquanto uma disciplina acadmica, a cincia da computao deu origem a diversas contribuies fundamentais para a cincia e para a sociedade. Esta cincia foi responsvel pela definio formal de computao e computabilidade, e pela prova da existncia de problemas insolveis ou intratveis computacionalmente.[1] Tambm foi possvel a construo e formalizao do conceito de linguagem de computador, sobretudo linguagem de programao, uma ferramenta para a expresso precisa de informao metodolgica flexvel o suficiente para ser representada em diversos nveis de abstrao.[2] Para outros campos cientficos e para a sociedade de forma geral, a cincia da computao forneceu suporte para a Revoluo Digital, dando origem a Era da Informao.[1] A computao cientfica uma rea da computao que permite o avano de estudos como o mapeamento do genoma humano (ver Projeto Genoma Humano).

Pessoas notveis
Algumas das pessoas mais importantes da computao foram agraciadas com o Prmio Turing.

Precursores
Blaise Pascal, desenvolveu a calculadora mecnica e tem seu nome em uma linguagem de programao Charles Babbage, projetou um computador mecnico Ada Lovelace, inventou a primeira linguagem de programao

Pioneiros
Cincia da computao tem tanto a ver com o computador como a Astronomia com o telescpio, a Biologia com o microscpio, ou a Qumica com os tubos de ensaio. A Cincia no estuda ferramentas, mas o que fazemos e o que descobrimos com elas.

citao atribuda a Edsger Dijkstra

Alan Turing, participou do projeto Colossus e foi um dos crebros que decifra a Enigma. Tambm inventou um tipo terico de mquina super-simples capaz de realizar qualquer clculo de um computador digital, a Mquina de Turing. John von Neumann, descreveu o computador que utiliza um programa armazenado em memria, a Arquitetura de von Neumann, que a base da arquitetura dos computadores atuais. John Backus, lder da equipe que criou o Fortran e criou a notao BNF. Maurice V. Wilkes, inventor do somador binrio. Howard Aiken, inventor do Mark I. Walter H. Brattain, inventor do transstor. William Shockley, inventor do transstor. John Bardeen, inventor do transstor. Fred Williams, inventor da memria RAM.

Cincia da computao Tom Kilburn, inventor da memria RAM. Konrad Zuse, inventor independente do computador digital e de linguagens de programao na Alemanha nazista. John Vincent Atanasoff, possivelmente o inventor do primeiro computador digital, o computador de Atanasoff-Berry, ABC. Clifford E. Berry, assistente de Atanasoff. Almirante Grace Hopper, programadora do Mark I, desenvolveu o primeiro compilador; primeira mulher a receber um Ph.D. em matemtica. Edsger Dijkstra, lder do ALGOL 60, publicou o artigo original sobre programao estruturada. J. Presper Eckert, criador do ENIAC. John William Mauchly, criador do ENIAC.

84

Pesquisadores influentes
Andrew Stuart Tanenbaum, pesquisador na rea de sistemas operacionais, inventor do MINIX; seus livros-texto so dos mais referenciados na rea. Edgar Frank Codd, inventor de Banco de dados relacionais. Brian Kernighan, inventor do C. Dennis Ritchie, inventor do C e do Unix. Bjarne Stroustrup, inventor do C++. Ken Thompson, inventor do Unix e da codificao de caracteres UTF-8. Peter Chen, inventor do Modelo de entidades e relacionamentos. Donald Ervin Knuth, criador do TeX, da programao literria e da influente srie (inacabada em 2006) sobre algoritmos The Art of Computer Programming. Linus Torvalds, criador do ncleo Linux. Alan Kay, um dos inventores da orientao a objeto, tambm concebeu o laptop e a interface grfica do utilizador. Steve Wozniak e Steve Jobs, Criadores da Apple, e do primeiro computador pessoal, o Apple I. Bill Gates, Criador da Microsoft, a empresa que criou o Windows.

Cincia da computao

85

reas de pesquisa
Fundamentos matemticos
lgebra linear. Anlise Econmica de Sistemas de Informaes - consiste em definir o lucro, receita e custo, e relacionar todos os fatores economicos a produo e desenvolvimento do software. Clculo diferencial e integral. Clculo numrico. Analise combinatria. Geometria analtica o estudo de algoritmos para a resoluo de problemas de geometria, ou que dependem da geometria. Lgica matemtica lgica booleana e outras formas para a modelagem lgica de problemas. Matemtica discreta. Probabilidade e estatstica. Teoria da informao. Teoria das categorias. Teoria dos grafos fundaes para estruturas de dados e algoritmos de busca. Teoria dos nmeros teoria para a definio de provas a conjunto dos nmeros inteiros, usada em criptografia e no teste de inteligncia artificial. Teoria dos tipos anlise formal de tipos de dados e seu uso para entender a propriedade de programas de algoritmos.

Tecnologia da computao
Banco de dados. Compiladores traduo de algoritmos entre diferentes linguagens de computador, geralmente de uma linguagem de alto nvel, mais abstrata e legvel para seres humanos, para uma linguagem de baixo nvel, mais concreta e voltada para o computador digital. Computao grfica gerao sinttica de imagens, e a integrao ou alterao visual de informaes visuais do mundo real. Engenharia de software. Inteligncia artificial o estudo e a implementao de sistemas que exibem um comportamento autnomo inteligente. Processamento de imagens a obteno de informao a partir de imagens. Rede de computadores algoritmos e protocolos para a comunicao de dados confivel entre diferentes sistemas, incluindo mecanismos para a identificao e correo de erros.

Cincia da computao

86

Fundamentos de computao
Arquitetura de computadores o desenvolvimento, a organizao, a otimizao e a verificao de sistemas computacionais. Circuitos digitais. Complexidade computacional definio de limites computacionais (sobretudo relativo a espao e tempo) fundamentais em classes de computao. Criptografia aplicao da complexidade computacional, da probabilidade e da teoria de nmeros para a criao ou quebra de cdigos. Estrutura de dados a organizao e as regras para a manipulao de informao. Linguagens formais estudo de modelos para especificar e reconhecer linguagens de forma geral. Mtodos formais o uso de abordagens matemticas para descrever e formalizar padres de desenvolvimento de software. Pesquisa e ordenao. Projeto e anlise de algoritmos complexidade computacional aplicada aos algoritmos. Semntica formal estudo da especificao do significado (ou comportamento) de programas de computador e partes de hardware. Teoria da Computabilidade definio do que computvel utilizando-se os modelos atuais, definindo as possibilidades tericas da computao. Teoria da computao. Teoria dos algoritmos de informao. Teoria dos autmatos.

Cincia da computao aplicada


lgebra computacional. Especificao de programas. Estrutura de dados. Informtica na Educao. Interao homem-computador estudo sobre a utilidade e usabilidade de computadores, tornando-os acessveis s pessoas. Otimizao combinatria. Pesquisa operacional. [3] Planejamento automatizado estuda o processo de deliberao por meio da computao. Programao de computadores o uso de linguagens de programao para a implementao de algoritmos. Reconhecimento de padres. Recuperao de informaes. Redes de Petri. Redes neurais. Redes semnticas. Segurana de computadores. Sistemas multiagentes. Tolerncia a falhas. Vida artificial o estudo de organismos digitais.

Organizao dos sistemas computacionais


Arquitetura de computadores o desenvolvimento, a organizao, a otimizao e a verificao de sistemas computacionais. Computao distribuda computao sendo executada em diversos dispositivos interligados por uma rede, todos com o mesmo objetivo comum. Computao paralela computao sendo executada em diferentes tarefas; geralmente concorrentes entre si na utilizao de recursos. Computao quntica representao e manipulao de dados usando as propriedades qunticas das partculas e a mecnica quntica. Sistemas operacionais sistemas para o gerenciamento de programas de computador e para a abstrao da mquina, fornecendo base para um sistema utilizvel.

Equipamentos eletrnicos
Robtica o controle do comportamento de robs. Sistemas digitais.

Relacionamento com outros campos


Por ser uma disciplina recente, existem vrias definies alternativas para a cincia da computao. Ela pode ser vista como uma forma de cincia, uma forma de matemtica ou uma nova disciplina que no pode ser categorizada seguindo os modelos atuais. Vrias pessoas que estudam a cincia da computao o fazem para tornarem-se programadores, levando alguns a acreditarem que seu estudo sobre o software e a programao. Apesar disso, a maioria dos cientistas da computaao so interessados na inovao ou em aspectos tericos que vo muito alm de somente a programao, mais relacionados com a computabilidade. Apesar do nome, muito da cincia da computao no envolve o estudo dos computadores por si prprios. De fato, o conhecido cientista da computao Edsger Dijkstra considerado autor da frase "Cincia da computao tem tanto a ver com o computador como a Astronomia com o telescpio []". O projeto e desenvolvimento de computadores e sistemas computacionais so geralmente considerados disciplinas fora do contexto da cincia da computao. Por exemplo, o estudo do hardware geralmente considerado parte da engenharia da computao, enquanto o estudo de sistemas computacionais comerciais so geralmente parte da tecnologia da informao ou sistemas de informao.

Cincia da computao Por vezes a cincia da computao tambm criticada por no ser suficientemente cientfica, como exposto na frase "Cincia para a cincia da computao assim como a hidrodinmica para a construo de encanamentos", credita a Stan Kelly-Bootle.[4] Apesar disso, seu estudo frequentemente cruza outros campos de pesquisa, tais como a inteligncia artifical, fsica e lingustica. Ela considerada por alguns por ter um grande relacionamento com a matemtica, maior que em outras disciplinas. Isso evidenciado pelo fato que os primeiros trabalhos na rea eram fortemente influenciados por matemticos como Kurt Gdel e Alan Turing; o campo continua sendo til para o intercmbio de informao com reas como lgica matemtica, teoria das categorias e lgebra. Apesar disso, diferente da matemtica, a cincia da computao considerada uma disciplina mais experimental que terica. Vrias alternativas para o nome da disciplina j foram cogitadas. Em francs ela chamada informatique, em alemo Informatik, em espanhol informtica, em holands, italiano e romeno informatica, em polons informatyka, em russo e em grego . Apesar disso, tanto em ingls quanto em portugus informtica no diretamente um sinnimo para a cincia da computao; o termo usado para definir o estudo de sistemas artificiais e naturais que armazenam processos e comunicam informao, e refere-se a um conjunto de cincias da informao que engloba a cincia da computao. Em Portugal, no entanto, apesar de a palavra estar dicionarizada com esse sentido amplo, o termo usado como sinnimo de cincia da computao.

87

Profisso
De forma geral, cientistas da computao estudam os fundamentos tericos da computao, de onde outros campos derivam, como as reas de pesquisa supracitadas. Como o nome implica, a cincia da computao uma cincia pura, no aplicada. Entretanto, o profissional dessa rea pode seguir aplicaes mais prticas de seu conhecimento, atuando em reas como desenvolvimento de software ou consultoria em tecnologia da informao.
[1] Constable, R.L. (Maro de 2000). Computer Science: Achievements and Challenges circa 2000 (http:/ / www. cs. cornell. edu/ cis-dean/ bgu. pdf) (em ingls). [2] Hal Abelson, G.J. Sussman, J.Sussman. Structure and Interpretation of Computer Programs.2.ed.MIT Press, 1996. ISBN 0-262-01153-0 [3] Ghallab, M., Nau, D. S., and Traverso, P. (2004). Automated Planning: Theory and Practice. ISBN 1-55860-856-7 [4] Computer Language, outubro de 1990

Ver tambm
Anlise Econmica de Sistemas de Informaes Anlise de Sistemas e Tecnologia da Informao Etimologia de termos usados na computao Informtica Problemas em aberto da Cincia da computao Computao afetiva Lista de cursos de ps-graduao stricto sensu em Cincia da Computao no Brasil

PHP

88

PHP
PHP

Paradigma Surgido em ltima verso Criado por

procedural, reflexo, orientao a objeto, funcional 1995 5.3.2 (4 de Maro, 2010) Rasmus Lerdof

Estilo de tipagem: dinmica Compiladores Influenciada por Linguagem interpretada Perl, C

PHP (um acrnimo recursivo para "PHP: Hypertext Preprocessor") uma linguagem de programao de computadores interpretada, livre e muito utilizada para gerar contedo dinmico na World Wide Web, como por exemplo a Wikipdia.

Histrico
A linguagem surgiu por volta de 1994, como um pacote de programas CGI criados por Rasmus Lerdof, 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. 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. A Wikipdia funciona sobre um software inteiramente escrito em PHP, usando bases de dados MySQL: o MediaWiki.

PHP 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. 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. [carecede fontes?].

89

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 objeto Portabilidade - independncia de plataforma - escreva uma vez, rode em qualquer lugar; Tipagem fraca Sintaxe similar a Linguagem C/C++ e o PERL

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.

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.

PHP

90

Polimorfismo
Existem 2 modalidades de polimorfismo chamadas de Polimorfismo Universal e Polimorfismo ad-hoc. Polimorfismo Universal: Existe dois tipos (Polimorfismo Paramtrico e Polimorfismo de Incluso). Polimorfismo ad-hoc : Existe dois tipos (Polimorfismo de Sobrecarga e Polimorfismo de Coero).

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. (Ver exemplo contextualizado em anexo.) O PHP no requer (ou suporta) a definio de tipo explcita na declarao de variveis: o tipo de uma varivel determinado pelo * 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 polimosfismo 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. (Ver exemplo contextualizado em anexo.)

Polimorfismo por Sobrecarga


O polimorfismo por sobrecarga, no qual mais de um mtodo tem o mesmo nome, mas assinaturas diferentes, no suportado pelo PHP. (Ver exemplo contextualizado em anexo.)

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. (Ver exemplo contextualizado em anexo.)

Referncias bibliogrficas
SICA, Carlos. PHP Orientado a Objetos: Fale a Linguagem da Internet.1.ed.Rio de Janeiro - RJ:Cincia Moderna, 2006.pp.216.1 v.v. 1 ISBN 978-85-7393-553-0 SICA, Carlos. Programao Segura Utilizando PHP: Fale a Linguagem da Internet.1.ed.Rio de Janeiro RJ:Cincia Moderna, 2007.pp.100.1 v.v. 1 ISBN 978-85-7393-608-7 DALL'OGLIO, Pablo. PHP Programando com Orientao a Objetos [1]: Inclui Design Patterns.1.ed.So Paulo:Novatec, 2007.pp.576. ISBN 978-85-7522-137-2 DALL'OGLIO, Pablo. PHP-GTK Criando Aplicaes Grficas com PHP [2].2.ed.So Paulo:Novatec, 2007.pp.445. ISBN 978-85-7522-110-5 MELO, Alexandre Altair de; NASCIMENTO, Mauricio G. F. PHP Profissional [3]: Aprenda a desenvolver sistemas profissionais orientados a objetos com padres de projeto.1.ed.So Paulo:Novatec, 2007.pp.464. ISBN 978-85-7522-141-9

PHP

91

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 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

PHP 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

92

Grandes apoiadores
PHP j h algum tempo tem chamado ateno de gigantes da Tecnologia por sua robustez e facilidades. Segue alguns: Oracle Yahoo! Wikipedia (este site desenvolvido em PHP) IBM Eclipse (IDE) Netbeans (IDE) Facebook Eletroniks Twitter WordPress

Ver tambm
Anexo:Lista de exemplos de cdigo PHP MySQL Servidor Apache Perl PHP-GTK WAMP5 EasyPHP ScriptCase XAMPP XPTO

PHP

93

Ligaes externas
Pgina oficial do PHP [4] (em ingls) Manual do PHP5 [5] (em portugus) PHP Security Workbook [6] (em ingls) Instalador free empacotado pela Zend [7] (em ingls)

Referncias
[1] [2] [3] [4] [5] [6] [7] http:/ / www. adianti. com. br/ phpoo http:/ / www. php-gtk. com. br/ book http:/ / www. novatec. com. br/ livros/ phppro http:/ / www. php. net/ http:/ / apostilas. fok. com. br/ manual-do-php/ index. php http:/ / shiflett. org/ php-security. pdf http:/ / www. zend. com/ en/ products/ server-ce/ downloads

Engenharia de software
Engenharia de software uma rea do conhecimento da computao voltada para a especificao, desenvolvimento e manuteno de sistemas de software aplicando tecnologias e prticas de gerncia de projetos e outras disciplinas, objetivando organizao, produtividade e qualidade. Atualmente, essas tecnologias e prticas englobam linguagens de programao, banco de dados, ferramentas, plataformas, bibliotecas, padres, processos e a questo da Qualidade de Software. Os fundamentos cientficos para a engenharia de software envolvem o uso de modelos abstratos e precisos que permitem ao engenheiro especificar, projetar, implementar e manter sistemas de software, avaliando e garantindo suas qualidades. Alm disso, a engenharia de software deve oferecer mecanismos para se planejar e gerenciar o processo de desenvolvimento de um sistema de informao Sistema computacional, pois ambos se confundem!

Definio
Segundo Friedrich Ludwig Bauer, "Engenharia de Software a criao e a utilizao de slidos princpios de engenharia a fim de obter software de maneira econmica, que seja confivel e que trabalhe eficientemente em mquinas reais". O prprio significado de engenharia j traz os conceitos de criao, construo, anlise, desenvolvimento e manuteno. A Engenharia de Software se concentra nos aspectos prticos da produo de um sistema de software, enquanto a cincia da computao estuda os fundamentos tericos dos aspectos computacionais. O termo foi criado na dcada de 1960 e utilizado oficialmente em 1968 na NATO Conference on Software Engineering (Conferncia sobre Engenharia de Software da OTAN). Sua criao surgiu numa tentativa de contornar a crise do software e dar um tratamento de engenharia (mais sistemtico e controlado) ao desenvolvimento de sistemas de software complexos. Um sistema de software complexo se caracteriza por um conjunto de componentes abstratos de software (estruturas de dados e algoritmos) encapsulados na forma de procedimentos, funes, mdulos, objetos ou agentes e interconectados entre si, compondo a arquitetura do software, que devero ser executados em sistemas computacionais. Os fundamentos cientficos envolvem o uso de modelos abstratos e precisos que permitem ao engenheiro especificar, projetar, implementar e manter sistemas de software, avaliando e garantindo suas qualidades. Alm disto, deve oferecer mecanismos para se planejar e gerenciar o processo de desenvolvimento. Empresas desenvolvedoras de software passaram a empregar esses conceitos sobretudo para orientar suas reas de

Engenharia de software desenvolvimento, muitas delas organizadas sob a forma de Fbrica de Software. A Engenharia de Sistemas uma rea mais ampla por tratar de todos os aspectos de sistemas baseados em computadores, incluindo hardware e engenharia de processos alm do software.

94

reas de Conhecimento
Segundo o SWEBOK (Corpo de Conhecimento da Engenharia de Software), verso 2004, as reas de conhecimento da Engenharia de Software so: Requisitos (Requirements) de Software Projeto (Design) de Software Construo (Construction) de Software Teste (Testing) de Software Manuteno (Maintenance) de software Gerncia de Configurao de Software Gerncia de Engenharia de Software Processos de Engenharia de Software Ferramentas e Mtodos de Engenharia de Software

Qualidade (Quality) de Software Conforme Pressman, a Engenharia de Software (ES) uma tecnologia em camadas. E a base de todas essas camadas o foco na qualidade do software desenvolvido. Portanto, inclusive do ponto de vista didtico, interessante estudarmos a ES em suas camadas de Processo, Mtodos e Ferramentas.

Processo de Software
Processo de software, ou processo de engenharia de software, uma seqncia coerente de prticas que objetiva o desenvolvimento ou evoluo de sistemas de software. Estas prticas englobam as atividades de especificao, projeto, implementao, testes e caracterizam-se pela interao de ferramentas, pessoas e mtodos. SEE e PSEE so os ambientes voltados ao desenvolvimento e manuteno de processos. O projeto ExPSEE uma continuao dos estudos de processos, principalmente do ambiente PSEE. Devido ao uso da palavra projeto em muitos contextos, por questes de clareza, h vezes em que se prefira usar o original em ingls design.

Modelos de Processo de Software


Um modelo de processo de desenvolvimento de software, ou simplesmente modelo de processo, pode ser visto como uma representao, ou abstrao dos objetos e atividades envolvidas no processo de software. Alm disso, oferece uma forma mais abrangente e fcil de representar o gerenciamento de processo de software e consequentemente o progresso do projeto. Exemplos de alguns modelos de processo de software; Modelos ciclo de vida Sequencial ou Cascata (do ingls waterfall) - com fases distintas de especificao, projeto e desenvolvimento. Desenvolvimento iterativo e incremental - desenvolvimento iniciado com um subconjunto simples de Requisitos de Software e interativamente alcana evolues subseqentes das verses at o sistema todo estar implementado Evolucional ou Prototipao - especificao, projeto e desenvolvimento de prottipos. V-Model - Parecido com o modelo cascata, mas com uma organizao melhor, que permite que se compare com outros modelos mais modernos. Espiral - evoluo atravs de vrios ciclos completos de especificao, projeto e desenvolvimento. Componentizado - reuso atravs de montagem de componentes j existentes.

Engenharia de software Formal - implementao a partir de modelo matemtico formal. gil RAD Quarta gerao

95

muito importante o desenvolvimento do software.

Modelos de Maturidade
Os modelos de maturidade so um metamodelo de processo. Eles surgiram para avaliar a qualidade dos processos de software aplicados em uma organizao (empresa ou instituio). O mais conhecido o Capability Maturity Model Integration (CMMi), do Software Engineering Institute - SEI. O CMMi pode ser organizado atravs de duas formas, contnua e estagiada. Pelo modelo estagiado, mais tradicional e mantendo compatibilidade com o CMM, uma organizao pode ter sua maturidade medida em 5 nveis: Nvel 1 - Catico; Nvel 2 - Capacidade de repetir sucessos anteriores pelo acompanhamento de custos, cronogramas e funcionalidades; Nvel 3 - O processo de software bem definido, documentado e padronizado; Nvel 4 - Realiza uma gerncia quantitativa do processo de software e do produto; Nvel 5 - Usa a informao quantitativa para melhorar continuamente e gerenciar o processo de software. O CMMi um modelo de maturidade recentemente criado com o fim de agrupar as diferentes formas de utilizao que foram dadas ao seu predecessor, o CMM. O (MPS.BR), ou Melhoria de Processos do Software Brasileiro, simultaneamente um movimento para a melhoria e um modelo de qualidade de processo voltada para a realidade do mercado de pequenas e mdias empresas de desenvolvimento de software no Brasil.

Metodologias e Mtodos
O termo metodologia bastante controverso nas cincias em geral e na Engenharia de Software em particular. Muitos autores parecem tratar metodologia e mtodo como sinnimos, porm seria mais adequado dizer que uma metodologia envolve princpios filosficos que guiam uma gama de mtodos que utilizam ferramentas e prticas diferenciadas para realizar algo.[1] Assim teramos, por exemplo, a Metodologia Estruturada, na qual existem vrios mtodos, como Anlise Estruturada e Projeto Estruturado (muitas vezes denominados SA/SD, e Anlise Essencial). Tanto a Anlise Estruturada quanto a Anlise Essencial utilizam a ferramenta Diagrama de Fluxos de Dados para modelar o funcionamento do sistema. Metodologia Estruturada Anlise Estruturada Projeto Estruturado Programao Estruturada Anlise Essencial SADT DFD - Diagrama de Fluxo de Dados MER - Modelo de Entidades e Relacionamentos Metodologia Orientada a Objetos Orientao a Objetos Rational Unified Process ( RUP ) Desenvolvimento gil de software

Engenharia de software Feature Driven Development ( FDD ) Enterprise Unified Process (EUP) Scrum (Scrum) Crystal (Crystal Clear, Crystal Orange, Crystal Orange Web) Programao extrema ( XP ) Outras Metodologias Microsoft Solution Framework ( MSF )

96

Modelagem
A abstrao do sistema de software atravs de modelos que o descrevem um poderoso instrumento para o entendimento e comunicao do produto final que ser desenvolvido. A maior dificuldade nesta atividade est no equilbrio (tradeoff) entre simplicidade (favorecendo a comunicao) e a complexidade (favorecendo a preciso) do modelo. Para a modelagem podemos citar 3 mtodos: Anlise estruturada, criada por Gane & Searson; Anlise essencial, criada por Palmer & McMenamin e Ed. Yourdon; UML criada por Grady Booch, Ivar Jacobson & Jaimes Rumbaugh (veja exemplos). Atualmente a modelagem mais recomendada, e sendo a mais comum, a utilizao da linguagem UML.

Ferramentas, Tecnologias e Prticas


A engenharia de software aborda uma srie de prticas e tecnologias, principalmente estudadas pela cincia da computao, enfocando seu impacto na produtividade e qualidade de software. Destacam-se o estudo de linguagem de programao, banco de dados e paradigmas de programao, como: Programao estruturada Programao funcional Programao orientada a objetos Componentes de Software Programao orientada a aspecto

Ferramentas
Outro ponto importante o uso de ferramentas CASE (do ingls Computer-Aided Software Engineering). Essa classificao abrange toda ferramenta baseada em computadores que auxiliam atividades de engenharia de software, desde a anlise de requisitos e modelagem at programao e testes. Os ambientes de desenvolvimento integrado (IDEs) tm maior destaque e suportam, entre outras coisas: Editor Compilador Debug Gerao de cdigo Modelagem Deploy Testes no automatizados Testes automatizados

Refatorao (Refatoring) Gesto de Riscos nos projectos de Software

Engenharia de software Uso da Prototipagem na Eng. de Requisitos

97

Gerncia de Projetos
A gerncia de projetos se preocupa em entregar o sistema de software no prazo e de acordo com os requisitos estabelecidos, levando em conta sempre as limitaes de oramento e tempo. A gerncia de projetos de software se caracteriza por tratar sobre um produto intangvel, muito flexvel e com processo de desenvolvimento com baixa padronizao.

Planejamento
O planejamento de um projeto de desenvolvimento de software inclui: Anlise Econmica de Sistemas de Informaes organizao do projeto (incluindo equipes e responsabilidades) estruturao das tarefas (do ingls WBS - work breakdown structure) cronograma do projeto (do ingls project schedule) anlise e gesto de risco estimativa de custos

Essas atividades sofrem com dificuldades tpicas de desenvolvimento de software. A produtividade no linear em relao ao tamanho da equipe e o aumento de produtividade no imediato devido aos custos de aprendizado de novos membros. A diminuio de qualidade para acelerar o desenvolvimento constantemente prejudica futuramente a produtividade. A estimativa de dificuldades e custos de desenvolvimentos so muito difceis, alm do surgimento de problemas tcnicos. Esses fatores requerem uma anlise de riscos cuidadosa. Alm da prpria identificao dos riscos, h que ter em conta a sua gesto. Seja evitando, seja resolvendo, os riscos necessitam ser identificados (estimando o seu impacto) e devem ser criados planos para resoluo de problemas.

Anlise de Requisitos
As atividades de anlise concentram-se na identificao, especificao e descrio dos requisitos do sistema de software. Em resumo, requisito uma necessidade que o software deve cumprir. H vrias interpretaes e classificaes sobre requisitos, entre elas: funcional no funcional de usurio de sistema

comum que o cliente no saiba o que ele realmente deseja, que haja problemas na comunicao e ainda que haja mudana constante de requisitos. Todos esses fatores so recrudescidos pela intangibilidade sobre caractersticas de sistemas de software, principalmente sobre o custo de cada requisito. Estudo de Viabilidade (Levantamento de Requisitos) A Engenharia de requisitos um processo que envolve todas as atividades exigidas para criar e manter o documento de requisitos de sistema (SOMMERVILLE). Segundo RUMBAUGH, alguns analistas consideram a engenharia de Requisitos como um processo de aplicao de um mtodo estrutura como a analise orientada a objetos. No entanto, a Engenharia de requisitos possui muito mais aspectos do que os que esto abordados por esses mtodos. Abaixo um pequeno Processo de Engenharia de Requisitos (SOMMERVILLE). Estudo da viabilidade -> "Relatrio de Viabilidade" Obteno e Analise de Requisitos -> "Modelos de Sistema" Especificao de Requisitos -> "Requisitos de Usurio e de Sistema" Validao de Requisitos -> "Documento de

Engenharia de software Requisitos" O primeiro processo a ser realizado num Sistema novo o Estudo de Viabilidade. Os resultados deste processo devem ser um relatrio com as recomendaes da viabilidade tcnica ou no da continuidade no desenvolvimento do Sistema proposto. Basicamente um estudo de viabilidade, embora seja normalmente rpido, dever abordar fundamentalmente as seguintes questes: O Sistema proposto contribui para os objetivos gerais da organizao? O Sistema poder ser implementado com as tecnologias dominadas pela equipe dentro das restries de custo e de prazo? Ou precisa de treinamentos adicionais? O Sistema pode ser integrado, e compatvel com os outros sistemas j em operao?

98

Gesto
Pessoal Produto Processo Projeto Material

Histrico
A Engenharia de Software (ES) surgiu em meados dos anos 1970 numa tentativa de contornar a crise do software e dar um tratamento de engenharia (mais sistemtico e controlado) ao desenvolvimento de sistemas de software complexos. Um sistema de software complexo se caracteriza por um conjunto de componentes abstratos de software (estruturas de dados e algoritmos) encapsulados na forma de procedimentos, funes, mdulos, objetos ou agentes interconectados entre si, compondo a arquitetura do software, que devero ser executados em sistemas computacionais.

ES no Presente e Tendncias
Atualmente existe um destaque todo especial para a Engenharia de Software na Web. Tambm utilizado por Presmann a sigla WebE, o processo usado para criar WebApps (aplicaes baseadas na Web) de alta qualidade. Embora os princpios bsicos da WebE sejam muito prximos da Engenharia de Software clssica, existem peculiaridades especficas e prprias. Com o advento do B2B (e-business) e do B2C (e-commerce), e ainda mais com aplicaes para a Web 2.0, maior importncia ficou sendo esse tipo de engenharia. Normalmente adotam no desenvolvimento a arquitetura MVC (Model-View-Controller). Outra rea de tendncia em Engenharia de Software trata da aplicao de tcnicas otimizao matemtica para a resoluo de diversos problemas da rea. A rea, denominada Search-based software engineering, ou Otimizao em engenharia de software em Portugus, apresenta vrios resultados interessantes. [2] Para mais detalhes em Portugus, ver texto com aplicaes da otimizao em engenharia de software [3]. [4]

[1] Veja mais detalhes em Metodologia (engenharia de software) [2] HARMAN, M., JONES, B.F., Search-based software engineering, Information and Software Technology, 2001, pp. 833-839. [3] http:/ / goes. comp. uece. br/ resources/ Search-based%20Software%20Engineering%20-%20Aplicao%20de%20Metaheursticas%20em%20Problemas%20da%20Engenharia%20de%20Software%20R pdf [4] FREITAS, F.G., MAIA, C.L.B., COUTINHO, D.P., CAMPOS, G.A.L., SOUZA, J.T., Aplicao de Metaheursticas em Problemas da Engenharia de Software: Reviso de Literatura (http:/ / goes. comp. uece. br/ resources/ Search-based Software Engineering - Aplicao de Metaheursticas em Problemas da Engenharia de Software Reviso de Literatura (Otimizao em Engenharia de Software). pdf), II Congresso Tecnolgico Infobrasil, 2009,

Engenharia de software

99

Bibliografia
MAGELA, Rogerio. Engenharia de Software Aplicada: Princpios (volume 1). Alta Books. 2006. MAGELA, Rogerio. Engenharia de Software Aplicada: Fundamentos (volume 2). Alta Books. 2006. MOLINARI, Leonardo. Gerncia de Configurao - Tcnicas e Prticas no Desenvolvimento do Software.Florianpolis:Visual Books, 2007. 85-7502-210-5 PRESSMAN, Roger. Software Engineering: A Practitioner's Approach, 6edio, Mc Graw Hill, 2005. ECONMICA DE SISTEMAS DE INFORMAES. (http://www.editoraixtlan.com/livros.htm''ANLISE) (ISBN 978-85-909374-7-0) Editora Ixtlan. Autor : Sergio Kaminski. Comentrio: Mostra todas as etapas de desenvolvimento do software, relacionando ao lucro,receita e custo.

Ligaes externas
Site dos alunos da Graduao em Engenharia de Software da Universidade Federal de Gois - UFG (http://www. engenhariadesoftwarebrasil.com) Bacharelado em Engenharia de Software (http://engenhariadesoftware.inf.br/home) ( Graduao em Engenharia de Software (http://engenhariadesoftware.inf.br/home)) Curso superior oferecido pelo Instituto de Informtica --- Universidade Federal de Gois. GPES (http://www.gpes.dcc.ufmg.br/) Grupo de Pesquisa em Engenharia de Software do Departamento de Cincia da Computao da Universidade Federal de Minas Gerais. Praxis - Processo de desenvolvimento de software com enfoque educacional Software da gerncia de OEE (http://www.capstonemetrics.com/files/understanding-oee.html) Podcasts bem interessantes (em portugus) sobre reas de interesse da Engenharia de Software (http://www. improveit.com.br/podcast) CMMI, MPS.BR, Scrum, Extreme Programming e Lean Software Development Revista Engenharia de Software (http://www.devmedia.com.br/esmag) Revista sobre Engenharia de Software em portugues Graduao em Engenharia de Software na Universidade de Brasilia - FGA (http://www.fga.unb.br/ unbgama)Novo Campus da Universidade de Braslia Grupo de Otimizao em Engenharia de Software da Universidade Estadual do Cear (GOES.UECE) (http:// goes.comp.uece.br) Grupo de Otimizao em Engenharia de Software da Universidade Estadual do Cear (GOES.UECE)

Ver tambm
Desenvolvimento de software Qualidade de software Software Engineering Body of Knowledge Anlise Econmica de Sistemas de Informaes Matriz CRUD Otimizao em engenharia de software

Cdigo de mquina

100

Cdigo de mquina
Todo computador possui um conjunto de instrues que seu processador capaz de executar. Essas instrues, chamadas de cdigo de mquina, so representadas por sequncias de bits, normalmente limitadas pelo nmero de bits do registrador principal da CPU. As instrues correspondem a seqencias muito simples de operaes, como transferir um dado em memria para a CPU ou somar dois valores e so normalmente interpretadas por micro-cdigo. Um programa em cdigo de mquina consiste de uma sequncia de nmeros que significam uma sequncia de instrues a serem executadas. normal a representao da linguagem de mquina por meio de nmeros (opcodes) constantes e variveis em sistema binrio ou sistema hexadecimal. Alguns computadores tambm tm seu opcodes representados no sistema octal. Microprocessadores tem normalmente seus cdigos de operao como mltiplos de 2, 8 e 16, pois usam arquiteturas com registradores de 8, 16, 32, 64 ou 128 bits em 2006. Porm, existem mquinas com registradores de tamanho diferente. Os programas de computador raramente so criados em linguagem de mquina, mas devem ser traduzidos (por compiladores) para serem executados diretamente pelo computador. Existe a opo, em voga atualmente, de no execut-los diretamente, mas sim por meio de um interpretador, esse sim rodando diretamente em cdigo de mquina e previamente compilado.

Visualizao de programas em linguagem de mquina


Estes nmeros no podem ser vistos num editor de texto, ou, caso se tente ver aparecem apenas um texto sem significado devido existncia de caracteres de controle. Abaixo pode-se ver o que mostrado ao se abrir um cdigo de mquina de um PC com um editor de texto:

MZ$Pv]3PF F< u2tB uC2I,"t"<\u<"uIY.tC+r.vvv vvvYYVFRvvW]UHVW~FFu !3n Pode-se editar o cdigo de mquina usando editores hexadecimais, como por exemplo o "debug" que roda sob o DOS do Windows. Com estes programas pode-se ver o cdigo no em binrio, mas em hexadecimal, como mostrado abaixo nesta captura da tela do DOS com o debug aberto editando o programa "v.exe": (tecla-se ? para comandos e d para dump) C:\Utility>debug -d 0 100 0E3D:0000 CD 20 ........O..... 0E3D:0010 F0 07 ................ 0E3D:0020 FF FF ..............L. 0E3D:0030 D0 0C ......=......... 0E3D:0040 05 00 ................ v.exe FF 9F 00 9A F0 FE-1D F0 4F 03 F0 07 8A 03 17 03 F0 07 DF 07-01 01 01 00 02 FF FF FF FF FF FF FF FF FF-FF FF FF FF BD 0D 4C 01 14 00 18 00 3D 0E-FF FF FF FF 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 .

Cdigo de mquina 0E3D:0050 CD 21 .!........... 0E3D:0060 20 20 ..... 0E3D:0070 20 20 ........ 0E3D:0080 00 0D ..v.exe.DOWS\sys 0E3D:0090 74 65 tem32\dosx..da r 0E3D:00A0 65 64 (carregar an 0E3D:00B0 74 65 dosx.exe) CB 00 00 00 00 00-00 00 00 00 00 20 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 76 2E 65 78 65 0D-44 4F 57 53 5C 73 79 73 6D 33 32 5C 64 6F-73 78 0D 0D 64 61 20 72 65 20 28 63 61 72-72 65 67 61 72 20 61 6E 73 20 64 6F 20 64-6F 73 78 2E 65 78 65 29 ede tes do

101

No exemplo acima mostrado esquerda o endereo da memria (segmento:offset), ao centro o cdigo em hexadecimal e direita como seria o texto em ASCII. Mais eficiente do que tudo isso seria conseguir um programa dedicado para manipulao de cdigo de mquina.

Programao em cdigo de mquina


Para se programar em cdigo de mquina deve-se obter os cdigos de instrues do processador utilizado, contendo opcodes, operandos e formatos de cada instruo. Por esse motivo, foi criada uma linguagem de programao chamada linguagem de montagem (Assembly Language), composta de cdigos mnemnicos que, do ponto de vista tcnico, to prxima do processador quanto o cdigo de mquina, mas humanamente mais fcil de se compreender uma vez que seus cdigos so geralmente acrnimos do ingls. Por exemplo mov de mover, rep de repetio e assim por diante.

Ver tambm
Linguagem de alto nvel

Linguagem de montagem

102

Linguagem de montagem
Nota: Se voc procura pelo lbum da banda norueguesa de Gothic Metal Theatre of Tragedy, procure por Assembly (lbum) Uma linguagem de montagem ou assembly uma notao legvel por humanos para o cdigo de mquina que uma arquitetura de computador especfica usa. A linguagem de mquina, que um mero padro de bits, torna-se legvel pela substituio dos valores em bruto por smbolos chamados mnemnicos. Por exemplo, enquanto um computador sabe o que a instruo-mquina IA-21 (10110000 01100001) faz, para os programadores mais fcil recordar a representao equivalente em intrues mnemnicas MOV AL, 61h. Tal instruo ordena que o valor hexadecimal 61 (97, em decimal) seja movido para o registrador 'AL'.

Arquitetura
Ao contrrio do que acontece nas linguagens de alto nvel, existe (at certo ponto) uma correspondncia de 1 para 1 entre a linguagem de montagem simples e a linguagem de mquina. Por isso a traduo do cdigo de montagem em cdigo de mquina no chamada compilao, mas montagem. Consegue-se transformar a linguagem de montagem em linguagem de mquina recorrendo a um montador (tambm chamado assembler, originado do termo em ingls), e a transformao inversa faz-se recorrendo a um desmontador (tambm chamado disassembler, originado do termo em ingls). Cada arquitectura de computador tem a sua prpria linguagem de mquina e, portanto, sua prpria linguagem de montagem. Essas linguagens de montagem diferem no nmero e tipo de operaes que suportam. Tambm tm diferentes tamanhos e nmeros de registros, e diferentes representaes dos tipos de dados armazenados. Enquanto todos os computadores de utilizao genrica so capazes de desempenhar essencialmente as mesmas funes, o modo como o fazem diferente. Alm disso, podem existir conjuntos mltiplos de mnemnicas, ou sintaxes de linguagem de montagem, para um nico conjunto de instrues. Nestes casos, o conjunto mais popular aquele que utilizado pelo fabricante na sua documentao. A maioria dos processadores s consegue manipular os dados que esto em registradores e a linguagem de montagem facilita o trabalho direto com os registradores. No mercado de PCs, dominado por processadores Intel e AMD, atualmente existem duas arquiteturas. Primeiro a IA32, criada pela Intel em 1985 e primeiramente utilizada pelo processadores i386 e segundo a IA32-EM64T (ou IA32-AMD64 ) criada em 2002 pela AMD (Mas tambm utilizada pela Intel hoje). O IA32 utiliza o grupo de instrues chamado x86, e o IA32-EM64T utiliza o grupo chamado x86-64. As duas arquiteturas usam numeros diferentes de registradores gerais e tamanho. Enquanto os registradores do x86 so 32 bits os da x86-64 so 64 bits. Os registradores de uso geral da arquitetura x86 so: %EAX - registrador acumulador %EBX - registrador base %ECX - registrador contador %EDX - registrador de dados %ESI - registrador de ndice da fonte dos dados %EDI - registrador de ndice do destino dos dados %EBP - registrador ponteiro para a moldura de chamada de funo %ESP - registrador ponteiro para a pilha de execuo

Os registradores de uso geral da arquitetura x86-64 so: %RAX - registrador valor de retorno

Linguagem de montagem %RBX - registrador base %RCX - registrador contador %RDX - registrador de dados %RSI - registrador de ndice da fonte dos dados %RDI - registrador de ndice do destino dos dados %RBP - registrador ponteiro para a moldura de chamada de funo %RSP - registrador ponteiro para a pilha de execuo %R8 - registrador de dados %R9 - registrador de dados %R10 - registrador ponteiro para a moldura de chamada de funo %R11 - registrador de linking %R12 - registrador de base %R13 - registrador de base %R14 - registrador de base %R15 - registrador de base

103

Esses nomes derivam da forma como eram utilizados nas arquiteturas anteriores a IA32 (8086, 80286), em que cada registrador desempenhava um papel especfico. Na arquitetura i386, todos eles so de uso geral, embora eles continuem a poder ser utilizados em seus papis tradicionais. A arquitetura IA32 ainda apresenta os registradores de segmento CS, DS, ES, SS, FS e GS, um contador de programa EIP, um registro de sinalizadores EFLAGS, 8 registradores de vrgula flutuante e seus sinalizadores associados. Existem tambm registradores utilizados pelo sistema operacional para controle da execuo em modo protegido, bem como outros registradores de uso especfico (depurao, controle de desempenho, etc.). Instrues Aritmticas Adio: ADD, ADC, INC, XADD, AAA e DAA; Subtraco: SUB, SBB, DEC, AAS e DAS; Multiplicao: MUL, IMUL e AAM; Diviso: DIV, IDIV e AAD.

Exemplos de cdigo de montagem


Arquitetura Intel
Endereo 7C90EBAF 7C90EBB0 7C90EBB6 7C90EBBC 7C90EBC2 7C90EBC5 7C90EBC8 7C90EBCB 7C90EBD1 7C90EBD7 7C90EBDD 7C90EBE3 7C90EBE9 OPcode pushfd sub mov mov mov mov mov lea mov mov mov mov mov Operandos

esp, 2D0h dword ptr [ebp+FFFFFDDCh], dword ptr [ebp+FFFFFDD8h], eax, dword ptr [ebp+8] ecx, dword ptr [ebp+4] dword ptr [eax+0Ch], ecx eax, [ebp+FFFFFD2Ch] dword ptr [eax+000000B8h], dword ptr [eax+000000A4h], dword ptr [eax+000000A8h], dword ptr [eax+000000A0h], dword ptr [eax+0000009Ch],

eax ecx

ecx ebx edx esi edi

Linguagem de montagem 7C90EBEF 7C90EBF2 7C90EBF8 7C90EBFB 7C90EC01 7C90EC04 7C90EC0A 7C90EC10 7C90EC16 7C90EC1C 7C90EC22 7C90EC28 7C90EC2E 7C90EC34 7C90EC36 7C90EC37 7C90EC3A 7C90EC3F 7C90EC42 7C90EC45 7C90EC4D 7C90EC55 7C90EC58 7C90EC5C 7C90EC5E 7C90EC5F lea mov mov mov mov mov mov mov mov mov mov mov mov push push push call sub mov mov mov mov mov mov push call ecx, [ebp+0Ch] dword ptr [eax+000000C4h], ecx ecx, dword ptr [ebp] dword ptr [eax+000000B4h], ecx ecx, dword ptr [ebp-4] dword ptr [eax+000000C0h], ecx word ptr [eax+000000BCh], cs word ptr [eax+00000098h], ds word ptr [eax+00000094h], es word ptr [eax+00000090h], fs word ptr [eax+0000008Ch], gs word ptr [eax+000000C8h], ss dword ptr [eax], 10007h 1 eax dword ptr [ebp+8] 7C90E252 esp, 20h dword ptr [esp], eax dword ptr [esp+4], 1 dword ptr [esp+10h], 0 eax, dword ptr [ebp+8] dword ptr [esp+8], eax eax, esp eax 7C90EBAC

104

Microprocessador Texas Instruments TMS320C2x


LOOP: LARP LRLK ADRK ADRK LAC BZ ZAC SACL LARP LRLK ADRK LAC BZ AR1 AR1, apontador TAMANHO_CONSTANTE fimcon_rx * NAOPASSARAM10MS * AR1 AR1,apontador+CONSTANTE_A controle * LOOP ;No decorrido tempo: fica no loop

NAOPASSARAM10MS: SACL * LARP AR1 B LOOP

Linguagem de montagem

105

Microprocessador Texas Instruments TMS320C5x


LOOP: mvmm ar1, ar3 rpt #10 mvdd *ar3+, *ar5+ pos. end. por ar6 ;Instruoes STM LD STL LD mnima "1" STL endereo de LD "65535" STL endereo 10 STH endereo 10 STL endereo de STH endereo de com acumulador: #1000h, AR1 #0, A A, *AR1 #1, A A, *AR1 ar1 #65535, A A, 10 A, 10 A, *AR1 ar1 A, *AR1 ar1 ;armazena o acumulador mximo no ;move contedo de ar1 para ar3 ;repete ;move word endereada por ar1 para

;carrega ar1 com a constante 1000h ;zera o acumulador ;armazena no acumulador mnimo ;carrega o acumulador com a constante ;armazena o acumulador mnimo no ;carrega acumulador com a constante ;armazena o acumulador mnimo no ;armazena o acumulador mximo no ;armazena o acumulador mnimo no

;Instrues com registradores auxiliares: STM #1, AR1 ;carrega ar1 com a constante "1" STM #2, AR0 ;carrega ar0 com a constante "2" MAR *AR1+0 ;adiciona o contedo de ar0 to ar appointed by arp (1) MVDK 256, *(AR2) ;carrega ar2 with content of address 256 MAR *AR1+ ;incrementa ar apontado por arp (1) MVKD *(AR2), 256 ;aloja contedo de ar2 no endereo 256 MAR *AR1;decrementa ar appointed by arp (1) ;Instrues de teste de bit: BITF *AR1, #128 ;TESTA BIT D7 BC ptr, NTC ;vai para ptr se bit for igual a 0 MAR *AR1+ ;incrementa ar apontado por arp (1) ptr: MAR *+AR4(-128) ;sbrk 80h

;Instrues de uso de ponteiros: mvdm *(VETORAL), ar1

;move contedo da memria apontada

Linguagem de montagem para o ar (transforma arn em ponteiro) mvmd ar1, *(VETORAL) ;mvmd restaura ponteiro(VETORAL) de acordo com arn b LOOP

106

Ver tambm
Compilador Desmontador Mnemnico Montador Linguagens de programao Linguagem de baixo nvel Processador Registrador Arquitetura SMS - simulador de programao Assembly

Ligaes externas
(em ingls) IA-32 Intel Architecture Software Developer's Manual Volume 1: Basic Architecture [1]

Referncias
[1] http:/ / www. intel. com/ design/ pentium4/ manuals/ 253665. htm

Fontes e Editores da Pgina

107

Fontes e Editores da Pgina


Programao de computadores Fonte: http://pt.wikipedia.org/w/index.php?oldid=19473217 Contribuidores: 193.126.243.xxx, Ademirfer, Alchimista, Angrense, Bons, Cavasconcelos, Dante, the Wicked, Der kenner, Dpc01, Dracom, Dvulture, E2mb0t, Epinheiro, EuTuga, Fanneobom, Fnds, Francisco Paiva Junior, Girino, Gunnex, HecKel, Heldergeovane, Hgfernan, ISoron, Jonas AGX, Jorge, Jorge.roberto, Joo Carvalho, Juntas, Leandromartinez, Leonardo.stabile, Lus Felipe Braga, Manuel Anastcio, Marcelloevanessa, Muriel Gottrop, Mwaldeck, Nuno Tavares, OS2Warp, One People, Onjacktallcuca, Paulorcjr, Pediboi, Petrus Yuri, Pietro Roveri, Reynaldo, Ricvelozo, Ronaldocostajr, Suisui, The fabio, TheThingBR, Wbrito, 76 edies annimas Linguagem de programao Fonte: http://pt.wikipedia.org/w/index.php?oldid=19909058 Contribuidores: 555, Actualmind, Agil, Alchimista, AndreHahn, Andrevruas, Arlima, Bardo, Campani, Claudiobl2010, Claudiorocha0209, Denommus, E2m, Ebalter, Eduardoferreira, Elvis cti, Fagnasa, Fredxavier, GOE2, Get It, Gunnex, Hgfernan, Jorge, Jorge.roberto, Joo Carvalho, KhAoTiK TaChYoN, Lawrence, Leonardo.stabile, LeonardoG, Lgrave, Lus Felipe Braga, Manuel Anastcio, Minzinho, Mvbsoares, Nuno Tavares, OS2Warp, Ozymandias, Profvalente, Reynaldo, Ricardo Ferreira de Oliveira, Ricvelozo, Rjclaudio, Rui Malheiro, Tenchi, Thibraga06, Tiago Vasconcelos, Tumnus, Villarinho, X spager, Xexeo, 110 edies annimas Linguagem funcional Fonte: http://pt.wikipedia.org/w/index.php?oldid=3734137 Contribuidores: Adailton, Alberto Fabiano, Ale vx, E2mb0t, FML, Joao, JoaoMiranda, Leonardo.stabile, Manuel Anastcio, Marcelo-Silva, Meirarc, Nuno Tavares, Osias, Pkoch, Rafael.afonso, 10 edies annimas Linguagem natural Fonte: http://pt.wikipedia.org/w/index.php?oldid=6374503 Contribuidores: Eduardo Sellan III, Eduardoferreira, Gonalo Veiga, LRF, LeonardoG, Llcastro, Lourenzo, Luan, Nice poa, Nietch, OS2Warp, OffsBlink, Ozalid, Purodha, Reynaldo, Ricvelozo, Rui Silva, Santana-freitas, Stegop, Sturm, Tumnus, Wmarcosw, 20 edies annimas Programao lgica Fonte: http://pt.wikipedia.org/w/index.php?oldid=20131333 Contribuidores: Alexanderps, Leonardo.stabile, OS2Warp, OffsBlink, Pietro Roveri, 30 edies annimas Programao imperativa Fonte: http://pt.wikipedia.org/w/index.php?oldid=19656580 Contribuidores: H, Leonardo.stabile, Lus Felipe Braga, Manuel de Sousa, OS2Warp, Rustin, Xandi, 14 edies annimas Programao estruturada Fonte: http://pt.wikipedia.org/w/index.php?oldid=19784800 Contribuidores: 200.198.73.xxx, E2mb0t, Get It, GoEThe, Hgfernan, Jorge, Jorge.roberto, Lcavique, Leonardo.stabile, Moretti, OS2Warp, Ramisses, Wbrito, 13 edies annimas Orientao a objeto Fonte: http://pt.wikipedia.org/w/index.php?oldid=3899096 Contribuidores: Adailton, Agnaldo.anjos, Albmont, Alchimista, Alexandrepastre, Brunoslessa, ChristianH, Clara C., Dayane C., Denommus, Denys, Dr.Stefano, Edeyson, FML, GOE, GRS73, Giro720, Herbertdeborba, Hgfernan, Iacobus, Jorge.roberto, Joo Carvalho, Juntas, Kelving12, Lampiao, Leandromartinez, Leonardo.stabile, LeonardoG, LeonardoRob0t, Lourenzo, Lucas Avano, Lus Felipe Braga, Manuel Anastcio, MarceloB, Mauro Babinski, Nuno Tavares, OS2Warp, Pablodalloglio, Paulo Augusto Nardi, PauloColacino, Rafael.afonso, Rbourdon, Renatoalbano, Rg, Rjclaudio, Rlopes, Roma6, Romeuzinh, Santana-freitas, Sica, Tschick, Tumnus, Wanc, Xandi, Xurumelous, Yanguas, Zico J, 179 edies annimas Linguagem de programao de baixo nvel Fonte: http://pt.wikipedia.org/w/index.php?oldid=20053502 Contribuidores: Alchimista, Attom, Cesarious, Fabiano Tatsch, G51, Jeff, Leonardo.stabile, LeonardoG, Luiz Jr, OS2Warp, Rafael.afonso, Ricvelozo, Takyorama, 14 edies annimas Linguagem de programao de alto nvel Fonte: http://pt.wikipedia.org/w/index.php?oldid=19229432 Contribuidores: Astro rei, Bruno carreirao, Dvulture, E2mb0t, FML, Henriquevicente, Leonardo.stabile, Mecanismo, Nuno Tavares, OS2Warp, Rafael.afonso, Ricvelozo, Xexeo, 17 edies annimas Linguagem de programao de primeira gerao Fonte: http://pt.wikipedia.org/w/index.php?oldid=16740871 Contribuidores: EuTuga, Kleiner, Lcharallo, Ricvelozo, 1 edies annimas Linguagem de programao de segunda gerao Fonte: http://pt.wikipedia.org/w/index.php?oldid=12405214 Contribuidores: Adailton, LeonardoG, 3 edies annimas Linguagem de programao de terceira gerao Fonte: http://pt.wikipedia.org/w/index.php?oldid=17516103 Contribuidores: Adailton, Articus, LeonardoG, Nuno Tavares, Rgf, Yachee, 1 edies annimas Linguagem de programao de quarta gerao Fonte: http://pt.wikipedia.org/w/index.php?oldid=18004272 Contribuidores: Adailton, Girino, Leonardo.stabile, LeonardoG, Mschlindwein, Sergio@moredata.pt, 5 edies annimas Paradigma de programao Fonte: http://pt.wikipedia.org/w/index.php?oldid=19656651 Contribuidores: Blacks, Fbio Augusto Pandolfo, Leonardo.stabile, Lus Felipe Braga, Pietro Roveri, Pkoch, Profvalente, 22 edies annimas Programao declarativa Fonte: http://pt.wikipedia.org/w/index.php?oldid=18961958 Contribuidores: Leonardo.stabile Programao procedural Fonte: http://pt.wikipedia.org/w/index.php?oldid=19970969 Contribuidores: Giro720, Khullah, Mestre bira, Ricvelozo, Saulberardo, 2 edies annimas Programao funcional Fonte: http://pt.wikipedia.org/w/index.php?oldid=19931767 Contribuidores: Adailton, Alberto Fabiano, Ale vx, E2mb0t, FML, Joao, JoaoMiranda, Leonardo.stabile, Manuel Anastcio, Marcelo-Silva, Meirarc, Nuno Tavares, Osias, Pkoch, Rafael.afonso, 10 edies annimas Programao restritiva Fonte: http://pt.wikipedia.org/w/index.php?oldid=3367130 Contribuidores: Leonardo.stabile, Pkoch Programao orientada a aspecto Fonte: http://pt.wikipedia.org/w/index.php?oldid=18868601 Contribuidores: Coyote25, Fernando S. Aldado, Leonardo.stabile, Lus Felipe Braga, Mosca, Repolho, Rodrigozanatta, Sergio333, Zlendary, 28 edies annimas Programao genrica Fonte: http://pt.wikipedia.org/w/index.php?oldid=14343932 Contribuidores: EliasAmaral, FML, Leonardo.stabile, Lus Felipe Braga, Nuno Tavares, Rei-artur, 10 edies annimas Programao multiparadigma Fonte: http://pt.wikipedia.org/w/index.php?oldid=9758272 Contribuidores: Blacks, Fbio Augusto Pandolfo, Leandromartinez, Mecanismo, 2 edies annimas Orientao a objetos Fonte: http://pt.wikipedia.org/w/index.php?oldid=20122172 Contribuidores: Adailton, Agnaldo.anjos, Albmont, Alchimista, Alexandrepastre, Brunoslessa, ChristianH, Clara C., Dayane C., Denommus, Denys, Dr.Stefano, Edeyson, FML, GOE, GRS73, Giro720, Herbertdeborba, Hgfernan, Iacobus, Jorge.roberto, Joo Carvalho, Juntas, Kelving12, Lampiao, Leandromartinez, Leonardo.stabile, LeonardoG, LeonardoRob0t, Lourenzo, Lucas Avano, Lus Felipe Braga, Manuel Anastcio, MarceloB, Mauro Babinski, Nuno Tavares, OS2Warp, Pablodalloglio, Paulo Augusto Nardi, PauloColacino, Rafael.afonso, Rbourdon, Renatoalbano, Rg, Rjclaudio, Rlopes, Roma6, Romeuzinh, Santana-freitas, Sica, Tschick, Tumnus, Wanc, Xandi, Xurumelous, Yanguas, Zico J, 179 edies annimas Python Fonte: http://pt.wikipedia.org/w/index.php?oldid=20175763 Contribuidores: 333, Alberto Fabiano, Albmont, Alexg, Arcf br, Bisbis, Bmxer, Bons, Brandizzi, Ccero, Daemorris, Dantadd, Der kenner, Diogo RBG, Diogocolla, Emersongois, Ericof, FML, FelipeVargasRigo, Fernando S. Aldado, Ferri, Fnds, Gbiten, Girino, HumbertoDiogenes, Ivanildo Filho, Jobs1, JosemarLohn, Jurema Oliveira, Lameiro, Lawrence, Leonardo.stabile, LeonardoG, LeonardoRob0t, Lijealso, Luiz Eduardo Borges, Lus Felipe Braga, Lpton, Maddox, Mvdiogo, Nadzieja, Nuno Tavares, Onjacktallcuca, Opraco, Patrick, PatrciaR, Philipi, Piccilli, Pietro Roveri, Porantim, Pythonbr, Rafaelmrossi, Rei-artur, Ricardo Ferreira de Oliveira, Ricvelozo, Riverfl0w, Roberto Cruz, Sniper3000, Thiago R Ramos, Villarinho, Waldir, Waltercruz, ZeroUm, 103 edies annimas Java (linguagem de programao) Fonte: http://pt.wikipedia.org/w/index.php?oldid=20141442 Contribuidores: 191228.telemar.net.br, 200.246.143.xxx, 333, Adrianoucam, Alchimista, Alexanderps, Alexandredinizrodrigues, Bertoche, Bigs, Bihaiko, Bjverde, Braswiki, BrunoSupremo, Carlos-PC, Chico, Cidandrade, Claudomiro Jr, Ccero, Daimore, Daniel Silverio, Dripssouza, Eduacsp, EduardoCruz, Eduardoferreira, Ematsu, Espardo, Euproprio, FML, Fernando S. Aldado, Fernando123d, Frhakamine, Gdamasceno, Get It, Girino, Giro720, Gladstone, Hbdbim, Heldergeovane, I32542, Italo maia, Jcmo, Jonas AGX, Jorge.roberto, JorgeGG, L'AngeRouge, Leonardo.stabile, LeonardoG, LeonardoRob0t, Liclopes, Lijealso, Luckas Blade, Lus Felipe Braga, Manuel Anastcio, Marcobiscaro2112, Maxtremus, Meira, Mike.lifeguard, Mkasa, Mrcl, Mschlindwein, NH, Nortisop, Nuno Tavares, OS2Warp, Onjacktallcuca, Opraco, Orlando, Osias, Ozielneto, Paulo Eduardo Azevedo Silveira, PauloColacino, Pedro Henrique Oliveira dos santos, Pepinho, Pietro Roveri, Polonio, Porantim, Rafael.afonso, Raphael csg, Ricardo Caetano de Moraes, Ricardo Ferreira de Oliveira, Ricvelozo, Roberto Cruz, Rod, Rodrigocansian, Ruy Pugliesi, Sandr0G, Tetri, Thevirus, Thiago-manel, Trakinator, Tribal, Tumnus, Villarinho, ViniGodoy, Waldir, Waldo Jeffers, Wbrito, Wikifriend pt001, X spager, YuriSanCa, Zuke, 344 edies annimas Compilador Fonte: http://pt.wikipedia.org/w/index.php?oldid=20000178 Contribuidores: Adailton, Alessa77, Bisbis, Carlosetc, Darwinius, Diego UFCG, Dpc01, Epinheiro, Gfc, JeffersonAlves, Jorge, Jorge.roberto, Juntas, Leonardo.stabile, LeonardoG, Leslie, Mschlindwein, Nuno Tavares, Orium, PauloColacino, Pcgomes, Rafael.afonso, Ricardo Ferreira de Oliveira, Ricvelozo, Xexeo, 41 edies annimas

Fontes e Editores da Pgina


Software Fonte: http://pt.wikipedia.org/w/index.php?oldid=20068556 Contribuidores: 200.237.112.xxx, 333, Adailton, Agil, Al Lemos, Alchimista, Alexanderps, Antnio PT, Arthur Buchsbaum, Bernardovc, Bisbis, Brandizzi, Cesarious, Ciacchi, CorreiaPM, Daimore, Denesmg, Dlttorezan, Doomed-br, Eamaral, Eduardo Moraes, Eduardo P, Epinheiro, FML, Faustino.F, Fernandoacorreia, FlavioMattos, Foose, GOE, GRS73, Gbiten, Gerbilo, Get It, Gfc, Girino, Hugo lopes, HyperBroad, I2bdad, Imqnet, Jic, Jorge, Jorge.roberto, Jos Eugnio, Joo Carvalho, Langriss, Lechatjaune, Leonardo.stabile, Lijealso, Lomba, Lus Felipe Braga, Manuel Anastcio, Marco Monteiro, Marcusmbz, Mca.leite, Mosca, Mschlindwein, Mvdiogo, OS2Warp, Osias, Paulorcjr, Pedropaulovc, Petrus Yuri, Rei-artur, Reynaldo, Rjclaudio, Robson Xavier, Rodrigo Strauss, Rui Malheiro, Ruy Pugliesi, Sam, Saugusto, Sekelsenmat, Sergio Kaminski, The fabio, Tintazul, Tumnus, Vigia, Vini 175, Wanc, Whooligan, Xexeo, Youssefsan, 187 edies annimas Programador Fonte: http://pt.wikipedia.org/w/index.php?oldid=19872850 Contribuidores: Agil, Alexandrepastre, Allangothic, Bisbis, Brunosl, ChristianH, Claudiobl2010, Daemorris, DauriSouza, E2mb0t, FML, Fabricioaguirre, Fernandoacorreia, Gunnex, HyperSpace, Jaka14, Jorge, Joo Carvalho, Leonardo.stabile, Leslie, Lgrave, Lus Felipe Braga, Nuno Tavares, Onjacktallcuca, Pietro Roveri, Pilha, Rafael.afonso, Ricvelozo, Rodrigo.uivador, Ruy Pugliesi, Taikanatur, 38 edies annimas Cincia da computao Fonte: http://pt.wikipedia.org/w/index.php?oldid=20100384 Contribuidores: 555, Adailton, Alexandrepastre, Andrezc, Autanbr, Belanidia, Bigs, Bluemask, Bytes OverLoad, Campani, ChristianH, Combo, CommonsDelinker, Daemorris, Darwinius, Davidrobert, Der kenner, Devilwar, Doomed-br, Dtavares, Eamaral, Eduardo Carvalho, Eduardoferreira, Ellery Souza, Ermeson, Espardo, FML, Fabio.kon, Flipperpaulista, Gcmachado, Get It, Grandsire, Gustavob, Hgamboa, Infroger, Jmlogica, Jorge, Kaktus Kid, Lameiro, Lechatjaune, Leonardo.stabile, LeonardoG, Leslie, Lrech, Luis Dantas, Lusitana, Lus Felipe Braga, Manuel Anastcio, Marcotulio, Mca.leite, Miguelrj, Mirade, Mschlindwein, Nortisop, Nuno Tavares, OS2Warp, Onjacktallcuca, Osias, Patenko, Patrick, PatrciaR, PauloColacino, Pedrotr, RafaAzevedo, Rafael.afonso, Raimundo Norberto, Rbeninca, Rhe, Rictad, Ricvelozo, Rlopes, Roberto Cruz, Rodolfo Andrade, Rodrigo Strauss, Ruy Pugliesi, Saugusto, Sergio Kaminski, Sistema428, Sortica, Vanthorn, Victorc.rodrigues, Vsombra, Wbrito, Wesleyhen, Xandi, Xexeo, 210 edies annimas PHP Fonte: http://pt.wikipedia.org/w/index.php?oldid=20175768 Contribuidores: 333, Actualmind, Adailton, Ademirfer, Agil, Alchimista, Alisson Acioli, Alppedroso, Andreduartesp, Arges, Armagedon, Batcaverna, Beto, Biktora, Brauliobh, Bruno.pedrozo, Cereso, ChameleonBR, Clara C., Daimore, Darkelder, Darwinius, Digenes Sobral, Dougsouza01, Eamaral, Edenfall, Elementox, Emilianoeloi, Fabiobaldins, Fabiosoaza, Felipe Pena, Felipepereira, Fernando S. Aldado, Fmy 1, Fnds, GRS73, Gabrielmsf, Gasdafantauva, Gauss, Gdamasceno, Get It, Gil mnogueira, Girino, Guithack, Hahahaip, Heldergeovane, Hostbra, Ikaro C., Inerte, Inox, Ivansb, J Daglees, J Kikuchi, J0s3l1t0, Joao Junior, Joaotg, Jorl17, Kenowlee, Kinux, Kmiksi, Ksombrah, Leonardo.stabile, LeonardoG, Leslie, Lfva.amorim, Lgrave, Lijealso, Linkprotegido, Luvittor, Lus Felipe Braga, Manuel Anastcio, Mariana Silveira Tavares, Metzen, Mschlindwein, Nuno Tavares, OS2Warp, Oalexandrino, Orlando, Osias, Pablodalloglio, Patsy, Pedromerces, Pietro Roveri, Porantim, Psico, Raafael, Rafael.afonso, Rafatz, Rei-artur, Ricardo Ferreira de Oliveira, Ricvelozo, Robertorsc, Robsjc, Rodrigo Antonioli, Rodrigoluis, Ruy Pugliesi, Ryonagana, Samorimweb, Santista1982, Santosga, Sica, Sobrinhodasilva, Surkamp, Tiagolimsan, Tiagowebmaster, Tumnus, V1d4l0k4, Villarinho, Waldir, Waltercruz, Webarthur, Wikipedista, 418 edies annimas Engenharia de software Fonte: http://pt.wikipedia.org/w/index.php?oldid=19946468 Contribuidores: 200.185.142.xxx, 200.222.171.xxx, Abigar, Abmac, Adailton, Alchimista, Alessandro70, Alexg, Andr Villeneuve, Arlima, Arthur Buchsbaum, Belanidia, Bons, Brunoslessa, Chentz, Clayton1975brasilmg, Cuattrin, Daniloleke, Darwinius, Der kenner, Dietox, Ebalter, Eduamaral20, Engenharia de Software Brasil, Ermeson, FML, Felipe Pinto, Fernando S. Aldado, Furutajp, Gbiten, Get It, Girino, Hgfernan, Hugo Nagatomo, IceMan, Ikarohuhuhu, Inesalegria, Isa.souza, Jcmo, Jo Lorib, JoaoMiranda, Jorge, Jorge.roberto, Kyriosdata, Leonardo.stabile, LeonardoG, Lusitana, Lus Felipe Braga, Macau500, Manuel Anastcio, Micato, Miguelcr, Muriel Gottrop, Nuno Tavares, OS2Warp, PauloColacino, PedroBonifacio, PedroPVZ, Profvalente, Raimundo Norberto, Rbarroso, Rengolin, Rui Silva, Sergio Kaminski, Sica, ThiagoRuiz, Tjk4236b, Tonsig, Tumnus, Vigia, Xexeo, ZiroCool, 220 edies annimas Cdigo de mquina Fonte: http://pt.wikipedia.org/w/index.php?oldid=19622940 Contribuidores: Bons, Cesarious, ChristianH, Fabsouza1, Gbiten, Leonardo.stabile, LeonardoRob0t, Lusitana, Michelmfb, Osias, Ricvelozo, Wbrito, Xexeo, 22 edies annimas Linguagem de montagem Fonte: http://pt.wikipedia.org/w/index.php?oldid=20153090 Contribuidores: Agil, Alfheim, Arthyole, Carlos Rosa PT, Cesarious, Claudir, Darkelder, Der kenner, Econt, Fabsouza1, Gbiten, Jorge, Leonardo.stabile, LeonardoG, Luiz Jr, OS2Warp, Orium, Orlando, Ricvelozo, Rogerio Correa, SaintCahier, Xthrx, 46 edies annimas

108

Fontes, licenas e editores da imagem

109

Fontes, licenas e editores da imagem


Ficheiro:Primoc.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Primoc.png Licena: Creative Commons Attribution-Sharealike 2.5 Contribuidores: Meno25, Paulorcjr, WikipediaMaster, 2 edies annimas Ficheiro:Text-x-python.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Text-x-python.svg Licena: GNU General Public License Contribuidores: Vinicius Depizzol Ficheiro: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, Michael Reschke, Red Rooster Ficheiro:Python script.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Python_script.svg Licena: desconhecido Contribuidores: Ae, Bibi Saint-Pol Ficheiro:Nt-compilador.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Nt-compilador.png Licena: Creative Commons Attribution-Sharealike 2.5 Contribuidores: User:Nuno Tavares Ficheiro:OpenOffice.org Writer.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:OpenOffice.org_Writer.png Licena: GNU Lesser General Public License Contribuidores: http://hacktolive.org/ Ficheiro:Kugleramme.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Kugleramme.jpg Licena: Public Domain Contribuidores: German, Maksim, Noe, 2 edies annimas Ficheiro:Al-Khwarizmi.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Al-Khwarizmi.jpg Licena: Public Domain Contribuidores: Moez Ficheiro:Ada Lovelace.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Ada_Lovelace.jpg Licena: desconhecido Contribuidores: Gene.arboit, Kilom691, ManuelGR, PMG, Thuresson, Viriditas, Wst, 4 edies annimas Ficheiro:Turing Machine.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Turing_Machine.png Licena: Public Domain Contribuidores: Darapti, Porao Imagem:cquote1.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Cquote1.svg Licena: Public Domain Contribuidores: Adambro, Editor at Large, Infrogmation, 1 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 Ficheiro:PHP-logo.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:PHP-logo.svg Licena: desconhecido Contribuidores: Biktora

Licena

110

Licena
Creative Commons Attribution-Share Alike 3.0 Unported http:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/

Das könnte Ihnen auch gefallen