K.Sasada's Home Page

こめんとのついか

こめんとこめんと!

message

please set comment :).

_28(Mon)

infoweb とうちの大学の DNS は仲が悪いらしい。


先生、Ruby での正しい Lexer の作り方とはどうやるんでしょうか。速いのは正義って方面で。

自分での考察は、今忙しいから後で・・・。


レポート終わり。予想外に疲れた。そりゃ、これじゃぁなぁ・・・。

ぱんださん幼稚園を検索するようなリファラが残ってると、ちょっとこの日記の意義について考えてしまいますね。


昼飯 昼飯。食べたの17時だけど。キーボードは食べてません。

隣のまよは何に使ったか。正解はこちら>正解

(スクリプト自体に手を加えました。やれやれ)


lex 最速伝説。

予備評価。

pa = [lambda{|i| i += 1 }]
sa = [:m]
def m i
  i+=1
end
yloop{
  pa[0].call 3
}
yloop{
  send sa[0],4
}
#  0.547000   0.000000   0.547000 (  0.546000)
#  0.359000   0.000000   0.359000 (  0.360000)

proc.call よりも、 send :symbol のほうが速いらしいです。


ruby じゃないんですけど、gauche とかで、文字列中の #(...) な S式を展開してくれる、とかしてくれるとどうですかね。

"1 + 2 = #(+ 1 2)" => "1 + 2 = 3"、みたいな。


いや、lex って、 strscan 使って、1トークンづつチェックしていくってのが主流だと思ってたんですが、他の方法を考えてたわけです。でも、速くならないですねぇ。なんか手はないものか。

考えたのは、トークンを全部一個の正規表現につっこんで、/(Token1)|(Token2)|.../ みたいな感じにするもの(もちろんこれも strscan は使うわけですが)。どの()にヒットしたかは、しょうがないので MatchData#[] で1から探していく。これがボトルネックなんかなぁ。

読書会の最中にずーっとやってた(やるなよ・・・)予備評価ではそこそこうまくいくはずだったんだけど。世の中うまくいかんな。

オートマトンのなんとか、とかやったって多分うまくいくはずないしな。

んー、strscan の C のソースにぐちょぐちょ入れても素朴な実装のほうが速い。ruby レベルで場合分けするよりも、正規表現につっこんでやったほうが速いと思ったんだけどなぁ。残念。

いや、StringScanner_C#scan 自体は1/3の速度になってるから、どっかほかのところでポカしてるのか。はてさて。

あー、違った。StringScanner_C#scan のトータルタイム増えとる。増えとる。これが原因か。

いっそ、正規表現とアクションの組を持たせるほんとに lex みたいなのを C で作るのが速いか。

そこまでやる意味があるんですか、と言われそう。しくしく。

_KM(Mon Jul 28 13:57:22 JST 2003)

 djbdns の dnscache を使えば,とりあえず手元のマシンは安定するかも.

_(う)(Mon Jul 28 18:12:09 JST 2003)

 せんせい! 1枚目の写真のURLが間違ってます!

_kou(Mon Jul 28 23:32:51 JST 2003)

 Gaucheであれば#`"1 + 2 = ,(+ 1 2)"で出来そうです.

_ささだ(Mon Jul 28 23:39:58 JST 2003)

 すみません、知らないで適当なこと言ってました。

_kjana(Tue Jul 29 14:23:54 JST 2003)

 flex の出力をラップするものがあったような。

_kjana(Tue Jul 29 14:28:53 JST 2003)

 っていうか MoonWolf さんの tlex はどないでしょ?

_ささだ(Tue Jul 29 21:37:31 JST 2003)

 う、状態付きスキャナのような高級な話まではいかなくて。DFAとかでガリガリ ruby レベルでやろうとすると、遅いと思うのです。評価してないけど。んで、strscan でやると、各パターンについて総当りをかけて、ってことになって、これもなんとかならんかな、というのが動機でした。なんとかならんかった、というのが今回の結論ですが。もっと C に落とせる定型部分はガシガシ落とさないと速くなりそうにないですねぇ。速さを求めるのが ruby プログラミングとしてどうか、という気もしますが。


好きにコメントを編集してください。ただし、あまり他の人のコメントを書き換えることは感心しません。



back

tton 記述が使えます。YukiWikiな記述してりゃ問題ありません。

「行頭に#code」 と、「行頭に#end」 で挟むと、その間の行は pre で囲まれます。プログラムのソースを書くときに使ってください。

例:

#code

(なんかプログラム書く)

#end

リンクは

[[なまえ|http://www.example.org]]

とか

[[http://www.example.org]]

で貼れます。

$Date: 2003/04/28 10:27:51 $