O programa , também conhecido como codificação na área de informática, é o conjunto de atividades que permite a escrita de programas de computador . É uma etapa importante no desenvolvimento de software (até hardware ).
A escrita de um programa é feita em uma linguagem de programação . Software é um conjunto de programas (que podem ser escritos em diferentes linguagens de programação) dedicados ao desempenho de certas tarefas por um (ou mais) usuários do software.
Programar aqui, portanto, representa a escrita do código-fonte de um software. Em vez disso, o termo desenvolvimento é usado para denotar todas as atividades relacionadas à criação de software e os programas que o compõem. Isso inclui a especificação do software, seu design e, em seguida, sua implementação real no sentido de escrever programas em uma linguagem de programação bem definida, bem como verificar sua exatidão, etc.
A primeira máquina programável (isto é, máquinas cujo potencial muda ao modificar o programa) é provavelmente o tear de Jacquard , que foi concluído em 1801 . A máquina usava uma série de caixas perfuradas. Os orifícios indicavam o padrão que o tear seguia para fazer uma trama ; com diferentes cartas, o tear produzia diferentes tramas. Essa inovação foi então aprimorada por Herman Hollerith para a IBM para o desenvolvimento do famoso Punch Card para a IBM .
Em 1936, a publicação do artigo fundador da ciência da computação On Computable Numbers with a Application to the Entscheidungsproblem por Alan Turing daria início à criação do computador programável. Ele apresentou sua máquina de Turing , o primeiro computador programável universal, e inventou os conceitos e termos de programação e programa .
Os primeiros programas de computador foram executados com um ferro de solda e um grande número de tubos de vácuo (mais tarde, transistores ). Conforme os programas se tornavam mais complexos, isso se tornava quase impossível, porque um único erro tornava o programa inteiro inutilizável. Com o avanço dos suportes de dados , tornou-se possível carregar o programa a partir de cartões perfurados , contendo a lista de instruções em código binário específico para um determinado tipo de computador. Conforme o poder dos computadores aumentava, eles eram usados para fazer programas, os programadores naturalmente preferindo escrever texto em vez de sequências de 0s e 1s, com a condição de que o próprio computador fizesse a tradução.
Com o tempo, novas linguagens de programação surgiram, fazendo com que cada vez mais se ignorassem os hardwares em que deveriam rodar os programas . Isso traz vários fatores de ganho: essas linguagens são mais fáceis de aprender, um programador pode produzir código mais rapidamente e os programas produzidos podem ser executados em diferentes tipos de máquinas .
A grande maioria dos programas executados em nossos computadores, telefones e outras ferramentas eletrônicas é escrita nas chamadas linguagens de programação imperativas: as linhas do programa são executadas uma após a outra. Cada linha do programa executa uma operação simples ou uma função que é uma série de operações simples.
O “ Hello World! É tradicionalmente o primeiro programa escrito por todos os programadores. A única função do programa é exibir "Hello World!" para seu usuário.
Aqui está uma versão de um " Hello World!" ":
O programa a seguir, escrito em linguagem Java (ligeiramente simplificado e ao qual comentários foram adicionados), simplesmente pede ao usuário que digite dois inteiros e exibe seu quociente.
void main() { // fonction 'main' : c'est toujours ici qu'un programme Java commence // 'int' signifie integer : nombre entier en anglais int A, B; // on déclare deux variables A et B qui sont des nombres entiers WriteLine("entrez deux entiers : "); // 'WriteLine' permet d'écrire à l'écran A = ReadIntFromKeyboard(); // on attend que l'utilisateur tape un entier au clavier, // et on l'enregistre dans A B = ReadIntFromKeyboard(); // puis on fait la même chose pour B if (B == 0) { // si B est égal à 0 WriteLine("erreur : division par zéro"); } else { // sinon float C = CalculerDivision(A,B); // on exécute la fonction 'CalculerDivision' // que l'on a programmée ci-dessous, // et on enregistre le résultat dans C qui est un 'float' : un nombre à virgule WriteLine("le résultat est : " + C); // on affiche C } } float CalculerDivision(float U, float V) { // U et V sont les paramètres de notre fonction 'CalculerDivision' : ce sont des nombres à virgules (float). // et celle-ci renvoie un 'float' : un nombre à virgule flottante // dans la fonction 'main', A et B étaient des nombres entiers, // U et V sont des copies des valeurs de A et B, // et qui ont été converties en nombres à virgule (22 deviendrait simplement 22.0000000) float Resultat; Resultat = U / V; // on effectue la division return Resultat; /// on renvoie le résultat }Neste programa, são utilizadas as principais funcionalidades da programação imperativa: variáveis do tipo inteiro , número de ponto flutuante , string de caracteres , função que calcula um resultado a partir de parâmetros, função que executa uma tarefa como exibir uma mensagem ao usuário. Tela, ifelaboração de instruções é possível executar um código ou outro em função do valor de tal ou qual variável.
Em um programa de computador típico, pode-se encontrar, dependendo das linguagens, loops whileou forque permitem que um trecho de código seja executado em um loop ou simplesmente um certo número de vezes, newpara a alocação dinâmica de dados (por exemplo arrays), e muitas vezes, elementos de programação de objeto para estruturar o código de maneira diferente e criar tipos de dados personalizados ou exceções para lidar com certos casos de erros com mais facilidade.
Observe que para realizar uma tarefa muito simples, o código do computador pode ser muito trabalhoso, e aqui novamente não lidamos com erros (se o usuário digitar uma palavra em vez de um número), e a exibição é minimalista. É por isso que as linguagens de programação nunca deixaram de evoluir, com o objetivo de ajudar o programador que deseja criar programas de execução rápida, sem mal funcionamento e, acima de tudo, fáceis de escrever, pelo menos tanto quanto possível.
A fase de design define o objetivo do programa. Se fizermos uma rápida análise funcional de um programa, essencialmente determinamos os dados que ele irá processar (dados de entrada), o método empregado (chamado de algoritmo ) e o resultado (dados de saída). Os dados de entrada e saída podem ser de natureza muito diversa. O método usado para cumprir o objetivo de um programa pode ser descrito por meio de um algoritmo. A programação processual e funcional é baseada em algoritmos . Geralmente encontramos as mesmas funcionalidades básicas.
Programação imperativa "Sim" Si prédicat Alors faire ceci Sinon faire cela "Enquanto" Tant que prédicat Faire ... "Para" Pour variable allant de borne inférieure à borne supérieure Faire ... "Para" (variante) Pour variable dans conteneur faire ...Uma vez que o algoritmo é definido, a próxima etapa é codificar o programa. A codificação depende da arquitetura na qual o programa será executado, das compensações de memória de tempo e outras restrições. Essas restrições determinarão qual linguagem de programação usar para "converter" o algoritmo em código-fonte.
O código-fonte (quase) nunca pode ser usado como está. Geralmente é escrito em linguagem de "alto nível" compreensível para humanos, mas não para máquinas.
CompilaçãoAlgumas linguagens são chamadas de linguagens compiladas. De um modo geral, compilação é a operação que consiste em transformar um idioma de origem em um idioma de destino. No caso de um programa, o compilador irá transformar todo o texto que representa o código-fonte do programa, em código compreensível para a máquina, denominado código de máquina .
No caso das chamadas linguagens compiladas, o que é executado é o resultado da compilação. Uma vez feito isso, o executável resultante pode ser usado sem o código-fonte.
Deve-se notar também que o resultado da compilação não é necessariamente um código de máquina correspondente à máquina real, mas pode ser um código compreendido por uma máquina virtual (ou seja, um programa que simula uma máquina), caso de que falaremos bytecode . Este é, por exemplo, o caso em Java . A vantagem é que assim um programa pode rodar em qualquer máquina real, desde que exista a máquina virtual para isso.
No caso de uma consulta SQL , a consulta é compilada em uma expressão usando operadores de álgebra relacionais. É esta expressão que é avaliada pelo sistema de gerenciamento de banco de dados.
InterpretaçãoOutras linguagens não requerem uma fase especial de compilação. O método usado para executar o programa é diferente. Na maioria das vezes, a fase de compilação está incluída na fase de execução. Este programa interpreta o código-fonte. Por exemplo, Python ou Perl são linguagens interpretadas.
Vantagens desvantagensAs vantagens geralmente retidas para o uso de linguagens “compiladas”, é que elas são mais rápidas na execução do que as linguagens interpretadas, pois o intérprete deve ser iniciado a cada execução do programa, o que sistematicamente mobiliza recursos.
Tradicionalmente, as linguagens interpretadas, por outro lado, oferecem alguma portabilidade (a capacidade de usar o código-fonte em diferentes plataformas), bem como facilidade na escrita de código. Na verdade, não é necessário passar pela fase de compilação para testar o código-fonte. Também não é necessário ter outro programa ( depurador ) para remover os bugs do programa, é o intérprete que permite visualizar diretamente o conteúdo das variáveis do programa.
Nome impróprioDeve-se notar que falamos indevidamente de linguagens compiladas ou interpretadas. Na verdade, o caráter compilado ou interpretado não depende da linguagem, que em última análise é apenas uma gramática e uma certa semântica. Além disso, algumas linguagens podem ser utilizadas interpretadas ou compiladas. Por exemplo, é muito comum usar Ruby com um interpretador, mas também existem compiladores para esta linguagem. Observe, entretanto, que pode ser importante especificar como o código-fonte é executado. De fato, raras são as organizações que propõem ao mesmo tempo um compilador e um intérprete, os resultados do programa podem diferir na execução, mesmo que o padrão da linguagem esteja claramente definido.
No entanto, o uso de linguagens é geralmente fixo.
Esta é uma das etapas mais importantes na criação de um programa. Em princípio, todo programador deve verificar todas as partes de um programa, testá-lo. Existem diferentes tipos de teste. Podemos citar em particular:
Deve-se notar que às vezes é possível verificar um programa de computador, ou seja, provar, mais ou menos automaticamente, que ele fornece certas propriedades.
Um paradigma é um estilo fundamental de programação , definindo como os programas devem ser formulados.
Um paradigma é a forma como as soluções de problemas são tratadas e um estilo fundamental de programação, definindo como os programas devem ser formulados. Cada paradigma traz sua filosofia de programação; uma vez que uma solução foi imaginada por um programador de acordo com um determinado paradigma, uma linguagem de programação que segue esse paradigma permitirá que ela seja expressa.
O paradigma imperativo é o mais difundido, as operações são uma série de instruções executadas pelo computador para alterar o estado do programa .
Programação processualA programação procedural é um subconjunto da programação imperativa. Ele introduz a noção de rotina ou função que é uma espécie de fatoração de código, cada procedimento pode ser chamado em qualquer estágio do programa . Este paradigma também permite suprimir instruções goto.
Este paradigma é muito difundido, está presente em linguagens como C , COBOL ou FORTRAN .
Programação estruturadaSurgida na década de 1970 , a programação estruturada é um subconjunto da programação imperativa. Ele se originou com o trabalho de Nicklaus Wirth para seu artigo seminal de Algol W e Dijkstra em Communications of the ACM , com o objetivo de suprimir a declaração goto .
Todas as linguagens procedurais podem fazer programação estruturada, mas algumas como FORTRAN são muito pobres.
Na programação declarativa, o programa é independente do estado da máquina , portanto, está livre de quaisquer efeitos colaterais e uma chamada para a mesma função sempre produzirá o mesmo resultado.
O programa é escrito não como uma série de instruções para resolver um problema, mas (ao contrário da programação imperativa ) como a solução para o problema.
Programação funcionalA programação funcional é baseada em vários princípios como: imutabilidade , funções puras (que não dependem do estado da máquina) e cálculo lambda .
Hoje, existem muitas linguagens que oferecem a possibilidade de uma abordagem funcional do programa. Alguns, como LISP ou Scala, estão lá desde sua criação. Outros, como JavaScript , Java ou PHP, adicionaram posteriormente ferramentas que permitem uma abordagem mais funcional.
Programação lógicaA programação lógica é expressar os problemas e algoritmos na forma de predicados com uma base feita de regras básicas e um motor de inferência .
A programação orientada a objetos (abreviada OOP) consiste na definição e interação de blocos de software chamados objetos ; esses objetos representam um conceito, uma ideia. Cada objeto contém atributos e métodos relacionados a um assunto.
Programação orientada a protótiposA programação orientada a protótipos é um subconjunto da programação orientada a objetos. Neste paradigma, cada objeto é criado a partir de um protótipo que é ele próprio um objeto. O protótipo, portanto, tem uma existência física na memória e é mutável ao contrário das classes.
O JavaScript , a Lua ou o Self são exemplos de linguagens que usam este paradigma.
Programação orientada para aulasA programação orientada a classes é baseada na noção de classes . Uma classe é estática, é a representação abstrata do objeto , é neste nível que passa a herança . Qualquer objeto é, portanto, a instância de uma classe.
As linguagens de classe podem estar na forma funcional ( CLOS ), bem como na forma imperativa ( C ++ , Java ), ou ambas ( Python , OCalm ).