アドレス演算は、 配列やレコード(see Structures)やオブジェクト(see Object-oriented Forth)のようなデータ構造を構築可能な基礎基盤です。
標準 Forth では、 データ型のサイズは規定されていません。 代わりに、 サイズを計算したりアドレス演算を行うための多数のワードが提供されます。
アドレス演算はアドレス単位(au;Address Unit, aus;Address UnitS)で実行されます。 ほとんどのシステムでは、
1アドレス単位は 1 バイトです。 注意: 1 つの文字に複数 au が含まれる可能性があるため、 chars
は何もしない(noop)訳ではないことに注意してください(noop であるプラットフォームでは、 chars は何もコンパイルしません)。
基本的なアドレス算術ワードは + と - です。 たとえば、 セルのアドレスがわかっている場合、 1 cells
+ を実行すると、 次のセルのアドレスがわかります。
標準 Forth では、 特定の型のアドレスをアライメントするためのワードも定義されています。 多くのコンピュータでは、 特定のデータ型へのアクセスは特定のアドレスでのみ行われる必要があります。 たとえば、 セルは 4 で割り切れるアドレスでのみアクセスできます。 マシンが非アライメント・アクセスを許可する場合でも、 通常はアライメント・アクセスの方が高速に実行できます。
パフォーマンス重視で行く場合: 通常、 アライメント操作はデータ構造の定義中にのみ必要であり、 (より頻繁な)データ構造へのアクセス中には必要ありません。
標準 Forth では、 文字のアドレス・アライメント用ワードは定義されていません。 Forth-2012 では、すべてのアドレスが文字単位でアライメントされています(all addresses are character-aligned)
標準 Forth は、 CREATE されたワードによって返されるアドレスがセル・アライメントされていることを保証します。
さらに、Gforth は、 これらのアドレスがあらゆる目的に合わせてアライメント済みであることを保証します(addresses are
aligned for all purposes)。
注意: 標準の Forth ワード char はアドレス演算とは何の関係もないことに注意してください。
chars ( n1 – n2 ) core “chars”
n1 文字(char)が何アドレス単位になるかを n2 に返します。
char+ ( c-addr1 – c-addr2 ) core “char-plus”
1 chars +.
char- ( c-addr1 – c-addr2 ) gforth-0.7 “char-minus”
cells ( n1 – n2 ) core “cells”
n1 個のセルのアドレス単位の数を n2 に取得します。
cell+ ( a-addr1 – a-addr2 ) core “cell-plus”
1 cells +
cell- ( a-addr1 – a-addr2 ) core “cell-minus”
1 cells -
cell/ ( n1 – n2 ) gforth-1.0 “cell-divide”
n1 個のアドレス単位の幅の中に入れられるセルの数が n2 です
cell ( – u ) gforth-0.2 “cell”
定数 – 1 cells
aligned ( c-addr – a-addr ) core “aligned”
a-addr は、 c-addr 以上の最初にアライメントされたアドレスです。
floats ( n1 – n2 ) floating “floats”
n2 は n1 個の浮動小数点数(float)のアドレスユニットの数です。
float+ ( f-addr1 – f-addr2 ) floating “float-plus”
1 floats +.
float ( – u ) gforth-0.3 “float”
定数 – 浮動小数点数に対応するアドレスユニットの数。
float/ ( n1 – n2 ) gforth-1.0 “float-divide”
faligned ( c-addr – f-addr ) floating “f-aligned”
f-addr は、c-addr 以上の、 浮動小数点数にアライメントされた最初のアドレスです。
sfloats ( n1 – n2 ) floating-ext “s-floats”
n2 は、 n1 個の単精度 IEEE 浮動小数点数のアドレス単位の数です。
sfloat+ ( sf-addr1 – sf-addr2 ) floating-ext “s-float-plus”
1 sfloats +.
sfloat/ ( n1 – n2 ) gforth-1.0 “dfloat-divide”
sfaligned ( c-addr – sf-addr ) floating-ext “s-f-aligned”
sf-addr は、 c-addr 以上の、 最初の単精度浮動小数点数アライメント・アドレスです。
dfloats ( n1 – n2 ) floating-ext “d-floats”
n2 は、 n1 個の倍精度 IEEE 浮動小数点数のアドレス単位の数です。
dfloat+ ( df-addr1 – df-addr2 ) floating-ext “d-float-plus”
1 dfloats +.
dfloat/ ( n1 – n2 ) gforth-1.0 “sfloat-divide”
dfaligned ( c-addr – df-addr ) floating-ext “d-f-aligned”
df-addr は、 c-addr 以上の、 最初の倍精度浮動小数点数アライメント・アドレスです。
maxaligned ( addr1 – addr2 ) gforth-0.2 “maxaligned”
addr2 は、 すべてのアライメント制限を満たす addr1 以上の最初のアドレスです。
cfaligned ( addr1 – addr2 ) gforth-0.2 “cfaligned”
addr2 は、 addr1 以上の最初のアドレスで、 コード・フィールド用にアライメントされています(つまり、 対応する本体(body)が maxalign されるようにします)。
*aligned ( addr1 n – addr2 ) gforth-1.0 “*aligned”
addr1 以上で、 n でアライメントされた(n で割り切れる)アドレスを addr2 に返します。
*align ( n – ) gforth-1.0 “*align”
here を n で割り切れるアドレスにアライメントします。
waligned ( addr – addr’ ) gforth-1.0 “waligned”
Addr’ は、 addr 以上、かつ、次の偶数アドレスです。
walign ( – ) gforth-1.0 “walign”
here を 偶数アドレスにアライメントします。
laligned ( addr – addr’ ) gforth-1.0 “laligned”
Addr’ は、 addr 以上、 かつ、 4 で割り切れるアドレスです。
lalign ( – ) gforth-1.0 “lalign”
here を 4 で割り切れるアドレスにアライメントします。
xaligned ( addr – addr’ ) gforth-1.0 “xaligned”
Addr’ を addr 以上、 かつ、 8 で割り切れるアドレスにします。
xalign ( – ) gforth-1.0 “xalign”
here を 8 で割り切れるアドレスにアライメントします。
環境クエリ address-unit-bits (see Environmental Queries) と、 以下のワード群は、
バイトアドレスを持たないマシン(non-byte-addressed machines)に移植可能なソフトウェアを作成したい人に役立つかもしれません。
/w ( – u ) gforth-0.7 “slash-w”
16ビット値に必要なアドレス単位
/l ( – u ) gforth-0.7 “slash-l”
32ビット値に必要なアドレス単位
/x ( – u ) gforth-1.0 “slash-x”
64ビット値に必要なアドレス単位