Skocz do zawartości

Slap


Compi

Rekomendowane odpowiedzi

Tytuł: Slap

 

Gatunek: Kompilator/Interpreter do wirtualnej maszyny DM+

 

Opis: Zagłębiając się w asemblera, dla treningu stworzyłem sobie interpretowalny język, składnią przypominający pascala i pythonga. Wyewoulował z interpretera wirtualnej maszyny. Pracuje nad wsparciem dla klas i wizualnych komponentów.

Slap jest w stanie tworzyć "samostojące" pliki exe dla Windowsa. Pracuję także nad rozbudowaniem standardowej biblioteki o lepsze i ciekawsze funkcje. Zastosowanie? Myślę, że każdy znajdzie tu coś dla siebie. Ciekawostką jest to, że antywirusy nie przeszkodzą nam w niczym.

 

Zagnieżdżanie i wywoływanie procedur działa. Chciałbym dodać rekurencje i wywoływanie zmiennych jako funkcji.

Pracuje także nad helpem, bo moim zdaniem sam język i jego możliwości są dosyć ciekawe i obiecujące.

Myślę, że za niedługo dodam implementacje języka, bo póki co, nadal się zmienia.

@EDIT

Tak więc przez ten czas, leniwie po nocach opracowałem składnie, którą powinien mieć język wysokiego poziomu.

Oczywiście, jest to Turing Tarpit, czyli język jest zupełny w sensie Turinga.

Kod można sobie spokojnie zagnieżdżać, nie ma z tym problemu.

 

Co się zmieniło?

DM+ stał się maszyną wirtualną, a Slap to translator do komend niższego poziomu.

Dodałem też tablice, na razie jednopoziomowe, ale myślę, że nie będzie problemu je rozszerzyć.

Slap jest w stanie obliczać złożone równania matematyczne, np:

 

GML
log(beer^2*3/4*4+1-1.92*beer));

Gdzie beer to zmienna liczbowa.

 

Buduje bibliotekę standardową, i dll w którym nie funkcję natywne nie chcą się wywoływać przez stdcall

 

Paradygmaty:

-Proceduralny

-Strukturalny

-Obiektowy

-Imperatywny

Post edytowany: 31.12.12

 

 

 

Download: Pobierz mię!

Rozmiar pliku: 1 Mb

 

av.png

slapslap.png

Przykładowy program:

GML
%import standard%

def (silnia);

var silnia

var step

var formula

formula:=n

repeat

n-1

step:=n

formula (formula*step);

silnia:=formula

while ( n > 2 )

return

 

//Program liczący silnie. Przykład SLAP

def (entry);

call initconsole(Silnia,);

var n

call writeconsole(Podaj liczbe: ,);

call readln();

n:=readln

call silnia();

call writeconsole(silnia,);

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 69
  • Dodano
  • Ostatniej odpowiedzi

Top użytkownicy w tym temacie

Top użytkownicy w tym temacie

chyba każdy w końcu przechodzi przez zrobienie swojego assemblera :D

swoją drogą, skoro wszystko jest stringiem, to do zastosowań real time się nie nada, zaś do skryptowania bloków złożonych poleceń to już wypadało by użyć czegoś wysokopoziomowego. mógłbyś dodać jakiś kompilator wysokopoziomowego języka (c-, java-, c#-like składnia), co o tym myślisz?

Odnośnik do komentarza
Udostępnij na innych stronach

Jak już mówiłem, ulepszam mój języczek o zagnieżdżanie, funkcje i bloki:

GML
//Taki sobie przykład odliczania w dół

def (konsola)

external AllocConsole:kernel32 ,

return

def (pisz)

external puts:clib xx,

return

 

def (entry)

%no_out%

var zmienna1

var xx

xx:=100;

zmienna1:=TEST

 

call konsola

repeat

call pisz

xx-1

until (xx > 0);

 

external FreeConsole:kernel32 ,

 

 

Ten o to programik odliczy nam od 100 w dół przy pomocy biblioteki kernel32 i clib. Muszę zrobić biblioteke standardowo, jak każdy szanujący się jezyk posiada.

Powyższy kod jest ładnie przetłumaczony do kodu niższego poziomu:

 

GML
//Taki sobie przykład odliczania w dół

::konsola

var AllocConsole

RG1:=##0

RG2:=##0

RG3:=##0

RG4:=##0

RG5:=##0

extl kernel32,AllocConsole

AllocConsole:=RG0

return

::pisz

var puts

RG1:=xx

RG2:=##0

RG3:=##0

RG4:=##0

RG5:=##0

extl clib,puts

puts:=RG0

return

 

::entry

%no_out%

var zmienna1

var xx

xx:=100

 

zmienna1:=TEST

 

call ::konsola

::rep00008B71

call ::pisz

xx-1

cmp xx,0

if > ::rep00008B71

 

 

var FreeConsole

RG1:=##0

RG2:=##0

RG3:=##0

RG4:=##0

RG5:=##0

extl kernel32,FreeConsole

FreeConsole:=RG0

HALT

 

 

Wszystko ładnie pięknie :)

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

Tak więc przez ten czas, leniwie po nocach opracowałem składnie, którą powinien mieć język wysokiego poziomu.

Oczywiście, jest to Turing Tarpit, czyli język jest zupełny w sensie Turinga.

Kod można sobie spokojnie zagnieżdżać, nie ma z tym problemu.

Myślę nad dodaniem rekurencji i zmiennych lokalnych.

Ciekawym aspektem byłoby też, gdybym dodał klasy i obiekty, ale jeszcze nie mam pomysłu jak to zaimplementować.

 

Co się zmieniło?

DM+ stał się maszyną wirtualną (?) a Slap to translator do komend niższego poziomu.

Dodałem też tablice, na razie jednopoziomowe, ale myślę, że nie będzie problemu je rozszerzyć.

Slap jest w stanie obliczać złożone równania matematyczne, np:

GML
log(beer^2*3/4*4+1-1.92*beer));

Gdzie beer to zmienna liczbowa.

 

Buduje bibliotekę standardową, i dll w którym nie funkcję natywne nie chcą się wywoływać przez stdcall

 

O to przykład liczenia silni do 100 (Duże liczby wyświetlane są jako notacja wykładnicza)

 

GML
%import standard%

def (silnia);

var silnia

var step

var formula

formula:=n

repeat

n-1

step:=n

formula (formula*step);

silnia:=formula

while ( n > 2 )

return

 

//Program liczący silnie. Przykład SLAP

def (entry);

call initconsole(Silnia,);

var n

call writeconsole(Podaj liczbe: ,);

call readln();

n:=readln

call silnia();

call writeconsole(silnia,);

 

silnia.png

 

 

Link do downloadu w pierwszym poście

(IDE uruchamiamy przez start.bat)

Odnośnik do komentarza
Udostępnij na innych stronach

znajdźcie sobie dziewczyny, nerdy. 5 gwiazdek

Bóg chciał, że dziewczyny nerdy są fe. Ble :sick:

Co do kodu źródłowego, to muszę go uporządkować, a potem wypuszczę.

Tak się ciekawię, jakby to było dodać implementację OpenGL, directxa, socketów i innych ciekawych dupereli.

Standardowa biblioteka jest w folderze lib pod nazwą standard.dmlib.

Otwórzcie sobie notatnikiem i pomóżcie w rozwoju!

 

@EDIT:

Kod źródłowy najważniejszego elementu, czyli wywoływania funkcji z dllek:

 

GML

push [rg5]

push [rg4]

push [rg3]

push [rg2]

push [rg1]

call paddr

Odnośnik do komentarza
Udostępnij na innych stronach

Ale, ja się pytam, jak kompilujesz do Exe?

Moja kompilacja ograniczała się do tworzenia launchera i pliku z kodem ;P

U mnie podobnie. Kod maszyny wirtualnej jest szyfrowany banalnym algorytmem (póki co :P) i wtapiany jest w plik exe interpretera.

Czyli otrzymujemy zespoloną całość. Wystarczy trochę poczytać o budowie pliku exe.

 

To co tak naprawdę siedzi w pliku Silnia.exe, czyli skompilowanym kodzie ze Slapa to:

GML
000D0A76617220746F77726974650D0A0D0A63616C6C203A3A656E7472790D0A0D0A3A3A696E6974

636F6E736F6C650D0A256E6F5F6F7574250D0A76617220416C6C6F63436F6E736F6C650D0A657874

6

C206B65726E656C33322C416C6C6F63436F6E736F6C650D0A416C6C6F63436F6E736F6C653A3D524

7

300D0A25737464686E646C0D0A0D0A6578746C206B65726E656C33322C536574436F6E736F6C6554

6

9746C65410D0A0D0A5247313A3D636F6C6F7220610D0A0D0A6578746C20636C69622C73797374656

D

0D0A5247313A3D737464686E646C320D0A5247323A3D232331300D0A6578746C206B65726E656C33

3

22C476574436F6E736F6C65466F6E7453697A650D0A0D0A5247313A3D536C617020697320444D2B2

0

436F6D70696C65722076312E35202D2044616E69656C204D617A7572200D0A63616C6C203A3A7772

6

97465636F6E736F6C650D0A5247313A3D5374616E64617264206C696272617279207665722E20312

E

3237313231320D0A63616C6C203A3A7772697465636F6E736F6C650D0A72657475726E0D0A0D0A3A

3

A7772697465636F6E736F6C650D0A6578746C20636C69622C707574730D0A72657475726E0D0A0D0

A

3A3A6E65776C696E650D0A5247313A3D5F200D0A6578746C20636C69622C707574730D0A72657475

7

26E0D0A0D0A0D0A3A3A66726565636F6E736F6C650D0A0D0A5247313A3D2323300D0A5247323A3D2

3

23300D0A5247333A3D2323300D0A5247343A3D2323300D0A5247353A3D2323300D0A6578746C206B

6

5726E656C33322C46726565436F6E736F6C650D0A0D0A72657475726E0D0A0D0A3A3A70617573650

D

0A0D0A5247313A3D70617573650D0A0D0A6578746C20636C69622C73797374656D0D0A0D0A726574

7

5726E0D0A3A3A636F6C6F72697A650D0A25737464686E646C0D0A0D0A5247313A3D737464686E646

C

320D0A5247323A3D232339390D0A6578746C20636C69622C536574436F6E736F6C65546578744174

7

4726962757465410D0A0D0A0D0A72657475726E0D0A0D0A3A3A73797374656D0D0A0D0A766172204

5

52524F524C4556454C0D0A6578746C20636C69622C73797374656D0D0A4552524F524C4556454C3A

3

D5247300D0A72657475726E0D0A0D0A3A3A6162730D0A766172206162730D0A0D0A6578746C20636

C

69622C6162730D0A6162733A3D5E5E5247300D0A72657475726E0D0A0D0A3A3A746F61736369690D

0

A76617220746F61736369690D0A6578746C20636C69622C5F676574730D0A746F61736369693A3D5

2

47300D0A72657475726E0D0A0D0A3A3A737172740D0A76617220737172740D0A6578746C20737464

2

C737172740D0A737172743A3D5247300D0A0D0A72657475726E0D0A0D0A3A3A7371720D0A7661722

0

7371720D0A6578746C207374642C7371720D0A7371723A3D5247300D0A0D0A72657475726E0D0A0D

0

A0D0A3A3A6D7367626F780D0A766172206D7367626F780D0A6578746C207374642C6D7367626F780

D

0A6D7367626F783A3D5247300D0A0D0A72657475726E0D0A3A3A70726F6D70740D0A5247313A3D3E

0

D0A6578746C20636C69622C7072696E74660D0A0D0A72657475726E0D0A3A3A646F776E6C6F61640

D

0A76617220646F776E6C6F61640D0A6578746C207374642C646F776E6C6F61640D0A646F776E6C6F

6

1643A3D5247300D0A72657475726E0D0A0D0A3A3A77696E657865630D0A6578746C207374642C776

9

6E657865630D0A0D0A72657475726E0D0A0D0A3A3A72656774657374310D0A0D0A6578746C207374

6

42C72656774657374310D0A0D0A72657475726E0D0A0D0A3A3A787878780D0A6578746C207374642

C

787878780D0A72657475726E0D0A2F2F30783132633030640D0A3A3A696E707574626F780D0A7661

7

220696E707574626F780D0A5247313A3D2141480D0A65787473207374642C696E707574626F78310

D

0A696E707574626F783A3D52475354520D0A72657475726E0D0A0D0A0D0A3A3A726561646C6E0D0A

0

D0A63616C6C203A3A70726F6D70740D0A76617220726561646C6E0D0A766172206164727A0D0A524

7

313A3D2141480D0A65787473207374642C726561646C6E0D0A726561646C6E3A3D52475354520D0A

0

D0A72657475726E0D0A3A3A7374720D0A766172207374720D0A5247313A3D2141480D0A657874732

0

7374642C7374720D0A7374723A3D52475354520D0A0D0A72657475726E0D0A0D0A3A3A6D616B6566

6

F726D0D0A766172206D616B65666F726D0D0A6578746C207374642C6D616B65666F726D0D0A6D616

B

65666F726D3A3D5247300D0A72657475726E0D0A3A3A73657476616C75650D0A6578746C20737464

2

C73657476616C75650D0A72657475726E0D0A0D0A3A3A66696E6477696E646F770D0A76617220666

9

6E6477696E646F770D0A6578746C207573657233322C46696E6457696E646F77570D0A66696E6477

6

96E646F773A3D5247300D0A72657475726E0D0A0D0A3A3A73696C6E69610D0A7661722073696C6E6

9

610D0A76617220737465700D0A76617220666F726D756C610D0A666F726D756C613A3D6E0D0A3A3A

7

2657030303030424644430D0A6E2D310D0A737465703A3D6E0D0A76617220666F726D756C610D0A4

0

464F524D554C4120666F726D756C612A737465700D0A666F726D756C613A3D5247300D0A73696C6E

6

9613A3D666F726D756C610D0A636D70206E2C32200D0A6966203E203A3A726570303030304246444

3

0D0A72657475726E200D0A0D0A2F2F50726F6772616D206C69637AB963792073696C6E69652E2050

7

27A796BB3616420534C41500D0A3A3A656E7472790D0A5247313A3D53696C6E69610D0A5247323A3

D

2323300D0A5247333A3D2323300D0A5247343A3D2323300D0A5247353A3D2323300D0A63616C6C20

3

A3A696E6974636F6E736F6C650D0A766172206E0D0A5247313A3D506F64616A206C69637A62653A2

0

0D0A5247323A3D2323300D0A5247333A3D2323300D0A5247343A3D2323300D0A5247353A3D232330

0

D0A63616C6C203A3A7772697465636F6E736F6C650D0A5247313A3D2323300D0A5247323A3D23233

0

0D0A5247333A3D2323300D0A5247343A3D2323300D0A5247353A3D2323300D0A63616C6C203A3A72

6

561646C6E0D0A6E3A3D726561646C6E0D0A5247313A3D2323300D0A5247323A3D2323300D0A52473

3

3A3D2323300D0A5247343A3D2323300D0A5247353A3D2323300D0A63616C6C203A3A73696C6E6961

0

D0A5247313A3D73696C6E69610D0A5247323A3D2323300D0A5247333A3D2323300D0A5247343A3D2

3

23300D0A5247353A3D2323300D0A63616C6C203A3A7772697465636F6E736F6C650D0A48414C54

 

 

 

Grubo, co? :D

Odnośnik do komentarza
Udostępnij na innych stronach

Tak dla zasady. Nie chcę, żeby ktoś widział kod źródłowy programu.

Prosty algorytm, nie opóźnia uruchamiania programu

 

 

@EDIT:

Bawiąc się Slapem w funkcje matematyczne stworzyłem takie cuś:

funkcje.png

Korzystając z funkcji:

GML
abs((2*sin(y+x))*1000*x*y)

 

Slap wykonał 109399 kroków na 220 natywnych linii kodu maszyny wirtualnej

Zajeło to z dwie minut, ale jest.

Jestem z siebie dumny. Muszę tylko zoptymalizować kod, żeby śmigało to szybciej.

Odnośnik do komentarza
Udostępnij na innych stronach

Wow, fajnie się zapowidada!

 

---------------------

OFFTOP:

U mnie podobnie. Kod maszyny wirtualnej jest szyfrowany banalnym algorytmem (póki co ) i wtapiany jest w plik exe interpretera.

Przypuszczałem że tak zrobiłeś, ale w tym problem. Mógłybyś powiedzieć skąd dowiedziałeś jak go wtopić w plik exe, czy sam to ogarnąłeś?

Odnośnik do komentarza
Udostępnij na innych stronach

Wow, fajnie się zapowidada!

 

---------------------

OFFTOP:

 

Przypuszczałem że tak zrobiłeś, ale w tym problem. Mógłybyś powiedzieć skąd dowiedziałeś jak go wtopić w plik exe, czy sam to ogarnąłeś?

 

Pomysł mojego autorstwa, poczytaj o UpdateResString

 

@EDIT:

 

Dodałem zmianę ikony skompilowanego pliku exe

Odnośnik do komentarza
Udostępnij na innych stronach

Najlepsze w Slapie jest to, że można napisać w nim każdy rodzaj wirusa/trojana/spyware, a antywirusy nic nie wykryją, bo kod jest kreowany dynamicznie i nie potrzeba zbędnych bibliotek, bo wszystkie są (kernel32,user32,winsock). Można importować COMy, edytować rejestr. Wszystko

 

@EDIT: Znacie jakąś godną polecenia bibliotekę sieciową oprócz WinSocka?

Odnośnik do komentarza
Udostępnij na innych stronach

Znalazłem dll (http://www.dll-files.com/dllindex/dll-files.shtml?borlndmm, przy pobieraniu wziąć download zip-file, rozpakować i wrzucić do folderu ze Slapem).

IDE trzeba odpalać przez start.bat nie? Bo jak odpalam przez base.exe to dostaję access violation i dopiero IDE się odpala.

 

Odpaliłem silnia.exe, wpisałem liczbę i dostałem "program silnia.exe przestał działać".

 

Inne programy dobrze działają (wypisują jakieś liczby na ekran konsoli).

Odnośnik do komentarza
Udostępnij na innych stronach

Wygląda na to, że trzeba będzie odrębne wsparcie dla Win 8 robić.

Muszę na lepszego kompa zarobić :/

 

Póki co, wczoraj poszerzyłem standardową bibliotekę o tworzenie form i labelek, sterowanie nimi i przejmowanie WM_*

Miałem do wyboru jeszcze Qt, ale same biblioteki ważą dobre 150mb

Odnośnik do komentarza
Udostępnij na innych stronach

Mogę Cię pocieszyć, że win 8 nie potrzebuje super sprzętu.

U mnie na pentium D 2x2,8 GHz, 2 GB ramu i geforce 7300gt chodził pięknie (teraz tylko ramu do 4 gb dołożyłem i żadnej różnicy w normalnym użytkowaniu).

 

 

Tak swoją drogą sprawdź to na win 7.

Odnośnik do komentarza
Udostępnij na innych stronach

Gimbusy napisały ,że co drugi windows to kicz - czyli windows 8 musi być kiczem.

Gimbusy? Nasz nauczyciel informatyki nieudolnie udowadniał przez całą lekcję, że to prawda z tymi Windowsami. Ale to nic, on jest fanbojem Apple'a i Maców (+w pracowni są tylko "jabłka"), więc guzik mnie obchodzi jego zdanie.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...