Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

アホが書き散らすFactor入門 その1

アホなのにこんな言語勉強していいものなのか...
とりあえず面白そうなので勉強した内容を少しづつ書いていこうと思う。

そもそもFactorって?

Zedの所で知った人が多い気がするけど要はプログラミング言語らしいです。
でどんな言語かっていうと強い動的型付けのスタック指向らしいです。
スタック指向ってあまり聞いた事がなかったのですがまあようは仮想スタックマシンの
概念を持ってる言語らしいです。
他にスタック指向言語ってどんなのがあるかっていうとForth、Joyなんかがそうみたい
です。
Forthってどんなんだよ?って話にもなりますがForthは

1 1 +

みたいなコードを書きます。
(まあFactorもおんなじですけど)

なんじゃこれ?って思いますけどスタック指向ではこく書くようです。
スタック指向ではスタックを使うため演算は逆ポーランド記法になるみたいです。
(正確には逆ポーランド記法ではなく連鎖性(?)記法)
でもスタック指向だとその分、構文解析がシンプルになりプログラムや処理系自身が小さ
くなる傾向があるようです。
今のところFactorの処理系はCで書かれています。Javaの時代もあったのですが誰も使わな
かったせいかもうメンテしてません。
またFactor自身で書かれている部分もドンドン多くなって今では大半がFactor自身で書かれ
ているようです。
Factorは当初インタプリタだけだったらしいのですが、今ではコンパイラもついているそう
です。コンパイラは実行形式を吐くのではなくimageファイル(マシン語コード)を吐き出し
ます。なのでどっかで動かす時は処理系も配布しないとダメらしいです。
Lispを真似てるのかな。処理系自身が多分小さいのでそんなに苦じゃないと思います)
あと2008年中に1.0が出るらしいです。
まあ要はFactorってForth(連鎖性言語)を基礎にLispとかからいいとことりした言語みたい
です。

仮想スタック

Factorの最も特徴的なのがスタック指向である事だと思います。
とりあえず簡単な式を見てみます。

1 1 + .

単純な足し算です....
スタック指向では基本スタックに積んでなんぼなのでドンドンスタックに積みます。
この例だと1を積む、1を積む、popして足す。
って感じです。
.はまた説明しますがスタックからpopします。
なのでこれだと2が帰ってきます。
Forthとかと同じです。

もうこの時点で結構ややこしいと思った人が多いかも知れません。
でもスタックマシンとかって実はごろごろあるのでマニアな人は慣れ親しんでおくに越し
た事はありません。
Flash系とかTamarinとかそうじゃなかったっけ?Forthのバイトコード吐く!みたいな)
Java仮想マシン仕様もForthの仮想マシン仕様をベースに作られてるらしいので頭のお
かしい人は学んでおくに越した事はないのではないかと思います。

1 2 3 + + .

これだと6が返ります。
簡単な流れは以下です

  1. 1を積む
  2. 2を積む
  3. 3を積む
  4. 3を取り出す
  5. 2を取り出す
  6. 2と3を足す
  7. 結果の5が積まれる この時点でスタックの中は[1 5]
  8. 5を取り出す
  9. 1を取り出す
  10. 5と1を足す
  11. 結果の6が積まれる
  12. 6を取り出す

積んで取り出しての繰り返しです。これが原則です。
非常にシンプルなので頭の悪い僕向けかも知れないと思いましたが複雑な事やるとき大変
そうって気もします。
もちろん複雑な事するためにはword(関数)とかvocabulary(モジュール)とかを使います。
まあでもこのまま行くと突っ込んで2スタックとか辞書がね云々という話がでそうなのでや
めておきます。

インストール

とりあえずまあ触ってみない事にはわからんのでインストールします。
公式サイトから各OSにあったものをダウンロードします。
http://factorcode.org/

マニアはソースをダウンロードしてくるといいでしょう。
ソースはgitで管理されています。
そのせいで今日gitをインストールする羽目になりました。
僕はMacなのでその時手順で書いてみます。MacPort前提です。

sudo port install stgit
git clone git://factorcode.org/git/factor.git
cd factor
make

コンパイルはすぐ終わります。処理系自身が小さいのでしょうか。とりあえず早く終わります。
MacだとFactor.appが出来るていると思います。
とりあえず起動するといきなりGUIが立ち上がってちょっとうぜーとか思うかも知れませんが
とりあえず起動確認は大切なのでします。

起動

とりあえず何もしないとGUIが立ち上がります。
inputにごにょごにょ書くとなんか出てきます。
GUIしかねーの?とか思いますがそんなことはありません。
でもその前に

"tetris" run

と叩いてテトリスを立ち上げて気を落ち着けましょう。

で結局、コンソールで作業したい人もいるはずです。
とりあえずインタプリタを立ち上げてみます

factor -run=listener

インタプリタが立ち上がります。

Factor 0.91 on macosx/x86.32
( scratchpad )

とかって出て打ち放題になります。
ファイルに書いてただ実行したい場合はこんな感じです。

factor -run=none test.factor

noneにするとちょっとまた厄介で足し算できない状態だったりなんですがその辺は次回に
回します。
(imageファイル読み込んだり、rcファイルとか)

Factorの基礎

まあとりあえずあまり見ない感じの言語なので用語的なものも覚えなくてはいけません。
僕も全然わかってませんが。
とりあえず

  1. word 関数(みたいなもの)。(Forthと同じで辞書に放り込んでるのかな)
  2. vocabulary モジュール(みたいなもの)

らしいです

まあ基本的なwordはこんな感じです。

  1. .s スタックの中身を表示します。
  2. . スタックの一番上のオブジェクトを取り出して表示します。
  3. ! 行末までコメントです。
  4. #! 行末までコメントです。

とりあえずちょっと触る分にはやっては.sとかでスタック状態を見てみるといいと思いま
す。

式はスペースで区切ります。
うっかり

1 1 +.

とかやると怒られます。チマチマスペースを空けないといけないのがなんかうっとおしい
人もいるかもしれません。

あと細かい仕様とかはドキュメントがついているのでそちらを参照するといいと思います。
ぶっちゃけドキュメントもとっかかりが難しいというか探しにくかったりするところがある
かも知れません。

とりあえず今回はここまで。