SOFTWARE
TRUE BASIC
FINALMENTE UNO STANDARD PER IL BASIC!
di Giorgio Dose
All'inizio degli anni sessanta i linguaggi per computer erano poco conosciuti
e comprensibili solo da coloro che li avevano studiati per anni. Con l'aumentare
dell'interesse, soprattutto da parte degli studenti, verso la programmazione
e l'uso dei computer, si avvertì la necessità di disporre
di un linguaggio di programmazione di facile apprendimento e di semplice
utilizzo. Dalle menti fervide di un gruppo di studenti americani e dei
loro professori uscì uno dei primi linguaggi interattivi per computer:
il BASIC, the Beginners All-purpose Symbolic Instruction Code.
Da allora il Basic ha fatto molta strada e si può
senz'altro affermare che è diventato il linguaggio più popolare
e che la sua immediatezza d'uso ha contribuito non poco alla diffusione
dei computer. Con l'implementazione del linguaggio nella memoria ROM e
con la possibilità di usare il registratore a cassette per la conservazione
dei dati, la vendita dei microcomputer ha preso letteralmente il volo.
Un uso sempre maggiore di questo linguaggio sulle
macchine più disparate portò inevitabilmente il Basic originale
a subire notevoli cambiamenti. I progettisti di software creavano continuamente
nuove funzioni per aumentarne la flessibilità e per sopperire alla
sua innata lentezza. Ben presto i dialetti del Basic differirono sempre
di più uno dall'altro e, nonostante che alcuni di essi, come il
MicrosoftBASIC, siano diventati molto popolari, esiste ancora oggi una
elevata incompatibilità tra i vari sistemi.
Un programma, ad esempio, scritto per un computer
con una risoluzione grafica di 200x200 pixel non potrà mai funzionare
su un computer con grafica ad alta risoluzione senza che per questo vengano
apportate notevoli modifiche.
TrueBASIC
Visti i molti dialetti del Basic, l'American National
Standards Institute nominò una commissione che potesse esaminare
i pregi e i difetti di ognuno. Prendendo il meglio dei vari dialetti venne
creato uno standard che avrebbe dovuto portare il Basic al state-of-art
dei linguaggi per computer.
Uno dei membri della commissione era Tom Kurtzche,
con l'aiuto di John Kemeny e altri studenti, aveva ideato il linguaggio
Basic originale. Gli stessi progettisti, attenendosi alle norme dello standard
ANSI, svilupparono anche il TrueBASIC. È questo un linguaggio ideale
per l'Amiga perché pur permettendo vecchi costrutti, come i numeri
di linea e i vari GOTO e GOSUB, possiede alcune delle più avanzate
strutture come SELECT CASE, DO-LOOP, DO-WHILE e DO-UNTIL. Il TrueBASIC
è trasportabile; ogni programma scritto con questo linguaggio sull'Amiga
può funzionare su un Macintosh o IBM, ad esempio, senza alcuna modifica,
compresa la parte grafica.
L 'Editor
L'editor è di grandissimo aiuto nella scrittura
dei programmi, Sia il TrueBASIC che l'AmigaBASIC lavorano a tutto schermo
ma l'editor del TrueBASIC è più veloce e più facile
da usare.
L'editor del TrueBASIC è ricco di svariati
gadgets. Molto importante è la finestra dei messaggi d'errore che
compare nella parte inferiore dello schermo ed ha le dimensioni di una
linea di testo. La finestra è normalmente vuota e cambia colore
quando viene visualizzato il messaggio d'errore. Contemporaneamente il
cursore si posiziona alla linea causa dell'errore. La finestra può
contenere fino a 5 messaggi ma può visualizzare solo uno di essi
alla volta. È necessario clickare sulla finestra per far comparire
il messaggio successivo.
L'editor dispone delle normali funzioni quali scroll
bars e frecce, cut and paste, search and replace eccetera ma dispone anche
di ulteriori comandi che necessitano di una piccola spiegazione.
Include Legge un file da disco e lo serisce
nel programma immediatamente dopo la linea corrente.
Keep Cancella tutte le linee tranne quelle
del blocco specificato.
Edit Visualizza, nella finestra di editing,
solo le linee del blocco desiderato.
Move to block Muove il cursore al blocco
(subroutine) definito con un nome.
Compile Salva il programma in forma compilata
su un disk file; questo riduce la lunghezza del programma ed aumenta la
velocità di esecuzione.
L'editor ha in sè tutte le caratteristiche
di un word-processor ed infatti alcuni dei file di testo presenti sul dischetto
sono stati scritti usando l'editor.
Finestre
Il TrueBASIC si presenta con tre finestre: Command,
Source e Output con le quali è facile scrivere, eseguire e correggere
i programmi.
Source è la finestra nella quale viene scritto
il programma; l'editor a pieno schermo ed i menu fanno parte di questa
finestra.
Command è la finestra nella quale si inseriscono
i comandi basic in modo immediato per rilevare lo stato del sistema o per
le operazioni di debugging. Volendo conoscere, ad esempio, il valore della
variabile x, si apre la suddetta finestra, si scrive "Print x" e quindi
si preme <RETURN>. Il valore di x comparirà di seguito. Volete
una lista dei file presenti sul dischetto? Aprite la finestra Command,
scrivete "Files" e quindi date <RETURN>. Il TrueBASIC immediatamente
vi mostrerà i file della directory corrente. Qualsiasi comando del
TrueBASIC può venir digitato nella finestra Command.
La finestra Output è quella dove appare l'uscita
del vostro programma. Normalmente questa finestra è chiusa finché
non si esegue un programma in TrueBASIC. Allora essa viene aperta ed il
risultato del programma, testo e grafica, appare sullo schermo. La finestra
può venir aperta anche manualmente e mantenuta aperta mentre si
edita un programma nella finestra Source.
I programmi in TrueBASIC possono gestire fino a
dieci finestre aperte contemporaneamente sullo schermo. Queste finestre
possono contenere testo o grafica od entrambi. Solo una finestra alla volta
risulta attiva ma è il programma che decide in quale finestra lavorare
e in che momento.
Programmare in TrueBASlC
Se siete abituati a programmare in AmigaBASIC o MicrosoftBASIC
rimarrete sorpresi dalla facilità d'uso del TrueBASIC. Usando questo
linguaggio il programma SpaceZap è stato scritto in un pomeriggio.
Il programma gestisce suoni, grafica e imput da mouse in meno di 100 linee!
Questo programma può girare su qualsiasi computer con il TrueBASIC
mentre la versione con l'AmigaBASIC può funzionare solamente con
l'Amiga. Per scrivere un programma equivalente in AmigaBASIC si sarebbe
dovuto usare lo Sprite editor per creare uno sprite ed il numero delle
linee sarebbe stato notevolmente maggiore.
Il TrueBASIC possiede molti comandi tradizionali
del Basic ma ne comprende anche molti di inediti quali:
Il comando MAT, prefissato ad un comando BASIC,
permette di manipolare i dati di un array senza creare un loop.
MAT READ - Opera come il tradizionale comando READ
con la differenza che esso legge tutti gli elementi di un comando DATA
e li pone in un array finché l'array stesso non è completo,
e tutto questo senza ricorrere ad un ciclo FOR/NEXT. Ad esempio:
! Legge i mesi ed i giorni
! della settimana
! dim mesi$(12), giorni$(7)
mat read mesi$, giorni$
data gennaio,febbraio,marzo,aprile, ...
data lunedi, martedi, mercoledi ...
end
MAT PRINT visualizza tutti gli elementi di un array.
Esempio:
! Stampa una piccola lista
!
dim a(10)
for i = 1 to 10 ! carica l'array
iet a(i) = i ! con questo loop
next i
mat print a ! stampa l'intero
array
end
PICTURE è il comando che permette di definire una
figura grafica e richiamarla come una subroutine. Picture può avere
anche dei parametri in modo da rendere possibile delle variazioni ogni
volta che il comamdo viene usato. Esempio:
! Figura di un poligono
!
picture poligono(lati)
for i =0 to lati
! determina
let u = 2*Pi*(i/lati) ! i vertici
plot Cos(u),Sin(u);
! e traccia
next i ! i lati
plot
end picture
set window-1 ,1,-1,1
! def. area disegno
for n =3 to 10
! poligoni da 3-10 lati
draw poligono(n)
! disegna poligono
next n
end
TRANSFORMS è un comando per modificare completamente
una figura prima di disegnarla. Il TrueBASIC prevede ben cinque funzioni
per trasformare un disegno:
Shift(a,b) - muove la figura. Ogni punto (x,y) viene
spostato al punto (X + a,v + b); Scale(a) - varia la scala del disegno.
Ogni punto (x,y) si ritrova in (x*a,y*a)
Scale (a,b) - come Scale(a) con la differenza che
il punto disegnato in (x,y) va a finire in (x*a,y*b);
Rotate(a) - ruota la figura di (a) radianti (o gradi)
in senso orario attorno alle coordinate di origine della finestra;
Shear(a) - inclina tutte le linee verticali del disegno
in senso orario di (a) radianti o gradi. Il punto che si trova in (x,y)
viene spostato alla locazione (x + y *tan(a),y).
La trasformazione può venir applicata anche
agli array consentendo una facile manipolazione degli stessi.
ON-LINE HELP
Il TrueBASIC dispone di ulteriori facilitazioni nell'uso
dell'help. Per richiamarlo basta digitare 'Help<CR>' nella finestra
Command o premere il tasto help. Comparirà una richiesta; selezionare
l'item per il quale servono le informazioni con un doppio click (o digitare
le prime lettere del comando); si aprirà una finestra con il messaggio
di help richiesto.
PLOT. Qualsiasi punto dello schermo può essere
indirizzato usando il comando
'Plot x,y'
Volendo indirizzare più punti si userà
'Plot points: x1,y1;x2,y2;...'
Per disegnare linee tra i punti basta aggiungere
il carattere ";" dopo le coordinate di ogni singolo punto
'Plot xl,yI;x2,y2; ...'
Per riempire un'area delimitata da punti usare il
comando
'Plot Area:xl ,yl ;x2,y2; ...'
Il colore usato sarà quello corrente. Il comando
Plot combinato con il comando Window consente di realizzare dei grafici
molto velocemente e senza sforzo. Per la rappresentazione del grafico è
necessario fornire innanzi tutto i valori di riferimento per gli assi cartesiani.
Ad esempio, volendo disegnare un grafico che rappresenta il numero di automobili
costruite in Italia, ogni cinque anni, negli ultimi trent'anni, si deve
definire una finestra con il margine sinistro al valore 1958 ed il margine
destro al valore 1988; il margine superiore potrà essere di 10 milioni
mentre il margine inferiore sarà pari a 0. Una volta definita la
finestra in questo modo si userà il comando plot, per l'inserimento
dei punti significativi o il tracciamento delle linee, inserendo i valori
delle coordinate x e y direttamente in anni e in milioni di automobili
e non in pixel come normalmente siamo abituati a fare.
Il linguaggio TrueBASIC permette
di far uso anche delle librerie. Questo significa che se, ad esempio, avete
una routine che usate frequentemente nei vostri programmi, potete sistemarla
in una libreria e poi chiamarla da programma. (Queste librerie non hanno
niente a che vedere con le librerie dell’Amiga, esse sono proprie del TrueBASIC).
Verso e da le librerie possono essere passati valori e variabili; questo
semplifica moltissimo la programmazione. Si possono scrivere e correggere
diversi moduli indipendentemente uno dall'altro e quindi linkarli con un
altro programma per produrre un programma completo.
Il package
Non rimarrete certo delusi nell'aprire la confezione
del TrueBASIC. Troverete infatti: due dischetti, contenenti uno il programma
principale e l'altro numerosi esempi di programmi, e due manuali: the User's
Guide e the Reference Manual. Entrambi i manuali sono rilegati con spirale
e pubblicati da Addison Wesley: lo stesso editore degli eccellenti Amiga
reference manuals.
L'User's Guide è rivolto ai neofiti del Basic;
il manuale infatti è una guida rapida per chi deve imparare a programmare
con questo linguaggio; ogni comando è spiegato chiaramente ed è
fornito di numerosi esempi.
Il Reference manual è invece rivolto ai programmatori
già esperti che vi troveranno specifiche informazioni su ogni comando
del TrueBASIC. Ogni capitolo del libro descrive nel dettaglio un diverso
aspetto del linguaggio, dalla grafica al trattamento degli errori, ed è
corredato di numerosi esempi. Nel manuale sono trattati concetti avanzati
come l'assemblaggio di routine, la manipolazione grafica, il trattamento
dei file e la compatibilità con i vari dialetti Basic.
In conclusione il TrueBASIC è veramente un
programma accurato, di uso immediato ed esente da errori. Un semplice test
consistente nel conteggio da uno ad un milione ha evidenziato una velocità
almeno due volte superiore a quella dell’Amiga- Basic.
Per il TrueBASIC sono disponibili un certo numero
di librerie esterne di programmi. Tra queste ricordiamo 3D graphics, PC
BASIC converter per tradurre da altri dialetti Basic, Communications Support,
Sorting and Searching, Advanced String Library e diverse altre. L'Amiga
Developers Toolkit comprende routine per grafica avanzata e gestione di
suoni, routine per animazioni avanzate e accesso a tutte le funzioni di
sistema. All'articolo sono acclusi due semplici programmi per illustrare
la semplicità d'uso e le possibilità offerte dal linguaggio.
SpaceZap
SpaceZap è stato scritto per valutare se il
TrueBASIC supporta un buon livello di routine grafiche; con esso infatti
non è possibile gestire gli sprite. È risultato comunque
che il TrueBASIC dispone di una buona qualità grafica ed usando
il comando Plot Area in unione con la funzione Picture è possibile
simulare gli sprites come è stato fatto in questo programma.
Orbits
Orbits è un piccolo programma che era stato
scritto originariamente per un computer Atari. Esso dimostra come sia facile
convertire al TrueBASIC, programmi scritti in altri dialetti Basic e per
altri computer.
Orbits permette di definire la gravità e
la posizione di un massimo di dieci oggetti; il programma poi calcola e
visualizza ogni oggetto in relazione a tutti gli altri.
Il programma è stato convertito abbastanza
facilmente. Tutte le formule matematiche sono state trasferite intatte.
Le uniche variazioni riguardano le dimensioni dello schermo e l'indirizzamento
dello stesso con i comandi Window e Plot. Questi ultimi sono stati adattati
per sfruttare il vantaggio di una maggiore risoluzione e di un numero più
elevato di colori disponibili.
! SpaceZap
!
! Implementazione in TrueBasic !
! di Amiga magazine
!
! Marzo 1988
!
!
!
!
!
INPUT prompt "Livello di abilita' (0-5) ":skill ! livello
di abilità
LET skill=skill/5
SET back "black"
! sfondo al nero
SET window -500,500,-500,500 ! dimensiona schermo
LET ox=100
! posizione x iniziale della nave
LET oy=100
! posizione y iniziale della nave
LET a=9
LET shots=1
!
! disegna la nave
!
PLOT area:ox,oy+3*a;ox+2*a,oy-2*a;ox,oy;ox-2*a,oy-2*a;ox,oy+3*a
BOX KEEP ox-3*a,ox+3*a,oy+3*a,oy-3*a in ship$
! la forma della nave è posta in
CLEAR
! una variabile stringa
DO
LET tx=0
BOX SHOW ship$ at ox,oy
! disegna nave
BOX CLEAR ox,ox+6*a,oy+7*a,oy ! cancella nave
GET MOUSE: x,y,state ! senti mouse per
movimento nave
IF abs(ox+3*a)-10<0 then LET tx=tx+1
IF abs(oy+3*a)-10<0 then LET tx=tx+1
! plot x e y
IF state>0 then LET tx=tx+1 ! pulsante
di sparo premuto?
! conteggio colpi
IF state>0 then
! e suono dello sparo
FOR ss=1 to 3
SOUND 100,.03
SOUND 500,.03
NEXT ss
END IF
IF tx=3 then
! colpito ?
LET score=score+1
! se sì, incrementa score
LET ki=ki+1
! e incrementa contatore skill
LET ex=rnd*50
! disegna esplosione
SET color "red"
FOR i=1 to ex
IF i>(ex/2) then
SET color "yellow"
PLOT 0,0;rnd*100,rnd*100
PLOT 0,0;-rnd*100,-rnd*100
PLOT 0,0;-rnd*100,rnd*100
PLOT 0,0;rnd*100,-rnd*100
NEXT i
CLEAR
SET color "white"
PRINT "Shots";shots
! stampa colpi
PRINT "Kills";score
! stampa punteggio
PRINT "Skill";skill*5
! stampa livello
LET ox=(rnd*1000)-500
! pos. x per nuova nave
LET oy=(rnd*1000)-500
! pos. y per nuova nave
END IF
IF x1<>x then LET mx=x+x1
! nave mancata, calcola x
IF y1<>y then let my=y+y1
! nave mancata, calcola y
LET ox=ox-mx/50
LET oy=oy-my/50
IF state>1 then
GET MOUSE:N1,n2,null
! reset pulsante di sparo
SET color "red"
! cambia colore puntatore
LET shots=shots+1
! aumenta di uno i colpi
END IF
PLOT 0,0
! disegna puntatore nel colore corrente
PLOT 50,0;100,0 ! bianco se
non sparo
PLOT -50,0;-100,0 ! rosso se sparo
PLOT 0,50;0,100
PLOT 0,-50;0,-100
IF state>1 then SET color "white" ! Sparo? cambia
colore
IF ki>4 then
! se più di 4 colpiti al livello scelto
LET skill=skill+.2 ! incrementa
skill level di 1
LET ki=1
END IF
LET x1=x
LET y1=y
LET ox=ox+(skill*(rnd*35)) ! plot manovra evasiva
nave
LET oy=oy+(skill*(rnd*35)) ! in base al livello
di abilità
LET ox=ox+(skill*(-rnd*35)) ! più alto
il livello
LET oy=oy+(skill*(-rnd*35)) ! più si
muove la nave
IF oy>490 then LET oy=490
IF oy<-490 then LET oy=-490
IF ox>490 then LET ox=490
IF ox<-490 then LET ox=-490
LOOP
END |
! Orbits
!
! Implementazione in TrueBasic !
! di Amiga Magazine
!
! Aprile 1988
!
!
!
!
!
!
!
SET mode "high16" ! grafica
in alta risoluzione
SET window -500,500,-500,500
! origine al centro dello schermo e
SET color "blue"
! schermo di larghezza ed altezza di
SET back "black"
! 1000 punti
DO while t<2 or t>10 ! numero degli
oggetti
PRINT "Numero degli oggetti orbitanti (massimo 10)";
INPUT t
LOOP
!
! definizione array
!
DIM G(10),X(10),Y(10),U(10),V(10),R(10)
!
! valori per tutti gli oggetti
!
FOR i=1 to t
PRINT "Per oggetto orbitante n. ";i !valore gravità
PRINT "Gravità=";
INPUT G(i)
let R(i)=G(i)/5
PRINT "Coordinata X="; ! coordinata
X iniziale
INPUT X(i)
PRINT "Coordinata Y="; ! coordinata
Y iniziale
INPUT Y(i)
PRINT "X-velocità="; ! valore velocità
X
INPUT U(i)
LET U(i)=(U(i))/100
PRINT "Y-velocità=";
! valore velocità Y
INPUT V(i)
LET V(i)=(V(i))/100
NEXT i
CLEAR
!
! calcola e definisci i punti
!
DO
FOR i=1 to t
FOR j=1 to t
IF i<>j then
LET X1=X(j)-X(i)
LET Y1=Y(j)-Y(i)
LET D2=X1*X1+Y1*Y1
LET G1=G(j)/(D2*sqr(D2))
LET U(i)=U(i)+G1*X1
LET V(i)=V(i)+G1*Y1
END IF
NEXT j
IF i=1 or i=9 then SET color "blue"
IF i=2 or i=10 then SET color "white"
IF i=3 then SET color "red"
IF i=4 then SET color "yellow"
IF i=5 then SET color "green"
IF i=6 then SET color "cyan"
IF i=7 then SET color "magenta"
IF i=8 then SET color "brown"
box circle X(i)-(R(i)/2),X(i)+(R(i)/2),Y(i)-
(R(i)/2),Y(i)+(R(i)/2)
!PLOT X(i),Y(i);
! plot prima posizione
LET Y(i)=Y(i)+V(i)
LET X(i)=X(i)+U(i)
box circle X(i)-(R(i)/2),X(i)+(R(i)/2),Y(i)-
(R(i)/2),Y(i)+(R(i)/2)
!PLOT X(i),Y(i)
! plot seconda posizione
NEXT i
! CLEAR
! rimuovere "!" per cancellare le tracce
LOOP
END |
|