Projekt kompilatora dla programistów G

Feb 18 2023
Budowa graficznego kompilatora języka programowania w języku G
Uwaga autora: Ostatnio, w środku próby wrogiego przejęcia NI przez firmę Emerson, wielu członków społeczności LabVIEW jest szczególnie zainteresowanych przyszłością programowania graficznego i tym, co trzeba zrobić, aby zbudować przyszłość, jaką chcielibyśmy ujrzeć dla naszego języka programowania i wspólnota. Ostatnio zastanawiałem się nad bardzo ciekawym pytaniem.

Uwaga autora: Ostatnio, w środku próby wrogiego przejęcia NI przez firmę Emerson , wielu członków społeczności LabVIEW jest szczególnie zainteresowanych przyszłością programowania graficznego i tym, co trzeba zrobić, aby zbudować przyszłość, którą chcielibyśmy ujrzeć dla naszego języka programowania i wspólnota.

Ostatnio zastanawiałem się nad bardzo ciekawym pytaniem.

To nie jest nowe pytanie. Jest to jednak dość skomplikowane i wymagające myślenia (którego nikt jeszcze nie rozwiązał).

pytanie brzmi:

Czy byłoby możliwe stworzenie kompilatora dla graficznego języka programowania przy użyciu tego samego graficznego języka programowania?

Rysowanie rąk autorstwa MC Eschera

Zakładając, że możliwe jest nawet stworzenie kompilatora G napisanego w G, jak by to wyglądało? Od czego byśmy w ogóle zaczęli?

Aby odpowiedzieć na to pytanie, przyjrzyjmy się najpierw, w jaki sposób projektanci (tekstowych) języków programowania i inżynierowie kompilatorów tworzą takie nowe narzędzia — ludzie w biznesie nazywają to „inżynierią kompilatorów” .

Zabawny (i raczej pięknie zaskakujący) sposób myślenia o procesie budowania kompilatorów jest następujący:

Inżynieria kompilatorów to sztuka tworzenia narzędzi programowych, które są w stanie zbudować się na podstawie zestawu instrukcji.

Aby zrozumieć, jak to możliwe, spójrzmy na świat fizyczny i narzędzia, takie jak te, które można znaleźć w skrzynce narzędziowej lub, w przypadku tego przykładu, w warsztacie mechanicznym…

Pamiętam (podczas mojego szkolenia BHP) główny mechanik powiedział mi:

Mając tylko frez i tokarkę, możesz zbudować wszystkie inne obrabiarki i części potrzebne do zbudowania kolejnego frezarki i tokarki.

To naprawdę mnie zachwyciło… z zestawem rysunków mechanicznych (instrukcji) zdolny mechanik mógłby przerobić kawałek metalu na nowe narzędzia i części, które można wykorzystać do budowy coraz lepszych narzędzi.

Fajne jest też to, że dotyczy to budowania kompilatorów oprogramowania.

Zdjęcie Daniela Svena na Unsplash

Obecnie obrabiarki są często zautomatyzowane i wykorzystują cyfrowe instrukcje i specyfikacje dotyczące sposobu wykonania części. Mamy nawet maszyny w naszych domach i biurach, które mogą drukować części z plastiku (i metalu, jeśli masz pieniądze)

Zdjęcie ZMorph All-in-One 3D Printers na Unsplash

Pod wieloma względami te zaawansowane maszyny, które budują maszynę, przypominają kompilatory:

Tak jak obrabiarka lub drukarka 3D wykorzystuje cyfrowe specyfikacje do przekształcenia kawałka metalu lub plastikowej szpuli w użyteczne narzędzie lub część, tak kompilator oprogramowania pobiera kod źródłowy i przekształca go w program wykonywalny.

W obu tych przypadkach — maszyn do budowy maszyn i oprogramowania do tworzenia oprogramowania — pojawia się pytanie jak kura i jajko:

Skąd się wzięły pierwsze maszyny budujące maszyny?

Odpowiedź jest taka sama jak skąd się wzięły kury i jajka …

Dinozaury!

(lub przynajmniej starsze wersje kurczaków i jaj kurzych)

Zdjęcie Niclasa Dehmela na Unsplash

W każdym przypadku (obrabiarki, kompilatory i jaja nieuchwytnego Roostasaurus rex) mniej wyrafinowane wersje tych kreacji były stopniowo ulepszane i były wytwarzane (lub po prostu ewoluowały) w miarę upływu czasu, w coraz bardziej wyrafinowane wersje samych siebie.

A ponieważ analogia z kurczakiem zaczyna zawodzić (gdzie są te wszystkie wyrafinowane kurczaki?)…

Porozmawiajmy o kompilatorach!

Budowanie kompilatora w 3 prostych krokach (i 2 bardzo trudnych)

OK, przejdźmy do sedna tego wszystkiego. Porozmawiajmy o tym, co jest potrzebne do zbudowania kompilatora dla nowego języka programowania (który nie ma jeszcze kompilatorów).

Krok 1. Napisz kompilator w innym języku

Ponieważ nie masz jeszcze kompilatora dla swojego nowego języka, musisz napisać kompilator w innym języku.

Prawdopodobnie będziesz musiał użyć języka niższego poziomu, takiego jak C, Rust (jeśli jesteś fajny jak dat ), a nawet asemblera (jeśli lubisz cierpieć)!

Kiedy skończysz z tym…

Hurra, masz działający kompilator dla swojego nowego języka! :)

Zdjęcie Adriana Blondella na Unsplash

Ale… nie jest napisany w twoim nowym języku programowania :/

Już…

Krok 2. Ponownie napisz kompilator w swoim nowym języku

Teraz, gdy masz już kompilator dla swojego języka (patrz krok 1), wszystko, czego potrzebujesz, to przepisać kompilator w nowym języku!

Nie martw się, poczekam tutaj, aż skończysz…

Zdjęcie autorstwa Cerqueiry na Unsplash

Jesteś skończony? Świetnie!

Teraz jesteś gotowy do skompilowania swojego wymyślnego nowego kompilatora napisanego w twoim wymyślnym nowym języku przy użyciu mniej wymyślnego kompilatora (np. napisanego w C).

Krok 3. Ponownie skompiluj swój kompilator (napisany w nowym języku) przy użyciu nowego kompilatora!

Ok, właśnie skończyłeś przepisywać swój kompilator w nowym języku.

Następnie używasz swojego starego kompilatora do skompilowania tego nowego.

Teraz masz nowy samokompilujący się kompilator i jesteś gotowy do świętowania!

Ale…

Nie zaczynaj jeszcze imprezować.

Jeśli twój kompilator ma błędy, prawdopodobnie właśnie zbudowałeś kompilator z błędami, który buduje kompilatory z jeszcze większymi błędami.

frajer zajmujący się drukiem 3D => timelapse kupy z drukowania 3D

Jednak przy dużej wytrwałości i szczęściu (i powtarzaniu/poprawianiu kroków 1–4 tyle razy, ile to konieczne), w końcu masz niezawodny kompilator, który może się skompilować!

Krok 5. Ciesz się samokompilującym się kompilatorem nowego języka!

Powiedz swoim przyjaciołom i zmień niektóre umysły swoimi binarnymi umiejętnościami gimnastycznymi!

(Widzisz, mówiłem ci, że będą łatwe kroki)

samoorganizujące się roboty

Następne: projektowanie graficznego kompilatora języka programowania przepływu danych

Bądź na bieżąco. W kolejnej odsłonie tej serii omówię kompilowanie i uruchamianie graficznego języka programowania przepływu danych. Ja też nie jestem w tym ekspertem, więc jeśli masz pomysły lub chcesz wziąć udział w dyskusji, nie wahaj się skomentować lub skontaktować się ze mną. łatwo mnie znaleźć :)