À quoi voulez-vous que les créateurs de langue s'intéressent? [fermé]

38

Le but de cette question n'est pas de dresser une liste exhaustive de fonctionnalités de langage de programmation sans lesquelles vous ne pourriez pas vivre ou que vous souhaitiez être dans la langue principale de votre choix. Le but de cette question est de mettre en lumière des recoins du design linguistique que la plupart des concepteurs de langage pourraient ne pas penser. Ainsi, au lieu de penser à la fonctionnalité de langage X, pensez un peu plus philosophiquement.

Un de mes partis pris, et peut-être que cela puisse être controversé, est que le côté le plus délicat de l’ingénierie - le pourquoi et le pour lequel - est plus important que le côté plus concret. Par exemple, Ruby a été conçu dans le but d'améliorer le bonheur des développeurs. Bien que vos opinions puissent être partagées sur le point de savoir si cela a été livré ou non, le fait qu’il s’agisse d’un objectif signifie que certains des choix de conception de langage ont été influencés par cette philosophie.

Merci de ne pas poster:

  • Syntaxe des guerres de flammes. Regardons les choses en face, nous avons nos préférences et la syntaxe est importante en ce qui concerne la conception du langage. Je veux juste éviter les batailles épiques de la nature de emacs vs. VI (dont un grand nombre de personnes ne savent rien aujourd'hui).
  • Les commentaires de type "Toute langue dépourvue de fonctionnalité X ne mérite pas d'exister". Tous les langages de programmation ont au moins une raison - bonne ou mauvaise.

S'il vous plaît faire après:

  • Idées philisophiques que les concepteurs de langage semblent manquer.
  • Les concepts techniques qui semblent être mal mis en œuvre le plus souvent. Veuillez donner un exemple de la douleur que cela provoque et si vous avez une idée de la façon dont vous préférez que cela fonctionne.
  • Les éléments que vous souhaitez figurent dans la bibliothèque commune de la plate-forme, mais ils le sont rarement. De la même façon, les éléments qui se trouvent généralement dans une bibliothèque commune et que vous ne souhaitez pas.
  • Fonctionnalités conceptuelles telles que la prise en charge intégrée du traitement des tests / assertions / contrats / erreurs que vous souhaitez que tous les langages de programmation implémentent et définissent correctement.

J'espère que ce sera un sujet amusant et stimulant.

Edit: Clarifié ce que je veux dire par la syntaxe Flame Wars. Je n'essaie pas d'éviter toute discussion sur la syntaxe, en particulier parce que la syntaxe est un élément fondamental de la conception du langage de programme.

Berin Loritsch
la source
Dire que la syntaxe est juste un détail d'implémentation est tout simplement faux. La conception de la syntaxe est une partie essentielle de la conception d’une langue. Et beaucoup des points que vous ne voulez voir affiché peut effectivement impliquer la syntaxe. Pitié. Semblait être une question intéressante.
Konrad Rudolph
Ce que je veux éviter, c'est la guerre des flammes. Si vous pouvez discuter de la syntaxe sans déclencher une guerre des flammes, allez-y.
Berin Loritsch le

Réponses:

49

Support Unicode par défaut

De nos jours, les programmes sont développés pour être utilisés à l’international ou dans l’hypothèse où ils pourraient être utilisés à l’international. Ils doivent fournir un soutien pour leurs jeux de caractères ou rendre des programmes écrits dans cette langue inutiles.

Malfiste
la source
2
+1 En fait, le langage lui-même devrait vous permettre d'utiliser n'importe quel caractère pour vos identifiants. Nous ne sommes pas tous anglais.
Berin Loritsch le
13
@Berin: En fait, même si je suis français, je préfère de loin les programmes en anglais. Le problème est un problème de communication. Si vous écrivez des programmes avec des identifiants hongrois, espagnols ou portugais, ne vous attendez pas à ce que je sois capable de me lancer ... dans un contexte d’internationalisation, il est extrêmement important que les développeurs puissent communiquer entre eux. , et cela implique l’utilisation d’un langage commun pour les identifiants, les commentaires et la documentation. L'anglais est la lingua franca des développeurs.
Matthieu M.
11
J'ajouterais que la prise en charge de l'unicode devrait être naturelle lors de l'utilisation du langage. Si possible, cela ne devrait pas demander d'effort supplémentaire pour "l'ajouter", il devrait "fonctionner" (dans la mesure du possible).
RHSeeger
4
Dans le même ordre d'idées, le langage devrait établir une distinction fondamentale entre le texte (séquence de caractères) et les données binaires (séquence d'octets). C # obtient ce droit avec stringet byte[]. Comme le fait Python 3.x avec stret bytes. C (++) charse trompe terriblement.
dan04
1
@RHSeeger - en effet !!! Même en Python, vous devez taper u'My Unicode Štring'. J'aimerais que vous puissiez simplement oublier le type de chaîne que vous utilisez et écrire du code friggin.
Orokusaki
25

J'ai un couple:

  • Génériques / modèles. Par exemple, les génériques Java sont puissants, mais pas nécessairement flexibles. De plus, comme ils utilisent le type effacement, j'ai rencontré des problèmes pour les implémenter de manière abstraite, en particulier dans les interfaces. Et le compilateur ne devrait pas avertir lorsqu'un générique non spécifique est utilisé (comme Hashmapau lieu de Hashmap<String, int>). Je pense qu'ils pourraient être améliorés de manière significative. De bons modèles sont très utiles, mais souvent négligés.

  • Le support de Good Date dans la bibliothèque standard. Je veux dire pouvoir ajouter et soustraire des dates, des heures et des minutes et ne pas avoir à gérer le nombre de millisecondes écoulées depuis le 1er janvier 1970.

Michael K
la source
2
"bon support date" est une exigence assez raide cependant! Qu'est ce que ça veut dire? Je pense que les dates et les heures sont l’une des choses pour lesquelles on ne peut pas tout avoir. soit vous le faites simple et faux, soit vous le rendez juste et imparfaitement compliqué. c'est VRAIMENT difficile de trouver un terrain d'entente.
Sara
@kai Le fait est que le support de date est généralement assez terrible. Le vieux java.util.Datea presque tous les pièges et problèmes possibles. Je ne connais qu'une partie du nouveau java.time.*package, mais il est propre, facile à utiliser et exempt de bugs AFAICT. Les utilisateurs plus avancés peuvent trouver des problèmes, mais c'est une amélioration énorme. +++ Le problème semble être que c'est un problème compliqué et que la première version est précipitée et cassée.
Maaartinus
24

Veuillez rendre votre langue analysable / auditable pour les responsables de la sécurité informatique.

Les personnes chargées de la sécurité doivent être en mesure de détecter les vulnérabilités d'un programme avant son expédition. Idéalement, nous sommes appelés tôt et pouvons commenter la base de code au fur et à mesure de son développement, mais souvent pas.

Quand une nouvelle version du langage ou des librairies de base sortent, les choses qui étaient auparavant sûres ne sont peut-être plus:

  1. les bibliothèques peuvent devenir plus puissantes: par exemple, la bibliothèque d'URL prend désormais en charge javascript:
  2. il peut y avoir de nouvelles façons de convertir des chaînes ou des octets en code: par exemple, evalou des bibliothèques de désérialisation
  3. les techniques de réflexion linguistique peuvent devenir plus puissantes: par exemple, exposer des variables locales

N'importe lequel de ces changements peut augmenter la quantité d'autorité abusable d'un programme, mais comme l'autorité utilisée par le programme (lorsqu'il traite avec des clients non malveillants) n'a pas changé, les responsables de la sécurité ont du mal à comprendre cela sans une utilisation intensive. ré-audit.

Alors, pensez à nous lors de la conception et de la gestion de la langue. Voici quelques conseils:

Définissez quelques primitives dans lesquelles un programme peut être décomposé.

HTML5 est particulièrement mauvais de cette façon. Ils ont évidemment beaucoup réfléchi à la sécurité et ont des personnes très intelligentes, mais au lieu de spécifier de nouveaux éléments de programme, tels que les <video>anciens, ou de créer une abstraction commune que les nouveaux <video>et les anciens <img>puissent être spécifiés, <video>c'est encore un autre élément ponctuel du programme avec ses propres conséquences pour la sécurité.

Assurez-vous que votre langage est sujet à l'analyse statique (même s'il n'est pas typé de manière statique).

Les spécialistes de la sécurité ont souvent recours à l'analyse statique pour rechercher des modèles et pour tenter d'éliminer certaines parties d'un programme afin qu'ils puissent se concentrer sur les éléments les plus difficiles.

Il devrait être évident que les identificateurs sont des variables locales et ceux qui ne le sont pas.

Par exemple, ne commettez pas la même erreur que les anciennes versions de JavaScript, il était donc impossible de savoir s'il xs'agit d'une référence de variable locale dans la liste ci-dessous (d'après une lecture littérale d'une ancienne version de la spécification):

if (Math.random() > 0.5) {
  Object.prototype.x = 0;
}

function f() {
  var x = 1;
  (function () {
    alert(x);  // Might alert 0, might alert 1.
  })();
}

Autoriser la sécurité décomposable

Un grand nombre de systèmes sécurisés sont conçus autour d'un noyau sécurisé qui préserve les propriétés de sécurité, afin que les spécialistes de la sécurité puissent concentrer leurs efforts sur l'analyse d'une petite quantité de code et évitant ainsi à la plupart des programmeurs d'avoir à traiter avec des spécialistes de la sécurité {agaçants, pédants, paranoïa} .

Il devrait être possible d'écrire un tel noyau dans votre langue. Si l'une des propriétés de sécurité de votre langue est que seul un certain sous-ensemble d'URL sera récupéré, les auteurs du noyau peuvent-ils faire quelque chose pour canaliser toutes les URL extraites à travers leur code? Ou bien les vérifications de construction statiques (telles que l’analyse des importations) remplissent la même fonction.

Certaines langues telles que Newspeak utilisent un modèle de fonctionnalités d'objet. C'est génial et un excellent moyen d'obtenir une sécurité décomposable.

Mais si vous ne pouvez pas faire cela, transformer le graphique en module en un artefact analysable statiquement peut vous procurer un avantage certain. Si je peux prouver qu'un module ne peut pas atteindre le module d'E / S de fichier (sauf en appelant du code dans un module du TCB), je peux alors exclure des classes entières de problèmes de ce module.

Limiter l'autorité des langages de script intégrés

Un grand nombre de systèmes utiles sont organisés comme un noyau statique qui lance beaucoup de code écrit dans des langages dynamiques (même fonctionnels).

Et l'intégration de langages de script peut rendre un système beaucoup plus extensible.

Mais un langage de script ne devrait pas avoir toute l'autorité de la machine virtuelle.

Si vous choisissez d'autoriser les langages de script intégrés, aidez-le à limiter ce qu'il peut faire. Un modèle de capacités d'objet (voir le commentaire sur Newspeak ci-dessus) est très approprié ici; Ainsi, lors de l'évaluation du code dans un langage de script, l'appelant doit transmettre le code à exécuter et toutes les variables globales pour ce code.

Traiter evalcomme un langage s’intégrant comme un langage de script

Si votre langage peut appeler son propre compilateur pour transformer une chaîne en code, autorisez-le à être mis en bac à sable de la même façon que vous le feriez avec un langage de script intégré.

Utilisez un modèle de concurrence simple

Nous, les responsables de la sécurité, n’aimons pas avoir à nous inquiéter des conditions de concurrence lorsque nous essayons de déterminer si une propriété de sécurité est conservée.

Veuillez envisager des alternatives au threading avant de choisir des threads comme une option par défaut presque impossible à sécuriser.

Un exemple simple est la concurrence d'accès aux boucles d'événement, similaire à celle trouvée dans E, Verilog et JavaScript.

N'encourage pas la confusion

Certaines langues sont des langues collées, et elles finissent par traiter des chaînes dans beaucoup de langues différentes.

Par exemple, JavaScript compose souvent des chaînes HTML, CSS, XML, JSON et même JavaScript. Il est très difficile pour les programmeurs de se rappeler d’encoder correctement les chaînes de texte brut lorsqu’ils les combinent pour créer des chaînes dans d’autres langues. Les programmes JS ont donc, sans surprise, toutes sortes de problèmes de confusion entre guillemets: XSS étant le pire.

Si vous souhaitez inclure des fonctionnalités de composition de chaîne, essayez de réduire la charge de sécurité du programmeur. Les DSL, les macros hygiéniques et les langages de gabarit intégrés peuvent être un excellent moyen de le faire en allégeant la tâche qui consiste à échapper correctement aux développeurs de bibliothèques ou de langages et à les éloigner du développeur final.

Mike Samuel
la source
Belle panne.
Qix
23

Certaines des meilleures langues ont été conçues par des personnes qui voulaient se créer une langue.

Je pense donc que les concepteurs de langues devraient accorder moins d’attention à leurs utilisateurs. Vous ne pouvez pas plaire à tout le monde, vous ne devriez pas non plus essayer.

dan_waterworth
la source
4
Cela peut être vrai dans une certaine mesure. Cependant, si vous n'écoutez jamais vos utilisateurs, vous ne connaissez jamais la douleur que vous leur infligez lorsqu'ils essaient d'utiliser votre cerveau. Sans entendre ni ressentir cette douleur, vous ne trouverez jamais la prochaine grande idée qui résoudra ce problème et d’autres. Aucun homme n'est une île. La douleur peut être un facteur de motivation important pour l'innovation.
Berin Loritsch le
5
@Berin: Je ne pense pas que le fait est que vous ne devriez jamais écouter vos utilisateurs, mais n'écoutez pas ceux qui veulent utiliser le langage pour quelque chose pour lequel il n'a pas été conçu. Si vous avez conçu une langue pour résoudre un ensemble ou des problèmes spécifiques, vous devez alors répondre aux besoins des utilisateurs qui doivent également résoudre ces problèmes. Cependant, vous vous adressez à l'extrême et parfois une langue peut trouver une niche dans un nouveau domaine, alors +1.
Jeremy Heiler
2
@ Jeremy, oui, c'est exactement ce que je dis, mais je pense qu'il est rare qu'une langue fonctionne correctement dans un domaine pour lequel elle n'a pas été conçue.
dan_waterworth
@dan_waterworth: Les langues à succès fonctionnent généralement, souvent bien, dans des domaines pour lesquels elles n'étaient pas conçues.
David Thornley
8
Au lieu de "n'écoutez pas les utilisateurs", le conseil est mieux formulé comme "n'écoutez pas les utilisateurs que vous n'avez pas".
chrisaycock
16

Seulement 5 à 10% du temps est réellement consacré à l'écriture de code. Les concepteurs de langages doivent être attentifs aux difficultés rencontrées pour que le logiciel fonctionne, ce qui signifie corriger les erreurs et les bogues.

Cela signifie qu’il devrait y avoir dès le départ un bon débogueur. Pas un outil avec une syntaxe arcanique et des commandes clés qui n’est que légèrement meilleur que des tonnes d’instructions print.

comment s'appelle-t-il
la source
2
+1 Le débogage est l’un des endroits où certaines langues sont meilleures que d’autres - et certains IDE font toute la différence entre une langue utilisable et une langue qui vous gêne.
Berin Loritsch le
2
Je vais en ajouter un peu et dire, dans la mesure du possible, des traces de pile utiles. S'il y a une erreur (ou une exception non capturée ou autre, selon votre langue), je souhaite pouvoir afficher l'intégralité de la pile d'appels qui y est parvenue, ainsi que les valeurs des arguments utilisés. Tcl le fait exceptionnellement bien .. mais, pour être juste, tout est une chaîne dans Tcl, vous pouvez donc imprimer la valeur de tout avec une relative facilité.
RHSeeger
1
Pas seulement le débogage, mais il est difficile d'écrire des bogues. J'étais tellement heureux lorsque Java a introduit la vérification automatique des limites dans les tableaux ... mais voilà, 15 ans plus tard, nous commettons encore ces erreurs dans d'autres langues.
Alex Feinman
3
Ne serait-il pas préférable d'avoir un langage qui trouve les bogues au moment de la compilation? Par exemple, lorsque j'utilise Ada, je passe beaucoup moins de temps dans le débogueur que lorsque j'utilise C ou C ++.
Martin
12

Je pense qu'ils devraient prêter attention à Python, qui fait plus de choses que toute autre langue que j'ai rencontrée (et cela même si vous n'aimez pas certaines fonctionnalités). Cela ne signifie pas qu'ils doivent émuler Python, mais il est important de savoir ce que Python a bien fait, même si vous ne voulez pas du tout créer un langage comme celui-ci.

En ce qui concerne les idées philosophiques pertinentes ici, ce sont les plus importantes du zen de Python:

  • Explicite est meilleur qu'implicite.
  • La lisibilité compte.
  • Les cas spéciaux ne sont pas assez spéciaux pour enfreindre les règles.
  • Bien que la praticité bat la pureté.
  • Il devrait y avoir une - et de préférence une seule - manière évidente de le faire.
  • Si la mise en œuvre est difficile à expliquer, c'est une mauvaise idée.
  • Les espaces de noms sont une idée géniale - faisons-en plus!

Je pense qu'un langage qui respecte ces règles doit nécessairement être assez correct, mais je ne connais que celui qui le fait, et c'est Python. Malgré toutes les similitudes avec Ruby, par exemple, dans sa mise en œuvre, Ruby omet des choses comme la lisibilité et vous invite à faire du golf au code, ce qui est amusant, mais inutile dans un cadre professionnel.

La seule caractéristique technique qui me manque en Python est une déclaration "jusqu'à ce que" (comme tout le temps, mais ne pas tester l'expression la première fois). Ensuite, il y a beaucoup de choses qui pourraient être améliorées dans les bibliothèques standard de Python et d'autres langages, mais ce n'est pas strictement des langages , c'est donc une question différente. :-)

Lennart Regebro
la source
4
Je considère deux autres choses plus importantes, en particulier au niveau de la conception linguistique: "Les cas particuliers ne sont pas assez spéciaux pour enfreindre les règles". car il est difficile d’utiliser un langage comportant un millier de cas particuliers ou de règles obscures, en conjonction avec "Bien que la commodité l'emporte sur la pureté." sinon, vous tombez dans le royaume des tentes.
15
Si explicite est préférable à implicite, pourquoi ne pas être obligé de déclarer des variables? Quand une simple faute de frappe peut causer des erreurs difficiles à déboguer (par opposition aux erreurs qui sont interceptées au moment de la compilation ou aux erreurs d'exécution qui sont évidentes et faciles à déboguer), c'est un coup dur pour le langage IMO.
Mason Wheeler
4
@Mason Wheeler: La seule raison pour laquelle vous devez déclarer des variables dans d'autres langues est que vous devez déclarer quel type elles sont. Python étant dynamique, la déclaration de type n'est pas nécessaire, et par conséquent, la déclaration n'est pas nécessaire. Je ne vois pas en quoi cela a un rapport avec implicite / explicite. Les types en Python sont explicites. Ainsi sont les variables. Après dix ans, une faute de frappe n'a jamais causé d'erreur de débogage difficile à déboguer. En fait, ils sont triviaux pour déboguer.
Lennart Regebro
8
+1 pour la liste, -1 pour le fanboy-ness. Faire attention à toutes les langues qui ont obtenu un succès significatif, et tenter d’incorporer, ou au moins d’analyser l’applicabilité de ces éléments, semble être l’approche la plus pragmatique.
Steven Evers
3
@ Lennart: Je dirais que pouvoir (mais pas obliger, voir règle 4) déclarer explicitement les types de fonctions est une bonne chose. C'est semblable à la conception par contrat. C'est ce que je veux dire.
Theo Belaire
11

La possibilité de modifier la langue selon vos besoins est un atout majeur pour moi. Pour Lisp, cela se fait avec des macros, pour Tcl avec un niveau supérieur. Dans une moindre mesure, Ruby utilise des lambdas et autres. Je veux simplement pouvoir ajouter de nouvelles structures de contrôle adaptées au problème plutôt que de formuler mes problèmes autour des structures de contrôle disponibles. À titre d’exemple simple, la construction "do .. Until" qui existe dans certaines langues mais pas d’autre est une façon plus simple de traiter des cas que "while", il est extrêmement utile de pouvoir ajouter de nouvelles structures pour répondre à d’autres cas.

De manière plus générale, il s'agit de métaprogrammation ... mais je l'utilise principalement pour la construction de nouvelles structures de contrôle.

RHSeeger
la source
Intéressant. Un bon support de méta-programmation peut être difficile à obtenir, mais très puissant quand il l’est. Des personnes comme Lisp m'ont dit que la mise en œuvre de Lisp est parmi les meilleures, mais elles le disent à propos de tout dans Lisp. Des exemples de ce que vous pensez que la méta-programmation est bien faite?
Berin Loritsch
La "métaprogrammation bien faite" doit être faite là où il est simple de bien faire (bien, pour une activité simple raisonnable) et où le résultat final semble être une partie naturelle de la langue.
Donal Fellows
1
Pas seulement modifiable, mais déchiffrable. Si vous avez remappé quelque chose dans la langue, en tant que lecteur, je devrais être capable de le comprendre rapidement. Des annotations ou d’autres marqueurs extrinsèques pourraient vous aider.
Alex Feinman
Je pense que Mata-Lua ou Template Haskell font un bon travail pour fournir cela. (Pas aussi bien que les macros de Scheme, mais c'est ce que vous payez pour utiliser plus de parens dans une langue)
Theo Belaire
10

La chose la plus importante est que votre langue doit avoir un "style". Par exemple, j'appellerais C un langage de programmation système basé sur un pointeur. J'appellerais Erlang un langage de programmation hautement concurrentiel. Certains autres langages (comme C ++ et sans doute Java) sont ce que Allan Kay a appelé les langages "agglutinatifs": les langages Frankenstein consistaient en un ensemble de fonctionnalités assemblées.

La chose la plus importante à faire est que les changements apportés à la langue elle-même ne devraient être qu’un dernier recours. Même les sons les plus bénins peuvent devenir complexes lorsqu'ils sont combinés avec les autres fonctionnalités de la langue. Je dirais que pour mettre une nouvelle fonctionnalité dans une langue, vous devez:

  1. Prouvez que c'est vraiment nécessaire.
  2. Prouvez que cela ne peut pas être fait dans une bibliothèque.
  3. Prouver qu'il appartient à la langue.
Jason Baker
la source
2
En d'autres termes, le langage devrait avoir un principe de conception global et être compatible avec ce principe. Les commentaires sur l'évolution du langage sont garantis (je l'ai déjà vu plusieurs fois).
Berin Loritsch
1
Ça me rappelle ma citation préférée en C ++ ... Une pieuvre faite en clouant des jambes supplémentaires à un chien.
octobre
4
Prouvez que cela ne peut pas être fait dans une bibliothèque . +1
Qix
2
J'aime la friandise de la bibliothèque. C'est cool de voir à quel point les langages comme haskell ne comportent pas d'éléments de flux de contrôle intégrés tels que des boucles, des exceptions ou des continuations. ils sont simplement très simples à définir dans le langage, conservant la syntaxe parfaitement propre et promouvant l’extensibilité et la composabilité au lieu de créer un ensemble de fonctionnalités de langage intelligentes.
Sara
10

Merci pour une bonne question. Vous obtenez de très bonnes réponses.

Pour ne pas briller sur vos yeux, je considère un programmeur comme un canal d’information. Les idées / concepts / exigences vont d'un côté et le code en sort de l'autre.

Si vous prenez un ensemble d'exigences (quelle que soit leur formulation) et l'ensemble de code sur un énorme tableau blanc, et tracez des lignes mappant chaque exigence sur le code qui l'implémente, la complexité de ce graphique dépendra de la qualité du code. exprime les exigences. Idéalement, cela devrait être assez direct et individuel, mais c'est difficile à mettre en pratique.

Je mesure la spécificité de domaine d'une langue comme la mesure dans laquelle elle simplifie ce graphique. C’est une propriété extrêmement souhaitable et elle peut être abordée de différentes manières, en définissant simplement les bonnes classes / routines (noms / verbes), les macros, en passant par votre propre analyseur et interprète / compilateur.

Laissez-moi juste donner un exemple de ce que je veux dire. Pour le problème de la création d'interfaces utilisateur de dialogue flexibles, cette technique évite d'avoir à écrire des gestionnaires d'événement, le transfert de données, la plupart des tâches généralement effectuées dans les interfaces utilisateur. Il en résulte également une réduction du code source d'environ un ordre de grandeur. Le méta-langage n'est en réalité que quelques routines et macros en C / C ++ / Lisp, et je l'ai également fait dans des langages sans macros.

Si l'implémentation d'une exigence peut être réalisée avec des modifications de code en 5 points ou avec 10, le faire avec 5 équivaut non seulement à moins de code, mais également à moins de chances de rater une étape et de poser un bogue. Ainsi, plus une langue est spécifique à un domaine, plus le code est petit, facile à gérer et sans bogues. Je pense que nous devons savoir comment nous y prendre. Cela ne signifie pas que le code est plus lisible, sauf si le lecteur a investi dans la courbe d'apprentissage pour comprendre la technique.

Mike Dunlavey
la source
9

Types entiers bornés et distincts comme en Pascal et Ada. Honnêtement: à quelle fréquence avez-vous besoin de la plage complète d'un nombre entier? Je pense qu'il y a beaucoup à améliorer dans les types primitifs pour mieux représenter le monde réel.

Martin
la source
2
Les types entiers bornés tels que C, C ++, D, Java, C #, etc. ont bien leur place. Certains types de programmation ne s’y intéressent pas et ont simplement besoin de la distinction entre nombre entier et virgule flottante. Même alors, peut-être avons-nous simplement besoin d’un type de nombre et nous nous intéresserons plus tard à la partie intégrale du nombre? En bref, la programmation pour les entreprises est moins sensible au type entier spécifique qu’au fait qu’un nombre est un entier. Lorsque vous implémentez un protocole à un niveau bas, les règles changent radicalement.
Berin Loritsch le
2
Ce que je pensais là où, comme dans Ada, vous pouvez simplement dire type Date_Of_Month is 1 .. 31;et laisser des décisions comme 16 ou 32 bits à l’optimiseur. Mais plus important encore, assigner 32 ou 0 ou -5 à une variable du type vous donne un RANGE_ERROR.
Martin
Les gammes fonctionnent bien pour des choses comme Date_Of_Month(ou Month_Of_Year) où il y a une plage évidente à utiliser, mais beaucoup de cas - probablement la plupart - sont flous. type Persons_Age is 0..120? Et si quelqu'un bat le record de longévité? type Year is 0..9999? Et si vous êtes égyptologue?
dan04
Si vous êtes égyptologue, vous n'en avez pas besoin type Egyptian_Year is -9999 .. 300;. D'après mon expérience, vous pouvez trouver des bornes utiles pour les nombres entiers la plupart du temps. À cet égard, vous devriez considérer que type Scrolls_Found is array Egyptian_Year of Natural;vous ne pouvez pas / ne devriez pas avoir un type non lié comme index de tableau. C'est juste un vecteur d'attaque pour le pirate informatique. BTW: Ada permet de calculer les limites de la plage au moment de l'exécution.
Martin
1
@kai personne n'a dit que cette fonctionnalité particulière des systèmes de types devait être utilisée partout, sans exception. Je suis sûr qu'Ada permet également d'utiliser des types numériques "normaux". Et les types numériques liés sont certainement utiles pour certains problèmes (plutôt courants).
Sarge Borsch le
8

Certaines fonctionnalités facilitent l'utilisation des langages de programmation une fois que vous les avez appris, et d'autres facilitent leur apprentissage. Etant donné que les utilisateurs d'une langue entretiennent idéalement une relation à long terme avec celle-ci, optimiser pour une facilité d'utilisation vaut mieux que pour optimiser pour une facilité d'apprentissage. Ne rendez pas les choses plus difficiles que nécessaire, mais ne sacrifiez pas l'expressivité (être capable d'écrire un petit code qui en fait beaucoup) pour plus de lisibilité pour ceux qui ne sont pas familiers avec le langage. D'un autre côté, le langage ne doit pas être interprété comme un bruit de ligne par les personnes qui le travaillent depuis des années. ce ne serait pas facile à utiliser ou à apprendre.

Larry Coleman
la source
8

Conventions de nommage (je vous regarde PHP)

Malfiste
la source
Moins d'un problème de conception de langue, cependant. Bien sûr, vous devez toujours garder un œil sur ce qui entre dans la bibliothèque standard, mais les concepteurs de langages ne peuvent pas appliquer les conventions de nommage;)
3
Vous pouvez pour la bibliothèque standard.
Malfist
3
Ne mentionnez même pas PHP. Le pire langage couramment utilisé autour. Non conçu par un informaticien, juste un gars qui voulait des modèles et des stéroïdes ont été ajoutés.
Keyo
@delnan: certaines langues, comme Mercury ou Eiffel, imposent des conventions de nommage (tous les noms de classes de capital, les variables commençant par un capital, etc.) et elles sont appliquées par le compilateur. Fortran a déclaré que les variables commençant par i, j, k sont des entiers (d'où l'usage traditionnel en tant que variables de boucle dans la plupart des langues ...). Etc. En quelque sorte ennuyeux si vous n'aimez pas la convention, mais bon pour la cohérence des codes source, au moins.
PhiLho
@PhiLho: C'est très limité cependant. Il ne peut pas imposer - juste un exemple - une utilisation cohérente et significative (pour les lecteurs humains) de la capitalisation ou des traits de soulignement (il pourrait essayer mais risquerait de compromettre la santé des programmeurs dans le processus).
7

Intégration de première classe aux environnements de développement.

De nos jours, le codage est effectué dans un environnement riche. Pour HTML / CSS / JS, nous avons Firebug et d’autres outils interactifs. Pour Java, Eclipse, IDEA et d’autres véritables IDE. Et ainsi de suite. Il existe une écologie des outils, commençant par l'éditeur mais ne se terminant pas là:

  • Organisation du code dans et entre les fichiers
  • Mise en évidence intelligente
  • Complétion intelligente / saisie prédictive
  • Débogage statique (erreurs de syntaxe, de sémantique et de style)
  • Création et utilisation de modèles et de macros
  • Contrôle de version (versioning, fusion, branchement, ...)
  • Développement distribué avec plusieurs auteurs (commentaires, doc inline, annotations, ...)
  • Débogage à l'exécution (traces de pile, pas à pas, montres, ...)
  • Débogage "live" interactif (comme Firebug - comportement d'édition d'un système live)
  • ... Je ne sais même pas quelle est la prochaine.

Les langues doivent être construites pour fournir un soutien à ces activités. Des progrès ont été réalisés - des annotations en Java pour aider d'autres développeurs à comprendre l'intention du code, par exemple.

Mais ce sont surtout des choses piratées, comme utiliser $ Id $ dans un commentaire pour que la source contrôlée par CVS puisse contenir un numéro de version. Pourquoi ne puis-je pas faire quelque chose comme ça à partir de la langue elle-même?

Alex Feinman
la source
Vous voulez dire quelque chose comme ASIS (ISO / IEC 15291: 1999 «Spécification d'interface Ada Semantics»)? ASIS ne couvre pas tout ce que vous voulez, mais pas mal. J'ai souvent souhaité quelque chose comme ASIS pour d'autres langages de programmation. Voir sigada.org/wg/asiswg pour plus de détails.
Martin
Certaines de ces choses sont relativement peu coûteuses à faire ou sont gratuites de votre IDE: organisation du code, mise en surbrillance de la syntaxe, repliement du code, contrôle de version, modèles / macros. D'autres nécessitent beaucoup plus d'efforts: débogage à l'exécution, débogage statique, complétion intelligente / typage prédictif, refactoring, etc. Bien que souvent négligé, la conception d'un langage cohérent est beaucoup plus difficile lorsque vous devez également vous soucier des plugins IDE.
Berin Loritsch le
6

Calcul distribué

Le déjeuner gratuit est terminé. Aujourd'hui, il faut des programmes qui fonctionnent sur plusieurs cœurs / plusieurs processeurs (et sur des ordinateurs particuliers dans des circonstances spéciales).

Malheureusement, conceptuellement, écrire du code multithread étant difficile, il n’est donc pas nécessaire d’ajouter la langue comme barrière.

L’ utilisation future de C ++ 0x est certainement intéressante, car elle est présentée comme une bibliothèque et ne vous libère pas des problèmes de synchronisation (vous savez, ceux qui sont si faciles à résoudre ...)

J'aime beaucoup l' approche de Go sur le problème: le multithreading est intégré et l'approche adoptée (canaux et goroutines) définit un état d'esprit beaucoup plus simple que les approches traditionnelles sémaphore / mutex / verrouillage. Il est toujours facile d'accéder simultanément à une structure non synchronisée (Go a des pointeurs) ou à un blocage (cycle d'attente sur les canaux ...)

Je pense que les langages favorisant l'immuabilité des données, comme les langages fonctionnels, peuvent en avoir le droit (j'aime bien l'expérience là-bas).

En outre, le modèle d' acteur pourrait être notre prochaine cible. Il était également destiné à l'informatique distribuée.

Matthieu M.
la source
Un autre exemple serait Erlang. Un thème commun aux langages de ce type est une approche de type « rien commun », dans laquelle l'état est essentiellement transmis avec le message. L'approche évolue bien.
Berin Loritsch le
@Berin: Vous avez raison, même si je n'ai pas cité Erlang dans le message, car je le connais mal, il me rappelle correctement qu'il implémente le modèle Actor.
Matthieu M.
6

Appelez-moi fou, mais l'une des fonctionnalités linguistiques les plus importantes pour moi est la disponibilité d'une bonne référence en ligne, avec des exemples. Je sais que je peux trouver de bons résultats de recherche pour toutes les langues, mais j'aime beaucoup le site des API MSDN et Java. Ils facilitent beaucoup la programmation pour une personne qui n’a pas beaucoup d’expérience dans cette langue.

apoorv020
la source
JavaDoc, CppDoc, RubyDoc, etc. ont été un atout précieux pour la compréhension des bibliothèques standard, ainsi que des bibliothèques que vous créez. Ils ne sont pas tous créés égaux et certains sont plus faciles à naviguer que d'autres.
Berin Loritsch
D'accord, le site API Java est un excellent atout. Sa grande avoir un format standard pour créer la documentation de l'API aussi. Les gains de productivité liés à l'utilisation d'un IDE avec prise en charge intégrée de l'analyse de JavaDoc (netbeans) sont étonnants. Même si j'ai une mémoire horrible, cela me profite probablement plus que les autres.
toc777
6

Plus de capacité pour aider le compilateur à vérifier votre code.

En tant que programmeur de systèmes embarqués, j’utilise toujours le C. Mais j’aimerais toujours avoir plus / de meilleures façons de dire au compilateur ce que j’attends de mon code pour qu’il puisse le vérifier.

Par exemple, je peux avoir une fonction

f(int x)

mais je préférerais

f(int range[-5..25] x)

EG J'aimerais pouvoir écrire des assertions sur des fonctions en utilisant un langage fonctionnel de niveau supérieur comme Lisp ou Haskell. Celles-ci ne seraient pas compilées en code, mais pourraient être utilisées pour des analyses statiques ou dynamiques.

Rocketmagnet
la source
Essentiellement un moyen efficace de vérifier les limites? Ce serait plutôt cool. Bien que, je voudrais au moins que cela soit inclus pour la vérification de l'exécution ainsi que la vérification de la compilation. Lorsque vous extrayez des informations d'une base de données ou de l'interface utilisateur, vous garantissez toujours que la valeur sera valide. S'il s'agissait d'une fonctionnalité linguistique, je souhaiterais également l'utiliser à ces fins.
Berin Loritsch le
3
Tu devrais utiliser Pascal. Vous pouvez définir un type qui couvre une plage de nombres arbitraire, telle que -5..25, que le compilateur peut vérifier au moment de la compilation. (Tant que vous n'attribuez que des constantes, bien sûr.)
Mason Wheeler
1
@Kugel: Quoi d'autre qu'une fonction de compilateur est assert? Et le test unitaire ne vérifie pas le code en production. Et ne pas contrôler la production, c'est comme enlever les bateaux vivants après le voyage inaugural. Pour économiser du carburant et rendre le navire plus rapide.
Martin le
1
J'utiliserais Ada, sauf que la plateforme sur laquelle je travaille n'a pas de compilateur Ada. Il a seulement un compilateur C, donc tout est académique de toute façon.
Rocketmagnet
1
J'utilise déjà beaucoup d'assertions, mais il serait encore mieux d'avoir ceci et d'autres choses comme caractéristiques du langage.
Rocketmagnet
5

Petite syntaxe avec aussi peu de mots-clés que possible car la syntaxe détaillée est difficile à apprendre et ne facilite pas la lisibilité.

Le pire exemple est Ada:

procedure Hello is
begin
  Put_Line("Hello World!");
end Hello;

Les mots de remplissage tels que est, comme, .. n'ont pas de sens pour les langages de programmation.

Brainlag
la source
4
Je pense que le pire exemple est celui des langues dans lesquelles vous dites public static void.
Joey Adams
1
L'idée n'est pas nouvelle et déjà implémentée sous la forme de SmallTalk qui n'a aucun mot-clé. Vous auriez donc dû utiliser SmallTalk comme exemple positif pour votre demande. BTW: Si vous ne savez pas à quoi ça ISsert, vous n’avez pas compris Ada (avez-vous déjà programmé Ada?): ISSépare la déclaration de procédure de la déclaration de variables locales et distingue également une spécification de la mise en oeuvre. Bien sûr, vous ne remarquerez que lorsque vous comparez les spécifications et l'implémentation d'une fonction, que cela ISest parfaitement logique et qu'il ne s'agit pas d'une charge.
Martin
1
Oubli de mentionner: la syntaxe SmallTalk correspond également au verso d'une carte postale. Donc, cela répondra également à votre désir de "petit". Bien sûr, la plupart des idées ici sont déjà implémentées quelque part dans une langue et la plupart des affiches utilisent cette langue comme exemple positif au lieu de créer un exemple négatif erroné . Je vous voterais si je hais assez de réputation. Pas parce que votre idée est mauvaise - mais pour utiliser un exemple négatif.
Martin
7
Les mots de remplissage peuvent en réalité servir à quelque chose s'ils aident à lever la ambiguïté de la syntaxe. Par exemple, je préfère if x then …de loin if (x) …. Nous avons échangé une paire de parenthèses contre un mot clé contextuel. Cela a du sens car la condition xpeut être une expression complexe avec ses propres parenthèses. L'élimination de la paire la plus externe peut considérablement augmenter la lisibilité. Une alternative est bien sûr d'utiliser un colon ici, comme en Python. En fait, je pense que la plupart des remplisseuses non ambiguës pourraient être remplacées par des deux points. Je ne sais pas quelle méthode je préfère.
Konrad Rudolph
3
@ Konrad: Si elle désambave la syntaxe, ce n'est pas un remplissage. Le is est une charge car Ada aurait pu permettre procedure Hello begin ... endsans ambiguïté.
dan04
4

J'aimerais voir plus de langues d'apprentissage . Non seulement les langues pour les débutants absolus avec des restrictions plus holistiques que le nôtre, comme celles qui requièrent un espace entre chaque jeton , mais les langues pour les personnes qui connaissent déjà la programmation et veulent apprendre de nouveaux concepts ou améliorer leur programmation en général.

Pour moi, Haskell est un excellent exemple de ce que je veux dire par "langue d'apprentissage" (bien que sa popularité et son utilité générale se soient également développées au fil des ans). En abandonnant la syntaxe C bien connue et en ayant des opérateurs de composition de fonctions en arrière (par exemple, (+2) . (*3)une fonction qui multiplie par 3, puis ajoute 2), Haskell m'a appris à écrire des fonctions plus courtes. Son vérificateur de caractères impitoyable m'a aidé à apprendre la langue plus rapidement et à améliorer ma capacité à penser logiquement au code. Ces deux avantages se sont étendus à d'autres langues, même à l'assemblage.

L’apprentissage des langues et les objectifs généraux sont souvent contradictoires. Une langue d'apprentissage doit être difficile et enrichissante, et doit imposer un style particulier, même si ce style n'est pas le meilleur pour de nombreuses applications. Un langage généraliste devrait être utile pour faire avancer les choses, et l'utilisation d'abstractions doit être soigneusement mesurée et "avoir un sens". Par exemple, lors de la réparation d’un site Web, l’apprentissage des monades serait la dernière chose à laquelle pense le programmeur. De l'autre côté de la médaille, quand quelqu'un apprend à programmer, il ne devrait pas être obligé de se perdre dans un non-sens "vide public statique" s'il n'a même pas encore entendu parler des fonctions.

Si vous êtes un concepteur de langue, déterminez si votre langue est une langue d’apprentissage ou une langue appliquée. Cela déterminera dans quelle mesure vous voulez utiliser la pureté dans votre conception.

Joey Adams
la source
2
Comment la composition des fonctions de Haskell est-elle en quelque sorte en arrière? C'est une traduction directe de (f ∘ g)(x) = f(g(x)).
Jon Purdy
@ Jon Purdy: Cela signifie que vous devez écrire les fonctions dans l'ordre inverse de leur application. Dans les deux formes, gs’applique en premier à l’argument, suivi de f. Si vous souhaitez trier une liste, la regrouper et obtenir le premier élément de ces listes, vous pouvez écrire (map head . group . sort) listou map head $ group $ sort listou map head (group (sort list)). Dans tous les cas, vous écrivez les opérations à l'envers. À propos, l'importation Control.Arrowvous permet de dire (sort >>> group >>> map head) list, mais l' >>>opérateur me semble plutôt maladroit et prolixe.
Joey Adams
2
Je ne sais pas, je pense toujours que celui de droite à gauche a un sens. (map head . group . sort) listse lit comme "le premier élément de chaque groupe dans une sorte de list", ce qui est tout à fait naturel - et, à mon sens, plus fonctionnel que (sort >>> group >>> map head) list, qui se lit plutôt impérativement et à l’arrière comme "sorte puis groupe", puis prend le premier élément de chaque groupe. .. list".
Jon Purdy
@JoeyAdams - l' >>>opérateur a l'air plutôt maladroit et verbeux - Quelques langages fonctionnels plus récents ont commencé à |>être utilisés comme opérateur de chaînage de gauche à droite, ce qui est peut-être un peu plus facile pour les yeux ...
Jules
4

Depuis que nous sommes en 2011,

  • une spécification absolument complète. pas de trous dépendants de l'architecture comme en C
  • support multithreading; non seulement les fonctionnalités de synchronisation (verrous), mais également les fonctionnalités de langage qui rendent le multithreading aussi simple que d'écrire une boucle:

    all (o dans myCollection) {o.someMethod ()}

  • multi-paradigme; Permettez-moi, le programmeur, de décider si je veux la sécurité d'un langage statique lors de la compilation ou la concision d'un langage dynamique, au cas par cas; donnez-moi des fonctionnalités orientées objet, des fonctionnalités, etc.

  • cohérence (je sais que cela demande un peu trop de cohérence et de paradigme multiple ...)

utilisateur281377
la source
Je suis avec vous à 100% pour une spécification complète. Le multi-paradigme et la cohérence constitueront certainement un équilibre. Vous pouvez spécifier un ensemble de comportements pour un paradigme dynamique en tant que sous-ensemble des comportements pour la vérification statique - mais je pense que ces deux approches peuvent se prêter à des styles de programmation très différents. Ils doivent vraiment être des langues séparées à ce stade. Peut-être recherchez-vous une paire de langages cohérents avec une compatibilité de 100%?
Berin Loritsch le
Des langages comme Scala (et peut-être Haskell? Je ne le connais pas assez) ont un système de types statique fort et un caractère étroit, grâce à l'inférence de types et aux implications.
PhiLho
2
Les fonctionnalités dépendantes de l’architecture conviennent si un langage laisse un programmeur spécifier ce qui est important ou non. Ce qui rend le C horrible, c’est qu’il n’ya aucun moyen de déclarer un "type numérique enveloppant modulo 65536"; même si une plate-forme implémente uint16_t, la norme exige que certaines implémentations considèrent la différence entre deux uint16_tvaleurs comme signée et que d'autres considèrent la différence comme non signée; il ne fournit aucun moyen au programmeur de spécifier le comportement souhaité.
Supercat
Je ne suis pas d'accord pour multiparadigm; cela laisse beaucoup trop de marge de manœuvre pour les batailles de style. La bibliothèque A est écrite avec un ensemble de paradigmes dynamiques . La bibliothèque B est écrite avec un tas de paradigmes statiques . Eh bien, maintenant, la bibliothèque A doit parler à la bibliothèque B; où est le juste milieu? Si vous devez écrire de la colle entre deux morceaux de code dans la même langue, la langue est intrinsèquement imparfaite.
Qix
3

Procédés légers

Je voudrais avoir des processus légers comme à Erlang. C'est principalement un problème pour le runtime. Cela manque dans JVM et .NET CLR. LWP aide à la création de logiciels massivement concurrents. Idéalement, il ne devrait pas être plus coûteux de créer un processus car il s'agit de créer un objet dans un langage. Je souhaite créer des millions de processus dans mes applications.

Il est implémenté comme un pool de threads avec une planification préalable, de sorte qu'une seule tâche ne bloque pas l'autre tâche, et les tâches peuvent être planifiées sur n'importe quel cpu-core disponible.

Prise en charge de la récursion de la queue

Je voudrais avoir un support pour la récursion de la queue. Cela peut également être un problème pour l'environnement d'exécution. Par exemple, JVM ne prend pas en charge la récursion de la queue.

Programmation distribuée facile

Je voudrais avoir un support pour send ( ! ) Et recevoir des primitives à des parties de l'application s'exécutant sur d'autres machines sur le même réseau que dans Erlang. Cela facilite la création d'applications évolutives, par exemple des banques de données distribuées. Ajouté à cette sérialisation intégrée dans le langage est également très utile comme en erlang. Et pas comme en Java même je dois le faire manuellement.

Jonas
la source
Queue-Recursion: c2.com/cgi/wiki?TailRecursion
Berin Loritsch
Scala a la récursion de la queue et est compilé dans la JVM. Le compilateur IBM Java peut aussi faire la récursion finale - parfois.
Martin
3

Faciliter la métaprogrammation.

limiter les formulaires spéciaux

En Python, il n'y a pas de bonne raison pour laquelle imprimer ce n'est pas une fonction intégrée. Il ressemble et agit comme une fonction, sauf que vous ne voulez rien avoir à faire avec les parens.

Avons-nous vraiment besoin for, foreach, whileet comme chacun leur propre forme spéciale. Que diriez-vous d’une construction en boucle et de quelques macros par défaut pour fournir le sucre syntaxique des formes en boucle variantes?

méta-programmation pour formes spéciales

form['if'](test-fn, body-fn)

dietbuddha
la source
Ruby a en quelque sorte des "formes spéciales" pour la mise en boucle, du moins dans le sens où les objets itérables ont généralement une méthode comme eachcelle-ci qui prend un bloc de code en argument. (Ruby a aussi foret whileboucles, mais pas d' auto-respect programmeur Ruby les utilise en fait.)
mipadi
@ mipadi: Je suis un grand fan de blocs Ruby et des idiomes associés.
dietbuddha
peut-être pensent-ils - Vous allez vous casser la tête. :) Je suppose que c'était l'association de tous les puissants "Python" et "aucune bonne raison". Néanmoins, la métaprogrammation est un problème de conception linguistique valable et souvent négligé. C'est pour cette raison que je vais upvote cela.
Berin Loritsch le
@Berin: En fait, je l'utilise et je suis un fan de Python, ce qui le rend plus amusant.
dietbuddha
Un type de boucle rend le flux de code obscur. Par exemple, à quoi do..whileressemblerait une boucle s'il y avait un type de boucle dont l'évaluation était au sommet? Cela ne ressemblerait pas du tout à une boucle.
Qix
2

Capacités du réseau

Une langue livrée sans support réseau est assez boiteuse dans le monde d'aujourd'hui.

La plupart des applications du monde réel doivent communiquer sur un réseau quelconque:

  • mise à jour automatique
  • accès à la base de données
  • services Web

C'est également une pierre angulaire de la prise en charge de l'informatique distribuée / en nuage.

Matthieu M.
la source
8
Mais cela peut très bien être une fonctionnalité de bibliothèque standard .
Donal Fellows
@Donal: Je n'ai jamais dit le contraire (ou du moins, je ne le pensais pas), la question est ouverte à la fois au langage et aux fonctionnalités de la bibliothèque. Mon point est juste que si vous recevez un paquet de langue et qu'il n'y a aucune capacité de réseau dedans, vous allez combler la douleur plus tôt que plus tard :)
Matthieu M.
3
La bibliothèque standard fait vraiment partie de l'expérience linguistique et doit être traitée avec le même soin et le même respect. Je suis également d'accord avec cette exigence pour une bibliothèque standard.
Berin Loritsch
1

J'aime un langage de programmation facile à apprendre et à combiner pour créer de nouvelles choses.

Par exemple, bien qu’il soit intéressant d’avoir beaucoup de façons d’écrire quelque chose, je pense qu’il est préférable d’avoir seulement une ou deux façons de l’écrire. De cette façon, le programme est plus facile à maintenir.

Un langage dont les concepts peuvent s'appliquer à tous les éléments est très utile (je pense que cela s'appelle orthogonalité). Ainsi, la prochaine fois que vous rencontrerez une nouvelle fonctionnalité de langage, vous pourrez en déduire comment l'utiliser.

Je comprends parfois que la syntaxe de la langue doit entraver la performance lors de la phase de compilation / interprétation, mais parfois, je pense que le concepteur de la langue confie ce travail au développeur. Par exemple, des chaînes multilignes en Java ou en Javascript.

Enfin, la syntaxe du langage correspond à son interface utilisateur. Elle doit donc être claire, concise, intuitive, facile à utiliser et respecter vos habitudes.

OscarRyz
la source
Orthogonal signifie que chaque fonctionnalité fait quelque chose de différent. Regardez des outils comme grep ou awk. Ils font une chose, bien. Vous les associez ensuite dans différents ordres pour faire tout ce dont vous avez besoin.
Theo Belaire
1
  • Lisibilité : Le moins / le plus petit des symboles utilisés dans la grammaire, le plus propre et le meilleur.
  • Types orientés objet : Méthodes, pas fonctions.
  • Compréhensibilité : Interfaces fluides intégrées, noms complet et abrégé pour les classes / interfaces de bibliothèque et les tris.
dukeofgaming
la source
1
Désolé, mais je dois vous donner un -1 pour avoir complètement tort sur ce point. La concision permet d’ écrire du code plus rapidement, mais cela ne le rend certainement pas plus lisible, au-delà d’un certain minimum. Un certain niveau de verbosité rend le code beaucoup plus facile à lire, car ces mots et symboles supplémentaires signifient quelque chose et transmettent des informations utiles au programmeur, en particulier s'il a été écrit à l'origine par quelqu'un d'autre et que vous n'avez pas l'avantage d'avoir déjà une modèle de celui-ci dans votre tête.
Mason Wheeler
Pour moi, le code propre est un code lisible. J'ai aussi dit le plus petit: avoir ":" au lieu de "=>" dans les tableaux PHP, ou avoir "." au lieu de "->", ce serait certainement une amélioration (et j'apprécie déjà PHP).
dukeofgaming
4
@Mason: moi-même et beaucoup de bons rédacteurs techniques (par exemple, William Zinsser), ne sommes pas d'accord. La verbosité est l’ennemi de la lisibilité, pas de la concision.
Konrad Rudolph
2
Je choisis une forme de nuance définie en termes de symboles . Cependant, je suis assez satisfait des symboles à plusieurs caractères, dans la mesure où ce sont des choses que le lecteur considère naturellement comme un seul symbole (par exemple, un mot est un symbole).
Donal Fellows
1
Votre premier point est en conflit direct avec vos deux derniers.
Qix
1

Ajouter une fonctionnalité à un langage de programmation existant. Ainsi, le nouveau langage B est l'ancien langage A, plus doté de X.

Exemples existants:

  1. C ajout de classes => C ++
  2. Java ajoutant des trucs => C #
umlcat
la source
2
C'est une énorme simplification excessive. Un meilleur exemple serait la différence entre C et Objective-C.
Jon Purdy
0

Quand il s’agit de technologie / plate-forme / langage / base de données, etc., la plupart du temps, c’est la performance. À l'avenir, de nombreux logiciels actuels pourront être conçus à l'aide d'un langage graphique, car nous disposons de plus de capacités de calcul.

J'espère que le jour où nous disposerons d'une puissance de calcul et d'un langage dans lesquels vous concevez votre application, sans avoir à vous soucier des détails de langage .

Mise à jour: j'envoie un lien vers un tel langage LabView

Mise à jour: Je devrais expliquer davantage ce que je veux dire par «puissant calculateur». Les performances des logiciels compilés peuvent ne pas être aussi puissantes que celles des logiciels compilés basés sur un langage de syntaxe. Je pense à la programmation graphique en tant que niveau de programmation supérieur et il peut y avoir plus de temps système. Les ordinateurs actuels peuvent et exécutent facilement des langages de programmation graphiques.

Amir Rezaei
la source
3
Les ordinateurs sont déjà assez puissants pour le faire. Ce n'est tout simplement pas pratique, car vous allez devoir entrer dans le code pour une raison ou une autre .
Jeremy Heiler
2
C'est toujours une sorte de langage. Il y a eu plus d'une tentative pour en faire une réalité. Les outils UML génèrent une certaine quantité de code, mais lorsque le modèle est suffisamment détaillé pour produire un produit fonctionnel, il n’est plus utilisable pour comprendre le code. Je pense qu'il y avait quelque chose dans l'environnement Unix pour le câblage graphique d'applications, mais cela nécessitait beaucoup de configuration pour le corriger. Les moteurs de flux de travail utilisent cette métaphore pour permettre aux non-programmeurs de concevoir le flux de travail.
Berin Loritsch
1
En bref, bien que je doute sérieusement de l’utilité de cette approche en termes généraux, il existe des applications spécifiques où elle est actuellement utilisée et qui fonctionne bien pour cette application. Re: vos points ... 1. Les ordinateurs ont la puissance de calcul, le problème technique n’est pas le problème. 2. Le problème est de fournir un langage visuel suffisamment expressif pour faire le travail au sens général sans se perdre dans les détails. En dehors des applications de niche, le texte semble être une représentation beaucoup plus compacte d'un programme. J'ai voté par la suite parce que cela s'applique à la question posée.
Berin Loritsch
1
@Amir: Alors s'il vous plaît expliquer pourquoi les ordinateurs doivent être plus puissants pour que la "programmation graphique" puisse piloter le développement de logiciels?
Jeremy Heiler
7
@Amir: Vous confondez une limitation technique avec une limitation plus fondamentale. La raison pour laquelle nous n’avons pas beaucoup de langages graphiques, c’est que nous ne savons pas bien les faire (et ne savons pas s’ils peuvent être bien faits). Je suis au courant de l'existence de LabView et j'ai assez entendu parler de faire des choses compliquées ou de changer des choses simples. Nous n’avons pas non plus besoin d’ordinateurs plus puissants pour concevoir un tel langage; essayez donc d’esquisser quelques exemples de programmes dans un langage aussi hypothétique.
David Thornley