Beruflich Dokumente
Kultur Dokumente
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
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 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.
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.
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.
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.
Programao lgica
14
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
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
19
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
20
Ver tambm
Linguagem de mquina Linguagem de programao de baixo nvel Linguagem de programao
21
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.
22
23
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
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.
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
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
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
33
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.
35
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
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
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 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]
39
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/
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.
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.
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
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
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
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]
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
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
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
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
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
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
Windows
ActiveState
multiplataforma
Fabio Zadrozny
1.3.13
EPL
mmm-experts Stani
MIT GPL
Wingware
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
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)
61
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]
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.
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"); } }
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)
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 {
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;
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)
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
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] .
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 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
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.
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
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.
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.
Equipamentos eletrnicos
Robtica o controle do comportamento de robs. Sistemas digitais.
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
procedural, reflexo, orientao a objeto, funcional 1995 5.3.2 (4 de Maro, 2010) Rasmus Lerdof
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.
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
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.
Engenharia de software Formal - implementao a partir de modelo matemtico formal. gil RAD Quarta gerao
95
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
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
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.
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.
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.
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
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
Linguagem de montagem
105
;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
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
107
108
109
Licena
110
Licena
Creative Commons Attribution-Share Alike 3.0 Unported http:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/