Cześć,
chyba powoli pewną tradycją staje się zaczynanie wpisu od „dawno tu nie pisałem” – nie inaczej jest i dziś – no więc dawno tu nie pisałem, ale za to dziś wracam z bardzo ciekawym zagadnieniem a dokładniej z wprowadzeniem do pisania własnego języka programowania – czyli tego czym jest gramatyka języka, jak ją tworzyć i jak z niej generować takie „byty” jak parser i lekser.. I co to w ogóle jest ten parser i lekser:)
Zacznijmy od samego, samego, sameeeegooo początku.
Każdy kawałek kodu, dosłownie każdy, w ostatecznym momencie swojego wykonania jest pewną sekwencją 0 i 1 odpowiednio interpretowanych przez procesor. Tzn że pisząc w obojętnie jakim języku, paradygmacie czy framework’u – zawsze na sam koniec komputer dostaje ten ciąg 0 i 1. To jest kod maszynowy.
Wyżej mamy Assemblera – czyli język który operuje tylko na instrukcjach samego procesora i on będzie generował kod maszynowy.
Jeszcze wyżej są już kompilatory które muszą w wyniku wymyślonej przez siebie drogi – dojść do kodu maszynowego. Tak np. C/C++ działa na Assemblerze ale już Java kompiluje swój kod do kodu pośredniego i ten kod jest uruchamiany na maszynie wirtualnej Javy – i to ona zapewnia możliwość uruchomienia jej na dowolnej architekturze procesora. Rozwiązanie które wymyślili twórcy Javy mają jedną zaletę – przenośność kodu, bo np. jeśli skompilujesz program w języku C na procesorze 32bitowym to nie uruchomisz go na procesorze 64bitowym.
Istotną rzeczą którą napisałem wyżej jest wymyślonej przez siebie drogi – oznacza to że nikt nie zabroni nam napisać programu w np. Pythonie który będzie generował kod do Pythona i dopiero go uruchamiał:)
No więc wstęp mamy za sobą. W tym co napisałem wyżej jest pewien skrót myślowy który trzeba rozwinąć – a dokładniej nadal pokręcimy się w okół tej „drogi” którą przebiega program napisany w języku A do momentu dojścia do kodu maszynowego, no bo jak każdy wie, języki programowania narzucają nam pewną składnię pisania programów oraz odpowiednio ją interpretują. Opowiem więc skąd np. kompilator Javy wie że ma rzucić błąd składniowy jeśli nie postawimy średnika albo skąd wie że słowo „if” jednoznacznie implikuje instrukcję warunkową i wie że ma dalej oczekiwać jakiegoś wyrażenia.
No więc lecimy!
Wyobraź sobie kawałek kodu, np. w Pythonie:
1 2 3 4 | if 11>10: print("yes") else: print("no") |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | grammar python_if; expression : if_else ; if_else : 'if' SPACE bool_expression ':\n' generic_expression '\n' 'else:\n' generic_expression ; bool_expression : NUMBER '>' NUMBER ; generic_expression : SPACE 'print("' STRING '")' '\n'* ; NUMBER : [0-9]+ ; SPACE : ' '+ ; STRING : [a-zA-Z]+ ; |
1 2 3 4 | if a>10: print("yes") else: print("no") |
1 | line 1:3 mismatched input 'a' expecting NUMBER |
Oj daaawnoo mnie tu nie było. Ale wakacje to był czas dużej liczby intensywnych wyjazdów i tak naprawdę, dopiero jakoś… Read More
Cześć! Zapraszam na krótkie podsumowanie kwietnia. Wyjazd do Niemiec A dokładniej pod granicę z Francją. Chrześnica miała pierwszą komunię. Po… Read More
Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More
Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More