Czy sigile ułatwiają odczytanie kodu źródłowego?

13

W większości języków programowania zmienne nie mają znaków identyfikujących, tak jak w PHP. W PHP musisz poprzedzić zmienną $znakiem.

Przykład;

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

Tworzę nowy język skryptowy dla aplikacji biznesowych, a moi docelowi użytkownicy nie mają doświadczenia w programowaniu. Czy te znaki ułatwiają czytanie i używanie kodu?

Jednym z powodów, dla których PHP go używa, $jest to, że bez niego PHP nie może stwierdzić, czy nazwa jest odwołaniem do funkcji czy odwołaniem do zmiennej. Wynika to z faktu, że język pozwala na dziwne odwołania do funkcji. Tak więc $symbol pomaga parser oddzielenia nazw.

Nie mam tego problemu w moim parserze. Moje pytanie dotyczy więc wyłącznie czytelności i łatwości użytkowania. Kodowałem w PHP od tylu lat, że kiedy widzę $foo, łatwo jest mi zidentyfikować tę zmienną. Czy po prostu preferuję odchylenie od tego identyfikatora?

Reactgular
źródło
19
IMO, kod jest bardziej czytelny bez sigili
John Dvorak
6
@JanDvorak +1 za udzielenie mi nowego słowa dnia. Spróbuję sigilsdziś użyć trzy razy w rozmowach.
Reactgular,
6
IMO Zależy, czy Twój edytor ma podświetlanie składni.
CodeBeard
5
Jeśli użyjesz var $x = ...lub type $x = ...myślę, że $ to przesada. Jeśli tak, $x = ...to warto. Zwłaszcza jeśli nie chcesz obsługiwać podświetlania składni w popularnych edytorach. Jednak, jako preferencja, nie lubięsigils
CodeBeard
5
sigile są jak wymuszony węgierski zapis
maniak zapadkowy

Odpowiedzi:

13

Rzeczywiste możliwości techniczne i ograniczenia nie są niczym takim, jak sugerowano w tym wątku. Najpierw je usuńmy.

Oto, co $ umożliwia w PHP:

  • Zmienne zmienne
  • Zmienne z nazwą słowa kluczowego np. $returnLub mogące używać tej samej nazwy dla zmiennej i funkcji / stałej np$__FILE__

Ograniczenia lub funkcje niezwiązane z przedrostkiem $:

  • W przeciwnym razie implementacja nie będzie w stanie odróżnić funkcji i zmiennych
  • Interpolacja ciągów PHP lub składnia szablonu
  • Wymagana deklaracja zmiennej

Oznacza to, że nie ma technicznego powodu, którego nie mógłbyś mieć

foo = "something";
echo foo;

lub

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

Jednak nie możesz (zakładając, że returnjest słowem kluczowym)

return = "something";

Bez poważnych komplikacji. Jeśli użyjesz takiego prefiksu $, to nie będzie problemu.

To opinia, ale uważam, że sigil byłby warty dla programistów, ponieważ pozwala im używać słów kluczowych jako nazw zmiennych, w przeciwnym razie wyglądałoby to na dowolne ograniczenie: P

Esailija
źródło
O return = "something";C # ma „kontekstowe słowa kluczowe”, co jest również opcją, którą warto sprawdzić podczas projektowania języków.
luiscubal
1
@luiscubal pisanie, że w C # nie jest zaskakujące, wymaga sigil, więc jeśli chcesz skompilować ten kod, musisz napisać @return = "something;". Tak, istnieje pewna liczba kontekstowych słów kluczowych, ale uczynienie ich wszystkimi kontekstowymi oznaczałoby znacznie bardziej skomplikowaną implementację.
Esailija,
7

Sigile mają znacznie większy sens w Perlu, gdzie zapewniają pewną kontrolę typów. W php niewiele pomagają poza szablonowaniem. Możesz dowiedzieć się o ich przydatności i czytelności, rozglądając się po różnych językach. Prawie nikt ich nie używa.

W języku docelowym użytkownika końcowego, nad którym pracuję, posuwam się nawet dalej, czyniąc identyfikatory niewrażliwymi na wielkość liter i pozwalając na spacje i apostrofy. To pozwala mi tworzyć takie nazwy zmiennych, Karl's heightktóre są znacznie bliższe językom naturalnym.

Karl Bielefeldt
źródło
1
+1 za spacje w zmiennych, ale nie mam pojęcia, jak to zaimplementować. Nie jestem pewien, czy łatwiej mi to będzie przeczytać. Po prostu się do tego nie przyzwyczajam.
Reactgular,
1
Podoba mi się ten pomysł. Ale nie chciałbym pisać parsera dla języka ze spacją w identyfikatorze. :-)At Karl's for the night = true;
Martin York,
Byłoby jednak interesujące zobaczyć wszystkie te standardy, które dodajemy do góry języka, aby pomóc nam go przeczytać. Zamiast być sprawdzane ręcznie przez zewnętrzne narzędzie, ale stają się częścią definicji języka. W ten sposób nie możemy mieć bezsensownych argumentów na temat nazw identyfikatorów w standardach kodowania (tak jak w języku).
Martin York,
2
Niewrażliwość na wielkość liter ma jednak problem internacjonalizacji. Jeśli dopuścisz znaki z wielu języków, możesz natknąć się na nazwy, które są „takie same” w niektórych lokalizacjach, ale w innych nie.
luiscubal
1
Zezwalanie na spacje w zmiennych nie jest w zasadzie wielkim problemem - oznacza tylko regułę gramatyczną dla identyfikatorów, która dopuszcza wiele słów. Oznacza to jednak, że inne rzeczy mogą być niemożliwe w gramatyce bez tworzenia dwuznaczności. Na przykład w Haskell map sumjest częściowo zastosowanym wywołaniem funkcji - funkcja sumjest przekazywana jako parametr do map. Ale oba są tylko nazwami bibliotek, więc przy identyfikatorach wielosłówowych kompilator nie mógł wiedzieć, czy map sumjest to jeden identyfikator wielosłówowy, czy aplikacja funkcji oparta na dwóch jednosłówkowych identyfikatorach.
Steve314,
7

Wiele lat temu nauczyłem się Applesoft Basic. Ciągi zawsze były $sufiksowane, a tablice miały sufiks %. Tak właśnie działał język. Patrzyłeś na coś, wiedziałeś, co to jest. Nigdy nie zagłębiałem się zbytnio w tłumacza, aby zrozumieć, dlaczego tak się stało, lub decyzje projektowe, które to sprawiły.


Sigil w php pochodzi od jego perlowego wpływu (na który wpłynęły awki sh). Sigil w perlu to coś więcej niż tylko $to, że może identyfikować wiele różnych typów:

  • $ skalarny
  • @ lista
  • % haszysz
  • & blok kodu
  • * typeglob

Pieczęć identyfikuje, na którą część struktury tabeli symboli patrzysz. Za kulisami wpis w tablicy symboli dla foo (dostępny za pomocą *foo- typeglob) zawiera wszystko, co może być foo. Jest $foo, @foo, %fooThe Format foo , &foo, uchwytu pliku foo, etc ...

Pozwala to również utworzyć alias jednej zmiennej do drugiej:

#!/usr/bin/perl

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

print "$bar @bar\n";

Wypisuje foo 1 2- w Perlu, to co sigile są naprawdę na nie, że należy to zrobić, ale raczej, że jest to za kulisami rzeczy, które robią.

Znaki nie są tak bardzo czytelne, ale raczej po to, aby można było mieć kolizję w przestrzeni nazw $fooi @foobez niej (porównaj inne języki, w których nie można mieć obu int foo; int[] foo;)


Sigile dla czytelności to coś, czego uczy się jako część dowolnego języka - odczytywanie składni. Można hipotetycznie wymusić sam typ (jako notację węgierską), aby był częścią identyfikatora.

Coś w leksykonie w stylu:

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

A potem możesz mieć kod podobny

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

Nie twierdzę, że to dobry pomysł, ale raczej, że ktoś, kto jest przyzwyczajony do języka, będzie mógł przeczytać go natywnie i pomyśli, że poprawia to czytelność, podczas gdy ktoś, kto nie zna języka, może pomyśleć, że po prostu dodaje hałas w języku.

Jednak po pracy z tak zdefiniowanym językiem prawdopodobnie mogłem go przeczytać bez problemu.

Niektórzy ludzie je lubią, inni nie. Dyskusje na ten temat toczą wielkie święte wojny na różnych forach, a to naprawdę sprowadza się do tego, ile z nich korzystałeś.

Można zaprojektować nowy język dla nie-programistów korzystających z pieczęci, a każdy, kto nigdy wcześniej nie programował, nigdy nie narzeka na nie ani trochę. Z drugiej strony, nie możesz mieć ich jako części języka, a następnie programiści Ruby lub Perl narzekają, że brakuje im niektórych kluczowych informacji.

To naprawdę nie ma znaczenia. Liczy się to, jak sigile pasują do języka, jeśli ich użyjesz, czy nie. Chcesz być w stanie to zrobić, "123 $foo 456"czy musisz "123 " + foo + " 456"? Właśnie tam należy podjąć decyzję.


źródło
1
Interpolacja łańcuchów, taka jak, która "123 $foo 456"nie jest włączona przez przedrostek sigil i jest całkowicie do niego ortogonalna.
Esailija,
1
Jest to część interpolacji zmiennych i zależy od tego, jak analizuje się ciąg. Sigile mogą to ułatwić (można to zrobić na inne sposoby, jak pokazano w Najlepszym sposobie wykonywania interpolacji zmiennych w javascript? Ale to nie jest część podstawowego języka. Sigile, prawdopodobnie, znacznie ułatwiają pisanie i rozumienie tego.
1
@MichaelT Nie, fakt, że zmienne mają prefiksy, nie ułatwia implementacji interpolacji ciągów. To tylko 2 zupełnie niezwiązane ze sobą rzeczy. Dla ludzkiego czytelnika być może dobrym wyborem byłoby użycie $asdskładni interpolacji łańcuchów, jeśli $był już używany do zmiennych prefiksów, ale nie miało to nic wspólnego z faktyczną możliwością implementacji interpolacji łańcuchów.
Esailija,
2
@Esailija, czy mógłbyś opisać, jak są ze sobą niezwiązani? Na marginesie, od en.wikipedia.org/wiki/Variable_interpolation - „Języki obsługujące interpolację zmienną obejmują powłoki Perl, PHP, Ruby, Tcl, Groovy i większość powłok uniksowych. W tych językach interpolacja zmiennych występuje tylko wtedy, gdy literał ciąg znaków jest podwójnie cytowany, ale nie w przypadku pojedynczego cudzysłowu. Zmienne są rozpoznawane, ponieważ zmienne zaczynają się od sigil (zwykle „$”) w tych językach. ”
@MichaelT Symbol dolara używany w zmiennych prefiksach i interpolacji ciągów jest całkowicie powierzchownym wyborem (który ma tylko argumenty czytelności, nie ma nic wspólnego z implementacją, równie dobrze może być #używany na przykład w coffeescript. A coffeescript nie ma prefiksu zmienne z #- w rzeczywistości w ogóle nie ma prefiksu zmiennych)
Esailija,
3

Nie zgadzam się, że PHP używa $, aby odróżnić vars od funcs. Przynajmniej dlatego, że PHP ma składnię podobną do C, a funcs () mają nazwy parens.

Przeczytaj ten post o przepełnieniu stosu o tym, dlaczego $ jest w PHP.

Wiele popularnych języków, takich jak C, C ++, C #, Java, nie używa $ i możemy różnić się łatwymi wariantami od funkcji.

W PHP $ pomaga na przykład, kiedy piszesz: echo "var = $ var"

Bez $ taka sztuczka będzie niemożliwa.

Ruslan Zasukhin
źródło
+1 ah, co ma większy sens. Dzięki.
Reactgular,
3
Język mający sigile nie ma nic wspólnego z interpolacją ciągów znaków, jak w twoim przykładzieecho "var = $var"
4
-1. Dziwactwa składni PHP nie wynikają z pewnych faktycznych ograniczeń, ale dlatego, że reguły gramatyczne są wyjątkowo źle zaprojektowane, jeśli w ogóle są zaprojektowane. Dlatego potrzebują hacków, aby umożliwić fn()[]gdzieś z rozsądną gramatyką, która zadziałałaby po wyjęciu z pudełka, nawet o tym nie myśląc.
Esailija,
@svidgen Tak. Nie można bezpiecznie wykonywać interpolacji ciągów bez możliwości wskazania, która część ciągu ma zostać odwzorowana na zmienną. Inne języki kończą się tym , co uważam za denerwującą / niepotrzebną gadatliwością, na przykład formatowaniem napisów w Pythonie. Istnieją jednak również inne zalety PHP: RuslanZasukhin niesłusznie twierdzi, że funkcje zawsze będą wskazywane za pomocą parens, ponieważ można je również przekazywać jako referencje.
Izkata,
@Izkata Sposób, w jaki używasz zmiennych w języku, nie ma nic wspólnego ze składnią interpolacji łańcuchów. Ale to wynikało z tej odpowiedzi, stąd -1 ...
Esailija,
3

Po tych wszystkich odpowiedziach chciałbym dać trochę więcej punktów Mathew Foscarini.

  • Teraz traktujesz problem jako „konstruktor języka”. Próbujesz zrozumieć, dlaczego inny język ma tę lub inną funkcję do wyboru, jeśli chcesz użyć czegoś w swoim własnym języku. Mam wiele lat na tej samej pozycji, ponieważ opracowuję analizator składni SQL dla naszej bazy danych Valentina.
  • Radzę zajrzeć na antlr.org, a nawet przeczytać książkę z Terence. Ma wiele fajnych rzeczy dla twórców języków.
  • Nadal nie zgadzam się na „powody” ujawnione przez inne odpowiedzi. Zakładają, że autor PHP zdecydował się użyć $, aby móc użyć zastrzeżonych słów kluczowych i Lepiej odróżnić zmienne od nie-zmiennych. Nie sądzę ... chociaż udowodnienie może być tylko jego własną historią.
  • Najprawdopodobniej po prostu używają Perla i innych wczesnych języków. Jak podkreśla Terrence, większość języków jest podobnych, zwłaszcza w części LEXER. I zwykle konstruktor nowego języka może po prostu wybrać język, który zamierza rozwinąć, a następnie skorzystać z leksyki tej gramatyki. I właśnie to powinieneś teraz zrobić. Nie trzeba wymyślać od zera. I założę się, że to samo zrobili autorzy PHP.
  • Wszystko inne, o czym ludzie wspominają:
    • odróżniać zmienne od nie-zmiennych
    • ponownie wpisz słowa jako nazwy zmiennych
    • możliwość umieszczenia zmiennej wewnątrz łańcucha
    • może być inny (nie jestem wielkim ekspertem w PHP)

skutkami ubocznymi tego LEXERA , ponieważ jest on w stanie rozpoznać token.

Weźmy jako przykład: w SQL używamy „”, aby móc używać identyfikatorów z zastrzeżonymi słowami, a nawet identyfikatorów ze spacjami „Imię”, „Nazwa grupy”. GROUP jest słowem kluczowym. Wystąpił problem - było specjalne rozwiązanie.

PS Bardzo dobry komentarz od MichaelT.

Ruslan Zasukhin
źródło
+1 dzięki za wspaniały link. Skończyło się na tym, ale twój link wygląda o wiele lepiej. goldparser.org
Reactgular,
Dziękuję również za twój link. Nigdy wcześniej nie widziałem tego złotego parsera. Wygląda również interesująco.
Ruslan Zasukhin,
@ RuslanZasukhin, jeśli odwołujesz się do mojej odpowiedzi, nigdy nie powiedziałem, że intencją programisty było włączenie słów kluczowych. Powiedziałem tylko, że użycie słów kluczowych jako nazw zmiennych staje się technicznie możliwe, gdy zmienne są poprzedzone symbolem podobnym $. Również „możliwość umieszczenia zmiennej w ciągu znaków” nie wynika z tego, że zmienne są poprzedzone takim symbolem $. Oznacza to, "123 $foo 456"że zadziała, nawet jeśli składnia zmiennej jest podobna foo = 3lub @foo = 3. Nie są ze sobą spokrewnieni.
Esailija,
3

... pieczęć pozwala:

  • Lepiej odróżnij zmienne od nie-zmiennych . Ludzie, którzy wciąż uczą się podstawowych pojęć, mogą mieć problem z ustaleniem, które słowa są zmiennymi, a które nie. Często zaczynają od czytania przykładów lub kodu innej osoby bez odpowiedniego tła.

  • Użyj zastrzeżonych słów kluczowych lub nazw funkcji jako nazw zmiennych . Czasami stwierdziłem, że niektóre z tych nazw są odpowiednie dla zmiennej (tj. $countGdy count()zdefiniowano funkcję) i podziękowałem sigilom za pozwolenie na ich użycie.

Zdarza się również, że często używam tej funkcji do ponownego użycia , dla utrzymania wyniku funkcji w zmiennej wysuwanej, np .:

$isdir=isdir($dir);

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

ZJR
źródło
1
ZHR, co znaczy lepiej? W C ++ piszemy wszystkie nasze zmienne bez $ i doskonale i łatwo je rozróżniamy. Przykład: {int z = 0; z = 55; z (z); } A w C ++ możemy również użyć nazwy funkcji, jeśli trzeba ją przypisać, na przykład wskaźnik do funkcji.
Ruslan Zasukhin,
@ RuslanZasukhin, analfabeci komputerowi, znasz jakieś? Spróbuj nauczyć je C ++, będziesz zaskoczony.
ZJR
Ponadto: nie wydaje mi się, aby sigil zawsze był $znakiem. Pamiętam znak dolara, który mylił mnie, gdy byłem dzieckiem ze względu na nieodłączne powiązania pieniężne. %może być wykonalną alternatywą.
ZJR