# GNU Octave

GNU Octave è un'applicazione software per l'analisi numerica in gran parte compatibile con MATLAB.
Ha un insieme di funzionalità fornite per il calcolo matriciale come rango e determinante o specialistiche come decomposizione ai valori singolari (SVD), fattorizzazione LU; sebbene consenta di trovare la soluzione numerica di sistemi lineari non svolge calcolo simbolico o altre attività tipiche di un sistema di algebra computazionale.

## Storia

Il progetto fu concepito nel 1988 da John W. Eaton (primo manutentore) e da James B. Rawlings presso l'Università del Texas come strumento di calcolo per l'ingegneria chimica.
Il suo sviluppo vero e proprio partì da John W. Eaton nel 1992. La prima alpha pubblicata è datata 4 gennaio 1993 e il 17 febbraio 1994 fu distribuita la versione 1.0. La versione 3.0 è stata distribuita il 21 dicembre 2007.
Il linguaggio è così chiamato in onore di Octave Levenspiel (†2017), ingegnere chimico e professore alla Oregon State University, noto per la sua abilità nell'eseguire rapidi calcoli.

## Dettagli tecnici

* Octave è scritto in conformità dello standard POSIX nel linguaggio C++ usando le librerie Standard Template Library.
* Octave utilizza un interprete per il suo linguaggio di scripting.
* Octave è estendibile attraverso moduli o funzioni scritte dall'utente.
* Octave può lavorare assieme a gnuplot e Grace per disegnare funzioni, grafici, tabelle, consentendo di salvarli o stamparli.

## Octave, il linguaggio per scripting numerico

Il linguaggio di scripting di Octave supporta svariate librerie del C, e supporta inoltre diverse system calls e funzioni UNIX.
I programmi scritti con Octave sono degli script o liste di chiamate a funzioni. Il linguaggio dispone di diversi tipi di dati, oltre quello numerico esistono anche un tipo logico (true, false), uno di tipo stringa e strutture dati analoghe alle struct del linguaggio C. Esiste anche un altro tipo di dato molto potente ed è la matrice che consente molte operazioni di tipo matriciale. Il linguaggio di Octave non è un linguaggio orientato agli oggetti ma supporta le strutture dati, inoltre mette a disposizione varie strutture per il controllo del flusso, come i test logici if-else e switch ed i cicli while e do-until.
La sintassi è molto simile a quella di MATLAB, ed è possibile scrivere script che girano sia sotto Octave che su MATLAB.
Octave è distribuito sotto licenza GPL, e quindi può essere liberamente copiato e usato. Il programma gira sotto sistemi Unix e Linux, oltre che su Windows e macOS.

## Funzionalità distintive
### Completamento automatico dei comandi e dei nomi delle variabili

Digitare un carattere TAB nella riga di comando attiva in GNU Octave la ricerca di possibili completamenti della parte di comando già parzialmente digitata (in modo analogo al completamento automatico della shell Bash).

### Command history

Quando avviato in modalità interattiva, GNU Octave salva i comandi già eseguiti in un buffer interno così che essi possono essere richiamati ed editati.

### Strutture dati

GNU Octave include un limitato supporto per organizzare i dati in strutture. Ad esempio:

### Operatori booleani a corto circuito (short-circuit)

Gli operatori logici '&&' e '||' di GNU Octave sono valutati in modalità a corto circuito (come i corrispondenti operatori in linguaggio C), a differenza degli operatori '&' e '|', che agiscono elemento per elemento in vettori, matrici e array multi-dimensionali.

### Operatori incremento e decremento

GNU Octave include gli operatori C-like di incremento '++' e decremento '--', sia nella loro forma prefissa che in quella suffissale.

### Unwind-protect

GNU Octave supporta una forma basilare di gestione delle eccezioni, modellata sul costrutto unwind-protect del Lisp. La forma generale di un blocco unwind_protect ha questo aspetto:
Come regola generale, GNU Octave riconosce come terminazione di un dato blocco di codice 'block' sia la parola chiave 'end' (che è compatibile con il linguaggio MATLAB) che l'altra più specifica 'end_block'. Di conseguenza, un blocco 'unwind_protect' può essere terminato sia con la parola chiave 'end_unwind_protect' - come nell'esempio - sia in modo più portabile, con la parola chiave 'end'. Nell'esempio, la parte cleanup del blocco è sempre eseguita. In caso la parte body sollevasse un'eccezione, cleanup sarebbe eseguita immediatamente prima della propagazione dell'eccezione al di fuori del blocco 'unwind_protect'.
GNU Octave supporta anche un'altra forma di gestione delle eccezioni (compatibile con il linguaggio MATLAB):
Quest'ultima forma differisce da un blocco 'unwind_protect' per due motivi. Primo, la parte exception_handling viene eseguita soltanto nel caso in cui la parte body sollevi un'eccezione. In secondo luogo, dopo l'esecuzione di exception_handling, l'eccezione è considerata intercettata e gestita, e non viene propagata all'esterno del blocco (a meno che un comando 'rethrow( lasterror )' sia di proposito stato inserito all'interno del codice exception_handling).

### Liste di argomenti di lunghezza variabile

GNU Octave ha un meccanismo efficace per gestire funzioni che devono ricevere un numero arbitrario (non noto a priori) di argomenti, senza un limite superiore. Per indicare una lista di zero o più argomenti entranti in una funzione, si usa lo speciale argomento varargin, posizionato come ultimo (o solo) argomento nella lista:

### Liste di ritorno di lunghezza variabile

Una funzione può essere implementata in modo che ritorni al codice chiamante un qualsiasi numero di valori, usando come argomento di uscita la variabile speciale varargout. Ad esempio:

### Integrazione con il linguaggio C++

È anche possibile eseguire codice GNU Octave direttamente all'interno di un programma C++. Per esempio, di seguito è riportato un frammento di codice che chiama la funzione rand([10,1]) da C++, facendola interpretare da GNU Octave:

## Compatibilità con il linguaggio MATLAB

GNU Octave è stato progettato avendo tra gli obiettivi la compatibilità con il linguaggio MATLAB, e infatti esso condivide con MATLAB molte funzionalità:
* Le matrici come tipi di dato fondamentali.
* Il supporto nativo per i numeri complessi.
* Potenti funzioni matematiche native e ampie librerie di funzioni.
* Estensibilità, che assume la forma di funzioni definite dall'utente.
Rispetto al linguaggio MATLAB, esiste di proposito un insieme ristretto di differenze :
* Le righe di commento possono essere prefisse sia con il carattere # che con il carattere % (quest'ultimo compatibile col linguaggio MATLAB).
* Sono supportati vari operatori basati sul linguaggio C: ++, --, +=, *=, /=.
* È possibile accedere agli elementi di variabili temporanee (vettori, matrici o array multi-dimensionali) senza dover creare nuove variabili, come ad esempio in [1:10](3).
* Le stringhe di testo possono essere definite sia con il carattere " che con il carattere ' (quest'ultimo compatibile col linguaggio MATLAB).