Jak vytvořit vlastní debugger?

Re:Jak vytvořit vlastní debugger?
« Odpověď #15 kdy: 03. 11. 2019, 22:13:23 »
Pánové děkuji za uvedení mého kategorického odsudku na pravou míru. Pokud ten interpreter zná eval(), a nebrání tomu nějaká další omezení, příležitost k partyzánské činnosti existuje :-)


PanVP

Re:Jak vytvořit vlastní debugger?
« Odpověď #16 kdy: 03. 11. 2019, 22:22:16 »
než si napsat vlastní. Není to tak složité, jak to vypadá. Pár desítek či stovek řádek se dá napsat třeba i za hodinu.

Ano, psal. Ono to není nic složitého, implementovat parser a interpretaci je primitivní

Nejprve: Parser není problém, data si stejně musím umět nejprve rozparsovat ručně, parser neřešme.

Velmi zajímavé! Jak byste na to šli?
Vytvořením virtuálního procesoru?
Pokud zkusím připravit virtuální procesor, znamená to, se postarat i o správu paměti.

Příklad, kdybych si chtěl napsat vlastní interpret "BASICU", resp. ten jazyk by se dal nazvat dialektem BASICu, ale chci používat velmi specifické vlastnosti, které nemají odpovídající paradigma (funkcionální, procedurální...atd).

Tak třeba primitivní: Print "Blah Blah",$F
To ovšem vyžaduje mít někde uloženou proměnnou F$, čili potřebuji spravovat paměť.

Opět primitivní: FOR $X=1 TO 100
V zásadě si potřebuji někde držet proměnnou X, resp. informace o ní, protože potřebuji typovou bezpečnost (což není u BASICU běžné, ale...)
To opět není problém....

Hm....
Jinými slovy,díky typové bezpečnosti, tj. každá proměnná musí být předem definovaná, se nemusím za chodu starat o přidělování paměti.

Tedy v zásadě je zbytečné emulovat funkce procesoru.
Spíš jít cestou, kdy emulovaná instrukce vyvolá odpovídající instrukci nativního jazyka.
Fakticky se tak musím starat jen o přidělení adres proměnných a posílání těchto proměnných do odpovídajících funkcí  ::)

Nebo se na to dívám špatně?

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak vytvořit vlastní debugger?
« Odpověď #17 kdy: 03. 11. 2019, 22:58:34 »
než si napsat vlastní. Není to tak složité, jak to vypadá. Pár desítek či stovek řádek se dá napsat třeba i za hodinu.

Ano, psal. Ono to není nic složitého, implementovat parser a interpretaci je primitivní

Nejprve: Parser není problém, data si stejně musím umět nejprve rozparsovat ručně, parser neřešme.

Velmi zajímavé! Jak byste na to šli?
Vytvořením virtuálního procesoru?
Pokud zkusím připravit virtuální procesor, znamená to, se postarat i o správu paměti.

Příklad, kdybych si chtěl napsat vlastní interpret "BASICU", resp. ten jazyk by se dal nazvat dialektem BASICu, ale chci používat velmi specifické vlastnosti, které nemají odpovídající paradigma (funkcionální, procedurální...atd).

Tak třeba primitivní: Print "Blah Blah",$F
To ovšem vyžaduje mít někde uloženou proměnnou F$, čili potřebuji spravovat paměť.

Opět primitivní: FOR $X=1 TO 100
V zásadě si potřebuji někde držet proměnnou X, resp. informace o ní, protože potřebuji typovou bezpečnost (což není u BASICU běžné, ale...)
To opět není problém....

Hm....
Jinými slovy,díky typové bezpečnosti, tj. každá proměnná musí být předem definovaná, se nemusím za chodu starat o přidělování paměti.

Tedy v zásadě je zbytečné emulovat funkce procesoru.
Spíš jít cestou, kdy emulovaná instrukce vyvolá odpovídající instrukci nativního jazyka.
Fakticky se tak musím starat jen o přidělení adres proměnných a posílání těchto proměnných do odpovídajících funkcí  ::)

Nebo se na to dívám špatně?
Jakmile parser (třeba LR) vytvoří AST, stačí jej interpretovat procházením. Proměnné se drží v kontextu, v nejjednodušším případě to je asociativní pole, akorát pozor na shadowing.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Jak vytvořit vlastní debugger?
« Odpověď #18 kdy: 03. 11. 2019, 23:05:32 »
Velmi zajímavé! Jak byste na to šli?

Upřímně, já jsem na to šel cestou transpileru. Vezmu zdroják, zpracuju do tokenů, a pak ho vybuldím do cílové platformy. Osobně se domnívám, že v době Lui prostě nemá smysl dělat vlastní interpret. Jako bonus pak mám možnost buildit do javascriptu pro potřeby webu. Získaný čas a energii soustředím na blbosti kolem (typy, knihovny, ...).

Pokud opravdu to musí být čistokrevný interpret, co třeba toto?

Proměnné nejsou problém. To si prostě na to vytvoříš objekt řešící scope, uchovávající lokální proměnné (v případě neexistence dohledáváš v nadřazeném, etc). Mnohem větší pruda speciální formy IF, FOR, WHILE...

K seznámením s problématikou extrémně doporučuji přečíst toto. Dozvíš se i co nechceš. Ale popisujou tam všechny podrazy (interpretu).

Ale stejně bych šel spíš do transpileru :-)

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Jak vytvořit vlastní debugger?
« Odpověď #19 kdy: 03. 11. 2019, 23:31:53 »
Velmi zajímavé! Jak byste na to šli?
Vytvořením virtuálního procesoru?
Pokud zkusím připravit virtuální procesor, znamená to, se postarat i o správu paměti.

Příklad, kdybych si chtěl napsat vlastní interpret "BASICU", resp. ten jazyk by se dal nazvat dialektem BASICu, ale chci používat velmi specifické vlastnosti, které nemají odpovídající paradigma (funkcionální, procedurální...atd).

Především se zbav potřeby univerzálního jazyka. Na to je dostatek interpretů, ze kterých si vybereš, dopíšeš pár knihoven nebo si uděláš framework a jedeš.

Pak jsou ještě doménově specifické jazyky, které jsou mnohem jednodušší a takový interpret splácáš za chvíli. Přečteš řádek a podle prvního slova vyhodnotíš, co s tím zbytkem uděláš a jak změníš stav. Můžeš to udělat jako Moorův nebo Mealyho automat. Cykly neřešíš, o správu paměti se postará hostitelský jazyk, ve kterém si uděláš asociativní pole (slovník).

Taková blbinka se dá slepit třeba v AWK na pěti řádcích, ale můžeš si vybrat takový jazyk, který ti pro daný účel vyhoví nejlépe.


Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Jak vytvořit vlastní debugger?
« Odpověď #20 kdy: 03. 11. 2019, 23:39:47 »
Proměnné nejsou problém. To si prostě na to vytvoříš objekt řešící scope, uchovávající lokální proměnné (v případě neexistence dohledáváš v nadřazeném, etc). Mnohem větší pruda speciální formy IF, FOR, WHILE...

Přesně. Rozhodování, skoky, cykly, podprogramy, funkce. Pokud bych měl něco takového dělat v míře větší než malé, použiji hotový jazyk, ke kterému jen napíši nějaký doplněk. Jinak riskuji, že mi to bude trvat zbytečně dlouho a stejně ten výsledek nebude odpovídat vynaloženému úsilí.

Re:Jak vytvořit vlastní debugger?
« Odpověď #21 kdy: 04. 11. 2019, 11:35:50 »
a) Jednoduchy parser mam zvladnuty. Kvoli inemu problemu a to ze nekontroluje syntax external funkcii. Tak jsem si udelal parser ktery to odkontroluje v celem projektu.

b) Moje myslenka je ze udalam jednoduchy injektor. Tedy za kazdy prikaz dam volani me funkce ktera bude cist nejaky TXT soubor ve kterem bude mit prikazy. Jako vycti obsah, promennych, pokracuj na dalsi breakpoint, udelej jeden krok. V Editoru by jsem zobrazoval kod neinjektovany.