朝まで七輪、またもや開催

abdev 27 Comments »

一日中パソコンやってると、精神的にくるものがあります。ってなことで、昨夜も店長、ジョニー先輩、MIC、フカちゃん、オギさんというお決まりのメンバーを呼んで七輪大会をしてしまいましたf(^^;;;

涼しくなった夕暮れ時の七輪はマジで最高です。こんな日が毎日続けばいいのに・・・・・

最近、十分な睡眠をとれずにいるのですが、今回も案の定、明け方の7時まで記憶があります。そんなこんなで今日は頭が働いていないんで、昼間はボーっとしながら、今日こそは早寝をするぞー

レジスタベースの演算コード生成

abdev レジスタベースの演算コード生成 はコメントを受け付けていません

遅寝早起きで爆進中でございます

今朝は演算コードの生成部分についてのディープな話から…。しかし、この話題はコンパイラの中核を成す部分だといっても過言ではない、と〜っても重要なところなんでやんす。

コンパイラに搭載される演算コードの生成部分。例えば、

Dim a As Long
Dim b As Long
Dim c As Long
b=10
c=20
a=b+c

こういうソースコードをコンパイルすると、下記のようなアセンブルコードが出力されるんですね。

;b=10
push 10
pop eax
mov dword ptr[b],eax

;c=20
push 20
pop eax
mov dword ptr[c],eax

;a=b+c
push dword ptr[c]
push dword ptr[b]
pop eax
pop ebx
add eax,ebx
push eax
pop eax
mov dword ptr[a],eax

なんだか、わかるようなわかんないような・・・・・。とにかくpushとpopばっかやないかぁ〜!というのが正直なプロフェッショナル様方のご意見であって、あまりいいコード生成をしていないことは確かです…。

では、なぜpushとpopばかりになってしまうんでしょうか。そもそも、pushとpopって何か悪いことでもあるんでしょうか。

正直にお答えすると、pushとpopは必要でなければ無くなってほしいというのが本音なんですね。なぜかというと、いちいちメモリにアクセスしなければならないからです。pushという動作は、下記のような動作を行います。

  • espをsizeof(DWORD)分だけ加算
  • レジスタの内容または即値をespが示すメモリへコピー

popも同じく、この反対の動作を行い、メモリの内容をレジスタへコピーしてくれます。メモリにアクセスするのをどうして嫌がるかというと、遅いからなんです。演算を行うたびにいちいちメモリにアクセスしていたら日が暮れてしまいます(ちょい大袈裟!?)。最小限のメモリアクセスで、後はレジスタだけで演算してくれや〜というのがPCの方針であって、pushとpopはレジスタが煮詰まったときの最終手段だぞぃ、というのが本来あるべき姿なんです。

それでは先ほどのソースコード、どのようなアセンブラが出力されればめでたいんでしょう。

;b=10
mov dword ptr[b],10

;c=20
mov dword ptr[c],20

;a=b+c
mov eax,dword ptr[c]
add eax,dword ptr[b]
mov dword ptr[a],eax

う〜ん、マイルドでソフトなコードです。メモリアクセスやコード量を最小限に抑えています。それじゃ、最初からこういうコードを生成してくれるよう、コンパイラを改良してくれよ。と言いたくなるのですが、そうなると話は格段と厄介になってきます。

コンパイラはそもそも、どのようにして演算コードを生成しているんでしょう・・・・・?

まず言えることは、逆ポーランドに則り、コード生成を行っているっつーことです。逆ポーランドは、pushとpopを繰り返すことで演算を実現させているのですが、コンパイラは飽くまでもこの規則に則ってコードを生成しておるんです。

まぁ、おいらがネイティブコンパイラを作り始めたのは2003年の春のことですよ。もう、2年半前の出来事です。プログラミングさえ初心者レベルだというのに、こんなやつが作った演算コード生成部分は逆ポーランドに振り回されてpushとpopを繰り返してしまう、この程度のものです。

しかし、ABはVer5.0で64ビットに対応することになっとります。しかも、64ビットに対応させるためには、既存のコンパイラを作り変えるくらいの勢いが必要なんです。ということは、このような汚いコード生成部分を書き換えるチャンスなんです。レジスタだけでキレイに演算してくれるような、そういう機構を今このタイミングで作ってしまえばいいんです。

しかしですね、そいつを作るのは非常に大変なんですね。機械語というのは、ひとつの命令(例えばmov)であっても、状況に応じて、色々な形に変身するんです。

mov reg32,dword ptr[offset]
機械語 … 1000 1011 00rr r100 0010 0101 [32bit offset]

mov reg32,dword ptr[base_reg+offset]
機械語 … 1000 1011 10rr rbbb [32bit offset]

mov reg32,dword ptr[base_reg1+base_reg2+offset]
機械語 … 1000 1011 10rr r100 00bb bsss [32bit offset]

※機械語は2進数表記、"r" はreg32の識別フラグ、"b" 及び "s" はベースレジスタの識別フラグ

32ビットのmov命令だけをとっても、10種類以上の表現方法があるんではないかというくらいの勢いなんですね。別にアセンブル機構をソースレベルで持っているわけではないんで、こういう多種多様な命令を機械語化したいときは別途、アセンブラ命令→機械語への変換関数のようなものを作ってやる必要があります。

しかも、先ほどの話に戻って、演算の状況に応じて、多種多様なオペランドをそのつど指定していくのは、つらい作業です。それだったら、pushとpopを繰り返してしまったほうが10倍(もしかしたら100倍)くらい楽なんですよ。

まぁ…その…なんだ…

こういうこともありつつ、爆進中でございますので、「対応が遅い」だの、「メール送ったけど返事が無い、または遅い」とかがあっても、あまりお叱りにならないでください。

今がやまばでもあるんで、これを切り抜けられたらもっと面白い企画をDiscoversoftとしてやっていきますんでm(__)m

XMMレジスタが大活躍

abdev 3 Comments »
  • Pentium
  • MMX Pentium
  • Pentium 2
  • Pentium 3
  • Pentium 4
  • K6
  • K6-2
  • Athlon
  • Athlon XP

突然ですが、このリストは皆さんご存知の32ビットCPUの仲間たちですね。色々な技術がてんこ盛りのことだと思いますが、ベースとなるものはx86。特殊命令を除けば、すべて互換性があります。

ところで、VC++やABなどのネイティブコンパイラは浮動少数演算を行うときにFPUという特別なレジスタを利用することになるんですが…。このFPUというものはx86系のCPU、即ち上記リストで示したようなCPUであれば搭載している機構なんです。とすると、FPUに対応するネイティブコードを生成してやれば、ほとんどの32ビットCPUで演算可能になってくるんですね。そういう意味で、昨今までのネイティブコンパイラはFPUを使いまくっておったんだと思います。

しかし、時代は64ビットCPUの世界へと塗り替えられていきます。

  • Pentium 4 (6xx)
  • Athlon 64
  • Opteron

これらは登場して間もない64ビットCPUです(以下AMD64)。もちろん、AMD64もx86と同様にFPUレジスタは積んでいますし、それだけで十分に実数演算を行うことができます。しかし、よ〜く考えてみると、このFPUレジスタってやつはちょっと使いづらいんです。スタックベースだし、128ビットは使えないし(80ビットまで)、本数も8本だし…。まぁ、通常の用途であれば、こんなもんで事足りるんだと思います。

しかし、64ビットCPUは、64ビット演算をフルに行いながらそのポテンシャルを引き出していかなければ意味がありません。せっかく、汎用レジスタが64ビットになったんだから、double型演算なんてのもお手の物であってほしいものです。rdx:raxとレジスタを連結させ、128ビット整数型/128ビット浮動小数型なんてのも使いたいもんです。

そこで登場するのがSSE2です。SSE2は今現在リリースされている64ビットCPUすべてが対応しているハズです。っつーことは、64ビットネイティブコードからはFPUなんか使わなくても、SSE2に対応するコードを吐けば、AMD64上の話では互換性は十分に保てるということになります。

SSE2では、XMM0〜XMM15という16本の128ビットレジスタを利用できます。しかも、スタックベースではないんで、通常の汎用レジスタ感覚で利用することができます。しかもしかも、32ビット値を4つ同時に、64ビット値であれば2つ同時に扱うことができてしまいます。

いいことづくめで互換性もあるSSE2なんで、AMD64対応のネイティブコード、実数演算はこれで決まりですね。

こんな発見をしつつ、64コンパイラの開発は進みます・・・・・

登校日

abdev 登校日 はコメントを受け付けていません

すっかり忘れていました。自分が大学生だったってこと。8月、9月は夏休みなんで、その生活スタイルはフリーターと変わりないんですよね。そんでもっておいらはバイトに開発と色々と忙しかったんで、いつから学校が始まるかなんて気にも留めていなかったんです。

今朝、PCをつけると友人EarthがIMにログイン。表示された名前に “Earth@登校日” みたいなことが書かれていたんで、まさかと思って聞いてみると・・・・・

そうなんです。今日が登校日なんです。学期始めのガイダンス日で、成績表なんかも今日渡されるんです。そういえば、おいらは大学生だったんだと、改めて実感させられる瞬間です。

いつもは味わっていないキャンパス内での学生気分、今日は満喫してみます。←ガキんちょがいっぱいいるんだろ〜な〜(っておいらもガキんちょですが…)

x64のAPI関数呼び出し

abdev x64のAPI関数呼び出し はコメントを受け付けていません

x64対応のEXEファイルのPEヘッダ、基本的な部分は解読できました。そして今日はなんとか、簡単な計算プログラムをコンパイルできる状態へと持っていくことができました〜。コンパイルとはいっても、64ビットモードで動作するめちゃくちゃ簡単なネイティブコードがはけるようになっただけですが…

ところで、x64の関数呼び出し規約って、昔のそれとはちょっと違うんですよ。何が違うかってーと、レジスタ経由が前提条件になっているんです(先日も言いましたね(^^;;;)。詳しく言うと、第1〜第4パラメータがrcx、rdx、r8、r9レジスタで引き渡されるんです。

今現在のABコンパイラは、逆ポーランドに則り、pushとpopを多用することにより、演算部分のコード出力を実現させています。しかし、これではレジスタのみで演算が事足りる場合でも、いちいちメモリアクセスを必要としてしまうため、効率的であるとはいえません。コード最適化の面から言えば、「最悪」という評価が下されることでしょう。

しかし、「x64関数はレジスタ経由でのパラメータ引渡しが前提条件になっている」このような機会は逆にチャンスです。このタイミングでコンパイラの演算部分を改良し、適切なレジスタ同士で演算が行われるようなコードを吐けるよう、改修作業を進めようと思います。

まぁ、このレジスタを効率的に利用するってのがコンパイラ設計者の真の悩みだったりするんで、一筋縄ではいかなさそうです…。ボチボチやってきます

IPAの第4回事業化情報交換会に出席

abdev IPAの第4回事業化情報交換会に出席 はコメントを受け付けていません

またまた東京です。午前中は実家酒屋の配達を手伝い、正午ギリギリに東京へと出かけます(新幹線に乗り遅れそうになりました。アブナイアブナイ)

IPAからの事業化情報交換会のお誘いメールは先日届いたのですが、無知なおいらはその内容を知らないまま、参加申し込みをしてしまったんですね。

事業化情報交換会ってのは、ITベンチャー企業の投資、融資に関する情報提供の会のようなもので、まだちょっと敷居が高かったかも…。でもでも、とても参考になるお話は聞けたんです。起業してみたいという野望を持つものとして、事前勉強会が受けられたと思えばお安いもんです。普通の学生がいけないような場所へ行くことができたんですから。しかも、後半はあの元日本オラクル社長、アレン・マイナーさんの講演を聴くことができたんです。もうおいらにとってこれほど刺激を受けることはありません。「成功」ってなに、自分にとってどんなもの?ウーン、深く考えさせられます。

それにしても、「ベンチャーキャピタル」。なんて良い響きなんでしょ。数年後はぜひともお世話になりたいってもんです。とにかく、目の前にある仕事、がんばります。

64コンパイラの開発スタート

abdev 3 Comments »

寝る時間を惜しんでまで、64ビットネイティブEXEのPEヘッダと格闘しています。第一ラウンドはなんとか勝ち越せそうなのですが、どうもWin64の関数呼び出しに戸惑いそうな雰囲気…。

Win64の規約って、変に速さを意識しているのか、デフォルトでレジスタを使ってるんすよね。_fastcallみたいな感じf(–)。

そんなことより、アセンブルコードをきちんとトレースできるデバッガを仕入れようと思います。Windows XP x64 Editionの上では、VC6.0のデバッガは無力です(ホント、トホホです)。←肝心の64ネイティブコードのデバッグができません。おいらは持ってないんで詳しいことはわからないんですが、VC.NET 2003に変えれば、ここらへんのデバッグサポートはきちんとしているんでしょうか?今現在はVS2005 Express Editionでなんとか踏ん張ってます。

まずは痒いところまで手が届くような、高機能デバッガでも探してみないと始まらないっすね。これいいよ、みたいなのがあったら教えてくださいm(__)m

念願のブツがとうとうウチに(≧∇≦)

abdev 念願のブツがとうとうウチに(≧∇≦) はコメントを受け付けていません

連休の中日ということで、今朝も相変わらずおそ起き。

で、起きた直後なんですが、唐突に一本の電話がなります。「ぁんだよ〜、またどっかのわけのわからん業者かぁ〜?」と思いながら、さえない声で電話に出ると、おかーちゃんでした。

どうも、宅配業者がウチに荷物を届けたいらしく、当の本人(おいら)がいるか、自宅電話に確認を取ったとのこと。←おいらのケータイじゃないのはナゼ??

まぁ、とにかく、おいらは起床直後で、一日中することもないんで、在宅確認は取れたんですね。すぐに届けますとのことだったんで、顔でも洗って着替えておくかと思った次の瞬間、「ピンポーン」と玄関からチャイム音が…。はやっっっ。いくらなんでも早すぎるでしょうよ。だって、おいらがおかーちゃんの電話を切った2〜3分後の話ですぜぃ。

たぶん、宅配のにーちゃんはおいらのウチの玄関前に既におったということでしょう。

こんな前置きはいいんです。今日のメインはこの送られてきた品!待ちに待った念願の64ビットPC!!!キタァ〜って感じですよ。もう今日は朝からハイテンションで、予定は無しにします。今日だけは外へ出ません宣言をさせてください。インテリでいいです。オタクでいいんですー(ここまで言ったら、なんか気が抜けました)。

まずは、この気持ちをブログに書き残して、それから腹ごしらえをして、新PCスペースの掃除を徹底的にして、それから開封します。

構想と共に、膨らむ悩み

abdev 構想と共に、膨らむ悩み はコメントを受け付けていません

東京から終電で帰ってきた昨夜。酒を飲みつつのミーティングの内容は核心をつくものばかりでした。東大の内部事情の話題から始まり、ネットゲーム開発に関すること、おいらにとって重要な10年後の言語市場について、などなど。

自己保身が確立されていない今、おいらはなんとかして将来のソフトウェア業界で食いつなぐ手法を模索しなくてはなりません。単純に就職先の会社でえらい人になることがそうなのか、はたまた、この路線のまま、ABを成熟させてそこでなんらかのアクションを待つのか…。

まだ自分の考えがまとまってないのが現状ですが、双方ともおいら的には納得いかないことは確かです。まだ若い証なんでしょうか…「会社人間なんかにゃなりたかぁねーよ」みたいな幼稚な考えを持つこともそうですが、やはり、おいらの本音は(技術的レベルは百歩譲って無しにしてやって下さい)将来のソフトウェア社会に大きく貢献していきたいことです。これは、システムソリューションの構築に積極性を持って取り組むんでもなく、ネイティブコンパイラの世界を突っ込みまくるのでもなく、もっと単純な、純粋な話です。

で、結論から言うと、「進化しつづけるコンピュータと人間との関連性」これにつきます。この間を取り持つのは、「言語」なんですよね〜。よく考えてみてください。言語というものは、他の生物が持ち合わせない、人間のみぞ知る、特別なモノなんですよ。人間ってのは何万年前だかわかんないっすけど、その頃から言語を持ち、その形を変えながら成熟させて、今の楽しい世界があるんですよね。その多大性には震えたつものがあります。

コンピュータが生まれてからはまだまだ半世紀ほどしか経っていません。付け加えると、オブジェクト指向が騒がれてから早30年。しかし、オブジェクト指向の技術が本当の意味で広まってきたのは、ここ10年という、そういうレベルでの話です。ハードウェアの進化は正直いってすごいです。気付くと早さや容量が10倍とかになってますし、まぁ、凡人からするとありえないスピードだといえます。しかし、そのハードウェアを操るための「言語」そのものの進化は遅いんですよね。なぜなんでしょうか。

人間が本来持ち合わせるコミュニケーション言語の成長過程と、コンピュータ言語の成長過程を比べることは非常に興味深い考察なのかもしれません。やはり、経験の無いおいらは簡単にこういうところにハマってしまうんです。

昨夜は自宅へ帰ってから(PM11:30頃)、明け方4時くらいまでこのことで頭がイッパイになってしまってって感じで、もう大変なんですよ。やはり、将来は「人間」のみが持ち合わせる「言語」という特別な機構に携わっていきたいというのが本音です。「言語」はある意味政治のようなもので、それを利用する大多数の人たちのことを考えなければならず、今後はますますエリートがやる分野になっていきそうです。

そういうことでして、おいらが持つ「言語」への意識がここ最近で大きく変化したことを踏まえ、今後の長いスパンでの方向性を確実に捉えていきたいところです。確実にわかっているのは、おいらが勉強不足だってこと。それこそ、言語に関する知識の低レベルさにもほどがあるぞと、自分に言い聞かせたいほどです。まずはこういうことがわかったので、勉強あるのみです。自分で「勉強します」というのは、気持ち悪いのですが、もうそんなこと言っている場合じゃないです。

このように大袈裟にさわいでみたんですが、まずはコーヒーでも飲んで、落ち着きますわ。午後は地元のヤツと遊びいく約束してるし・・・♪←ヒマな学生という精神は捨ててない/(–)/

東京でミーティング

abdev 1 Comment »

今朝もちょっと遅めの起床。起きてからは開発作業のほうを進めています。今日の作業内容はパラメータヒントを複数行に対応させること。

プロジェクトエディタのコード解析部分(コンパイラとは別)をいじるので、まぁ、それなりには大変なんですが、なんとかできあがってきました。次回のバージョンアップには適応できそうです。

夕方からは未踏仲間で約束していた東京でのミーティング。意見交換や作業的に突っ込んだ内容なんかを話しながら、飲んできます。

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン