-
文字列とASCII文字の印字
文字列の比較 COMPARE オプションであるから定義されているとは限らないが、2つのaddr len文字列について、その内容が一致するかどうかを判定するforth標準ワードがCOMPARE である。 COMPARE ( c-addr1 u1 c-addr2 u2 -- code ) 比較は大文字小文字が区別される(case-sensitive)。 結果は、完全に等しいときには0を...
-
固定文字列
...ついて述べる。 文字列とASCII文字の印字
-
コンパイラの構築(iMopsの記憶)
...クエリ 固定文字列 文字列とASCII文字の印字 数値の表記と印字 文字列操作 forth環境への問い合わせ 特別スタックと小数 リターンスタックと小数スタック 浮動小数点数の処理 局所変数(locals) フロー IF、EXIT、CASE 確定ループ 不定ループ 再帰(RECURSE) データ・コードXT(エグゼキューション・トークン) ディクショナリ格納 CREATE DOES コンパ...
-
文字列操作
文字列の操作に関する、Forth標準ワードのいくつかについて説明する。文字列の操作というよりも、文字列バッファの操作という観点から集めた。文字列用ワード群はオプショナルであり、全ての環境で定義されているとは限らない。 文字列の扱いは環境毎に多様化しているようである。したがって、文字列用として標準となっているワードはごく僅かである。 Mopsでも、基本的クラスライブラリとして、ヒープベース...
-
forth環境への問い合わせ
Forth環境に対して質問するワードについていくつか説明する。 ENVIRONMENT? Forth標準規格でCOREワード規定されているENVIRONMENT?は、当のForth環境で扱える整数の最大値や文字列の長さの制限などについての特性を返す。ただし、何でも分るというわけではなく、規定された事項について回答するのみであり、さらに、回答不能の場合(未定義も含む)はfalseを返すだけの...
-
EVALUATE PARSE コンパイルの中断
EVALUATE EVALUATEは「評価」である。要するに遅延評価である。ソースコード文字列を実行時にインタープリトするのである。 EVALUATE ( i×x c-addr u -- j×x ) 解釈されるソースコードが入力を必要とすれば、それはスタックの、文字列より下の位置に置かれなければならない。また、返される値は、実行後にスタックに残される。 ソースインプットの長さに特に制...
-
数値の表記と印字
Hex Decimal 数字の表記は、デフォルトでは10進数で解釈される。しかし、モードとして16進数解釈に切り替えられる。そのためのワードがHEXである。 HEX ( -- ) \ 16進数モードに切り替える 数字はすべて16進数で表記されていると解釈される。したがって、HEXを実行しておけば、コード内に、BEEF とかCafeとかdeadなどと書いても、そのような名前のワードを定...
-
メニュー
メニュー コンパイラの構築もやもやForthとコンパイラ言語設計はしなかったForthの陥穽 インタープリタの機構 Mopsのオブジェクト指向(総論)(編集中) forth讃 少し技術っぽいことレジスタ割当とノードグラフ 呼び出しコンパイル レジスタ変数の実装 ヒープメモリー上でのコンパイル・実行 Forth言語についてForth言語概説Forth開発環境 一般forth用語の整理 計算Forth...
-
XT(エグゼキューション・トークン)
XT 普通は小文字でxtと書くが、これはexecution token(エグゼキューション・トークン)の頭文字である(英語ではex...の頭文字にeではなくxを採ることが普通なのは一般論)。直訳すれば「実行標識」である。数値なのだが、これでワードを識別できる。各ワードについた固有のタグである。イメージとしていえば関数ポインタのようなものである。しかし、関数ポインタとは違って、実装上は必ずしもポ...
-
Forthの変数
序 データスタックが変数の役割を果たすとはいえ、forthでも変数は定義できる。 けれども、構文上は、値はすべて一旦スタックにおかれ、スタックを通じて処理されるような形になる。 変数の種類としては、ワードとして定義するパブリックな変数と、1ワード定義内でだけ有効な局所変数がある。 Mopsにはこれらに加えて Local Section (ローカルセクション)という機構があり、近接す...
-
インタープリタの機構
iMopsのインタープリタの機構は、PowerMopsのそれを模倣している。INTERPRETという内部ワードが中心となっている。 実行モード 実行モードでインタープリトする場合、INTERPRETは、読み込まれたワードを辞書内検索で探し出し、そのワードのxt(エグゼキューション トークンの略号。forthでは実行可能ワードを識別するタグのようなものを、このように呼ぶ。)をパラメターとし...
-
Forth言語概説
プログラミング言語Forth 序章 Forthによるプログラミングは、ワードと呼ばれるサブルーチン(意味的に一定のまとまりのある処理の小部分、関数ともいう)を定義することで行われる。ワードの定義は、コロン記号で始め、次にワード名、そしてそのワードが行うべき処理内容の記述と続き、最後にセミコロンを置く。これが最も基本的なForthワード定義方法であり、コロン定義( -definition)などと...
-
リターンスタックと小数スタック
リターンスタック Forthにおいてスタックといえば普通はデータスタックを意味する。整数値を受け渡すためのスタックである。しかし、forth環境は、これとは別個の、リターンスタックと呼ばれるスタックも持っている。実は、多少仕様は異なるものの、現代のPCでリターンスタックを使わずに動作しているものはほとんど無い。関数あるいはサブルーチンの呼び出しのとき、内部的にはリターンスタックの機構を使ってい...
-
forthとコンパイラ
Forth言語特性 Forth言語では、古典的には"間接スレッディング方式"という特殊な実行形式が採用され、"コンパイル"というときにも特殊な意味で用いられていた。 しかし、ここでの話はマシン語を生成するネイティブコード・コンパイラを対象とするため、その解説は省く。参照 Forth系の言語ではコンパイラの作成が非常に容易ともいわれる。その第一の...
-
自己コンパイル、クロスコンパイル
かつては、forthはforthで構築されているものが多かった。しかし、現在は、forthといえども、中核部分はC言語などの、様々なプラットフォームで利用できるマシン語コンパイル型の言語環境を用いて構築されている例が多いようである。そんな中でMopsは全体がforthで構築されており、現在では特異な存在となっている。その場合、自分自身を自分自身でコンパイルする、ということになる。 自己コン...
-
Abort, Die, および Throw-Catch
例外処理 プログラムの実行過程で、ユーザーからの予想外の値の入力など、いくつかのあらかじめ予測不能な原因が競合した結果、そのまま処理を続行することができなくなる局面がある。そのような場合に備えて、処理を適切に中断させるためのワードがある。一般的にそのような処理は例外処理(exception)とよばれている。本来ならばその後に継続するはずの複数の処理を無しで済ますものであるため、かなり強引な処理と...
-
CREATE DOES>
CREATE - DOES CREATEとDOES を組み合わせる語法は、forth言語で出会う最初の驚きである。 CREATE - DOES の対は、何かのワード定義の中で用いる。そのようにして定義されたワードは特別なワードとなり、CREATE-DOES ワードなどとも呼ばれる。そのようなワードのどこが特別かというと、あるパターンのワードを定義(というより生産)できるワードになるの...
-
ワード(関数)の定義
(コロン) 既に見たように、forthのもっとも典型的なワード(関数)定義方法は、 を用いる方法である。これも1文字名前のワードである。 を用いる標準的な定義方法をコロン定義( -definition)などという。まず、 を置き、続いて、定義しようとしているワードの名前を書く。続いて内容定義に入る。定義には、他のワードで実行内容を記述する。最後にセミコロン ; で閉じる。 定義が終了...
-
プラグイン/ニュース
ニュース @wikiのwikiモードでは #news(興味のある単語) と入力することで、あるキーワードに関連するニュース一覧を表示することができます 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/17_174_ja.html たとえば、#news(wiki)と入力すると以下のように表示されます。 SlackからWiki...
-
ワード(サブルーチン)へのリンク
サブルーチンコール 自分でコンパイラやインタープリタを作ろうとしている人がみるかも知れないということで、思いっきり基本から書いてみる。 マシンインストラクション ネイティブコード方式でサブルーチンを呼び出す場合に用いるのは、基本はCALL(コール)インストラクションである。 インストラクションとは「教示」というような意味だが、「マシン インストラクション」で「機械命令」と訳されるよ...
-
Forthの変数(続)、定数
格納値の操作 変数を値の代理というよりも格納庫としてみて、そこに格納されている値に直接に演算を施すワードが定義されている。+! と -! である。 +! ( n addr -- ) \ nをaddrで指された1セル数値に加算する -! ( n addr -- ) \ nをaddrで指された1セル数値から減算する これらは、スタック上...
-
標準Forthワード索引
説明したForthワード(アルファベット(ASCII)順) ! (Store) # (number-sign) # (number-sign-greater) #S (number-sign S) (tick) ( (paren) * (...
-
ワード(関数)の定義(続)
FORWARD これはMopsでの拡張である。標準forthにはない。おそらく、もっと古いforthにはあったのだろう。 機能としてはDEFERと同じであるが、少し静的である。動的に、あるいは何度も定義内容を変えることは予定していない。むしろ、あるワードの定義を初めから遡及的に入れ替えるという機能が重要である。もっとも、現実には、呼び出しが必要なところでは何らかの理由でまだ定義ができな...
-
一般forth用語の整理
Forthワードの機能を知る上で知っておくと便利な抽象的な用語をここで整理しておこうと思う。 セマンティクス Forthでセマンティクスというと、ワードの動作の内容を意味する。一般にはセマンティクスというと意味論と訳され、形式的な式とか文の内容構造を表す形式モデルのことを指したり、そのモデルの割り付け操作のことを指したり、文が表している意味そのものを指したりする。かなり多義的に使われる言...
-
局所変数(locals)
序 Forthでは局所変数機能はオプショナルであって、必ずしも全てのforth環境が、それを備えているとは限らない。しかし、利用可能であれば、一般的な局所変数と同じく、ひとつのワード(サブルーチン)定義内でのみ有効で同一性を保ち、名前によって特定される変数となる。 多くの環境で、局所変数はリターンスタックを用いて実装されているようである。リターンスタックにフレームを作り、その位置と局所...
-
IF、EXIT、CASE
IF IFはもちろん条件分岐のためのワードである。ForthのIFは、他のプログラミング言語とも、また英語とも、語順が異なっている。IFは条件をスタックから取る。したがって、判定値はIFの前に定まっていなければならない。IF以下は、スタック上の判定値が偽でないときのみ実行されるのである。「偽でない」とは0でないという意味である。真(TRUE)は-1で表現されるからもちろん0ではない。しかし、真...
-
Forth開発環境の初歩的使用法
コマンドライン、コンソール 現在でも、Forth開発環境の多くは、テキストベースのコマンドラインから操作するものがほとんどである。MacだとTerminal.appから操作することになるし、WindowsだとDOS窓である(近年はなかなか優秀なシェルウィンドウが付いている)。他のLinux等のUNIX系でウィンドウシステムがある場合も、具体的には知らないが、同じようなことになるであろう。要する...
-
確定ループ
ループは、もちろん、特定区間の実行を何度か繰り返す機構であるが、確定ループ(Definite Loop)とは、その繰り返し回数の限界が、実行開始前に定まっているループである。 DO LOOP Forthの最も基本的な確定ループはDO-LOOPである。このループの巡回区間は、DOで始まりLOOPで終わる部分である。DO-LOOPは、forthにおける他のコントロールフロー制御ワードと同様、...
-
ヒープメモリー上へのコンパイルと実行コード領域
コードをコンパイル後直ちに実行するためのメカニズム コンパイラ型言語環境を作ってみたいという人には参考になるかもしれない話、ということで、iMopsでのコード実行のメカニズム、特に、メモリーの使用法について、説明してみようと思います。 アプリケーションの起動実行 初歩的なことですが、普通のアプリケーションプログラムの実行コードは、実行可能ファイルとして、アプリケーションバンドル(束)の中...
-
浮動小数点数の処理
小数用のワードセットは、対応する整数用ワードの名前の前にFを付けただけのものが多い。 オプションであるので、商品forthかgForthでなければ、規格に含まれた全てのワードが完備されていることは期待できない。Mopsもかなりズレがある。基本的に必要と思われるものについてのみ説明する。 なお、PowerMopsとiMopsでは、浮動小数点数は標準でダブル精度(64ビット)である。 FVA...
-
レジスタ割当とノードグラフ
レジスタ割当 前提問題 Forth系の言語の場合、構文解析や意味解析はコンパイラをつくる時点では考える必要がない。詳細はプログラミング段階に回せるからだ。すると考えなければならないのは初っ端から最適化ということになる。今日のコンピュータはほとんどがレジスタマシンであるため、レジスタをどのように割り当てるかがまずは最重要課題となる。 レジスタマシンとは、レジスタと呼ばれる小さく高速な内...
-
プラグイン/人気商品一覧
人気商品一覧 @wikiのwikiモードでは #price_list(カテゴリ名) と入力することで、あるカテゴリの売れ筋商品のリストを表示することができます。 カテゴリには以下のキーワードがご利用できます。 キーワード 表示される内容 ps3 PlayStation3 ps2 PlayStation3 psp PSP wii Wii xbox XBOX nds Ninte...
-
数値演算
四則演算 + – * / Forthでも普通の四則演算がわからないという人は、ほとんどいないと思う。変数を使わずスタック上で実施するので、コード面は初めは分りにくいということはあるかも知れないが、普通は数分もあれば慣れる。 記号としては、足し算は + 、引き算は - 、掛け算は * 、割り算は / 、なのでごく普通である。これらもワードなので、前後は空白文字で空ける。変数名...
-
スタック操作
計算やデータ処理、あるいは外部関数の呼び出しなどを積み重ねていく場合に、スタック上の値の順番がいつも整合的に上手くいくとは限らない。また、同じ値を何度も使いたいときに、いちいち変数に格納するより、スタックアイテムを複製する方が簡便な場合もある。そのような必要に応えるために定義されているのがスタック操作ワードである。dupやswapは既に登場したが、経験上よく使うものをここで一括して説明する。その後...
-
拡張数値計算
ダブル整数 ダブル整数とは、2セル分を用いて表現される整数のことである。これは、変数の型のようなものではなくて、数値のスタック上への表現の型、といってよい。下の桁を先に、大きい方の桁を後に置く(ある意味、リトルエンディアン)。そうすることで、理論上、2セルビットの範囲(64ビットなら128ビット)の数値が扱えるようになるわけである。1セルの範囲で表せる数値をダブル整数で表現するとすれば、例えば...
-
Mopsのオブジェクト指向(総論)
Mops言語のオブジェクトシステムにはどんな効果があるのか Forthのオブジェクト指向拡張は数多くある。実は、forthで言語の仕様を変更するのは容易なのである。初心者から一歩踏み出したあたりで、言語実装がforthプログラミングの課題となってくる、とさえいえるほどである。結局は、それでforthにおけるどのような問題が解かれるのかにかかってくる。 Mops言語のオブジェクト指向はN...
-
ディクショナリ格納
ディクショナリー リターンスタックなどもそうであるが、ディクショナリー(辞書)は、言語環境が自動的に保守するメカニズムであって、コードやデータがコンパイルされるときに、暗黙のうちに利用されるものである。けれども、そういう機構もプログラマーが操作できるようにしてしまうのがforthの流儀であるともいえる。 Forth走行中、ディクショナリーはメモリ中にロードされている。そこには、相互にリ...
-
なぜ言語は自己設計しなかったのか
Forthの融通性 プログラミング言語を自分で設計する気は全くなかった。新しい言語を望むのは既存の言語に不満があるということだろう。Forth言語は非常に古く、Mopsもまた言語として比較的古い。もっとハイカラに飾り付けた言語の方が良いというのもわからないではない。 けれども、forthにしてもMopsにしても、融通が利くことこの上ない言語環境なのだ。そこでのプログラミングは、普通のア...
-
POSTPONE IMMEDIATE
IMMEDIATE IMMEDIATEというワードは、通常は、実行状態で利用される。このワード自体というよりも、このワードを実行したときに他のワードが被る効果が重要である。 IMMEDIATE ( -- ) \ 入出力は何も取らない IMMEDIATEとは、英語で、「間を置かない」とか「直接の」、「即時の」というような意味である。このワードを実行すると、その直前に定義された実行可能ワ...
-
再帰(RECURSE)
概念的説明 † 再帰関数をご存知なら、この区画は飛ばしてかまいません。 再帰関数(リカーシブ ファンクション)は計算理論に用いられて、計算機科学でもよく取り上げられるようだ。 このリカーシブ recursiveの日本語訳としては"帰納"もある。数学的帰納法の帰納であるが、これは論理的な推論としての帰納(induction)ではないので混乱する。高校数...
-
forth讃
Forthプログラミングは難しい? 当サイトでは標準forthの欠点ばかり書いてきた気もするが、これはforth言語の優れた面の表れでもあるのだ。 弁解ではなく、本当に。 Forthでのプログラミングは、言語の提供している機能を利用する側面と、必要な機能を提供する言語要素を構築する側面がある。他のページにも書いたように、forthでのプログラミングは、初心者を一歩出た段階で言語実装へ...
-
スレッディング技術 (Threading Technology)
スレッデド・コード Forthの伝統的なスレッディング技術について説明してみたいと思う(自分はネイティブコード方式しか経験はないが)。 注:全てマシン語におき直すネイティブコード方式では、スレッディング方式は関係がない。 スレッディング技術とは、ワード(サブルーチン、関数)のコンパイルと解釈実行のための技法である。 スレッディング(threading)という言葉は、掲示板等の...