Stwórz swój własny język programowania (I)

Ewolucja języków programowania

Po napisaniu pierwszego artykułu na jak stworzyć własny system operacyjnyKtoś mi powiedział, czy mógłbym napisać artykuł jak stworzyć język programowania. Na początku nie zwróciłem uwagi, ale teraz i innymi sposobami dowiedziałem się znacznie więcej o tworzeniu języków programowania. Więc zróbmy podstawowy język programowania, łatwe do osadzenia w innych programach i współpracujące z maszyną wirtualną, którą również zaprojektujemy. Dziś musimy stworzyć najbardziej podstawową maszynę wirtualną.

Pewnie się zastanawiasz: Maszyna wirtualna? Ale czy nie jest to bardzo trudne i czy również spowalnia programy? ” W przeciwieństwie do tego prosta maszyna wirtualna jest bardzo prosta i stosunkowo szybka. wybrałem Rdza jako język dla maszyny wirtualnej. Ale co to jest Rdza?

Rdza Jest to język programowania, który koncentruje się na bezpieczeństwie wykonywania, więc jego użycie będzie praktycznie niemożliwe, aby ktoś zamknął maszynę wirtualną. Jest to język kompilowany w rozwoju stworzony przez Mozilla. Servo, substytut Gekonrozwija się w nim. Nadal możesz zmienić składnię, ale kod, którego będę używał, będzie przechowywany do pierwszej stabilnej wersji.

Rdza instaluje się w Linux W prosty sposób. Jednak nie ma oficjalnej paczki. Użytkownicy Ubuntu możesz dodać te dwa PPA: ppa: hansjorg / rust  y ppa: cmrx64 / ładunek, użytkownicy łuk można używać AUR (cargo-git to pakiet, który instaluje wszystko). Reszta może użyć:

curl -s https://static.rust-lang.org/rustup.sh | sudo sh

Jak działa maszyna wirtualna?

Jeśli wiesz, jak działa świat asemblera, jest dokładnie tak samo, ze stosem lub stosem. Jeśli nie, wyjaśnię ci to. Wyobraźmy sobie następujący kod:

wydrukować 2 + 3

Komputer nie rozumie, co oznacza 2 + 3, ani nie wie, w jakiej kolejności. Komputery pracują z bateriami lub stosami, w których gromadzone są i stale wydobywane dane. Ten kod w naszej maszynie wirtualnej powinien wyglądać mniej więcej tak:

PUSH 2 PUSH 3 ADD PRINT

Zasadniczo umieścilibyśmy 2 na stosie na górze, 3 również. ADD ściągnie (tj. Zdejmie go ze stosu i pobierze jego wartość) ostatnie 2 elementy ze stosu i doda wynik na wierzch stosu. PRINT wziąłby ostatni przedmiot ze stosu i użył go do wyświetlenia go nam. Zróbmy to teraz Rdza.

Najpierw musimy zdefiniować język dla Kod bajtowy, możemy użyć istniejącego, takiego jak ten w Java lub CLR .NET / Mono, ale zamierzamy stworzyć bardziej podstawowy.

https://gist.github.com/a01de8904fd39a442c20

Dla każdej instrukcji używamy notacji szesnastkowej. Wysoko postawiliśmy # [pochodzenie (FromPrimitive)], jest cechą charakterystyczną Rdza a później pomoże nam to bezpośrednio porównać wyliczenie z bajtami.

Teraz musimy stworzyć funkcję, która wykonuje każdą z tych instrukcji. W tym celu musimy odczytać bajt i porównać go z instrukcjami, które mamy w wyliczeniu. Jeśli znajdziesz takie, które istnieją, musisz wykonać swoje działanie.

https://gist.github.com/8950ce212a2de2f397f9

Robimy to, aby odczytać każdy bajt z osobna i wykonać je:

https://gist.github.com/12e24a1f0dd65e4cd65d

Jak widać, rozróżniamy, czy otrzymaliśmy wcześniej polecenie PUSH (nasze polecenie INTEGER), następny bajt zostanie całkowicie przeniesiony na stos. Tam używamy dwóch funkcji, których cię nie nauczyłem, self.pop () y self.push (), które są oczywiście odpowiedzialne za obsługę stosu.

https://gist.github.com/54147f853a8a2b8c01d9

Nie są one zbyt złożone, ale funkcja pop ma mechanizmy wykrywania błędów. W rzeczywistości w Rdza, jeśli usuniemy te mechanizmy, spowoduje to błąd kompilacji. Teraz musimy po prostu wywołać program peryń (nasza maszyna wirtualna) i wykonaj kod bajtowy.

https://gist.github.com/99b1ab461318b3a644d0

Ten kod bajtowy można odczytać z pliku, ale tutaj dla uproszczenia zapisałem go w zmiennej. Jeśli go wykonamy, da nam to oczekiwany efekt:

Perin v0.1 Perin VM wykonuje kod bajtowy FlopFlip Uruchamianie instancji PerinVM PerinVM v0.1.0 Wartość całkowita 5

Cały kod jest dostępny pod adresem GitHub pod Licencja Apache 2.0: https://github.com/AdrianArroyoCalle/perin. Aby je skompilować, muszą mieć Ładunek zainstalowany i włóż:

ładuj build && ./target/main

W następnym rozdziale dowiemy się więcej o naszym języku programowania.


Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: Miguel Ángel Gatón
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   drogowy powiedział

    Ciekawostka, choć w rzeczywistości mało przydatna, nie zaszkodzi wiedzieć.

    Świetnie, że reklamujesz Rust, jest to język, który wiele obiecuje, jest nie tylko bezpieczniejszy niż c ++, ale (na razie) jaśniejszy w swojej składni.

    Jeśli chodzi o zdjęcie, nie rozważałbym ewolucji java XD.

    1.    drogowy powiedział

      A z Fortran, nigdy go nie używałem, ale nie słyszałem o nim zbyt wiele ...

      1.    Straszny powiedział

        Tak, i jest to szczególnie przydatne w inżynierii, chociaż Python zyskuje na popularności.

      2.    John powiedział

        Fortran jest prawdopodobnie drugim świetnym językiem, obok C. Nadal dzisiaj w naprawdę krytycznych pytaniach będzie jedno lub drugie.

        I byłoby dyskusyjne, że Fortran jest „ewolucją” C, podczas gdy być może powinno być na odwrót, ponieważ C jest nowszy, bardziej nowoczesny i ma więcej możliwości; chociaż jeden nie jest w najmniejszym stopniu oderwany od drugiego.

        Chociaż ostateczne pozycje są z jakiegoś punktu widzenia dyskusyjne.

    2.    Francisco powiedział

      +1 do Javy

  2.   porter powiedział

    Zobaczmy, czy mi się to podoba, daję coś programowaniu, ale podstawowe, aby zobaczyć, czy rozumiem więcej.

  3.   użytkownikgruninux powiedział

    Jaki jest prawdziwy cel tworzenia nowego języka programowania? Osobiście wydaje mi się, że jest to sztuczka polegająca na ukryciu kodu źródłowego.

  4.   Yeilly powiedział

    Przyjacielu, co się stało z kontynuacją „własnego systemu operacyjnego”? Nie zostawiaj go tam, kontynuuj.

    Właściwie jesteś mistrzem i właśnie te dwie piosenki całkowicie przykuły moją uwagę, ale nie chciałbym, żeby zostały w połowie.

    Wiem, że wielu z nas myśli tak samo i czekamy na kontynuacje i wnioski z tych bardzo interesujących tematów.

  5.   Krystian Dawid powiedział

    Bardzo interesujące, bardzo dziękuję. 🙂

  6.   Szczery powiedział

    Nie uważam Javy za język programowania, a raczej za interpreter poleceń, ponieważ nie jest on kompilowalny

    1.    Mario powiedział

      [Język programowania to formalny język przeznaczony do wyrażania procesów, które mogą być wykonywane przez maszyny, takie jak komputery.]

      Z tego powodu Java jest językiem programowania. Nawet język Bash (język powłoki Linuksa) sam w sobie jest językiem programowania.

      Istnieją dwa rodzaje języków:
      - Skompilowano
      - zinterpretowany
      - Mieszane (maszyny wirtualne, natywne biblioteki są kompilowane, a kod funkcjonalny jest interpretowany)

      Tłumacze są bardzo przydatni, jeśli chodzi o multiplatformę i nie mają za to katastrofalnych wyników. Java, VB.NET, C ++ .NET, F #, C # to języki mieszane. Język bash, bat, PHP, Javascript i wiele innych to języki interpretowane.

      Jeśli nie uważasz Javy za język, ponieważ jest ona interpretowana (a tak nie jest), nie powinieneś brać pod uwagę wielu innych języków używanych do tworzenia programów. Co więcej, stosując zasadę trzech nie powinniście brać pod uwagę, że istnieje język programowania poza samym językiem maszynowym.

      A dlaczego nie? Nawet język maszynowy nie może być uważany za język, ponieważ jest to tak naprawdę zestaw poleceń „interpretowanych” przez procesor.

      Ponieważ w praktyce WSZYSTKIE języki to nic innego jak zestaw poleceń, które są interpretowane przez procesor.

      Możesz mniej lub bardziej polubić język (w tym przypadku Java), wydawać się mniej lub bardziej przydatny i potężny, ale powiedzenie, że nie jest to język programowania, ponieważ nie jest skompilowany… jest to sprzeczne ze wszystkimi definicjami języków programowania.

    2.    Mario powiedział

      😐 Mam nadzieję, że nie wydawałem się zbyt niegrzeczny

      1.    Maria Antonina z Manueli Cardenas powiedział

        bez ciszy, tylko zniszczyłeś nasze życie

      2.    Mario powiedział

        hahahahaha, perdoooon. to nie był mój zamiar xD

    3.    Carlos powiedział

      java to język programowania. Ponieważ możesz opracować aplikację, a podczas kompilacji tworzysz .jar, który jest interpretowany przez JVM. Następnie zgodnie z logiką Pythona nie jest on również interpretowany, ale kompiluje się do różnych plików wykonywalnych ...

  7.   Eliasz Mongelos powiedział

    Bardzo dobra informacja

  8.   Carlos Arturo powiedział

    dobra informacja, ale mam wątpliwości, będzie można stworzyć od podstaw nowy język programowania bez konieczności polegania na innych analogiach czy oprogramowaniu. Mówię w ten sam sposób, w jaki powstały inne języki, takie jak java czy HTML.
    Byłbym bardzo wdzięczny za pomoc w tej sprawie.