2005年8月24日水曜日

プログラミング言語の比較(1回目)

プログラミング言語と一口で言っても、
C/C++/JAVA/Basic/Fortran/Pascal・・・等々、
とても此処には挙げ切れないほどの種類があります。
アプリケーションを作成する際に、どのプログラミング言語を選択するかは、「アプリケーションの目的を達成できるか?」、「使用する言語に精通したプログラマを揃えられるか?」、「開発に必要なコストは?」、「実行速度は?」等の条件を総合的に考慮して行われます。
(実際には、お客様の指定、既存アプリケーション拡張等の理由で、決定される事も多々あります)

今回は、複数の言語で同じ処理を行うプログラムを作成し、言語毎の比較をしてみたいと思います。
但し、何を持って比較するかと言うのは考え出すと難しいので、定量的に計測できる「実行速度」に焦点を当ててみましょう。(また、それぞれの言語の文法・設計思想の違いもプログラムを見比べる事によって実感出来ると思います)

まず必要なのは、比較対象の言語ですが、この記事を書いている人間が使用できる言語などたがが知れている為、無条件に以下で決定です。


  1. C
  2. C++
  3. JAVA

(注:1つだけルールを設けます。プログラム中で使用するライブラリは、言語の標準ライブラリのみとします。)

後は、何をするプログラム?ですが、複雑な事を3つの言語で書くなんて事をすると、廃人になりかねないので、単純にファイルコピーを行うプログラムにします。


★Cで作成

早速、C言語でファイルコピーのプログラムを作成していきたい所ですが、その前に、C/C++の開発で使用するコンパイラーを示します。
Borland C++ Compiler 5.5は、Windows環境で利用できるフリーのコンパイラです。(これから紹介するプログラムは、GCCやVC++でも問題無くコンパイル出来ると思いますが、試していないので不具合が有る場合は、ご了承下さい。)

さて、実際に作成したプログラムがこれです。(料理番組みたい・・・)

--- CopyByC.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define BUFFER_SIZE 2048
int execute(char* src, char* dest) {
const int buffer_size = BUFFER_SIZE;
char buffer[BUFFER_SIZE];
FILE *in, *out;
int readsize;
/* ファイルオープン */
in = fopen(src, "rb");
if(in == NULL) {
printf("%s ファイルが見つかりません。\n", src);
return 1;
}
out = fopen(dest, "wb");
if(out == NULL) {
printf("%s ファイルが見つかりません。\n", dest);
fclose(in);
return 1;
}
/* ストリームのバッファサイズ指定 */
setvbuf(in, NULL, _IOFBF, buffer_size);
setvbuf(out, NULL, _IOFBF, buffer_size);
/* コピー実行 */
while((readsize = fread(buffer, 1, buffer_size, in)) != 0) {
fwrite(buffer, 1, readsize, out);
}
/* ファイルクローズ */
fclose(in);
fclose(out);
return 0;
}

int main(int argc, char** args) {
int start, end;
if(argc < 3) {
printf("%s [コピー元ファイルパス] [コピー先ファイルパス]\n", args[0]);
return 0;
}
else if(!strcmp(args[1], args[2])) {
printf("コピー元とコピー先が同じです。\n");
return 1;
}
start = clock();
if(execute(args[1], args[2])) {
return 1;
}
end = clock();
printf("%f 秒経過\n", (end - start)/1000.0);
return 0;
}

簡単にプログラムの解説ですが、execute関数では、コピー元ファイルとコピー先ファイルをオープンし、コピー&クローズの処理を行っています。
また、main関数では、execute関数の実行に掛かる時間を計測し出力します。(この時間をコピーに要した時間とします)

取り合えず、今回はここまでです。