Qual é a diferença entre programação imperativa, processual e estruturada?


85

Ao pesquisar em torno de (livros, Wikipedia, perguntas semelhantes sobre SE, etc), eu entendi que a programação Imperative é um dos principais paradigmas de programação, onde você descreve uma série de comandos (ou instruções) para o computador executar (para você muita ordem para que ele tome ações específicas, daí o nome "imperativo"). Por enquanto, tudo bem.

A programação procedural, por outro lado, é um tipo (ou subconjunto) específico de programação Imperative, na qual você usa procedimentos (ou seja, funções) para descrever os comandos que o computador deve executar.

Primeira pergunta : Existe uma linguagem de programação imperativa que não é processual? Em outras palavras, você pode ter programação imperativa sem procedimentos?

Atualização : Esta primeira pergunta parece ter sido respondida. Uma linguagem pode ser imperativa sem ser processual ou estruturada. Um exemplo é a linguagem Assembly pura.

Então você também tem a programação estruturada, que parece ser outro tipo (ou subconjunto) de programação imperativa, que surgiu para remover a dependência da instrução GOTO.

Segunda pergunta : qual é a diferença entre programação processual e estruturada? Você pode ter um sem o outro e vice-versa? Podemos dizer que a programação procedural é um subconjunto da programação estruturada, como na imagem?

insira a descrição da imagem aqui

Respostas:


52

Muitos dos termos podem ser reutilizados (geralmente mal utilizados) em linguagens de programação, especialmente aquelas que não são orientadas a objetos.

Aqui estão algumas pequenas descrições dos termos.

  1. Programação imperativa - Nos velhos tempos, quando a programação era amplamente montada, o código tinha toneladas de GOTOs. Idiomas de nível ainda mais alto, como FORTRAN e BASIC, começaram a usar as mesmas primitivas. Nesse paradigma de programação, o programa inteiro é um algoritmo único ou funcionalidade completa escrita linearmente - passo a passo. Este é um estilo imperativo . Entenda que é realmente possível escrever um trabalho imperativo totalmente ruim, mesmo na linguagem C moderna, mas é muito fácil organizar o código em linguagens de nível superior.

  2. Programação estruturada e modular - Na maioria das vezes, devemos ser capazes de usar o termo de forma intercambiável, mas com diferenças sutis. Quando as linguagens de nível superior começaram a ficar mais ricas, percebemos que todas as unidades de trabalho deveriam ser divididas em partes tratáveis ​​menores - ou seja, quando as funções surgiam e a programação se tornava uma hierarquia de funções e muitas no nível inferior podiam ser reutilizadas.

    • Programação estruturada é qualquer programação quando a funcionalidade é dividida em unidades como a for loop, while loop, if... thenestrutura de blocos, etc.
    • Além disso, aqui o código (função) pode ser reutilizado.
    • Na programação modular , é possível criar uma forma física de pacote - ou seja, um pedaço de código que pode ser enviado; que são de uso geral e reutilizáveis. Isso é chamado de módulos de elementos compilados juntos.
    • Dificilmente se pode ver programas modulares que não estão estruturados e vice-versa; a definição técnica é sutilmente diferente, mas o código estruturado pode ser modificado e de outra maneira.
  3. Depois veio a "programação orientada a objetos", que é bem definida na literatura. Entenda que a programação orientada a objetos é uma forma de programação estruturada por definição. O novo nome para todos os códigos baseados em funções, que é estruturado, mas NÃO orientado a objetos, é frequentemente chamado de programação procedural.

    • Então, basicamente, o código estruturado no qual funções (ou procedimentos) dominam os dados é chamado de procedimento, enquanto a representação baseada em classe e objeto é chamada de orientação a objeto. Ambos, por definição, também são modulares.

Muitas pessoas pensam - toda a programação estruturada (talvez pulando baseada em objetos) como programação imperativa; Acho que isso se deve apenas à falta de uma definição clara de programação imperativa - mas está errada. Você está fazendo programação estruturada quando não está fazendo muita coisa imperativa! Mas ainda posso escrever muitas funções, bem como muitas instruções goto dentro do programa C ou FORTRAN para misturar.

Para ser específico às suas perguntas:

Primeira pergunta : A linguagem assembly pura é uma linguagem imperativa que NÃO é estruturada ou processual. (Ter um fluxo de controle interpretativo passo a passo não significa processual - mas a divisão da funcionalidade em funções é o que torna uma linguagem processual).

  • correção * A maioria das formas modernas de montagem suporta o uso de funções. De fato, tudo o que é possível no código de alto nível TEM que existir um nível baixo para funcionar. Embora seja uma prática muito melhor criar código processual, é possível escrever código processual e imperativo. Ao contrário do último, é mais sustentável e mais fácil de entender (evitando código de espaguete horrível). Eu acho que existem scripts shell / bash que melhor se encaixam no louvor de serem puramente imperativos, mas mesmo assim, a maioria tem funções, os desenvolvedores definitivamente entendem quanto valor têm.

Segunda pergunta : A programação processual é um FORMULÁRIO de programação estruturada.


BÔNUS


1
Então, você diria que a programação procedural necessariamente também é estruturada, enquanto o contrário não é verdadeiro (embora geralmente seja o caso)?
Daniel Scocco 31/10

2
Sim, eu diria que sim.
Dipan Mehta 1/11/11

1
Na minha resposta, defini imperativo versus estruturado - onde a programação imperativa é escrita apenas com execução passo a passo e não é estruturada. No entanto, de acordo com alguma definição, existe outra classificação; essa é uma classificação entre declarativa (ou linguagem funcional) vs. imperativa. Linguagens declarativas permitem a computação sem descrever seu fluxo de controle, onde é imperativo onde o fluxo de controle explícito (passo a passo) é definido. Com base nessa classificação, a programação imperativa, para alguns, pode ser um superconjunto de estruturas. Alguns não seguem exatamente essa definição.
Dipan Mehta 1/11/11

Eu tenho uma opinião diferente, no que diz respeito à definição de programação estruturada. Programação Estruturada e Programação Modular não são a mesma coisa. Por favor, veja a definição no final desta nota. O mesmo link sugere que o Assembler ** é uma ** linguagem de programação estruturada! Referência para definição de STP: en.wikipedia.org/wiki/Structured_programming - Emmad Kareem
NoChance

É uma "forma física de pacote" ... um arquivo ou um diretório / arquivo morto de arquivos? (Ou não é, e é outra coisa.)
n611x007

4

Primeira pergunta: Sim, muitas linguagens orientadas a objetos puras se qualificam. Embora tenham métodos muito próximos das funções, eles os veem em termos de mensagens e não lhes dão peso suficiente para chamar a linguagem de procedural.

Segunda pergunta: a diferença geralmente está em um escopo diferente. Você pode ter uma função com instruções goto em todo o lugar, que terão estilo processual, mas não programação estruturada. Por outro lado, a maioria das linguagens OO suporta e incentiva a programação estruturada, mas não a programação processual.

A programação processual descreve a ordem global do programa. Os programas de procedimento são aqueles que são mais efetivamente entendidos observando seus gráficos de chamada. A programação estrutural é uma propriedade local, aplica-se ao uso de if e while em oposição a goto.

Como tal, essas duas propriedades são disjuntas, você pode ter uma delas sem a outra.


1
O único teste decisivo para ser Procedural é que o idioma contém procedimentos (função ou métodos ) e é Imperativo, ie. não declarativo. Isso significa que a maioria das linguagens OO que não são totalmente funcionais seria Procedural.
dietbuddha

1
@dietbuddha: Por essa definição, Haskell se qualificaria como uma linguagem processual através do uso de mônadas. Eu exigiria uma certa dose de confiança nos procedimentos para tornar uma linguagem processual.
thiton

Não conheço Haskell tão bem, mas achei que o Haskell é uma linguagem funcional pura porque envolve efeitos colaterais nas mônadas.
dietbuddha

2
Bem, algumas pessoas afirmam que Haskell não é puramente funcional porque permite qualquer interação com o mundo exterior (ou porque uma extensão do GHC , unsafePerformIOpermite causar estragos). Outros brincam que Haskell é sua linguagem de programação imperativa favorita. Mas o fato é que um alto grau de código Haskell vive separado de maneira limpa IO, não usa brechas fora do padrão para ocultar os efeitos colaterais e é puramente funcional.

1
@thiton Eu discordo. Mônadas também são construções funcionais; eles apenas parecem imperativos devido ao açúcar da sintaxe de Haskell (a "notação"). Quando você deseja mônadas, sua natureza funcional se torna evidente. Por outro lado, as linguagens OO são realmente imperativas: em sua essência, elas se baseiam na execução seqüencial de instruções.
18712 Andres F.

2

a maioria das línguas populares dos últimos 50 anos foi projetada em torno da arquitetura de computadores predominante, chamada arquitetura Von Neumann , em homenagem a um de seus criadores, John von Neumann.

Esses idiomas são chamados de idiomas imperativos.

Em um computador von Neumaan, os dados e os programas são armazenados na mesma memória. A CPU que executa as instruções é separada da memória. Portanto, instruções e dados devem ser transmitidos da memória para a CPU. Os resultados das operações na CPU devem ser retornados à memória. Quase todos os computadores digitais construídos desde a década de 1940 são baseados na arquitetura von Neumaan.


1
+1 não tem certeza do que isso tem a ver com a pergunta, mas é uma resposta interessante.
amigos estão dizendo sobre chuck

2
O que? Onde está a parte sobre Imperative vs Procedural, etc?
Bbqchickenrobot

Penso que o ponto aqui é que a discussão sobre a estrutura do programa (Imperativo, Declarativo, Procedimental, Orientada a Objetos, Funcional etc.) são construções de linguagem e todos os programas são processados ​​em máquinas de arquitetura Von Neumann. É semelhante a dizer que todos os idiomas do Turing Complete são equivalentes.
ChuckCottrill 29/03

2

Receio que nenhuma das respostas dadas até o momento capture muito bem o núcleo dos conceitos.

Imperativo, procedural e estruturado não são propriedades mutuamente exclusivas, elas apenas se concentram em um único aspecto da lógica de modelagem.

Imperativo é a contraparte do declarativo Imperativo basicamente significa que você diz ao computador o que fazer , executando uma série de instruções fornecidas. Um programa declarativo, por outro lado, diz o que alcançar . Em outras palavras, defina etapas versus defina um resultado.

A programação procedural refere-se à capacidade do processador (hardware ou intérprete) de agrupar instruções em compostos, pular para um composto e retornar ao ponto após o salto, uma vez que o composto tenha sido executado. Isso pode parecer trivial e, segundo os padrões atuais, mas você precisa de algum suporte básico na máquina antes de fazer isso: a capacidade de pular, algum tipo de pilha para enviar um endereço que possa ser acionado e saltado para mais tarde. ponteiro de pilha. Os microprocessadores logo ofereceram esse recurso, mas você pode imaginar um processador primitivo capaz de executar instruções fornecidas sequencialmente, como uma fita perfurada ou um processador de cartões perfurados.

A programação estruturada é o próximo passo da capacidade de pular para outra instrução. Por fim, tudo se resume a saltos, mas se você pode ter saltos condicionais, pode criar instruções básicas de fluxo de controle como se-então, por enquanto, repita até e alterne. Aplicá-los é chamado de programação estruturada.

Em qualquer ambiente de programação moderno, você terá todas as opções acima e as tomará como garantidas, para que não falemos mais delas. As propriedades de diferenciação entre linguagens há muito mudaram para paradigmas de nível superior, como orientação a objetos e programação funcional.

A programação declarativa ainda não é comum, principalmente porque sempre será específica do domínio, pelo menos até certo ponto. Você não pode ter uma linguagem declarativa de uso geral. É por isso que ainda estamos presos às chamadas linguagens de terceira geração, nas quais a programação declarativa ou "modelagem" seria considerada de quarta geração.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.