Co pozwala niektórym językom to robić, a innym nie? Dlaczego nie zachować jednolitego systemu dodawania średnika na końcu?
Robert udzielił dobrej odpowiedzi na temat Swift, postaram się dodać trochę więcej o parsowaniu w ogóle i dlaczego używać lub nie średników.
Podczas kompilacji programu, zanim plik źródłowy zostanie przekształcony w kod wykonywalny, należy wykonać kilka kroków, z których jednym z pierwszych jest czytanie i parsowanie . Podczas parsowania kod jest przekształcany z sekwencji znaków w ustrukturyzowaną reprezentację zgodnie z gramatyką języka. W tym celu konieczne jest, aby elementy, które składają się na Twój kod (zmienne, stałe, deklaracje itp.) Zostały w jakiś sposób zidentyfikowane i rozdzielone. Kiedy składasz deklarację:
int someNumber = 0;
To tylko sekwencja znaków, którą należy jakoś przekształcić w koncepcję „stwórz„ rzecz ”o nazwie someNumber
typu int
i przypisaj 0
do niej” .
Wymaga to określenia, gdzie dokładnie zaczyna się i kończy instrukcja. Wyobraź sobie, że masz to:
int someNumber = 0;
int otherNumber = 1;
Musisz wiedzieć, że są to dwie różne deklaracje. ;
W językach C-jak jest wykorzystywana do tego, więc parser odczytuje znaki dopóki nie znajdzie, i próbuje zrozumieć, co właśnie czytać jako pojedynczej instrukcji. Pozwala to, jak powiedział Robert, mieć kilka instrukcji w tej samej linii, takich jak:
int someNumber = 0; int otherNumber = 1;
Który ma dokładnie taki sam efekt jak pisanie ich w dwóch wierszach.
W innych językach, takich jak Python , należy umieścić każdą instrukcję w innym wierszu.
x = 3
if x < 10:
print 'x smaller than 10'
else:
print 'x is bigger than 10 or equal'
Nie ma więc potrzeby dodawania a ;
, ponieważ sam język uniemożliwia dodawanie instrukcji w tym samym wierszu!
Jednak inne języki, takie jak LISP lub Scheme , mają zupełnie inny sposób grupowania instrukcji (ok, to nie są naprawdę instrukcje, ale na razie zignorujmy to). Masz więc nawias na wszystko:
(define (do-stuff x)
(begin
(display (format "value: ~a" x))
x))
Znowu, nie trzeba ;
tylko dlatego, że korzystają z tych samych symboli ( )
, (
) do rzeczy, które są w innych językach {
, }
, :
, itd. Ktoś, kto tylko zna składni Lisp może zapytać: Dlaczego trzeba ;
na koniec swojego sprawozdania ?
Wystarczy dodać dziwniejszy przykład: OCaml ma nie tylko średnik na końcu instrukcji ... ma dwa!
let rec fact x =
if x <= 1 then 1 else x * fact (x - 1);;
Dlaczego? Nie wiem :)
Różne języki zostały zaprojektowane z różnymi celami i różnymi filozofiami. Jeśli wszystkie języki mają tę samą składnię i konwencje, zapewne pozwolą ci robić to samo w ten sam sposób.