Combien de types de langages de programmation existe-t-il? [fermé]

30

Fondamentalement, je veux apprendre beaucoup de langages de programmation pour devenir un excellent programmeur. Je n'en connais qu'une poignée en profondeur et j'espérais que quelqu'un pourrait expliquer le nombre de classes ou de types de langages de programmation . Comme la façon dont vous les regrouperiez si vous deviez les apprendre en groupe.

Venant d'un arrière-plan Java, je suis familier avec la frappe statique, mais je sais qu'en plus de la frappe dynamique, il doit y avoir une telle variété dans les langues disponibles que j'aimerais voir une ventilation catégorique si possible.

sova
la source
2
Ne serait-il pas préférable de dire "Quel type .." au lieu de combien?
Amir Rezaei
Eh bien, j'ai appris que quelque chose comme Prolog et C sont fondamentalement différents, donc je pensais que chacun d'entre eux correspond à un type de langage de programmation différent, et j'espérais comprendre combien de types.
sova
7
2: le type qui fait ce que vous voulez et le type qui ne fait pas
Matt Ellen
1
L'apprentissage de différents types de langages de programmation est absolument constructif ! Vous pourriez peut-être prétendre que cela devrait être fermé en double, mais je pense que ce sont des questions suffisamment distinctes pour rester distinctes.
Peter Boughton
1
@Sova, je recommanderais de faire votre premier choix de nouvelles langues pour essayer quelque chose qui n'utilise pas la syntaxe basée sur c. Cela vous permettra de vous concentrer davantage sur la façon dont cela fonctionne par rapport à la différence avec celle que vous connaissez le mieux.
Erik Reppen

Réponses:

73

Cela dépend de la façon dont vous souhaitez classer les langues. Fondamentalement, les langues peuvent être divisées en deux types: les langues impératives dans lesquelles vous indiquez à l'ordinateur comment effectuer une tâche et les langues déclaratives dans lesquelles vous dites à l'ordinateur quoi faire. Les langages déclaratifs peuvent en outre être décomposés en langages fonctionnels , dans lesquels un programme est construit en composant des fonctions, et de la logiquelangages de programmation, dans lesquels un programme est construit à travers un ensemble de connexions logiques. Les langues impératives se lisent plus comme une liste d'étapes pour résoudre un problème, un peu comme une recette. Les langages impératifs incluent C, C ++ et Java; les langages fonctionnels incluent Haskell; les langages de programmation logiques incluent Prolog.

Les langages impératifs sont parfois divisés en deux sous-groupes: les langages procéduraux comme le C et les langages orientés objet . Les langages orientés objet sont cependant un peu orthogonaux aux regroupements, car il existe des langages fonctionnels orientés objet (OCaml et Scala en sont des exemples).

Vous pouvez également regrouper les langues en tapant: statique et dynamique . Les langues à typage statique sont celles dans lesquelles la frappe est vérifiée (et généralement appliquée) avant d'exécuter le programme (généralement pendant une phase de compilation); les langages à typage dynamique reportent la vérification de type à l'exécution. C, C ++ et Java sont des langages de type statique; Python, Ruby, JavaScript et Objective-C sont des langages à typage dynamique. Il existe également des langages non typés , dont le langage de programmation Forth.

Vous pouvez également regrouper les langues en fonction de leur discipline de frappe : typage faible , qui prend en charge les conversions de types implicites, et typage fort , qui interdit les conversions de types implicites. Les lignes entre les deux sont un peu floues: selon certaines définitions, le C est un langage faiblement typé, tandis que d'autres le considèrent comme fortement typé. La dactylographie n'est pas vraiment un moyen utile de regrouper les langues, de toute façon.

mipadi
la source
1
Allait poser quelque chose de similaire, mais va +1 et ajouter des commentaires à la place. Chaque catégorie ou combinaison a également de nombreuses retombées créées en se concentrant sur des éléments particuliers. La POO, par exemple, engendre: POO basé sur un prototype, programmation orientée aspect, programmation basée sur les composants, etc. Les paradigmes fonctionnels ont également des retombées, telles que les langages où un processus ou thread asynchrone est l'unité de base et que vous programmez en composant ensemble des processus parallèles.
CodexArcanum
Comment les langages de script, par exemple VBScript, s'intégreraient-ils à cela? Cela peut être un peu procédural et un peu OO car on peut créer différents types, donc cela en ferait-il un hybride?
JB King
Ceci est exactement ce que je cherchais. Merci beaucoup.
sova
3
Les langages @JB King OOP sont généralement procéduraux, au moins dans les corps de méthode. En outre, c'est une idée fausse courante que la POO signifie «objets». Beaucoup de langues ont des types de données et des objets. Il y a beaucoup de débats sur la définition exacte de la POO, mais elle inclut généralement l'héritage et / ou l'encapsulation (état privé) comme thèmes principaux. Une langue sans l'un ou l'autre sous une forme ou une autre serait difficile à classer comme langue POO.
CodexArcanum
2
@sova Je ne peux penser qu'à deux langues qui fonctionnent un peu comme ça. Erlang est fortement basé sur le traitement parallèle, mais si vous voulez plus comme ce dont je parlais exactement, vous devriez regarder Polyphonic C #. C'est un langage de recherche (maintenant plié en C-oméga) basé sur Pi-Calcul (comme la façon dont FP est basé sur lambda calc) Pi-calc est basé sur l'unité d'un processus, et vous déclarez des processus et une combinaison de synchrone et d'asych les appelle. Regardez également les flèches dans FP, en particulier Haskell. Les flèches ressemblent beaucoup à ça.
CodexArcanum
12
  • Assemblée
  • De procédure
    • De base
    • C
  • Orienté objet
    • C #
    • Java
  • Déclaratif
    • Prolog
    • SQL
  • Fonctionnel
    • Zézayer
    • Haskell

Ce sont les principaux, mais il y a beaucoup d'autres paradigmes, et il y a beaucoup de chevauchements entre eux.


la source
Que diriez-vous déclaratif (par exemple Prolog, SQL)?
Bruce Alderman
@Bruce, je les ai maintenant.
Oui, c'était l'idée générale que j'ai apprise quelque part en cours de route.
sevenseacat
6
L'assemblage ne devrait-il pas être considéré comme procédural?
MattDavey
2
Que diriez-vous des langages de programmation concaténatifs (basés sur la pile), tels que Forth et Factor? Vous pouvez le considérer comme un type de programmation fonctionnelle, mais il est probablement suffisamment distinct pour mériter d'être mentionné. en.wikipedia.org/wiki/Concatenative_programming_language
KChaloux
11

Pour les types de langages de programmation (Paradigms), regardez ici:
http://en.wikipedia.org/wiki/Programming_paradigm

Pour d'autres caractéristiques des langages de programmation (par exemple, les systèmes de types), regardez ici: http://en.wikipedia.org/wiki/Programming_language

Robert Harvey
la source
ah! "paradigme" quel bon mot! merci
sova
@sova J'accepterais cela comme la meilleure réponse, car il y a tout simplement trop de paradigmes à énumérer dans une réponse P.SE, encore moins pour décrire les nuances de chacun.
Rei Miyasaka
9

Cliquez sur l'image pour voir le PDF. Affiche des paradigmes de programmation

Vous devriez regarder les paradigmes de programmation pour les nuls: ce que chaque programmeur devrait savoir par Peter Van Roy. Cela vous donnera un aperçu de la façon dont cela se passe à l'extérieur.

Si vous voulez aller plus loin, vous pouvez lire Concepts, techniques et modèles de programmation informatique . Vous n'apprendrez pas une multitude de langues de cette façon, mais vous apprendrez des paradigmes qui se cachent derrière différents types de langues. Ainsi, l'apprentissage d'une nouvelle langue vous sera plus facile.

mmdemirbas
la source
6
  • Procédure: assemblage, Java, C #, F #, Lisp, Fortran.

  • Ensemble basé: SQL.

  • Basé sur des modèles: Perl, Regex, Snobol.

  • Basé sur l'arbre: XSLT.

  • Basé sur la baie: APL.

Tangurena
la source
2
+1 pour avoir utilisé un autre type de classification, et aussi pour avoir reconnu que «procédural» contient en fait la plupart des classifications des autres. (bien sûr, cela signifie seulement que le mot a très peu de sens et que la viande est dans de telles subdivisions)
Javier
4

Il existe différentes façons de répondre à cette question, mais en termes ils peuvent être classés comme:

Langage machine: Le langage machine est un langage de programmation de bas niveau. Il est facilement compris par les ordinateurs mais difficile à lire par les gens. C'est pourquoi les gens utilisent des langages de programmation de niveau supérieur. Les programmes écrits dans des langages de haut niveau sont également soit compilés et / ou interprétés en langage machine afin que les ordinateurs puissent les exécuter.

Langage d'assemblage: le langage d' assemblage est une représentation du langage machine. En d'autres termes, chaque instruction de langage d'assemblage se traduit par une instruction de langage machine. Bien que les instructions du langage d'assemblage soient lisibles, les instructions sont toujours de bas niveau. Un inconvénient du langage d'assemblage est qu'il n'est pas portable, car chaque plate-forme est livrée avec un langage d'assemblage particulier.

Langage de haut niveau: les langages de haut niveau sont ce que la plupart des programmeurs utilisent de nos jours. Les langages tels que C, C ++ et Java sont tous des langages de haut niveau. Les avantages des langages de haut niveau sont qu'ils sont très lisibles et portables. Un inconvénient des langages de haut niveau est qu'ils sont moins puissants que les langages d'assemblage. Parce qu'une seule instruction dans un langage de haut niveau est traduite en de nombreuses instructions en langage machine.

Les langues de haut niveau peuvent en outre être classées comme:

  1. Langages fonctionnels: en langage fonctionnel, un programme est divisé en définitions de fonctions. Les langages fonctionnels sont une sorte de langage déclaratif. Ils sont principalement basés sur le lambda-calcul typé avec des constantes. Certains des langages de fonctions célèbres sont Scala, F #, Clojure et Lisp.

  2. Langages procéduraux : dans Langages procéduraux, un programme est écrit dans une séquence d'étapes qui doivent être suivies pour produire un résultat. COBOL, FORTRAN et C sont quelques langages procéduraux.

  3. Langages de programmation orientés objet: Dans les langages POO, un programme est divisé en objet qui contiennent des données ainsi que des méthodes qui opèrent sur les données. Java, C # et C ++ sont des langages OOP.

  4. Langages de programmation logique: les langages logiques sont utilisés pour créer des programmes qui permettent à l'ordinateur de raisonner logiquement. ex: langage logique

Pour une étude approfondie, consultez:

Badar
la source
3

J'ai tendance à penser en termes de fonctionnalités:

Syntaxe:

Basé sur C ou quoi d'autre. Java a une syntaxe basée sur C. Je recommande fortement d'essayer quelque chose comme Python ou Ruby pour sortir la tête de la syntaxe et penser davantage en termes de principes de fonctionnement d'un langage donné. Je suis d'avis qu'aucune syntaxe n'a besoin d'être plus volumineuse que celle basée sur C et n'a aucun problème à créer des blocs autour de l'espace blanc.

Compilé vs interprété w. Build-Process vs Interpreted / Console:

Je connais très peu les problèmes liés à l'environnement de compilation par rapport à l'environnement d'exécution, mais je comprends qu'il y a tout un tas de problèmes auxquels je pense rarement.

De même, il existe de nombreux langages interprétés qui ont encore quelque chose d'un processus de compilation pour s'exécuter à l'intérieur d'une machine virtuelle comme Java. Vous devez encore reconstruire pour voir les changements aux choses.

Et puis il y a JavaScript et Python que vous pouvez exécuter à la volée, commande par commande dans une console dans un environnement en direct. Les trois peuvent conduire à des manières très différentes d'écrire du code.

Typage dynamique vs strict:

J'ai tendance à voir les deux comme des compromis de conception. Lorsque vous êtes à un niveau beaucoup plus bas et que les performances sont essentielles, la saisie statique a beaucoup de sens. Je n'ai jamais compris cette notion d'un être "plus sûr" qu'un autre, mais je suis venu dans un langage très plastique / dynamique où vous venez d'apprendre comment fonctionne le système de frappe et à quoi s'attendre, en gros. Les manigances de type sont rarement une préoccupation pour moi dans JS. À certains égards, la flexibilité peut rendre les choses plus robustes, bien que, certes, une touche plus mystérieuse pour un développeur de niveau plus junior si vous ne connaissez pas certains des nids-de-poule dans la langue.

Portée au niveau bloc vs Portée fonction vs?:

Le niveau de bloc est le plus courant (n'importe quoi entre {} dans la plupart des langages de syntaxe basés sur c). La portée JavaScript est construite autour de fonctions (qui sont également utilisées pour construire des objets aussi efficacement). Il existe également une grande variation dans le type d'accès dont vous disposez d'une portée interne à une portée externe. Je ne connais pas les autres schémas de délimitation mais je suis sûr qu'ils existent.

POO classique vs POO prototypique vs Presque-POO (structures en C?) Vs Non-POO:

Même dans la POO basée sur les classes, il y a beaucoup de place pour la variation. Que vous puissiez faire un héritage multiple (ew, bien en excès, ew), définir des interfaces, etc ...

En JavaScript, nous avons une sorte de POO prototypique hybride rabougrie où les objets sont considérablement plus simples, hautement mutables, mais nous avons toujours la possibilité de séparer l'interface des préoccupations internes, ce qui, à mon avis, est l'aspect important de l'encapsulation.

La chose à propos de la POO est qu'il y a vraiment beaucoup de choses que vous pouvez retirer qui sont essentiellement orientées OOP sans être techniquement OOP. Il y a des puristes bien sûr, mais à la fin de la journée, les modèles de conception visent à réaliser certaines abstractions qui fonctionnent bien dans certaines situations. Ne soyez pas trop rapide pour supposer que les idées d'un langage basé sur la POO n'ont aucune utilité dans quelque chose qui est plus orienté vers la procédure. Et je ne parle pas de JavaScript. Il n'est pas du tout limité par sa version maladroite d'un paradigme OOP basé sur un prototype.

Fonctions de première classe:

Ne pas les avoir dans une langue est une chose difficile à abandonner. Vous pouvez transmettre des fonctions comme s'il s'agissait de données à utiliser dans d'autres contextes. Cela rend les schémas de gestion des événements en particulier très faciles à implémenter, mais il est également très facile d'adapter le langage pour qu'il fonctionne comme vous le souhaitez. C'est, plus que tout ce que je soupçonne, ce qui a fait de JavaScript le succès qu'il a ultimement été malgré sa conception en deux semaines et la mise en place d'une syntaxe Java approximative en tant que schéma marketing.

Fermetures:

Je ne sais pas où en est le débat pour Java, mais je sais que beaucoup de développeurs Java réclamaient cette fonctionnalité il y a un an ou deux. Dans un langage sans fermeture, lorsqu'une fonction se ferme, tout ce qui est en mesure de référencer quelque chose de l'intérieur de cette fonction ne pourra pas y accéder car il a été récupéré. Dans une fermeture, le contexte d'exécution est lié de telle sorte que si vous êtes en mesure de référencer des éléments à l'intérieur de cette fonction fermée à partir d'une autre étendue comme dans un objet ou une fonction renvoyé, vous obtenez essentiellement ces variables comme elles l'étaient lorsque la fonction s'est fermée. C'est comme un coincement de votre pied dans la porte de la collecte des ordures, bien que je soupçonne qu'il est mis en œuvre plus comme des copies de ces vars transformées en vars locaux de l'entité référente.

Rigide / strict / sûr vs vous donnant toute la corde que vous voulez:

Les développeurs JS et les développeurs Java ont tendance à ne pas se comprendre du tout et je pense que cela a beaucoup à voir avec les deux langages tombant sur des côtés presque opposés de ce spectre de conception particulier. Je ne veux pas que vous me protégiez de moi-même ou des autres développeurs de mon équipe. Je veux en faire beaucoup plus avec beaucoup moins de code et tout faire de manière très différente (mais cohérente pour un domaine donné) en fonction de la situation. Il y a absolument des compromis entre les deux et beaucoup de langues ont tendance à se situer davantage au milieu.

Erik Reppen
la source
Hé Merci. C'est vraiment agréable de faire l'effort d'un vote à la baisse sans explication.
Erik Reppen
2

Je pense qu'un raccourci pour tout cela est d'apprendre suffisamment de Lisp pour faire des choses semi-utiles. La plupart de ces paradigmes ont commencé comme des façons d'utiliser Lisp, c'est donc un moyen simple d'essayer les choses.

Il existe un certain nombre de "types" de langues, mais de nouvelles peuvent toujours apparaître. Fondamentalement, le but d'un langage est de permettre le codage d'idées, de concepts ou d'exigences, aussi directement que possible. À cette fin, il peut y avoir des situations où les paradigmes existants font défaut, et un nouveau pourrait être nécessaire.

Une façon de voir les choses est en termes de structure de surface. Comment cela vous permet-il d'encoder des idées de manière concise, de sorte que si vous changez d'avis sur ce que vous voulez, la modification correspondante du code est également facile, avec peu de chance d'introduire des bogues.

Une autre façon de voir les choses est en termes de structure de contrôle. Quand le langage est exécuté (s'il l'est) quel est l'ordre dans lequel les choses se produisent, pour accomplir ce que vous voulez? Exemples: exécution directe simple, récursivité, retour arrière, parallélisme. J'ai découvert (toux modeste) une exécution différentielle .

Un autre point de vue utile est que chaque fois qu'une structure de données est conçue, un langage naît. Les données sont «exécutées» par les programmes d'application qui les parcourent et font des choses, tout comme un programme n'est qu'un tas de données (comme des codes d'octets) qui sont utilisées par un interprète pour faire des choses.

Mike Dunlavey
la source
Cool. J'apprendrai LISP et serai éclairé. Excitant: D
sova
Cependant, si vous dites que l'acte d'utiliser une structure de données crée un nouveau langage intermédiaire, vous pouvez également faire valoir qu'un nouveau langage est né dans chaque algorithme (toutes les opérations sont nécessairement effectuées sur une structure de données), et avec réduction, un nouveau langage est né dans chaque ligne de code. Je pense que vous voulez dire autre chose, mais je ne suis pas sûr de comprendre encore?
sova
@sova: Pour moi, la théorie de l'information a été une grande révélation (Shannon et Kolmogorov). Il s'agit de la façon dont les significations sont codées et transmises à travers les canaux, avec des concepts de bande passante, de détection d'erreur, de codage minimal, de caractère aléatoire, etc. Ainsi, les données codent les informations et les algorithmes sont des canaux. Les programmes codent les informations et la programmation est un canal. Alors, quelles informations sont encodées? d'où vient-elle et quand? où ça va? quelles sont les sources d'erreurs (bruit)? comment sont-ils corrigés? J'ai trouvé cela une perspective utile.
Mike Dunlavey
@sova: (suite) Vous n'avez pas à maîtriser toutes les mathématiques rebutantes. Pour moi, ce qui importait, c'était le cadre qu'il me donnait pour réfléchir aux choses.
Mike Dunlavey
1

Je dois ajouter qu'il existe des langages de programmation pour des applications spécifiques. Celui qui me vient à l'esprit est APT (Automatic Programmed Tool), un langage utilisé dans la fabrication de machines-outils.

Dave
la source
Je m'en souviens. Je l'ai peut-être même utilisé. C'était le dernier cri. Vous n'avez pas eu à guider manuellement la fraiseuse, appuyez simplement sur le bouton de démarrage. Et s'il y avait un bug, tout l'enfer se déchaînerait.
Mike Dunlavey
J'ai travaillé sur des programmes qui génèrent du gcode pour les fraiseuses. J'ai littéralement tenu et vu les résultats des bogues de programmation, souvent les miens.
David Thornley
J'ai passé 20 ans à installer des postprocesseurs sur des tas de systèmes.
Dave