Today アクセスカウンター Yesterday アクセスカウンター

買った本

向井さんにコメントをいただき,慌ててオープンソースマガジンの先月号を買いに行って来ました.

OSM 2006年 10月号

この号は,以前も異様に執筆陣が豪華だったので,本屋に行った時に目をつけていたのに,なぜか買い忘れていた号 ! 2 重の意味でしまったー と思いつつも 「落ち着け… 素数を数えて落ち着くんだ… 北海道の時間は,本州よりも一週間ぐらい遅い… まだだ ! まだ間に合う ! (かも) いいや,押すね ! バイツァ・ ダスト !!」

と行ってみたら,まんまとふつうにありました.さすが札幌クオリティ.11 月号の発売日が 10/7 なのに気にしない ! そこにシビれる,アコがれるゥウウ !!

# 以前さかいさんの記事がなかなか読めなくて落ち込んだりもしたけど私は元気です.私,この街が好きです.OSM のバックナンバーに,時を越えて会うことができるから ☆

とまぁ,当初は FUSE 記事が目当てだったのですが,なんだかメジャーな匂いがして,ミーハーチックな自分がいやになってきて,なんだか飽きてしまいました.これじゃまるで,OSM で特集されたから飛びついたみたいじゃないか… っ !

(サブカル系マイナ嗜好厨キモすぎ > 小生)

という,(実は普通にメジャーな) インディーズバンドを追っかける田舎の中学生みたいな未熟でどうでもいい感性は置いておいて.

実はまだ Shiro さんの記事しか読んでないのだが,ひじょーーーーーーーーーーに面白かった.

特に

「stalin は,Siskind 氏が本業の傍ら,専ら個人で使うために開発している処理系のため開発ペースが速いとは言えませんが,実行時性能の高さには定評があります (ただし,そのつっこんだ最適化のために,コンパイル時間が数十分に及ぶこともあるのですが)」

の括弧内の部分.あー,やっぱりー と w

C/C++ みたいに,型が付いてて,分割コンパイルを許す言語は,コンパイル時間は短くできるんですけど,そのぶんプログラム全体まるごとのみこんで最適化,みたいなことは,あんまり行わないような気がします.

Linkers & Loaders を読んでいたら,せいぜいリンク時に GC (どこからも参照されていなくて使われてない関数や変数を取り除く) やインライン展開などの最適化を行うのがせいぜい,みたいな.

まぁ,それはそれで,動的リンクや分割コンパイルのメリットを最大限に享受でき,コンパイル時間も現実的になるという良さもあるのですが.私は,ここらへんのフラットさ,柔軟性の乏しさが,長年 C 言語の重大な欠陥というか,嫌なところだと思って来ていたので.

でも,そういう主張は気いたことが無かったので,今回のコレを読んで,「おお,やっぱり,これはアリなんだ ! 」と勇気付けられました.やっぱり動的な言語は,プログラム全てのみこんで,その宇宙の中で型付けしてフロー解析して最適化してくしかないんですよね.逆に言うと,かなり突っ込んだ最適化もできるので,C/C++ とかの,何重ものライブラリ階層を挟んだフラットなコードよりも速いコードを容易に出せる可能性が生まれて来る.

ET 言語ってのは,基本的にはアトム置き換えで実行が進んで行くので,もうひたすら部分評価部分評価で,関連する全ルールを全て取り込んでゴニョゴニョするというやり方で,今私は ET の最適化コンパイラ (C がオブジェクトコードなので,正確にはトランスレータかも) を作っているのですが.

# ちなみに,ET 言語については,ここらへんでもちょこっと書いてた.

これらの最適化は,とにかく時間がかかるので,「う〜ん,いろいろ厳しいと言うか,現実的じゃないのかな… 」と思うこともあったのですが.

逆に考えるんだ,コンパイルに 1 時間かかっちゃってもいいんだ,と考えるんだ !

(今のところは,小さなプログラムしか扱ってないので,せいぜい数十秒ですが.それでもかなり長い気がします.もし,e-lerning system みたいな,非常に巨大なシステムをまるごとコンパイルするときには,いろいろ工夫しないと駄目かも)

まぁ,普段はインタプリタで実行すれば良いわけだし.なにも言語処理系だけでエラーチェックをする必要もないわけだし (あと,ET 言語の場合は,そもそもプログラム自体が中間言語の表現方法に過ぎないので,仕様のレベルで型が付いてれば,そのまま型付きの言語と同じようにコンパイルもできるだろうし.私にはまだそんな技術はありませんが).

あと,Matz さんの書いた,プログラミング言語の歴史を振り返る記事が,(おこがましいですが) 私が昔書いた記事と切口とかがほとんど同じ (というか,あたりまえか w) だったので,けっこううれしかったです.おー,だいたいはそれっぽいこと書いてたんだな,と.

テキトーな小生の卒論

まぁ,紙面や読者層の都合もあったのでしょうが,Prolog や制約プログラミング方面がごっそり抜けてたのが,ちょっとひどいと思いましたが w

上 (産業界) のほうがやたら細かいのに,下 (アカデミック) の方は,ML → Haskell とか,略しすぎのような w KRC とか Miranda という流れは無視という.

良く知りませんが,ここらへんの構文とか,パタンマッチとかには,けっこう Prolog の影響も大きかったんちゃう ? という気もしますな (もう細かい歴史はほとんど忘れたけど).けっこう断絶が激しい (というか,Prolog の人たちが,フランス語でしか論文を書かなかった…) ので,別な流れがあるのかもしれませんが.そもそも,オブジェクト指向には,AI 研究の流れがあるわけだし.ミンスキーのフレーム論理とか,後の心の社会理論とかは,まんまオブジェクト指向やエージェント指向 (あるいはアクター) の考え方の基礎だし.

個人的には,OSM は,DVD とか付けないで,記事だけで 1000 円とかの方が買いやすいような.もう後の祭ですが.

あともう一冊は,k.inaba さんの本と迷ったのですが,けっきょく k.inaba さんに薦められたExceptional C++」 を買ってしまいました.

感想は… まだ眺めた程度ですが…







う〜ん




あれれ,おかしいなーまったくりかいできないぞ.



一ページ目から,以下のコードのイテレータの使い方の間違いを 4 つ指摘せよ,的なレベル.完全においてけぼりですな.


う〜ん,C++ の莫大な大きさの標準ライブラリどころか,構文すら怪しい初心者の私には,全くもって理解不能 (だいたいはわかりますけど).


C++ をまともに使うには,このレベルの知識が要求されるのかねぇ.

ということで,私はプログラマに向いてないことがよくわかったので,田舎に帰って米でも作ってほそぼそ生きて行こうと思いました.

こういうハイレベルな本 (C++er には常識なのかもしれませんが) を見てると,Joel とかが良く言う,「自分たちのチーム以外が書いたコードは,率直に言ってゴミなのだ」という言葉が理解できるような気がする.


そりゃあ,ここまで意識に差があったらねぇと.C++ 使いが,いつもいつも Java をオモチャ扱いする気持ちも理解できる気がしますな.

TC++PL か C++ Primer も買わないと駄目なのかね…

まぁ,とりあえず,じっくり読んでみよう.教養として.わからなくなったら,ブログで偉い人達に聞けば良いし w (C++ はいっぱいいるだろう)

いずれにせよ,このレベルの日本語の本が普通に出版されているということ自体が,C++ の一番の強みのような.

他の言語なんて,9 割以上がどうでもいい (つまり,Web 上で間に合う程度の) 入門書なんじゃないかな ? 哲学とか,コンセプトのちょーでぃーぷな部分まで,一般人が一応まとまった書籍の形で読むことができるということ自体が,C++ の普及度と重要性を示唆している気がします.そりゃあ,アカデミックの方が,理論的に綺麗でまとまっていて先を行っているのかもしれないけど.それを追えるのは,たとえ学者でも,ほんのごく一部の専門家のはず.これはちょっと,他の言語では追い付けないと思う.

# いや,洋書はいっぱいあると思いますが… (英語読めない人)


あと,よくブログの自己紹介とかに,「使える言語 : C/C++/Java/Perl/日本語」 みたいなのがあったりしますが w

「使える」のレベルに,とんでもない上下差があるというのも,C/C++ 独自のような.

まぁ,結局は,GC はエライ ! C++ Sucks ! という話になるのかもしれないけどね.C++ とびょるんすぽっすとっ先生の哲学を知らないというのは,非常に損というのは正しいような気がしますな.

(私みたいなへたれが書くべきことではありませんが…)




あー,あと,OSM の付録の Berry Linux は,気軽に xgl とか Unionfs が楽しめるとかいう話アルヨ.
大変素晴らしい感じなので,今度試してみる.というか,ビデオカード買わないとなぁ.

(付録はいらないとか言った舌の根も乾かぬうちに…)




Stalin スゲーと思って,ソースを眺めてみたら.

コンパイラ自身も Scheme で書かれてるみたいなんだけど,これまたヤバイね,わけわからん.エライ密度でコードが詰め込まれている上に,コメントが一切無いんだけど.正気なのかね.Lisper は凄い.

Stalin がマクロをサポートしないってのは,なんか技術的に困難な理由でもあるのだろうか ? 単に効率が落ちるのを嫌っただけ ?




こないだ sumii さんに教えていただいた Scheme->C トランスレータの話の中に出てきた,continuation を使った backtracking の実装,実はわけわかんなくてかなり悩んでいたんだけど,解説が ! ありがたい.

継続でバックトラック

この頁の作者様は,あの知る人ぞ知る Common Lisp サイト,元「よろずや」さんみたいですな.更新が途絶えていて残念がっていたのですが,密かに (失礼) 再開なされていたようで.素晴らしい.

特にコレはすごい.もう Common Lisp が Ruby にしか見えない.

最高にキモい Lisp コードを書いてみよう with 100 行リーダーマクロ

こういうの見ると,もう Matz Lisp は Common Lisp の ALGOL 風構文 DSL ってことでいいんじゃないかと.Ruby->CL で変換して,ACL とか,CL の最強コンパイラでコンパイルと.

古い Lisp の話も面白い.もうハッカーズを読んだのはだいぶ昔で,当時 (大学入りたて.一番最初に読んだ本がいけなかった…) は右も左もわかってなかったからなぁ.だいぶ記憶があやふや.今もう一度読み返して見たら,またいろいろと得るものが大きいのかもしれない.

Common Lisp は,defun がキモい,という理由だけで使ったことが無いんだよな.でも実は名前空間が分かれている方が,実用上 (処理効率,コンパイラの解析含め) は便利なのかもしれない.あと,アンチ emacs 派なんで elisp も知らないんだけど,やっぱり Lisp 使うなら emacs みたいね.

# もっと見た目がモダンになってくれれば… (軟弱) xyzzy は,もしかしたらちゃんと使い込むとひじょーに素晴らしいのかもしれない.vim 以外のエディタ使えない人なんだけど…




ちょっと前半の寝惚けながら昨日の夜に書いてた部分を読み返してみたら (というか,後半は全然タイトルと関係ない,単なるメモになってますな) フラットな抽象化, とかって曖昧で意味不明なオレ用語だったかも,と.

昔,直接人間が機械語を書いていた時代は,CPU の命令セットを拡張して豊かにしていくことが,それすなわち抽象化であり,高級化であったわけですよ.

しかし,そういうフラットなやり方 (古いやり方,固定観念の延長線上,のっぺりした悪あがきというか,アドホックというか… 言葉足らずですいません) には様々な限界があったので,後に RISC とコンパイラという,より構造化,組織化された抽象化や高級化の枠組が生まれて来たわけで.

そういう意味では,C 言語を直接高級化した C++ ってのは,そのフラットさゆえに柔軟性が低くなってしまうのかなぁと.

Lisp から C へのトランスレータってのは,ある意味では Lisp で仕様記述して,C プログラムを自動生成することにより,C 言語の抽象化力を強化していると見ることもできます.C 自体がけっこうアレなんで,いろいろ難しいところもありますが,これはこれで一定の成功を納めている優れた抽象化だと.

まぁ,計算機自体がフラットでアドホックなローカルオプチマイズの固まり (というか,x86 がか…) なんで,より豊かで体系的なアプローチが必ずしも上手くいくってわけでは無いのですが.
RISC の方が理論的には優れている (CPU とメモリの速度差が思ったよりも広がったとか,いろいろ複雑に要因は絡まっているのですが) とはいえ,現実的には,こんだけ変態的な構造ながらも,普及度と資本の力で Intel の x86 の一人勝ちになってますし. その点では,C++ は非常に実用的な必要悪,という見方もできると思います (夢想なら,誰でもいくらでも言える.現実と真正面から向き合い続けてきたじゃーねすぽすぽ先生は偉いとですよ).逆に老害とも言えるのですが.

まとまらないな… 眠い.

コメント

Secret

私が最初に第1章を読んだときは、STLなんて使ったことないし使わないから飛ばしちゃえー!っという読み方でした(^^;

JavaにはJavaで "Effective Java" → "Java Puzzlers" という素敵知識にあふれた名著コンボがありまして、あ、日本語にもなってます。
# Exceptional C++やModern C++ Designを読んでJavaをオモチャ扱いするC++プログラマがもし仮にいるとすれば、その人はただちにEffective Javaを読み始めるべきです(笑

> k.inaba さん

あー,すいません.正確には,「Java の Generics を」オモチャ扱いする C++ 「template」プログラマかもしれません.

# 私はどっちもよく知らないので,特別な感情は持ってませんが.

僕もライブラリ関係のところは飛ばしつつ,エッセンス的なところだけを拾い読みしてる感じです.まず最初に,囲い書きしているコラムだけを全部読みました (笑)

とりあえず,例外安全性のところは押さえたいですね.読んでるとだんだん憂鬱になってきますが (苦笑)

15年くらい前のMIPS Cコンパイラは、pixie というコマンドを使って
実行時プロファイルを集めてやってたような覚えがあります。> 大域的最適化

> soda さん

確か最近の gcc も,実行時プロファイルによる大域最適化を行うことができると思いました.

ああ,これかも.

「Profile feedback in GCC」
http://www.radiumsoftware.com/0512.html#051221

ただ,C 言語の場合は,コンパイル単位 (ファイル) ごとに独立してコンパイルを行わなければならないという制限があるので,大域的と言ってもかなり限定されたものになると思います.

# Ruby なんかは,その制限のため,一つのファイルに何もかも詰め込まざるを得ない状況になって,eval.c とかがエライことになっているとかいう話です.

まぁ,一つのファイルに全てのファイルを include して… という荒技も,可能は可能ですけど.

# ただ,gcc 4.1 から限定ですが,複数のオブジェクトファイルをまたぐコンパイルを行う -fwhole-program --combine という素晴らしいオプションがついたらしいですが.これによって,むりやりヘッダにインライン関数を詰め込まなくてもよくなる (のかもしれません).gcc-4.1 は素晴らしい.

しかし問題は,一度バイナリになってしまうと,もう情報が失われてしまうので,それ以上はどうしようもなくなる,ということなんですよね.固定されて柔軟性が失われてしまうという.

Java の JIT なんかも,動的にプロファイルを取りつつ,よく使う部分だけを最適化したりしていますが,これもバイトコードという,ある程度抽象的な形が残っているからこそできることだと思います.

もちろん,C 言語的な何でもかんでもバイナリの共有ファイルにすることにより再利用をはかるというのも,動的リンクやコンパイル時間の短縮など,良い面もたくさんあるのですが.

それ以外の可能性もあるんじゃないか ? みたいなのが,記事の趣旨でした.

# そもそも,プログラム = 「テキストファイル」 という形式自体が,もう時代遅れで古い概念になりつつあるのかもしれません.

コメント感謝いたします.

プログラム全体の最適化の話はすぐに何とかできるという話ではなさそうですが、 gcc の TODO リストにずっと前からあがっているはずです。この辺 (http://gcc.gnu.org/wiki/LinkTimeOptimization) が関係するはず。また mlton (ML のコンパイラ) の紹介スライド (http://mlton.org/pages/References/attachments/060916-mlton.pdf) にも whole-program-optimization の話が出てますね。

ところでまったくの余談ですが僕も数年前まで北大の大学院にいました。(専攻は物理ですが。)

> ssato さん

なるほど.まだ読んでいる途中ですが,非常に参考になります.コメント感謝致します.

ボクは C 言語の大部分のライブラリがそうであるように,一度コンパイルされてライブラリアーカイブとして固定されてしまうと,それ以上の最適化は不可能になり,たた呼び出すだけ (ライブラリの効率で律速になってしまう) になってしまうのが好きじゃないんですよね.

例えば API の設計がまずくて,本来ならばもっとスムーズにワンパスでいけるような部分でも,まわりくどく API を呼び出さないといけない場面ってのはけっこう多いような気がします.そのような時,全体に対して最適化をしてくれるならば,共通部分をくくり出したり,使わない部分を除去したりといった様々な最適化が可能になりそうなので,いろいろと期待しているわけなんですよね.

# 普段から全部コンパイルするのはもちろんストレスがたまるので,理想的には,開発中はコンパイル済みのライブラリをリンクするだけで,リリース時には全体 (全ファイル) をまるごと gcc に飲み込ませて最適化する,というように使い分けられたら良いですね (ソースファイル間の依存関係の解析はけっこう難しそうですが…).

しかし,大きなコードを一度にコンパイルしようとすると,gcc の少々過剰な重厚さ (特に g++ …) がネックになってくるような気もするのですが… コンパイラの世界も,google などのような Web の世界と同様に,スケールを真剣に考えるべき時期にきているのかもしれませんね.

# 今 Write Great Code の Vol.2 を読んでいるのですが,その中でも,superoptimizer の類はたくさんあるけど,小さなコードには役に立っても,現実のコードに対しては使いものにならないよ,的なことが書かれていたり.

>> 僕も数年前まで北大の大学院に

おぉ,失礼ですが,ssato さんはけっこうお若い方だったのですね.文体や内容などがしっかりしているので,もう少し上の方かと思っていました.

higepon さんや shinh さんを見ていると,物理や数学などのハードサイエンスの洗礼を受け,体系立てて考える訓練をきっちりやってこられた方々は,基本がしっかりしていてすごい人が多いような気がします (サンプル数が少な過ぎですが).ボクみたいな叩き上げの計算機屋 (というとかっこいいですが,要するに専門学校みたいな大学の学部で雑多な知識をつまみ食いしてきただけ.多少知識は多くても,すぐに限界がくる) からすると,うらやましい限りです (^-^)

少し違う (スケールの狭い範囲での) 話かもしれませんが、グローバルに最適化すれば高速化できるというほど、ことは単純ではなさそうです。小島さんの記事 (https://www.codeblog.org/blog/kkojima/20060827.html) に出てくる lcm (lazy code motion) 関連の論文を読むと、code motion を広域にかけずに、逆に積極的にコードのコピーを残す (= code motion を lazy に行う) 方が高速化できる場合もあるというような結論になっています。また C/C++ であってもこういうものもあります: http://www.gelato.org/pdf/apr2006/gelato_ICE06apr_llvm_lattner_apple.pdf (llvm http://llvm.org/ を紹介するプレゼンテーション)

ところで、数年前といってもより正確にはもう 6, 7 年ぐらいですし、もう若いと言えるような年ではないです。:P

> ssato さん

なるほど,非常に参考になりました.いやぁ,勉強不足を痛感… もっと精進します.

それにしても,LLVM は面白そうですね.夢が溢れています.

「圏外からのひとこと : The LLVM Compiler Infrastructure Project」
http://amrita.s14.xrea.com/d/?date=20040324#p02

>> 正確にはもう 6, 7 年ぐらい

なるほど.とはいえ,いやいや,そんなことはないでしょう (笑) > もう若いと言えるような年ではない

# ボクが言うのもなんですが
プロフィール
  • Author:あろは (alohakun)
  • 京都のデバッガベンダーに勤めるアラサー会社員。

    本ブログの内容は,あくまでも個人的な感想や意見であり,会社の意見を代表するものでは一切ありません.

    連絡先 : alohakun ___at___ gmail.com
    mixi : http://mixi.jp/show_friend.pl?id=182927
    twitter : http://twitter.com/alohakun













    あわせて読みたい


    この日記のはてなブックマーク数


    スカウター : ホワット・ア・ワンダフル・ワールド


    Map
FC2カウンター
ブロとも申請フォーム

この人とブロともになる

最近のコメント
リンク
最近のトラックバック
人生の残り日数
日本人男性の平均寿命は 28700日.
RSSフィード
カテゴリー
  1. RSSリーダー