プロが教えるわが家の防犯対策術!

例えば、世界コンピュータ将棋選手権に参加している強豪将棋ソフトはほとんどC++でプログラミングされていると思います。
JAVAも似た言語のようですが、JAVAでつくられていないのはなぜなのでしょうか。
また、VisualBasicでは、このような高度の人工知能をプログラミングするのことというのは出来ない、または、C++に比べてもはるかに不向きなのでしょうか。

A 回答 (2件)

>「コンパイラならばある程度できます」とありましたが、これはどのような意味なのでしょうか。


コンパイラの構造
http://www.seto.nanzan-u.ac.jp/~hachisu/compiler …

で、中間コードからコードを作成するときに、たとえば、8ビットCPUの場合
LD Aレジスタ (適当なアドレス)
LD Bレジスタ (適当なアドレス)
ADD Aレジスタ Bレジスタ
LD (適当なアドレス) Aレジスタ
(同じような処理が延々と続く)

で和が処理されます。1980年代の「頭の良いコンパイラ」ですと、演算結果を適当な内部レジスターに保存して、主記憶装置に保存することなくその後の計算に使用する、いうような処理をしています。

ところが、Visual Basic の場合には、中間コードのまま処理しています。だからやたら遅い。VB用DLLファイルの一箇所の参照先を参照する(共通ルーチンの呼出)ので、その後、巨大なDLLファイルのどこを実行するのか、という分岐ルーチンがあり、その分岐終了後にちょっとの時間実行されて、戻ります。「分岐ルーチン」分が無駄になります。「分岐ルーチン」部分は先読みが効きませんし、CPUのキャッシュがほとんど効かない部分です。

>「人力によるソースの操作が必要」という個所なのですが
たとえば、
LD SI (適当なアドレス)
LD CX (適当な個数)
LD A (適当な値)
(ジャンプ先)
LD (SIの示すアドレス), (Aレジスター)
SUB SI , 1
SUB CX , 1
CX が1以上ならば(ジャンプ先に移動)

という主記憶装置の塗り潰しルーチンですが手作業でやると、PUSH 命令に置きかえる(減算命令を消す)ことで高速化ができます。
C言語ですと、データエリアとスタックエリアを区別しないで使用する、という方法も(普通の状態では使えませんけど)可能です。極端な場合、ポインターを消してしまうとかの方法もあります。

極端な言い方をすれば、C言語の場合CPU依存のソースコードがかけることです。
    • good
    • 1
この回答へのお礼

回答をたいへんありがとうございます。
まだ、深く理解できませんが、頂いた回答を元に私になりに調べまして、理解していこうと思っています。
学習の参考資料として活用させて頂きます。
少なくとも、VBとCでは、実行した場合、処理速度という点でいかんともしがたい差があるということは、わかりました。

お礼日時:2009/09/07 20:20

Basic 言語で、コンパイラならばある程度までできます。


JAVAでも、できないことはないですが、きついです。

というのは、
「将棋ソフト」の場合、すべての可能性を端から順番にたどって行き、その中からもっとも良い条件にある内容を選択する
という手法を使っています。
ですから、コンパイラといっても、単なる共通ルーチンの呼出しか行わないVisual Basic やJAVAでは、処理が遅く使い物になりません。
高速処理をする場合には、どうしても、人力によるソースの操作(重複作業部分の削除)が必要なので、C言語しか現状では対応できません。

この回答への補足

回答ありがとうございます。
なかなか専門的で、難しいですね。
でも、Cが使われる理由が少しわかりました。

補足日時:2009/09/05 20:49
    • good
    • 0
この回答へのお礼

回答たいへんありがとうございます。
すいません。補足要求の欄に記入するべきでしたが、ここのお礼の欄に再度申し訳ありませんが、お尋ねさせて頂きます。
頂いた回答の中で、「コンパイラならばある程度できます」とありましたが、これはどのような意味なのでしょうか。
コンパイラという言葉自体の意味はは一応心得ているつもりですが、いまひとつ門外漢の私にはよくわかりませんでした。
また、「共通ルーチンの呼び出ししか行なわない」とか、「人力によるソースの操作が必要」という個所なのですが、何か、CにはVBやJAVAなどとは違う強力な機能・仕様があるということなのでしょうか。ポインタなどがそうですか。

お礼日時:2009/09/05 20:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!