linguaggio per la didattica scientifica
cT è stato sviluppato presso la Carnegie Mellon University (Pittsburgh) fra il 1985 ed il 2000 per fornire agli studenti un facile strumento di programmazione in ambiente grafico, alternativo al più complesso e meno specializzato C. Gli sviluppatori furono David Andersen, Bruce Sherwood, Judith Sherwood, e Kevin Whitley.
cT è l’evoluzione del linguaggio TUTOR (1967) utilizzato per il sistema PLATO di didattica computerizzata, sviluppato presso l’Univerisità dell’Illinois. cT differisce dal predecessore per l’utilizzo dell’interfaccia grafica interattiva.
Il linguaggio, disponibile per Windows, Macintosh, e Linux, è stato usato nell’insegnamento della fisica realizzando modelli grafici animati di comportamento di sistemi fisici; la release attuale è la 3.0 e non sono previste nuove versioni: il gruppo di sviluppo si è orientato verso Python creando vPython un ambiente grafico 3D.
cT è un linguaggio fortemente tipizzato, i tipi di dato sono numeri e testi più i vari oggetti quali file, elementi grafici ecc. Il tipo marker individua sia semplici stringhe di caratteri, sia testi contenenti indicazioni stilistiche (grassetto, corsivo, font, colore ecc), caratteri di alfabeti non latini, ed immagini, ciò è reso possibile con l’utilizzo dell’editor integrato. Le variabili ambientali e le costanti, quali i colori, hanno nomi che iniziano per z ad eccezione dei caratteri di controllo quali cr, tab e di PI (greco).
Gli array sono multidimensionali, anche con dimensioni dinamiche, e possono avere l’origine degli indici variabile.
cT utilizza il caratteri di tabulazione come separatore fra istruzione ed operandi, la sintassi è, talvolta ridondante, l’assegnazione è ottenuta con le istruzioni calc e set con l’operatore :=:
calc y:=x:=x^2+2 $$ assegnazione dello stesso valore alle variabili x e y
$syntaxlevel 2 unit main $$ CT Version 3 i:x calc x:=1 do fact(7;x) write <|s,x|> factorial of 7 do fact(10;x) write <|s,x|> factorial of 10 unit fact(n;m) i:n,m outunit n <2 calc n:= n-1 calc m:=m*n do fact(n;m) |
L’istruzione compute variabile,marker opera la conversione in numero di un testo contenente un numero o una espressione numerica: compute cubo,"x^3". Per i testi, specie se su più righe, l’assegnazione è ottenibile tramite l’istruzione string variabile:
define m: marker1
string marker1
text with style like italic, bold
and red characters.
also formulas: Σ xi2 +2xi
\
E’ uno dei pochi linguaggi, relativamente moderni, in cui è permessa la moltiplicazione implicita fra costanti e variabili o fra operandi in parentesi:
calc x := 3(alpha + 7beta) {alpha+beta}[3y+7]
Si noti l’utilizzo libero dei vari tipi di parentesi.
Il linguaggio è dotato di operatori infissi aritmetici e logici, alcuni duplicati quali | e $or$, & e $and$. L’operatore NOT è ~ ma esiste anche la funzione not(). Ci sono operatori sui bit sempre con la bizzarra notazione $op$: $mask$, $union$ e $diff$ sono rispettivamente AND, OR e XOR. Da notare la possibilità, piuttosto rara nei linguaggi, di scrivere relazioni sintetiche: ok 4 < age < 99 invece di ok (4 < age) $and$ (age < 99).
Il linguaggio utilizza sia l’indentazione che le istruzioni di fine blocco, l’indentazione permette anche la continuazione su più righe di istruzioni quali write e string. L’istruzioni di confronto è la variante completa dell’if:
if ... elseif ... else ... endif, con in più un eventuale (e poco utile) outif [condizione].
I cicli sono realizzati dall’istruzione loop ... endloop.
Loop condizione realizza il while; con una variabile inizializzata, fine ed incremento si realizza il for. Le istruzioni outloop e reloop permettono rispettivamente l’uscita dal loop e la continuazione. Esiste anche case ... endcase basato su variabili numeriche.
cT possiede le usuali funzioni matematiche, trigonometriche e per generare numeri casuali, non sono previste funzioni dell’utilizzatore, ma solo procedure, eventualmente ricorsive, dette unit, che permettono il passaggio di parametri per valore o per referenza (10 + 10 parametri in totale); i parametri passati per valore devono precedere quelli passati per referenza, i due gruppi sono separati da ;. Le unit sono richiamabili come procedure col comando do, o referenziate, senza ritorno col comando jump.
Le eventuali definizioni delle variabili che precedono la prima unit, sono globali, ma devono essere espressamente richiamate nelle unit che le vogliono usare: merge,global: o merge,gruppo: dove gruppo è il raggruppamento di un insieme di variabili.
$syntaxlevel 2 define button: btn1,btn2,terminate unit Main color zred mode rewrite button terminate;1,200;60,220;x;"The End" button btn1;61,200;100,220;Handle;" Go ";3d button btn2;101,200;120,220;x;"Check";check loop pause 0.1,keys=touch(right:down) if zrightdown at ztouchx, ztouchy disk 10 end if outloop zbutton=terminate $$ exit loop endloop * jump TheEnd $$ exit from program unit Handle at 1,20 write Hello check <|s,zvalue(btn2)|> unit TheEnd color zgreen at 1,40 write See you later alligator |
cT è indirizzato alla grafica, sia di tipo scientifico che di disegno, sebbene grafica ed elaborazione simbolica non siano ai livelli di Matlab e simili. Vi sono istruzioni per accedere ad un punto dell’area grafica (at), per disegnare forme geometriche (draw, vector, box, disk, circle), comandi per il disegno cartesiano o polare (axes, vbar, hbar, labelx, labely, ecc). Molte istruzioni grafiche hanno una equivalente prefissata da r (relative). La posizione effettiva sulla superficie grafica è relativa alle coordinate indicate dall’istruzione rorigin ascissa,ordinata. La grafica si può salvare in formato Bitmap.
Gli strumenti per realizzare un interfaccia interattiva sono spartani sono disponibili menu, bottoni, radiobottoni, check box sliders e aree sensibili. Gli eventi sono gestibili da unit dichiarate nell’instanziazione dell’oggetto o tramite l’analisi di quale evento (timer, carattere di tastiera, oggetto cliccato), ha interrotto una istruzione pause inserita in un loop.
L’input output è variegato, esiste la gestione dei files, delle porte seriali, della comunicazione fra processi tramite socket. Per lo standard output sono disponibili write e show, questo in diverse varianti per visualizzare dati numerici; è possibile incorporare (embed) il comando show all’interno di testi nella forma <|carattere di controllo|> o <|s,...|> :
write PiGreco: <|cr|><|s,PI|>
Lo standard input riflette l’uso principale del linguaggio quale costruttore di sistemi didattici, il comando per immettere dati è arrow ... endarrow (il nome richiama la forma del prompt). Nel blocco sono possibili le istruzioni:
Esiste anche un limitato supporto della multimedialità[1]: il comando sound riproduce file .wav, il comando video riproduce video in formato QuickTime o Video for Windows.
I programmi cT possono essere interpretati o generare un codice intermedio eseguibile da un interprete apposito.
L’esempio che segue è la simulazione della temperatura raggiunta dopo il mescolamento di due gas con differente temperatura.
$syntaxlevel 2
* cT version 3 wtitle "Gas blendig temperature"
define i:red=4,blue=5 unit main merge,global: define f:x,y,dsk,gas(200,5) $$ x,y,dimension, heat (red and blue) i:count,mol1,mol2 button: waitb loop count := 1, 200 $$ gas generation . randu x,300 $$ 1 <=x<=300 . randu y,200 $$ 1 <=y<=200 randu dsk,2 $$ dimension 1 or 2 set gas(count,1) := x+3 $$ x position set gas(count,2) := y+3 $$ y position set gas(count,3) := dsk*2 $$ molecular dimension if count > 50 set gas(count,red) := 100 $$ red set gas(count,blue) := 0 $$ blue else set gas(count,red) := 0 $$ red set gas(count,blue) := 100 $$ blue endif endloop at 110,220 write initial gas heat at 445,220 color rgb,50,0,50 write final gas heat rorigin 5,5 do graph(;gas) * start simulation loop count := 1, 2000 $$ simulation randu mol1,200 randu mol2,200 set x := (gas(mol1,red)*gas(mol1,3)+gas(mol2,red)*gas(mol2,3))/2 set gas(mol1,red) := x set gas(mol2,red) := x set x := (gas(mol1,blue)*gas(mol1,3)+gas(mol2,blue)*gas(mol2,3))/2 set gas(mol1,blue) := x set gas(mol2,blue) := x endloop rorigin 320,5 do graph(;gas) $$ sub for * unit graph(;temp) $$ unit for draw gas model merge,global: i:left,top,right,bottom float:temp(*,*) define i:count rbox 0,0;305,205 loop count := 1, 200 color rgb,temp(count,red),0,temp(count,blue) . rat temp(count,1),temp(count,2) . rdisk temp(count,3) endloop
|