Quelle est la différence entre une programmation impérative, procédurale et structurée?

85

En faisant des recherches (livres, Wikipédia, questions similaires sur la SE, etc.), j'ai compris que la programmation impérative est l’un des paradigmes majeurs de la programmation, où vous décrivez une série de commandes beaucoup pour qu’il prenne des mesures spécifiques, d’où le nom "impératif"). Jusqu'ici tout va bien.

La programmation procédurale, en revanche, est un type spécifique (ou sous-ensemble) de la programmation impérative, dans laquelle vous utilisez des procédures (c'est-à-dire des fonctions) pour décrire les commandes que l'ordinateur doit exécuter.

Première question : existe-t-il un langage de programmation impératif qui n'est pas procédural? En d'autres termes, pouvez-vous avoir une programmation impérative sans procédures?

Mise à jour : Cette première question semble avoir une réponse. Un langage PEUT être impératif sans être procédural ou structuré. Un exemple est le langage d'assemblage pur.

Ensuite, vous avez également la programmation structurée, qui semble être un autre type (ou sous-ensemble) de programmation impérative, qui est apparue pour éliminer le recours à l’instruction GOTO.

Deuxième question : quelle est la différence entre programmation procédurale et programmation structurée? Pouvez-vous en avoir un sans l'autre et vice-versa? Pouvons-nous dire que la programmation procédurale est un sous-ensemble de programmation structurée, comme dans l'image?

entrez la description de l'image ici

Daniel Scocco
la source

Réponses:

52

Beaucoup de termes peuvent être réutilisés (souvent mal utilisés) à propos des langages de programmation, en particulier ceux autres que ceux orientés objet.

Voici quelques petites descriptions des termes.

  1. Programmation impérative - Dans le bon vieux temps, lorsque la programmation était globalement assemblée, le code contenait des tonnes de GOTO. Même des langages de niveau plus élevé comme FORTRAN et BASIC ont commencé à utiliser les mêmes primitives. Dans ce paradigme de programmation, le programme entier est un algorithme unique ou une fonctionnalité complète écrite linéairement - pas à pas. C'est un style impératif . Comprenez que l'on peut vraiment écrire un travail impératif totalement mauvais, même dans le langage C moderne, mais il est assez facile d'organiser du code dans des langages de niveau supérieur.

  2. Programmation structurée et modulaire - Le plus souvent, nous devrions pouvoir utiliser le terme de manière interchangeable, mais avec des différences subtiles. Lorsque les langages de niveau supérieur ont commencé à s’enrichir, on s’est rendu compte que toutes les unités de travail devaient être divisées en parties infranchissables - c’est à ce moment-là que les fonctions ont été créées et que la programmation est devenue une hiérarchie de fonctions et que beaucoup d’entre elles pourraient être réutilisées.

    • La programmation structurée est toute programmation lorsque la fonctionnalité est divisée en unités telles que la for loop, while loop, if... thenstructure de blocs, etc.
    • Aussi, ici, un morceau de code (fonction) peut être réutilisé.
    • En programmation modulaire , il est possible de créer une forme physique d’emballage, c’est-à-dire un bloc de code pouvant être expédié; qui sont assez général et réutilisable. Cela s'appelle des modules d'éléments compilés ensemble.
    • Il est donc difficile de voir des programmes modulaires qui ne sont pas structurés et inversement; la définition technique est légèrement différente, mais la plupart du temps, un code structuré peut être modulaire ou autre.
  3. Puis vint la "programmation orientée objet" qui est bien définie dans la littérature. Comprenez que la programmation orientée objet est une forme de programmation structurée par définition. Le nouveau nom de tous les codes basés sur les fonctions, qui est un code structuré mais PAS orienté objet, est souvent appelé programmation procédurale.

    • Ainsi, un code fondamentalement structuré dans lequel les fonctions (ou procédures) dominent les données est appelé procédure, tandis que la représentation basée sur les classes et les objets est appelée orientée objet. Par définition, les deux sont également modulaires.

Beaucoup de gens pensent - toute la programmation structurée (peut-être sauter à base d’objets) comme une programmation impérative; Je suppose que cela est uniquement dû au manque de définition claire de la programmation impérative - mais c'est faux. Vous faites de la programmation structurée quand vous ne faites pas beaucoup de choses impératives! Mais je peux toujours écrire beaucoup de fonctions ainsi que beaucoup d'instructions goto dans le programme C ou Fortran pour le mixage.

Pour être spécifique à vos questions:

Première question : le langage d'assemblage pur est un langage impératif qui n'est PAS structuré ou procédural. (Avoir un flux de contrôle interprétatif pas à pas ne signifie pas procédure - mais la division de la fonctionnalité en fonctions est ce qui fait qu'un langage est procédural).

  • correction * La plupart des formes d'assemblage modernes prennent en charge l'utilisation de fonctions. En fait, tout ce qui est possible dans le code de haut niveau DOIT exister de bas niveau pour fonctionner. Bien qu'il soit de loin préférable de créer un code de procédure, il est possible d'écrire à la fois un code de procédure et un code impératif. Contrairement à ce dernier, il est plus facile à comprendre et à gérer (en évitant l’horrible code spaghetti). Je pense qu'il existe des scripts shell / bash qui correspondent mieux à la réputation d'être purement impératif, mais même dans ce cas, la plupart ont des fonctions, les développeurs comprennent certainement combien ils ont de valeur.

Deuxième question : La programmation procédurale est un FORM de programmation structurée.


PRIME

  • Selon certaines taxonomies, la classification principale est Déclaratif (ou langage fonctionnel) vs Impératif. Les langages déclaratifs permettent le calcul sans décrire son flux de contrôle alors que l'impératif est l'endroit où un flux de contrôle explicite (pas à pas) est défini. Sur la base de cette classification, la programmation impérative peut constituer, pour certains, un super-ensemble de programmation structurée, modulaire et orientée objet. Voir ceci: Programmation fonctionnelle vs POO

  • Après orientée objet, d'autres paradigmes de programmation ont été inventés: voir ici pour plus de détails: quelles sont les différences entre une programmation orientée aspect, sujet et rôle?

Dipan Mehta
la source
1
Alors, diriez-vous que la programmation procédurale est nécessairement aussi une programmation structurée, alors que l'inverse n'est pas vrai (bien que ce soit souvent le cas)?
Daniel Scocco
2
Oui, je dirais que oui.
Dipan Mehta
1
Dans ma réponse, j'ai défini impératif et structuré - la programmation impérative est écrite avec une exécution étape par étape et n'est pas structurée. Cependant, selon une certaine définition, il existe une autre classification; Il s'agit d'une classification entre le langage déclaratif (ou langage fonctionnel) et l'impératif. Les langages déclaratifs permettent le calcul sans décrire son flux de contrôle là où un impératif est où un flux de contrôle explicite (étape par étape) est défini. Sur la base de cette classification, la programmation impérative peut, pour certains, être un super-ensemble de structures. Certains ne suivent pas tout à fait cette définition.
Dipan Mehta
J'ai un avis différent en ce qui concerne la définition de la programmation structurée. Programmation structurée et programmation modulaire ne sont pas la même chose. Veuillez consulter la définition à la fin de cette note. Le même lien suggère que Assembler ** est un langage de programmation structuré **! Référence pour la définition de STP: fr.wikipedia.org/wiki/Structured_programming - Emmad Kareem
NoChance le
Est-ce qu'une "forme physique de paquet" ... est un fichier, ou un répertoire / archive de fichiers? (Ou est-ce pas, et c'est autre chose.)
n611x007
4

Première question: oui, beaucoup de langages purement orientés objet sont admissibles. Bien qu'ils aient des méthodes très proches des fonctions, ils les voient en termes de messages et ne leur donnent pas assez de poids pour appeler le langage procédural.

Deuxième question: la différence est souvent différente. Vous pouvez avoir une fonction avec des instructions goto partout, qui seront dans un style procédural, mais pas de programmation structurée. D'autre part, la plupart des langages orientés objet prennent en charge et encouragent la programmation structurée, mais pas la programmation procédurale.

La programmation procédurale décrit l’ordre global du programme. Les programmes procéduraux sont ceux qui sont le plus efficacement compris en consultant leurs graphiques d'appel. La programmation structurelle est une propriété locale, elle s’applique à l’utilisation de if et while par opposition à goto.

En tant que telles, ces deux propriétés sont disjointes, vous pouvez avoir l'une ou l'autre sans l'autre.

thiton
la source
1
Le seul test décisif pour être procédural est que le langage contient des procédures (fonction ou méthodes ) et est impératif, c'est-à-dire. non déclaratif. Cela signifie que la plupart des langages orientés objet qui ne sont pas purement fonctionnels seraient procéduraux.
dietbuddha
1
@dietbuddha: selon cette définition, Haskell serait qualifié de langage procédural via son utilisation de monades. J'aurais besoin d'une certaine confiance dans les procédures pour rendre un langage procédural.
thiton
Je ne connais pas très bien Haskell, mais j’ai pensé que celui-ci est un langage purement fonctionnel car il englobe les effets secondaires chez Monads.
dietbuddha
2
Eh bien, certaines personnes prétendent Haskell n'est pas purement fonctionnelle car elle permet une interaction avec le monde extérieur (ou à cause d' une GHC l' extension , unsafePerformIOpermet semant Havok). D'autres disent en plaisantant que Haskell est leur langage de programmation impératif préféré. Mais le fait est qu’une très grande partie du code Haskell vit distinctement IO, n’utilise pas de failles non standard pour créer des effets secondaires, et est purement fonctionnelle.
1
Je ne suis pas d'accord avec @thiton. Les monades sont aussi des constructions fonctionnelles; ils ne semblent qu'impératifs en raison du sucre de syntaxe de Haskell (la "notation do"). Lorsque vous désarrez des monades, leur nature fonctionnelle devient évidente. En revanche, les langages OO sont en effet impératifs: ils reposent essentiellement sur l'exécution séquentielle des instructions.
Andres F.
2

la plupart des langages populaires de ces 50 dernières années ont été conçus autour de l'architecture informatique répandue, appelée architecture Von Neumann , d'après l'un de ses concepteurs , John von Neumann.

Ces langues sont appelées langues impératives.

Dans un ordinateur von Neumaan, les données et les programmes sont stockés dans la même mémoire. La CPU qui exécute les instructions est séparée de la mémoire. Par conséquent, les instructions et les données doivent être transmises de la mémoire à la CPU. Les résultats des opérations dans la CPU doivent être remis en mémoire. Presque tous les ordinateurs numériques construits depuis les années 1940 sont basés sur l’architecture de von Neumaan.

Anandmon
la source
1
Je ne sais pas très bien ce que cela a à voir avec la question, mais c'est une réponse intéressante.
Chuck Conway
2
Quelle? Où est la partie sur l'impératif vs procédural, etc?
bbqchickenrobot
Je pense que le point ici est que les questions sur la structure du programme (impératif, déclaratif, procédural, orienté objet, fonctionnel, etc.) sont des constructions de langage et que tous les programmes sont finalement traités sur des machines à architecture Von Neumann. Cela revient à dire que toutes les langues de Turing Complete sont équivalentes.
ChuckCottrill
2

Je crains qu'aucune des réponses données jusqu'à présent ne rende très bien le noyau des concepts.

Impératif, procédural et structuré ne sont pas des propriétés mutuellement exclusives, elles se concentrent sur un seul aspect de la logique de modélisation.

Imperative est la contrepartie de l'impératif déclaratif. En d'autres termes, vous indiquez à l'ordinateur quoi faire en lui faisant exécuter une série d'instructions que vous fournissez. Un programme déclaratif, d'autre part, indique ce qu'il faut accomplir . En d'autres termes, définissez les étapes par rapport à un résultat.

La programmation procédurale fait référence à la capacité du processeur (matériel ou interprète) d’envelopper des instructions dans des composés, d’accéder à un tel composé et de revenir au point suivant le saut une fois que le composé a été exécuté. Cela peut sembler banal et aux normes actuelles, mais vous avez besoin d’une assistance de base dans la machine avant de pouvoir le faire: la capacité de sauter, une sorte de pile pour envoyer une adresse sur laquelle il est possible de sauter et de passer plus tard, et pointeur de pile. Les microprocesseurs ont bientôt proposé cette fonctionnalité, mais vous pouvez imaginer un processeur primitif capable uniquement d'exécuter les instructions qui lui sont fournies séquentiellement, comme un processeur de bande perforée ou de carte perforée.

La programmation structurée est la prochaine étape de la possibilité de passer à une autre instruction. En fin de compte, tout se résume à des sauts, mais si vous pouvez avoir des sauts conditionnels, vous pouvez créer des instructions de flux de contrôle de base telles que if-then, for, while, repeat-Until et switch. Leur application s'appelle la programmation structurée.

Dans n'importe quel environnement de programmation moderne, vous aurez tout ce qui précède à votre disposition et vous le prendrez pour acquis afin que nous ne parlions plus d'eux comme tel. Les propriétés différenciantes entre les langues ont longtemps évolué vers des paradigmes de niveau supérieur, tels que la programmation orientée objet et fonctionnelle.

La programmation déclarative n’est pas encore banale cependant, principalement parce qu’elle sera toujours spécifique à un domaine, du moins dans une certaine mesure. Vous ne pouvez pas avoir un langage déclaratif à usage général. C'est pourquoi nous sommes toujours bloqués avec ce qu'on appelle les langages de 3ème génération, où la programmation déclarative ou la "modélisation" serait considérée comme une 4ème génération.

Martin Maat
la source