stanford-oval/wikipedia huggingface dataset:
Forth
プログラマの観点

→「逆ポーランド記法」も参照
Forthの後置記法は、データスタック（オペランドスタック、以下単にスタックと呼ぶ）を意識的に操作しなければならないというForthの特徴と密接に結びついている。すなわち、オペランドはそのままスタックに積まれ、後から現れる演算子などはスタックからそれを取り出して演算し、結果をスタックに積む、といったように動作する。多くの言語と違い、バッカス・ナウア記法で構文が定義されているわけでもなく、伝統的にはコンパイラは、スレッデッドコードと呼ばれるシンプルな構造の目的コードを直接生成するだけである。また、文法の修正のような、多くの言語では実装の内部に手を入れる変更が必要なことが、Forthではそのようなワードを定義することで可能である（これは、Lispのマクロに少し似ている）。なお、データスタックの他にリターンスタックがあり、そちらはワードの呼出しの後で手続きを再開するアドレス等が積まれるスタックである（CPUのいわゆるスタックに似ている）。
たとえば、25 * 10 + 50 は、次のように入力して計算する（「⏎」は、改行の入力。「ok」はForth処理系が結果の出力の後に付けるプロンプト）。
25 10 * 50 + . ⏎
300 ok
まず最初に数値 25 と 10 がこの順でスタックに積まれる。
ワード * がスタックの一番上にあるふたつの数を乗算し、その積に置き換える。
それから数値 50 をスタックに積む。
ワード + がこれに先ほどの積を加算する。最後に、. コマンドがスタックのトップを取り出して、それを、ユーザの端末に結果として出力する。
4 5 + .
これは、スタックに4を積み、さらに5を積み、スタック上の2つの値を取り出して加算、その結果をスタックに戻し、スタックの値を表示する操作を示している。
上記のように入力してエンター（⏎：リターン）を打鍵すると、画面上には下記のように結果が表示される。
4 5 + .  ⏎
9 ok
Forth の構造化機能でさえもスタックベースである。たとえば、
: FLOOR5 (n -- n')   DUP 6 < IF DROP 5 ELSE 1 - THEN ;
このコードは 次のコマンドを使うことによって FLOOR5 が呼ばれる新しいワード（繰り返すが、「ワード」という用語はサブルーチンとして使われている）を定義する。DUPはスタックの数値を複製する。6がスタックの一番上に 6 を配置する。ワード < はスタックの一番上の二つの数（6 と DUP で複製された入力の値）を比較し、真偽値で置き換える。IFは真偽値をとり、その直後のコマンドを実行するか、ELSEまでスキップするかを選択する。DROPはスタックの上の値を放棄する。そして、THENは条件分岐の終端である。括弧に囲まれたテキストは、このワードが期待するスタックの数と値を返すかどうかを説明するコメントである。ワード FLOOR5 はC言語で書かれた次の関数に相当する。
int floor5(int v) { return v < 6 ? 5 : v - 1; }
この関数はより簡潔につぎのように書かれる。
: FLOOR5 (n -- n') 1- 5 MAX ;
このワードは次のように実行できる。
1 FLOOR5 . ⏎
5 ok
8 FLOOR5 . ⏎
7 ok
最初にインタプリタは数値 1（もしくは 8）をスタックにプッシュし、それからこの数値を再びポップし結果をプッシュする FLOOR5 を呼び出す。最後に、「.」の呼び出しは値をポップし、ユーザの端末にそれを表示する。
機能

Forthには公式の文法仕様はない。代わりに、簡単なアルゴリズムによって定義される。インタプリタは、ユーザ入力デバイスからの入力行を読み取り、その後、空白を区切り文字としてワード (words) を構文解析する。一部のシステムは、追加の空白文字を認識する。インタプリタがワードを見つけると、そのワードをディクショナリ (dictionary) から検索する。ワードが見つかった場合、インタプリタはそのワードに関連付けられたコードを実行し、その後、入力ストリームの残りを解析する。ワードが見つからない場合、ワードは数値と見なされ、数値に変換し、スタックにプッシュしようとする。変換に成功した場合、インタプリタは入力ストリームの構文解析を続行する。それ以外の場合、検索と数値変換の両方が失敗した場合、インタプリタはワードをエラーメッセージと共に出力し、入力ストリームをフラッシュして新しいユーザ入力を待機する。
新しいワードの定義は、ワード :（コロン）で始まり、ワード ;（セミコロン）で終了する。たとえば、
: X DUP 1+ . . ;
とすると、ワード X がコンパイルされ、ディクショナリで見つけることができるようになる。コンソールから 10 X と入力して実行すると、11 10 と表示される。
Forthでは「+」や「.」などの演算子や出力機能などの全てがワードである。こういった組み込み済みのワードと、ユーザが後からコロン定義（コンパイラ）で追加したワードと、2つの間に本質的な差異はない。コンパイルしたワードはただちに環境に組み込まれ、インタプリタより単独で実行できるようになる。つまり、そのForth処理系を拡張するのである。このような点より、Forthは自己拡張性が高いと云われる。
プログラムの開発においては、処理毎に区切ってワードとして順次構築していくので、注意深く進めていけば自然ときれいに構造化されることになる。ワードは単独で実行できるため、部分に分けてのデバッグも容易である。また、それらのワードを使ってテスト用の処理（ワード）を気軽に作成して実行・テストできる。
ほとんどのForthシステムには、プロセッサの機能を使用してワードを記述するためのアセンブラが含まれている。Forthのアセンブラは、一般的に、命令のパラメータが命令の前に来る逆ポーランド構文を使用する。典型的な逆ポーランド構文のアセンブラは、オペランドをスタックに用意し、ニーモニックが命令全体をメモリにコピーする最後の手順としている。Forthのアセンブラは本質的にマクロアセンブラであり、Forthシステム内での役割に応じてレジスタのエイリアスを定義することが容易だ。例えば、データスタックポインタとして使用されるレジスタの場合、「dsp」というエイリアスを定義することができる。
機能 > オペレーティングシステムとファイル、マルチタスク

古典的な Forth システムでは伝統的にオペレーティングシステムもファイルシステムも使われない。コードはファイルに格納される代わりに、ソースコードは物理的なディスクアドレスに書かれたディスクブロックに格納される。ワード BLOCK はディスクスペースの1キロバイトサイズのブロックの数値からデータを格納しているバッファのアドレスへの変換に割り当てられ、Forth システムによって自動的に管理される。固定されたディスクブロック範囲にファイルが配置されるときには、システムのディスクアクセスが使われる実装もある。たいていはこれらはディスクブロックごとのレコードの整数をつかって、固定長バイナリレコードして実装される。高速な検索はキーデータ上のハッシュアクセスによって実現される。
マルチタスキングは、通常、協調的なラウンドロビン・スケジューリングが採用されるが、マルチタスキングのワードとサポートはANSI Forth標準ではカバーされていない。
ワード PAUSE は、次のタスクの配置や実行コンテキストのリストアための　現在のタスクの実行コンテキストの保存に使われる。どちらのタスクも自分自身のスタックやいくつかのコントロール変数のコピー、スクラッチエリアを持っている。タスクのスワップは単純で、効率的である。その結果、Forth マルチタスクは Intel 8051, Atmel AVR, and TI MSP430（英語版） のような非常に単純なマイクロコントローラでさえ有効である。
その一方で、Microsoft WindowsやLinux、Unixのようなホストオペレーティングシステムのもとで実行され、ソースやデータのファイルのためにホストオペレーティングシステムのファイルシステムを利用する Forth システムもある。ANSI Forth 規格では　I/O のために使われたワードについて書かれている。他の標準的でない機能はホスト OS やウィンドウシステムへのシステムコールを発行するためのメカニズムも含み、多くはオペレーティングシステムから提供されるスケジューリングを採用する拡張を提供する。典型的には、タスク作成、一時停止、解体、および優先順位の変更のために、スタンドアロンのForthの PAUSEワードとは大きくて異なったワードのセットを持っている。
機能 > セルフコンパイルとクロスコンパイル

すべてのソースコードとともに十分な機能を有する Forth システムは自身をコンパイルすることができ、Forth プログラマはこのようなテクニックを普通メタ・コンピレーション (meta-compilation) と呼ぶ（ただし、この用語は普通の定義であるメタコンピレーションとは厳密には一致しない）。通常の方法はコンパイルされたビットをメモリに配置する一握りのワードの再定義である。コンパイラのワードはメモリ内のバッファエリアにリダイレクトされることができるフェッチとストアの、特別に命名されたバージョンを使う。このバッファエリアはコードバッファというより異なるアドレスから始まるメモリ領域へのシミュレートやアクセスをする。このコンパイラは対象のコンピュータのメモリとホストの（コンパイルする）コンピュータのメモリの両方にアクセスするワードを定義する。
フェッチやストア操作がコード空間に再定義されたあと、コンパイラやアセンブラなどはフェッチやストアの新たな定義を使って再コンパイルされる。これはコンパイラとインタプリタのすべてのコードの効果的な再利用である。それから、Forth システムのコードはコンパイルされるが、このバージョンはバッファに格納される。このメモリ内のバッファはディスクに書きこまれ、これをテストのために一時的にメモリにロードする方法が提供される。新たなバージョンがきちんと機能するようなら、これは以前のバージョンに上書きされる。
異なる環境のためのバリエーションが多数存在する。組み込みシステム向けには、代わりに他のコンピュータのためにコードが書かれることになるが、このテクニックはクロスコンピレーションとして知られ、シリアルポートや単独の TTL ビット越しでさえ、その上オリジナルのコンパイルするコンピュータのワード名やディクショナリの他の実行されない部分も維持する。このようなForthコンパイラのための最小の定義は　バイト単位のフェッチやストアをするワードと、実行される Forth ワード を命令するワードである。しばしばもっとも多くの時間のかかるリモートのポートへの書き込みの部分は、フェッチやストア、実行を実装するための初期化プログラムの構築であるが、多くの現代的なマイクロプロセッサ（Motorola CPU32など）は、このタスクを排除する統合されたデバッグ機能を持っている。
言語の構造

Forthの基本的なデータ構造は、「ワード」を実行可能なコードや名前のつけられたデータ構造を対応させる「ディクショナリ」である。このディクショナリは、門番（通常は NULL ポインタ）が発見されるまで最も新しく定義されたワードから最も古いワードまで進むリンクを用いた連結リストのツリーとして、メモリに展開される。コンテキストスイッチは異なる葉で開始するためにリスト検索を引き起こす。首位のメインの幹への枝のマージは最終的にルートの門番へ戻ってくるので、連結リスト検索は継続する。そこはさまざまなディクショナリになることができる。メタコンピレーションのような稀なケースでは、ディクショナリは隔離されスタンドアロンである。この効果は名前空間のネストのそれに似ていて、コンテキストに依存するキーワードのオーバーロードが可能である。
定義されたワードは一般的にヘッドとボディからなり、ヘッドは名前フィールド (NF) とリンクフィールド (LF) からなり、ボディはコードフィールド (CF) とパラメータフィールド (PF) からなる。
ディクショナリのエントリのヘッドとボディは、隣接していないかもしれないので別々に扱われる。たとえば、Forth プログラムが新しいプラットフォームのために再コンパイルされたとき、ヘッドはコンパイルするコンピュータに残るかもしれないが、ボディは新しいプラットフォームに行ってしまっている。組み込みシステムのようないくつかの環境によっては、ヘッドは不必要にメモリを占有する。しかしながら、もしターゲット自身が対話的なForthをサポートすることを期待されるなら、クロスコンパイラによってはヘッドをターゲット内に配置するかもしれない。
言語の構造 > ディクショナリのエントリ

ディクショナリの厳密なフォーマットは規定されず、実装に依存する。しかしながら、いくつかのコンポーネントはほとんどいつも提示しており、しかし、厳密なサイズと順序は変わるかもしれない。記述された構造、ディクショナリエントリはこのように見えるかもしれない。
structure
  byte:       flag           \ 3bit flags + length of word's name
  char-array: name           \ name's runtime length isn't known at compile time
  address:    previous       \ link field, backward ptr to previous word
  address:    codeword       \ ptr to the code to execute this word
  any-array:  parameterfield \ unknown length of data, words, or opcodes
end-structure forthword
この名前フィールドはワードの名前の長さ（典型的には32バイト）を与えるプリフィックスで開始し、何ビットかはフラグ用である。それからワードの名前の文字表現がプリフィックスのあとに続く。特定のForth実装に依存するが、アラインメントのためひとつ以上の NUL ('\0') バイトがあるかもしれない。
リンクフィールドは以前に定義されたワードへのポインタを含む。このポインタは次に古い隣接するワードへの、相対的な変位かもしれないし、絶対的なアドレスかもしれない。
このコードフィールドポインタは　コードを実行するワードのアドレスか、パラメータフィールド内のデータか、プロセッサ直接実行するであろうマシンコードの開始のいずれかになるだろう。ワードを定義するコロンでは、コードフィールドポインタはリターンスタック上の現在の Forth 命令ポインタ (instruction pointer, IP) を保存し、ワードを実行継続するための新たなアドレスを用いてIP をロードするワードを指し示す。これはプロセッサの call/return 命令が行っているのと同様である。
言語の構造 > コンパイラの構造

コンパイラ自体は単一のプログラムではない。それはForthのワードで構成され、システムから見え、プログラマによって使用できる。これにより、プログラマは特別な目的のためにコンパイラのワードを変更できる。
名前フィールドの中にある「コンパイル時」フラグは、「コンパイル時」の振る舞いを持つワードに設定される。ほとんどの単純なワードは、コマンドラインに入力されるか、コードに埋め込まれるかにかかわらず、同じコードを実行する。これらをコンパイルするとき、コンパイラは単にコードを配置するか、ワードへのスレッドポインタを配置する。
コンパイル時のワードの典型的な例は、IFやWHILEなどの制御構造だ。Forthのほぼすべての制御構造およびほぼすべてのコンパイラは、コンパイル時のワードとして実装される。Ulrich HoffmannのpreForthで使用される条件付きリターンワード ?EXIT など、一部の稀な制御フローワードを除いて、Forthのほぼすべての制御フローワードは、プリミティブワードとその分岐アドレスとのさまざまな組み合わせをコンパイルするためにコンパイル中に実行される。たとえば、IFやWHILEなどのワード、およびそれに対応するワードは、BRANCH（無条件分岐）とTemplate:PreCode（スタックから値をポップし、偽の場合に分岐する）を設定する。カウンティングループの制御フローワードも同様に機能しますが、カウンタと一緒に動作するプリミティブワードの組み合わせを設定する。コンパイル中に、データスタックは、制御構造のバランス、入れ子構造、および分岐アドレスの後方パッチングをサポートするために使用される。たとえば、次のスニペット：
... DUP 6 < IF DROP 5 ELSE 1 - THEN ...
は、定義の内部に以下のシーケンスとしてよくコンパイルされる。
... DUP LIT 6 < ?BRANCH 5  DROP LIT 5  BRANCH 3  LIT 1 - ...
BRANCHの後の数字は相対ジャンプアドレスを表す。LITは、データスタックに「リテラル」数字をプッシュするためのプリミティブ・ワードだ（もし関係する数値のうちのどれかが別個に定数として定義されていれば、LITと埋め込まれたデータの代わりに定数へのポインタを使用することで、より高速で短いコードがコンパイルされる。定数の代わりに他のワードが使用される場合、類似の変更が行われる）。
言語の構造 > コンパイラの構造 > コンパイル時と実行時

ワード :（コロン）は名前を引数として構文解析し、辞書にヘッダを作り（記述法はコロン記号で始まりセミコロン記号で終わるので、コロン定義, colon definition）、コンパイル状態に突入する。コンパイラは後続のワードをコンパイルしていく。このときワードが後述する即時ワードである場合は実行し、そうでない場合は実行時に呼び出されるようにコンパイルする。
ワード;（セミコロン）は現在の定義を終了し、実行状態へと復帰する。
システムの状態はワード [（左大括弧）及び ]（右大括弧）を用いて手動で変更させることができ、それぞれ実行状態とコンパイル状態に突入する。ANS  Forthでは、現在のインタプリタの状態はフラグ STATEから読み取ることができ、名前を引数としてとり、名前のつけられたワードのコンピレーションセマンティクスを現在の定義に追加する。Forth-83 は別々のワード COMPILE と [COMPILE] を定義し、それぞれイミディエイトでないワードとイミディエイトのワードのコンピレーションを強制する。
言語の構造 > コンパイラの構造 > イミディエイトワード

ワードIMMEDIATEは、直近のコロン定義をインメディエイトワードとしてマークし、そのコンパイル時のセマンティクスを解釈時のセマンティクスとして効果的に置き換える。インメディエイトワードは通常、コンパイルされるのではなく、コンパイル中に実行されるが、プログラマによってどちらの状態でも上書きできる。; は即時ワードの一例である。ANS Forth では、ワードがイミディエイトとしてマークされていても、ワード POSTPONE は名前を引つけられたワードを強制的にコンパイルする。
言語の構造 > コンパイラの構造 > 無名ワードと実行トークン

ANS Forth では、ワード :NONAME を用いて、次の;（セミコロン）までの後続のワードをコンパイルし、実行トークン (execution token) をデータスタック上に残す、無名のワードが定義できる。
ワード EXECUTE はデータスタックから実行トークンを取り出し、関連づけられたセマンティクスを実行することができる。またワード COMPILE,（COMPILE コンマ）は、データスタックから実行トークンを取り出し、コンパイルする。
ワード ' (tick) は、ワード名を引数としてとりデータスタック上のワードに関連づけられた実行トークンを返す。
言語の構造 > コンパイラの構造 > ワードの構文解析とコメント

ワード : (colon)、POSTPONE、' (tick)と :NONAME は、データスタックの代わりにユーザからの入力からそれらの引数をとる構文解析ワード (parsing words) の例である。別の例では、右括弧をまでの後続のワードを読み込んで無視し、コメントを配置するのに使われる ワード(（左括弧）がある。同様に、ワード \（バックスラッシュ）は現在の行の終端まで続くコメントのために使われる。括弧で括られるコメントは、ワードの解説においてスタック効果コメントを記述するのに使われる。 コメント中に -- を置き、その左側にはワードが利用（消費）する引数を、左端をスタックの底として順に列挙していく。-- の右側にはそのワードがスタックにプッシュする結果を、右端をスタックのトップとして列挙する。例えばワード dupは ( n -- n n ) というスタック効果コメントを記述することで、スタックの一番上にある値を引数として一つ消費し、消費したものと同じ値を二つ、スタックに戻すワードであることを説明できる。-- の左に何もなければ引数はなく、-- の右に何もなければ結果が返されることはない（スタックは必ず空になる）。( -- ) とだけ書かれているならば、引数も戻り値もない。
言語の構造 > コードの構造

ほとんどの Forth システムにおいて、コード定義のボディはマシン語といくつかの形式のスレッデッドコードからなる。非公式の FIG 規格 (Forth Interest Group) に従っているオリジナルの Forth は、TIL (Threaded Interpretive Language) である。これは 間接スレッディング(indirect-threading)とも呼ばれ、直接スレッディング(direct-threading) と サブルーチン・スレッディング(subroutine-threading) も現在はよく使われるようになってきた。最初期のモダンな Forth はサブルーチン・スレッディングを使っており、マクロとしてシンプルなワードを挿入し、より小さく速いコードを生成するために のぞき穴的最適化 や他の最適化戦略を実行した。
言語の構造 > データオブジェクト

ワードが変数や他のデータオブジェクトであるとき、CPはそれを作成した定義ワードに関連付けられたランタイムコードを指している。定義ワードは特徴的な"defining behavior"（ディクショナリエントリの作成に加え、もしかしたらアロケートとデータ領域の初期化をする）を持っており、この定義しているワードによって構築されたワードのクラスのインスタンスの振る舞いの定義もする。たとえは、
Forth は、カスタム定義の振る舞いとインスタンスの振る舞いを指定する、新しいアプリケーション特有の定義ワードをプログラマが定義できる機能もまた提供する。円形バッファ、I/Oポート上で命名されたビット、自動的にインデックス化された配列などの例がある。
これらに定義されたデータオブジェクトと同様のワードはスコープにおいてグローバルである。他の言語でローカル変数から提供された関数は、Forth ではデータスタックから提供される（しかし、Forth も真のローカル変数は持っている）。Forth のプログラミングスタイルは他の言語に比べ、ごく少数の名付けられたデータオブジェクトを使う。典型的にはこのようなデータオブジェクトは、たくさんのワードやタスク（マルチタスクの実装においては）によって使われるデータを格納するのに使われる。
Forth は型システムを持たない。したがって値の操作は全てプログラマの責任で行われる。
プログラミング

Forth で書かれたワードは実行可能な形式にコンパイルされる。古典的実装は、順に実行されるワードのアドレスのリストをコンパイルする。多くの現代的なシステムは実際のマシンコードを生成する（いくつかの外部ワードの呼び出しと、適当な場所に展開された他者のためのコードを含む）。最適化コンパイラをもつシステムもある。一般的な場合、Forth プログラムは実行可能形式としてロードされたとき実行されるコマンド (e.g., RUN) を含めた、Forthプログラムのコンパイル済みコードのメモリイメージとして保存されている。
開発中、プログラマは小さなコード片を開発したときに実行およびテストするためにインタプリタを使う。そのため、ほとんどの Forth プログラマは緩やかなトップダウン設計と、単体テストと統合の繰り返しによるボトムアップ開発を支持している。
トップダウン設計では、普通まずプログラムを「語彙」へのプログラムを分割し、それらを最終的に必要なプログラムを書くための、高レベルなツールセットとして利用する。よく設計された Forth プログラムは自然言語のように読むことができ、単一の目的を達成するために用いられるだけでなく、関連する問題を解くプログラムを書くのに利用することができる。
コード例 > Hello world

For an explanation of the tradition of programming "Hello World", see Hello world.
実装の一つとしては、
: HELLO  ( -- )  CR ." Hello, world!" ; HELLO <cr>
HELLO
ワード CR (Carriage Return) は後続の出力を新しい行の上に表示するようにする。構文解析ワード  ." (dot-quote) はダブルクオートで区切られた文字列を読み、構文解析された文字列が実行時に表示されるように現在の定義にコードを追加する。文字列 Hello, world! からこの空白文字で区切っているワード ." は、文字列には含まれていない。これは構文解析器が ." を Forth ワードとして認識するために必要である。
標準的な Forth システムはインタプリタでもあり、同じ出力は次のコード片を Forth コンソールに入力することで得ることができる。
CR .( Hello, world!)
.( (dot-paren) は括弧で囲まれた文字列を構文解析し、これを表示するイミディエイトワードである。."と同様に、Hello, world! から空白文字で区切られた.( は文字列の一部ではない。
ワード CR は表示する文字列の前にくる。慣例的に、Forth インタプリタは新規行に出力を開始しない。また、慣例により、インタプリタは直前の行の終端、okプロンプトの後で入力を待つ。他のプログラミング言語で時々そうであるような、Forth の CR にはバッファをフラッシュする暗黙の動作はない。
コード例 > コンピレーションステートとインタープリテーションステートの混用

ここに 実行されると単一の文字 Q を発行するワード EMIT-Q の定義がある。
: EMIT-Q   81 (the ASCII value for the character 'Q') EMIT ;
この定義は Q のASCII値 (81) を直接を使うことで書かれている。括弧の間の文字列はコメントで、コンパイラに無視される。ワード EMIT はデータスタックから値をとり、対応する文字を表示する。
次の EMIT-Q の再定義は、ワード[（左大括弧）、]（右大括弧）, CHAR、LITERAL  をインタプリタステートを一時的に切り替えるために使っており、文字 Q のAscii値を計算し、コンピレーションステートを返し、計算した値を現在のコロン定義に追加する。
: EMIT-Q   [ CHAR Q ]  LITERAL  EMIT ;
構文解析ワード CHAR は空白で区切られたワードをパラメータとしてとり、データスタック上のその最初の文字の値を置く。ワード [CHAR] は CHAR のイミディエイトバージョンである。[CHAR]を使って、EMIT-Q の定義例は次のように書くことができる。
: EMIT-Q   [CHAR] Q  EMIT ; \ Emit the single character 'Q'
この定義はコメントを書くために \（バックスラッシュ）を使っている。
CHAR と [CHAR]の両方は ANS Forth では事前に定義される。IMMEDIATE と POSTPONE と使って、[CHAR] はこのように定義することができる。
: [CHAR]   CHAR  POSTPONE LITERAL ; IMMEDIATE
コード例 > 完全な RC4 暗号プログラム

1987年、Ron Rivest は RC4 暗号システムを RSA Data Security, Inc. のために開発した。このコードは非常に単純で、説明を読めば大抵のプログラマは書くことができる。
それぞれすべて値の異なった 256 バイトの配列がある（訳注:これが暗号ストリームの状態であり、鍵で適当に初期化する）。
この配列が使われるときはいつも、2つのバイトが交換されることによって変更される。
この交換はカウンタ i および j によって制御され、どちらも最初は 0 である。
新しい i を取得するには 1 を加算する。
新しい j を取得するには、新しい i の位置にある配列のバイトを加算する。
i と j の位置にある配列の値を交換する。
このコード（訳注:後のXORに使う値）は i と j の位置にある配列のバイトの和の位置にある配列のバイトである。
平文を暗号化したり暗号文を復号するためには、このバイトを XOR される。
配列は最初の設定によって 0 から 255 にかけて初期化される（訳注:手順の途中に書いてあるが、これは最初に行う）。
それから i と j を使う、i の位置にある配列のバイトを j に加算による新しい j とキーのバイトの取得、i と j のバイトの交換と手順は進んでいく。
最後に、i と j は 0 にセットされる。
すべての加算は 256 を法とするモジュラ演算である。
以下の標準の Forth バージョンはコアのワードのみを使っている。
0 VALUE ii
0 VALUE jj
CREATE S[] 256 CHARS ALLOT
: ARCFOUR  (c -- x)
	ii 1+ DUP TO ii 255 AND		( -- i)
	S[] +  DUP C@			( -- 'S[i] S[i]) 
	DUP jj +  255 AND DUP TO jj	( -- 'S[i] S[i] j)
	S[] +  DUP C@ >R			( -- 'S[i] S[i] 'S[j])
	OVER SWAP C!      		( -- 'S[i] S[i])
	R@ ROT C!			( -- S[i])
	R> +				( -- S[i]+S[j])
	255 AND S[] + C@			( -- c x)
	XOR ;
: ARCFOUR-INIT	(key len -- )
	256 MIN LOCALS| len key |
	256 0 DO  I  S[] I + C!  LOOP
	0 TO jj 
	256 0  DO			(key len -- )
		  key I len MOD + C@  
		  S[] I  + C@  + jj + 255 AND TO jj
		  S[] I  + DUP C@  SWAP (c1 addr1)
		  S[] jj + DUP C@  (c1 addr1 addr2 c2) ROT C! C!
	     LOOP
	0 TO ii  0 TO jj ;
これはこのコードを検証する多くのテストのひとつである。
CREATE KEY: 64 CHARS ALLOT
: !KEY (c1 c2 ... cn n—store the specified key of length n)
	DUP 63 U> ABORT" key too long (<64)"
	DUP KEY: C! KEY: + KEY: 1+ SWAP ?DO  I C!  -1 +LOOP ;
 
	HEX  61 8A 63 D2 FB  5 !KEY
KEY: COUNT ARCFOUR-INIT
CR 
	   DC ARCFOUR 2 .R SPACE
	   EE ARCFOUR 2 .R SPACE
	   4C ARCFOUR 2 .R SPACE
	   F9 ARCFOUR 2 .R SPACE
	   2C ARCFOUR 2 .R
CR .(Should be: F1 38 29 C9 DE)
実装

Forth 仮想マシンは実装が単純で規格のリファレンス実装を持たないため、大量の言語実装が存在する。標準的な各種デスクトップコンピュータシステム (POSIX, Microsoft Windows, macOS) をサポートしていることに加え、これらの多くの Forth システムは各種の組み込みシステムもまた対象としている。1994年の ANS Forth 規格に準拠するさらに有名ないくつかのシステムが列挙する。
Gforth - GNUプロジェクトによる移植性の高い ANS Forth 実装
Forth Inc. - Forth の開発者たちによって設立され、デスクトップ向け (SwiftForth) と組み込み向け (SwiftX) ANS Forth ソリューションを販売している
MPE Ltd. - 高度に最適化されたデスクトップ (VFX) と 組み込み ANS Forth コンパイラ
Open Firmware - ANS Forth に準拠したブートローダと ファームウェア の規格
Freely available implementations
Commercial implementations
プラットフォームごとにまとめられたより最新の一覧は Forth systems
Forthベースの言語等

Forthをベースにしてワードを日本語で記述可能にした言語としてMindがある
Forthをベースに、オブジェクト指向に改良したMac OS向けの開発システムMops。オブジェクト指向とマルチスレッド対応のPalo Alto Shipping Co.製のMach1（まっはわん）がある。
Open Firmwareのシェル言語はForthベースである。SunのOpenBoot PROM（OBP）やCHRPベースのPower Macintoshの起動用ファームウェアはOpen Firmwareの実装である。
Forthを元にしたコマンド言語であるFiclはFreeBSDのブートローダの実装に使われている。
1985年ごろ、服飾メーカーとして知られるJUN（株式会社ジュン）が開発したコンピュータグラフィックシステム4D-Boxのオペレーション言語0DLはForthであった。[要出典]
似た言語等

PostScriptは、作者によれば影響されたものではないとしているが、Forthと同じく後置記法でスタック指向であり、類似性が指摘されることがある。
TeleScript General Magic社が開発・提供していた次世代エージェント指向の通信用プログラム言語。Forthアーキテクチャで実装されていた。[要出典]
イリアン・ストヤノフ

イリアン・ストヤノフ（ブルガリア語: Илиян Стоянов、1977年1月20日 - ）は、ブルガリア・キュステンディル出身の元サッカー選手、指導者。
人物

ブルガリア代表にも選出されたセンターバック。母国ではКоловати（Collovati）の愛称で呼ばれている。
強いキャプテンシーを持ち、ディフェンダーでありながら、優れたボールコントロール技術の持ち主であり、最後尾からのロングパスを多用するビルドアップや鋭いオーバーラップを得意としている。その脅威から相手FWからマンツーマンでマークされることも少なくない。橋本英郎は、自身のキャリアで対戦して衝撃を受けた選手11人の1人に名前を挙げた。
そのテクニックを活かしMF（ボランチ）でも起用される。ブルガリア時代は左SBとしてもプレー。CBとしては珍しいFKの名手。
経歴 > 現役時代

1995年、CSKAソフィアに入団。その後レフスキ・ソフィア等でプレーし、ブルガリア代表ではEURO2004で2試合に出場した。ドイツワールドカップ予選にも出場した。
2005年3月からジェフユナイテッド市原・千葉に所属、開幕戦の名古屋グランパス戦でJリーグデビュー、7月18日の大宮アルディージャ戦で初ゴールを決めた。イビチャ・オシム監督の下でリベロとしてプレーし中心選手として活躍、同年ナビスコカップ決勝のガンバ大阪戦でも先発し、チーム史上初タイトルの獲得に貢献した。
2007年6月、アマル・オシム監督に対して批判的な発言を行い、それがスポーツ新聞により報道された。これに対し千葉フロントは、同年6月16日ストヤノフを謹慎処分とし、同月17日対ヴァンフォーレ甲府戦に出場させないことを発表。同月22日付けで謹慎処分は解除されたが、同月27日残留させないことを決定、事実上の解雇通告を受けた。理由は「監督に対する批判を外部に行い、再三の説得に応じず謝罪を拒否した行為を、著しい規律違反と判断したため」。その後、7月23日付けで契約解除が発表された。
同年8月12日、ダリオ・ダバツらのケガで代役のディフェンダーの獲得を狙っていたサンフレッチェ広島と契約、MFとしてプレー した後、本来のリベロでプレーするもののJ2に降格してしまう。同年の天皇杯では決勝進出に貢献した。降格により退団が予想されたが、「自分を苦しい時に拾ってくれたクラブを去るわけにはいかない。」と残留表明をする。以降、リベロとして中心選手として攻守にわたり活躍した。
2009年2月、スタニミル・ストイロフ（ブルガリア語版）がブルガリア代表監督に就任、経験のあるDFとして指名され4年ぶりに代表に選出され、2010 FIFAワールドカップ・ヨーロッパ予選にレギュラーとして出場した。2010年8月にも代表に選出された。しかし、代表選出の影響で怪我が続き安定して出場できなかったため、サンフレッチェ広島では、2010年末に構想外となった。
2011年は、J2・ファジアーノ岡山に移籍。チームがこの年から戦術を3バックに変更したこともあり、ディフェンスラインの中央で起用された。多くのプレースキックを担当しチームトップの8アシストを挙げる など攻撃面では貢献したが、開幕戦で怪我をした 影響もありコンディションが上がらず、シーズン終盤の4試合と天皇杯では出番を失った。同年末を持って現役引退する。延期されていたJ2第6節、10月19日開催のガイナーレ鳥取戦でのゴールが現役ラストゴールとなった。
引退後

2012年から、広島でレストラン経営 と若年層サッカー指導者として活躍している。またフットサルチームのdios hirosima（ディオス・ヒロシマ）を立ち上げ、広島県フットサルリーグ3部で活動しながら、欧州サッカー連盟の監督ライセンス獲得を目指している。
2014年3月末をもって広島の店をたたみ、以前からの熱心な勧誘を受けて山口県東部へ活動拠点を移転し周南市周辺を活動範囲として"FCストヤノフサッカーアカデミー"を開校している。なお店舗はプロデュースの形で徳山駅前にレストランを開店している。
2021年10月6日、カマタマーレ讃岐トップチームのコーチに就任した が、シーズン終了後に退任。
2023年に相生学院サッカー部のコーチに就任。
個人成績

| 国内大会個人成績> 年度.年度.ブルガリア | 国内大会個人成績> クラブ.クラブ.ブルガリア | 国内大会個人成績> 背番号.背番号.ブルガリア | 国内大会個人成績> リーグ.リーグ.ブルガリア | 国内大会個人成績> リーグ戦.出場.リーグ戦 | 国内大会個人成績> リーグ戦.得点.リーグ戦 | 国内大会個人成績> リーグ杯.出場.リーグ杯 | 国内大会個人成績> リーグ杯.得点.リーグ杯 | 国内大会個人成績> オープン杯.出場.オープン杯 | 国内大会個人成績> オープン杯.得点.オープン杯 | 国内大会個人成績> 期間通算.出場.期間通算 | 国内大会個人成績> 期間通算.得点.期間通算 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 1995-96 | CSKAソフィア |  | Aグルパ | 3 | 0 |  |  |  |  |  |  |
| 1996-97 | ヴェルブジド・キュステンディル |  | Aグルパ | 17 | 0 |  |  |  |  |  |  |
| 1997-98 | ヴェルブジド・キュステンディル |  | Aグルパ | 27 | 1 |  |  |  |  |  |  |
| 1998-99 | ヴェルブジド・キュステンディル |  | Aグルパ | 22 | 1 |  |  |  |  |  |  |
| 1999-00 | ヴェルブジド・キュステンディル |  | Aグルパ | 22 | 1 |  |  |  |  |  |  |
| 2000-01 | レフスキ・ソフィア |  | Aグルパ | 20 | 1 |  |  |  |  |  |  |
| 2001-02 | レフスキ・ソフィア |  | Aグルパ | 25 | 0 |  |  |  |  |  |  |
| 2002-03 | レフスキ・ソフィア |  | Aグルパ | 19 | 1 |  |  |  |  |  |  |
| 2003-04 | レフスキ・ソフィア |  | Aグルパ | 18 | 0 |  |  |  |  |  |  |
| 2004-05 | レフスキ・ソフィア |  | Aグルパ | 8 | 0 |  |  |  |  |  |  |
| 日本 | 日本 | 日本 | 日本 | リーグ戦 | リーグ戦 | リーグ杯 | リーグ杯 | 天皇杯 | 天皇杯 | 期間通算 | 期間通算 |
| 2005 | 千葉 | 5 | J1 | 30 | 1 | 8 | 0 | 2 | 0 | 40 | 1 |
| 2006 | 千葉 | 5 | J1 | 26 | 0 | 10 | 0 | 0 | 0 | 36 | 0 |
| 2007 | 千葉 | 5 | J1 | 9 | 1 | 4 | 0 | - | - | 13 | 1 |
| 2007 | 広島 | 2 | J1 | 13 | 0 | - | - | 5 | 0 | 18 | 0 |
| 2008 | 広島 | 2 | J2 | 32 | 2 | - | - | 4 | 0 | 36 | 2 |
| 2009 | 広島 | 2 | J1 | 23 | 4 | 3 | 1 | 0 | 0 | 26 | 5 |
| 2010 | 広島 | 2 | J1 | 17 | 0 | 2 | 0 | 1 | 0 | 20 | 0 |
| 2011 | 岡山 | 5 | J2 | 26 | 2 | - | - | 0 | 0 | 26 | 2 |
| 通算 | ブルガリア | ブルガリア | Aグルパ | 181 | 5 |  |  |  |  |  |  |
| 通算 | 日本 | 日本 | J1 | 118 | 6 | 27 | 1 | 8 | 0 | 153 | 7 |
| 通算 | 日本 | 日本 | J2 | 58 | 4 | - | - | 4 | 0 | 62 | 4 |
| 総通算 | 総通算 | 総通算 | 総通算 | 357 | 15 | 27 | 1 | 12 | 0 | 396 | 16 |
2005年3月5日 - Jリーグ初出場 - 名古屋グランパスエイト戦(瑞穂陸上競技場)
2005年7月18日 - Jリーグ初ゴール - 大宮アルディージャ戦(市原臨海競技場)
2005年 Jリーグベストイレブン
2007年
J1・J2入れ替え戦 2試合0得点
2008年
XEROX SUPER CUP 1試合0得点
|  国際大会個人成績 > 年度.AFC |  国際大会個人成績 > クラブ.AFC |  国際大会個人成績 > 背番号.AFC |  国際大会個人成績 > 出場.ACL |  国際大会個人成績 > 得点.ACL |
| --- | --- | --- | --- | --- |
| 2010 | 広島 | 2 | 3 | 1 |
| 通算 | AFC | AFC | 3 | 1 |
2006年
A3チャンピオンズカップ 1試合0得点
代表歴 > 試合数

国際Aマッチ 40試合（1998年-2010年）
| ブルガリア代表> 年 | 国際Aマッチ> 出場 | 国際Aマッチ> 得点 |
| --- | --- | --- |
| 1998 | 2 | 0 |
| 1999 | 5 | 0 |
| 2000 | 4 | 0 |
| 2001 | 2 | 0 |
| 2002 | 1 | 0 |
| 2003 | 5 | 0 |
| 2004 | 9 | 0 |
| 2005 | 3 | 0 |
2006: 0
2007: 0
2008: 0
| 2009 | 6 | 0 |
| 2010 | 3 | 0 |
| 通算 | 40 | 0 |
指導歴

2021年10月 - 同年12月 カマタマーレ讃岐 コーチ
2023年 - 相生学院高等学校サッカー部 コーチ
さくまあきら

| --- | --- |
: 「佐久間章」、「作間章」、あるいは「佐久間昭」とは別人です。
| さくま あきら |
| --- | --- |
生誕:  佐久間 晃  (1952-07-29) 1952年7月29日（72歳）  日本・東京都杉並区
別名:  森尾一三
出身校:  立教大学経済学部
職業:  ゲームライター 作家
活動期間:  1982年 -
代表作:  桃太郎シリーズ（桃太郎伝説シリーズ・桃太郎電鉄シリーズ）
影響を受けたもの:  すぎやまこういち 小池一夫
親戚:  藤岡孝章
 
テンプレートを表示
さくま あきら（1952年7月29日 - ）は、東京都杉並区出身のゲームライター・作家。血液型はA型。本名は佐久間 晃（読み同じ）。
人物

東京都立武蔵丘高等学校から1年浪人。立教大学経済学部、劇画村塾出身。小池一夫曰く「自分の一番弟子」。自身が中学生のときから強い影響を受けたという作曲家のすぎやまこういちにあやかって、ペンネームを平仮名にする。
漫画評論家を廃業した後は、漫画雑誌『週刊少年ジャンプ』の読者投稿コーナー『ジャンプ放送局』の構成を1982年から1995年にわたり担当したほか、コンピュータゲーム「桃太郎シリーズ」（『桃太郎伝説』シリーズ、『桃太郎電鉄』シリーズなど）や『忍者らホイ!』などにゲーム監督・監修などとして制作に携わる。
コンピュータゲーム『ドラゴンクエスト』シリーズの生みの親として知られる堀井雄二とは学生時代からの友人である。
既婚者。妻と娘が1人、孫は4人（2022年現在）。音楽ユニット「藤岡藤巻」の藤岡孝章は従兄。
2011年7月6日付で文化人タレントとしてビー・ブレーブと業務提携契約を締結、その後同契約を解消しフリーランスに戻る。
略歴 > 生い立ち

実家は玩具店。3歳の時に母親を亡くしたため、実の母の顔を全く覚えていない。その後父親の再婚で継母と暮らすようになるも、反りが合わず、よく自分や姉に対し嫌味な発言をされたという。子供時分から思春期に至るまで良い思い出はなく、たびたび家出をすることで自我を主張していたという。成人したのちに親戚に「よく不良にならなかった」と感慨深く言われたという（そのような経緯もあり、現在の自分の家族（特に養娘や孫）に対しては血縁関係の有無を越えた家族として接している）。
幼少の頃から漫画に親しんでいたこともあり、同級生よりも漢字を覚えるのが早く、優等生と呼ばれていた。しかし、バンドや漫画にはまったことから成績が下降。高校時代には数学で0点を記録し、物理部の部員でありながら物理で赤点を取り話題になった。それでも成績の良いクラスメートの勉強法を真似して持ちなおし、一浪の末に立教大学へ進学。
立教大学では「漫画研究会」に所属し、その繋がりで早稲田大学の堀井雄二や土居孝幸と出会い、卒業後再会して仕事を共にする事となる。
略歴 > 大学卒業後

一年の留年を経て大学を卒業した後、ライターとなった。
25歳の頃、「一期生には大物が出る」との理由で、当時開講したばかりの劇画村塾へ入塾。編集コースに参加したがあまり身が入らず、漫画原作などを執筆していた。
『月刊OUT』の『私立さくま学園』や週刊少年ジャンプの『ジャンプ放送局』といった読者投稿コーナーに携わる一方、漫画評論家としても活動していた。その活動は単行本『だからマンガ大好き!』（1982年）『まんが雑学ゼミナール まんがを100万馬力で読む方法』（1983年）にまとめられている。また、夏目房之介の『粋なトラブル』（1984年）など漫画の単行本に解説文を寄稿することもあった。
後に堀井雄二らとともに出版会社「花伝社」を設立し、新人漫画家を育成する雑誌『マンガハウス』を発行するが、億単位の赤字を出し2年で終了する。
略歴 > ゲーム業界へ

ある時、さくまと堀井が土居孝幸の家を訪れて話をする機会があった。その中で「（『ドラゴンクエスト』のラストボスの）竜王を倒すのが桃太郎っぽいよね」「ゲームの村も金太郎の村、浦島の村としたらわかりやすいよね」などと話が弾み、堀井から「ゲームは儲かるよ。出版社をしていたときの多額の借金も返せるよ。」との話を聞く。当時堀井が制作していた『ドラゴンクエストIII そして伝説へ…』の当初の発売予定が1987年12月だったことから、さくまは、それより前に発売すればそこそこ遊んで貰えるかもという思惑を抱き、ゲーム制作を志すことになる。
身内のスタッフを「蟹を食べよう」という口実で誘うため、当時札幌市に本社があったハドソンを制作元に選んだ。ゲームのシナリオは原稿用紙4000枚分に及び、かつてさくまの会社に勤めていたショッカーO野が手書きの原稿をワープロで打ち直した。3か月の制作期間を経て1987年10月26日にファミリーコンピュータ用ゲームソフト『桃太郎伝説』が発売。もしも売れなければ『ジャンプ放送局』の中でギャグにするつもりだった、とさくまは語っていたが、思いがけず100万本以上のヒットを記録したため、以降シリーズ化される事となる。制作の際には、堀井がテストプレイに参加していた。
略歴 > 体調不良の闘病生活

その後、ゲーム開発や連載などで多忙を極める。一時期は『ジャンプ放送局』などの傍らでゲームを4本同時に制作していた。1995年には病院で血圧を測ったところ数値が200を越え看護師に驚愕された。そうした中、眼精疲労や頚椎椎間板ヘルニア等により体調を崩し、1982年より続けてきた『ジャンプ放送局』を1995年12月に終了する。
その後、イラスト投稿雑誌『チョコバナナ』の編集長を務めていたが、ある時トイレで突然倒れ病院へ運ばれる。診察の結果、脳内出血と診断され、さらに糖尿病を併発していたことも分かり、そのまま入院することになる。後にさくまは「それまでも周囲に血圧を測れと言われていたらしいが、全く聞く耳を持たなかった」「食事療法（1日1,600キロカロリー）をしたら、それだけで1か月で5kgやせた。昔なら確実に1日3,500キロカロリー食べていた」と振り返っている。
退院後、1年半以上に及ぶリハビリ生活の傍ら、ゲーム制作や『チョコバナナ』の編集、アニメ雑誌『Magazine MEGU』の読者コーナー「☆比喩魔（ほしひゆま）」の編集などを続ける。その様は周囲から「とても病人の仕事のペースじゃない。そもそも病人は仕事しない。」と言われた。その一方で、業界内では重体説や再起不能説が囁かれていたという。ただ、それ以降も三度の食事は基本的に外食で、自宅で食事する際もテイクアウトの弁当などで済ませていることが多く、栄養の偏りや糖分・塩分の過剰摂取について主治医から度々注意を受けている。
略歴 > 2000年代以降

2003年、現代版劇画村塾「小池一夫塾」の開塾にあたって「ゲームクリエイターコース」講師を務める。
後輩のいしぜきひでゆきの誘いもあり、2010年4月に大阪電気通信大学の客員教授となる。
後述の通り2011年に発生した東日本大震災などを契機に『桃太郎電鉄』シリーズの開発を中断。2012年1月初旬、再び脳内出血で倒れ一時入院、自宅でのリハビリ生活に入った。
2015年には、ハドソンを吸収合併したコナミと決別。2016年、任天堂からのオファーに応じ、ハドソン時代からコナミ時代を通して初の外部から発売となる『桃太郎電鉄2017 たちあがれ日本!!』をリリースした。2017年8月には、取材で携わっていた岩手県三陸鉄道にふるさと納税を通じて2000万円を寄付した。
2019年1月1日、亜急性心筋梗塞のため救急搬送される。『桃太郎電鉄』シリーズはコナミと和解し、制作総監督として『桃太郎電鉄 〜昭和 平成 令和も定番!〜』を2020年11月19日にリリース。
2021年3月12日、第24回文化庁メディア芸術祭の功労賞を受賞した。
2022年5月25日、誤嚥性肺炎のため入院したことを妻がTwitterで報告した。容体は安定しており、受け答えもできるという。6月4日に退院したものの、12月3日に誤嚥を起こし、東京慈恵会医科大学附属病院に再入院、同月11日に退院した。
2024年8月22日、CEDEC AWARDS 2024特別賞を受賞した。