みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

ハローワールドwww

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

ハローワールドwww

投稿記事 by みけCAT » 11年前

ちょっと草植えときますね型言語 Grass

Grassという言語があるので、とりあえずHello Worldと出力するコードを書いてみました。

とりあえず、上記サイトで紹介されているインタプリタをダウンロードします。

CODE:

wWWWwWWWWwvWwwwwWWWw
というコードを実行すると、
Ruby版は自分の環境(ruby 1.9.3p194 (2012-04-20) [i386-mingw32])ではエラーが出てしまいましたが、
Python版とJava版はきちんと実行できました。

次に、インタプリタを使いやすくします。
Python版はデフォルトでは標準入力からしかソースコードを入力できないので、
適当なラッパを書いてファイルから読み込めるようにしました。

CODE:

# -*- coding: utf-8 -*-

if __name__ == "__main__":
	import grass
	import sys
	grass.run(open(sys.argv[1]).read())
というプログラムをgrass.pyと同じディレクトリに置けば完成です。
(code=Pythonだと一部の文字が黒くなり、見えにくくなったのでText使用)

Java版はそのままコンパイルすると大量のファイルができるので、jarにまとめて実行しやすくします。
以下、YUKI.N>はプロンプトを示します。
  1. 適当なディレクトリにGrass.javaを置き、そこで

    CODE:

    YUKI.N>javac Grass.java
    というコマンドを実行してコンパイルします。
  2. とりあえずjarファイルを作成します。1と同じディレクトリで

    CODE:

    YUKI.N>jar cvf ../grass_tmp.jar *
    というコマンドを実行します。
  3. 2で作ったjarファイル(7-zipなどでzipファイルとして開けます)からMETA-INFディレクトリを抽出し、1と同じディレクトリに置きます。
  4. 3で抽出したMETA-INFディレクトリの中にあるMANIFEST.MFをテキストエディタで開き、
    最後の行に

    CODE:

    Main-Class: Grass
    と書き加え、保存します。このとき、空行を入れてはいけません。
  5. 1のディレクトリの中身全部(META-INFディレクトリとその中身を含む)をzipファイルに圧縮します。
    このとき、jarコマンドを使うと、せっかく作ったMETA-INFディレクトリがなぜか無視されてしまいました。
    zipファイルの直下に1のディレクトリの中身がある(zipファイルの中に余計なディレクトリが無い)ようにしましょう。
    そして、作成したzipファイルをgrass.jarにリネームします。
  6. 完成です。grass.jarを保存したディレクトリで

    CODE:

    YUKI.N>java -jar grass.jar
    というコマンドを実行し、

    CODE:

    Usage: java Grass file
    と表示されれば(多分)成功です。エラーが出てしまった場合は頑張って修正してください。
実行の準備ができたら、コードを書く練習をしましょう。
言語仕様上いきなりHello Worldは少し難しいので、まずは"www"(引用符は除く)と出力してみました。

言語仕様を簡単にまとめると
  • 「関数定義」と「関数適用」ができる
  • スタックがあり、初期値は

    CODE:

    関数 Out (文字出力)
    関数 Succ (次の文字を得る、\xffの次は\x00)
    文字 'w' (119)
    関数 In (文字入力)
    (上の行ほど出入口に近い)
    である。
    スタックと言っても、最後(出入口)から数えて任意の位置のデータが取り出せるし、データの削除は無いので、
    むしろC++のstd::vectorやPythonのリストなどに近いと考えられる。
  • 「関数適用」では、実行する関数とその引数1個を指定する。その返り値がスタックに追加される。
    2引数以上の関数では、おそらくHaskellと同様にf(x,y)に引数aを入れると関数g(y)=f(a,y)が返ってくると思われる。
    テストコード

    CODE:

    wwWWWWwWWWwv                f = (λxy.x(Succ y))
    WWWWWwwwwWWwwwWww           ((f Out) (In '\x77'))
    WWWWwwwwwwWwwwwwwwwWWWWWWWw (Out ((f Succ) '\x77'))
    
  • 「関数定義」では、引数の数と「関数適用」の列を指定する。その関数がスタックに積まれる。
    定義された関数は、常に定義した時点でのスタックに引数を積んだスタックとともに実行が開始される。
    実行終了時点でのスタックの最初(出入口)に積まれているデータが返り値となる。
  • プログラムは、「関数定義」や「関数適用」が書かれている順番で実行される。
  • 最初の'w'の前の文字列は無視される。すなわち、最初は「関数定義」をしないといけない。
  • 最後まで実行した後、スタックの最初(出入口)のデータを関数として、その関数自身を引数として実行が行われる。
これを踏まえて"www"を出力するコード。

CODE:

wWWwwwwvWwWWwwWWWwww
まず"w"を出力する関数を定義し、それを3回呼び出しています。

そして、"Hello World\n"を出力するコード。

CODE:

wWWWwWWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwv
wWWWWWWWWWWwWWWWWWWWWwv
WWwwwwwwwwwwwWWWWWWwWWWw
WWWWWWWWwWWWWWwWWWWWWw
WWWWWWWWWWwWWWWWWWWWWWWWw
WWWWWWWWWWWwwwwwwwwWWWWWWWWWWWWWw
WWWWWWWWWWWWWWwwwwWWWWWWWWWWWWWWWWWWw
WWWWWWWWWWWWWWWWWWWWWWw
WWWWWWWWWWWWWWWWWWWww
WWWWWWWWWWWWWWWw
WWWWWWWWWWWWWWWWw
vwWWWWWWWWWWWWWWWWWWWWWWWWWWwv
WwwwwwwwwwwWWwwwwwwWWWwwwwwwWWWWwWWWWWwwwwwww
WWWWWWwwwwwwwwwwwwwwwwwvwWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwv
WWWWWWWWwwwwwwwwwwwwwwwWWWWWWWWWwwwwvwWWWWWWWWWWWwv
WwwwwwwwwwwwwWWwwwwwwwwWWWwwwwwwwwwwwwwwwwww
vwWWWWWWWWw
最初に、Succを組み合わせてn個次の文字を得る関数を定義します。
次に、それらの関数を使って必要な文字データを作っていきます。
その後、ソースコードの長さを減らすためにOut関数を再定義しながら、"Hello World"を出力します。
最後に、"\n"を出力する関数をスタックに置き、終了動作で出力させます。

実行終了時のスタックは、以下のようになっているはずです。
► スポイラーを表示
まとめると、79文字×7行以内で収まりました。

CODE:

wWWWwWWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWwWWWwvwWWWWWWWWWWwWW
WWWWWWWwvWWwwwwwwwwwwwWWWWWWwWWWwWWWWWWWWwWWWWWwWWWWWWwWWWWWWWWWWwWWWWWWWWWWWWW
wWWWWWWWWWWWwwwwwwwwWWWWWWWWWWWWWwWWWWWWWWWWWWWWwwwwWWWWWWWWWWWWWWWWWWwWWWWWWWW
WWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWwwWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWwvwWWWWWWWW
WWWWWWWWWWWWWWWWWWwvWwwwwwwwwwwWWwwwwwwWWWwwwwwwWWWWwWWWWWwwwwwwwWWWWWWwwwwwwww
wwwwwwwwwvwWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwvWWWWWWWWwwwwwwwwwwwwwwwWWWWWWWWWwwwwv
wWWWWWWWWWWWwvWwwwwwwwwwwwwWWwwwwwwwwWWWwwwwwwwwwwwwwwwwwwvwWWWWWWWWw
実際に実行すると、Python版では約6.5秒、Python版(pypy)では約4.6秒、Java版では約0.22秒かかりました。
やっぱりPythonは遅いですね。え?RPython?いえ、知らない子ですね。

コメントはまだありません。