Języki i gramatyki

Pamiętam gdy jako dziecko, bardzo interesowały mnie języki w ogólnym pojęciu. Ich sposób powstawania i późniejszej ewolucji. W wieku około siedmiu lat zacząłem uczyć się sztucznie powstałego języka – esperanto.

Esperanto stworzony został pod koniec XIX wieku, jako język wspólny dla wszystkich narodów, mający ułatwić komunikację. Został Znalezione obrazy dla zapytania esperantozaprojektowany tak, żeby był bardzo łatwy w nauce, w znacznym stopniu bazuje na języku hiszpańskim. Zainspirowany esperanto zamarzyłem o tym by stworzyć własny język, jednak bardzo szybko okazało się to nie lada trudnością. Wymyślenie nowego słownictwa, a szczególnie pełne opisanie reguł gramatyki okazało się poza moim zasięgiem.

Tym smutnym akcentem mogłaby zakończyć się historia o próbie stworzenia nowej mowy, gdyby nie to, że w gimnazjum zapisałem się na kółko informatyczne. Programowanie na tyle mi się spodobało, że wkrótce później uczyłem się już C++ i Java. Koniec końców wylądowałem na studiach informatycznych gdzie obecnie uczę się przedmiotu Metody Programowania.

Ale jaki ma to związek z historią? Otóż okazuje się, że języki programowania mają wiele wspólnego z naturalnymi językami, są natomiast dużo prostsze w definiowaniu. Tak! Można stworzyć własny język programowania, i wcale nie jest to takie trudne! Wystarczy umiejętność programowania i trochę wiedzy o konstruowaniu i przetwarzaniu takiego języka.

 

Składnia

Na początku musimy zdefiniować jaką składnię będzie miał nasz język, czyli to według jakich reguł można budować zdania i jakie słowa w nim istnieją. Gramatyka musi jednoznacznie określać jakie wyrażenie jest poprawne. W dużym uproszczeniu możemy o niej myśleć jako zbiorze reguł wyprowadzania zdań.

 

Program -> Zdanie. Program

Program -> e (e oznacza słowo puste)

 

Na przykład powyższa reguła definiuje czym jest program. Jest to Zdanie, znak kropki i program, lub słowo puste. Jak widać jest to rekurencyjna definicja, zatem program może mieć dowolną liczbę zdań, aż zakończy się słowem pustym.

Teraz należałoby zdefiniować czym jest zdanie:

Zdanie -> Podmiot Orzeczenie

Ta reguła mówi, że zdanie składa się z podmiotu i orzeczenia oddzielonych spacją.

Podmiot -> On

Podmiot -> Pies

Podmiot -> Pan

Orzeczenie -> chodzi

Orzeczenie -> biega

Orzeczenie -> czyta

Mamy brakujące definicje Podmiotu i Orzeczenia. (on, pies, pan, chodzi, biega, czyta to tzw. symbole terminalne, z których już nic nie można wyprowadzić)

Co można powiedzieć w tym języku? Np. programem mógłby być ciąg zdań:

On chodzi. Pies czyta. Pan chodzi. Pies biega.

 

W typowych językach programowania wyrażenia wyglądają nieco inaczej, dlatego napiszę jak na przykład mogłaby wyglądać produkcja wyrażenia warunkowego if:

Wyrażenie warunkowe -> if( Wyrażenie logiczne ) { Wyrażenie }

 

Reguły wyprowadzania w gramatyce formalnej mogą przypominać rozkład zdania na części zdania – pamiętany jeszcze ze szkoły podstawowej.

Mamy zatem zdefiniowaną prostą gramatykę, w której możemy ułożyć pewne zdania, ale póki co nie mają one dla nas za bardzo sensu.

 

SemantykaZnalezione obrazy dla zapytania parser

Aby nadać naszemu językowi sens musimy określić jego semantykę, czyli znaczenie jakie mają poszczególne wyrażenia. Żeby lepiej zrozumieć problem, popatrzmy na poniższy program zapisany w typowej dla C składni.

 

if (true) return 1; else return 0;

 

Widzimy, że powyższy program jest poprawny składniowo, czyli spełnia reguły naszej gramatyki, ale jaki niesie on ze sobą naprawdę sens? Z łatwością widzimy, że program zwróci liczbę 1, jednak reguły interpretowania takich wyrażeń, również musimy jakoś formalnie określić.

Opis tego można zadać przez tak zwaną semantykę naturalną dużych kroków. Jednak jest to już bardziej skomplikowane dlatego pominę to w tym wpisie.

 

Powiedzmy, że mamy już w pełni zdefiniowany formalnie język, co teraz zrobić żeby zaczął on naprawdę działać? Wystarczy, że napiszemy do niego parser i interpreter. Parser to program zamieniający ciąg znaków napisany w naszym nowym języku na tekst bardziej przyjazny dla komputera. Interpreter z kolei będzie analizował ten tekst i jednocześnie wykonywał nasz program. Parser i interpreter możemy napisać w dowolnym innym języku programowania.

Znalezione obrazy dla zapytania shakespeare

 

Jako ciekawostkę dodam, że nasz język nie musi wcale wyglądać jak “typowy” język programowania. Istnieje na przykład język Shakespeare (https://pl.wikipedia.org/wiki/Shakespeare_(j%C4%99zyk_programowania)) budową przypominający bardziej zapis dramatu Williama Shakespeara. Zatem przy tworzeniu języka programowania jest naprawdę spore pole do kreatywności.

Jan S

Jan Sierpina

Programista back-end, zainteresowany informatyką jako nauką - algorytmiką, AI. Gracz szachów i bilarda.

Like
Like Love Haha Wow Sad Angry

4 Replies to “Języki i gramatyki”

  1. Napisałem prosty generator Twojego języka. Gratulacje Jan! 😛
    https://jsfiddle.net/akselon/z40tuhrf/

  2. Może stworzymy nowy język “Irys” 🙂

  3. Jest też ciekawy język BeFunge. Programy w nim, w odróżnieniu od większości języków programowania, są zorganizowane w dwuwymiarowej tablicy. Instrukcje “strzałkowe” ( ^ v ) powodują przeniesienia sterowania, a pętle są tworzone poprzez zorganizowanie sterowania “w kółko”

Dodaj komentarz