sexta-feira, 28 de junho de 2013

Linguagem de programação





Uma linguagem de programação é um método padronizado para comunicar instruções para um computador.1 É um conjunto de regras sintáticas e semânticas usadas para definir um programa de computador.2 Nota 1 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 algoritmos 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.3 Esse código fonte é depois traduzido para código de máquina, que é executado pelo processador.3

Uma das principais metas das linguagens de programação é permitir 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).4 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 programadores e 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 portabilidade5 ). 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.6 7

Índice

1 História
2 Interpretação e compilação
3 Conceitos
3.1 Programação estruturada
3.2 Programação modular
3.3 Programação orientada a objetos
3.4 Programação linear
4 Classificação
4.1 Classificação da ACM
4.2 Quanto ao paradigma
4.2.1 Paradigmas Imperativos
4.2.2 Paradigmas Declarativos
4.3 Quanto a estrutura de tipos
4.4 Quanto ao grau de abstração
4.5 Quanto à geração
5 Lista de linguagens



História

Grace Hopper em 1984
O primeiro trabalho de linguagem de programação foi criado por Ada Lovelace, grande amiga de Charles Babbage.8 O projeto da primeira calculadora mecânica programável foi idealizado por Charles Babbage9 que, após gastar fortunas e um longo tempo, não conseguiu concretizar o projeto.10 A linguagem de programação ADA foi batizada em homenagem a esta primeira programadora.11

Uma das primeiras linguagens de programação para computadores foi provavelmente Plankalkül, criada por Konrad Zuse na Alemanha Nazista,12 mas que teve pouco ou nenhum impacto no futuro das linguagens de programação.

O primeiro compilador foi escrito por Grace Hopper,13 em 1952, para a linguagem de programação A-0.14 A primeira linguagem de programação de alto nível amplamente usada foi Fortran, criada em 1954.15 14 Em 1957 foi criada B-0, sucessora da A-0, que daria origem a Flow-Matic (1958), antecessor imediato de COBOL, de 1959.16 O COBOL foi uma linguagem de ampla aceitação para uso comercial.16 A linguagem ALGOL foi criada em 1958-196017 O ALGOL-60 teve grande influência no projeto de muitas linguagens posteriores.18

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.19 Outra linguagem relacionada ao campo da IA que surge em 1972 é a linguagem Prolog, uma linguagem do paradigma lógico.20

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.21 A linguagem Smalltalk22 23 expande o conceito de classes e se torna a primeira linguagem de programação que oferecia suporte completo à programação orientada a objetos.24 A linguagem C++ (originalmente conhecida como C com classes) populariza a orientação a objetos.25

Diversas linguagens de programação surgiram desde então, grande parte orientadas a objetos. Entre estas incluem-se C♯,26 VB.NET, Java, Object Pascal, Objective-C, PHP, Python,27 SuperCollider e Ruby.28 Nota 2

Interpretação e compilação


O processo da compilação
Uma linguagem de programação pode ser convertida, ou traduzida, em código de máquina por compilação ou interpretada por um processo denominado interpretação. Em ambas ocorre a tradução do código fonte para código de máquina.29

Se o método utilizado traduz todo o texto do programa (também chamado de código), para só depois executarNota 3 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).30 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 Pascal31 e 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.32

Embora haja essa distinção entre linguagens interpretadas e compiladas, as coisas nem sempre são tão simples. Há linguagens compiladas para um código de máquina de uma 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 Java33 (compila para a plataforma Java34 ) e C♯ (compila para a plataforma CLI35 ). E também há outras formas de interpretar em que os 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 parsing), a geração de código e a otimização.36 Em compiladores também é comum a geração de código intermediário.Nota 4

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.37 Um dos primeiros a preconizar a programação estruturada foi Haskell B. Curry38 Nota 5 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.39 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.40

Programação modular


Niklaus Wirth em 2005. Criador da linguagem 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.41 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,42 43 desenvolvida por Niklaus Wirth e a Modula-3.44 .

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 análise, projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos. O extensivo uso de objetos, particularmente em conjunção com o mecanismo de herança, caracteriza o estilo de programação orientada a objetos.45 Em alguns contextos, prefere-se usar modelagem orientada ao objeto, 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 inteligencia 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.46 O funcionamento deste sistema se dá através do relacionamento e troca de mensagens entre estes objetos. Na programação 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 métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos.41

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.47 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, idéias 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

As linguagens de programação podem ser classificadas e sub-classificadas de várias formas.

Classificação da ACM

A ACM mantém um sistema de classificação48 com os seguintes sub-itens:

Linguagens aplicativas, ou de aplicação
Linguagens concorrentes, distribuídas e paralelas
Linguagens de fluxo de dados
Linguagens de projeto
Linguagens extensíveis
Linguagens de montagem e de macro
Linguagens de microprogramação
Linguagens não determinísticas
Linguagens não procedurais
Linguagens orientadas a objeto
Linguagens de aplicação especializada
Linguagens de altíssimo nívelNota 6
Quanto ao paradigma

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: imperativo e declarativo.49

Paradigmas Imperativos

Os paradigmas imperativos são aqueles que facilitam a computação por meio de mudanças de estado.49 Se dividem em:

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.
O paradigma de estruturas de blocos.49 A característica marcante deste paradigma são os escopos aninhados. Exemplos de linguagens deste paradigma são o Algol 60, Pascal31 e C.
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++,25 Java, Python27 e Ruby.28
O paradigma da computação distribuída. Este paradigma suporta que mais de uma rotina possa executar independentemente.50 Um exemplos de linguagem deste paradigma é a linguagem Ada.
Paradigmas Declarativos

Os paradigmas declarativos são aqueles nos quais um programa especifica uma relação ou função.49 Se dividem em:

O paradigma funcional. Linguagens deste paradigma não incluem qualquer provisão para atribuição ou dados mutáveis 51 Na programação funcional, o mapeamento entre os valores de entrada e saida 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.52 Exemplos de linguagens deste paradigma são as linguagens Lisp53 , Scheme54 e Haskell55
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.56 Exemplos de linguagens deste paradigma são o Prolog57 e a linguagem Gödel.58
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 e Ruby, onde o tipo da variável, uma vez atribuído, se mantém o mesmo até ser descartada da memória.59
Dinamicamente tipada, como SNOBOL, APL, Awk, Perl, Python e Ruby, onde o tipo da variável é definido em tempo de execução.59
Estaticamente tipada, como Java e C, onde o tipo da variável é definido em tempo de compilação.60
Quanto ao grau de abstração

Linguagem de programação de baixo nível, cujos simbolos 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.61
Linguagem de programação de médio nível,Nota 7 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, 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,31 Fortran, ALGOL e SQL.61
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,62 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 aninhadas e dependem fortemente de instruções de desvio incondicional como o GOTO. Uma linguagem típica desta geração é a linguagem Fortran.62
Segunda geração - São linguagens onde as estruturas de controle são estruturadas de forma a minimizar ou dispensar o uso de instruções GOTO. A segunda geração elaborou melhor e generalizou diversas estruturas de controle das linguagens de primeira geração. Uma das grandes contribuições desta geração foi suas estruturas de nomes, que eram hierarquicamente aninhadas. Isto permitiu melhor controle de espaços de nomes e uma eficiente alocação dinâmica de memória. Uma linguagem típica desta geração é o Algol 60.62
Terceira geração - São linguagens que dão ênfase a simplicidade e eficiência. Uma linguagem típica desta geração é a linguagem Pascal.31 As estruturas de dados desta geração mostram um deslocamento da máquina para a aplicação. As estruturas de controle são mais simples e eficientes.62
Quarta geração - Esta geração é essencialmente o sinônimo para linguagens com abstração de dados. A maioria das linguagens desta geração focam na modularização e no encapsulamento. Uma linguagem típica desta geração é a linguagem Ada.62
Quinta geração - Nesta geração, Maclennan agrupa diversos paradigmas como a orientação a objeto e o paradigma funcional, paradigma lógico.62
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.63

Primeira geração - linguagem de máquina.
Segunda geração - linguagens de montagem (assembly).
Terceira geração - Linguagens procedurais.
Quarta geração - Linguagens aplicativas.
Quinta geração - Linguagens voltadas a Inteligência artificial como as linguagens lógicas (Prolog) e as linguagens funcionais (Lisp).
Sexta geração - Redes neurais.
Doris Apleby e Julius J. VandeKopple dividem as linguagens em quatro gerações que coincidem com as quatro primeiras gerações elencadas por Henri Bal e Dick Grune.49

Lista de linguagens


Livros sobre diversas linguagens de programação
Existem várias linguagens de programação; de acordo com o Índice Tiobe, as 20 mais populares são:40

C
Java
Objective-C
C++
PHP
C♯
Visual Basic
Python
Perl
JavaScript
Ruby
Visual Basic .NET
Transact-SQL
Lisp
Pascal
Bash
PL/SQL
Delphi / Object Pascal
Ada
MATLAB
Notas

↑ 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" Dijkstra, Edsger W. A Discipline of Programming (em inglês). Englewood Cliffs, New Jersey: Prentice Hall, 1976. 217 p. p. 9. ISBN 0-13-215871-X
↑ Para um mapa abrangente da história das linguagens de programação ver: Mapa da história das linguagens de programação (em inglês). Página visitada em 1 de dezembro de 2010.
↑ ou rodar, como se diz no jargão da computação
↑ Veja também Compilador.
↑ 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: Knuth, Donald E. Selected Papers on Computer Languages (em inglês). Ventura Hall, Stanford: CSLI, 2003. Capítulo: 1-The Early Development of Programming Languages, 594 p. p. 17. ISBN 1-57586-382-0
↑ Sussman et al. menciona que as linguagens de altíssimo nível são programadas em termos de sentenças declarativas. Em: Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie. Structure and Interpretation of Computer Programs (em inglês). 2ª ed. Cambridge, Massachusetts: McGraw-Hill, 1996. 640 p. p. 22. ISBN 0-07-000484-6
↑ 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 e CPL tanto como baixo nível como alto nível como em: Appleby, Doris; VandeKopple, Julius J. Programming Languages: Paradigm and Practice (em inglês). 2ª ed. New York: McGraw-Hill, 1997. 444 p. p. 132-134. ISBN 0-07-005315-4

Linguagem de programação



Uma linguagem de programação é um método padronizado para comunicar instruções para um computador.1 É um conjunto de regras sintáticas e semânticas usadas para definir um programa de computador.2 Nota 1 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 algoritmos 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.3 Esse código fonte é depois traduzido para código de máquina, que é executado pelo processador.3

Uma das principais metas das linguagens de programação é permitir 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).4 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 programadores e 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 portabilidade5 ). 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.6 7

Índice

1 História
2 Interpretação e compilação
3 Conceitos
3.1 Programação estruturada
3.2 Programação modular
3.3 Programação orientada a objetos
3.4 Programação linear
4 Classificação
4.1 Classificação da ACM
4.2 Quanto ao paradigma
4.2.1 Paradigmas Imperativos
4.2.2 Paradigmas Declarativos
4.3 Quanto a estrutura de tipos
4.4 Quanto ao grau de abstração
4.5 Quanto à geração
5 Lista de linguagens



História

Grace Hopper em 1984
O primeiro trabalho de linguagem de programação foi criado por Ada Lovelace, grande amiga de Charles Babbage.8 O projeto da primeira calculadora mecânica programável foi idealizado por Charles Babbage9 que, após gastar fortunas e um longo tempo, não conseguiu concretizar o projeto.10 A linguagem de programação ADA foi batizada em homenagem a esta primeira programadora.11

Uma das primeiras linguagens de programação para computadores foi provavelmente Plankalkül, criada por Konrad Zuse na Alemanha Nazista,12 mas que teve pouco ou nenhum impacto no futuro das linguagens de programação.

O primeiro compilador foi escrito por Grace Hopper,13 em 1952, para a linguagem de programação A-0.14 A primeira linguagem de programação de alto nível amplamente usada foi Fortran, criada em 1954.15 14 Em 1957 foi criada B-0, sucessora da A-0, que daria origem a Flow-Matic (1958), antecessor imediato de COBOL, de 1959.16 O COBOL foi uma linguagem de ampla aceitação para uso comercial.16 A linguagem ALGOL foi criada em 1958-196017 O ALGOL-60 teve grande influência no projeto de muitas linguagens posteriores.18

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.19 Outra linguagem relacionada ao campo da IA que surge em 1972 é a linguagem Prolog, uma linguagem do paradigma lógico.20

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.21 A linguagem Smalltalk22 23 expande o conceito de classes e se torna a primeira linguagem de programação que oferecia suporte completo à programação orientada a objetos.24 A linguagem C++ (originalmente conhecida como C com classes) populariza a orientação a objetos.25

Diversas linguagens de programação surgiram desde então, grande parte orientadas a objetos. Entre estas incluem-se C♯,26 VB.NET, Java, Object Pascal, Objective-C, PHP, Python,27 SuperCollider e Ruby.28 Nota 2

Interpretação e compilação


O processo da compilação
Uma linguagem de programação pode ser convertida, ou traduzida, em código de máquina por compilação ou interpretada por um processo denominado interpretação. Em ambas ocorre a tradução do código fonte para código de máquina.29

Se o método utilizado traduz todo o texto do programa (também chamado de código), para só depois executarNota 3 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).30 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 Pascal31 e 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.32

Embora haja essa distinção entre linguagens interpretadas e compiladas, as coisas nem sempre são tão simples. Há linguagens compiladas para um código de máquina de uma 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 Java33 (compila para a plataforma Java34 ) e C♯ (compila para a plataforma CLI35 ). E também há outras formas de interpretar em que os 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 parsing), a geração de código e a otimização.36 Em compiladores também é comum a geração de código intermediário.Nota 4

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.37 Um dos primeiros a preconizar a programação estruturada foi Haskell B. Curry38 Nota 5 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.39 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.40

Programação modular


Niklaus Wirth em 2005. Criador da linguagem 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.41 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,42 43 desenvolvida por Niklaus Wirth e a Modula-3.44 .

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 análise, projeto e programação de sistemas de software baseado na composição e interação entre diversas unidades de software chamadas de objetos. O extensivo uso de objetos, particularmente em conjunção com o mecanismo de herança, caracteriza o estilo de programação orientada a objetos.45 Em alguns contextos, prefere-se usar modelagem orientada ao objeto, 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 inteligencia 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.46 O funcionamento deste sistema se dá através do relacionamento e troca de mensagens entre estes objetos. Na programação 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 métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos.41

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.47 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, idéias 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

As linguagens de programação podem ser classificadas e sub-classificadas de várias formas.

Classificação da ACM

A ACM mantém um sistema de classificação48 com os seguintes sub-itens:

Linguagens aplicativas, ou de aplicação
Linguagens concorrentes, distribuídas e paralelas
Linguagens de fluxo de dados
Linguagens de projeto
Linguagens extensíveis
Linguagens de montagem e de macro
Linguagens de microprogramação
Linguagens não determinísticas
Linguagens não procedurais
Linguagens orientadas a objeto
Linguagens de aplicação especializada
Linguagens de altíssimo nívelNota 6
Quanto ao paradigma

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: imperativo e declarativo.49

Paradigmas Imperativos

Os paradigmas imperativos são aqueles que facilitam a computação por meio de mudanças de estado.49 Se dividem em:

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.
O paradigma de estruturas de blocos.49 A característica marcante deste paradigma são os escopos aninhados. Exemplos de linguagens deste paradigma são o Algol 60, Pascal31 e C.
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++,25 Java, Python27 e Ruby.28
O paradigma da computação distribuída. Este paradigma suporta que mais de uma rotina possa executar independentemente.50 Um exemplos de linguagem deste paradigma é a linguagem Ada.
Paradigmas Declarativos

Os paradigmas declarativos são aqueles nos quais um programa especifica uma relação ou função.49 Se dividem em:

O paradigma funcional. Linguagens deste paradigma não incluem qualquer provisão para atribuição ou dados mutáveis 51 Na programação funcional, o mapeamento entre os valores de entrada e saida 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.52 Exemplos de linguagens deste paradigma são as linguagens Lisp53 , Scheme54 e Haskell55
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.56 Exemplos de linguagens deste paradigma são o Prolog57 e a linguagem Gödel.58
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 e Ruby, onde o tipo da variável, uma vez atribuído, se mantém o mesmo até ser descartada da memória.59
Dinamicamente tipada, como SNOBOL, APL, Awk, Perl, Python e Ruby, onde o tipo da variável é definido em tempo de execução.59
Estaticamente tipada, como Java e C, onde o tipo da variável é definido em tempo de compilação.60
Quanto ao grau de abstração

Linguagem de programação de baixo nível, cujos simbolos 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.61
Linguagem de programação de médio nível,Nota 7 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, 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,31 Fortran, ALGOL e SQL.61
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,62 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 aninhadas e dependem fortemente de instruções de desvio incondicional como o GOTO. Uma linguagem típica desta geração é a linguagem Fortran.62
Segunda geração - São linguagens onde as estruturas de controle são estruturadas de forma a minimizar ou dispensar o uso de instruções GOTO. A segunda geração elaborou melhor e generalizou diversas estruturas de controle das linguagens de primeira geração. Uma das grandes contribuições desta geração foi suas estruturas de nomes, que eram hierarquicamente aninhadas. Isto permitiu melhor controle de espaços de nomes e uma eficiente alocação dinâmica de memória. Uma linguagem típica desta geração é o Algol 60.62
Terceira geração - São linguagens que dão ênfase a simplicidade e eficiência. Uma linguagem típica desta geração é a linguagem Pascal.31 As estruturas de dados desta geração mostram um deslocamento da máquina para a aplicação. As estruturas de controle são mais simples e eficientes.62
Quarta geração - Esta geração é essencialmente o sinônimo para linguagens com abstração de dados. A maioria das linguagens desta geração focam na modularização e no encapsulamento. Uma linguagem típica desta geração é a linguagem Ada.62
Quinta geração - Nesta geração, Maclennan agrupa diversos paradigmas como a orientação a objeto e o paradigma funcional, paradigma lógico.62
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.63

Primeira geração - linguagem de máquina.
Segunda geração - linguagens de montagem (assembly).
Terceira geração - Linguagens procedurais.
Quarta geração - Linguagens aplicativas.
Quinta geração - Linguagens voltadas a Inteligência artificial como as linguagens lógicas (Prolog) e as linguagens funcionais (Lisp).
Sexta geração - Redes neurais.
Doris Apleby e Julius J. VandeKopple dividem as linguagens em quatro gerações que coincidem com as quatro primeiras gerações elencadas por Henri Bal e Dick Grune.49

Lista de linguagens


Livros sobre diversas linguagens de programação
Existem várias linguagens de programação; de acordo com o Índice Tiobe, as 20 mais populares são:40

C
Java
Objective-C
C++
PHP
C♯
Visual Basic
Python
Perl
JavaScript
Ruby
Visual Basic .NET
Transact-SQL
Lisp
Pascal
Bash
PL/SQL
Delphi / Object Pascal
Ada
MATLAB
Notas

↑ 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" Dijkstra, Edsger W. A Discipline of Programming (em inglês). Englewood Cliffs, New Jersey: Prentice Hall, 1976. 217 p. p. 9. ISBN 0-13-215871-X
↑ Para um mapa abrangente da história das linguagens de programação ver: Mapa da história das linguagens de programação (em inglês). Página visitada em 1 de dezembro de 2010.
↑ ou rodar, como se diz no jargão da computação
↑ Veja também Compilador.
↑ 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: Knuth, Donald E. Selected Papers on Computer Languages (em inglês). Ventura Hall, Stanford: CSLI, 2003. Capítulo: 1-The Early Development of Programming Languages, 594 p. p. 17. ISBN 1-57586-382-0
↑ Sussman et al. menciona que as linguagens de altíssimo nível são programadas em termos de sentenças declarativas. Em: Abelson, Harold; Sussman, Gerald Jay; Sussman, Julie. Structure and Interpretation of Computer Programs (em inglês). 2ª ed. Cambridge, Massachusetts: McGraw-Hill, 1996. 640 p. p. 22. ISBN 0-07-000484-6
↑ 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 e CPL tanto como baixo nível como alto nível como em: Appleby, Doris; VandeKopple, Julius J. Programming Languages: Paradigm and Practice (em inglês). 2ª ed. New York: McGraw-Hill, 1997. 444 p. p. 132-134. ISBN 0-07-005315-4

Desenvolvimento de software




Na computação, o desenvolvimento de software é o ato de elaborar e implementar um sistema computacional, isto é, transformar a necessidade de um utilizador ou de um mercado em um produto de software1 . Também é entendido como a aplicação dos processos da engenharia de software combinados com a pesquisa das necessidades do produto para desenvolver software.

É difícil avaliar se a engenharia (de software) ou o Marketing é o maior responsável pelo sucesso ou falha de um produto de software para satisfazer as expectativas do consumidor. Por isso é importante entender tanto os processos quanto as facilidades de colaboração entre a engenharia e o marketing em todo o processo de desenvolvimento.

Notas e referências

↑ Birrell, N.D.. A Practical Handbook for Software Development. [S.l.]: Cambridge University Press, 1985. ISBN 0521254620

Software




Software1 , logiciário ou suporte lógico é uma sequência de instruções a serem seguidas e/ou executadas, na manipulação, redirecionamento ou modificação de um dado/informação ou acontecimento. Software também é o nome dado ao comportamento exibido por essa seqüência de instruções quando executada em um computador ou máquina semelhante além de um produto desenvolvido pela Engenharia de software, e inclui não só o programa de computador propriamente dito, mas também manuais e especificações. Para fins contábeis e financeiros, o Software é considerado um bem de capital.2

Este produto passa por várias etapas como: análise econômica, análise de requisitos, especificação, codificação, teste, documentação, Treinamento, manutenção e implantação nos ambientes.3

Índice

1 Software como programa de computador
2 A construção de um programa de computador
3 Tipos de programas de computador
4 Licenças


Software como programa de computador

Um programa de computador é composto por uma sequência de instruções, que é interpretada e executada por um processador ou por uma máquina virtual. Em um programa correto e funcional, essa sequência segue padrões específicos que resultam em um comportamento desejado.4

O termo "software" foi criado na década de 1940, e é um trocadilho com o termo hardware. Hardware, em inglês, significa ferramenta física. Software seria tudo o que faz o computador funcionar excetuando-se a parte física dele.

Um programa pode ser executado por qualquer dispositivo capaz de interpretar e executar as instruções de que é formado.

Quando um software está representado como instruções que podem ser executadas diretamente por um processador dizemos que está escrito em linguagem de máquina. A execução de um software também pode ser intermediada por um programa interpretador, responsável por interpretar e executar cada uma de suas instruções. Uma categoria especial e o notável de interpretadores são as máquinas virtuais, como a máquina virtual Java (JVM), que simulam um computador inteiro, real ou imaginado.

O dispositivo mais conhecido que dispõe de um processador é o computador. Atualmente, com o barateamento dos microprocessadores, existem outras máquinas programáveis, como telefone celular, máquinas de automação industrial, calculadora etc.

A construção de um programa de computador

Um programa é um conjunto de instruções para o processador (linguagem de máquina). Entretanto, pode-se utilizar linguagens de programação, que traduza comandos em instruções para o processador.

Normalmente, programas de computador são escritos em linguagens de programação, pois estas foram projetadas para aproximar-se das linguagens usadas por seres humanos. Raramente a linguagem de máquina é usada para desenvolver um programa. Atualmente existe uma quantidade muito grande de linguagens de programação, dentre elas as mais populares no momento são Java, Visual Basic, C, C++, PHP, dentre outras.5

Alguns programas feitos para usos específicos, como por exemplo software embarcado ou software embutido, ainda são feitos em linguagem de máquina para aumentar a velocidade ou diminuir o espaço consumido. Em todo caso, a melhoria dos processadores dedicados também vem diminuindo essa prática, sendo a C uma linguagem típica para esse tipo de projeto. Essa prática, porém, 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 código de máquina, a representação numérica utilizada diretamente pelo processador.6

O programa é inicialmente "carregado" na memória principal.7 Após carregar o programa, o computador encontra o Entry Point ou ponto inicial de entrada do programa que carregou e lê as instruções sucessivamente byte por byte. As instruções do programa são passadas para o sistema ou processador onde são traduzidas da linguagens de programação para a linguagem de máquina, sendo em seguida executadas ou diretamente para o hardware, que recebe as instruções na forma de linguagem de máquina.

Tipos de programas de computador

Qualquer computador moderno tem uma variedade de programas que fazem diversas tarefas. Eles podem ser classificados em duas grandes categorias:8

Software de sistema que incluiu o firmware (O BIOS dos computadores pessoais, por exemplo), drivers de dispositivos, o sistema operacional e tipicamente uma interface gráfica que, em conjunto, permitem ao usuário interagir com o computador e seus periféricos.
Software aplicativo, que permite ao usuário fazer uma ou mais tarefas específicas. Aplicativos podem ter uma abrangência de uso de larga escala, muitas vezes em âmbito mundial; nestes casos, os programas tendem a ser mais robustos e mais padronizados. Programas escritos para um pequeno mercado têm um nível de padronização menor.
Ainda é possível usar a categoria Software embutido ou software embarcado, indicando software destinado a funcionar dentro de uma máquina que não é um computador de uso geral e normalmente com um destino muito específico.

Software aplicativo: é aquele que permite aos usuários executar uma ou mais tarefas específicas, em qualquer campo de atividade que pode ser automatizado especialmente no campo dos negócios. Inclui, entre outros:
Aplicações de controle e sistemas de automação industrial.
aplicações de informática para o escritório.
Software educacional.
Software de negócios.
Banco de dados.
Telecomunicações.
video games.
Software médico.
Software de calculo numérico e simbólico.
Atualmente, temos um novo tipo de software. O software como serviço, que é um tipo de software armazenado num computador que se acessa pela internet, não sendo necessário instalá-lo no computador do usuário. Geralmente esse tipo de software é gratuito e tem as mesmas funcionalidades das versões armazenadas localmente.

Outra classificação possível em 3 tipos é:

Software de sistema: Seu objetivo é separar usuário e programador de detalhes do computador específico que está sendo usado. O software do sistema lhe dá ao usuário interfaces de alto nível e ferramentas que permitem a manutenção do sistema. Inclui, entre outros:
Sistemas operacionais
Drivers
ferramentas de diagnóstico
ferramentas de Correçao e Optimizaçao
Servidores
Software de programação: O conjunto de ferramentas que permitem ao programador desenvolver programas de computador usando diferentes alternativas e linguagens de programação, de forma prática. Inclui, entre outros:
Editores de texto
Compiladores
Intérpretes
linkers
Depuradores
Ambientes de Desenvolvimento Integrado : Agrupamento das ferramentas anteriores, geralmente em um ambiente visual, de modo que o programador não precisa digitar vários comandos para a compilação, interpretação, depuração, etc. Geralmente equipados com uma interface de usuário gráfica avançada.
Licenças

A maioria do software é publicado sob uma licença de software. Essa licença define e até restringe qual a forma que se pode utilizar o software definido números de licenças, modificações entre outros. Exemplos de licenças:

GNU General Public License
Licença BSD
Licença Apache
Licença comercial
Licença de software
Licença de software livre
Software livre
Freeware
Shareware
Demo
Trial

Software


Software1 , logiciário ou suporte lógico é uma sequência de instruções a serem seguidas e/ou executadas, na manipulação, redirecionamento ou modificação de um dado/informação ou acontecimento. Software também é o nome dado ao comportamento exibido por essa seqüência de instruções quando executada em um computador ou máquina semelhante além de um produto desenvolvido pela Engenharia de software, e inclui não só o programa de computador propriamente dito, mas também manuais e especificações. Para fins contábeis e financeiros, o Software é considerado um bem de capital.2

Este produto passa por várias etapas como: análise econômica, análise de requisitos, especificação, codificação, teste, documentação, Treinamento, manutenção e implantação nos ambientes.3

Índice

1 Software como programa de computador
2 A construção de um programa de computador
3 Tipos de programas de computador
4 Licenças


Software como programa de computador

Um programa de computador é composto por uma sequência de instruções, que é interpretada e executada por um processador ou por uma máquina virtual. Em um programa correto e funcional, essa sequência segue padrões específicos que resultam em um comportamento desejado.4

O termo "software" foi criado na década de 1940, e é um trocadilho com o termo hardware. Hardware, em inglês, significa ferramenta física. Software seria tudo o que faz o computador funcionar excetuando-se a parte física dele.

Um programa pode ser executado por qualquer dispositivo capaz de interpretar e executar as instruções de que é formado.

Quando um software está representado como instruções que podem ser executadas diretamente por um processador dizemos que está escrito em linguagem de máquina. A execução de um software também pode ser intermediada por um programa interpretador, responsável por interpretar e executar cada uma de suas instruções. Uma categoria especial e o notável de interpretadores são as máquinas virtuais, como a máquina virtual Java (JVM), que simulam um computador inteiro, real ou imaginado.

O dispositivo mais conhecido que dispõe de um processador é o computador. Atualmente, com o barateamento dos microprocessadores, existem outras máquinas programáveis, como telefone celular, máquinas de automação industrial, calculadora etc.

A construção de um programa de computador

Um programa é um conjunto de instruções para o processador (linguagem de máquina). Entretanto, pode-se utilizar linguagens de programação, que traduza comandos em instruções para o processador.

Normalmente, programas de computador são escritos em linguagens de programação, pois estas foram projetadas para aproximar-se das linguagens usadas por seres humanos. Raramente a linguagem de máquina é usada para desenvolver um programa. Atualmente existe uma quantidade muito grande de linguagens de programação, dentre elas as mais populares no momento são Java, Visual Basic, C, C++, PHP, dentre outras.5

Alguns programas feitos para usos específicos, como por exemplo software embarcado ou software embutido, ainda são feitos em linguagem de máquina para aumentar a velocidade ou diminuir o espaço consumido. Em todo caso, a melhoria dos processadores dedicados também vem diminuindo essa prática, sendo a C uma linguagem típica para esse tipo de projeto. Essa prática, porém, 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 código de máquina, a representação numérica utilizada diretamente pelo processador.6

O programa é inicialmente "carregado" na memória principal.7 Após carregar o programa, o computador encontra o Entry Point ou ponto inicial de entrada do programa que carregou e lê as instruções sucessivamente byte por byte. As instruções do programa são passadas para o sistema ou processador onde são traduzidas da linguagens de programação para a linguagem de máquina, sendo em seguida executadas ou diretamente para o hardware, que recebe as instruções na forma de linguagem de máquina.

Tipos de programas de computador

Qualquer computador moderno tem uma variedade de programas que fazem diversas tarefas. Eles podem ser classificados em duas grandes categorias:8

Software de sistema que incluiu o firmware (O BIOS dos computadores pessoais, por exemplo), drivers de dispositivos, o sistema operacional e tipicamente uma interface gráfica que, em conjunto, permitem ao usuário interagir com o computador e seus periféricos.
Software aplicativo, que permite ao usuário fazer uma ou mais tarefas específicas. Aplicativos podem ter uma abrangência de uso de larga escala, muitas vezes em âmbito mundial; nestes casos, os programas tendem a ser mais robustos e mais padronizados. Programas escritos para um pequeno mercado têm um nível de padronização menor.
Ainda é possível usar a categoria Software embutido ou software embarcado, indicando software destinado a funcionar dentro de uma máquina que não é um computador de uso geral e normalmente com um destino muito específico.

Software aplicativo: é aquele que permite aos usuários executar uma ou mais tarefas específicas, em qualquer campo de atividade que pode ser automatizado especialmente no campo dos negócios. Inclui, entre outros:
Aplicações de controle e sistemas de automação industrial.
aplicações de informática para o escritório.
Software educacional.
Software de negócios.
Banco de dados.
Telecomunicações.
video games.
Software médico.
Software de calculo numérico e simbólico.
Atualmente, temos um novo tipo de software. O software como serviço, que é um tipo de software armazenado num computador que se acessa pela internet, não sendo necessário instalá-lo no computador do usuário. Geralmente esse tipo de software é gratuito e tem as mesmas funcionalidades das versões armazenadas localmente.

Outra classificação possível em 3 tipos é:

Software de sistema: Seu objetivo é separar usuário e programador de detalhes do computador específico que está sendo usado. O software do sistema lhe dá ao usuário interfaces de alto nível e ferramentas que permitem a manutenção do sistema. Inclui, entre outros:
Sistemas operacionais
Drivers
ferramentas de diagnóstico
ferramentas de Correçao e Optimizaçao
Servidores
Software de programação: O conjunto de ferramentas que permitem ao programador desenvolver programas de computador usando diferentes alternativas e linguagens de programação, de forma prática. Inclui, entre outros:
Editores de texto
Compiladores
Intérpretes
linkers
Depuradores
Ambientes de Desenvolvimento Integrado : Agrupamento das ferramentas anteriores, geralmente em um ambiente visual, de modo que o programador não precisa digitar vários comandos para a compilação, interpretação, depuração, etc. Geralmente equipados com uma interface de usuário gráfica avançada.
Licenças

A maioria do software é publicado sob uma licença de software. Essa licença define e até restringe qual a forma que se pode utilizar o software definido números de licenças, modificações entre outros. Exemplos de licenças:

GNU General Public License
Licença BSD
Licença Apache
Licença comercial
Licença de software
Licença de software livre
Software livre
Freeware
Shareware
Demo
Trial

Desenvolvimento de software


Na computação, o desenvolvimento de software é o ato de elaborar e implementar um sistema computacional, isto é, transformar a necessidade de um utilizador ou de um mercado em um produto de software1 . Também é entendido como a aplicação dos processos da engenharia de software combinados com a pesquisa das necessidades do produto para desenvolver software.

É difícil avaliar se a engenharia (de software) ou o Marketing é o maior responsável pelo sucesso ou falha de um produto de software para satisfazer as expectativas do consumidor. Por isso é importante entender tanto os processos quanto as facilidades de colaboração entre a engenharia e o marketing em todo o processo de desenvolvimento.

Notas e referências

↑ Birrell, N.D.. A Practical Handbook for Software Development. [S.l.]: Cambridge University Press, 1985. ISBN 0521254620

Engenharia de software




A engenharia de software é a área responsável pelo estabelecimento de técnicas e práticas para o desenvolvimento de software cobrindo uma ampla área de aplicações e diferentes tipos de dispositivos.1
Engenharia de software é uma área da computação voltada à especificação, desenvolvimento e manutenção de sistemas de software, com aplicação de tecnologias e práticas de gerência de projetos e outras disciplinas, visando organização, produtividade e qualidade.2

Atualmente, essas tecnologias e práticas englobam linguagens de programação, banco de dados, ferramentas, plataformas, bibliotecas, padrões, processos e a questão da Qualidade de Software.

Os fundamentos científicos 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. Além disso, a engenharia de software deve oferecer mecanismos para se planejar e gerenciar o processo de desenvolvimento de um sistema computacional.

Índice

1 Definição
2 Áreas de conhecimento
3 Processo de software
3.1 Modelos de processo de software
3.2 Modelos de maturidade
4 Metodologias e métodos
4.1 Modelagem
5 Ferramentas, tecnologias e práticas
5.1 Ferramentas
6 Gerência de projetos
6.1 Planejamento
6.2 Análise de requisitos
6.3 Gestão
7 Histórico
8 ES no presente e tendências


Definição

Friedrich Ludwig Bauer foi o primeiro dizendo: "Engenharia de Software é a criação e a utilização de sólidos princípios de engenharia a fim de obter software de maneira econômica, que seja confiável e que trabalhe em máquinas reais". O próprio significado de engenharia já traz os conceitos de criação, construção, análise, desenvolvimento e manutenção.

A Engenharia de Software se concentra nos aspectos práticos da produção de um sistema de software, enquanto a ciência da computação estuda os fundamentos teóricos dos aspectos computacionais.

O termo foi criado na década de 1960 e utilizado oficialmente em 1968 na NATO Science Committee. Sua criação surgiu numa tentativa de contornar a crise do software e dar um tratamento de engenharia (mais sistemático 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, funções, módulos, objetos ou agentes e interconectados entre si, compondo a arquitetura do software, que deverão ser executados em sistemas computacionais.

Os fundamentos científicos 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. Além 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 desenvolvimento, muitas delas organizadas sob a forma de Fábrica 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 além do software.

A Universidade Federal de Goiás foi a primeira instituição no país a criar o curso de graduação em Engenharia de Software, tendo em constante evolução de sua grade curricular.

Áreas de conhecimento

Segundo o SWEBOK (Corpo de Conhecimento da Engenharia de Software), versão 2004, as áreas de conhecimento da Engenharia de Software são:

Requisitos (Requirements) de Software
Projeto (Design) de Software
Construção (Construction) de Software
Teste (Testing) de Software
Manutenção (Maintenance) de software
Gerência de Configuração de Software
Gerência de Engenharia de Software
Processos de Engenharia de Software
Ferramentas e Métodos 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 didático, é interessante estudarmos a ES em suas camadas de Processo, Métodos e Ferramentas.

Processo de software

Processo de software, ou processo de engenharia de software, é uma seqüência coerente de práticas que objetiva o desenvolvimento ou evolução de sistemas de software. Estas práticas englobam as atividades de especificação, projeto, implementação, testes e caracterizam-se pela interação de ferramentas, pessoas e métodos.

SEE e PSEE são os ambientes voltados ao desenvolvimento e manutenção de processos. O projeto ExPSEE é uma continuação dos estudos de processos, principalmente do ambiente PSEE.

Devido ao uso da palavra projeto em muitos contextos, por questões de clareza, há vezes em que se prefira usar o original em inglês design.

Modelos de processo de software

Um modelo de processo de desenvolvimento de software, ou simplesmente modelo de processo, pode ser visto como uma representação, ou abstração dos objetos e atividades envolvidas no processo de software. Além disso, oferece uma forma mais abrangente e fácil de representar o gerenciamento de processo de software e consequentemente o progresso do projeto.

Exemplos de alguns modelos de processo de software;

Modelos ciclo de vida
Sequencial ou Cascata (do inglês waterfall) - com fases distintas de especificação, projeto e desenvolvimento.
Desenvolvimento iterativo e incremental - desenvolvimento é iniciado com um subconjunto simples de Requisitos de Software e iterativamente alcança evoluções subsequentes das versões até o sistema todo estar implementado
Evolucional ou Prototipação - especificação, projeto e desenvolvimento de protótipos.
V-Model - Parecido com o modelo cascata, mas com uma organização melhor, que permite que se compare com outros modelos mais modernos.
Espiral - evolução através de vários ciclos completos de especificação, projeto e desenvolvimento.
Componentizado - reuso através de montagem de componentes já existentes.
Formal - implementação a partir de modelo matemático formal.
Ágil
RAD
Quarta geração.
Modelos de maturidade

Os modelos de maturidade são um metamodelo de processo. Eles surgiram para avaliar a qualidade dos processos de software aplicados em uma organização (empresa ou instituição). O mais conhecido é o Capability Maturity Model Integration (CMMi), do Software Engineering Institute - SEI.

O CMMi pode ser organizado através de duas formas: Contínua e estagiada. Pelo modelo estagiado, mais tradicional e mantendo compatibilidade com o CMM, uma organização pode ter sua maturidade medida em 5 níveis:

Nível 1 - Caótico;
Nível 2 - Capacidade de repetir sucessos anteriores pelo acompanhamento de custos, cronogramas e funcionalidades;
Nível 3 - O processo de software é bem definido, documentado e padronizado;
Nível 4 - Realiza uma gerência quantitativa do processo de software e do produto;
Nível 5 - Usa a informação quantitativa para melhorar continuamente e gerenciar o processo de software. Até março/2012, no Brasil, há somente 13 empresas neste nível.3
O CMMi é um modelo de maturidade recentemente criado com o fim de agrupar as diferentes formas de utilização 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 médias empresas de desenvolvimento de software no Brasil. O MPS.BR contempla 7 níveis de maturidade, de A a G, sendo a primeira o mais maduro. Até agosto/2012, no Brasil, há somente 2 empresas neste nível.4

Metodologias e métodos

O termo metodologia é bastante controverso nas ciências em geral e na Engenharia de Software em particular. Muitos autores parecem tratar metodologia e método como sinônimos, porém seria mais adequado dizer que uma metodologia envolve princípios filosóficos que guiam uma gama de métodos que utilizam ferramentas e práticas diferenciadas para realizar algo.5

Assim teríamos, por exemplo, a Metodologia Estruturada, na qual existem vários métodos, como Análise Estruturada e Projeto Estruturado (muitas vezes denominados SA/SD, e Análise Essencial). Dessa forma, tanto a Análise Estruturada quanto a Análise Essencial utilizam a ferramenta Diagrama de Fluxos de Dados para modelar o funcionamento do sistema.

Segue abaixo as principais Metodologias e Métodos correspondentes no desenvolvimento de software:

Metodologia Estruturada
Análise Estruturada
Projeto Estruturado
Programação Estruturada
Análise Essencial
SADT
DFD - Diagrama de Fluxo de Dados
MER - Modelo de Entidades e Relacionamentos
Metodologia Orientada a Objetos
Orientação a Objetos
Rational Unified Process ( RUP )
Desenvolvimento ágil de software
Feature Driven Development ( FDD )
Enterprise Unified Process (EUP)
Scrum (Scrum)
Crystal (Crystal Clear, Crystal Orange, Crystal Orange Web)
Programação extrema ( XP )
Outras Metodologias
Microsoft Solution Framework ( MSF )
Modelagem

A abstração do sistema de software através de modelos que o descrevem é um poderoso instrumento para o entendimento e comunicação do produto final que será desenvolvido.

A maior dificuldade nesta atividade está no equilíbrio (tradeoff) entre simplicidade (favorecendo a comunicação) e a complexidade (favorecendo a precisão) do modelo.

Para a modelagem podemos citar 3 métodos:

Análise estruturada, criada por Gane & Searson;
Análise Essencial, criada por Palmer & McMenamin e Ed. Yourdon;
UML, criada por Grady Booch, Ivar Jacobson & Jaimes Rumbaugh. É hoje o método mais comum para o paradigma orientado a objetos.
Ferramentas, tecnologias e práticas

A engenharia de software aborda uma série de práticas e tecnologias, principalmente estudadas pela ciência da computação, enfocando seu impacto na produtividade e qualidade de software.

Destacam-se o estudo de linguagem de programação, banco de dados e paradigmas de programação, como:

Programação estruturada
Programação funcional
Programação orientada a objetos
Componentes de Software
Programação orientada a aspecto
Ferramentas

Outro ponto importante é o uso de ferramentas CASE (do inglês Computer-Aided Software Engineering). Essa classificação abrange toda ferramenta baseada em computadores que auxiliam atividades de engenharia de software, desde a análise de requisitos e modelagem até programação e testes.

Os ambientes de desenvolvimento integrado (IDEs) têm maior destaque e suportam, entre outras coisas:

Editor
Compilador
Debug
Geração de código
Modelagem
Deploy
Testes não automatizados
Testes automatizados
Refatoração (Refactoring)
Gestão de Riscos nos projectos de Software
Uso da Prototipagem na Eng. de Requisitos
Gerência de projetos

A gerência de projetos se preocupa em entregar o sistema de software no prazo e de acordo com os requisitos estabelecidos, levando em conta sempre as limitações de orçamento e tempo.

A gerência de projetos de software se caracteriza por tratar sobre um produto intangível, muito flexível e com processo de desenvolvimento com baixa padronização.

Planejamento

O planejamento de um projeto de desenvolvimento de software inclui:

Análise Econômica de Sistemas de Informações
organização do projeto (incluindo equipes e responsabilidades)
estruturação das tarefas (do inglês WBS - work breakdown structure)
cronograma do projeto (do inglês project schedule)
análise e gestão de risco
estimativa de custos
Essas atividades sofrem com dificuldades típicas de desenvolvimento de software. A produtividade não é linear em relação ao tamanho da equipe e o aumento de produtividade não é imediato devido aos custos de aprendizado de novos membros. A diminuição de qualidade para acelerar o desenvolvimento constantemente prejudica futuramente a produtividade.

A estimativa de dificuldades e custos de desenvolvimentos são muito difíceis, além do surgimento de problemas técnicos. Esses fatores requerem uma análise de riscos cuidadosa.

Além da própria identificação dos riscos, há que ter em conta a sua gestão. Seja evitando, seja resolvendo, os riscos necessitam ser identificados (estimando o seu impacto) e devem ser criados planos para resolução de problemas.

Análise de requisitos

As atividades de análise concentram-se na identificação, especificação e descrição dos requisitos do sistema de software. Em resumo, requisito é uma necessidade que o software deve cumprir.

Há várias interpretações e classificações sobre requisitos, entre elas:

funcional
não funcional
de usuário
de sistema
É comum que o cliente não saiba o que ele realmente deseja, que haja problemas na comunicação e ainda que haja mudança constante de requisitos. Todos esses fatores são recrudescidos pela intangibilidade sobre características 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 aplicação de um método estrutura como a análise orientada a objetos. No entanto, a Engenharia de requisitos possui muito mais aspectos do que os que estão abordados por esses métodos.

Abaixo um pequeno Processo de Engenharia de Requisitos (SOMMERVILLE).

Estudo da viabilidade → "Relatório de Viabilidade" Obtenção e Análise de Requisitos → "Modelos de Sistema" Especificação de Requisitos → "Requisitos de Usuário e de Sistema" Validação de Requisitos → "Documento de Requisitos"

O primeiro processo a ser realizado num Sistema novo é o Estudo de Viabilidade. Os resultados deste processo devem ser um relatório com as recomendações da viabilidade técnica ou não da continuidade no desenvolvimento do Sistema proposto. Basicamente um estudo de viabilidade, embora seja normalmente rápido, deverá abordar fundamentalmente as seguintes questões:

O Sistema proposto contribui para os objetivos gerais da organização?
O Sistema poderá ser implementado com as tecnologias dominadas pela equipe dentro das restrições de custo e de prazo? Ou precisa de treinamentos adicionais?
O Sistema pode ser integrado, e é compatível com os outros sistemas já em operação?
Gestão

Existem cinco tipo de gestões: pessoal, produto, processo, projeto e material.

Histórico

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 sistemático 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, funções, módulos, objetos ou agentes interconectados entre si, compondo a arquitetura do software, que deverão ser executados em sistemas computacionais.

ES no presente e tendências

Atualmente existe um destaque todo especial para a Engenharia de Software na Web. Também utilizado por Presmann a sigla WebE, é o processo usado para criar WebApps (aplicações baseadas na Web) de alta qualidade. Embora os princípios básicos da WebE sejam muito próximos da Engenharia de Software clássica, existem peculiaridades específicas e próprias.

Com o advento do B2B (e-business) e do B2C (e-commerce), e ainda mais com aplicações para a Web 2.0, maior importância ficou sendo esse tipo de engenharia. Normalmente adotam no desenvolvimento a arquitetura MVC (Model-View-Controller).

Outra área de tendência em Engenharia de Software trata da aplicação de técnicas otimização matemática para a resolução de diversos problemas da área. A área, denominada Search-based software engineering, ou Otimização em engenharia de software em Português, apresenta vários resultados interessantes.6 Para mais detalhes em Português, ver texto com aplicações da otimização em engenharia de software.7

O Brasil atualmente conta com seis cursos de nível superior em Engenharia de Software nas seguintes instituições reconhecidas pelo MEC: UnB, UFRN, Universidade Federal do Ceará, Universidade Federal de Goiás, Universidade de Rio Verde e Unipampa.8

Referências

↑ Engenharia de Software. www.dimap.ufrn.br. Página visitada em 26 de julho de 2012.
↑ http://www.inf.ufes.br/~falbo/download/aulas/es-g/2005-1/NotasDeAula.pdf Notas de aula sobre engenharia de software, proferias pelo professor Ricardo de Almeida Falbo, 2005 - UFES
↑ Washington Souza, Lista de empresas CMMI no brasil (2012), Site brasileiro BlogCMMI.
↑ Washington Souza, Lista de empresas MPS.BR no Brasil (atualizado: ago-12), Site BlogCMMI.
↑ Veja mais detalhes em Metodologia (engenharia de software)
↑ HARMAN, M., JONES, B.F., Search-based software engineering, Information and Software Technology, 2001, pp. 833-839.
↑ FREITAS, F.G., MAIA, C.L.B., COUTINHO, D.P., CAMPOS, G.A.L., SOUZA, J.T., Aplicação de Metaheurísticas em Problemas da Engenharia de Software: Revisão de Literatura, II Congresso Tecnológico Infobrasil, 2009,
↑ emec.mec.gov.br
Bibliografia

MAGELA, Rogerio. Engenharia de Software Aplicada: Princípios (volume 1). Alta Books. 2006.
MAGELA, Rogerio. Engenharia de Software Aplicada: Fundamentos (volume 2). Alta Books. 2006.
MOLINARI, Leonardo. Gerência de Configuração - Técnicas e Práticas no Desenvolvimento do Software. Florianópolis: Visual Books, 2007. 85-7502-210-5
PRESSMAN, Roger. Software Engineering: A Practitioner's Approach, 6ªedição, Mc Graw Hill, 2005.
ANÁLISE ECONÔMICA DE SISTEMAS DE INFORMAÇÕES. (ISBN 978-85-909374-7-0) Editora Ixtlan. Autor : Sergio Kaminski. Comentário: Mostra todas as etapas de desenvolvimento do software, relacionando ao lucro,receita e custo.