Perl6
O'Reilly Safari_bookshelfでPerl_6_Essentialsをsubscribeして拾い読み。こういう時事ネタ本を安く読み捨てできるのがSafariのいいところ。
- これを書いた数日後に/.-Jに同じ事を勧める記事が載ったが、ほとんど反応なし。以前からapocalypseを読んでるような人には今更で、そうでない人は関心無し?
文法
- かなりRubyっぽくなった
- @、%は残っているが、「変数名の一部」として扱われるようになった。$h{'key'}ではなく、%h{'key'}でOK
- @a.length, %h.kvといった表記が可能
- ファイルハンドルが通常のオブジェクト(ordinary object)になり、普通に変数に代入できるようになった
- 英語センス的にはRubyより好ましい部分が多い。例えばRubyのcase〜whenにそっくりな制御構造が導入されたが、Perlではgiven〜whenと自然な英語になっている。
- さんざん落し穴を掘ってくれた「コンテキスト」は健在。scalar, listだけでなく、boolean, numeric, string, object, それに加えてflattening listやらlazy listといった恐しげなコンテキストが大量導入されている
- 変数に制限事項を加える"trait"と値に加える"property"が導入されている。一見便利そうだが新たな頭痛の種になりそうな気がする
$hoge is constant = 14;
$true = 0 but true;
- Perl5の緩やかなオブジェクト指向サポートと違い、普通の言語っぽくクラス定義できるようになった
- attributes(instance variables)には"."を付ける
class Hoge {
has $.fuga;
has $.moga is public; #traitを使ったアクセス制御
}
Parrot
- 4種類のレジスタを持つ。Integer(I), floating point Number(N), String(S), Parrot Magic Cookies(P)それぞれ0〜31の32レジスタを持つ。
I0
N31
S14
P26
- Parrot assembly languageは以下のように表記される
[label] opcode dest, source, source, ...
- 返値がある場合はdestに入る
- sourceはconstantでも可
- 最初の引数がdestとsourceを兼ねる場合がある
- "print"や"seek"がopcode扱いなのがイヤな感じ。標準入出力うんぬんはもっと上の層で扱ってほしい(Cのように)。opcodeにもcoreとそれ以外といった区分があるようなので要調査
- hoge.opsというファイルを作れば独自opcodeを定義できるらしい(どの時点で?)
- parrot/languagesの下に色々な言語のコンパイラが用意されている。実用度は不明
- perl6
- parrot_compiler
- imcc
- miniperl
- python
- ruby
- scheme
- regex
- forth
- BASIC
- CPUアーキテクチャ毎に定義されたopcode別のマシンコード生成関数(マクロもあり)を呼ぶと、メモリ上にマシンコードを書き出すようになっている。アーキテクチャ依存のアセンブリや中間コードは介さず、バイトコードのopcode毎に定義されたマシンコード列生成関数でまとめてゴリゴリと書き出される。この方法ではマシンコードレベルの最適化が効かないが、GCCと連携するような仕組があるらしいので、そちらで何とかするのかもしれない。詳細はまだ調べていない
用語
- IMCC
- Intermediate Code Compiler
- PIR
- Parrot Intermediate Language
その他
- Googleで Parrot, Ruby, Rite, JVM, CLR等の単語を組み合わせて検索すると色々引っかかる
- CLR, Parrotと調べたから、ついでにInferno, QEMU, GNU Lightningあたりも調べてみるといいかもしれない。余力があればGNU PrologやSqueakも?