Atalan dojrzewa by Kaz 2010-08-09 10:49:32

Atalan

Kolega Rudla Kudla z Czech w lutym tego roku poinformował na naszym forum o powstaniu nowego języka programowania wysokiego poziomu dla małego Atari (a nawet szerzej - dla komputerów z procesorem 6502 - czyli także C64, Apple, BBC) pod nazwą Atalan.



Główną inspiracją, jak podaje autor, był język "Action!", ale celem stworzenia nowego języka była chęć posiadania narzędzia, które będzie tworzyć kod lepszej jakości niż "Action!", a także którego niedociągnięcia będzie można stale poprawiać, bo przecież "Action!" nie jest już rozwijany. W stosunku do języka C (i naszej implementacji w postaci cc65) Atalan ma mieć lepszą składnię, a w stosunku do asemblera - nie ma być przerażający :D. Ponadto ma to być język nastawiony na tworzenie gier i pewne rozwiązania mają ułatwiać programistom ich tworzenie (np. moduły do tworzenia programowych duszków, skrolowania tła, etc).

Celem autora, oprócz udostępnienia nam łatwiejszego i przyjemniejszego w użyciu języka, jest stworzenie biblioteki procedur niezależnej od platformy, dzięki czemu możliwe będzie rozwijanie softu jednocześnie na Atari i na przykład C64. Jak pisze autor: "wierzę, że dobrymi kandydatami do tego są gry takie jak Kolony 2106. To może zbliżyć obie społeczności".

"Atalan" wciąż jest rozwijany (tutaj strona domowa projektu, a tutaj miejsce do dyskusji, gdzie można na przykład raportować o błędach, zgłaszać idee albo chęć pomocy). Obecnie kompilator działa w systemie Windows, ale ponieważ używany jest tu ANSI C, przeniesienie na inne platformy powinno być stosunkowo proste. Do generowania kodu dla 6502 używany jest MADS, ale ponieważ nie są wykorzystywane jakieś specjalne właściwości MADS-a, możliwe jest użycie innych asemblerów. Po więcej szczegółów, w tym opis języka i przykłady należy się kierować na stronę domową.

UWAGA! Rudla Kudla prosi grafików o projekt graficzny, jakieś logo dla języka "Atalan". Może to dobry pomysł, żeby zorganizować odpowiedni konkurs? Oczywiście międzyśrodowiskowy - także dla kolegów - fascynatów C64.

Atalan The Snake

Najlepszym testem na to, czy dany język nadaje się do tego, do czego został zaprojektowany - jest napisanie odpowiedniego programu. Jakub "JKR" Krzak niespodziewanie opublikował na naszym forum swój pierwszy, po 15 latach, program - prostą grę wężową pod tytułem Atalan The Snake, napisaną właśnie w języku "Atalan". Chyba nie trzeba nikomu tłumaczyć fabuły gry - wiadomo, że trzeba wężem pożerać, a to pożeranie z czasem staje się coraz trudniejsze :). Gra prosta, ale wciągająca. Chyba najlepszy dowód na to, że idea Rudli Kudli ma sens i że z praktyczną implementacją idei też nie jest źle :).



"Snake" dorzuciłem do katalogu gier w wersji 0.1, ale autor obiecuje, że będzie grę rozbudowywał, między innymi zamierza ją udźwiękowić. Dostępne są też źrodła - można zobaczyć, jak przejrzysty jest kod.
Kaz 2010-08-09 12:17:48

TDC - bedziesz teraz mogl sie przesiasc z tego zabugowanego "Action!" ;)

xxl 2010-08-09 12:52:04

grywalny ten snake, swietne wykonanie :-)

Kaz 2010-08-09 13:00:41

Oczywiscie dorzucilem węża do listy gier powstalych w 2010 roku:

http://tiny.pl/h7lg2

Cosi 2010-08-09 13:54:43

Oprócz Snake'a w Atalanie powstał też Tetris - autorstwa twórcy języka.

Bartek 2010-08-09 13:54:49

Dla mnie napisać grę w BASICu to czarna magia, a co dopiero własny język programowania - abstrakcja! W czym coś takiego się pisze? Kod maszynowy?

Kaz 2010-08-09 14:31:12

Bartek - na forum wrzucilem zrodlo tej prostej gry, przyjrzyj sie:

http://atarionline.pl/forum/comments.php?DiscussionID=885&page=1#Comment
_13260

Bardzo czytelne, bardzo proste, jak zostalo juz to napisane: jest to jezyk wyzszego poziomu, nie asembler. Skladnie analizujesz z opisem jezyka na stronie domowej i wszystko wiadome :).

GZP 2010-08-09 15:45:19

Oweż logo Atalanu (czy Atalana? jak to się odmienia?) to w formacie atarowym, czy grzybiarskim?

Ramos 2010-08-09 16:45:09

Bardzo dobry pomysł na stworzenie takiego języka kompatybilnego z innymi komputerami. Jednak jest duży minus tego projektu. Kto w obecnych czasach będzie chciał się uczyć nowego języka programowania. Samo stworzenie tego języka nie wystarczy do tego celu musi powstać sporo programów jak chociażby kompilator na dany komputer. Kiedyś próbowano już coś takiego stworzyć i jakoś się nie przyjęło. Można tworzyć w języku Forth. Z tego co wiem powstały gry w tym języku na Atari i bez problemu zostały przerzucone na koma.

Kaz 2010-08-09 17:35:55

GZP - podejrzewam, ze chodzi o logo w wersji pecetowskiej, na Atari zawsze bedzie mozna przekonwertowac. W razie czego - mail do autora jest na stronie projektu, autor rozumie po polsku.

Kaz 2010-08-09 17:48:19

Cosi - zgadza sie, ale nie ma to jak gra nie napisana przez autora jezyka - praktyczny dowod praktycznosci jezyka :). Jednakoz dobrze, ze przypomniales o tym "Atalan Tetris" - dodam informacje do spisu gier powstalych w 2010 roku.

nosty 2010-08-09 18:11:28

Wszystko fajnie, tylko jezyk jest do luftu opisany. W "references" nie ma np slowa o funkcji RANDOM (mozna znalezc ja tylko w przykladach). A jakie sa inne wbudowane funkcje wie pewnie tylko autor?

xeen 2010-08-09 20:46:18

no, no. aż grzech nie spróbować atalan'a :)

rudla 2010-08-09 21:55:33

@GZP&Kaz: I would like some logo for the website, but something, that could be added to real games would be nice too (something like ATALAN Powered). However even for PC i imagine some 'blocky' graphics scaled from Atari. Atalan is language for 8-bit development after all :-)

@nosty: Reference is a bit terse and slightly lagging after development - but not much. RANDOM is not built-in function, rather Atari hardware register. It should be documented in Platform/Atari section (but isn't now). Try to see atari.atl to see, what's available on Atari. Anyone can improve the set of supported registers. However I promise to try to document the platform specific stuff too.

Philsan 2010-08-09 23:44:20

Stars demo is impressive.

luki 2010-08-10 02:34:17

a ja zapytam, czy ktoś napisze dla tego podręcznik, aby zrozumiał jak to działa przeciętny programista PCtowy, radzący sobie w c++ czy visual basic, a wiec ten podręcznik musi zawierać wprowadzenie czym są np duszki, jakie są ograniczenia atari itp.

jhusak 2010-08-10 04:12:04

@Bartek, jest cała teoria pisania kompilatorów.
W skrócie:
Tworzy się opis składni języka w określonym formacie. Taki opis idzie do analizatora leksykalnego (rozpoznającego leksemy, czyli nie literki, a całe słowa kluczowe, liczby; nie wypuści nierozpoznanego leksemu) zintegrowanego z analizatorem składniowym (to to, że po if jest wyrażenie, a potem then a potem ciąg instrukcji a potem wiesz co). Następnie buduje się z tego drzewo programu (niekoniecznie, wtedy jest translator), aby łatwiej było np. optymalizować kod (np. sprawdzenie, czy zmienna jest używana). Następnie takie drzewo idzie do generatora kodu pośredniego, lub od razu do assemblera (tutaj znowu optymalizacja), który wykonuje zamianę na binarkę.

Czyli programista wykonuje (w postaci opisu, narzędzie tworzy kod):
analizator leksykalny (ręcznie lub narzędzie np. yacc)
analizator składniowy (ręcznie (np. atalan) lub narzędzie, np. bison)
Do zaprogramowania pozostaje generator kodu (ręcznie, dla każdej konstrukcji składniowej, których jest z reguły kilkadziesiąt)

W przypadku użycia narzędzi programista ma do zakodowania właściwie tylko generator kodu oraz dodatkowe więzy na składnię (np. sprawdzanie typów zmiennych), przy czym skupia się na pojedynczym elemencie składni na raz, co eliminuje WIELE błędów (jeśli rozpatruje instrukcję "for", to nie skupia się na wyrażeniach sterujących (bierze jedynie ich wynik), ani ciągu instrukcji. Dba tylko o odpowiednie skoki i organizację pętli, aby wykonała się tyle i tyle razy. Zmienna sterująca "sama" się ustawi w instrukcji przypisania.

Język obiektowy przy użyciu narzędzi nie jest wiele trudniejszym do stworzenia, niż imperatywny.

Językiem tworzenia kompilatorów jest język C/C++ (głównie),
aczkolwiek zupełnie sensownie da się napisać prosty i o nieco narzuconej budowie interpreter/kompilator np. w bash (analizator leksykalny za darmo, składniowy w postaci procedur).

jhusak 2010-08-10 04:18:45

Tutaj przykład, jak prosty jest opis czterodziałaniowego kalkulatora uwzględniającego pierwszeństwo mnożenia i dzielenia, oraz nawiasy.

Resztę robi narzędzie, przy czym produkuje szybki kod (trudno osiągnąć tę prędkość programując ręcznie)
Źródło - strona Marcina Kubicy z mimuwu.
http://www.mimuw.edu.pl/~kubica/aug/jfa-main-node5.html

%{
#include
#include


%}

%token NUM

%%

input: /* nic */
| input exp 'n' { printf("%dn", $2); }
;

exp : exp '+' skl { $$ = $1 + $3 }
| exp '-' skl { $$ = $1 - $3 }
| skl
;

skl : skl '*' czy { $$ = $1 * $3 }
| skl '/' czy { $$ = $1 / $3 }
| czy
;

czy : NUM
| '(' exp ')' { $$ = $2 }
;

%%

main()
{
yyparse();
}

yyerror(s)
char *s;
{
fprintf(stderr, "%sn", s);
}

jhusak 2010-08-10 04:30:41

Co prawda, powyższe to nie kompilator, a interpreter, ale kompilator zamiast np.
$$ = $2 miałby instrukcję
calc($2)
sta wynik
$$ = $1 + $3 miałby instrukcję gen2($1,$3), która by wypluła (w przybliżeniu) np:
calc($1)
sta wynik1
calc($3)
clc
adc wynik1
sta wynik

makro (bądź podprogram) calc dla stałej po prostu robił by
lda #stala
sta wynik

wówczas 3+3 zamieniło by się na kod liczący 3+3.

Optymalizacja jaką tu od razu można przeprowadzić, to wyrzucić z kodu bloki:
sta wynik
lda wynik

i już jest dużo mniejszy kod.

Tdc 2010-08-10 06:40:05

Kaz: he he;)
Obecnie z tym językiem mam dużo do czynienia bo moje stare programy w nim powstały. Potem to się zobaczy;)

Axi0maT 2010-08-10 07:02:18

Wyglada na dosc prosty do opanowania, ale z tego co przejrzalem to wszystko opiera sie tak naprawde na trybie znakowym. Gdzie te obiecane sprite'y? Cos tam jest w tym przykladzie z gwiazdkami, ale to tez nie do konca o takie duszki mi chodzi. Chcialbym zobaczyc przyklad z powiedzmy dwoma latajacymi prawdziwymi duszkami. Nie jakies protezy na tryb tekstowy. To by mnie z pewnoscia przekonalo do tego jezyka.

rudla 2010-08-10 08:38:52

@On language development theory:

Most work is on optimizer.
It is particularly easy to write some basic optimizations, but is's very hard prune all the situations, where it would produce buggy code.

For example in the case of your example with removing sta, lda, you can only remove 'sta wynik', if there is another 'sta wynik' before any label or jump instruction. Otherwise some code may count on the value of wynik to change and the code would be buggy.
(Happened to me in ATALAN :-)

So until full data flow analysis is programmed (and it will be :-), in many places of Atalan source you would see this 'dangling' sta.

With 6502, the situation is much more interesting, because textbooks do not take such an economic processor architecture (really small number of registers, none of them orthogonal) into account. So in some cases, I need to devise my own algorithms.

Lot of fun :-)

nosty 2010-08-10 10:27:35

Przede wszsytkim autor musi porawic wyrazne, grube bugi. Ja wczoraj wskazalem jeden, na ktory trafilem po pierwszej probie zakogowania paru linijek. JKR w paru miejscach w swoim kodzie napisal uwagi jak: "powinno to sie dac zrobic tak i tak, ale nie wiem czemu to nie dziala".
Im wiecej bedzie testerow tym szybciej i chetniej autor wprowadzi poprawki.
W miedzyczasie padnie pewnie pare uwag co zmienic, co dodac do samego jezyka.

A reszta to juz tylko kwestia wydajnych bibliotek: do stringow, do grafiki, do operacji dyskowych itp. itd.

Ten kod naprawde przyjemnie sie czyta i pewnie rownie latwo pisze.

jhusak 2010-08-10 11:09:51

Rudla robi codzienne niemal updaty do kodu. Chłopak szaleje!

Rudla, Rudla, Rudla, Rudla!!!

Throw it into some version control systems and make it public!

Rudla, Rudla, Rudla, Rudla!!!

Cosi 2010-08-10 13:14:08

You could become the BDFL, Rudla :-)
http://en.wikipedia.org/wiki/Benevolent_Dictator_For_Life

rudla 2010-08-10 14:19:15

The code is downloadable from the website, but I will put it to some version control to provide history.

nosty 2010-08-11 10:31:31

Wczytalem sie dokladnie w przyklady i w reference i zdecydowanie rudla powinien uzupelnic dokumentacje, a potem robic to regularnie w miare postepu prac nad ATALAN'em. To podstawa! Znacznie wazniejsza niz tutorial.
Język jest nowy, pelen bledow i nie mozna wymagac od uzytkownikow zeby sie jeszcze domyslali jak dziala, tylko na podstawie przykladow. Nie mozna biegac po 7 listingach i szukac jak czegos uzyc :P

Np. w references nie ma slowa o typach jakie znalazlem w przykladach: font, file. Nie ma tez nic o przerwaniach.
Nie znalazlem tez podstawowych informacji, takich jak:
- jak wyglada kwestia zasięgu zmiennych (lokalne w ramach procedury, globalne?).
- ile pamieci ma do dyspozycji programista?
- gdzie w pamieci jest umieszczany program, dane itp?
- czy pamiec zadeklarowanych zmiennych jest jakos chroniona? Czyli co sie stanie jesli wskaze adres deklarowanej zmiennej (jest taka mozliwosc) w miejscu gdzie jest program lub inna zmienna przydzielona automatycznie.

Podobnych pytan jest mozna zadac pewnie jeszcze mnostwo. Ja jestem amatorem, przydaloby sie zeby nad ATALAN'em pochylil sie jakis dobry niezalezny programista i podal autorowi swoje uwagi.

Ramos 2010-08-14 22:53:31

Mam pytanie. Czy kod gry Atalan The Snake po skompilowaniu będzie działał na innym komputerze z prockiem 6502 np. C64?
Jak wyglądać będzie sprawa grafiki, bo wiadomo na każdym komputerze z tym prockiem inne są układy graficzne i inaczej się wyświetla grafikę, no i trochę inaczej muzykę.

rudla 2010-08-16 22:38:31

Atalan is currently developed only for Atari, so currently answer is no.

However I believe, that with proper C64 library Snake could work on C64 too.

Of course, only applications using only common subset of capabilities of both computers would be platform independent in this way.