Podczas programowania w JavaScript zauważyłem wszystko, co można zrobić za pomocą instrukcji, a bloki można wykonać za pomocą samych wyrażeń. Czy język programowania może działać poprawnie tylko z wyrażeniami? A jeśli tak, dlaczego w ogóle używane są wyciągi?
programming-languages
javascript
language-design
MaiaVictor
źródło
źródło
Odpowiedzi:
Pewnie. Najprostszym sposobem jest przypisanie wartości wynikowej do każdej konstrukcji, która jest obecnie instrukcją, a tym samym przekształcenie jej w wyrażenie. Jednak niekoniecznie jest to przydatne lub znaczące. Jedynym potencjalnym zyskiem jest odrobina konceptualnej prostoty. Jednak jeśli następnie przystąpisz do usuwania rzeczy takich jak średniki i pętle (wymagające łańcuchowego łączenia przez inne operatory i funkcje), programy intensywnie korzystające z instrukcji stają się brzydkie.
Bardziej radykalnym, ale sensownym sposobem na to jest takie zaprojektowanie języka, aby prawie wszystko miało znaczącą wartość, i użycie go w taki sposób, że prawie zawsze używasz wyrażenia dla tej znaczącej wartości, a nie dla innych efektów. Robią to funkcjonalne języki programowania (do pewnego stopnia; na przykład Haskell ma deklaracje, które nie są wyrażeniami).
Instrukcje są używane, ponieważ w paradygmacie imperatywnym istnieje wiele typowych operacji, które nie mają użytecznej wartości wynikowej, a także dlatego, że pojęcie instrukcji sekwencyjnych (zamiast obliczeń) całkiem dobrze pasuje do tego paradygmatu. Jeśli duży procent twojego programu to mutowanie stanu, a nie obliczanie nowych wartości, nie ma sensu wymagać tworzenia wartości (co jest wynikiem pętli for?). W przeciwieństwie do tego, gdy cały twój paradygmat (FP) opiera się na obliczaniu wartości, wartości odstające, które nie mają wartości wynikowej, nie gwarantują wyjątku: Zamiast tego dajesz im wynik wartownika, który nic nie znaczy.
źródło
void
inull
/unit
polega na tym, że te ostatnie są wartościami i mogą być przekazywane, podczas gdyvoid
jest wyjątkowe, ponieważ nie ma wartości tego typu.Zależy od tego, jak zdefiniujesz „wyrażenie” i „wyrażenie”.
Bardzo ścisła definicja rozróżniałaby stwierdzenia jako „rzeczy, które mają skutki uboczne, a być może wartość zwrotną”, a wyrażenia jako „rzeczy, które mają wartości zwracane, ale nie mogą mieć skutków ubocznych”. Przy takiej definicji żaden znaczący program nie może zostać napisany bez co najmniej jednej instrukcji (która musiałaby ocenić wyrażenie i wyprowadzić jego wartość zwrotną) - same czyste wyrażenia nie mogą wchodzić w interakcje ze światem poza programem. Sam język może być nadal całkowicie czysty (tzn. Nie zawierać żadnych instrukcji), jeśli nieczysta część zostanie przeniesiona z języka do ekosystemu wspierającego (dokładnie tak robi Haskell, chociaż język ma zarówno definicje, jak i wyrażenia) .
Jeśli jednak dopuszczasz skutki uboczne w wyrażeniach, wówczas rozróżnienie między wyrażeniami a wyrażeniami staje się arbitralne i znacznie mniej interesujące - oczywiście możesz wymyślić język programowania, który składa się wyłącznie z wyrażeń; większość dialektów Lisp działa w ten sposób. W takiej sytuacji ocena wyrażenia pod kątem skutków ubocznych jest prawie dokładnie taka sama, jak wykonanie instrukcji, i można argumentować, że w takim języku wyrażenia i instrukcje są tym samym. Różnica między wyrażeniem a wyrażeniem jest zatem tylko składniowa.
Wiele języków wciąż czyni to rozróżnienie składniowe, ponieważ jest użyteczne nie ze względów technicznych, ale ze względu na czytelność. Wyrażenie czegoś oznacza, że jesteś zainteresowany jego wartością zwrotną, a tym bardziej jego skutkami ubocznymi; złożenie oświadczenia mówi czytelnikowi, że zamierzasz powodować skutki uboczne, a zwracana wartość może być interesująca lub nie.
źródło
ATL i Xtend to języki programowania działające bez instrukcji. Wiele języków funkcjonalnych również nie zawiera instrukcji. Tak, tak, język programowania może działać dobrze bez instrukcji. Myślę, że wypowiedzi w wielu językach są reliktem programowania imperatywnego. Są nadal używane, ponieważ są powszechnie znane, a w niektórych przypadkach sprawiają, że kod jest bardziej czytelny.
źródło
Tak.
Języki funkcjonalne (i języki pojedynczego przypisania) wszystko jest wyrażeniem. Przykładami są Haskal (i SISAL). Gdzie zarówno instrukcje if, jak i pętle zwracają wartości.
Istnieją inne klasy języków: Łatwo przychodzi mi na myśl języki deklaratywne (jestem pewien, że istnieje wiele innych języków, które nie zależą od instrukcji). Te języki nawet nie potrzebują wyrażeń (w takim samym znaczeniu, jak normalnie byś pomyślał). Deklarujesz, co jest prawdą i możesz uzyskać wiele zwrotów wyników. Łatwy jest tutaj
prolog
.źródło