cT

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




[1] Ciò dipende ovviamente dalla mancata evoluzione del linguaggio.