pourquoi ne pas combiner les meilleures fonctionnalités de tous les langages de programmation existants et les intégrer dans un langage de programmation universel?
Pour la même raison, vous n'utilisez pas un couteau suisse pour sculpter un poulet ...
Le couteau de l'armée suisse a généralement une lame, ainsi que divers outils, tels que des tournevis et des ouvre-boîtes et bien d'autres. Ces attachements sont rangés à l'intérieur de la poignée du couteau grâce à un mécanisme de point de pivot ...
La conception du couteau et sa flexibilité ont toutes deux conduit à une reconnaissance mondiale ...
Parce que
Ce que vous avez en programmation est un très gros domaine problématique. Ce domaine s'étend extrêmement et dans de nombreuses directions.
C'est pourquoi les contrôleurs de vol intégrés sont écrits en C et les sites Web sont écrits en PHP, Java, Rails, .NET et une multitude d'autres.
Pour le contrôleur de vol intégré, j'ai environ 128 Ko de mémoire pour travailler avec et en plus si mon code obtient une exception non gérée, l'avion se bloque, 200 personnes meurent et je suis poursuivi pour un montant de 1 milliard de dollars, et je dois envoyer des ingénieurs à chaque aéroport dans le monde pour réparer les avions au sol qui perdent 10 millions de dollars par jour à mes clients. Je dois travailler avec un langage très serré et avec un petit nombre de pièces mobiles qui pourraient mal tourner.
Pour mon application Web, j'ai plusieurs Go de mémoire pour travailler, mais la vitesse du réseau est limitée (à un moindre degré tous les jours, mais c'est probablement la plus grande limite du Web). Je vais regarder un langage qui me donne une tonne de fonctionnalités et produit une sortie qui peut être transmise le plus rapidement possible. Peu m'importe si mon site tombe en panne, je vais peut-être perdre quelques ventes (100 $) et devoir patcher le cas d'utilisation qui a bombardé, ce n'est pas grave.
Les sites Web n'ont pas été écrits en C depuis plus de 15 ans (n'importe qui fait des scripts cgi?) Et pour autant que je sache, les contrôleurs de vol commencent à peine à regarder C++, mais même de manière très restreinte.
Si vous n'avez pas de boîte à outils, ou si vous n'avez qu'un de ces petits marteaux avec les embouts de tournevis dans la poignée creuse, alors j'ai une grande sympathie pour vous.
Sérieusement. Si vous allez dans un atelier automobile, votre mécanicien n'a-t-il qu'un seul outil tout faire dans son ensemble d'outils? Il (ou elle) est un professionnel, avec des outils de qualité professionnelle spécialement conçus pour effectuer diverses tâches de réparation automobile.
De même, les développeurs de logiciels professionnels devraient posséder un ensemble d'outils suffisant pour effectuer leur métier. Si vous ouvrez votre boîte à outils et voyez uniquement [l'équivalent logiciel] d'un tournevis Philips, vous ne pouvez pas vous considérer comme un professionnel.
Vous pouvez tourner un boulon avec une clé à fourche, une clé à fourche, une clé à cliquet ou une clé à molette. Vous pouvez même tourner un boulon dans une pincée avec une pince à joint coulissant, maladroitement, avec des dommages mineurs à graves. Mais il est assez difficile de tourner un boulon avec un marteau.
Un autre type de réponse aux autres - je pense en fait qu'il y a un potentiel pour qu'un langage devienne "universel", permettant les caractéristiques et les paradigmes de de nombreuses autres langues, mais ce n'est peut-être pas une langue strictement conçue à laquelle vous pourriez penser.
Pour utiliser analogie de brettmjohnson ci-dessus, l'idée que chaque langage de programmation est l'outil à l'intérieur d'une boîte (ou sur un couteau suisse) est l'hypothèse que tout le monde fait, mais c'est vraiment une hypothèse erronée.
Et si le langage de programmation était la boîte à outils?
Je veux dire, si vous pouvez ajouter et supprimer des fonctionnalités de la langue à votre guise, et avoir votre propre boîte à outils avec les outils dont vous avez besoin - même si les outils sont à des fins différentes.
Le concept existe déjà partiellement. Par exemple, des langues comme Nemerle vous permettent de ajouter une syntaxe à la langue , et en tant que tel, vous pourriez être en mesure de prendre "la meilleure fonctionnalité de la langue X", et d'ajouter à Nemerle (ou le vôtre). Cela ne signifie pas nécessairement écrire vos propres macros tout le temps non plus - chaque langue (ou paradigme) pourrait être définie à l'intérieur d'une macro dans une bibliothèque standard - de telle sorte que vous pourriez import Haskell; import Prolog;
, et commencer à écrire les deux langues comme si elles faisaient partie de votre langue?
La question est alors - comment faire fonctionner les fonctionnalités de différents langages/paradigmes? Bien que je ne puisse pas répondre à cela, les frameworks comme .Net et JVM offrent une partie de la solution - les langages sont au moins partiellement compatibles en raison de la façon dont ils sont compilés. Vous pouvez prendre n'importe quel code écrit en C # par exemple, et l'utiliser depuis F # sans vous plaindre.
Le `` problème '' avec la solution telle qu'elle est aujourd'hui, est que l'utilisation conjointe de ces langues vous oblige à les créer en tant que projets séparés, qui ne peuvent pas se référencer mutuellement - vous ne pouvez avoir qu'une référence à sens unique. La barrière linguistique est que chaque projet compile tous ses fichiers séparément dans Common Intermediate Language avant que tout autre projet puisse y accéder.
Un tremplin vers la suppression de cette barrière serait de permettre au code de différents langages (par exemple, C # et F #) de se compiler dans le même projet. En théorie, vous pouvez compiler chaque fichier séparément (ou en groupes - s'ils ont des types partiels ou des références circulaires), puis compiler des fichiers d'un langage différent qui peuvent accéder à ces objets déjà compilés (CIL). Vous devrez cependant définir strictement l'ordre de compilation pour que cela fonctionne - mais l'ordre de compilation est déjà requis dans le cas de F #.
Quoi qu'il en soit, je ne dis pas "il peut certainement y avoir un langage universel". Je suggère qu'il existe un potentiel pour une bien meilleure interopérabilité entre les langues que ce qui existe actuellement. En réalité, il est peu probable qu'il s'améliore considérablement très bientôt, simplement en raison de l'énorme quantité de travail qu'il faut pour implémenter un langage et les bibliothèques, les outils, etc. nécessaires pour l'utiliser.
Les meilleures fonctionnalités de certaines langues entrent en conflit avec les meilleures fonctionnalités d'autres.
Par exemple: les réflexions sensibles au type sont une fonctionnalité vraiment agréable, mais cela ne vaudrait pas beaucoup dans un langage peu typé, mais une frappe lâche peut parfois être un réel avantage.
Même dans une langue, vous ne pouvez pas toujours utiliser toutes les meilleures fonctionnalités en même temps car elles sont en conflit les unes avec les autres.
"Jack de tous les métiers - maître de rien." vient à l'esprit.
Certains programmes nécessitent de la vitesse, d'autres de grandes quantités de mémoire ou un accès rapide au disque. Certaines langues sont bonnes dans une, mais mauvaises dans une autre - je ne pense pas que vous obtiendriez une langue qui soit bonne du tout.
Ainsi, bien que vous puissiez écrire pratiquement n'importe quel programme dans n'importe quelle langue, ce que vous obtenez n'est pas garanti d'être le "meilleur" programme que vous pourriez écrire pour résoudre ce problème.
Les langues façonnent la façon dont les gens pensent. Cela est vrai pour les langues naturelles. Si un enfant ne connaît qu'une seule langue avec les chiffres "un, deux, plusieurs", enseigner que les mathématiques de l'enfant est ... difficile. (Désolé, je n'ai pas le lien) En anglais, nous parlons de différentes époques comme s'il s'agissait de lieux - d'où la possibilité d'imaginer le concept de voyage dans le temps. Dans certaines autres langues, l'idée de voyager dans le temps jamais viendrait à l'esprit de ses locuteurs.
Cela est également vrai pour les langages de programmation.
Par conséquent, si nous avons un seul langage de programmation, tout le monde pensera exactement à toutes les tâches de calcul de la même manière. Ainsi, nous n'explorerons pas d'alternatives, et la meilleure façon de faire quelque chose restera à découvrir.
La chose la plus proche que nous ayons d'un langage universel est C.C correspond très étroitement aux concepts matériels sous-jacents (comment les choses se font réellement dans le matériel) et les programmes dans chaque * langage sont convertibles en C. (Voir comment CFront a utilisé les compilateurs C pour l'assembleur tâches) Le problème avec C est fondamentalement que les conversions mentionnées ci-dessus n'auraient pas de sens du point de vue des programmeurs C.
"Lambdas" était toujours possible en C. La syntaxe est désactivée, y compris le code réparti sur l'ensemble du projet/fichier, donc ce n'était pas une solution préférée. Avec une version sans capture/upvalue/etc, définissez une fonction ailleurs et passez un pointeur sur la fonction. (voir qsort ()) Pour utiliser des lambdas avec des valeurs capturées, la quantité et la complexité du code que vous devez écrire augmentent beaucoup - pour autant que je sache, personne n'a jamais écrit le code à utiliser cette méthode de programmation en C. Contrairement aux langages où les lambdas font partie du langage, et sont essentiellement utilisés partout.
La principale différence entre C et C++ est de savoir comment vous pouvez demander à C++ de prendre soin de stuff pour vous; mais alors vous ne pouvez plus voir, à partir d'une seule ligne de code, combien vous lui demandez vraiment. La réponse devient: cela dépend (de tous ces autres codes).
Certains langages de programmation sont excellents pour des tâches spécifiques, mais là où la plupart des programmes actuellement utilisés dans le monde n'auraient tout simplement aucun sens s'ils étaient programmés dans ce langage. Autrement dit, si le langage pouvait être utilisé pour implémenter ce programme pour commencer, ce qui n'est pas une donnée.
Il y a. Aucun outil n'est le meilleur pour tout, mais certains outils comme de nombreux langages de programmation servent à toutes fins, pas meilleur à tous.
Vous pouvez choisir le meilleur outil pour le travail, mais il existe des langages de programmation pouvant être utilisés à toutes fins et vous pouvez les choisir. Je ne le recommande pas mais c'est possible.
C'est une erreur de penser que "combiner toutes les fonctionnalités" fera un meilleur langage.
Vous êtes plus susceptible de vous retrouver avec un désordre gonflé, complexe et illisible.
Une bonne conception du langage nécessite un choix et des compromis. On peut dire que les langues les meilleures/les plus révolutionnaires/les plus réussies sont celles qui retirent quelque chose et fournissent une meilleure alternative plutôt que d'ajouter de nouvelles choses.
Il y a une grande discussion à ce sujet par Oncle Bob Martin - The Last Programming Language
L'impossibilité sur les mérites techniques d'avoir un langage universel? C'est un non-sens total. Vous pourriez avoir un langage universel qui couvre toutes les bases. Le problème est surtout historique: différentes langues ont été inventées pour faire des choses différentes et être utilisées dans différentes communautés. Beaucoup d'entre eux sont restés. Ajoutez à cela des préférences (vi! Emacs! Attendez, je voulais dire Java! C #, attendez je voulais dire Microsoft, Open Source, etc. etc. etc.) et l'intégration générale des accidents historiques ... Regardez les langages naturels dans un petit pays masse comme certains pays européens pour voir à quel point ce sujet peut devenir fou. Certaines villes ont leur propre fierté et joie, un petit dialecte dont elles seules parlent. Les nations et les communautés de programmation ne sont pas si différentes, et les communautés de programmation ne sont pas plus rationnelles. S'ils l'étaient, nous parlerions tous l'espéranto et programmerions dans Universal Somethin 'Somethin' ...
À cause de quelque chose que j'appelle le "paradoxe de généralisation/spécialisation", qui a probablement un autre nom et n'est vraiment pas un paradoxe
Plus un langage de programmation est généralisé, plus il faut de code pour accomplir quelque chose. Plus la langue est spécialisée, moins vous pouvez en faire.
Avec tout ce qui a été écrit jusqu'à présent, il est difficile d'ajouter beaucoup de nouvelles raisons, mais j'en ajouterai quelques-unes.
Évolution: ce ne sont pas seulement les systèmes biologiques qui sont introduits, mutent et subissent une compétition de survie des plus aptes pour les ressources et une niche à appeler les leurs. La compétition est bonne et fait avancer les choses.
Maturité: Nous fabriquons des langages informatiques depuis probablement moins d'un siècle. Nous ne pouvons pas encore avoir la réponse car nous ne connaissons même pas encore toutes les questions.
Genèse distincte: Je ne sais pas quel est le bon mot pour cela, mais dans le monde, il existe de nombreux systèmes d'écriture qui ont commencé dans de nombreuses régions géographiques. Pensez à Cuneiform qui a été dicté en partie par les exigences de la sculpture en tablettes d'argile. Pensez au sanskrit, aux alphabets grec, hébreu, romain et arabe. Hiéroglyphes, la méthode chinoise de belle écriture avec plus de 6000 symboles qui est partagée dans de nombreux pays d'Asie de l'Est. Pensez à des alphabets mixtes plus modernes avec une base phonétique comme le cyrillique, le katakana et l'hirigana. Je ne suis pas linguiste, alors ne flambez pas trop les inexactitudes, mais lorsque les cultures du monde entier ont besoin de quelque chose, elles le créeront et se l'approprieront par nécessité. Les langages informatiques sont apparus quand il y avait beaucoup de communication dans le monde et comme les systèmes impérial et métrique, ils venaient d'endroits avec un puissant leadership d'idées. Mais les langages de programmation servent de nombreuses cultures différentes (certaines d'entre elles sont des cultures d'entreprise), ils reflètent donc les personnes qui les ont créés. Les langages informatiques s'accompagnent d'un héritage culturel qui a façonné leur conception et leur utilisation. Dans la culture du noyau du système d'exploitation, il est peu probable que C et C++ soient bientôt obsolètes pour Java (ou l'inverse)) car ils permettent la génération de code natif, le couplage étroit/efficace avec le matériel pour créer l'abstraction matérielle couches, et ont une base installée importante.
Conception de la conception: les langages de programmation proviennent de l'utilisation de différents paradigmes organisationnels. COBOL et Ada provenaient de comités qui faisaient partie du DOD et qui avaient beaucoup de hiérarchie. Si je me souviens bien C, C++, Java et probablement beaucoup d'autres provenaient d'un ou d'un petit nombre de concepteurs. Fred Brooks compare les résultats du comité aux approches basées sur les visionnaires dans son article, Design of Design (http://www.youtube.com/watch?v=pC-DlX-PaF4). Si nous nous réunissions aujourd'hui pour sélectionner un Da Vinci ou un comité pour définir le langage de programmation universel, saurions-nous qui ou quoi par quelle méthode il devrait être conçu?
Peut-être un peu différent sur tout cela:
Qu'est-ce qu'une langue? Pour être ridiculement simple, c'est le vocabulaire, la syntaxe et la sémantique.
Quelle est la première chose que vous faites avec un langage de programmation?
Vous définissez des choses - classes, variables, méthodes - vous étendez le vocabulaire et la sémantique.
Pourquoi? Alors maintenant, vous pouvez dire des choses que vous ne pouviez pas dire auparavant.
Que cela vous plaise ou non, vous avez créé un nouveau langage spécifique.
À mon humble avis, la chose à rechercher dans une langue à usage général est si elle facilite la création de langues à usage spécial.
Il n'y a aucun outil qui possède toutes les meilleures fonctionnalités. Par exemple, une des belles fonctionnalités de Javascript et Scheme est qu'elles sont petites, donc si vous commencez à emballer des fonctionnalités, vous avez déjà perdu sur celui-ci.
Toujours Cobra semble prometteur dans le sens d'avoir toutes les fonctionnalités de Nice à partir d'autres langues. :-)
Hormis l'argument du couteau suisse (qui a un point - il est plus difficile de concevoir un bon langage à large spectre qu'un domaine- spécifique - mais cela ne signifie pas qu'un tel langage ne serait pas à la fois possible et une bonne idée), il y a des problèmes avec "combiner les meilleures fonctionnalités":
En bref, la conception du langage est plus difficile et plus compliquée que cela. Cependant, vous voudrez peut-être jeter un œil à Scala .
Parce que si vous créez une telle langue, ce sera encore une autre nouvelle langue. Vous pourriez avoir une grande base de fans, mais toutes les autres langues existeront toujours.
C existe toujours même si de nombreux nouveaux langages ont été inventés depuis.
On pourrait dire que python est un tel langage universel, mais il y a aussi Ruby.
La raison pour laquelle il existe de nombreux langages est tout simplement parce qu'il existe de nombreux programmeurs et certains d'entre eux aiment créer de nouveaux langages.
La raison pour laquelle il n'y a pas de langage universel unique sur lequel tout le monde est d'accord est que la programmation en tant qu'artisanat n'est pas dictée par une institution qui prend toutes les décisions. Chacun est libre de faire ce qu'il veut.
C'est une bonne chose.