teraz gdzieś niżej wywołuję tą funkcję z parametrem np 5, teraz pytanie jak ona się wykona skoro bytecode definicji tej fcji zastał już zdjęty ze stosu?
Bytecode tej funkcji mógłby wyglądać np.tak (tutaj na podstawie mojego języka (patrz: stopka)):
foo:
{1} mul([-1], 10) // [-1] -> argument ze stosu oddalony o "1" element od aktualnego wskaźnika stosu; [0] to adres powrotu, a po nim występują kolejne argumenty funkcji; konwencja wywoływania cdecl
{2] push([-1])
{3] call(:print)
{4} sub(stp, 1) // stp - wskaźnik stosu
{5] ret()
Moja VM-ka jest połączeniem stosowej z rejestrową (a nie czysto stosowa, jak np. JVM), lecz i tak powinieneś zrozumieć ideę:
- mnożymy
x
przez 10 (po prostu mnożąc przekazany do naszej funkcji argument 10
)
- wrzucamy
x
na stos, by móc wywołać funkcję print
(przypominam: konwencja wywoływania to cdecl
)
- wywołujemy funkcję
print
- czyścimy po niej stos
- wracamy do miejsca wywołania naszej funkcji
foo
(w działaniu identyczne jak assemblerowe ret
)
Aby wywołać tę naszą funkcję, należałoby najpierw przekazać jej argument na stos, wywołać ją, a potem wyczyścić po niej stos, np.:
push(10) // wrzucamy liczbę całkowitą "10" na stos
call(:foo)
sub(stp, 1) // usuwamy liczbę "10" ze stosu
push(4) // wrzucamy liczbę całkowitą "4" na stos
call(:foo)
sub(stp, 1) // usuwamy liczbę "4" ze stosu
Wyświetliłoby po kolei liczby 100
oraz 40
(10*10=100
, 4*10=40
).
Wydaje mi się, że nie do końca rozumiesz ideę bytecode-u/opcodów - może najpierw zainteresuj się jakimiś kursami Assemblera (abyś poznał, jak to działa w przypadku x86 czy co tam sobie wybierzesz - wystarczą jakieś same podstawy), a dopiero potem zacznij myśleć o tworzeniu własnego języka, ponieważ o ile coś w stylu Brainfuck-like jest banalne do napisania (kiedyś nawet takie coś napisałem na rzecz konkursu na tym forum, zaledwie kilkaset linijek kodu afair), o tyle pisanie języka, który posiada (bardziej) zaawansowaną składnię (nie mówiąc o kompilowaniu do bajtkodu) jest czymś, co już wymaga pewnej wiedzy.
Co do analizy cięcie na słowa po delimiterach, może wyrażenia regularne, bo analiza po znaku nie wydaje mi się zbyt dobra chyba, że się mylę, jeśli tak to proszę o uświadomienie w błędzie.
Może przedstaw nam dokładniej, jak miałoby wyglądać to cięcie po separatorach lub wyrażenia regularne, bo jestem ciekaw, jak chciałbyś opisać w ten sposób składnię swojego języka...
Tak swoją drogą, wszystko i tak sprowadza się do analizy znak po znaku.
Co do tego to aż tak w temacie się nie zagłębiałem chciałbym napisać coś co działa i ma jakąś wartość użytkową
To nie jest "zagłębianie się aż tak", tylko podstawy...
Zresztą, przeczysz samemu sobie:
nie chciałem się aż tak zagłębiać w to
chciałbym napisać coś, co ma jakąś wartość użytkową