Les sigils facilitent-ils la lecture du code source?

13

Dans la plupart des langages de programmation, les variables n'ont pas de caractères d'identification comme elles le font en PHP. En PHP, vous devez préfixer une variable avec le $caractère.

Exemple;

 var $foo = "something";
 echo $foo;

Je développe un nouveau langage de script pour une application métier, et mes utilisateurs cibles n'ont pas d'expérience en programmation. Ces caractères facilitent-ils la lecture et l'utilisation du code?

Une raison pour laquelle PHP utilise le $est parce que sans lui, PHP ne peut pas dire si un nom est une référence de fonction ou une référence de variable. En effet, le langage autorise d'étranges références aux fonctions. Le $symbole aide donc l'analyseur à séparer l'espace de noms.

Je n'ai pas ce problème dans mon analyseur. Ma question porte donc uniquement sur la lisibilité et la facilité d'utilisation. J'ai codé pendant tant d'années en PHP que quand je vois, $fooil est facile pour moi de l'identifier comme une variable. Suis-je en train de donner une préférence de biais à cet identifiant?

Reactgular
la source
19
OMI, le code est plus lisible sans cachets
John Dvorak
6
@JanDvorak +1 pour m'avoir donné un nouveau mot de la journée. J'essaierai d'en utiliser sigilstrois fois aujourd'hui dans les conversations.
Reactgular
6
IMO Cela dépend si votre éditeur a une coloration syntaxique.
CodeBeard
5
Si vous utilisez var $x = ...ou type $x = ...alors je pense que $ est exagéré. Si vous venez de le faire, $x = ...cela pourrait valoir la peine. Surtout si vous ne souhaitez pas prendre en charge la coloration syntaxique dans les éditeurs courants. Cependant, de préférence, je n'aime passigils
CodeBeard
5
les sceaux sont comme une notation hongroise forcée
ratchet freak

Réponses:

13

Les possibilités et limitations techniques réelles ne sont pas du tout comme celles suggérées tout au long de ce fil. Débarrassons-les d'abord.

Voici ce que $ rend possible en PHP:

  • Variables variables
  • Variables avec un nom de mot clé par exemple $returnou pouvant utiliser le même nom pour une variable et une fonction / constante par exemple$__FILE__

Limitations ou fonctionnalités sans rapport avec le préfixe $:

  • L'implémentation étant autrement incapable de faire la différence entre les fonctions et les variables
  • Interpolation de chaînes PHP ou syntaxe de modèle
  • Déclaration de variable requise

Cela signifie qu'il n'y a aucune raison technique que vous ne pourriez pas avoir

foo = "something";
echo foo;

ou

foo = "something";
echo "foo = $foo";
//would print
//foo = something 

Cependant, vous ne pouvez pas en avoir (en supposant qu'il returns'agit d'un mot-clé)

return = "something";

Sans complications graves. Si vous avez utilisé un préfixe comme $, cela n'aurait posé aucun problème.

C'est une opinion mais je crois qu'un sceau en vaudrait la peine pour les non-programmeurs car il leur permet d'utiliser des mots clés comme noms de variables, pour eux, cela ressemblerait autrement à une limitation arbitraire: P

Esailija
la source
À propos return = "something";, C # a des "mots-clés contextuels", qui sont également une option à vérifier lors de la conception des langages.
luiscubal
1
@luiscubal écrit qu'en C # nécessite sans surprise un sigil, donc si vous voulez que ce code soit compilé, vous devez écrire @return = "something;". Il existe une certaine quantité de mots-clés contextuels, oui, mais les rendre tous contextuels signifierait une mise en œuvre beaucoup plus compliquée.
Esailija
7

Les sigils ont en fait beaucoup plus de sens en perl, où ils fournissent une certaine quantité de vérification de type. En php, ils n'aident pas beaucoup en dehors des modèles. Vous pouvez avoir une idée de leur utilité et de leur lisibilité en examinant différentes langues. Presque personne ne les utilise.

Dans un langage ciblé sur les utilisateurs finaux sur lequel je travaille, je vais même plus loin, rendant les identifiants insensibles à la casse et autorisant les espaces et les apostrophes. Cela me permet de faire des noms de variables comme Karl's heightça beaucoup plus proches des langages naturels.

Karl Bielefeldt
la source
1
+1 pour les espaces dans les variables, mais je ne sais pas comment implémenter cela. Je ne suis pas sûr que je trouverais cela plus facile à lire non plus. Je n'y suis tout simplement pas habitué.
Reactgular
1
J'aime l'idée. Mais je détesterais écrire l'analyseur pour une langue avec de l'espace dans l'identifiant. :-)At Karl's for the night = true;
Martin York
Mais il serait intéressant de voir toutes ces normes que nous ajoutons en haut d'une langue pour nous aider à la lire. Plutôt que d'être vérifié manuellement par un outil externe, mais faire partie de la définition du langage. De cette façon, nous ne pouvons pas avoir d'arguments inutiles sur les noms d'identificateurs dans les normes de codage (comme ils le sont dans le langage).
Martin York
2
L'insensibilité à la casse pose cependant le problème de l'internationalisation. Si vous autorisez les caractères de plusieurs langues, vous pouvez rencontrer des noms qui sont «les mêmes» dans certains paramètres régionaux, mais pas dans d'autres.
luiscubal
1
Autoriser les espaces dans les variables n'est pas un gros problème en principe - cela signifie simplement une règle de grammaire pour les identifiants qui autorise plusieurs mots. Cependant, cela signifie que d'autres choses peuvent ne pas être possibles dans la grammaire sans créer d'ambiguïté. Par exemple, dans Haskell, map sumest un appel de fonction partiellement appliqué - la fonction sumest passée en paramètre à map. Mais les deux ne sont que des noms de bibliothèque, donc avec des identifiants multi-mots, le compilateur ne pouvait pas savoir s'il map sums'agit d'un identifiant multi-mots ou d'une application de fonction basée sur deux identifiants un seul mot.
Steve314
7

Il y a des années, j'ai appris Applesoft Basic. Les chaînes étaient toujours suffixées $et les tableaux avaient un suffixe de %. C'est comme ça que la langue fonctionnait. Vous avez regardé quelque chose, vous saviez ce que c'était. Je ne suis jamais allé trop loin dans l'interprète pour comprendre pourquoi c'était le cas ou les décisions de conception qui l'ont fait.


Le sceau en php provient de son influence perl (qui a été influencée par awket sh). Le sceau en perl est bien plus que juste $car il peut identifier de nombreux types différents:

  • $ scalaire
  • @ liste
  • % hacher
  • & bloc de code
  • * typeglob

Le sceau identifie la partie de la structure de la table des symboles que vous regardez. Dans les coulisses, l'entrée de la table des symboles pour foo (accessible via *foo- le typeglob) a tout ce qui peut être un foo. Il y a $foo, @foo, %foo, le format foo de , &foo, le descripteur de fichier foo, etc ...

Cela permet également de créer un alias d'une variable à une autre:

#!/usr/bin/perl

$foo = "foo";
@qux = (1,2);
*bar = \$foo;
*bar = \@qux;

print "$bar @bar\n";

Cela imprime foo 1 2- en perl, c'est à cela que servent vraiment les sceaux , non pas que vous fassiez cela mais plutôt qu'il y a cette chose en coulisses qu'ils font.

Les sceaux ne sont pas tellement là pour la lisibilité, mais plutôt pour que l'on puisse avoir $fooet @foosans avoir une collision dans l'espace de noms (comparer d'autres langages où l'on ne peut pas avoir les deux int foo; int[] foo;)


Les cachets de lisibilité sont quelque chose qui s'apprend dans le cadre de n'importe quel langage - lire la syntaxe. Vous pourriez, hypothétiquement, imposer le type lui-même (en notation hongroise) pour faire partie de l'identifiant.

Quelque chose dans lex le long des lignes de:

typeChar  [is]
capLetter [A-Z]
letter    [a-z]
digit     [0-9]
%%
{typeChar}{capLetter}(letter}|{digit})* { prientif("iddentifier");}
%%

Et puis vous pourriez avoir du code comme

iFoo = 42;
sFoo = "a string";
iBar = iFoo * 2;

Je ne dis pas que c'est une bonne idée, mais plutôt que quelqu'un qui est habitué à la langue pourra le lire nativement et penser que cela améliore la lisibilité tandis que quelqu'un qui n'est pas familier avec la langue peut penser que cela ajoute simplement un tas de bruit à la langue.

Cependant, après avoir travaillé avec une langue définie de cette façon, je pourrais probablement la lire sans problème.

Certaines personnes les aiment, d'autres non. Il y a de grandes guerres saintes dans divers forums qui en débattent et cela se résume vraiment à combien vous les avez utilisées.

On pourrait concevoir un nouveau langage pour les non-programmeurs qui utilise des sceaux et quiconque n'a jamais programmé auparavant ne s'en plaindra jamais. D'un autre côté, vous ne pouvez pas les avoir dans le langage et demander aux programmeurs ruby ​​ou perl de se plaindre de manquer des informations clés.

Ça n'a vraiment pas d'importance. Ce qui importe, c'est la façon dont les sceaux s'intégreraient dans la langue, que vous les utilisiez ou non. Voulez-vous pouvoir faire "123 $foo 456"ou devez-vous faire "123 " + foo + " 456"? C'est là que la décision doit être prise.


la source
1
L'interpolation de chaîne telle que celle qui "123 $foo 456"n'est pas activée par le préfixe sigil et est complètement orthogonale à celui-ci.
Esailija
1
Cela fait partie de l'interpolation des variables et dépend de la façon dont on analyse une chaîne. Sigils peut faire cela plus facile (il peut être fait d' autres moyens comme le montre La meilleure façon de l' interpolation de variables en javascript? Mais ne fait pas partie de la langue de base Sigils, sans doute, le rendre beaucoup plus facile d'écrire et de comprendre cela..
1
@MichaelT Non, le fait que les variables aient des préfixes ne rend pas la mise en œuvre de l'interpolation de chaîne plus facile ou plus difficile. Ce ne sont que 2 choses complètement indépendantes. Pour un lecteur humain, il aurait pu être judicieux d'utiliser $asddans la syntaxe d'interpolation de chaîne si elle $était déjà utilisée pour les préfixes de variable, mais cela n'avait rien à voir avec la possibilité réelle d'implémenter l'interpolation de chaîne en premier lieu.
Esailija
2
@Esailija pourriez-vous décrire en quoi elles ne sont pas liées? En passant, de en.wikipedia.org/wiki/Variable_interpolation - "Les langages qui prennent en charge l'interpolation de variables incluent Perl, PHP, Ruby, Tcl, Groovy et la plupart des shells Unix. Dans ces langages, l'interpolation de variable se produit uniquement lorsque le littéral de chaîne est entre guillemets doubles, mais pas lorsqu'il est entre guillemets simples. Les variables sont reconnues car les variables commencent par un sigil (généralement "$") dans ces langues. "
@MichaelT Le symbole dollar utilisé dans les préfixes variables et l'interpolation de chaînes est un choix complètement superficiel (qui n'a que des arguments de lisibilité, rien à voir avec l'implémentation, il pourrait tout aussi bien être #utilisé dans coffeescript par exemple. Et coffeescript ne préfixe pas variables avec #- en fait, il ne préfixe pas du tout les variables)
Esailija
3

Je ne suis pas d'accord que PHP utilise $ pour différencier les vars des funcs. Du moins parce que PHP a une syntaxe de type C, et funcs () a des parens après le nom.

Lisez cet article sur le débordement de pile pour savoir pourquoi $ est en PHP.

De nombreux langages populaires, tels que C, C ++, C #, Java n'utilisent pas $ et nous pouvons différer facilement de la fonction.

En PHP $ aide, par exemple, lorsque vous écrivez: echo "var = $ var"

Sans $, une telle astuce sera impossible.

Ruslan Zasukhin
la source
+1 ah ça a plus de sens. Merci.
Reactgular
3
Une langue ayant des sigils n'a rien à voir avec une interpolation de chaînes comme dans votre exemple deecho "var = $var"
4
-1. Les bizarreries de la syntaxe PHP ne sont pas dues à une limitation réelle, mais parce que les règles de grammaire sont extrêmement mal conçues, voire pas du tout. C'est pourquoi ils ont besoin de hacks pour activer fn()[]où, comme avec une grammaire sensée, cela aurait fonctionné sans même y penser.
Esailija
@svidgen Oui. Vous ne pouvez pas effectuer d'interpolation de chaîne en toute sécurité sans un moyen d'indiquer quelle partie de la chaîne est censée correspondre à une variable. D'autres langues se retrouvent avec ce que je considère comme une verbosité ennuyeuse / inutile, comme le formatage des chaînes de Python. Cependant, il existe également d'autres avantages en PHP: RuslanZasukhin a tort de dire que les fonctions seront toujours indiquées par des parenthèses, car elles peuvent également être transmises comme références.
Izkata
@Izkata La façon dont vous utilisez les variables dans un langage n'a rien à voir avec la syntaxe d'interpolation de chaînes. Mais cela était implicite dans cette réponse, donc -1 ...
Esailija
3

Après toutes ces réponses, je veux donner plus de points à Mathew Foscarini.

  • Vous considérez le problème maintenant comme un "constructeur de langage". Vous essayez de comprendre pourquoi une autre langue a telle ou telle fonctionnalité pour choisir d'utiliser quelque chose dans votre propre langue. Je suis dans la même position depuis de nombreuses années, car je développe l'analyseur SQL pour notre base de données Valentina.
  • Je vous conseille de jeter un œil sur antlr.org et même de lire le livre de Terence. Il a beaucoup de bonnes choses pour les développeurs de langage.
  • Je ne suis toujours pas d'accord avec les "raisons" exposées par d'autres réponses. Ils supposent que l'auteur PHP en tête a décidé d'utiliser $ pour pouvoir utiliser des mots clés réservés et mieux distinguer les variables des non-variables. Je ne le pense pas ... bien que prouver ne peut être que sa / leur propre histoire.
  • Très probablement, ils suivent simplement Perl et les langues plus anciennes. Comme le souligne Terrence, la plupart des langues sont similaires, en particulier dans la partie LEXER. Et généralement, le constructeur d'une nouvelle langue peut simplement choisir le type de langue qu'il va développer, puis prendre lexer de cette grammaire linguistique. Et c'est ce que vous devez faire maintenant. Pas besoin d'inventer à partir de zéro. Et je parie que les auteurs PHP ont fait de même.
  • Tout le reste ce que les gens mentionnent:
    • distinguer les variables des non-variables
    • mots réservoirs comme noms de variables
    • pouvoir placer une variable à l'intérieur de la chaîne
    • peut être autre chose (je ne suis pas un grand expert en PHP)

sont des effets secondaires de ce LEXER , car il est capable de reconnaître un jeton.

Prenons l'exemple: en SQL, nous utilisons "" pour pouvoir utiliser des identifiants avec des mots réservés et même des identifiants avec des espaces "First Name", "Group Name". GROUPE est un mot-clé. Il y avait un problème - il y avait une solution spéciale.

PS Très bon commentaire de MichaelT.

Ruslan Zasukhin
la source
+1 merci pour l'excellent lien. J'ai fini par utiliser celui-ci, mais votre lien est beaucoup mieux. goldparser.org
Reactgular
Merci aussi pour votre lien. Je n'ai jamais vu cet analyseur d'or auparavant. Semble également intéressant.
Ruslan Zasukhin
@RuslanZasukhin si vous faites référence à ma réponse, je n'ai jamais dit que l'intention du développeur était d'activer les mots clés. J'ai seulement dit que l'utilisation de mots clés comme noms de variables devient techniquement possible lorsque les variables sont préfixées par un symbole comme $. De plus, la «possibilité de placer une variable à l'intérieur d'une chaîne» n'est pas due au fait que les variables sont préfixées par un symbole comme $. Autrement dit, "123 $foo 456"fonctionnera si même si la syntaxe des variables est comme foo = 3ou @foo = 3. Ils ne sont pas liés les uns aux autres.
Esailija
3

... un sceau permet de:

  • Mieux distinguer les variables des non-variables . Les personnes qui apprennent encore des concepts de base pourraient avoir du mal à déterminer quels mots sont des variables et lesquels ne le sont pas. Ils commencent souvent par lire des exemples ou du code d'autres personnes sans fond adéquat.

  • Utilisez des mots clés réservés ou des noms de fonction comme noms de variables . Parfois, j'ai trouvé que certains de ces noms étaient les bons pour une variable (c'est-à-dire $countpendant qu'une count()fonction était définie) et j'ai remercié les sceaux de m'avoir permis de les utiliser.

Il m'arrive également de faire ce nom de fonction en le réutilisant fréquemment, pour contenir le résultat d'une fonction dans une variable jetable, par exemple:

$isdir=isdir($dir);

if(/* complex condition implying $isdir */) {
/* etc */
}

ZJR
la source
1
ZHR, qu'est-ce qui signifie mieux? En C ++, nous écrivons toutes nos variables sans $ et nous les distinguons parfaitement et facilement. Exemple: {int z = 0; z = 55; z (z); } Et en C ++, nous pouvons également utiliser le nom de la fonction si besoin est, par exemple le pointeur sur la fonction.
Ruslan Zasukhin
@RuslanZasukhin, analphabètes informatiques, en connaissez-vous? Essayez de leur enseigner le C ++, vous serez étonné.
ZJR
Aussi: je ne pense pas qu'un sceau doit toujours être un $signe. Je me souviens du signe du dollar qui m'a dérouté quand j'étais enfant à cause de son association inhérente à l'argent. %pourrait être une alternative réalisable.
ZJR