No.6ベストアンサー
- 回答日時:
なんかいろいろと話が出てますが。
本質的にVBとVC++の違いは
>あくまでも一般論ですが、VBはVC+より簡単だけどデメリットは処理速度が遅いことだそうです。
ですよね。
で、”簡単”というところでVBがどうして簡単なのかを考えていけばわかると思います。
簡単な理由:
1.データ型を意識しなくても自動的に変換してくれる
・・・VBが内部的にがんばって変換する処理を行っている
2.文字列が簡単に扱える。
・・・VBが内部的に、領域確保やメモリ内のデータのコピーなどの処理をがんばってる。
3.画面にコントロールを貼り付けるだけで、簡単にGUIが完成する。
・・・VBがフォームの表示等の一般的な必要となる処理、コントロールとのやり取りの処理等をすべて内部的に行っている。
4.ActiveXコンポーネントやCOMオブジェクトが簡単に使える。
・・・VBが内部的なコンポーネントとのインターフェイス間のやり取りをすべて行っている。
みたいな感じですかね?
ランタイムが必要とか、コンパイルが必要とかということとは別問題です。
ランタイムは、あくまでもVBのプログラムで内部的に共通で
行われる処理をまとめてDLL等にしたり、
VBで直接使用しづらい処理をActiveXコンポーネントにすとといったために使用します。
コンパイルも、ちゃんとネイティブコンパイルできますし。
で、このVBの簡単な点が全て実行速度というところに跳ね返ってきます。
2.やランタイムについては、VitaminBBさんはMFCをよく使われているのであれ?と思ったかもしれません。
MFCはCStringで簡単に文字列を扱えますし、MFCにはランタイムDLLも存在します。
実は、MFCもVBほどではないですが、”遅い”です。
フレームワークがC++で書かれているから速いとか言う問題ではなく、単純に、ある程度何でもできるフレームワークだから内部的な処理が多すぎるという点でMFCは遅いのです。
つまり、便利→内部的な処理が多い→遅いということになります。
#ただ、MFCの場合は、画面まわり、すなわちユーザーインターフェイスをMFCに任せ、演算などの高速処理を必要とするビジネスロジックはMFCを使わないということもできるので、このあたりがVBと違うところです。
VBで速くしようとすると、画面はVB、ビジネスロジックはCのDLLなんてことになります(よくありますが)。
No.12
- 回答日時:
>#いいのかなぁ、ここにツッコミ入れて・・・
>>Private Sub QuickSort(ByRef strData() As String, ByVal lngStartIndex As Long, ByVal lngEndIndex As Long)
>整数値ではなく文字列の配列に見えるんですが・・・
ご指摘ありがとうございます。間違って違うものを貼り付けてしまいました。
自宅のPCにはVBが入っていないんですけど、Access の VBA で作った文字列配列をソートする関数がありまして、これを会社の自分のメールアドレスにメールして、会社で休憩時間に String → Long に直してコンパイルして、できた Exe をまた自宅のPCにメールして、自宅のPCでテストしてみたんですけど、間違って、文字列ソート用の関数を貼り付けてしまいました。
こんなことやっていると信頼性がないと思うんですけど、一応、訂正しておきますと、
VBの関数は↓
Private Sub QuickSort(ByRef lngData() As Long, ByVal lngStartIndex As Long, ByVal lngEndIndex As Long)
でした。
No.10
- 回答日時:
すんません、、、開発ツールの事をいって回答になって無かったですね。
>>じゃあ人間にとって作りやすいVBで作っても、
>>最終的にはコンパイラがVC++と同じ機械語にしてくれたら良いと思うのですが。
確かにそう思った事が以前ありました。
でもそれは、昔アセンブリ言語で書いてた時の発想で
それが実現したのがC言語でもあるんです。
あえて言えば、「C#」が貴方の求めている開発ツールかもしれません
「C#」のねらいはVBの開発の容易さとC++の奥深い機能をあわせもつものなので。
なぜVBでランタイムを必要としないコンパイラーにしないかと言うと
VBの当初の目的は、BASIC言語同様「教育レベル」向けで、業務向けのツールではなかったのです。
VB2.0までが思惑通りの「教育向け」でしたが
VB3.0からにわかに業務利用され
VB4.0で当初の目的に合わなくなり
VB5.0で開発向けツールになりました
VB6.0で完全に開発ツールとなりました。
なので、当初からプロフェッショナル向けのVCがあるのでVBでネイティブに機械語に変換するコンパイルを作る事はないと思われます。
No.9
- 回答日時:
最近マイクロソフト系で開発してないので度忘れしてますので嘘偽りがあるかもしれませんので空耳程度に、、。
VBとVC++またはC言語系MFCをマイクロソフトの
開発ソフトで行う場合。
コンパイル側では機械語に訳詞直すので、処理的には大差は無いです。(VBの変換の方が若干お馬鹿だった気はします)
ですがVBの場合のランタイムと言うライブラリーを返してコードの実行を行っていますのでその分遅くなり処理時間に差が出てきます。
また、VBでもVC++でも結局 MSのAPIを呼ぶ事が大半なので、VB側でも遠まわしにAPIを呼ぶランタイムを呼ぶのではなく、限りなく直接APIを呼んだ方が圧倒的に早くなります。
なのでVCとVBで実行速度を量るソースを作ったとしても、VB側でAPI呼び出しにランタイムを使っている段階2度デマを踏んでいるので、VCより早くなる事は無いです。
No.8
- 回答日時:
ちょっと遅くなりました。
結論を先に言うと、私としては予想以上に差が出たという気がします。
要素数 10000 の 32 bit 整数配列のソート(クイックソート)を 1000 回繰り返したときの所要時間は
VC++ : 3 sec
VB : 61 sec
でした。( Pentium (3) 730MHz + Memory 384MB + WindowsXP )
ちなみにソースは
=== C ===
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void qsort( int *piData, int iStart, int iEnd );
int main( int iArgc, char *pstrArgv[] )
{
if( iArgc < 2 ) {
printf( "Usage : QuickSort FileName NumberOfData" );
return( -1 );
}
FILE *fp = fopen( pstrArgv[1], "r" );
if( NULL == fp ) {
printf( "%s が見つかりません.\n", pstrArgv[1] );
return( -1 );
}
int iNumberOfData;
int *piData;
int *piWork;
char strBuffer[100];
char *p;
int i;
time_t tStart;
time_t tEnd;
int iRepeat;
iNumberOfData = atoi( pstrArgv[2] );
iRepeat = atoi( pstrArgv[3] );
piData = new int[iNumberOfData];
i = 0;
do {
p = fgets( strBuffer, 100, fp );
if( NULL != p ) {
piData[ i ] = atoi( strBuffer );
i++;
if( iNumberOfData <= i ) {
break;
}
}
} while ( *p );
fclose( fp );
piWork = new int[iNumberOfData];
tStart = time(NULL);
for( i = 0; i < iRepeat; i++ ) {
for( int j = 0; j < iNumberOfData; j++ ) {
piWork[ j ] = piData[ j ];
}
qsort( piWork, 0, iNumberOfData - 1 );
}
tEnd = time(NULL);
printf( "%d [s]\n", tEnd - tStart );
fp = fopen( pstrArgv[3], "w" );
if( NULL == fp ) {
return( -1 );
}
for( i = 0; i < iNumberOfData; i++ ) {
fprintf( fp, "%6d\n", piWork[ i ] );
}
fclose( fp );
return( 0 );
}
void qsort( int *piData, int iStart, int iEnd )
{
int iForward;
int iBackward;
int iTemp;
if( iEnd <= iStart ) {
return;
}
iForward = iStart + 1;
iBackward = iEnd;
while( iForward <= iBackward ) {
while( iForward <= iBackward ) {
if( piData[ iStart ] < piData[ iForward ] ) {
break;
}
iForward++;
}
while( iForward <= iBackward ) {
if( piData[ iBackward ] < piData[ iStart ] ) {
break;
}
iBackward--;
}
if( iBackward <= iForward ) {
break;
}
iTemp = piData[ iBackward ];
piData[ iBackward ] = piData[ iForward ];
piData[ iForward ] = iTemp;
iForward++;
iBackward--;
}
iTemp = piData[ iBackward ];
piData[ iBackward ] = piData[ iStart ];
piData[ iStart ] = iTemp;
qsort( piData, iStart, iBackward - 1 );
qsort( piData, iBackward + 1, iEnd );
}
=== VB ===
Private Sub Command1_Click()
Dim iFileNo As Integer
Dim lngData() As Long
Dim lngWork() As Long
Dim dtStart As Date
Dim dtEnd As Date
Dim i As Integer
Dim iNumberOfData As Long
Dim iRepeat As Integer
Dim strCommand() As String
strCommand = Split(Command(), ",")
iNumberOfData = CInt(strCommand(0))
iRepeat = CInt(strCommand(2))
iFileNo = FreeFile
Open strCommand(1) For Input Access Read As #iFileNo
ReDim lngData(iNumberOfData)
For i = 0 To iNumberOfData - 1
Input #iFileNo, lngData(i)
Next i
Close #iFileNo
dtStart = Now
For i = 1 To iRepeat
lngWork = lngData
QuickSort lngWork, 0, 9999
Next i
dtEnd = Now
MsgBox DateDiff("s", dtStart, dtEnd), vbInformation
End Sub
Private Sub QuickSort(ByRef strData() As String, ByVal lngStartIndex As Long, ByVal lngEndIndex As Long)
Dim strWork As String
Dim i As Long
Dim j As Long
If lngStartIndex >= lngEndIndex Then Exit Sub
i = lngStartIndex + 1
j = lngEndIndex
Do While i <= j
Do While i <= j
If strData(i) > strData(lngStartIndex) Then
Exit Do
End If
i = i + 1
Loop
Do While i <= j
If strData(j) < strData(lngStartIndex) Then
Exit Do
End If
j = j - 1
Loop
If i >= j Then Exit Do
strWork = strData(j)
strData(j) = strData(i)
strData(i) = strWork
i = i + 1
j = j - 1
Loop
strWork = strData(j)
strData(j) = strData(lngStartIndex)
strData(lngStartIndex) = strWork
Call QuickSort(strData, lngStartIndex, j - 1)
Call QuickSort(strData, j + 1, lngEndIndex)
End Sub
という感じです。
No.7
- 回答日時:
結論書くの忘れてました(^^;
>どうしてそういう都合の良いことは出来ないのですか?
結論は無理。
理由は、同じ機械語でも、VBで書いた処理+VBの内部処理という2種類の処理を行うことになるからです。
単純な処理でもですね。
VBだと
Dim i As Integer
i = i + 1
Cだと
short i;
i = i + 1;
という式があった場合、Cでは単純に1加算しているだけですが、
これだけの式でもVBでは内部的に範囲チェックなどの処理が行われます。
i = 32767だった場合、符号付16ビット整数なのでさらに加算するとオーバーフローを起こします。
Cですと、何事もなく処理が続きますが、VBですと、オーバーフローのエラーが発生します。
VBは簡単でもあるし、安全でもあるということになりますが、このようなチェックは、やはり処理スピード的にはオーバーヘッドとなります。
この回答へのお礼
お礼日時:2004/03/27 21:08
回答ありがとうございます。
大変良く分かりました。
要は、プログラマーが容易にコードが書けるようになっている分、背後で最適でない余分な処理も行われており、結果的には処理速度等の性能差が出ざるを得ないということですね。
大変良く分かりました。
No.5
- 回答日時:
Pコードは、確かインタプリタ形式(実行時に機械語に変換して実行)だったと思います。
>趣味でプログラムしている人のレベルでは、
>単に、俺ってちょっと難しい言語でプログラムしてんだぜ。
>とか、プロが使うソフトを使ってるんだぜ。
>と自慢できるくらいでメリットは無いということなの?
そんなことはないです。VB でも API を使用すればたいていのことはできますが、VB ではできないこともあります。あるいは、VB ではできなくはないが、C/C++ の方がやりやすい(スマートに記述できる)ということもあります。具体的には、いろいろあると思いますけど、例えば、バイナリデータの取り扱いとか。
あと、VB でもクラスが使用できますが、VB のクラスは C++ のクラスのようにちゃんとしたものではない ( クラスの継承ができないなど ) ので、正統的なオブジェクト志向の設計をするなら VC にせざるを得ないということもあると思います。
まぁ、簡単に言うと「何でもできる度」は VC の方が上ということです。
実行速度については、ちょっと興味があるので、月曜日にでも試してみようと思います。(今、VB の開発環境が手元にないので。)
32bit 整数データのソート( Quick Sort ) を、同じデータをファイルから読み込ませて、ファイルの読み込みや出力を除いたソート実行部分の実行時間がどれくらいになるのか VB と VC で試してみようと思います。
(それまで締め切らないで待ってね。)
No.4
- 回答日時:
VB->ソースプログラム-コンパイラで処理->機械語
VC++->ソースプログラム-コンパイラで処理->機械語
で、観念的には、最終の機械語を実行すると言う(インタプリタ方式に対し)スピード面のメリットは同じですが、
VBを機械語にブレークダウンするロジックはVBにお任せであり、VC++は、より機械語に近い位置にあり、コーディングする人が熟達した人なら、より無駄のない早い(プログラムステップ数が少ない)コードが書けると言うことです。
なんでも出きるように考えた汎用品と機能を特化した注文品の例と一脈通ずるものがあると思います。
実際のプログラムでは、「どのような機械語群に直すか」が解決すべき問題です。
コンパイラでは、一般的にはコード上でどこが無駄が出やすいか判っており、オプチマイズや最適化とか言われる努力がコンパイラ側で工夫されており、この点の解決がコンパイラが出来て以来の最大の課題です。上記で「熟達した人なら」と書きましたが、下手なプログラマが書くと、無駄が多くて、コンパイラに負けるコードしか組めない場合もあり得るわけです。
(VC++もVBと同じコンパイラですが、VC++はより機械語に近いと言う意味で、コンパイラ-機械語と対比した機械語の方に入れて説明して見ました。VC++もコンパイラとしての同じ問題を抱えていますので程度問題ですが。)
コンパイラは全世界の優秀者、過去から今までの頭脳の知恵が結集された面があり、そう馬鹿にしたものではないのです。機械語の実行速度が飛躍的に上がり(昔の超大型コンピュタを今のパソコンが越える時代)、機械語実行時の無駄より、習得の易しいVBなどの言語を使って(一例ではVBなどはポインタなど意識させない)、ソースコードが早く、誤りが少なく完成するメリットの方が大きい時代になってます。
>「ふと疑問に思ったので」と書いておられるように
本質問は観念的な質問で、コンパイラに関する本を読んで
ソースからどういうロジックで機械語に翻訳するか(むしろせざるを得ないか)、そこにどういう無駄が発生し勝ちか、どういう改善策のパターンがあり、それ講じられているかを調べてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 物理学 Va=1/4πε × (q1/a + q2/b + q3/c) Vc=1/4πε × (q1+q2+ 2 2023/04/16 14:08
- 工学 非対称三相交流について 2 2022/07/06 00:36
- 物理学 コンデンサを並列接続とする見方がイマイチ理解できません。 等価回路を考えてみると、赤線が等電位という 4 2023/05/22 04:02
- 物理学 2物体の単振動 1 2023/08/17 20:27
- 国産車 【日産自動車のVCターボエンジンは4WD動作を部品点数を減らした一体化したユニットにした 5 2023/05/26 23:00
- 日本語 脳科学の奇妙な言語獲得論 2 2022/04/04 13:13
- その他(SNS・コミュニケーションサービス) ゲームでボイスチャットを使いたいんですが、親にどう説明したらいいですか 2 2022/08/03 14:07
- YouTube Youtubeとかの外国語の動画に、日本語の字幕をつけたのを自分のアカウントから公開扱いでアップした 1 2023/04/11 00:25
- 物理学 高1力学の運動量の問題です。問題を一通り解いたのですが、行き詰まってしまったのでご回答頂ければ嬉しい 3 2022/06/29 11:20
- 物理学 光速度に近い速度で移動しても、時間や時計の動きが遅くなる?等は、あり得ない。 3 2022/09/24 00:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cc と gcc の違い
-
ソフトの開発言語を調べる方法
-
組み込みソフト。ROM領域にデータ
-
C言語の規格
-
unsigned long long 型のフォー...
-
関数形式マクロ dtaは戻り値が...
-
bcpadのコンパイラのインストー...
-
Win32のIME制御について
-
オープン系とか、組込み系とか...
-
C99の導入方法を教えてください。
-
2つのマシンでコンパイルしたld...
-
OpenMAXというものについて、簡...
-
C言語のフリーソフト。
-
void型のポインタで構造体の参照
-
二つの整数を昇順に並べ換える...
-
家庭用家電などのマイコンのOS...
-
VBでVC++の処理速さを実...
-
パクるのに最適なソースの本、...
-
VC++の/Zm オプションについて
-
アセンブリ言語から何がわかる...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
unsigned long long 型のフォー...
-
ソフトの開発言語を調べる方法
-
C++でデスクトップGUIアプリ開...
-
組み込みソフト。ROM領域にデータ
-
cc と gcc の違い
-
C++Builder → Visual C++ 移植...
-
printfなど、標準関数のソース...
-
COBOLのALPHABET...
-
COBOLの論理演算子について質問...
-
Visual Studio でmakefileを使...
-
cobolで実行環境って何ですか?
-
パーサとコンパイラの違いって?
-
昔のgraph.hというファイル
-
未使用引数の注意文出力を回避...
-
C言語でのコンパイラの作成方法
-
C言語はC言語でできている?
-
COBOL計算式の中間ワーク桁数に...
-
リリースモードとデバッグモー...
-
『Bin』ディレクトリは何の略語?
-
POWERCOBOLのSQL...
おすすめ情報