Toutes les langues sont-elles fondamentalement les mêmes?

39

Récemment, j'ai dû comprendre la conception d'un petit programme écrit dans une langue dont je n'avais aucune idée ( ABAP , si vous devez savoir). Je pouvais le comprendre sans trop de difficulté.

Je réalise que maîtriser une nouvelle langue est un jeu de balle complètement différent, mais la compréhension de l’intention du code (en particulier du code standard de production, qui n’est pas nécessairement complexe) dans n’importe quelle langue est simple, si vous connaissez déjà quelques langues (de préférence). une procédure / OO et une fonctionnelle).

Est-ce généralement vrai? Tous les langages de programmation sont-ils constitués de constructions similaires, telles que des boucles, des instructions conditionnelles et la transmission de messages entre des fonctions? Existe-t-il des langages non ésotériques qu’un programmeur Java / Ruby / Haskell typique ne serait pas en mesure de comprendre? Toutes les langues ont-elles une origine commune?

Anirudh
la source
4
Je vais vous diriger vers Beating the Averages de Paul Graham. Vous pouvez ou non vouloir lire le texte en entier, mais pour la partie pertinente, recherchez la rubrique "Le paradoxe de Blub". M. Graham ne doit pas être dérangé pour mettre des ancres dans son mur de texte, je ne peux donc pas y accéder directement.
Kwatford
4
Les langues n'ont pas d'origine commune. Mais toutes les langues essaient de résoudre un problème. Je pense que c'est un peu analogue à la langue parlée. Le but est de s'exprimer. Je ne peux pas dire qu'il est facile de comprendre les langues sur la base de la connaissance d'une procédure / OO / fonctionnelle. Je ne l'ai pas encore fait, mais si je posais cette question, je regarderais perl ou lisp avec beaucoup de crochets et je ne pourrais pas dire qu'il est suffisant de savoir 1 langue de tous les types.
shahkalpesh
1
Dans ce cas: calcul lambda. Peut-être pas un «vrai» langage, mais c'est la mère de tous les langages de programmation en un sens. Une fois, j’ai dû mettre en œuvre un langage fonctionnel tel qu’il soit compilé dans des expressions lambda (qui étaient ensuite directement interprétées). Les résultats étaient (du moins pour moi) illisibles bien que tous les identifiants pertinents aient été préservés. Fonctions particulièrement récursives utilisant le combinateur en Y. Le seul moyen pratique de comprendre ce que certaines expressions de l'échantillon ont fait est de les évaluer manuellement. Des choses simples comme fibonnaci et le type de fusion étaient illisibles.
kwatford
2
Si vous connaissez les langages fonctionnels, sachez que les boucles ne sont pas possibles dans toutes les langues.
Jalf
Piet est assez différent. :)

Réponses:

88

Les bases de la plupart des langages procéduraux sont à peu près les mêmes.

Ils offrent:

  • Types de données scalaires: généralement booléens, entiers, flottants et caractères
  • Types de données composés: tableaux (les chaînes sont des cas spéciaux) et structures
  • Constructions de code de base: arithmétique sur les scalaires, accès tableau / structure, assignations
  • Structures de contrôle simples: if-then, if-then-else, while, for loops
  • Paquets de blocs de code: fonctions, procédures avec paramètres
  • Scopes: zones dans lesquelles les identificateurs ont des significations spécifiques

Si vous comprenez cela, vous maîtrisez bien 90% des langues de la planète. Ce qui rend ces langues un peu plus difficiles à comprendre, c'est l'incroyable variété de syntaxes étranges que les gens utilisent pour dire les mêmes choses de base. Certains utilisent la notation succincte impliquant une ponctuation impaire (APL étant un extrême). Certains utilisent beaucoup de mots-clés (COBOL étant un excellent représentant). Cela n'a pas beaucoup d'importance. Ce qui compte, c’est que le langage soit suffisamment complet pour effectuer des tâches complexes sans vous arracher les cheveux. (Essayez de coder un hacking sérieux dans le script shell Windows DOS: il est capable de Turing mais vraiment mauvais en tout).

Des langues de procédures plus intéressantes offrent

  • Portées imbriquées ou lexicales, espaces de noms
  • Pointeurs permettant à une entité de faire référence à une autre, avec allocation de stockage dynamique
  • Empaquetage du code associé: paquets, objets avec méthodes, traits
  • Contrôle plus sophistiqué: récursivité, suites, fermetures
  • Opérateurs spécialisés: opérations sur les chaînes et les tableaux, fonctions mathématiques

Bien qu'elles ne soient pas techniquement des propriétés du langage, mais des propriétés de l'écosystème dans lequel vivent ces langages, elles sont facilement accessibles ou fournies avec le langage dans le cadre de l'outil de développement. Disposer d'un large éventail d'installations de bibliothèques simplifie / accélère l'écriture d'applications simplement parce qu'il n'est pas nécessaire de réinventer ce que font les bibliothèques. Alors que Java et C # sont généralement considérés comme de bons langages, ce qui les rend vraiment utiles, ce sont les énormes bibliothèques qui les accompagnent et les bibliothèques d’extensions faciles à obtenir.

Les langues qui sont plus difficiles à comprendre sont les non-procédurales:

  • Langages purement fonctionnels, sans affectation ni effet secondaire
  • Langages logiques, tels que Prolog, dans lesquels interviennent calcul et unification symboliques
  • Langages de correspondance de modèle, dans lesquels vous spécifiez des formes qui correspondent au problème, et les actions sont souvent déclenchées par une correspondance
  • Langues de contrainte, qui vous permettent de spécifier des relations et de résoudre automatiquement des équations
  • Langages de description du matériel, dans lesquels tout s’exécute en parallèle
  • Langages spécifiques à un domaine, tels que SQL, réseaux de Petri colorés, etc.

Il existe deux principaux styles de représentation pour les langues:

  • Basé sur le texte, dans lequel les identifiants nomment les entités et les flux d'informations sont codés implicitement dans des formules utilisant les identifiants pour nommer les entités (Java, APL, ...)
  • Graphique, dans lequel les entités sont dessinées en tant que nœuds et les relations entre entités sont dessinées sous forme d'arcs explicites entre ces nœuds (UML, Simulink, LabView)

Les langages graphiques autorisent souvent les sous-langages textuels sous forme d'annotations dans les nœuds et sur les arcs. Les langages graphiques Odder permettent récursivement les graphes (avec du texte :) en nœuds et en arcs. Des langages graphiques vraiment étranges permettent aux graphes d'annotation de pointer vers des graphes annotés.

La plupart de ces langages sont basés sur un très petit nombre de modèles de calcul:

  • Le lambda calcul (base pour Lisp et tous les langages fonctionnels)
  • Systèmes de publication (ou techniques de réécriture chaîne / arbre / graphique)
  • Machines de Turing (modification d'état et sélection de nouvelles cellules mémoire)

Étant donné que la plupart des industriels se concentrent sur les langages procéduraux et les structures de contrôle complexes, vous êtes bien servis si vous apprenez l’un des langages les plus intéressants de cette catégorie, en particulier s’il inclut une forme ou une autre d’orientation objet.

Je recommande vivement d'apprendre Scheme, notamment à partir d'un livre vraiment merveilleux: Structure et interprétation des programmes informatiques . Ceci décrit tous ces concepts de base. Si vous connaissez ce genre de choses, d’autres langues sembleront assez simples, à l’exception de la syntaxe loufoque.

Ira Baxter
la source
3
Très bonne réponse! En guise de suivi (existe-t-il un moyen de poser une question complémentaire dans SO?), Y a-t-il un langage que je pourrais maîtriser et qui prétend comprendre tous les concepts du logiciel de programmation? Serait-ce Lisp (ou un dialecte tel que Scheme)?
@Anirudh: Il n'y a pas de mécanisme de suivi officiel, mais vous pouvez ouvrir une nouvelle question. Si elle contient une justification et un lien vers cette question, il se peut même qu'elle ne soit pas fermée. ;) Pour répondre à votre question, je suis tout à fait convaincu qu'il n'y a pas qu'un seul langage, car les paradigmes sont trop différents.
@Anirudh: D'accord avec John Y, il n'y en a pas qu'un. Mais si vous êtes relativement nouveau dans le domaine, vous devriez dépenser une énergie considérable pour maîtriser le paradigme procédural (je considère OO comme une spécialisation). Il n’aurait pas de mal à chercher d’autres paradigmes (logique, contrainte, flux de données) pour avoir une idée de leur fonctionnement, mais pour la plupart des travaux industriels quotidiens, les langages procéduraux sont en quelque sorte le roi.
Ira Baxter
1
Comme avec les langues naturelles, "plus difficile à comprendre" est subjectif et dépend de la première langue que vous apprenez.
NullUserException
1
@NullUserException: Ceci suggère que vous devriez choisir votre première langue avec soin, afin de maximiser la facilité de compréhension des autres. C'est le but de Scheme, et en particulier du livre SICP.
Ira Baxter
6

Les langages de description matérielle sont des langages de programmation, mais ils sont très différents sur le plan conceptuel. Essayez VHDL ou Verilog pour la taille. Ils sont courants pour la programmation des FPGA. (Bien, ce ne sont donc pas des processeurs, mais des appareils informatiques à usage général. Ce matériel devrait être considéré comme valide pour les sujets liés à l'informatique.) Vous devez explicitement faire en sorte que les choses se déroulent en série. C'est un modèle complètement différent. Vous pensez que les choses se déroulant en parallèle sont la règle et non l’exception. Les boucles For dans Verilog s'étendent au matériel parallèle. Donc, le comportement "attendu" peut ne pas être ce que vous attendez.

NoMoreZealots
la source
C'est un bon point. Je vais chercher Verilog / VHDL.
J'ai toujours pensé que les langages de programmation conventionnels constituaient un moyen vraiment déplaisant de coder des programmes naturellement parallèles, tels que le VHDL. Lorsque vous débutez en tant que concepteur de matériel, cette partie de tout ce qui se passe en série semble incroyablement maladroite. (Nous enseignons aux gens le mauvais langage de programmation comme premier langage: ce devrait être Verilog!).
Ira Baxter
4

Cela dépend de ce que vous entendez par "fondamentalement". Toutes les langues, quelle que soit leur flexibilité, sont Turing-complete. En ce sens: oui, ils sont tous fondamentalement les mêmes.

À un niveau bas, ils effectuent tous des séquences d'opérations similaires et tous les éléments Windows, Linux et OS X (récents) s'exécutent tous sur des processeurs compatibles Intel utilisant les mêmes jeux d'instructions. De cette façon, ils sont aussi fondamentalement les mêmes.

Je me rends compte que vous avez en quelque sorte défini «fondamentalement» votre question, mais pour y répondre réellement, cette définition devra être beaucoup plus précise. À bien des égards, ils se ressemblent tous. À bien des égards, ils sont distincts. C'est trop facile de dire "ça dépend". Si vous prenez l’un ou l’autre des extrêmes, la question ne répondra probablement pas à ce que vous souhaitez, alors il est crucial de tracer la ligne de démarcation pour répondre à la question comme vous le souhaitez.

Dinah
la source
3

Je dirais qu'une langue encode le sens. Si le sens a un sens dans un contexte donné, toutes les langues pouvant exprimer ce sens peuvent être considérées comme équivalentes limitées par le sens et le contexte.

Si vous limitez ce contexte à une machine standard de Von Neumann, les significations informatiques de la modification de la mémoire et de l'informatique dans un processeur peuvent être considérées comme étant l'origine - et peut-être le seul sens commun à toutes les langues. Toutes les autres choses sont construites sur l'abstraction.

Preet Sangha
la source
1
John von Neumann. Et ce n'est pas prononcé comme "newman", mais plutôt comme "noyman".
Merci pour la correction - je prononce est est comme tu as dit cependant.
Preet Sangha
Lorsque quelqu'un propose une correction, vous pouvez simplement modifier votre message pour le refléter.
Phil Miller
2

Les langages de programmation sont aussi des outils de réflexion. Dans une autre perspective, certains problèmes disparaissent ou sont transformés en un type différent, plus facile à gérer (par exemple, de nombreux modèles de conception de style C ++ disparaissent lorsque vous réfléchissez dans Lisp (voir par exemple la présentation de Peter Norvik ), et Erlang vous libère de la pensée. concurrences de bas niveau ou de constructions informatiques distribuées et vous permet de vous concentrer sur la logique de l'application).

Notez cependant que parfois les "nouveaux" paradigmes peuvent être partiellement appliqués aux "anciens" langages de programmation, ce qui explique pourquoi nous avons par exemple des livres qui enseignent la programmation fonctionnelle pour les programmeurs Java . Mais soutenir nativement et intégrer un paradigme plus puissant au niveau linguistique permet une application plus naturelle du paradigme (et rend par conséquent impossible la compréhension de programmes dans un langage supportant un paradigme inconnu, comme le suggèrent d'autres réponses - @Ira Baxter listant les langages non procéduraux et @kwatford faisant référence à Paul Graham ).

FooF
la source
2
+++++++[>+++++++++++<-]>+.<+++++++++++[>+++<-]>.>>+++++++[>++++++<-]>++++.

Au niveau le plus bas, tous les langages de programmation sont les mêmes, mais cela ne signifie pas qu'ils sont identiques au niveau où vous interagissez réellement. Ils résument des problèmes pour vous; cela ne veut pas dire qu'ils résument les mêmes problèmes ou qu'ils résument chaque problème de la même manière.

asthasr
la source
1

Les langues matures ont généralement quelques objectifs et font des compromis en sacrifiant une chose pour une autre. Un langage polyvalent peut être utilisé pour n'importe quoi, mais aucun langage ne peut exceller dans tous les domaines. Quelques exemples:

C tente d’être un langage de programmation système idéal. À cette fin, il sacrifie la lisibilité et la sécurité pour un contrôle et une vitesse de bas niveau.

Python se veut un langage de script idéal. À cette fin, il sacrifie la rapidité et la vérifiabilité pour la productivité et la portabilité.

Haskell tente d'être un langage sûr, pur sur le plan mathématique. À cette fin, il sacrifie la capacité d'apprentissage et les conventions en matière de vérifiabilité et de fiabilité.

Ces sacrifices et avantages font une énorme différence dans la langue. Oui, la plupart des langages de programmation peuvent être utilisés pour tout ce qui peut être fait par un ordinateur, mais aucun de ces mêmes langages ne devrait être utilisé pour tout. Toutes les langues ci-dessus sont celles que je choisirais pour certaines tâches mais pas pour d'autres. Si je programmais un système d'exploitation, je choisirais C. Si j'écrivais un backend pour un site Web, j'utiliserais Python. Et si j'écrivais un système financier, j'utiliserais Haskell.

En fin de compte, votre choix en tant que programmeur est le bon outil pour le travail.

Imagiste
la source