Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Jak napisać własny kompilator? Potrzebny poradnik od A do Z, jak to zrobić.

SalajF 06 Mar 2021 19:09 609 11
  • #1
    SalajF
    Level 7  
    Witam chciałbym napisać kompilator do własnego procesora zbudowanego w jednej grze. Czy zna ktoś jakiś poradnik jak coś takiego napisać? Może być w dowolnym języku:)

    PS. Uprzedzając pytania: ta gra to jest Minecraft
  • Helpful post
    #2
    kupieca
    Level 8  
    Cześć, Twoje pytanie jest zbyt szerokie aby na nie odpowiedzieć na nie w 1 zdaniu :D
    W zależności od złożoności procesora, jego wydajności, języka jaki chcesz kompilować, i docelowej wydajności kodu maszynowego, temat może się okazać bardzo prosty (ctrl+c/v) lub bardzo skomplikowany (miesiące jak nie lata pracy) :)

    Proponuję zacząć od zrozumienia ogólnej zasady jak działają / i co dokładnie robią kompilatory (poczynając od głupiej wiki https://pl.wikipedia.org/wiki/Kompilator#Przebieg_kompilacji), kolejnym etapem było by zrozumieć co się dzieje w poszczególnych krokach kompilacyjnych, wtedy przy odrobinie czasu będziesz mógł namalować coś na kolanie, na wiki jest trywialny przykład :}
  • #3
    SalajF
    Level 7  
    Mam raczej prosty processor z kilkoma instrukcjami czteroma rejestrami i 2 rodzajami skoków. I dodam że jakiś dobry w programowaniu to ja nie jestem:)
  • Helpful post
    #4
    kupieca
    Level 8  
    W takim razie polecam zrobić tak:
    Gdzieś na boku - np w zeszycie (poważnie) wymyśl najprostszą składnie "języka" jaki będziesz kompilować, lub weź jakiś stary turbo prosty język np basic :D

    Następnie napisz kilka instrukcji w języku np:
    Code: vbnet
    Log in, to see the code


    Code: vbnet
    Log in, to see the code


    Mając podstawowe instrukcje zastanów się jak powinien wyglądać odpowiadający im kod maszynowy (instrukcje procesora) :)

    Wtedy będziesz miał "wejście" jako Twój przykładowy kod i "wyjście" jako Twój kod maszynowy.
    Napisz w dowolnym języku programowania testy jednostkowe sprawdzające twoją "funkcje kompilującą" (tak nie mając jej jeszcze) czy podając "wejście" otrzymasz "wyjście" - nic trudnego dowolny tutek jak pisać testy jednostkowe w języku XYZ, wejście i wyjście możesz traktować jako głupie stringi na początku :)

    Na tym etapie wkraczasz powoli na podwórko elit programistów bo właśnie zaczynasz pisać własny kompilator wykorzystując techniki TDD (test driven development) :D

    Teraz mając kilka testów zacznij pisać "funkcję kompilującą" chociażby miała mieć 1000 lini i 500 if'ów dopóki wszystkie testy zapalą się na zielono - będzie ok :D

    Jak będziesz chciał dodawać nowe funkcje kompilatora w postaci nowej składni - po prostu najpierw napisz dodatkowy test, zawsze upewniaj się po zmianach że wszystkie testy są zielone :)

    Jak będzie wszystko działać, a przynajmniej "cokolwiek", i będziesz "czuć" że funkcja kompilująca staje się skomplikowana, będziesz mógł się zastanowić na wyczyszczeniem kodu (refaktoryzacją), optymalizacją i innymi drobnostkami :)
  • #5
    SalajF
    Level 7  
    Ile mi to zajmie?
  • Helpful post
    #6
    kupieca
    Level 8  
    Ciężko powiedzieć jeśli to ma być proof of concept to od kilku h do kilku dni, nie liczę czasu "straconego" na naukę programowania :}
    Miej tylko na uwadze że złożoność funkcji "kompilującej" może szybko rosnąć - w zależności od wspieranej składni języka do operacji procesora.
    Jeśli myślisz o pełnym kompilatorze z sensownego języka do sensownego procesora z optymalizacją kodu .. to już never ending story :)
  • #7
    SalajF
    Level 7  
    Dzięki ale się rozmyślam bo jak mówisz że to zajmuje to ja już wolę w maszynowym pisać:)
  • #8
    kupieca
    Level 8  
    Jeśli robisz to 4fun i nie zamierzasz dzielić się tym na internecie - bardziej bym się kierował w stronę dobrego edytora tekstu i kolorowania składni :D
  • #9
    JacekCz
    Level 39  
    SalajF wrote:
    Ile mi to zajmie?


    wieki, a bardziej konkretnie, to nie skończysz tego.

    Brałem się za "naiwne" napisanie kompilatora, całkiem sprawny w programowaniu student, jak nie miałem podstaw teoretycznych (i za mało znałem języków, btw użyłem najmniej przydatnego do tego Fortana) , po pół roku prób i błędów jedno wielkie nic.

    Rok później , jak liznąłem pierwsze zajęcia z translatorów (semestr ciągle trwał) napisałem z sukcesem w 2 tygodnie, potem rozbudowałem o platformę wizualną, bajery, debugger itd.

    jest to rodzaj projektu, który jest uwarunkowany podstawami teoretycznymi, przynajmniej bazowymi.
    Są książki o translatorach itd (nie licz na "filmiki na YT") - jak się chcesz w to angażować, nie ominiesz edukacji

    PS. a minecraft to nie ma języka Lua ?
    O grach nie wiem nic, mogą dla mnie nie istnieć, ale Lua to fajny język w swojej klasie. Może tam się zaangażuj?
  • #10
    SalajF
    Level 7  
    Chodzi tu o to że ja w Minecraftcie zbudowałem processor, ma on tylko kilka instrukcji więc nie zajmie myślę mi to zbyt długo. A Minecraft jest napisany w Javie.
  • #11
    JacekCz
    Level 39  
    napisany w Javie, ale dla celów rozszerzania udostępnia Lua. Mylę się?
  • #12
    SalajF
    Level 7  
    Z tego co wiem to nie ale dodam tylko że ten CPU który zbódowałem jest w Minecrafcie a nie że jakiś mod do Mc