Najczęściej w imperatywnym języku ogólnego przeznaczenia - średniki jako separatory instrukcji są albo wymagane, albo całkowicie niedozwolone (np. C i Python).
Jednak niektóre języki, na przykład JavaScript, pozwalają zrezygnować z ograniczania instrukcji średnikami na rzecz innych separatorów (takich jak nowa linia).
Jakie są za tym decyzje projektowe? Rozumiem, że średniki są niezbędne przy pisaniu wielu instrukcji w tym samym wierszu, ale czy istnieje jeszcze jeden powód, aby uczynić je obowiązkowymi (oprócz następujących po C)?
programming-languages
syntax
Aber Kled
źródło
źródło
I understand that semicolons are essential when writing multiple statements on the same line
- Zależy od języka. Mój ulubiony nie ma takich ograniczników, następna instrukcja zaczyna się, gdy wszystkie argumenty funkcji zostaną wyczerpane.}
lub na końcu pliku).Odpowiedzi:
Ustanowienie ich jako obowiązkowych (lub całkowite ich niedopuszczenie) zmniejsza liczbę przypadków narożnych, eliminuje potencjalne źródło niejasnych błędów i upraszcza projektowanie kompilatora / interpretera.
Projektanci języków, którzy zdecydowali się na ich opcjonalność, wybrali dwuznaczność w zamian za większą elastyczność syntaktyczną.
źródło
JavaScript pokazał nam, że to bardzo zły pomysł. Na przykład:
W C zwraca wartość 0. W JavaScript zwraca to,
undefined
ponieważ średnik wstawia się po instrukcji return, i nie jest od razu oczywiste, dlaczego kod się psuje, chyba że wiesz o szczegółach automatycznego wstawiania średnika.źródło
return
jest tylko jednym z niewielu przypadków, w których JavaScript wstawi średnik, nawet jeśli program byłby bez niego poprawny. (Ale oczywiście podważa to punkt Masona Wheelera. Problem nie polega na tym, że średniki są opcjonalne, chodzi o to, że reguły są niespójne.)Upraszcza to nieco gramatykę i analizator składni, dzięki czemu średniki są obowiązkowe. Zasadniczo umożliwia leksykowi zrzucenie wszystkich białych znaków, w tym znaków nowej linii, a analizator składni nie musi się o to martwić.
Z drugiej strony, kiedy i tak zaczniesz chcieć powiedzieć parserowi o białych znakach, nie jest trudno ustawić opcjonalne średniki. Często możesz po prostu połączyć je z
whitespace
tokenem, a parser poradzi sobie z tym dobrze.Na przykład spróbuj wstawić średnik do następującej serii instrukcji C.
Chociaż jest kilka dziwnych rzeczy, których nie można już robić,
while(1);
w większości przypadków jest to stosunkowo łatwe dzięki nowoczesnym technikom analizowania, aby ustalić, gdzie kończą się instrukcje bez określonego ogranicznika. Nawet jeśli nadal chcesz pozwolić na dziwne rzeczy, nie jest tak trudno stworzyćnewline_or_semicolon
nieterminalne.źródło
Średniki są przydatne w gramatyce z 2 powodów. Po pierwsze, pozwala na dzielenie długich instrukcji na wiele wierszy bez pochlebnych znaków kontynuacyjnych (mówię o tobie, Fortran i Basic). Po drugie, parser ma sposób na „zrezygnowanie” z parsowania, gdy składnia jest naprawdę skomplikowana z powodu literówki. Kradnąc z przykładu Karla Bielefeldta,
wyobraź sobie, że wpisałeś jeden dodatkowy otwarty paren:
gdzie jest teraz błąd? Jeśli masz średnik, parserowi łatwiej jest zrezygnować z pierwszego średnika. Może nawet kontynuować parsowanie po średniku, jeśli chce.
Teraz parserowi łatwiej jest zgłosić błąd i łatwiej zlokalizować linię / kolumnę, w której wystąpił.
źródło
Średniki nie zawsze są niczym lub niczym, jak wspomniałeś w swoim pytaniu. Na przykład gramatyka Lua jest starannie zaprojektowana, aby była wolna (wszystkie białe znaki, w tym znaki nowej linii, można zignorować), ale także bez konieczności używania żadnych średników. Na przykład następujące programy są równoważne:
źródło
Pomijając wszystkie projekty i konstrukcje, uważam, że wielu programistów pochodzi z różnych środowisk, a niektórzy nauczyli się używać średnika, a niektórzy nie. Wiele nowych języków, które się pojawiają, nie wymaga średnika, ale nadal pozwala na jego istnienie. Myślę, że może to być po prostu sposób na zachęcenie większej liczby programistów do nauki pisania kodu w tych nowych językach bez konieczności rezygnacji z nawyków od samego początku.
źródło