Abrir menu principal

Alterações

2 308 bytes removidos, 22h41min de 19 de agosto de 2016
Ajustes parâmetros obseletos, typos fixed: inteligencia → inteligência, simbolos → símbolos utilizando AWB
[[Imagem:DeCSS.PNG|thumb|300px|Trecho de programa na linguagem de programação [[C (linguagem de programação)|C]].]]
 
Uma '''linguagem de programação''' é um método padronizado para comunicar [[Código de máquina|instruções]] para um [[computador]].<ref name="dershem">{{Citar livro|autor=Dershem, Herbert L.; Jipping, Michael J.|título=Programming Languages|subtítulo=Structures and models|idioma=inglês|edição=2ª|local=Boston|editora=PWS Publishing Company|ano=1995|páginas=432|página=1|volumes=|volume=|isbn=0-534-94740-9}}</ref> É um conjunto de [[sintaxe|regras sintáticas]] e semânticas usadas para definir um [[programa de computador]].<ref name="fischer">{{Citar livro|autor=Fischer, Alice E.; Grodzinsky, Frances|título=The Anatomy of Programming Languages|subtítulo=|idioma=inglês|edição=|local=Englewood Cliffs, New Jersey|editora=Prentice Hall|ano=1993|páginas=557|página=3|volumes=|volume=|isbn=0-13-035155-5}}</ref><ref group=Nota>Edsger Dijkstra em seu livro ''A Discipline of Programming'' assim define as linguagens de programação: "Eu vejo uma linguagem de programação principalmente como um veículo para a descrição (potencialmente muito sofisticada) de mecanismos abstratos" {{Citar livro|autor=Dijkstra, Edsger W|título=A Discipline of Programming|subtítulo=|idioma=inglês|edição=|local=Englewood Cliffs, New Jersey|editora=Prentice Hall|ano=1976|páginas=217|página=9|volumes=|volume=|isbn=0-13-215871-X}}</ref> Permite que um programador especifique precisamente sobre quais dados um computador vai atuar, como estes dados serão armazenados ou transmitidos e quais ações devem ser tomadas sob várias circunstâncias. Linguagens de programação podem ser usadas para expressar [[algoritmo]]s com precisão.
 
O conjunto de palavras (''lexemas'' classificados em ''tokens''), compostos de acordo com essas regras, constituem o [[código fonte]] de um [[software]].<ref name="aho">{{Citar livro|Autorautor = Aho, Alfred V.; Lam, Monica S.; Sethi, Ravi; Ullman, Jeffrey D|título= Compiladores|subtítulo=Princípios, técnicas e ferramentas|local=São Paulo|Editoraeditora = Addison-Wesley, Pearson|Anoano = 2008|língua3=|páginas=634|página=3-5|isbn=978-85-88639-24-9}}</ref> Esse código fonte é depois traduzido para [[código de máquina]], que é executado pelo [[processador]].<ref name="aho" />
 
Uma das principais metas das linguagens de programação é que programadores tenham uma maior produtividade, permitindo expressar suas intenções mais facilmente do que quando comparado com a linguagem que um computador entende nativamente (código de máquina).<ref name="melo">{{Citar livro|Autorautor =Melo, Ana Cristina Vieira de; Silva, Flávio Soares Corrêa da|título= Princípios de Linguagens de Programação|subtítulo=|local=São Paulo|Editoraeditora =Edgard Blücher Ltda|Anoano = 2003|língua3=|páginas=211|página=7-11|isbn=85-212-0322-5}}</ref> Assim, linguagens de programação são projetadas para adotar uma sintaxe de nível mais alto, que pode ser mais facilmente entendida por programadores humanos. Linguagens de programação são ferramentas importantes para que [[Programação de computadores|programadores]] e [[Engenharia de software|engenheiros de software]] possam escrever programas mais organizados e com maior rapidez.
 
Linguagens de programação também tornam os programas menos dependentes de computadores ou ambientes computacionais específicos (propriedade chamada de portabilidade<ref name="van">{{Citar livro|Autorautor=Hannan, James (editor); Oliver, Paul (autor do capítulo)|título=Computer Programming Management|subtítulo=|capítulo=6-Program Portability|local=New York|Editoraeditora =Van Nostrand Reinhold|Anoano = 1982|língua3=|páginas=155|página=89-100|isbn=0-442-20920-7}}</ref>). Isto acontece porque programas escritos em linguagens de programação são traduzidos para o código de máquina do computador no qual será executado em vez de ser diretamente executado. Uma meta ambiciosa do [[Fortran]], uma das primeiras linguagens de programação, era esta independência da máquina onde seria executada.<ref>{{Citar livro|autor=Sammet, Jean E|título=Programming Languages: History and Fundamentals|subtítulo=|idioma=inglês|edição=|local=Englewood Cliffs, New Jersey|editora=Prentice Hall|ano=1969|páginas=785|página=14-16|volumes=|volume=|isbn=0-13-729988-5}}</ref><ref name="ieee">{{citar jornal |último=Backus|primeiro=John|coautores=|anodata=julho 1979|mes=julho|titulo=The History of Fortran I, II, and III|jornal= Annals of The History of Computing|volume=1|número=1|páginas = 80|editora=American Federation of Information Processing Societies|local=Arlington, VA | issn = 1058-6180|idioma=ingles}}</ref>
 
== História ==
[[Imagem:Ada Lovelace portrait.jpg|thumb|esquerda|[[Ada Lovelace]] em [[1840]].]]
[[Imagem:Grace Hopper.jpg|thumb|[[Grace Hopper]] em [[1984]].]]
O primeiro trabalho de linguagem de programação foi criado por [[Ada Lovelace]], grande amiga de [[Charles Babbage]].<ref name="ada">{{citar jornal|ultimo=Huskey|primeiro=Velma R.|coautores=Huskey, Harry D.|anodata=Outubro 1980|mes=Outubro|titulo=Lady Lovelace and Charles Babbage|jornal=Annals of The History of Computing|volume=2|número=4|paginas=384|página=299-329|editora = American Federation of Information Processing Societies | local = Arlington, VA | issn = 1058-6180|idioma=inglês}}</ref> O projeto da primeira calculadora mecânica programável foi idealizado por [[Charles Babbage]]<ref name=breton>{{Citar livro|url= |autor=Breton, Philippe|titulo=História da Informática|subtítulo= |idioma= |edição= |local=São Paulo |editora=UNESP|ano=1991|páginas=260|página=68-69 |volumes= |volume= |isbn= 85-7139-021-5}}</ref> que, após gastar fortunas e um longo tempo, não conseguiu concretizar o projeto.<ref name=gonick>{{Citar livro|url= |autor=[[Larry Gonick|Gonick, Larry]]|titulo=Introdução Ilustrada à Computação|subtítulo= |idioma= |edição= |local=São Paulo |editora=Harper & Row do Brasil|ano=1984|páginas=242|página=51-59 |volumes= |volume= |isbn=}}</ref> A linguagem de programação [[Ada (linguagem de programação)|ADA]] foi batizada em homenagem a esta primeira programadora.<ref name=smith>{{Citar livro|autor=Smith, James F,; Frank, Thomas S|título=Introduction to Programming Concepts and Methods with Ada|subtítulo=|língua3língua=en|edição=|local=Nova Iorque, EUA|editora=McGraw-Hill|ano=1994|páginas=545|página=7-8|volumes=|volume=|isbn=0-07-911725-2}}</ref>
 
Uma das primeiras linguagens de programação para computadores foi provavelmente [[Plankalkül]], criada por [[Konrad Zuse]] na [[Alemanha Nazista]],<ref name="zuse">{{citar jornal|ultimo=Zuse|primeiro=Konrad|coautores=|anodata=Julho 1980|mes=Julho|titulo=Installation of the German Computer Z4 in Zurich in 1950|jornal=Annals of The History of Computing|volume=2|número=3|paginas=384|página=239-241|editora = American Federation of Information Processing Societies | local = Arlington, VA | issn = 1058-6180|idioma=inglês}}</ref> mas que teve pouco ou nenhum impacto no futuro das linguagens de programação.
 
O primeiro compilador foi escrito por [[Grace Hopper]],<ref>{{Citar livro|último=Lemone|primeiro=Karen A.|título=Fundamentals of Compilers|subtítulo=An Introduction to Computer Language Translation|língua3língua=en|edição=|local=Boca Raton|editora=CRC|ano=1992|páginas=184|volumes=|volume=|isbn= 0-8493-7341-7}}</ref> em 1952, para a linguagem de programação [[Sistema A-0|A-0]].<ref name=wexel>{{Citar livro|autor=Wexelblat, Richard L.(Editor)|título=History of Programming Languages|subtítulo=|idioma=|edição=|local=New York|editora=Academic Press|ano=1981|páginas=758|página=6-15|volumes=|volume=|isbn= 0-12-745040-8}}</ref> A primeira linguagem de programação de alto nível amplamente usada foi [[Fortran]], criada em 1954.<ref name=wexel /><ref name="hctc">{{Citar livro|autor=Metropolis, N.(Ed.); Howlett, J.(Ed.); Rota, Gian-Carlo(Ed.)|título=A History of Computing in the Twentieth Century|subtítulo=A collection of essays|idioma=inglês|edição=|local=New York|editora=Academic Press|ano=1980|páginas=130-131|volumes=|volume=|isbn= 0-12-491650-3}}</ref><ref name=wexel /> Em 1957 foi criada [[B-0]], sucessora da A-0, que daria origem a [[Flow-Matic]] (1958), antecessor imediato de [[COBOL]], de 1959.<ref name=cobol>{{Citar livro|autor=Wexelblat, Richard L.(Editor)|título=History of Programming Languages|subtítulo=|idioma=|edição=|local=New York|editora=Academic Press|ano=1981|páginas=758|página=199-278|volumes=|volume=|isbn= 0-12-745040-8}}</ref> O COBOL foi uma linguagem de ampla aceitação para uso comercial.<ref name=cobol /> A linguagem [[ALGOL]] foi criada em 1958-1960<ref name=algol>{{Citar livro|autor=Horowitz, Ellis (editor do livro); Nauer, P. (editor do capítulo)|título=Programming Languages|subtítulo=A Grand Tour|capítulo=Report on the Algorithmic Language ALGOL 60|idioma=inglês|edição=3ª|local=New York|editora=Academic Press|ano=1987|páginas=512|página=44-60|volumes=|volume=|isbn=0-88175-142-1}}</ref> O ALGOL-60 teve grande influência no projeto de muitas linguagens posteriores.<ref name=algol2>{{Citar livro|autor=Horowitz, Ellis (editor do livro); Knuth, D. E|título=Programming Languages|subtítulo=A Grand Tour|capítulo=The Remaining Troublespots in ALGOL 60|idioma=inglês|edição=3ª|local=New York|editora=Academic Press|ano=1987|páginas=512|página=61-68|volumes=|volume=|isbn=0-88175-142-1}}</ref>
 
A linguagem [[Lisp]] foi criada em [[1958]] e se tornou amplamente utilizada na pesquisa na área de [[ciência da computação]] mais proeminentemente na área de [[Inteligência Artificial]].<ref name="pratt">{{Citar livro|autor=Pratt, Terrence W.; Zelkowitz, Marvin V|título=Programming Languages|subtítulo=Design and Implementation|idioma=inglês|edição=4ª|local=Upper Saddle River, New Jersey|editora=Prentice hall|ano=2001|páginas=649|página=420-421|volumes=|volume=|isbn=0-13-027678-2}}</ref> Outra linguagem relacionada ao campo da IA que surge em 1972 é a linguagem [[Prolog]], uma linguagem do paradigma lógico.<ref name="prolog">{{Citar livro|autor=Gray, Peter|título=Logic, Algebra and Databases|subtítulo=|capítulo=Representing programs by clauses: Prolog|idioma=inglês|edição=|local=Chichester|editora=Ellis Horwood|ano=1984|páginas=294|página=73|volumes=|volume=|isbn=0-85312-709-3}}</ref>
 
A [[orientação a objetos]] é outro marco importante na história das linguagens de programação. A linguagem [[Simula 67]] introduz o conceito de classes.<ref name="horowitz">{{Citar livro|autor=Horowitz, Ellis|título=Fundamentals of Programming Languages|subtítulo=|idioma=inglês|edição=2ª|local=Rockville, Maryland|editora=Computer Science Press|ano=1984|páginas=446|página=17|volumes=|volume=|isbn=0-088175-004-2}}</ref> A linguagem [[Smalltalk]]<ref name="goldberg">{{Citar livro|autor=Goldberg, Adele; Robson, David|título=Smalltalk-80|subtítulo=The language|idioma=inglês|edição=|local=Reading, Massachusetts|editora=Addison-Wesley|ano=1989|páginas=591|volumes=|volume=|isbn=0-201-13688-0}}</ref><ref name="lewis">{{Citar livro|autor=Lewis, Simon|título=The Art and Science of Smalltalk|subtítulo=An Introduction to Object-Oriented Programming using VisualWorks|idioma=inglês|edição=|local=London|editora=Prentice Hall|ano=1995|páginas=212|volumes=|volume=|isbn=0-13-371345-8}}</ref> expande o conceito de classes e se torna a primeira linguagem de programação que oferecia suporte completo à programação orientada a objetos.<ref name="sebesta">{{Citar livro|autor=Sebesta, Robert W|título=Conceitos de Linguagens de Programação|subtítulo=|idioma=|edição=9ª|local=Porto Alegre|editora=Bookman|ano=2010|páginas=792|página=108-131|volumes=|volume=|isbn=978-85-7780-791-8}}</ref> A linguagem [[C++]] (originalmente conhecida como C com classes) populariza a orientação a objetos.<ref name="schildt">{{Citar livro|autor=Schildt, Herbert|título=C++|subtítulo=The Complete Reference|idioma=inglês|edição=3ª|local=Berkeley|editora=McGra-Hill|ano=1998|páginas=1008|página=256|volumes=|volume=|isbn=0-07-882476-1}}</ref>
 
Diversas linguagens de programação surgiram desde então. Entre estas incluem-se [[C♯]],<ref name="liberty">{{Citar livro|autor=Liberty, Jesse|título=Programming C#|subtítulo=|idioma=inglês|edição=2ª|local=Beijing|editora=O´Reilly|ano=2002|páginas=629|volumes=|volume=|isbn=0-596-00309-9}}</ref> [[VB.NET]], [[Linguagem de programação Java|Java]], [[Object Pascal]], [[Objective-C]], [[PHP]], [[Python]],<ref name="Lutz">{{Citar livro|autor=Lutz, Mark|título=Programming Python|subtítulo=|idioma=inglês|edição=2ª|local=Beijing|editora=O´Reilly|ano=2001|páginas=1255|volumes=|volume=|isbn=0-596-00085-5}}</ref> [[SuperCollider]], [[D (linguagem de programação)|linguagem D]]<ref>{{citar web |url=http://www.wired.com/2014/07/d-programming-language/ |título=The Next Big Programming Language You’ve Never Heard Of |acessodata= |autor=Cade Metz |coautores= |data=7 de julho, 2014 |ano= |mes= |formato= |obra=[[Wired]] |publicado=[[Condé Nast Publications]] |páginas= |língua=Inglês|língua2= |língua3= |lang= |citação=Today, Alexandrescu is a research scientist at Facebook, where he and a team of coders are using [[D (linguagem de programação)|D]] to refashion small parts of the company’s massive operation.}}</ref> e [[Ruby (linguagem de programação)|Ruby]].<ref name="thomas">{{Citar livro|autor=Thomas, Dave|título=Programming Ruby 1.9|subtítulo=The Pragmatic Programmers´Guide|idioma=inglês|edição=|local=Raleigh, North Carolina|editora=O´Reilly|ano=2002|páginas=930|volumes=|volume=|isbn=1-934356-08-5}}</ref><ref group=Nota>Para um mapa abrangente da história das linguagens de programação ver: {{Citar web |url=http://www.levenez.com/lang/history.html |título=Mapa da história das linguagens de programação |língua=inglês |publicado= |acessodata=1 de dezembro de 2010}}</ref>
 
== Interpretação e compilação ==
[[Imagem:Nt-compilador.png|thumb|esquerda|100px|O processo da compilação.]]
Uma linguagem de programação pode ser convertida, ou traduzida, em código de máquina por [[compilador|compilação]] ou interpretada por um processo denominado [[interpretadores|interpretação]]. Em ambas ocorre a '''tradução''' do código fonte para código de máquina.<ref>{{Citar livro|último= Cooper|primeiro=Torczon|título= Engineering a Compiler|local=San Francisco|Editoraeditora = Morgan Kaufmann|Anoano = 2003|língua3língua=en|página=2|isbn= 1-55860-698-X}}</ref>
 
Se o método utilizado traduz todo o texto do programa (também chamado de código), para só depois executar<ref group=Nota>ou rodar, como se diz no jargão da computação</ref> o programa, então diz-se que o programa foi compilado e que o mecanismo utilizado para a tradução é um compilador (que por sua vez nada mais é do que um programa).<ref name=principles>{{Citar livro|último=[[Alfred Aho|Aho]]|primeiro=Alfred V.|coautor=Ullman, Jeffrey D.|título=Principles of Compiler Design|subtítulo=|língua3língua=en|edição=|local=Reading, Massachusetts, EUA|editora=Addison-Wesley|ano=1977|páginas=604|página=1|volumes=|volume=|isbn= 0-201-00022-9}}</ref> A versão compilada do programa tipicamente é armazenada, de forma que o programa pode ser executado um número indefinido de vezes sem que seja necessária nova compilação, o que compensa o tempo gasto na compilação. Isso acontece com linguagens como [[Pascal (linguagem de programação)|Pascal]]<ref name="pacitti">{{Citar livro|autor=[[Tércio Pacitti|Pacitti, Tércio]]; Aktinson, Cyril P; Teles, Antonio Anibal de Souza (autor do apêndice 4a)|título=Programação e Métodos Computacionais|idioma=|edição=4ª|local=Rio de Janeiro|editora=LTC|ano=1983|páginas=431|página=293|volumes=2|volume=1|isbn=85-216-0283-9}}</ref> e [[C (linguagem de programação)|C]].
 
Se o texto do programa é executado à medida que vai sendo traduzido, como em [[JavaScript]], [[BASIC]], [[Python]] ou [[Perl]], num processo de tradução de trechos seguidos de sua execução imediata, então diz-se que o programa foi interpretado e que o mecanismo utilizado para a tradução é um interpretador. Programas interpretados são geralmente mais lentos do que os compilados, mas são também geralmente mais flexíveis, já que podem interagir com o ambiente mais facilmente.<ref name=scott>{{Citar livro|autor=Scott, Michael L|título=Programming Language Pragmatics|subtítulo=|língua3língua=en|edição=2ª|local=Boston|editora=Morgan Kauffman|ano=2006|páginas=875|página=14-15|volumes=|volume=|isbn=978-0-12-633951-2}}</ref>
 
Embora haja essa distinção entre [[Linguagem interpretada|linguagens interpretadas]] e [[Linguagem compilada|compiladas]], as coisas nem sempre são tão simples. Há linguagens compiladas para um código de máquina virtual (sendo esta ''[[máquina virtual]]'' apenas mais um software, que emula a máquina virtual sendo executado em uma máquina real), como [[Java (linguagem de programação)|Java]]<ref name=java2>{{Citar livro|último=Schildt|primeiro=Herbert|título=Java 2|subtítulo=The Complete reference|língua3língua=en|edição=4ª|local=Berkeley|editora=McGraw-Hill|ano=2001|páginas=1076|volumes=|volume=|isbn=0-07-213084-9}}</ref> (compila para a [[plataforma Java]]<ref name=jit>{{Citar livro|último=Engel|primeiro=Joshua|título=Programming for the Java Virtual Machine|subtítulo=|língua3língua=en|edição=|local=Reading, Massachusetts|editora=Addison & Wesley|ano=1999|páginas=488|página=355|volumes=|volume=|isbn=0-201-30972-6}}</ref>) e [[C♯]] (compila para a [[Common Language Infrastructure|plataforma CLI]]<ref name=msil>{{Citar livro|último=Cough|primeiro=John|título=Compiling for the .NET Common Language Runtime (CLR)|subtítulo=|língua3língua=en|edição=|local=Upper Saddle River|editora=Prentice Hall|ano=2002|páginas=391|página=2-12|volumes=|volume=|isbn=0-13-062296-6}}</ref>). E também há outras formas de interpretar em que os [[Código fonte|códigos fontes]], ao invés de serem interpretados linha-a-linha, têm blocos "compilados" para a memória, de acordo com as necessidades, o que aumenta a performance dos programas quando os mesmos módulos são chamados várias vezes, técnica esta conhecida como [[JIT]].
 
Como exemplo, podemos citar a linguagem Java. Nela, um compilador traduz o código java para o código intermediário (e portável) da JVM. As JVMs originais interpretavam esse código, de acordo com o código de máquina do computador hospedeiro, porém atualmente elas compilam, segundo a técnica JIT o código JVM para código hospedeiro.
 
A tradução é tipicamente feita em várias fases, sendo as mais comuns a [[análise léxica]], a [[análise sintática]] (ou ''[[Parser|parsing]]''), a [[geração de código]] e a [[otimização]].<ref name=holmes>{{Citar livro|último=Holmes|primeiro=Jim|título=Object-Oriented Compiler Construction|subtítulo=|língua3língua=en|edição=|local=Englewood Cliffs, Nova Jersey|editora=Prentice Hall|ano=1995|páginas=483|página=2-3|volumes=|volume=|isbn= 0-13-630740-X}}</ref> Em compiladores também é comum a geração de código intermediário.<ref group=Nota>Veja também [[Compilador]].</ref>
 
== Conceitos ==
=== Programação estruturada ===
Programação estruturada é uma forma de programação de computadores que preconiza que todos os programas possíveis podem ser reduzidos a apenas três estruturas: sequência, decisão e repetição.<ref name=structured>{{Citar livro|autor=Dahl, O. J.; Dijkstra, E. W.; Hoare, C. A . R|título=Structured Programming|subtítulo=|capítulo=I-Notes on Structured Programming|idioma=inglês|edição=|local=London|editora=Academic Press|ano=1972|páginas=220|página=1-82|volumes=|volume=|isbn=0-12-200550-3}}</ref> Um dos primeiros a preconizar a programação estruturada foi [[Haskell Curry|Haskell B. Curry]]<ref name=selected>{{Citar livro|autor=Knuth, Donald E|título=Selected Papers on Computer Languages|subtítulo=|capítulo=1-The Early Development of Programming Languages|idioma=inglês|edição=|local=Ventura Hall, Stanford|editora=CSLI|ano=2003|páginas=594|página=1-94|volumes=|volume=|isbn=1-57586-382-0}}</ref><ref group=Nota>Citação de Knuth do memorando de Curry: "O primeiro passo no planejamento do programa é o de analisar a computação em certas partes principais, chamadas aqui de divisões, de modo que o programa possa ser sintetizado a partir delas. As partes principais devem ser tais que, ou pelo menos algumas delas, são cálculos independentes em si próprios, ou modificações desses cálculos." em: {{Citar livro|autor=Knuth, Donald E|título=Selected Papers on Computer Languages|subtítulo=|capítulo=1-The Early Development of Programming Languages|idioma=inglês|edição=|local=Ventura Hall, Stanford|editora=CSLI|ano=2003|páginas=594|página=17|volumes=|volume=|isbn=1-57586-382-0}}</ref> Tendo, na prática, sido transformada na Programação modular, a Programação estruturada orienta os programadores para a criação de estruturas simples em seus programas, usando as sub-rotinas e as funções. Foi a forma dominante na criação de software entre a programação linear e a programação orientada por objetos.<ref name=tucker>{{Citar livro|autor=Tucker, Allen; Noonan, Robert|título=Programming Languages|subtítulo=Principles and paradigms|idioma=inglês|edição=|local=Boston|editora=McGraw-Hill|ano=2002|páginas=411|página=170-185|volumes=|volume=|isbn=0-07-238111-6}}</ref> Apesar de ter sido sucedida pela programação orientada por objetos, pode-se dizer que a programação estruturada ainda é marcantemente influente, uma vez que grande parte das pessoas ainda aprendem programação através dela. Porém, a orientação a objetos superou o uso das linguagens estruturadas no mercado.<ref name="tiobe" />
 
=== Programação modular ===
[[Imagem:Niklaus Wirth, UrGU.jpg|thumb|200px|[[Niklaus Wirth]] em [[2005]]. Criador da linguagem [[Pascal (linguagem de programação)|Pascal]] entre outras.]]
Programação modular é uma forma de programação no qual o desenvolvimento das rotinas de programação é feito através de módulos, que são interligados entre si através de uma interface comum.<ref name="guezzi">{{Citar livro|autor=Guezzi, Carlo; Jazayeri, Mehdi|título=Programming Language Concepts|subtítulo=|idioma=inglês|edição=3ª|local=New York|editora=John Wiley & Sons|ano=1998|páginas=427|página=7|volumes=|volume=|isbn=0-471-10426-4}}</ref> Foi apresentado originalmente pela Information & Systems Institute, Inc. no National Symposium on Modular Programming em 1968, com a liderança de Larry Constantine. Exemplos de linguagens que orientaram seu projeto para este aspecto estão as linguagens [[Modula-2]],<ref name="modula2">{{Citar livro|autor=Wirth, Niklaus|título=Programando em Modula 2|subtítulo=|idioma=|edição=|local=Rio de Janeiro|editora=LTC|ano=1989|páginas=207|página=|volumes=|volume=|isbn=85-216-0658-3}}</ref><ref name="silva">{{Citar livro|autor=Silva, José carlos G.; Assis, Fidelis Sigmaringa G. de|título=Linguagens de Programação|subtítulo=Conceitos e Avaliação|idioma=|edição=|local=Rio de Janeiro|editora=McGraw-Hill/Embratel|ano=1988|páginas=213|página=125|volumes=|volume=|id=CDD-001.6424}}</ref> desenvolvida por [[Niklaus Wirth]] e a [[Modula-3]].<ref name="modula3">{{Citar livro|autor=Harbison, Samuel P|título=Modula-3|subtítulo=|idioma=inglês|edição=|local=New York|editora=Prentice-Hall|ano=1992|páginas=312|página=|volumes=|volume=|isbn=0-13-596404-0}}</ref>.
 
=== Programação orientada a objetos ===
[[Orientação a objetos]], também conhecida como '''Programação Orientada a Objetos''' (POO), ou ainda em inglês ''Object-Oriented Programming'' (OOP) é um [[paradigma de programação|paradigma de análise, projeto e programação]] de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de [[Objeto (ciência da computação)|objetos]]. O extensivo uso de objetos, particularmente em conjunção com o mecanismo de [[Herança (programação)|herança]], caracteriza o estilo de programação orientada a objetos.<ref name=friedman>{{Citar livro|autor=Friedman, Daniel P.; Wand, Mitchell; haynes, Christopher T|título=Essentials of Programming Languages|subtítulo=|idioma=inglês|edição=|local=Cambridge, Massachusetts|editora=MIT Press|ano=1998|páginas=536|página=214|volumes=|volume=|isbn=0-262-06145-7}}</ref> Em alguns contextos, prefere-se usar [[UML|modelagem orientada ao objeto]] (UML), em vez de programação. De fato, o paradigma "orientação a objetos" tem bases conceituais e origem no campo de estudo da cognição, que influenciou a área de inteligenciainteligência artificial e da lingüística no campo da abstração de conceitos do mundo real. Na qualidade de método de modelagem, é tida como a melhor estratégia, e mais natural, para se eliminar o "gap semântico", dificuldade recorrente no processo de modelar o mundo real, no domínio do problema, em um conjunto de componentes de software que seja o mais fiel na sua representação deste domínio. Facilitaria a comunicação do profissional modelador e do usuário da área alvo, na medida em que a correlação da simbologia e conceitos abstratos do mundo real e da ferramenta de modelagem (conceitos, terminologia, símbolos, grafismo e estratégias) fosse a mais óbvia, natural e exata possível. A análise e projeto orientados a objetos tem como meta identificar o melhor conjunto de objetos para descrever um sistema de software.<ref name=sommerville>{{Citar livro|autor=Sommerville, Ian|título=Software Engineering|subtítulo=|idioma=inglês|edição=6ª|local=Harlow|editora=Addison-Wesley|ano=2001|páginas=693|página=272-273|volumes=|volume=|isbn=0-201-39815-X}}</ref> O funcionamento deste sistema se dá através do relacionamento e troca de [[Mensagem (programação)|mensagens]] entre estes objetos. Na programação orientada a objetos, implementa-se um conjunto de [[Classe (programação)|classes]] que definem os objetos presentes no sistema de software. Cada classe determina o comportamento (definido nos [[Método (programação)|métodos]]) e estados possíveis ([[Atributo (programação)|atributos]]) de seus objetos, assim como o relacionamento com outros objetos.<ref name="guezzi" />
 
=== Programação linear ===
Em matemática, problemas de Programação Linear são problemas de otimização nos quais a função objetivo e as restrições são todas lineares.<ref name="bregalda">{{Citar livro|autor=Bregalda, Paulo F.; Oliveira, Antonio A. F. de; Bornstein, Cláudio T|título=Introdução à Programação Linear|subtítulo=|idioma=|edição=3ª|local=Rio de Janeiro|editora=Campus|ano=1988|páginas=329|página=61|volumes=|volume=|isbn=85-7001-342-6}}</ref> Programação Linear é uma importante área da otimização por várias razões. Muitos problemas práticos em pesquisa operacional podem ser expressos como problemas de programação linear. Certos casos especiais de programação linear, tais como problemas de ''network flow'' e problemas de ''multicommodity flow'' são considerados importantes o suficiente para que se tenha gerado muita pesquisa em algoritmos especializados para suas soluções. Vários algoritmos para outros tipos de problemas de otimização funcionam resolvendo problemas de PL como sub-problemas. Historicamente, ideias da programação linear inspiraram muitos dos conceitos centrais de teoria da otimização, tais como dualidade, decomposição, e a importância da convexidade e suas generalizações.
 
== Classificação ==
* Linguagens [[Orientação a objetos|orientadas a objeto]]
* Linguagens de aplicação especializada
* Linguagens de altíssimo nível<ref group=Nota>Sussman et al. menciona que as linguagens de altíssimo nível são programadas em termos de sentenças declarativas. Em: {{Citar livro|autor=Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie|título=Structure and Interpretation of Computer Programs|subtítulo=|idioma=inglês|edição=2ª|local=Cambridge, Massachusetts|editora=McGraw-Hill|ano=1996|páginas=640|página=22|volumes=|volume=|isbn=0-07-000484-6}}</ref>
 
=== Quanto ao paradigma ===
{{Artigo principal|Paradigma de programação}}
Diferentes linguagens de programação podem ser agrupadas segundo o paradigma que seguem para abordar a sua sintaxe e semântica. Os paradigmas se dividem em dois grandes grupos: [[Programação imperativa|imperativo]] e [[Programação declarativa|declarativo]].<ref name=appleby>{{Citar livro|autor=Appleby, Doris; VandeKopple, Julius J|título=Programming Languages|subtítulo=Paradigm and Practice|língua3língua=en|edição=2ª|local=New York|editora=McGraw-Hill|ano=1997|páginas=444|página=8-13|volumes=|volume=|isbn=0-07-005315-4}}</ref>
 
==== Paradigmas Imperativos ====
* [[Programação procedural|O paradigma procedural]]. Neste paradigma, os programas são executados através de chamadas sucessivas a procedimentos separados. Exemplos de linguagens deste paradigma são o [[Fortran]] e o [[BASIC]].
* [[Programação estruturada|O paradigma de estruturas de blocos]].<ref name=appleby /> A característica marcante deste paradigma são os escopos aninhados. Exemplos de linguagens deste paradigma são o [[Algol 60]], [[Pascal (linguagem de programação)|Pascal]]<ref name="pacitti" /> e [[C (linguagem de programação)|C]].
* [[Orientação a objetos|O paradigma de orientação a objetos]]. Este paradigma descreve linguagens que suportam a interação entre objetos. Exemplos de linguagens deste paradigma são [[C++]],<ref name="schildt" />, [[D (linguagem de programação)|linguagem D]],<ref>{{citar web |url=http://dlang.org/overview.html |título=Overview - D Programming Language |acessodata=28 jul 2014 |autor= |coautores= |data= |ano= |mes= |formato= |obra=dlang.org |publicado= |páginas= |língua=Inglês |língua2= |língua3= |lang= |citação=[[D (linguagem de programação)|D]] programs can be written either in C style function-and-data, C++ style object-oriented, C++ style template metaprogramming, or any mix of the three. }}</ref> [[Java (linguagem de programação)|Java]], [[Python]]<ref name="Lutz" /> e [[Ruby (linguagem de programação)|Ruby]].<ref name="thomas" />
* [[Computação distribuída|O paradigma da computação distribuída]]. Este paradigma suporta que mais de uma rotina possa executar independentemente.<ref name="watt">{{Citar livro|autor=Watt, David A|título=Programming Language Concepts and Paradigms|subtítulo=|capítulo=11-The Concurrent Programming Paradigm|idioma=inglês|edição=|local=New York|editora=Prentice Hall|ano=1990|páginas=322|página=205-218|volumes=|volume=|isbn=0-13-728866-2}}</ref> Um exemplos de linguagem deste paradigma é a linguagem [[Ada (linguagem de programação)|Ada]].
 
==== Paradigmas Declarativos ====
Os paradigmas declarativos são aqueles nos quais um programa especifica uma relação ou função.<ref name=appleby /> Se dividem em:
 
* [[Linguagem funcional|O paradigma funcional]]. Linguagens deste paradigma não incluem qualquer provisão para atribuição ou dados mutáveis<ref name="abelson">{{Citar livro|autor=Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie|título=Structure and Interpretation of Computer Programs|subtítulo=|idioma=inglês|edição=2ª|local=Cambridge, Massachusetts|editora=McGraw-Hill|ano=1996|páginas=640|página=352-360|volumes=|volume=|isbn=0-07-000484-6}}</ref> Na programação funcional, o mapeamento entre os valores de entrada e saída são alcançados mais diretamente. Um programa é uma função (ou grupo de funções), tipicamente constituída de outras funções mais simples.<ref name="watt2">{{Citar livro|autor=Watt, David A|título=Programming Language Concepts and Paradigms|subtítulo=|capítulo=13-The Funcional Programming Paradigm|idioma=inglês|edição=|local=New York|editora=Prentice Hall|ano=1990|páginas=322|página=230-252|volumes=|volume=|isbn=0-13-728866-2}}</ref> Exemplos de linguagens deste paradigma são as linguagens [[Lisp]]<ref name=manual>{{Citar livro|autor=McCarthy, John; Abrahams, Paul W.; Edwards, Daniel J.; Hart, Timothy P.; Levin, Michael I|título=Lisp 1.5 Programmer´s Manual|subtítulo=|idioma=|edição=|local=Cambridge, Massachusetts|editora=The MIT Press|ano=1962|páginas=106|página=1|volumes=|volume=|isbn=0-262-13011-4}}</ref>, [[Scheme]]<ref>{{Citar livro|autor=Dybvig, R. Kent|título=The Scheme Programming Language|subtítulo=Ansi Scheme|idioma=|edição=|local=[[New Jersey]]|editora=Prentice Hall PTR|ano=1996|páginas=|volumes=|volume=|isbn=0-13-454646-6}}</ref> e [[Haskell (linguagem de programação)|Haskell]]<ref name=haskell>{{Citar livro|autor=Hudak, Paul|título=Tha Haskell School of Expression|subtítulo=Learning Functional Programming Through Multimedia|idioma=|edição=|local=Cambridge|editora=Cambridge University Press|ano=2000|páginas=363|volumes=|volume=|isbn= 0-521-64408-9}}</ref>
* [[Programação lógica|O paradigma da programação lógica]]. Este paradigma se baseia na noção de que um programa implementa uma relação ao invés de um mapeamento.<ref name="watt3">{{Citar livro|autor=Watt, David A|título=Programming Language Concepts and Paradigms|subtítulo=|capítulo=14-The Logic Programming Paradigm|idioma=inglês|edição=|local=New York|editora=Prentice Hall|ano=1990|páginas=322|página=253-265|volumes=|volume=|isbn=0-13-728866-2}}</ref> Exemplos de linguagens deste paradigma são o [[Prolog]]<ref name=bratko>{{Citar livro|url= |autor=Bratko, Ivan|título=Prolog|subtítulo=Programming for Artificial Intelligence |idioma=inglês|edição=3ª|local=Harlow, England|editora=Addison-Wesley|ano=2001|páginas=46-50|página= |volumes= |volume= |isbn=0201-40375-7}}</ref> e a linguagem [[Gödel (linguagem de programação)|Gödel]].<ref name="godel">{{Citar livro|autor=Hill, Patricia; Lloyd, John|título=The Gödel Programming Language|subtítulo=|idioma=inglês|edição=|local=Cambridge|editora=The MIT Press|ano=1994|páginas=350|volumes=|volume=|isbn 0-262-08229-2}}</ref>
 
=== Quanto a estrutura de tipos ===
* Fracamente tipada, como [[PHP]] e [[Smalltalk]], onde o tipo da variável muda dinamicamente conforme a situação.
* Fortemente tipada, como [[Java (linguagem de programação)|Java]] e [[Ruby (linguagem de programação)|Ruby]], onde o tipo da variável, uma vez atribuído, se mantém o mesmo até ser descartada da memória.<ref name="finkel">{{Citar livro|autor=Finkel, Raphael A|título=Advance Programming Language Design|subtítulo=|idioma=inglês|edição=|local=Menlo Park, California|editora=Addison-Wesley|ano=1995|páginas=480|página=64|volumes=|volume=|isbn=0-8053-1191-2}}</ref>
* Dinamicamente tipada, como [[SNOBOL 4|SNOBOL]], [[APL]], [[Awk]], [[Perl]], [[Python]] e [[Ruby (linguagem de programação)|Ruby]], onde o tipo da variável é definido em tempo de execução.<ref name="finkel" />
* Estaticamente tipada, como [[Java (linguagem de programação)|Java]] e [[C (linguagem de programação)|C]], onde o tipo da variável é definido em tempo de compilação.<ref name="jazayeri">{{Citar livro|autor=Guezzi, Carlo; Jazayeri, Mehdi|título=Conceitos de Linguagens de Programação|subtítulo=|idioma=|edição=|local=Rio de Janeiro|editora=Campus|ano=1985|páginas=306|página=55|volumes=|volume=|isbn=85-7001-420-1}}</ref>
 
=== Quanto ao grau de abstração ===
* [[Linguagem de programação de baixo nível]], cujos simbolossímbolos são uma representação direta do código de máquina que será gerado, onde cada comando da linguagem equivale a um "opcode" do processador, como [[Assembly]].<ref name="ravisethi">{{Citar livro|autor=Sethi, Ravi|título=Programming Languages|subtítulo=Concepts & Constructs|idioma=inglês|edição=2ª|local=Reading, Massachusetts|editora=Addison-Wesley|ano=1996|páginas=640|página=4-8|volumes=|volume=|isbn=0-201-59065-4}}</ref>
* Linguagem de programação de médio nível,<ref group=Nota>Muitos autores classificam as linguagens quanto ao grau de abstração em apenas dois: alto e baixo. Alguns autores como Dennis Ritchie e Kenneth Thompson classificam algumas linguagens como [[C (linguagem de programação)|C]] e [[Linguagem de Programação Combinada|CPL]] tanto como baixo nível como alto nível como em: {{Citar livro|autor=Appleby, Doris; VandeKopple, Julius J|título=Programming Languages|subtítulo=Paradigm and Practice|língua3língua=en|edição=2ª|local=New York|editora=McGraw-Hill|ano=1997|páginas=444|página=132-134|volumes=|volume=|isbn=0-07-005315-4}}</ref> que possui símbolos que podem ser convertidos diretamente para código de máquina (goto, expressões matemáticas, atribuição de variáveis), mas também símbolos complexos que são convertidos por um compilador. Exemplo: [[C (linguagem de programação)|C]], [[C++]]
* [[Linguagem de programação de alto nível]], composta de símbolos mais complexos, inteligível pelo ser humano e não-executável diretamente pela máquina, no nível da especificação de algoritmos, como [[Pascal (linguagem de programação)|Pascal]],<ref name="pacitti" /> [[Fortran]], [[ALGOL]],[[Java (linguagem de programação)|Java]] e [[SQL]].<ref name="ravisethi" />
 
=== Quanto à geração ===
A classificação das linguagens de programação em gerações é uma questão que apresenta divergências de autor para autor. Segundo Maclennan,<ref name=maclennan>{{Citar livro|autor=Maclennan, Bruce J|título=Principles of Programming Languages|subtítulo=Design, Evaluation and Implementation|idioma=inglês|edição=3ª|local=Oxford|editora=Oxford University Press|ano=1999|página=92;163-164;208;305-306|páginas=509|volumesisbn =|volume=|id=ISBN 0-19-511306-3}}</ref> as linguagens se dividem em cinco gerações com as seguintes características:
 
* Primeira geração - São linguagens onde suas estruturas de controle são aparentemente orientadas a máquina. As instruções condicionais não são [[Sub-rotina aninhada|aninhadas]] e dependem fortemente de instruções de desvio incondicional como o [[Goto (programação)|GOTO]]. Uma linguagem típica desta geração é a linguagem [[Fortran]].<ref name=maclennan />
* Quinta geração - Nesta geração, Maclennan agrupa diversos paradigmas como a orientação a objeto e o paradigma funcional, paradigma lógico.<ref name=maclennan />
 
Henri Bal e Dick Grune, já apresentam uma classificação em gerações de forma diferente, enfatizando mais o aspecto da aplicação. São elencadas 6 gerações.<ref name="bal">{{Citar livro|autor=Bal, Henri E.; Grune, Dick|título=Programming Language Essentials|subtítulo=|idioma=inglês|edição=|local=Wokingham|editora=Addison-Wesley|ano=1994|páginas=231|página=10-11|volumes=|volume=|isbn=0-201-63179-2}}</ref>
 
* [[Linguagem de programação de primeira geração|Primeira geração]] - [[Código de máquina|linguagem de máquina]].
 
== Bibliografia ==
* {{Citar livro|autor=ORGANICK, E. I.;FORSYTHE, A. I.;PLUMMER, R. P.|título=Programming Language Structures|subtítulo=|idioma=|edição=|local=New York|editora=Academic Press|ano=1978|páginas=659|volumes=|volume=|idisbn =ISBN 0-12-528260-5}}
 
== Ver também ==