GNU Octave
開発の経緯
開発が始まったのは1988年ごろである。当初は化学反応器設計の授業で使うために作られたが、その後1992年から、ジョン・イートン (John W. Eaton) が開発を始めた。彼による最初のアルファ版のリリースは1993年1月4日で、正式版 (ver. 1.0) は翌年、1994年2月17日にリリースされた。2007年12月21日にバージョン3.0が、2015年5月29日にはバージョン4.0がリリースされた。
Octaveという名前は、イートンの指導教官であり、裏紙にでも軽く書いてやるような概算の計算 (back-of-the-envelope calculation) が速かった元オレゴン州立大学教授のオクターブ・レヴェンシュピール（Octave Levenspiel、反応工学）にちなむ。
当初の目的である個人的な計算機としての利用に加え、Octaveは学術的及び工業的な用途にも使われている。例えば米国ピッツバーグ・スーパーコンピューティング・センター (Pittsburgh supercomputing center) では大規模並列計算による社会保障番号の攻撃に対する脆弱性検証に、Octaveを使っている。
ユーザインタフェースは永らくCUIのみであったが、3.8.0からはGUIが搭載された。
計算機言語としての Octave
Octaveを操作するための命令系統は、計算機言語でもある。OctaveはC言語のような構造化言語であり、C言語の標準ライブラリに含まれる多くの関数がOctaveでも実装されている。またUNIXのシステムコールもいくつか利用できる。しかし関数呼び出しの際の、引き数値の参照渡しはサポートされていない。
Octave言語で書かれたプログラムは、関数呼び出しの並びで構成されるスクリプトである。その文法は行列計算が基本であり、スクリプトにおいては行列計算の演算子が多数利用できる。多種多様なデータ構造を利用できる他，3.2以降のバージョンでは，オブジェクト指向プログラミング機能が付加された。
Octaveの文法はMATLABのものと非常によく似ており、少し注意してプログラミングすることでOctaveとMATLABの両方で実行できるスクリプトを書くことができる。
OctaveはGNU General Public Licenseによって公開されているため、その改変、複製、利用は自由である。Octaveは多くの UNIXやUnix系のプラットフォーム、macOS、Windows で実行できる。
関数名、変数名の補完
対話的に実行中のOctaveのコマンドラインでタブを入力すると、関数名、変数名、ファイル名の入力を補完する（Bashのタブ補完 (en) と同様の機能）。その時点でカーソルの直前に入力されているテキストを補完する。
ヒストリ機能
対話的に実行中のOctaveでは、それまでに入力されたコマンドラインが保存されており、必要に応じて修正して再実行できる。
データ構造
Octaveではユーザーがデータ構造をある程度定義できる。たとえばスカラー、行列、文字列の変数を持つ構造体を以下のようにして定義できる。
octave:1> x.a = 1; x.b = [1, 2; 3, 4]; x.c = "string";
octave:2> x.a
ans =  1
octave:3> x.b
ans =

   1   2
   3   4

octave:4> x.c
ans = string
octave:5> x
x =
{
  a =  1
  b =

     1   2
     3   4

  c = string
}
条件判定のショートカット
Octaveで条件判定に使われる論理演算の二項演算子、'&&' および '||' が評価されるときには、短絡評価が行われる（C言語の場合と同様）。一方、条件判定に '&' および '|' 演算子を使った場合は短絡評価は行われない。
インクリメントおよびデクリメント演算子
OctaveにはC言語と同様の '++' および '--' 演算子があり、やはりC言語と同様に変数の前及び後ろに置くことができる。変数値の増減後に代入を行う '+=' および '-=' 演算子もある。
Unwind-protect
OctaveではLISPの 'unwind_protect'を実装しており、それによる例外処理を記述することができる。unwind_protectブロックはOctaveでは以下のように書かれる。
unwind_protect
   bodyunwind_protect_cleanup
   cleanupend_unwind_protect
Octaveでは一般的に、ブロックの終端は 'end' キーワードで示される（MATLAB と互換である）が、'end_block' でも示すことができる。'unwind_protect' ブロックでも 'end' に加えて 'end_unwind_protect' を使うことができる。
unwind_protectのcleanup部は、常に実行される。body部で例外が発生した場合は、その時点でcleanupが実行され、 'unwind_protect' ブロックの残りの部分が評価されることはない。
Octaveでは他の例外処理も使える（MATLAB との互換性を持たせるため）。
try
   bodycatch
   exception_handlingend
この 'try' と 'catch' を使う例では 'unwind_protect' ブロックと違い、例外がbody部で発生したときにのみexception_handlingが実行される。またexception_handlingの実行後は、 'rethrow( lasterror )' 文がexception_handling部に記述されていない限りは、'try' ブロックの例外発生場所以降の部分が評価されることはない。
個数が可変の引数
Octaveでは関数の引数について、その個数の上限を指定することなく可変としておくことができる。引数が0個以上であることを指定するには、vararginを引数として指定する。vararginは、引数リストの最後に置くか、または唯一の引数として指定する。
function s = plus (varargin)   if (nargin==0)
      s = 0;
   else
      s = varargin{1} + plus (varargin{2:nargin});
   endend
個数が可変の返り値
Octaveの関数は、varargoutを使うことで返り値の数が実行時に決まるように記述できる。
function varargout = multiassign (data)   for k=1:nargout
      varargout{k} = data(:,k);
   endend
C++との統合
C++ソースプログラムの中から直接、Octave の関数を呼ぶことができる。以下の例では、rand([10,1])というOctaveの関数呼び出しをC++のプログラムの中から行っている。
#include <octave/oct.h>...ColumnVector NumRands(2);NumRands(0) = 10;NumRands(1) = 1;octave_value_list f_arg, f_ret;f_arg(0) = octave_value(NumRands);f_ret = feval("rand",f_arg,1);Matrix unis(f_ret(0).matrix_value());