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?
la source
Réponses:
Les bases de la plupart des langages procéduraux sont à peu près les mêmes.
Ils offrent:
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
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:
Il existe deux principaux styles de représentation pour les langues:
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:
É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.
la source
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.
la source
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.
la source
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.
la source
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 ).
la source
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.
la source
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.
la source