Analiza języka programowania

10

W SICP autorzy stwierdzają ( sekcja 1.1 ), że istnieją trzy podstawowe „mechanizmy” języków programowania:

  • wyrażenia prymitywne , które reprezentują najprostsze byty, których dotyczy język

  • środki kombinacji , dzięki którym elementy złożone są budowane z prostszych

  • środki abstrakcji , za pomocą których elementy złożone mogą być nazywane i przetwarzane jako jednostki

Jak mogę analizować główny język programowania (na przykład Java) pod kątem tych elementów lub mechanizmów?


źródło
Czy wcześniej szukałeś formy Extended Backus-Naur Form, EBNF lub Backus-Naur, BNF ? Potrafi rozbić gramatykę podobną do tych trzech pojęć, choć tak naprawdę nie jestem pewien, jakie są twoje intencje, więc nie wiem, czy to pomoże, czy nie.
Jetti,
@Jetti - tak, mam i nie, nie interesuje mnie to. Naprawdę chcę analizować semantykę (pytanie: czy to właściwie słowo, którego szukam?) Języków programowania, a nie ich formy pisemne (tj. składnia).

Odpowiedzi:

1

Rozróżnienie między pierwotnymi wyrażeniami, środkami kombinacji i środkami abstrakcji jest użyteczne przy modelowaniu języków programowania. Zauważ, że nie jest to nieodłączna właściwość języka: nie możesz wskazać żadnej definicji języka i powiedzieć „ta cecha jest jednoznacznie pierwotnym wyrażeniem, ta cecha jest jednoznacznie środkiem kombinacji”. To rozróżnienie jest właściwością modelu, a złożone modele mogą opierać się klasyfikacji.

Przykładem tych trzech pojęć jest rachunek lambda , który ma dokładnie jedno z nich:

  • Zmienne x , y ,… są jedynymi prymitywnymi wyrażeniami.
  • Zastosowanie funkcji MN jest jedynym sposobem łączenia.
  • Abstrakcja lambda λx.M jest jedynym sposobem abstrakcji.

Gdy przejdziesz do języków z większą liczbą funkcji, modelowanie może stać się bardziej niejednoznaczne. Mówiąc ogólnie, prymitywne wyrażenie to takie, którego nie można lub nie można podzielić na prymitywne składniki. Ale jest jak atom : jest prymitywny, dopóki nauka nie ruszy. Na przykład istnieje wariant rachunku lambda, w którym zmienne używają liczb, a nie nazw ( wskaźników de Bruijna ), co jest szczególnie wygodne przy modelowaniu terminów lambda dla proofów komputerowych; a w dowodach komputerowych liczby całkowite są podzielone na części składowe . W tych modelach zmienne nie są jednak prymitywnymi wyrażeniami.

W (typowym modelu) Javy pierwotne wyrażenia są przede wszystkim stałymi i zmiennymi. Sposoby kombinacji obejmują liczne operatory; Dokładniej, „Dodatek ekspresyjny” jest środkiem kombinacji dwie szczeliny (z lewej strony, a po prawej stronie), albo w trzy szczeliny (obu stronach plus operatora), jeśli zawierają zarówno A + B i A - B pod tą nazwą (w takim przypadku operatory +i -konstrukcje prymitywne same w sobie). Inne sposoby łączenia obejmują sekwencje instrukcji I ; J , konstrukty pętlowewhile (…) {…}, i tak dalej. Następnie masz konstrukcje, takie jak deklaracje zmiennych, definicje funkcji, definicje klas i tak dalej, które są zarówno środkami kombinacji (łączą nazwy i typy parametrów, ciała, inicjalizatory, ...) i środkami abstrakcji (ponieważ definiują nazwy do ponownego użycia). W rzeczywistości dość powszechne jest to, że środki abstrakcji są również środkami łączenia: łączą nazwę z jej definicją.

Gilles „SO- przestań być zły”
źródło
Niezła odpowiedź; masz problemy, z którymi
Co dokładnie rozumiesz przez „zmienną”? Czy nie można ich opisać jako środków abstrakcji, ponieważ mają swoją nazwę?
morbidCode
@morbidCode Pojęcie zmiennej jest skomplikowane, a słowo ma inne, ale powiązane znaczenie w rachunku lambda i w Javie. Zmienna może być uważana za „abstrakcję”, ponieważ odnosi się do nieokreślonej wartości. Nie jest to jednak sposób abstrakcji: nie tworzy referencji, jest jedynie sposobem na wykorzystanie istniejącej abstrakcji. Abstrakcja lambda tworzy sposób użycia bloku kodu jako obiektu, którym można manipulować.
Gilles „SO- przestań być zły”,
4

Szorstki dźgnięcie:

Wyrażenia są właśnie takie; co stanowi wyrażenie w Javie. Nie wiem, czy rozwinąłoby się to o instrukcje, czy nie.

Kombinacje obejmowałyby wyrażenia złożone, instrukcje (zmienne?), Metody, mechanizm klasy i pakiety. Moduły też, gdy będą w języku.

W Javie najprostszym sposobem abstrakcji jest klasa: nic nie może istnieć poza klasą. Być może istnieją „warstwy” abstrakcji: metoda statyczna jest prawdopodobnie prostsza niż metoda instancji, ponieważ nie wymaga instancji.

Leki generyczne oferują dodatkową warstwę abstrakcji (i frustracji).

Dave Newton
źródło
@MattFenwick Wyrażenie może składać się z jednego elementu pierwotnego, a kombinacja elementów pierwotnych i innych elementów tworzy wyrażenie złożone (wciąż wyrażenie, ale nie wyrażenie).
Dave Newton,
@MattFenwick Nie jestem, nie mówię, że wyrażenie jest prymitywne, mówię, że wyrażenie może składać się tylko z jednego pierwotnego. Nie ma mowy, że Łańcuch jest prymitywny tylko dlatego, że język zapewnia mu cukier składniowy, chyba że chcesz rozróżnić natychmiastowy łańcuch od tworzonego przez niego odwołania. Powiedziałbym, że + jest, ponieważ nie można w żaden sposób działać.
Dave Newton,
Co do twojej strony: czy jest problem z implementacją generycznych Java?
Steven Evers,
2

Oto moja podstawowa kategoryzacja. Próbuję narysować paralelę z LISP.

Wyrażenia pierwotne

  • Wszystkie prymitywne wartości, rzeczy, które możesz przedstawić za pomocą literałów (liczby, logiczne, ...)

Równolegle w LISP : atomy, liczby i listy.

Sposoby łączenia (sposoby budowania złożonych struktur danych)

  • Tablice
  • Obiekty / struktury.

Równolegle w LISP : Wady komórki, listy

Środki abstrakcji

  • Cała składnia przepływu sterowania (jeśli, podczas gdy dla)
  • Wszyscy operatorzy wbudowane ( +, -, *, /, ...)
  • Wszystkie funkcje (w tej kategorii uwzględniamy klasy i metody)

Równolegle w LISP : funkcje, cukier syntaktyczny let,define

hugomg
źródło
Niezła odpowiedź! Myślałem, że może niektóre konstrukcje kontroli przepływu będą pasowały do ​​siebie za pomocą kombinacji. Ładne podobieństwa z LISP, które bardzo pomagają.
Nie do końca. Tablice i obiekty grają na innym poziomie, są częścią reprezentacji danych, a nie samego języka. Inicjatory tablic są częścią języka i stanowią kombinację. Operatory i konstrukcje sterujące przepływem nie są środkami abstrakcji, ponieważ nie „przechowują” niczego do ponownego użycia. Środki abstrakcji zwykle nadają nazwę bytowi do ponownego użycia pod tą nazwą.
Gilles „SO- przestań być zły”
0

Język programowania jest ogólnie definiowany przez jego składnię i semantykę . Oba zostaną określone w standardach dla języka.

Składnia określa, jak napisać poprawny program, a semantyka określa, co znaczy ten poprawny program.

W twoim przypadku składnia powie ci, jakie są twoje prymitywy, jak je łączysz i jak je streszczasz. Semantyka powie ci, co oznaczają kombinacje i abstrakcje.

Na przykład składnia powie ci, jak napisać prawidłową forpętlę. Semantyka powie ci, co robi pętla for.

Jeśli naprawdę chcesz zacząć analizować język programowania, weź kopię standardu i zobacz, co tam jest. Zaczynam od prostego języka, takiego jak C, zanim zagłębię się w Javę. Przeczytałbym również resztę książki. Dowiedz się, dlaczego programowanie języków działa tak, jak one, uczyniło mnie lepszym programistą, mimo że nie implementuję kompilatorów.

mpdonadio
źródło
1
Czekaj, co? „Proste jak C przed zagłębieniem się w Javę.” Zgubiłeś mnie w „Simple like C”.
corsiKa
Matt, chyba tak naprawdę nie rozumiem, co robisz. Książka, którą zacytowałeś, mówi o obu tych rzeczach, niezależnie od tego, czy autorzy nazywają je składnią i semantyką, czy nie.
mpdonadio
W rzeczywistości „składnia” opisuje dokładnie „najprostsze” rzeczy w językach, z których zbudowane są atomy.
Ira Baxter,
Składnia nie oddaje w pełni tego, czym jest poprawny program, wręcz przeciwnie. Na przykład poprawny składniowo program może nie sprawdzać typu. Program AC, który wykonuje instrukcję, x = ++x;nie jest prawidłowy, nawet jeśli typowy kompilator ją zaakceptuje.
Gilles „SO- przestań być zły”
0

Nie wiem, czy to prawda, ale rozumiem podział w następujący sposób:

wyrażenia prymitywne , byłyby to takie rzeczy jak >>, +, *, /, int, boolean, zmienne, metody itp.

środki kombinacji, Może to być dyskusyjne, albo takie rzeczy jak + i concact, lub jego mówienie o bardziej zaawansowanych pomysłach, takich jak dziedziczenie vs kompozycja i metody, aby to zrobić. Wtrysk, nowy operator, przedłużanie itp.

sposoby abstrakcji, byłaby to składnia używana do nazywania zmiennych i metod, a także środki do tworzenia interfejsów, klas, klas statycznych, metod przeciążania itp.

Możliwe jednak, że musisz podać nam więcej informacji z książki, abyśmy dokładnie wiedzieli, co tam ma na myśli.

Kok
źródło
Książka jest darmowa online; link jest podany w PO. W pewnym sensie czułem to samo means of combination- że trudno jest zorientować się, co dokładnie tam należy. Ładna odpowiedź.
Czy wiesz jednak, które inne rozdziały mówi o kombinacjach i abstrakcjach?
Bob