FlightGear/Il linguaggio NASAL

Indice del libro

La maggior parte delle funzioni di FlightGear sono state programmate con il linguaggio Nasal (Not Another Scripting Language) scritto da Andy Ross nei primi anni del 2000, nel 2003 fu rilasciato sotto licenza GNU LGPL e dal quel momento ha subito vari sviluppi del codice sino al 2006 con l'ultima versione rilasciata di Nasal la 1.0.1. È un linguaggio abbastanza semplice da imparare, specie per chi ha già lavorato con altri linguaggi di scripting come Python, PHP, Perl e Java Script. Da questi linguaggi Nasal prende alcuni elementi di sintassi ed alcune soluzioni tecniche, cercando però di rimanere estremamente compatto e con un interprete minimale. Il motivo di tale scelta è quello di avere un linguaggio di programmazione leggero nella esecuzione e utilizzabile facilmente in ambienti multi-CPU., ove la sua leggerezza (146 KByte di codice), permette di caricare l'interprete direttamente su ognuna delle CPU senza ridurre le performance del sistema. Questo approccio è sicuramente importante per permettere a FlightGear di operare con efficienza nella simulazione di un aereo ove tanti sistemi devono funzionare in modo parallelo. Ad esempio Nasal gestisce il tempo locale ovvero le condizioni meteo che si trovano all'interno dell'area in cui vola il velivolo, ma nello stesso tempo altri processi Nasal sono operativi, come quelli che gestiscono alcuni dispositivi di bordo del velivolo, i dispositivi di interfacciamento alle periferiche come il Joystick e tante altri processi.

In breve Nasal ha queste caratteristiche:

  • È piccolo e leggero, il codice dell'interprete sta solo in 146 KByte.
  • Permette di avere variabili di tipo numero e stringa in struttura di vettori, liste hashes e scalari.
  • Ha una sintassi orientata agli oggetti (OOP).
  • Ha uno stile di programmazione funzionale.
  • Ha un modello completo di Garbage collection.
  • Permette di definire i processi sotto forma di Thread tra di loro ben isolati.
  • Per essere un interprete ha una velocità di esecuzione elevata in quando il codice intermedio (PCode) è piuttosto efficiente.
  • Sostituisce efficacemente il linguaggio di programmazione C++ quando non vi sono criticità nella velocità di esecuzione.
    C'è da aggiungere che Nasal viene utilizzato spesso in FlightGear per scrivere velocemente e testare delle nuove funzionalità, poi se si scoprono esserci dei colli di bottiglia nelle prestazioni del sistema, può subentrare una sostituzione, normalmente di tipo parziale, del codice in C++.
  • Le performance sono veramente interessanti, a livello di Garbage collection Nasal supera le applicazioni in Perl, mentre a livello di calcolo numerico è nettamente migliore rispetto al Python.

Integrazione con FlightGear

modifica

L'integrazione di una applicazione Nasal avviene per mezzo di uno script XML ad esempio nella forma:

  <binding>
    <command>nasal</command>
    <script>
      print("Binding Invoked!");
    </script>
  </binding>

Ove il tag <binding> indica che ci sarà una unione (binding) tra i dati presenti nello script è il comando successivo che sarà espresso con uno script Nasal ovvero <command>nasal</command>. A questo punto inizia lo script in Nasal <script>print("Binding Invoked!");</script>.

getprop() and setprop()

modifica

Per comunicare i dati tra l'ambiente che invoca e lo script Nasal è possibile utilizzare diverse tecniche, la più semplice è di avvalersi dell'albero globale delle proprietà, ovvero di quella struttura accennata al cap (...) che contiene tutte le variabili globali definite nel programma FlightGear. Per fare questo si utilizzano due funzioni getprop() e setprop(). Ad esempio:

  setprop("/sim/bar", getprop("/sim/foo"));

Un esempio più complesso si può con questo esempio, ove la variabile temporanea ThisAircraft è una stringa che servirà a puntare le proprietà dell'velivolo. La funzione setprop in questo caso porrà nella proprietà rashed il valore 0, quindi avremo il seguente codice Nasal:

  ThisAircraft = "/sim/my/aircraft/properties";
  setprop(ThisAircraft, "crashed", 0);

Riferimenti

modifica