Szukałem praktycznego języka programowania, który nie ma zastrzeżonych słów kluczowych, ale nie miałem szczęścia go znaleźć.
Pracuję nad językiem programowania dla własnej edycji i rozrywki i nie musiałem jeszcze zawierać żadnych słów kluczowych, co doprowadziło mnie do wyszukiwania i pytania:
Nie uważam wygody pisarza kompilatora za ważną dla użytkownika końcowego języka. Komputery są teraz wystarczająco potężne, aby móc wywnioskować znaczenie z kontekstu. Tylko pisarz nie musi oznaczać rzeczowników, czasowników itp., Pisząc powieść, dlaczego programista powinien oznaczać funkcje i zmienne za pomocą function x() {}
lub set x = 1
lub var x = 1
itd .; kiedy mogę wywnioskować z kontekstu instrukcji, że jest to deklaracja funkcji lub wywołanie lub że etykieta jest przypisaniem wartości lub odniesieniem do tej wartości etykiety?
Oto przykład beton, co mój obecny parser robi, nie ma potrzeby zarezerwowanych słów kluczowych w celu wspierania wspólnych rzeczy, które normalnie mają sporo hałasu jak func
lub function
lub dec
lub co nie.
Deklaracja funkcji
sum3(a,b,c) -> a + b + c.
Wywołanie funkcji
x = sum3(1,2,3).
Anonimowa funkcja o nazwie x
x = (a,b,c) -> a + b + c.
y = x(1,2,3).
Chciałbym wiedzieć, dlaczego słowa kluczowe są tak ważne dla skutecznego języka programowania?
Odpowiedzi:
MUMPS odnosi duże sukcesy, jest szeroko stosowany w ubezpieczeniach i opiece zdrowotnej i nie ma w nim żadnych zastrzeżonych słów. Powiedziałbym, że pomagają w pisaniu jaśniejszego kodu, ale nie są absolutnie konieczne. APL to kolejny przykład. APL wykorzystuje między innymi jednorazowe skrypty w przemyśle nuklearnym. J , członek rodziny APL, również nie ma słów kluczowych.
Słowa kluczowe pomagają autorom kompilatorów łatwiej wdrożyć parsowanie. APL jest znanym stowarzyszeniem. Pomagają również wzmocnić konwencje i poprawić czytelność. APL nie jest znany z tego, że jest bardzo czytelny dla większości.
źródło
Jednym z dobrze znanych języków bez słów kluczowych jest Lisp. Najbardziej zbliżone do słów kluczowych są tak zwane formularze specjalne - ich liczba może się różnić w zależności od dialektu - które są traktowane przez tłumacza w specjalny sposób. Poza tym są one nie do odróżnienia od zwykłych funkcji pod względem sposobu, w jaki są używane, z wyjątkiem tego, że nie można ich przedefiniować (przynajmniej w Lisps, którego znam).
Powoduje to prostą (ale bardzo ciężką) składnię i jest jedną z rzeczy, które pozwoliły Lispowi mieć tak potężny system makr. Z drugiej strony Lisp często mówi się, że jest trudny do odczytania. APL i MUMPS, tym bardziej, widziałem oba opisane jako w połowie drogi do Brainf * ck. Słowa kluczowe pomagają w tym dziale i ułatwiają czytanie kodu także nam, ludziom.
Nie powiedziałbym więc, że słowa kluczowe są wymagane dla udanego języka, ale z pewnością pomagają językowi odnieść sukces.
źródło
if
w C byłby prawidłowym identyfikatorem, gdyby nie został zdefiniowany jako specjalny (słowo kluczowe). Oznacza to, żeif
nie jest to identyfikator iif = 10
powoduje błąd składniowy. Jeśli się nie mylę, minimal składnia Lisp nie czyni rozróżnieniadefun
zf
,x
,y
i+
w(defun f (x y) (+ x y))
.if
to w szczególności poprawna nazwa zmiennej w Common Lisp (i innych Lisp-2)(defparameter if nil)
niczego nie złamie i może być używana w formach takich jak(unless if (setf if t))
(defun if ...)
zawiedzie. Zrobiłem notatki z komentarzy i zredagowałem odpowiedź. Zgadzam się, że specjalne formularze nie są słowami kluczowymi na tym samym poziomie co na przykład w C, ale wciąż są najbliższą rzeczą, jaką ma Lisp.TCL nie ma słów kluczowych i faktycznie tylko 12 reguł składniowych. choć nie jest tak popularny, jak kiedyś, ma swoją niszę z oczekiwaniami i jest wbudowany w ECAD i routery, więc z pewnością uważam to za praktyczne.
Myślę też, że może to pokazać, dlaczego wiele języków nie idzie tą drogą. Tak, jest całkowicie możliwe napisanie parsera TCL (prawdopodobnie łatwiej niż w wielu innych językach), jednak nie można napisać bardzo przydatnej gramatyki BNF dla tego języka i wiele osób wydaje się mieć problemy z nauką języka. Podejrzewam, że dzieje się tak przynajmniej z powodu braku słów kluczowych.
źródło
Czy to oznacza, że chcesz gramatyki, która nie jest pozbawiona kontekstu? Powodzenia.
To nie jest pytanie o bycie potężnym czy nie. Istnieją wieczne, niezmienne zasady dotyczące języków - matematyczne. To oraz fakt, że język programowania powinien być łatwy w składni, sprawi, że CFG będą rządzić przez kilka dziesięcioleci.
Przy okazji, w składni typu Haskell, po prostu piszesz coś takiego
zdefiniować funkcję. Zauważ jednak, że „słowem kluczowym” w tym przypadku jest „=”. Jeśli go przegapisz, w parserze wydarzą się straszne rzeczy.
Ale jest to punkt, w którym zgadzam się z tobą, uważam to za znacznie bardziej intuicyjne niż wszystkie słowa kluczowe def, dcl, fun, fn, function lub what-not, które wprowadzają funkcje w innych językach.
Jednak ta gramatyka może być napisana zwykłym starym LALR (1), tutaj nie ma znaczenia „wywnioskowanego z kontekstu”.
źródło
{ int x = 0; x = "HELLO"; }
Powinien wygenerować drzewo analizy, ale gdy kompilator wyszukuje x w drugim zadaniu, widzi, że został zadeklarowany jako int i generuje błąd typu. Tak więc program jest odrzucany, nawet jeśli jego struktura CF jest poprawna.O ile mi wiadomo, Smalltalk to język, który ma najmniej słów kluczowych (jeśli nie liczę języków takich jak Brainfuck). Smalltalk słów kluczowych
true
,false
,nil
,self
,super
ithisContext
.Zaprojektowałem język inspirowany smalltalk, który nie zawierał słów kluczowych. Ale po pewnym czasie korzystania z niego dodałem kilka słów kluczowych, głównie do cukru syntaktycznego.
Tak więc, moim zdaniem, język bez słów kluczowych jest możliwy, ale nie jest zbyt praktyczny i dlatego wszystkie popularne języki mają słowa kluczowe.
źródło
true
,false
anil
może być zdefiniowana jako metody na tej niejawnej odbiornika, a biorąc pod uwagę możliwości refleksji, trzy pozostałe prawdopodobnie również.true
,false
inil
są dobrze znane wartości dostarczanych przez środowisko iself
,super
ithisContext
są zmiennymi nie można ustawić, ale której wartości zmieniają się w wyniku egzekucji.Wydaje się, że pracujesz pod fałszywym założeniem, że słowa kluczowe mają ułatwić kompilatorowi pracę. Chociaż ułatwiają kompilatorowi, mają znacznie ważniejszą zaletę: ułatwiają osobie czytającej kod .
Tak, możesz spojrzeć na kilka kontekstów i dowiedzieć się, że patrzysz na deklarację funkcji lub deklarację zmiennej, ale w zależności od kontekstu i złożoności kodu, znalezienie tego może zająć dużo czasu . Lub możesz mieć tam przydatne słowo kluczowe, takie jak function lub var , i od razu wiesz, na co patrzysz.
Tak, sprawiają, że kod jest bardziej skomplikowany do pisania , ale biorąc pod uwagę, że programy poświęcają dużo więcej czasu na konserwację niż na produkcję, a ich kod jest odczytywany, debugowany i utrzymywany o wiele więcej niż jest stworzony, próbując zaprojektować swój język ułatwienie pisania zamiast czytania to klasyczny przypadek szkodliwej przedwczesnej optymalizacji.
Nie lekceważ także koncepcji, które ułatwiają pracę kompilatora. Im łatwiej jest parsować, tym szybciej kompiluje się kod, co oznacza, że cykle edycji-kompilacji-debugowania stają się szybsze, co oznacza wzrost wydajności.
Gdy masz dużą, złożoną bazę kodu, może to stanowić niebanalną różnicę w wydajności. Na przykład tam, gdzie pracuję, mamy program, który ma około 4 milionów linii Delphi. Mamy kolejny moduł zawierający około 300 000 linii C ++. Obie kompilują się w tym samym czasie. (Około 3 minut.) Gdybyśmy mieli 4 miliony linii C ++, skompilowanie może zająć godzinę!
źródło
Istnieje kilka rzadkich przykładów.
APL używa tylko symboli - ale wiele z nich! Aby korzystać z języka, potrzebujesz specjalnej klawiatury.
Widzieć ten artykuł w Wikipedii
CORAL 66 - miał słowa kluczowe, ale rozpoznał je tylko wtedy, gdy były cytowane z pojedynczymi cudzysłowami.
PL / 1 zawierało również słowa kluczowe - ale można było ich również używać jako nazw zmiennych lub procedur.
Podsumowując, twoje pytanie jest trochę jak pytanie „dlaczego języki mówione mają słowa?”.
źródło
Głównym powodem jest to, że ludzie i komputery łatwiej analizują. Ujednoznacznienie złożonego języka bez słów kluczowych wymagałoby wielu symboli jako składni i byłoby masowo i niepotrzebnie mylące. Jest o wiele łatwiejszy do odczytania
function
niż$!{}
. A kontekst nie rozwiązuje wszystkich dwuznaczności.źródło