Od wprowadzenia na rynek Kickstartu 2.0, kaûdy uûytkownik Amigi moûe korzystaê z ARexxa, poniewaû jest on czëôciâ skîadowâ Workbencha. ARexx to potëûny jëzyk programowania, a mimo to îatwo go opanowaê. Jak îatwo -- zobaczycie dziëki naszemu obszernemu kursowi.
Z pewnoôciâ zauwaûyliôcie juû przy niektórych programach na Amigë
hasîo reklamowe "ARexx-Port", ale za bardzo nie wiedzieliôcie, co
to wîaôciwie znaczy. ARexx jest samodzielnym jëzykiem
programowania i, w przeciwieïstwie do innych jëzyków, ma
dodatkowo moûliwoôê sterowania "od zewnâtrz" programami,
zaopatrzonymi w port ARexxa. Moûe takûe wymieniaê dane z takimi
programami. Przykîadowo, ARexx umoûliwia uruchomienie kompilatora
jëzyka C lub TeX bezpoôrednio z edytora i w wypadku bîëdu ustawia
kursor w linii, wskazanej przez kompilator. ARexx pomaga wiëc w
zautomatyzowaniu czynnoôci, dotyczâcych jednoczesnej wspóîpracy
wielu programów. Podczas tego kursu poznacie, jak za pomocâ
procedur ARexxa rozszerza sië, lub dopasowuje do wîasnych
potrzeb, moûliwoôci takich programów. Najpierw jednak poznajmy
ogólnie wîaôciwoôci i moûliwoôci ARexxa. Potem, za pomocâ
prostych przykîadów, zagîëbimy sië krok po kroku w tajniki jego
dziaîania.
ARexx jest amigowskâ wersjâ jëzyka Rexx, który zostaî
zdefiniowany w 1985 r. przez M. F. Cowlishawa. Rexx byî
przeznaczony pierwotnie na duûe komputery firmy IBM i sîuûyî przede
wszystkim do tego, by zautomatyzowaê ciâgle powtarzajâce sië
czynnoôci, a ponadto umoûliwiê komunikacjë miëdzy róûnymi,
wykonywanymi jednoczeônie, programami. ARexx zostaî
zaimplementowany na Amigë w 1987 r. przez Amerykanina Williama S.
Hawesa i staî sië, po dîugim wdraûaniu, standardem w dziedzinie
komunikacji miëdzy procesami. Istotnâ przyczynâ "powodzenia"
ARexxa jest zakupienie licencji na ten jëzyk przez firmë
Commodore, która oferuje go od wersji 2.0 jako czëôê systemu
operacyjnego. W zwiâzku z tym, obecnie coraz wiëcej programów
uûytkowych wyposaûa sië w port, przez który mogâ byê one obsîugiwane z
poziomu ARexxa.
W odróûnieniu od wielu innych jëzyków wysokiego poziomu -- procedury ARexxa sâ zasadniczo interpretowane. Gîówny moduî ARexxa -- tzw. interpreter -- linia za liniâ analizuje wykonywany program ARexxa, i wywoîuje zaprogramowane tam dziaîania. Procedury ARexxa znajdujâ sië na dyskietce, lub na twardym dysku, jako czyste pliki tekstowe ASCII. Wprawdzie z tego powodu procedury te nie sâ zbyt szybkie, jest to jednak zamierzone, chodzi bowiem o to, by uûytkownik mógî dopasowaê programy do swoich potrzeb. Interpretacja pociâga za sobâ takûe îatwe odszukiwanie bîëdów. Moûna na przykîad uruchomiê wszystkie procedury ARexxa w trybie pracy "krok po kroku" (takûe i takie, które zostaîy uruchomione "w tle" programów uûytkowych).
Obsîuga zmiennych jest tu inna niû w pozostaîych
znanych jëzykach programowania.
W jëzykach wysokiego poziomu, jak C lub Modula, programista jest zmuszony deklarowaê kaûdâ zmiennâ przed jej uûyciem. W przeciwnym wypadku kompilator przerwie pracë i jednoznacznie zawiadomi, ûe uûyto zmiennej nie istniejâcej. W ARexxie nie musi to uûytkownika wcale interesowaê. Moûecie wszëdzie w programie wprowadzaê do woli nowe zmienne. Jednak -- jak sië domyôlacie -- bîëdy skîadniowe mogâ doprowadziê do powstania nowych, niepoûâdanych zmiennych. Przed takimi bîëdami ARexx nie moûe oczywiôcie programujâcego przestrzegaê.
Programujâc w jëzyku C, Pascal lub Modula musicie przy deklaracji zmiennej okreôliê takûe jej typ, w BASIC-u zaô typy danych sâ oznaczane za pomocâ koïcowego znaku nazwy zmiennej (na przykîad "$" dla îaïcuchów znakowych). To wszystko nie jest konieczne w przypadku ARexxa. Zna on tylko jeden typ danych: îaïcuch znakowy. Wszystkie zmienne, w tym takûe liczby caîkowite i zmiennoprzecinkowe, sâ traktowane jako îaïcuchy znaków. Aby uûyê ich na przykîad do obliczeï, ARexx musi najpierw zamieniê îaïcuch na liczbë, potem wykonaê dziaîanie, a nastëpnie uzyskany wynik przeksztaîciê z powrotem na îaïcuch znaków. Jak widzicie, takûe ta osobliwoôê ARexxa pociâga za sobâ wyraúnâ utratë szybkoôci. Poniewaû zmienne nie majâ okreôlonego typu, ARexx moûe wykryê bîëdy (na przykîad dziaîanie matematyczne na literach) dopiero podczas pracy programu; prowadzi to do jej przerwania.
Przejdúmy do najwaûniejszej wîaôciwoôci: z procedur ARexxa moûecie bez problemu uruchamiaê inne programy, a takûe przesyîaê rozkazy do dziaîajâcych programów i wymieniaê z nimi dane. To wszystko odbywa sië na bazie îaïcuchów znakowych (w koïcu ARexx zna tylko ten typ danych). Moûecie wiëc do dziaîajâcego programu posîaê rozkaz jako czysty tekst. Zwykle rozkaz ten jest nawet taki sam, jak odpowiedni punkt repertuaru.
Dla celów tego kursu bëdzie nam potrzebny jakiô edytor i sam ARexx. Jako edytor najlepszy bëdzie "CygnusEd", poniewaû wîaônie on posîuûy nam w póúniejszych odcinkach kursu jako przykîad sterowania programów przez ARexx. Moûecie jednak równie dobrze wykorzystaê rozkaz "ED" z katalogu rozkazowego C: Workbench'a. Jeôli wasz komputer ma system operacyjny w wersji 2.0, wówczas macie równoczeônie prawidîowo zainstalowany ARexx. Proces rezydentny "RexxMast" zostaje uruchomiony automatycznie przy uruchomieniu systemu. W ten sposób nic nie stoi na przeszkodzie, by rozpoczâê próby. Uûytkownicy systemu operacyjnego w wersji 1.3 muszâ najpierw zainstalowaê ARexx wedîug podrëcznika i za pomocâ doîâczonych programów instalacyjnych. W takim przypadku jednak program rezydentny "RexxMast" nie uruchomi sië automatycznie. Musicie sië jakoô postaraê, by dziaîaî on podczas wszelkich prac z ARexxem. Najlepiej umieôciê go od razu w "Startup-Sequence".
Najlepiej moûna poznaê ARexx na prostych przykîadach. Uruchomcie wiëc Wasz edytor i wpiszcie procedurë, opisanâ jako listing 1.
Listing 1:
/* Pierwszy test */
say 'To jest moj pierwszy program w ARexx-ie!'
Zapiszcie ten program pod nazwâ "test1.rexx". Wybierzcie w CLI lub Shellu (poleceniem CD -- przyp. tîum.) katalog, w którym program zostaî zapisany i wydajcie nastëpujëce polecenie:
rx test1
Przy zaîoûeniu, ûe wszystko zostaîo prawidîowo zrobione -- zostaniecie nagrodzeni nastëpujâcym wynikiem:
To jest moj pierwszy program w ARexx-ie!
Widzicie, ûe to jest o wiele îatwiejsze niû moûna by pomyôleê.
(Od redakcji: Wîaôciwie powinno byê "mój program" -- w takiej wersji dostarczono nam tîumaczenie -- a nie "moj program". Mamy nadziejë, ûe ks. Jan Pikul, prócz uczty duchowej na temat ARexxa -- przygotuje nam jeszcze deser w postaci artykuîu na temat "co zrobiê, aby Amiga pisaîa po polsku (w ARexxie teû)". Jak wszystkim wiadomo, ks. Pikul jest jednâ z trzech osób w Polsce najbardziej uprawnionych do zabierania gîosu na ten temat).
Przypatrzmy sië dokîadniej, na to, co zrobiliômy. Program jest zapisany pod nazwâ "test1.rexx". Po rozszerzeniu ".rexx" moûe byê on rozpoznany jednoznacznie jako program ARexxa. Wszystkie programy ARexxa, które startujâ z Shellu, powinny byê dla orientacji zaopatrzone w to rozszerzenie. Procedury, które jako "makra" lub "programy wsadowe" (ang. scripts -- przyp. tîum.) sterujâ programami uûytkowymi, wspóîpracujâcymi z ARexxem, otrzymujâ wîasne rozszerzenia, wskazujâce zawsze na odpowiedni program uûytkowy (na przykîad ".ced" w wypadku Cygnusa). Przez wywoîanie "rx" uruchamia sië program ARexxa. Polecenie "rx" szuka zawsze w katalogu aktualnym i w logicznym katalogu "REXX:" podanego programu ARexx z rozszerzeniem ".rexx", a nastëpnie go wykonuje. Wasz program ARexx zaczyna sië liniâ komentarza, którâ byê moûe znacie juû z jëzyka C. Komentarze ARexxa rozpoczynajâ sië sekwencjâ znaków "/*", a koïczâ za pomocâ "*/". Jest waûne, by w kaûdym z waszych programów ARexxa na poczâtku byîa taka linia komentarza, poniewaû po niej ARexx rozpoznaje, ûe w ogóle chodzi o jego program. Dla orientacji wykorzystujcie të linië przy okazji po to, by krótko opisaê dziaîanie programu. W drugiej linii poznaliôcie pierwszy rozkaz ARexxa -- "say". Odpowiada on Basicowemu "PRINT", znanemu z Moduli "WriteString" lub "printf", z jëzyka C. Jak z pewnoôciâ zauwaûyliôcie, sîuûy on do tego, aby wyprowadziê znaki w CLI lub Shellu. W wypadku naszego maîego programu zostaî wysîany na wyjôcia îaïcuch znaków. Îaïcuchy znakowe muszâ, tak jak byîo w tym przypadku, zostaê umieszczone w apostrofach (znak osiâgalny za pomocâ <ALT „>) lub w cudzysîowach.
Teraz, kiedy juû wiecie, jak îatwe do tworzenia i uûywania sâ programy ARexxa, chcielibyôcie z pewnoôciâ napisaê jakiô duûy program. Idúmy jednak naprzód krok za krokiem i najpierw zobaczmy, co jeszcze moûna zrobiê w ARexxie z îaïcuchami znakowymi (czyli ogólnie z wszystkimi zmiennymi).
Symbole, czyli napisy nie ujëte w cudzysîowy ani apostrofy, sâ wewnëtrznie najpierw zamieniane na duûe litery, zanim ARexx spróbuje je wartoôciowaê. Nazwy zmiennych i rozkazy pisane maîymi i duûymi literami sâ zatem w ARexxie identyczne. Obok nazw rozkazów symbole mogâ oznaczaê takûe zmienne i staîe. Zmienne rozpoczynajâ sië literâ, podczas gdy staîe muszâ mieê na poczâtku cyfrë lub kropkë dziesiëtnâ. Najlepiej pokaûmy to znów na przykîadzie. Wprowadúcie teraz listing 2 i zapiszcie program pod nazwâ "test2.rexx".
Listing 2:
/* Pierwszy test ze zmiennymi */
var1 = 'Zmienna 1'
var2 = 3.14159
say var1 VAR1 var2
Zobaczmy, co robi ten program. Zmiennej "var1" przypisano îaïcuch znaków "Zmienna 1". Za "var2" podstawiono liczbë PI. Jak juû wyûej zostaîo napisane, liczba zostaîa zastâpiona îaïcuchem znaków; moûna by wiëc liczbë umieôciê takûe w cudzysîowie lub miëdzy apostrofami. Za pomocâ poznanego juû rozkazu "say" wyprowadzamy teraz zmiennâ "var1" dwukrotnie (ARexx nie róûnicuje przecieû maîych i duûych liter), a nastëpnie zmiennâ "var2". Gdy teraz uruchomimy program przez
rx test2
otrzymamy, jak moûna byîo oczekiwaê, nastëpujâcy wynik:
Zmienna 1 Zmienna 1 3.14159
Nie omówiliômy jeszcze jednej, doôê waûnej, rzeczy -- jak naleûy
posîugiwaê sië w ARexxie tablicami? Bardzo pouczajâcy w tym
zakresie bëdzie tu nastëpny przykîad:
/* Test z tablicami */
feld.1 = 'Test tablicowy 1'
feld.2 = 'Test tablicowy 2'
index = 2
say feld.1 FELD.index
feld. = 'nowa zawartosc tablicy'
say feld.1 feld.2 feld.3
Zmienne tablicowe otrzymujâ na koïcu nazwy kropkë, a po niej
nastëpuje indeks. W pierwszych dwóch liniach dwóm elementom
tablicy zostajâ przypisane dwa róûne îaïcuchy znaków. W linii z
poleceniem "say" poniûej -- widzicie, jak îatwo moûna uûyê
zmiennej indeksowej zamiast staîej. Spowoduje to nastëpujâcy
wynik na ekranie:
Test tablicowy 1 Test tablicowy 2
Czy nie uderzyîo Was to, ûe przed uûyciem tablicy nie byîo ûadnej deklaracji ani podania rozmiaru tablicy. Takûe tablice sâ przez ARexx obsîugiwane dynamicznie i nie wymagajâ ûadnej deklaracji. Ostatnie dwie linie listingu 3 sâ szczególnie interesujâce. Zmiennej "feld" przypisano îaïcuch znaków z uûyciem kropki, ale bez podania indeksu. Jak widaê po wyniku na ekranie:
nowa zawartosc tablicy nowa zawartosc tablicy nowa zawartosc
tablicy
Nowa wartoôê zostaîa w ten sposób przypisana wszystkim elementom
tablicy; takûe tym elementom, które wczeôniej nie miaîy ûadnej
wartoôci (w tym przykîadzie zmiennej "feld.3"). Tablice
wieloindeksowe mogâ byê utworzone poprzez umieszczenie wiëkszej
liczby kropek i indeksów po nazwie zmiennej. W ten sposób za
pomocâ wywoîania "feld.index1.index2" uzyskalibyôcie dostëp do
elementu tablicy dwuwymiarowej. W ARexxie szczególnie ciekawe
jest to, ûe programista nie musi korzystaê z liczb jako indeksów.
Moûecie jako indeks zastosowaê zupeînie dowolny îaïcuch znaków.
Przykîadem mogîaby tu byê tablica z numerami telefonów,
indeksowana bezpoôrednio nazwiskiem osoby ("numer.nazwisko").
Zanim zobaczycie, w jaki sposób za pomocâ operatorów trochë
"oûywiê" zmienne, powinniôcie bliûej poznaê przypisywanie
zmiennym îaïcuchów znakowych. Poniewaû îaïcuchy sâ zamkniëte
apostrofami lub znakami cudzysîowu, na pewno zadawaliôcie juû
sobie pytanie, jak moûna te znaki wyprowadziê na ekran. Jak to
sië robi -- równieû zademonstujemy Wam za pomocâ poglâdowego
przykîadu:
Listing 4:
/* Przypisywanie lancuchow */
say "Ten sposob juz znamy"
say "On powiedzial: ""To jest cos nowego!""
say ""
/* jedna pusta linia */
say '41 42 20 34 32'X
/* "AB 42" */
say '00111000'b
/* "8" */
Pierwsza linia (po komentarzu) pokazuje sposób wyprowadzania, który juû poznaliômy, tym razem jednak z cudzysîowami zamiast apostrofów. Jeôli w naszym îaïcuchu "musi" wystâpiê cudzysîów lub apostrof -- trzeba go poprzedziê drugim takim samym znakiem, a zatem druga linia da nastëpujâcy wynik na ekranie:
On powiedzial: "To jest co nowego!"
Podwójne znaki apostrofu lub cudzysîowu mogâ wystëpowaê oczywiôcie tylko wewnâtrz îaïcucha znaków, a nie jako jeden znak. Dlatego trzecia linia spowoduje na ekranie wyprowadzenie linii pustej, a nie cudzysîowu. Dwie ostatnie linie demonstrujâ moûliwoôê podawania znaków za pomocâ ich kodu ASCII, w zapisie heksadecymalnym lub binarnym.
W tabeli 1 znajdziecie wykaz operatorów, rozpoznawanych przez ARexx.
Programujëcy w ARexx'ie ma dwie moûliwoôci na to, by poîâczyê
îaïcuchy znakowe. Obie sâ uûyte w listingu 5.
/* Laczenie lancuchow znakowych */
say 'abcd' 'efgh'
say 'abcd' || 'efgh'
Ten krótki program testowy prowadzi do nastëpujâcego wyniku:
abcd efgh abcdefgh
Spacja miëdzy dwoma îaïcuchami spowoduje poîâczenie ich obu ze spacjâ w ôrodku. Operator "||" natomiast poîâczy obydwa îaïcuchy bez znaku rozdzielajâcego je.
Operatory matematyczne powinny byê Wam juû znane z innych jëzyków
programowania. Mimo to, by wykluczyê nieporozumienia, spójrzmy
na listing 6:
/* Operatory matematyczne */
say 38 + 4
say 3**4
say 314 % 100
/* dzielenie calkowite ! */
say 314 // 100 /* reszta z dzielenia calkowitego przez 100 */
Powyûsze przykîady doprowadzâ naturalnie do oczekiwanych rezultatów:
42, 81, 3 i 14.
Naleûy jeszcze wspomnieê o tym, ûe drugi argument operatora potëgowego musi byê liczbâ caîkowitâ. Operatory matematyczne sâ oczywiôcie obliczane wedîug swojego, znanego z matematyki, priorytetu (potëgowanie -- mnoûenie -- dodawanie).
Dotychczas, jeûeli wpisaliôcie wszystko prawidîowo, programy musiaîy dziaîaê bez zakîóceï. Teraz spróbujcie celowo wprowadziê jakieô bîëdne dane, na przykîad zmieniajâc listing 6. Podajcie jako drugi argument przy potëgowaniu liczbë niecaîkowitâ (z jakimiô cyframi po przecinku) albo spróbujcie liczyê "na literach". Zwróêcie uwagë na komunikaty o bîëdzie. Jeôli póúniej zdarzy sië Wam jakiô "niecelowy" bîâd, bëdziecie znaê juû niektóre komunikaty o bîëdzie i szybciej odnajdziecie miejsce wystëpowania pomyîki. Jak widzicie, ARexx podaje linië, w której pojawiî sië bîâd, i -- niestety tylko po angielsku -- opis tego bîëdu.
(Od redakcji: W publikowanej równolegle liôcie rozkazów ARexxa znajdâ sië takûe polskie znaczenia tych komentarzy). Dziëki takiej obsîudze bîëdów, poszukiwanie pomyîek podczas pracy z ARexxem jest dosyê wygodne, jednak podobnie jak w innych jëzykach programowania, bîâd nie zawsze znajduje sië dokîadnie w tym miejscu, w którym ARexx przerwaî pracë, bo przerwanie to moûe byê nastëpstwem wczeôniejszej pomyîki.
Operatory logiczne mogâ dziaîaê jedynie na tak zwanych "zmiennych
boolowskich". Sâ to zmienne, które mogâ mieê tylko dwa stany:
"prawda" i "faîsz". W ARexxie odpowiadajâ im wartoôci liczbowe 1
("prawda") i 0 ("faîsz"). Jeôli nie wierzycie, wypróbujcie
listing 7.
/* Test z operatorami logicznymi */
say ~1 /* nie "prawda" -> "falsz" = 0 */
say 1 & 0 /* "prawda" i "falsz" -> "falsz" */
say 1 | 0 /* "prawda" lub "falsz" -> "prawda" */
say 1 ^ 1 /* "prawda" albo "prawda" -> "falsz" */
say (1 ^ 1) | 1 /* ("prawda" albo "prawda") lub "prawda" -> "prawda" */
W powyûszym przykîadzie, w komentarzach, "i" oznacza koniunkcjë (ang. "AND"), "lub" -- alternatywë (ang. "OR"), "albo" -- alternatywë z wykluczeniem równoczesnej prawdziwoôci skîadników, oznaczanâ zwykle angielskim skrótem "XOR" (przyp. tîum.) Jak widaê, operatory logiczne wykonujâ znane podstawowe dziaîania logiczne. Ostatnia linia stanowi dodatkowo przykîad wywoîania dwóch operacji logicznych jedna po drugiej. Kolejnoôê ich opracowania jest jednoznacznie okreôlona nawiasami.
Gdy popatrzy sië na listë operatorów porównania, znaczenie wiëkszoôci operatorów wydaje sië byê jasne. Jednak zapytacie z pewnoôciâ: "Jaka jest wîaôciwie róûnica miëdzy "równe" a "identyczne" ? Listing 8 stanowi przykîad, który wyjaônia të róûnicë.
/* Test operatorow porownania */
say '1.0' = '1'
say '1.0' == '1'
Operator porównania w pierwszej linii zmienia wewnëtrznie oba argumenty na liczby i porównuje je. Jeûeli warunek jest speîniony, wówczas zwraca wartoôê "prawda", a wiëc liczbë 1 -- a w przeciwnym wypadku "faîsz" (liczbë 0). Pierwsza linia zwraca 1, bo obydwa argumenty przedstawiajâ liczbë 1 i dlatego sâ równe. W odróûnieniu od tego operator porównania "==" sprawdza, czy obydwa argumenty przedstawiajâ ten sam îaïcuch znaków (dla przypomnienia: ARexx traktuje wewnëtrznie wszystkie zmienne -- takûe liczby -- jako îaïcuchy znaków). Dlatego druga linia zwraca oczywiôcie "faîsz", wyprowadza zatem liczbë 0.
Nawiasy "(" i ")" dopiero co poznaliômy (w przedostatnim programie przykîadowym). Moûecie za ich pomocâ -- jak w matematyce -- dokîadnie okreôlaê kolejnoôê obliczeï. Liczba otwartych nawiasów musi byê zgodna z liczbâ nawiasów zamkniëtych -- w innym przypadku ARexx przerwie pracë, wyprowadzajâc komunikat o bîëdzie. Ôrednik (";") sîuûy do tego, by w jednej linii umieôciê wiëcej niû jeden rozkaz. Zobaczymy to w przykîadzie 9. Przecinek (",") jest pomocny w odwrotnej sytuacji. Dziëki niemu moûna jeden rozkaz zapisaê w wiëkszej liczbie linii.
W listingu 9 znajdziecie teû ilustracjë tego faktu. Ostatnim znakiem specjalnym jest dwukropek. Dwukropkiem (":") oznacza sië etykiety. Ten znak poznacie jednak dopiero w nastëpnej czëôci kursu, gdzie pokaûemy wam moûliwoôci ARexx'a w zakresie programowania strukturalnego.
Obydwa rozkazy w pierwszej linii po komentarzu zostanâ wykonane w taki sposób, jakby byîy umieszczone w dwóch oddzielnych liniach. Dwie ostatnie linie bëdâ wykonane natomiast tak, jakby zawartoôê obu byîa umieszczona w jednej.
W nastëpnym odcinku poznamy moûliwoôci ARexx'a w zakresie programowania strukturalnego. Do tego sîuûâ takie konstrukcje, jak pëtle, podprogramy z lokalnymi zmiennymi i warunkowe wykonanie programu. Zobaczycie, ûe ARexx jest bardzo prosty. Przedtem jednak poêwiczcie jeszcze trochë, bo jak wiadomo, nikt jeszcze nigdy nie zostaî mistrzem tylko ze wzglëdu na swoje piëkne oczy. Do zobaczenia za miesiâc.