Jaki nieoretyczny, praktyczny język programowania nie ma zarezerwowanych słów kluczowych?

22

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 = 1lub var x = 1itd .; 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 funclub functionlub declub 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?


źródło
8
Dalej jest całkiem praktyczny i nie zawiera żadnych słów kluczowych.
SK-logic
4
@JamesAnderson, nie, to tylko słowa, tak samo jak wszystkie inne słowa. Żadne specjalne znaczenie.
SK-logic
7
Czy operatorzy i znaki interpunkcyjne są liczone jako „słowo kluczowe”? jeśli tak, to nie może istnieć żaden język, ponieważ nie można zdefiniować żadnej składni.
Emilio Garavaglia,
2
@ SK-logic: zwykle. Ale czym są „identyfikatory”, jeśli jeszcze nie tokenizujesz? Ponieważ token jest „dowolnym rozpoznawalnym żądłem”, „int”, „moja wartość” i „+” nie różnią się przed podaniem reguły składni. Jeśli „+” nie jest zdefiniowane jako operator, może to być tylko nazwa czegoś takiego jak dowolny inny ciąg znaków składający się z jednego znaku Unicode. Operatorzy, z punktu widzenia czystej składni, są niczym więcej niż „jednoznakowymi słowami kluczowymi”.
Emilio Garavaglia,
2
W tym kontekście jakie jest słowo kluczowe? Czy jest to identyfikator, który ma specjalne znaczenie dla kompilatora? Czy jest to identyfikator, którego programista nie powinien używać jako zmiennej czy czegoś takiego? Czy to się liczy bez słów kluczowych, jeśli słowa kluczowe muszą być specjalnie oznaczone? (DŁUGO dawno temu widziałem system ALGOL, w którym słowa kluczowe musiały być cytowane jako słowa kluczowe.)
David Thornley,

Odpowiedzi:

12

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.

Inżynier świata
źródło
2
+1 za „Słowa kluczowe pomagają autorom kompilatorów łatwiej wdrożyć parsowanie”. Myślę, że to tyle. Słowa kluczowe zostały wymyślone, aby zmniejszyć ilość kontekstu, jaki parser musi zachować w pamięci, kiedy cały kompilator wraz z zestawem roboczym musiał zmieścić się w kilkunastu KB pamięci RAM.
Jörg W Mittag
2
Łatwiej jest napisać analizator składni APL niż prawie jakikolwiek inny język! Weź pod uwagę, że pierwsza implementacja interpretera APL została wykonana przy użyciu tranzystorów i diod.
James Anderson
2
Myślę, że głównym powodem słów kluczowych jest ułatwienie ludziom analizy języka. Komputery byłyby szczęśliwsze, gdyby język składał się wyłącznie z cyfr i wzorów bitowych, podobnie jak ich kod maszynowy.
James Anderson
6
Czego brakuje w słowach kluczowych, to więcej niż rekompensuje wymaganie własnej czcionki.
Blrfl,
@Blrfl To jest punkt J, K i Q. Wszystkie są w takim czy innym stopniu, APL w ASCII.
Inżynier świata
9

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.

scrwtp
źródło
1
IIRC Lisp nie ma słów kluczowych. Formularze specjalne muszą być traktowane specjalnie przez kompilator, ale ich nazwy są zwykłymi symbolami.
Jan Hudec
2
Słowa kluczowe są cechą składni, której Lisp też nie ma. Naprawdę nie wydaje mi się, żeby rozmawianie o słowach kluczowych w Lisp miało sens.
Jörg W Mittag
2
Zgadzam się z Jörgiem. Myślę, że można mówić o słowach kluczowych, gdy język ma tokeny, które należy wyraźnie zdefiniować jako specjalne, aby można je było odróżnić od tokenów o podobnej strukturze. Różne tokeny prowadzą do różnych drzew składni. Na przykład ifw C byłby prawidłowym identyfikatorem, gdyby nie został zdefiniowany jako specjalny (słowo kluczowe). Oznacza to, że ifnie jest to identyfikator i if = 10powoduje błąd składniowy. Jeśli się nie mylę, minimal składnia Lisp nie czyni rozróżnienia defunz f, x, yi +w (defun f (x y) (+ x y)).
Giorgio
@Giorgio 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))
tobyodavies
Jednak ta sama uwaga (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.
scrwtp
8

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.

jk.
źródło
2
Pod tym względem Tcl jest bardzo podobny do Lispa, tyle że zamiast „wszystko jest listą” ma „wszystko jest ciągiem”. Lista jest po prostu łańcuchem z białymi spacjami, a wywołanie procedury jest tylko listą, której pierwszy element jest interpretowany jako nazwa procedury, a pozostałe są interpretowane jako jej argumenty. To w zasadzie wyrażenie S Lisp.
Jörg W Mittag
tak, oba używają polskiej notacji i są homo-ikoniczne, więc mają dość podobną semantykę
jk.
5

Komputery są teraz wystarczająco potężne, aby móc wywnioskować znaczenie z kontekstu.

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

f x y = (x+1)*(y-1)

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”.

Ingo
źródło
1
+1 za zajęcie się tym stwierdzeniem (komputery mają teraz wystarczającą moc, aby móc wywnioskować znaczenie z kontekstu). Myślę, że powodem, dla którego gramatyki CFG są preferowane, jest to, że umożliwiają one indukcyjne zdefiniowanie struktury programu. Nie rozumiem, dlaczego ktoś chciałby to zmienić nawet za 100 lat, może brakuje mi wyobraźni?
Giorgio
2
CFG są dość martwe i były martwe przez dziesięciolecia. JavaScript wewnątrz HTML, nawet łańcuchy formatu C wewnątrz C, nawet zagnieżdżone komentarze, powiedzmy, OCaml - wszystkie te rzeczy nie są pozbawione kontekstu. A dlaczego miałbyś chcieć ograniczać się do tak arbitralnie wybranego formalizmu w czasach PEG i GLR?
SK-logic
1
@ Ingo, tak, masz rację, zły wybór przykładu. Miałem na myśli gramatykę mieszaną i rozszerzalną (tj. Wyższego rzędu), które nie są CFG.
SK-logic
2
@ SK-logic: Nie wiem, skąd masz informacje, że CFG są całkiem martwe. Rozmawiałem z moim byłym kolegą, który od 20 lat uczy budowy kompilatora, a CFG wydają się być dalekie od śmierci.
Giorgio
1
@Ingo: O ile pamiętam, aspekty niezwiązane z CF są obsługiwane przez analizę semantyczną drzewa parsowania. Np. { 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.
Giorgio
4

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, superi thisContext.

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.

del-boy
źródło
Jeśli Smalltalk miał poparcie dla wysyła wiadomość z domniemanym odbiornika, a następnie co najmniej true, falsea nilmoże być zdefiniowana jako metody na tej niejawnej odbiornika, a biorąc pod uwagę możliwości refleksji, trzy pozostałe prawdopodobnie również.
Jörg W Mittag
1
To nie są słowa kluczowe, to pseudozmienne. „Pseudo”, ponieważ true, falsei nilsą dobrze znane wartości dostarczanych przez środowisko i self, superi thisContextsą zmiennymi nie można ustawić, ale której wartości zmieniają się w wyniku egzekucji.
Frank Shearar,
3

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ę!

Mason Wheeler
źródło
Wszystkie doskonałe punkty. +1
gdyby każdy rzeczownik, czasownik, przysłówek i przymiotnik w powieści był oznaczony jako taki, utrudniłoby to czytanie nie było łatwiejsze!
@JarrodRoberson: Jasne, że tak, ale kod nie jest powieścią. Języki naturalne bardzo różnią się od języków programowania. Język naturalny rozumiany jest intuicyjnie, podczas gdy język programowania ma formalną semantykę. Techniki użyte do odczytania go i zrozumienia jego znaczenia są bardzo różne i błędem jest próba zrównania tych dwóch rzeczy tak jak ty.
Mason Wheeler,
Powiedziałem pisarz kompilatora, który różni się od kompilatora . Kompilatory działają szybciej na szybszym sprzęcie, autorzy kompilacji są ludźmi, nie przestrzegamy prawa Moore'a!
podstawy kodu, z którymi zwykle pracuję, są o rząd wielkości dłuższe niż powieści, większość z nich ma ponad> 1 000 000 linii kodu, a najdłuższa z nich ma mniej niż 2 000 000 słów ! I podobnie jak powieści, które są czytane przez ludzi, tak naprawdę więcej czasu zajmuje czytanie kodu niż jego pisanie! Biorąc pod uwagę bazę kodu, która ma> 10 lat i ponad 1 000 000 wierszy, liczba odczytów przez deweloperów w ciągu 10 lat jest większa niż w przypadku tworzenia!
2

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?”.

James Anderson
źródło
Wystarczy dodać, że jeśli podoba Ci się wygląd APL, ale nie chcesz kupować nowej klawiatury, to J jest właśnie tym.
AakashM,
0

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 functionniż $!{}. A kontekst nie rozwiązuje wszystkich dwuznaczności.

DeadMG
źródło
1
Myślę, że słowo kluczowe w twojej odpowiedzi jest złożone , odpowiednio zaprojektowany język powinien być prosty , a nie złożony .
1
@Jarrod Roberson: Leonardo da Vinci: „Prostota jest najwyższym wyrafinowaniem”, Antoine de Saint Exupéry: „Wygląda na to, że doskonałości nie osiąga się, gdy nie ma już nic do dodania, ale kiedy nie ma już nic do zabrania”.
Giorgio
1
@Jarrod: Wszystkie znaczące i wyraziste języki komputerowe są złożone.
DeadMG,
1
@DeadMG: Schemat jest bardzo prosty i jednocześnie bardzo wyrazisty. Niestety, o ile mi wiadomo, brakuje w nim znormalizowanej biblioteki.
Giorgio
Erlang jest bardzo ekspresyjny i nie jest złożony pod względem składniowym. Myślę, że wszystkie języki funkcjonalne są bardziej wyraziste z mniej zastrzeżonymi słowami kluczowymi.