01: プログラミング言語とは何か 02: 0から99まで印字するプログラムの解説 03: Pythonで書くと... 04: 変数と関数 05: 条件分岐とループ 06: プリプロセス 07: ポインタと配列1 08: ポインタと配列2 09: ポインタと配列3 0A: 文字列 0B: 多次元配列 0C: ファイル入出力 0D: 構造体 0E: コマンドライン引数 0F: 数値を読み込んで総和と平均を表示するプログラム 10: 数値を読み込んで総和と平均を表示するPythonプログラム 11:【番外編】文章中の単語を出現頻度順に表示するプログラム 12:【番外編】コマンドライン引数を処理するイディオム 13:【番外編】C言語でクロージャを実装する
標準入力から数値列を読み出して,総和と平均を求めるプログラムを今度はPythonで書いてみる.
import sys
num = sum = 0
for line in sys.stdin:
num += 1
sum += float(line)
avg = sum / num
print "sum = %f, avg = %f" % (sum, avg)
拍子抜けしたかもしれないが,近代的なプログラミング言語とはこのようなものである.
比較のため元のCプログラムを再掲する.
#include <stdio.h>
#include <stdlib.h>
void read_from_stdin(int *n_values, double *array) {
/* この関数が
for line in sys.stdin:
num += 1
に相当する */
*n_values = 0;
while (!feof(stdin)) {
char buff[1000];
double v;
fgets(buff, 1000, stdin);
sscanf(buff, "%lf", &v);
array[n_values] = v;
*n_values += 1;
}
}
void do_something(int n, const double *a) {
/* この関数が
for line in sys.stdin:
sum += float(line)
avg = sum / num
print "sum = %f, avg = %f" % (sum, avg)
に相当する */
double sum = 0;
int i;
for (i = 0; i < n; i += 1) {
sum += a[i];
}
printf("sum = %f, average = %f\n", sum, sum / n);
}
int main(int argc, char *argv[]) {
double *a = calloc(10000, sizeof(double));
int n;
read_from_stdin(&n, a);
do_something(n, a);
return 0;
}
C言語とPythonの主な違いは,その抽象度である.
C言語はアセンブリ言語に近い(従って機械に近い)記述を得意とする反面,数学を扱うには抽象度が低すぎる.一方Pythonは数学を扱うにはかなりよい抽象度を持つ反面,アセンブリ言語に近い記述は不可能である.
一つの言語で,アセンブリ言語近く(例えばOSのファンクションコールを発行したりビット操作をしたり)から数学並みの抽象度(行列の計算や関数を返す関数など)までカバーするような言語は存在する.C++0x(現在はまだ策定中)と Common LISP だ.ただし,両者とも言語仕様が大きすぎるきらいがある.はっきり言えば,使いこなすのが難しい.そこで,複数の言語を組み合わせるという方法が日常的に行われる.低レベル部分はC言語に任される傾向がある.高レベル部分はPythonであったり,LISPをコンパクトに作り直したSchemeであったりする.
C言語をマスターしても,計算機言語のマスターへはまだまだ道があるのである.