[#1] Bzted
Niestety. Uległem pokusie stworzenia własnego języka programowania. Wiecie, jednego z tych 100 nikomu niepotrzebnych dziwacznych języków używanych przez 3 osoby.

Bzted, bo tak - dość adekwatnie myślę - nazwałem to dzieło, to język bazujący na stosie. Języki używające stosu jako głównej (albo jedynej) struktury danych z jednej strony mają jakiś dziwny powab dla programistów, z drugiej zaś są skazane na małą popularność. Nie wiem dlaczego, ale tak jest, wymieńcie jakiś znany język oparty na tym założeniu. Tu zapada cisza. Dinozaury programowania powiedzą "Forth", jest nawet na Amigę. Specjaliści od DTP powiedzą "PostScript" (tylko kto w nim ręcznie programuje wydruki?). Do tego są różne nowe ciekawe pomysły, Factor albo Uiua. Słyszeli o nich tylko najwięksi fani i penetratorzy zakamarków Internetu. Czyli ja też.

No ale mniejsza z tym. Napisałem Bzteda dla rozrywki, nie dla poklasku, czy tym bardziej pieniędzy. Bardzo mnie kusiła idea, żeby wszystkie funkcje z bibliotek AmigaOS były operatorami w tym języku. Czyli nie musi mieć jakiejś "biblioteki standardowej", bo ma dostęp do całego systemu.

Co chcę osiągnąć w tym języku? Oprócz dostępu do API systemu chcę, żeby kompilator był mały i szybki. Ma zasuwać na A1200 z fastem, a najlepiej na gołej A500. Póki co tak jest. Oprócz tego ma generować efektywny i szybki kod. Tak na razie nie jest, bo moduł optymalizatora nie jest jeszcze gotowy. Odłożyłem go trochę w czasie, bo uznałem, że najpierw ma poprawnie działać, potem optymalizacja. Wstępne testy optymalizatora pokazują, że będzie spoko, na razie póki co można się nieźle pośmiać oglądając generowany asembler. Ale działa.

Bzted bowiem nie kompiluje od razu do binarki, tylko do źródła w asmie, które potem można skompilować różnymi asemblerami (sprawdziłem Vasm, GenAm i PhxAss).

Na koniec, dla osiągnięcia efektu OMG, kod programu otwierającego systemowe okienko i czekającego na zamknięcie go przez użytkownika.

WA_Width:          { $80000066 }
WA_Height:         { $80000067 }
WA_Title:          { $8000006E }
WA_DragBar:        { $80000082 }
WA_DepthGadget:    { $80000083 }
WA_CloseGadget:    { $80000084 }
WA_IDCMP:          { $8000006A }
IDCMP_CLOSEWINDOW: { $00000200 }
UserPort:          { 86 }

WinLoop: { UserPort + * : WaitPort \ { : GetMsg : ? { : ReplyMsg } { } } <@ \ }

main: { 0 [
  WA_Width 400
  WA_Height :2
  WA_Title "Bzted Window"
  WA_CloseGadget 1
  WA_DragBar 1
  WA_DepthGadget  1
  WA_IDCMP IDCMP_CLOSEWINDOW
  0 ]
OpenWindowTags : ?
  { : WinLoop CloseWindow 0 }
  { \ "Failed to open window.\n" PutStr \ 10 }
}

To stado deklaracji systemowych stałych i struktur na początku zostanie zastąpione później przez coś w rodzaju "inkludów", żeby nie trzeba było tego deklarować na piechotę.

Projekt hostuję na Codebergu i tam też jest dostępna wersja 0.1. Archiwum jest też w drodze na Aminet.
9
[#2] Re: Bzted

@Krashan, post #1

Super pomysł. Swoją drogą nie rozumiem czenu Arexx nie ma dostępu do całego APi systemu.

Ostatnia aktualizacja: 23.11.2025 11:44:05 przez Sventevith
1
[#3] Re: Bzted

@Krashan, post #1

No, ciekawe. Ty jak coś wymyślisz to… Kto może powiedzieć, że ma na koncie napisanie własnego języka? Chyba naprawdę niewiele osób.

Akurat zastanawiałem się jakiś czas temu jak wygląda parser składni języków programowania. To musi być bardzo sprytnie i uniwersalnie zaprojektowane, ale trochę nie mam pomysłu jak.
Tak się dziwnie składa, że w grze, którą robię od lat zachciało mi się mieć taką konsolę jak w Quake czy Doom. Początkowo rozkazy miały mieć jakieś tam parametry w nijakim formacie, a później pomyślałem, że będzie zabawnie jeżeli to będzie składnia komend AmigaDOS. szeroki uśmiech No i jakoś to zrobiłem, nawet działa zgrabnie, ale zaglądanie do tych klas nie sprawia mi przyjemności, bo architektura tego mi się bardzo nie podoba. Szkoda, że kilka lat temu nie zerknąłem jak się zwykle takie rzeczy pisze i po prostu usiadłem i pisałem.
Tym większy szacunek mam dla Bzdeta, bo jestem pewien, że zostało to bardzo ciekawie i optymalnie (biorąc pod uwagę założenia i wymagania) rozwiązane.
1
[#4] Re: Bzted

@Sventevith, post #2

Swoją drogą nie rozumiem czenu Arexx nie ma dostępu do całego APi systemu.
Myślę, że dlatego, że jest językiem "importowanym" na Amigę i jego autorzy w ogóle o czymś takim nie myśleli. W tamtych czasach takie bogate API systemowe było czymś nowym, porównaj to sobie z "API" MS-DOS-a chociażby. A nawet z ówczesnym Unixem.

Do tego dochodzi fakt, że mechanizm amigowych bibliotek jest trochę nietypowy, choć prosty w założeniach. Ale dla języków portowanych zazwyczaj pojawia się tu jakaś sztuczność. Nawet w C każdy kompilator ma swoje mechanizmy dostępu do amigowego API, chociaż tutaj, ze względu na popularność języka i bliskość sprzętowi, dało się to zrobić efektywnie.

W Bztedzie dostęp do API był założeniem. Dlatego jest łatwy i optymalny w kodzie. Funkcje systemowe są na równych prawach z tymi zdefiniowanymi przez programistę.
[#5] Re: Bzted

@MDW, post #3

Akurat zastanawiałem się jakiś czas temu jak wygląda parser składni języków programowania. To musi być bardzo sprytnie i uniwersalnie zaprojektowane
Czy ja wiem? Najpierw jest to cięte na tokeny, które w Bztedzie są rozdzielane dowolnymi sekwencjami białych spacji. W tym też etapie pozbywam się komentarzy z kodu, oraz wyodrębniam łańcuchy tekstowe. Po tym przejściu z pliku źródłowego mam listę dwukierunkową z tokenami. Drugie przejście identyfikuje literały liczbowe i zamienia je na liczby, oprócz tego "zrzuca" cudzysłowy ze stringów (tu też powinna się znaleźć obsługa sekwencji typu "\n"). Potem pozostałe tokeny są dzielone między syscalle, operatory wbudowane i operatory zdefiniowane w kodzie (czyli funkcje). Proste przeszukiwanie list. Kolejny etap to już translacja operatorów na kod wirtualnego procesora...
1
[#6] Re: Bzted

@Krashan, post #5

Brzmi bardzo kulturalnie.
[#7] Re: Bzted

@Krashan, post #1

Na koniec, dla osiągnięcia efektu OMG (...)

Szok

A z ciekawości, bo patrzę i próbuję rozkminić składnie, jak rozumieć poniższe zapisy:
WA_Height :2

UserPort + *

Co oznacza liczba 10 w ostatniej linii?

Czemu WinLoop raz jest zapisane jako:
WinLoop: {    }

A za drugim jako:
: WinLoop ...
1
[#8] Re: Bzted

@vojo, post #7

W archiwum jest guide z opisem języka, dla chętnych oczywiście. Podstawą jest to, że (prawie) wszystko w Bztedzie jest operatorem, czyli czymś co ściąga argumenty ze stosu, coś z nimi robi i wyniki odkłada na stos. 'WA_Height' też jest operatorem, odkłada na stos swoją wartość. Liczba podana wprost, tak samo. Tajemniczy operator ':2' należy do rodziny operatorów kopiujących elementy na stosie. Robi kopię drugiego elementu od góry (stąd dwójka) i tę kopię kładzie na wierzch.

Weźmy teraz drugi kawałek kodu. 'UserPort' odkłada na stosie liczbę 86. Tak się składa, że jest to offset pola UserPort w strukturze Window. '+' to dodawanie (kto by pomyślał ) dwóch górnych elementów ze stosu. Na wierzchu jest to 86, a to co niżej przychodzi jako argument i jest to adres struktury Window. Po dodaniu dostajemy adres pola UserPort. Operator '*' nie jest mnożeniem, żeby już nie było tak przyjemnie. To odczyt z pamięci. Ściąga wartość z góry stosu i używa jej jako adresu, spod którego pobiera wartość i kładzie ją na stos. W C odpowiada to czemuś w rodzaju "win->UserPort".

Liczba 10 w ostatniej linii to wartość zwracana do systemu (bo zostaje na stosie jako jedyna na koniec main()). Elegancko należałoby to zdefiniować jako RETURN_ERROR, jak w inkludach systemowych.

"WinLoop:" oznacza definicję operatora WinLoop. Za drugim razem mamy zaś operator ':' czyli "duplikuj wierzch stosu", a potem wywołanie operatora WinLoop. Wiem, dwukropek ma, jak się okazuje, podwójne znaczenie. Tylko co innego można dać dla zaznaczenia definicji? Poza tym w C znaczki takie jak '*' czy '&' też mają co najmniej podwójne znaczenie i da się z tym żyć. Bo średnik... na razie jeszcze do niczego go nie użyłem i chwilowo nie za bardzo widzę dla niego zastosowanie. Wolny też jest wykrzyknik.
[#9] Re: Bzted

@MDW, post #3

To zależy od zaawansowania gramatyki języka, z tego co rozumiem to Bzdet jest na stosie jak Forth. Forth to chyba najprostszy język do zaimplementowania ze względu na polską notację i parsowanie wyrażeń.

Prostsze gramatyki można ogarnąć parserem rekurencyjnym, bardziej to już lepiej skorzystać z generatora parserów.

Ostatnia aktualizacja: 23.11.2025 16:00:34 przez Sventevith
1
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem