2009-05-01から1ヶ月間の記事一覧

Optimization of sort()

Perlの最適化器はかなり頑張ってsort()の最適化を試みている。具体的には,配列をその場で直接ソートする場合,数値または整数でソートする場合,ソートブロックの$aと$bを単純に入れ替えた場合において,最適化された高速なバージョンが使われる。 以下はす…

Data::Alias is fascinating!

Data::Aliasが驚異的だ。 use Data::Alias; alias my $a = $x; # $aは$xのエイリアス alias{ my $a = $x; # $aは$xのエイリアス }; alias push @a, $x; # @aに$xのエイリアスをプッシュ このマジックはPL_checkハックによって実現されている。

Variable aliases in Perl

Perlで変数エイリアスをみることができるコードはいくつかあるが,それらはまず二つに大別できる。 真のエイリアス 疑似エイリアス 真のエイリアスは,別の名前を持つ変数が本当に一つのSVを指しているケースである。Perlの変数はXSからみれば単にSV*型の値…

Arbitrary controls of benchmarks

私はよくPerlスクリプトのベンチマークを記事にするが,ベンチマークスクリプトを書くのもその結果を評価するのも実は非常に難しいことに気付いた。そこでここでは,ベンチマークについての覚書を記しておく。 まず,ベンチマークの結果はある程度恣意的に操…

Yet another alias module: Scalar::Alias

Lexical::Typesを見て型つきレキシカル宣言の威力を知り,試してみたくなったので一つモジュールを書いてみた。 Scalar::Alias - search.cpan.org この型つきレキシカル宣言はうまく使うといろいろ面白いことができそうだ。しかもオーバーヘッドがコンパイル…

Cumulative methods using Sub::Attribute

Sub::Attributeを実際に使ってみる一例としてMethod::Cumulativeというモジュールを書いた。Damian Conway氏のClass::Stdにある:CUMULATIVEと同じ累積メソッドを作るためのアトリビュートを提供する。 なお,Class::Stdではさまざまなアトリビュートを提供し…

Iron Manに参加してみた

Nishinoさんのエントリを参考にしつつ,Iron Man Blogging Challengeに参加してみた。

Opcodeのトレースを実装した

OpcodeのトレースにおいてAcme::Perl::VMで実装したOpcode traceを,普通のPerlでも実装した。これはperl(1)の-Dtsオプションを通常のPerlで実行できるようにし,さらに出力結果をより見やすくしたものと言える。 Devel::Optrace - search.cpan.org 使用例:…

extends()をコンパイル時に

extends()がコンパイル時に実行されるようになればいくつかの問題が解決されるはず,と思って書いてみた。このextendsプラグマは,プラグマの呼び出し元がextends()を持っていればそれを呼び出し,持っていなければparentプラグマと同じ処理を行う。 # exten…

一周年

そろそろブログを初めて一周年だったはず,と思って確かめてみると最初の記事を書いたのは5/28だった。最初の記事と二番目の記事であるopen()の実体はともにPerlIOの話である。そういえばこの頃はPerlIOに興味を持っていたのだった。 また,二番目の記事は最…

サブルーチンのアトリビュートの信頼性

Perl 5.6.0以降にはアトリビュート(Attribute)というメカニズムがあり,変数やサブルーチンの宣言時に呼び出されるコールバックを設定できる*1。 このアトリビュートは実験的に取り入れられたのちに放置されるという不幸な運命をたどってしまい,現状では活…

switch文とif連鎖の比較

Perl 5.10.0でswitch文が導入されたことにより,ifの連鎖はもっとわかりやすい構文に書き換えられるようになった。 use feature 'switch'; given($foo){ when("bar"){ ... } when("baz"){ ... } default{ ... } } switch文の導入で便利になった一方,このwhe…

XSで共有文字列を活用する

Perl 5.8以降には共有文字列というメカニズムがあり,非常に限定的ながら,うまく使用するとメモリと速度の双方を節約できる。 基本的な使い方: SV* sv = newSVpvn_share(pv, len, hash); SV* sv = newSVpvs_share("..."); これでsvの文字列部分がインタプ…

Perl5の構文木をParrotコードへ(というアイデア)

B::DeparseはPerl5の構文木からPerl5コードを生成するトランスレータであると言える。この場合は生成するコードはPerl5なので「トランスレータ」にはあまり見えないが、変換先は別の言語であってもいい。というよりは、もともとはPerl5の構文木からCのコード…