ページ 1 / 1
64ビットコンパイラの行方
Posted: 2005年6月02日(木) 17:54
by 山本
tak さんが書きました:今現在64ビットの命令規格は様々なものがあります。
例えば、Itanium IA-64, AMD64, EM64T(AMD64との互換)などが主力でしょうか。
近い将来、少なくとも2年以内に64ビットの波が一般ユーザーの元にも押し寄せると僕は踏んでいますが、ABはどの規格に対応するのでしょうか?
まさか全部ってことはないでしょうw
それとも、未決定事項ですか?
欲を言えば、全部に対応したいとなんですが…(汗)。まぁまずはx64に対応していきたいと考えています。x64といえば、IA-32e(EM64T)、AMD64ですね。
・IA-32e … "Intel Pentium4 6xx" 及び "Intel Xeon"
・AMD64 … "AMD Athron64" 及び "AMD Opteron"
互換性とか色々あって、名前だけでもややこしいんですが、まずは"Intel Pentium4 6xx"と"AMD Athron64"にターゲットを絞る予定です。デュアルコア対応とかはその後ですね。そこまでが一段落したところで"IA-64"を見据えていきたいと思います。"Intel Itanium" なんかがエンドユーザーに渡るのはもう少し先のような感じですし。
ここまでくると、ライブラリ開発なんかを、できればユーザーさんと一緒にやっていきたいところです。Ver4.0の時点で、私自身、仕事量の面、スケジュールの面から無理が生じ始めているので、64ビットコンパイラ開発ウンヌンと言うのと同時に、パワーユーザーさんには開発者側の立場に回っていただけるような環境作りをしていかなくちゃいけませんね。
コンパイラ開発に力を注ぐとライブラリ郡が作れず…ライブラリ郡に力を注ぐとコンパイラのコード内容が頭から消えてしまったりと…こういう低レベルなことはやっちゃいられないです。
Re: 64ビットコンパイラの行方
Posted: 2005年6月02日(木) 21:50
by イグトランス
ところでVCやBCCでは32ビットへのコンパイル時には32ビット、64ビットへのコンパイル時には64ビットになる整数型のtypedef
INT_PTRなどが存在していますがこれはどうでしょう。
とりあえず次の版にでも用意しませんか?
あとSetWindowLongPtrなどの宣言も同時にほしいですね。
(実際にはAlias "SetWindowLong"ですが)
Posted: 2005年6月14日(火) 18:58
by Oryaaaaa
ITmedia エンタープライズ:64ビットプログラミングのポイント
http://www.itmedia.co.jp/enterprise/art ... ws003.html
64ビットプログラミングについての記事があったので紹介します。
Posted: 2005年6月15日(水) 07:48
by イグトランス
最近知ったんですけどWindows XP 64bitで64bitモードのときはFPUレジスタの退避が行われないので実質的に使えないらしいです。
(32bitプログラムは平気らしい)
そこでどうするかというと浮動小数点演算は全てSSE/SSE2を使うことになるのですが、
これにはSqrtや指数・三角関数などといった物はないので自分で計算しないといけないということのようです。
つまり実質的には今のABのようにライブラリがそういった計算のコードを保持するということになりますね。
するとここで提案したようなインラインアセンブラや組み込み関数で直接FPU命令でSqrtなどを計算させれば高速になるという話は駄目になってしまったということです。
http://www.discoversoft.net/forum/viewtopic.php?t=37
Posted: 2005年10月28日(金) 21:11
by 山本
なんか突然、ディープな内容で申し訳ないですm(__)m
http://d.hatena.ne.jp/dai_optimistic/20051028
ブログにも書いてある通り、GetThreadContextが正常に働かず、デバッガが対象スレッドのレジスタ情報を取得できない状況におかれています。状況は下記の通り。
・デバッガはBasicCompiler.exeが提供している。Win32アプリである。
・デバッガはWOW64の機構を利用して稼動している
・デバッグ対象のプログラムはネイティブな64ビットアプリである。
・デバッガはGetThreadContextというAPI関数を呼び出して対象スレッドのレジスタ情報を取得する
久々に一日中、同じ問題で頭を抱えてみました。大きな壁ですな。片っ端から情報を読み漁りましたが、この手法が無理であるとはどこにも書いておりませんでした。
まぁ、しいて言えば、MSのサイト上にあったどこだかのプレゼン資料だけです。
http://download.microsoft.com/download/ ... ec2004.ppt
ここには、こう記してあります。
WoW64 Debugging
GetThreadContext() and SetThreadContext() works if the target process of the same type
Use user-mode 32-bit debugger to debug WoW64 applications
Debug as if you are running on a native 32-bit Windows OS
Visual C++ 6.0
User mode debuggers (e.g. ntsd.exe)
Or any other 32-bit debugger package
View only 32-bit loaded modules
Can not be used to debug native 64-bit applications
Use user-mode 64-bit debugger to debug inside WoW64’s 64-bit code
WoW64 debugger extensions – comes with Microsoft debugging tools
Allows to switch between 32-bit and 64-bit modes using !sw command
View all loaded modules (32-bit and 64-bit)
Can debug WoW64 as well as native 64-bit applications
なんか、直訳するとWin32デバッガからはWin64アプリの情報をGetThreadContextできないぞみたいなことが書いてあるようにとれます。
英語が得意な方、この文章の翻訳を、わかりやすくお願いしたいです。
また、この件に関する情報、どんな些細なことでもかまいませんので、アドバイスをいただけると助かります。
たぶん、「できない」のであれば、新しくネイティブ64なデバッガを作ることになりますので(こうなると、スケジュール的にかなり厳しいのですが…)
Posted: 2005年10月29日(土) 00:32
by イグトランス
Can not be used to debug native 64-bit applications
これが全てを言い表している気がしてなりません。
ところでWin32にはジェネリックサンクというものがあり、DLLを単位として16bit/32bitのコードを1プロセスに共存させることもできたようですが、
Win64には残念ながらそういったものはないようですね。
Posted: 2005年10月29日(土) 01:12
by 山本
64 ビット リモート デバッグ
Visual Studio を WoW64 の下で実行している場合は、ローカル コンピュータ上で実行している 64 ビット アプリケーションをデバッグできます。Visual Studio を WoW64 の下で実行し、アプリケーションを 64 ビット Windows 上で実行している場合でも、デバッグは透過的です。リモート コンピュータで実行している 64 ビット アプリケーションをデバッグするには、"Visual Studio 2005 Remote Debugger" というラベルの付いた CD に含まれている 64 ビット リモート デバッガをインストールする必要があります。このリモート デバッガをインストールするには、リモート コンピュータ上でこの CD に含まれているセットアップ プログラムを実行し、セットアップ ダイアログ ボックスに表示される指示に従います。
MSにはこういう情報もありました。どっちなんだ・・・
↓キャッシュですが、ご覧あれf(^^;;;
http://66.102.7.104/search?q=cache:TdW7 ... in64&hl=ja
Posted: 2005年10月29日(土) 09:07
by イグトランス
> 64 ビット リモート デバッグ
この話もVisual StudioのIDEは32bitプログラムですがデバッガは64bitプログラムですよと書かれているように思います。
ActiveBasicも同じようにデバッガを64bit化しないといけないのかもしれません。
これだけは頑張ってくださいとしか言いようがないです……。
#ところで64bitプログラムが32bitスレッドに対してGetThreadContextを実行するとどうなるのか気になります。
GetWindowLongPtrの類
Posted: 2005年12月26日(月) 11:40
by イグトランス
どこに投稿すべきか迷いましたが,64bitネタということでここを選びました。
GetWindowLongなどをLONG_PTRにして64bitにも対応した
GetWindowLongPtrなどの宣言がまだなされていないので,私が作ってみました。
ぜひ次のABバージョンアップ時に収録してくださいという狙いです。
既に作られていたならお騒がせしました。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (hwnd As HWND, nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (hwnd As HWND, nIndex As Long, NewValue As Long) As Long
Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (hwnd As HWND, nIndex As Long) As DWord
Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (hwnd As HWND, nIndex As Long, NewValue As Long) As DWord
#ifdef _WIN64
Declare Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" (hwnd As HWND, nIndex As Long) As LONG_PTR
Declare Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" (hwnd As HWND, nIndex As Long, NewValue As LONG_PTR) As LONG_PTR
Declare Function GetClassLongPtr Lib "user32" Alias "GetClassLongPtrA" (hwnd As HWND, nIndex As Long) As ULONG_PTR
Declare Function SetClassLongPtr Lib "user32" Alias "SetClassLongPtrA" (hwnd As HWND, nIndex As Long, NewValue As LONG_PTR) As ULONG_PTR
#else
Declare Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongA" (hwnd As HWND, nIndex As Long) As LONG_PTR
Declare Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongA" (hwnd As HWND, nIndex As Long, NewValue As LONG_PTR) As LONG_PTR
Declare Function GetClassLongPtr Lib "user32" Alias "GetClassLongA" (hwnd As HWND, nIndex As Long) As ULONG_PTR
Declare Function SetClassLongPtr Lib "user32" Alias "SetClassLongA" (hwnd As HWND, nIndex As Long, NewValue As LONG_PTR) As ULONG_PTR
Const GCL_MENUNAME = -8
Const GCL_HBRBACKGROUND = -10
Const GCL_HCURSOR = -12
Const GCL_HICON = -14
Const GCL_HMODULE = -16
Const GCL_WNDPROC = -24
Const GCL_HICONSM = -34
Const GWL_WNDPROC = -4
Const GWL_HINSTANCE = -6
Const GWL_HWNDPARENT = -8
Const GWL_USERDATA = -21
Const DWL_MSGRESULT = 0
Const DWL_DLGPROC = 4
Const DWL_USER = 8
#endif
Const GWL_STYLE = -16
Const GWL_EXSTYLE = -20
Const GWL_ID = -12
Const GWLP_WNDPROC = -4
Const GWLP_HINSTANCE = -6
Const GWLP_HWNDPARENT = -8
Const GWLP_USERDATA = -21
Const GCL_CBWNDEXTRA = -18
Const GCL_CBCLSEXTRA = -20
Const GCL_STYLE = -26
Const GCW_ATOM = -32
Const GCLP_MENUNAME = -8
Const GCLP_HBRBACKGROUND = -10
Const GCLP_HCURSOR = -12
Const GCLP_HICON = -14
Const GCLP_HMODULE = -16
Const GCLP_WNDPROC = -24
Const GCLP_HICONSM = -34
/*
Const DWLP_MSGRESULT = 0
Const DWLP_DLGPROC = DWLP_MSGRESULT + SizeOf (LRESULT)
Const DWLP_USER = DWLP_DLGPROC + SizeOf (DLGPROC)
*/
整数型のサイズは?
Posted: 2005年12月26日(月) 16:30
by hira
64ビットネタに便乗して。
http://www.itmedia.co.jp/enterprise/art ... ws006.html
↑によると、64ビット環境でも int や long の類は32ビットに据え置かれる可能性が高いといわれていますが、
Win64APIなどではこの辺の扱いがどうなるのかが気になります(上の情報はCの処理系に関することなので)。
特に、独自にAPIを定義している場合は型を変更すべきなのかどうかが重要になってきますので…。
※それと、やはりDLL名も user64.dll kernel64.dll のようになると思えばよいのでしょうか?
Re: 整数型のサイズは?
Posted: 2005年12月26日(月) 19:25
by イグトランス
Win64APIもLLP64で,極力Win32と変らないようになっているようです。
C/C++用のWinAPIのヘッダーはintもlongも32bitであることを前提にしています。
Win64では64bitになるべき場合は全て(U)LONG_PTR類あるいはこれらからのTypeDefになっています。
(WPARAM/LPARAMやSIZE_Tなど)
x64での呼び出し規約では,引数・戻り値での32bit整数は
64bitに拡張されて渡されるのでLP64やILP64でも問題なさそうです。
長々と書きましたが結局のところ必要な箇所で(U)LONG_PTRが使われていれば,
ソースコードは大して問題にならないのではないでしょうか。
> ※それと、やはりDLL名も user64.dll kernel64.dll のようになると思えばよいのでしょうか?
これも問題ですが,Declareの殆どはABのインクルードファイルの中にあるのでユーザーへの影響は少ないだろうだと思います。
というのが理想ですが,実際にはDeclareの山になることも多いですしね。
Win64も持っていないので私にはわかりません。是非知りたいです。
Posted: 2005年12月26日(月) 20:41
by hira
Win64APIもLLP64で,極力Win32と変らないようになっているようです。
C/C++用のWinAPIのヘッダーはintもlongも32bitであることを前提にしています。
Win64では64bitになるべき場合は全て(U)LONG_PTR類あるいはこれらからのTypeDefになっています。
(WPARAM/LPARAMやSIZE_Tなど)
ありがとうございます。
16bit環境ではintのサイズは2バイト、という話を聞いたことがあったので、ちょっと心配になってしまっていましたが。
DLLなどの問題については、ABが64bitに対応したときにでも確認してみます(ヘッダファイルを見ればある程度の情報は得られると思いますので)。
Posted: 2005年12月27日(火) 10:14
by イグトランス
さてVersion 4.13が公開されたので早速ダウンロードしてみました。
もちろん気になるのはapi_window.sbpです。どうなっているか見てみると,
Win64ではGetWindowLongのエイリアスにGetWindowLongPtrAを指定しているという目から鱗でした。
なるほどこれなら今までさんざんGetWindowLongを使っていたABのプログラムもそのままWin64へ移せますね。
これは一本取られました。
64ビット技術を用いたサンプル
Posted: 2006年1月08日(日) 01:43
by 山本
サンプルプログラムの製作について悩んでいるので、アドバイス願います。
現段階ではネット上での配布は行っていない64ビット版ActiveBasicですが、そのコンパイラの質は、32ビットのそれよりも断然に良いんです。なんとかして、華やかなベンチマークアプリを製作しようとたくらんでいるところなのですが・・・
・大容量(4GB以上)のデータ(または仮想メモリ)を扱う
・64ビット整数型を利用したベンチマーク
・実数演算を利用したベンチマーク(SSE2を採用しているので、高速になっているハズ…)
・その他、x64技術を用いたベンチマーク
私が高校生の頃(AB2の頃)に、ハレー彗星の軌道計算プログラムを書いたユーザーさんがいらっしゃいましたが、一般人が見て、オォ~と言いたくなるような64ビット独特のサンプルは無いですかね~。
32/64で比較ができるサンプルなんかは尚宜しいのですが…(そんなに都合いいのはあるのかな~)
Posted: 2006年1月08日(日) 10:44
by Oryaaaaa
悩みますね。素人がみて、はっきり分かるのはグラフィックがベストです。
仮想メモリを使うにしても、実行した環境がRAIDを使ってないと遅くなるし
できるかどうか分からないけど案はある。
書き込み可能な仮想ドライブ for CD,DVD,BD-R,HD DVD
世界中探して確か無かったような、焼く前に仮想ドライブに焼いて
テストできるソフトなんてあったら便利。演算部分は確実に64
ビット化できると思うし、多くの人にActiveBasicの凄さを実感して
もらえると思う。焼きソフトを使ってベンチできる点に脱帽するぞ