I sigilli rendono più semplice la lettura del codice sorgente?


13

Nella maggior parte dei linguaggi di programmazione, le variabili non hanno caratteri identificativi come in PHP. In PHP devi aggiungere il prefisso a una variabile con il $carattere.

Esempio;

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

Sto sviluppando un nuovo linguaggio di scripting per un'applicazione aziendale e i miei utenti target non hanno un background di programmazione. Questi caratteri facilitano la lettura e l'utilizzo del codice?

Uno dei motivi per cui PHP usa il $è perché senza di esso PHP non può dire se un nome è un riferimento di funzione o riferimento di variabile. Questo perché il linguaggio consente strani riferimenti alle funzioni. Quindi il $simbolo aiuta il parser a separare lo spazio dei nomi.

Non ho questo problema nel mio parser. Quindi la mia domanda è puramente sulla leggibilità e sulla facilità d'uso. Ho programmato per così tanti anni in PHP che, quando vedo $foo, è facile per me identificarlo come una variabile. Sto solo dando una preferenza per questo identificatore?


19
IMO, il codice è più leggibile senza sigilli
John Dvorak,

6
@JanDvorak +1 per avermi dato una nuova parola del giorno. Proverò a usare sigilstre volte oggi nelle conversazioni.
Reactgular

6
IMO Dipende se il tuo editor ha l'evidenziazione della sintassi.
CodeBeard,

5
Se usi var $x = ...o type $x = ...penso che $ sia eccessivo. Se l'avessi appena fatto $x = ..., potrebbe valere la pena farlo. Soprattutto se non si desidera supportare l'evidenziazione della sintassi negli editor comuni. Tuttavia, come preferenza, non mi piacesigils
CodeBeard

5
i sigilli sono come una notazione ungherese forzata
maniaco del cricchetto,

Risposte:


13

Le effettive possibilità e limitazioni tecniche non sono del tutto simili a quelle suggerite in questa discussione. Eliminiamo prima quelli.

Ecco cosa $ sta rendendo possibile in PHP:

  • Variabili variabili
  • Variabili con il nome della parola chiave, ad es. $returnO in grado di utilizzare lo stesso nome per una variabile e una funzione / costante, ad es$__FILE__

Limitazioni o funzionalità non correlate al prefisso $:

  • In caso contrario, l'implementazione non è in grado di distinguere tra funzioni e variabili
  • Interpolazione di stringhe PHP o sintassi del modello
  • Dichiarazione variabile richiesta

Ciò significa che non esiste alcun motivo tecnico che non potresti avere

foo = "something";
echo foo;

o

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

Tuttavia non puoi avere (supponendo che returnsia una parola chiave)

return = "something";

Senza gravi complicazioni. Se avessi usato un prefisso simile $, non sarebbe stato un problema.

È un'opinione ma credo che un sigillo varrebbe la pena per i non programmatori poiché consente loro di usare le parole chiave come nomi di variabili, a loro altrimenti sembrerebbe una limitazione arbitraria: P


A proposito return = "something";, C # ha "parole chiave contestuali", che è anche un'opzione che vale la pena provare quando si progettano le lingue.
luiscubal,

1
Scrivere @luiscubal che in C # richiede in modo non sorprendente un sigillo, quindi se vuoi che quel codice venga compilato, devi scrivere @return = "something;". Esistono alcune parole chiave contestuali, sì, ma renderle tutte contestuali significherebbe un'implementazione molto più complicata.
Esailija,

7

I sigilli in realtà hanno molto più senso in perl, dove forniscono una certa quantità di controllo del tipo. In php non aiutano molto al di fuori del templating. Puoi avere un'idea della loro utilità e leggibilità guardando in diverse lingue. Quasi nessuno li usa.

In un linguaggio mirato per l'utente finale su cui sto lavorando, vado anche oltre, rendendo gli identificatori insensibili alle maiuscole e consentendo spazi e apostrofi. Ciò mi consente di creare nomi di variabili del genere Karl's heightmolto più vicini ai linguaggi naturali.


1
+1 per gli spazi nelle variabili, ma non ho idea di come implementarlo. Non sono sicuro che avrei trovato più facile da leggere neanche. Non ci sono abituato.
Reactgular

1
Mi piace l'idea. Ma odio scrivere il parser per una lingua con spazio nell'identificatore. :-)At Karl's for the night = true;
Martin York,

Ma sarebbe interessante vedere tutti questi standard che aggiungiamo all'inizio di una lingua per aiutarci a leggerlo. Invece di essere controllato manualmente da uno strumento esterno, diventa parte della definizione della lingua. In questo modo non possiamo avere argomenti inutili sui nomi degli identificatori negli standard di codifica (come sono nella lingua).
Martin York,

2
L'insensibilità ai casi ha il problema dell'internazionalizzazione, però. Se consenti caratteri in molte lingue, potresti incontrare nomi "uguali" in alcune lingue, ma non in altri.
luiscubal,

1
Consentire lo spazio bianco nelle variabili non è un grosso problema in linea di principio: significa solo una regola grammaticale per identificatori che consente più parole. Tuttavia, ciò significa che altre cose potrebbero non essere possibili nella grammatica senza creare ambiguità. Ad esempio, in Haskell, map sumè una chiamata di funzione parzialmente applicata - la funzione sumviene passata come parametro a map. Ma entrambi sono solo nomi di librerie, quindi con identificatori a più parole, il compilatore non poteva sapere se si map sumtratta di un identificatore a più parole o di un'applicazione di funzione basata su due identificatori a parola singola.
Steve314

7

Anni fa ho imparato Applesoft Basic. Le stringhe erano sempre suffissate $e le matrici avevano il suffisso %. Ecco come ha funzionato la lingua. Hai guardato qualcosa, sapevi cosa fosse. Non ho mai approfondito troppo l'interprete per capire perché questo fosse il caso o le decisioni di progettazione che lo hanno reso così.


Il sigillo in php deriva dalla sua influenza perl (che è stata influenzata da awke sh). Il sigillo in perl è un po 'più di $quanto possa identificare molti tipi diversi:

  • $ scalare
  • @ elenco
  • % hash
  • & codeblock
  • * typeglob

Il sigillo identifica quale parte della struttura della tabella dei simboli stai osservando. Dietro le quinte, la voce della tabella dei simboli per foo (accessibile tramite *foo- il typeglob) ha tutto ciò che può essere un foo. C'è $foo, @foo, %foo, il formato foo , &fooil foo filehandle, ecc ...

Ciò consente anche di creare un alias da una variabile a un'altra:

#!/usr/bin/perl

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

print "$bar @bar\n";

Questo stampa foo 1 2- in perl, questo è ciò per cui i sigilli sono davvero , non che dovresti farlo, ma piuttosto che c'è qualcosa dietro le quinte che fanno.

I sigilli non ci sono così tanto per la leggibilità, ma piuttosto così si può avere $fooe @foosenza avere una collisione nello spazio dei nomi (confrontare altre lingue in cui non si possono avere entrambi int foo; int[] foo;)


I sigilli per la leggibilità sono qualcosa che viene appreso come parte di qualsiasi lingua: leggere la sintassi. Si potrebbe, ipoteticamente, imporre il tipo stesso (come notazione ungherese) per far parte dell'identificatore.

Qualcosa in Lex lungo le linee di:

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

E poi potresti avere un codice simile

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

Non sto dicendo che questa è una buona idea, ma piuttosto che qualcuno che è abituato alla lingua sarà in grado di leggerlo in modo nativo e pensare che migliora la leggibilità mentre qualcuno che non ha familiarità con la lingua potrebbe pensare che aggiunge un sacco di rumore per la lingua.

Tuttavia, dopo aver lavorato con una lingua definita in questo modo, probabilmente potrei leggerla senza problemi.

Ad alcune persone piacciono, altre no. Ci sono grandi guerre sante in vari forum che discutono di questo e si riduce davvero a quanto li hai usati.

Si potrebbe progettare un nuovo linguaggio per i non programmatori che usano sigilli e chiunque non abbia mai programmato prima non si lamenterà mai di loro. D'altra parte, non potresti averli come parte della lingua e quindi i programmatori ruby ​​o perl si lamentano del fatto che stanno perdendo alcune informazioni chiave.

Non importa davvero. Ciò che conta è come i sigilli si adatteranno alla lingua se li usi o meno. Vuoi essere in grado di fare "123 $foo 456"o devi fare "123 " + foo + " 456"? È qui che dovrebbe essere presa la decisione.


1
L'interpolazione di stringhe come "123 $foo 456"non è abilitata dal prefisso sigil ed è completamente ortogonale ad esso.
Esailija,

1
Fa parte dell'interpolazione delle variabili e dipende da come si analizza una stringa. I sigilli possono renderlo più semplice (può essere fatto in altri modi come mostrato dal modo migliore per eseguire l'interpolazione variabile in javascript? Ma questo non fa parte del linguaggio principale. I sigilli, probabilmente, rendono molto più facile scrivere e capire questo.

1
@MichaelT No, il fatto che le variabili abbiano prefissi non rende più facile o difficile l'implementazione dell'interpolazione di stringhe. Sono solo 2 cose completamente indipendenti. Per un lettore umano, avrebbe potuto essere una buona scelta usare $asdnella sintassi di interpolazione di stringhe se $fosse già stato usato per prefissi variabili, ma non aveva nulla a che fare con l'effettiva possibilità di implementare l'interpolazione di stringhe in primo luogo.
Esailija,

2
@Esailija potresti descriverti come non sono collegati? A parte, da en.wikipedia.org/wiki/Variable_interpolation - "Le lingue che supportano l'interpolazione variabile includono Perl, PHP, Ruby, Tcl, Groovy e la maggior parte delle shell Unix. In queste lingue, l'interpolazione variabile si verifica solo quando la stringa letterale è tra virgolette doppie, ma non quando è tra virgolette singole. Le variabili sono riconosciute perché le variabili iniziano con un sigillo (in genere "$") in queste lingue. "

@MichaelT Il simbolo del dollaro utilizzato nei prefissi variabili e nell'interpolazione delle stringhe è una scelta completamente superficiale (che ha solo argomenti di leggibilità, non ha nulla a che fare con l'implementazione, potrebbe anche essere quello #che viene utilizzato in coffeescript per esempio. E coffeescript non fa prefisso variabili con #- in effetti non
prefigura

3

Non sono d'accordo sul fatto che PHP usi $ per differire dai vari. Almeno perché PHP ha una sintassi simile a C, e funcs () hanno parentesi dopo il nome.

Leggi questo post in overflow dello stack sul motivo per cui $ è in PHP.

Molti linguaggi popolari, come C, C ++, C #, Java non usano $ e possiamo differire facilmente dalla funzione.

In PHP $ aiuta, ad esempio, quando scrivi: echo "var = $ var"

Senza $ tale trucco sarà impossibile.


+1 ah ha più senso. Grazie.
Reactgular

3
Una lingua con sigilli non ha nulla a che fare con l'interpolazione di stringhe come nel tuo esempio diecho "var = $var"

4
-1. Le stranezze della sintassi di PHP non sono dovute ad alcune effettive limitazioni, ma perché le regole grammaticali sono progettate in modo estremamente scadente, se progettate affatto. Questo è il motivo per cui hanno bisogno di hack per abilitare fn()[]dove con una grammatica ragionevole che avrebbe funzionato fuori dagli schemi senza nemmeno pensarci.
Esailija,

@svidgen Sì. Non è possibile eseguire in modo sicuro l'interpolazione di stringhe senza un modo per indicare quale parte della stringa deve essere mappata su una variabile. Altre lingue finiscono con quella che considero fastidiosa / inutile verbosità, come la formattazione delle stringhe di Python. Tuttavia, ci sono altri vantaggi anche in PHP: RuslanZasukhin non è corretto nel dire che le funzioni saranno sempre indicate con parentesi, in quanto possono anche essere passate come riferimenti.
Izkata,

@Izkata Il modo in cui usi le variabili in una lingua non ha nulla a che fare con la sintassi dell'interpolazione delle stringhe. Ma ciò era implicito in questa risposta, quindi -1 ...
Esailija,

3

Dopo tutte queste risposte, voglio dare qualche punto in più a Mathew Foscarini.

  • Consideri il problema ora come un "costruttore di linguaggio". Cerchi di capire perché un'altra lingua ha questa o quella caratteristica per scegliere se usare qualcosa nella tua lingua. Sono nella stessa posizione da molti anni, perché sto sviluppando il parser SQL per il nostro database Valentina.
  • Ti consiglio di dare un'occhiata a antlr.org e persino di leggere il libro di Terence. Ha molte cose carine per gli sviluppatori di lingue.
  • Non sono ancora d'accordo con i "motivi" esposti da altre risposte. Presumono che l'autore PHP in testa abbia deciso di usare $ per poter usare parole chiave riservate e meglio distinguere le variabili dalle non variabili. Non penso proprio ... anche se provare può essere solo la sua storia.
  • Molto probabilmente seguono solo il perl e le lingue più antiche. Come sottolinea Terrence, la maggior parte delle lingue sono simili, specialmente nella parte LEXER. E di solito il costruttore di una nuova lingua può semplicemente scegliere il tipo di lingua che sta per sviluppare e quindi prendere lexer di quella grammatica linguistica. E questo è quello che dovresti fare ora. Non c'è bisogno di inventare da zero. E scommetto che lo stesso hanno fatto gli autori di PHP.
  • Tutto il resto ciò che la gente dice:
    • distinguere le variabili dalle non variabili
    • parole del reserver come nomi di variabili
    • possibilità di posizionare variabili all'interno della stringa
    • potrebbe essere altro (non sono un grande esperto di PHP)

sono effetti collaterali di questo LEXER , perché è in grado di riconoscere un token.

Prendiamo ad esempio: in SQL utilizziamo "" per poter usare identificatori con parole riservate e persino identificatori con spazi "Nome", "Nome gruppo". GROUP è una parola chiave. C'è stato un problema: c'era una soluzione speciale.

PS Ottimo commento di MichaelT.


+1 grazie per l'ottimo link. Ho finito per usare questo, ma il tuo link sembra molto meglio. goldparser.org
Reactgular il

Grazie anche per il tuo link. Non ho mai visto questo parser d'oro uno prima. Sembra anche interessante.
Ruslan Zasukhin,

@RuslanZasukhin se stai facendo un riferimento alla mia risposta, non ho mai detto che era intenzione dello sviluppatore abilitare le parole chiave. Ho solo detto che l'uso delle parole chiave come nomi di variabili diventa tecnicamente possibile quando le variabili sono precedute da un simbolo simile $. Anche la "capacità di inserire una variabile all'interno della stringa" non è dovuta al fatto che le variabili hanno come prefisso un simbolo simile $. Cioè, "123 $foo 456"funzionerà se anche se la sintassi variabile è simile foo = 3o @foo = 3. Non sono collegati tra loro.
Esailija,

3

... un sigillo consente di:

  • Distinguere meglio le variabili dalle non variabili . Le persone che stanno ancora imparando i concetti di base potrebbero avere difficoltà a capire quali parole sono variabili e quali no. Spesso iniziano leggendo esempi o codici di altre persone senza un background adeguato.

  • Usa parole chiave riservate o nomi di funzioni come nomi di variabili . A volte ho trovato alcuni di quei nomi come quelli giusti per una variabile (cioè $countmentre era stata count()definita una funzione) e ho ringraziato i sigilli per avermi permesso di usarli.

Inoltre mi capita di fare quel nome di funzione riutilizzandolo frequentemente, per contenere il risultato di una funzione in una variabile usa e getta, ad esempio:

$isdir=isdir($dir);

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


1
ZHR, cosa significa meglio? In C ++ scriviamo tutte le nostre variabili senza $ e le distinguiamo perfettamente e facilmente. Esempio: {int z = 0; z = 55; z (z); } E in C ++ possiamo anche usare il nome della funzione se è necessario assegnare, ad esempio il puntatore alla funzione.
Ruslan Zasukhin,

@RuslanZasukhin, Analfabeti di computer, ne conosci alcuni? Prova a insegnare loro in C ++, rimarrai stupito.
ZJR,

Inoltre: non penso che un sigillo debba essere sempre un $segno. Ricordo il simbolo del dollaro che mi confondeva quando ero un bambino a causa della sua intrinseca associazione monetaria. %potrebbe essere un'alternativa fattibile.
ZJR,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.