プログラミング言語を比較してみる(1)
主流を占める手続き型のプログラミング言語には、共通の機能があります。C、C++、Java、PHP、JavaScript、Pythonを例にまとめてみることにします。まずはプログラムの「流れ」を決める制御構造。
手続き型のプログラムは基本的にを順次実行することによって構成されます。C、C++、Java、PHP、JavaScriptではstatementは;で終わり、Pythonは改行で終わります。
まずは条件分岐から。C、C++、Java、PHP、JavaScriptは以下のように書きます。
if( cond ){
statement;
}
else if( cond2 ){
statement;
}
else{
statement;
}
Pythonでは
if cond : statement elif cond : statement else statement
switch~case文ってのもあって、C、C++、Java、PHP、JavaScriptでは以下のとおり。
switch( cond ){
case value:
statement;
break;
case value2:
statement;
break;
default:
statement;
}
Pythonにはswitch~case文はありません。
続いて、繰り返し。C、C++、Java、PHP、JavaScriptでは以下の通り。
// カウンタループ
for( 初期条件; 継続条件; カウンタ変数の更新 ){
statement;
}
// 前判定型ループ
while( 継続条件 ){
statement;
}
// 後判定型ループ
do{
statement;
while( 継続条件 );
Pythonでは、
# 前判定型ループ while 継続条件: statement else statement # Pythonにはカウンタループと、後判定型のループはありません。
どの言語も、ループからの早期脱出にはbreak文が、次ループへのスキップにはcontinue文が使えます。Pythonのwhile~elseブロックのstatementは継続条件が偽(break脱出でない)時に実行されます。
C、C++、PHPにはgoto文があり、深いループから一気に脱出する際などに使われます。
goto label; label: statement;
Java、JavaScript、Pythonにはgoto文はありません。
Pythonにはカウンタループがないと書きましたが、もちろん同等の機能を実現することはできます。例えば、0~9までのループはこのようになります。
for i in range(10): print i else: print "the last value was %d" % i
Pythonのforループはもともとイテレーションを念頭に作られているのです。例えばリストを内部イテレータとして、次のような反復が美しく書けます。
list = [0,1,1,2,3,5,8,13,21,34] for i in list: print i
同じような使い方はPHPでも可能です。PHPではforeachを使います。
#!/usr/local/bin/php <?php $list = array(0,1,1,2,3,5,8,13,21,34); foreach($list as $i) print( $i."\n" ); ?>
Cにはイテレータの仕組みは用意されていませんが、C++はSTLで外部イテレータが実装されています。
#include <iostream>
#include <vector>
int
main(void)
{
using namespace std;
vector<int> array;
array.push_back(0);
array.push_back(1);
array.push_back(1);
array.push_back(2);
array.push_back(3);
array.push_back(5);
array.push_back(8);
array.push_back(13);
array.push_back(21);
array.push_back(34);
vector<int>::iterator i;
for(i=array.begin(); i!=array.end(); i++)
cout << *i << endl;
}
Javaにも似た仕組みがあります。
import java.util.*;
public class ILoop{
public static void
main(String[] args){
LinkedList<Integer> l = new LinkedList<Integer>();
l.add(0);
l.add(1);
l.add(1);
l.add(2);
l.add(3);
l.add(5);
l.add(8);
l.add(13);
l.add(21);
l.add(34);
for(Iterator i=l.iterator(); i.hasNext(); ){
System.out.println( i.next() );
}
}
}
C++には例外的な事象を捕まえるのに便利なtry~catchがあります。
#include <iostream>
int
main(void)
{
using namespace std;
try{
for(int i=0; i<100; i++){
cout << i << endl;
if(i==10)
throw( "bye" );
}
}
catch( const char* message ){
cout << message << " is thrown!" << endl;
}
}
Java、JavaScriptも同様ですが、catchに加えてfinallyを付け加えることができ、例外の発生に関わらず実行されます。PHPにはfinallyがありません。Pythonも例外の処理機構を持っています。
try: statement except Exception1: statement except Exception2: statement except: # その他の例外 statement else: # 例外なし statement finally: # 必ず実行される statement
Pythonではシステム定義の例外は他言語でのthrow動作なしにcatchされます。しかし、raiseを使えば強制的に例外を発生させることもできます。またExeptionクラスから導出することで新しい例外を定義することもできます。