Zwykle piszę w języku C # lub Objective-C, a ostatnio postanowiłem nauczyć się nowego języka programowania Apple - Swift.
Pierwszą rzeczą, którą zauważyłem, jest to, że nie trzeba dodawać średników, aby zakończyć linię w Swift, ale jeśli zrobisz to - przynajmniej z tego, co przetestowałem - nie będzie to kolidowało z kompilatorem.
Kiedy piszę:
int someNumber = 0;
w Celu C średnik mówi programowi, że linia się skończyła i nie przechodzi do następnej linii.
Za pomocą Swift mogę zadeklarować zmienną za pomocą
var someNumber:Int = 5
i nie dodaje średnika, a system wie, że to koniec linii.
Co pozwala niektórym językom to robić, a innym nie? Dlaczego nie zachować jednolitego systemu dodawania średnika na końcu?
Odpowiedzi:
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ę:
To tylko sekwencja znaków, którą należy jakoś przekształcić w koncepcję „stwórz„ rzecz ”o nazwie
someNumber
typuint
i przypisaj0
do niej” .Wymaga to określenia, gdzie dokładnie zaczyna się i kończy instrukcja. Wyobraź sobie, że masz to:
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: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.
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:
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!
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.
źródło
Podziały linii są używane zamiast średników w celu ograniczenia końca instrukcji.
W przewodniku językowym: Podstawy mówi:
Dlaczego? Ponieważ tak chcieli projektanci języków.
Drugie zdanie powyżej wskazuje, dlaczego nie potrzebujesz średników; większość instrukcji ma jedną linię. Obserwuj ten przykład sortowania bąbelkowego; kombinacja instrukcji jednowierszowych i bez średników zapewnia bardzo czystą składnię podobną do VB, ale mniej szczegółową:
Ponieważ instrukcje w Swift zwykle kończą się podziałem wiersza, potrzeba użycia średników do oznaczenia końca instrukcji jest zmniejszona. Inne języki używające średników nie działają w ten sposób; możesz swobodnie pisać wieloliniowe instrukcje, ale kompilator wie tylko, że instrukcja się zakończyła, gdy umieścisz średnik na jej końcu.
Gdy instrukcje nie kończą się na podziale wiersza, musisz umieścić podział wiersza w miejscu, które kompilator Swift może rozpoznać jako kontynuację poprzedniego wiersza:
źródło