Co kryje się za językiem programowaia

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
Zakres posta

Zastanawialiście się kiedyś języki programowania są takie, a nie inne i co się kryje pod tym?

Notka zawiera informacje z pogranicza lingwistyki i teorii języków programowania, z naciskiem podziału na leksykę, syntaktykę i semantykę. Oryginał jest tutaj. Tekst ma charakter stricte teoretyczny, powstał, gdyż takich materiałów w sieci jest mało, mimo rangi tematu. Zarówno obszerność zagadnienia, jak i to, że zmierzyłem się z nim po raz pierwszy, sprawiają, iż wiele spraw potraktowanych zostało pobieżnie lub przemilczane.

Lingwistyka jest prawdopodobnie istotą, wokół której w akademickim królestwie trwają największe spory. Jest przesiąknięta krwią poetów, teologów, filozofów, filologów, psychologów, biologów, antropologów i neurologów , razem z ich krwią czerpana jest również krew gramatyków.
Russ Rymer.[/b]

Język, język programowania, kompilacja, kompilator

Zacznijmy od tego, czym jest język. Mówiąc w skrócie
jest to zbiór symboli niosących ze sobą informacje połączonych w grupy uporządkowane według pewnej logiki, charakterystycznej dla danego języka. Przy użyciu tych reguł i symboli możliwe jest konstruowanie nowych symboli, które są zrozumiałe nie tylko dla nadawcy ale i dla odbiorców.

Znajomość języka i to, że mamy coś do powiedzenia pozwala nam wyrażać się w
sposób zrozumiały dla każdego, kto spełnia ten warunek, iż zna
symbole oraz gramatykę, których używamy. Jeżeli ten warunek nie jest spełniony
konieczna jest translacja naszego języka do języka, który zna odbiorca.

Komputer, czy też maszyna wirtualna potrafi wykonywać kod swojego asemblera,
tutaj wyrazami, symbolami są instrukcje, liczby, łańcuchy znaków, a gramatyką
sposób ich użycia.
Język ten jest taki, a nie inny z konieczności kompromisu, między wygodą
programisty a implementacją i parametrami (poziom niżej jest już tylko
elektronika).

Dla nas, ludzi taki język, chodź dzięki nauce zrozumiały
często okazuje się nieadekwatny do problemów, których rozwiązania mamy wyrazić
przy jego użyciu. Dzieje się tak głównie dlatego, iż problemy te dotyczą świata
rzeczywistego, niosą ze sobą zatem dozę abstrakcji, abstrakcji, której wyrażenie
ten język
mocno ogranicza.

Rozwiązaniem jest wyrażenie się w innym, bliższym człowiekowi języku, a
następnie dokonanie
tłumaczenia do języka, który potrafi zrozumieć maszyna. W idealnym świecie
mogli byśmy wyrazić się w języku, w którym komunikujemy się z innymi ludźmi,
jednak nie umiemy tego urzeczywistnić.

Koniecznością staje się obranie nowego języka, będącego kompromisem między
człowiekiem, a komputerem, jest to właśnie język programowania. Kompilacją
nazywamy akt tłumaczenia go do postaci, którą rozumie maszyna, zaś narzędzie
które tego dokonuje nazywamy kompilatorem.

Języki programowania nalezą do grupy języków formalnych, które w przeciwieństwie do ęzyka naturalnego (używanego w komunikacji człowiek-człowiek) jest tworem matematycznym.

Leksyka, analiza leksykalna
Jak wspomniano we wstępie, leksyka (grec. leksikón – słownik), to zbiór symboli, które należą do
języka. Leksykę możemy postrzegać też jako zbiór reguł stwierdzających, czy
dany symbol należy do języka.

W większości języków każdy symbol można przyporządkować do jednej z pośród
kilku
klas. Przykładowo w języku polskim każdy wyraz przyporządkować możemy do
rzeczowników, czasowników etc. Z językiem programowania jest podobnie, symbol
możemy przyporządkować do grupy liczb naturalnych, łańcuchów znaków, czy też
słów kluczowych. Klasa do której należy symbol jest ważną informacją, przekonamy się
o tym w drugiej części notki.

Zauważmy, iż myśl wyrażona w języku jest strumieniem symboli. Analiza
leksykalna jest aktem
wyodrębnienia z tego strumienia wszystkich symboli, dokonywana jest symbol, za
symbolem, od początku strumienia, do końca. Poniżej znajduje się przykład obrazujący analizę programu w C (wnętrzności NASM'a).

Kod:
wejście:

        op1 = (c & 3) + ((opex & 1) >> 2);

wyjście:
op1     | zmienna
=       | słowo kluczowe 
(       | słowo kluczowe
c       | zmienna
&       | słowo kluczowe
3       | liczba
)       | słowo kluczowe
+       | słowo kluczowe
(       | słowo kluczowe
(       | słowo kluczowe
opex    | liczba
&       | słowo kluczowe
1       | liczba
)       | słowo kluczowe
>>      | słowo kluczowe
2       | liczba
)       | słowo kluczowe
;       | słowo kluczowe

Syntaktyka, analiza syntaktyczna
Domeną syntaktyki (gr. syntaktikós - porządkujący), zwanej też składnią jest m.in. określenie szyku symboli w wypowiedzi (zdaniu, w kontekście języka programowania instrukcji). Przykładowo instrukcję if w C zapiszemy w sposób:
Kod:
if ( warunek ) instrukcja

Składnia określa nam, w jaki sposób mamy zapisać symbole by uzyskać poprawną wypowiedz.

Analiza składniowa następuje po analizie leksykalnej, jej efektem jest -będące ważnym etapem kompilacji- drzewo składniowe. Poniżej przedstawione jest drzewo składniowe dla przykładu z paragrafu o leksyce.</p>
tree.png

Jest to drzewo ukorzenione, mówiąc w skrócie liśćmi są dane, pozostałymi wierzchołkami są akcje.

Składnia jest częścią gramatyki, podobnie jak (nieistotne w kontekście języka programowania) fonologia oraz morfologia.

Semantyka, analiza semantyczna
Symbole uporządkowane według reguł składni niosą ze sobą treść, badaniem zależności między ich treścią znaczeniem zajmuje się semantyka (gr. semantikós - oznaczający).

Gramatyka formalna
Gramatyka formalna służy do opisu języka formalnego (jak wspomnieliśmy, do tej grupy zaliczają się też języki programowania). Gramatyka taka składa się z (za Wikipedią):
* symboli terminalnych
* zbioru symboli nieterminalnych
* symbolu startowego
* zbiór reguł które określają sposób w jaki wyprowadzamy słowa

Dla przykładu poniżej znajduje się gramatyka dla języka potrafiącego dodawać
liczby naturalne mniejsze do 10.

Kod:
lista -> lista + liczba
lista -> liczba
liczba -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Gramatyki dzielą się na cztery grupy, zgodnie z hierarchią Chomsky'ego, co obrazuje poniższa lista:
* regularne,
* bezkontekstowe,
* kontekstowe,
* rekurencyjnie przeliczalne.

TODO przykład + opis gramatyki bezkontekstowej.

Podsumowanie
Język programowania może być rozpatrywany w kategoriach lingwistyki. IMHO zrozumienie tego podejścia jest ważne, pozwala lepiej poznać możliwości narzędzia, którym jest język programowania.

Bibliografia
* Aho, Sethi, Ullman, Compilers: principles, techniques, and tools; ISBN 7-115-09916-2
 
Do góry Bottom