ソフトウェア・ソリューションの計画を立てる際には、多くの異なるプログラミング言語の中から使用する言語を選択します。そのため各プログラミング言語の多様な特徴に目を奪われ、どの言語が適切なのか混乱してしまいがちです。言語の選択は多くの要素に依存します。個人的なプロジェクトや趣味のための言語であれば、自分が理解している言語で用が足りるかもしれませんが、利用可能なリソースに基づいて言語を選択した場合には、まったく理解できない手法を用いる羽目になる可能性があります。あるいは、コンポーネントを再利用しやすくするために多くの時間を費やす羽目になり、ドキュメントの作成が悪夢のような作業になるかもしれません。
この記事では、手続き型言語、オブジェクト指向言語、関数型言語を延々と比較するわけではありません。実用的な例とシナリオを用いて、皆さんのプロジェクトにとって最も効率良く、最も容易に開発を行える言語を選択する方法について説明します。個人的な用途の場合であれ、ある組織内の大規模なプロジェクトの場合であれ、プログラミング言語を選択する際に考慮すべき要素を検討する上で、この記事が役立つはずです。
プログラミング言語を選択する際、1 つの要素のみを考慮すればよいわけではありません。例えば動的な Web ページを作成する場合、ある人は JSP (Java Server Pages) またはサーブレットが最適の選択肢であると思うかもしれず、別の人は PHP や PHP に似たスクリプト言語を使用するのが望ましいと思うかもしれません。「最高の選択肢」であると言える言語は 1 つもありません。エンタープライズ・アプリケーションの場合には、パフォーマンスやセキュリティーなどの特定要素を重視するかもしれませんが、他の要素 (コードのライン数が少ないなど) の優先度は低いかもしれません。どのような場合にも、何らかのトレードオフが必要になるものです。
プロジェクトや業務を割り当てられると、多くの場合は実際の問題を解決するにあたって、準備作業が必要になります。この準備作業の中で、群を抜いて見過ごしてしまいがちなのが、プログラミング言語の選択です。
個人的なプロジェクトのための言語を選択する場合には、個人的な好みで選択することができます。この場合にはコードのライン数が重要であり、当然の選択として、ある処理を行うのに 20 行のコードが必要な言語よりも 10 行のコードで目的を達成できる言語を選びます。まず始めにソリューションを実現する必要があり、その後でスマートさやパフォーマンスに注意を払うことになります。
大規模な組織向けに構築されるプロジェクトの場合には、個人的なものとはシナリオが異なり、各チームが作成するコンポーネントが相互に接続して作用し合うことで、特定の問題を解決します。言語を選択する際には、プログラムを異なるプラットフォームにポーティングする際の作業の容易さや、リソースの利用しやすさなどの要素が関係するかもしれません。
適切なプログラミング言語を選択することで実現されるソリューションは、デバッグ、拡張、ドキュメント作成、そして修正が容易で、簡潔なものにすることができます。プログラミング言語を選択する場合には、以下の要素を考慮する必要があります。
- 対象とするプラットフォーム
- 言語の柔軟性
- 本番稼働までの時間
- パフォーマンス
- サポートとコミュニティー
考慮すべき最も重要な要素は、プログラム実行のベースとなるプラットフォームです。Java 言語と C 言語について考えてみてください。プログラムが C で作成されており、Windows マシンや Linux マシンで実行する必要がある場合には、各プラットフォームのコンパイラーと 2 つの異なる実行可能ファイルが必要です。一方、プログラムが Java で作成されている場合には、生成されたバイトコードがあれば、JVM (Java Virtual Machine: Java 仮想マシン) がインストールされた任意のマシンでプログラムを実行することができます。
これと極めて似たようなことが Web サイトの場合にも当てはまります。Web サイトは、すべてのブラウザーで同じように表示され、同じように動作する必要があります。ブラウザーの互換性を確認せずに CSS3 タグや HTML5 を使用すると、同じサイトでもブラウザーによって表示や動作が異なってしまう可能性があります。
言語の「柔軟性」というのは、既存のプログラムにどの程度容易に新機能を追加できるかを指します。柔軟性の要素としては、一連の新しい関数の追加、あるいは既存のライブラリーを使用した新機能の追加などが考えられます。柔軟性に関しては、以下のような質問を考慮する必要があります。
- 新しいライブラリーをインクルードすることなく、その言語の一機能を使い始めることができるか?
- 答えが「ノー」の場合、その機能はその言語のライブラリーの中にあるのか?
- その機能がその言語の元々の機能ではなく、ライブラリーとして用意されているわけでもない場合、それらの機能をゼロから作成するためにはどんな作業が必要か?
判断を下す前に、プログラムがどのように設計されており、どのような機能が将来の改善事項として考慮されているかを理解する必要があります。
言語の比較として本来は適切なものではありませんが、Perl と Python を考えてみてください。Perl
では、そのまま使用できる機能として正規表現のサポートが組み込まれています。Python の場合には標準ライブラリーから re モジュールをインポートする必要があります。
本番稼働までの時間というのは、プログラムを実際に稼働させるまでに必要な時間、つまりコードが本番用の準備を完了し、目標どおり動作するはず、となるまでに必要な時間を指します。本番稼働までの時間を計算する際には、制御ロジックにプレゼンテーション・ロジックを追加する必要があります。
本番稼働までの時間はコードのサイズに大きく依存します。理論的に、言語の習得が容易であればあるほどコードの量は少なく、従って本番稼働までの時間は短くなります。
例えば、PHP スクリプトを使用すればコンテンツ管理サイトを数日で作成することができます。一方サーブレット・コードを使用する場合には、ゼロの状態から両方の言語を学ぶとすると、数ヶ月かかるかもしれません。
1 つのプログラムと 1 つのプラットフォームから引き出せるパフォーマンスには限界があり、そのプログラムの作成に使用された言語がパフォーマンスに影響を及ぼします。多くの研究では、同じ環境でのプログラミング言語の実行速度が比較されています。さまざまなコンピューター・ベンチマークを基準として使用できることがわかりますが、どのような言語の場合であれ、それらの数値はパフォーマンスを具体的に評価するのには適していません。
Java コードと Python の両方で作成された Web アプリケーションを考えてみてください。ベンチマークに示されたパフォーマンスのデータを見ると、似たような環境の場合には、Java 言語で作成されたアプリケーションの方が Python で作成されたアプリケーションよりも実行速度が速いはず、という結論になります。しかし、環境そのものはどうなのでしょう?環境が Intel Q6600 単一コアによる x86 の Ubuntu の場合には、コンピューティング能力が限られているため、その比較は正しいかもしれません。その Web アプリケーションがクラウド内にあり、Google App Engine 上で実行されるとしたらどうでしょう?その場合に利用できるコンピューティング能力は実質的に無制限で、どちらのプログラムもほぼ同時に結果を返します。そのため、選択要素として今度はコードのライン数と保守性が重要になります。
言語のパフォーマンスが問題になるのは、対象とする環境のスケーリングの範囲が限られている場合です。そうした環境の一例が携帯機器です。
優れたソフトウェアには、成長を支援してくれるコミュニティーが必要であるのと同じように、プログラミング言語にも強力なコミュニティーが背後に必要です。たとえ優れた言語であっても、その言語を支援するための、簡単に利用できるコミュニティーがない場合には、その言語よりも、活発なフォーラムを持つ言語の方がよく使用される傾向にあります。
コミュニティーのサポートにより、ウィキ、フォーラム、チュートリアルが作成され、そして最も重要な点として、その言語の成長を支援する追加ライブラリーが作成されます。人々が 1 人で作業を行っていた時代は過ぎ去りました。1 つの些細な問題を解決するためにドキュメントのすべてに目を通したいと思う人はいません。ある言語が適切なコミュニティーを持っている場合には、誰か他の人が過去に同じ問題に直面し、その問題についてウィキやフォーラムに書き込んでいる可能性が高いと言えます。
Perl はコミュニティーの重要さを示す好例です。CPAN (Comprehensive Perl Archive Network) はコミュニティー主導の活動です。CPAN の主な目的は、Perl の標準ディストリビューションに含まれていないモジュールやプログラムを、プログラマーが容易に見つけられるようにすることです。CPAN の構造は非集約型であり、モジュールの作成者は自ら作成したモジュールの保守および改善を行います。既存のモジュールと同じタスクや目的のために、別途競合するモジュールを作成するといったことが普通に行われています。
このセクションではいくつかのプロジェクトのシナリオを取り上げ、言語を選択する際の意思決定プロセスに影響するさまざまな要素について説明します。
- 加算演算のための REST サービス
- 単純なフィード・リーダー
- エンタープライズ・アプリケーション
- 調査プロジェクト
このシナリオは REST サービスの形で加算を行うサービスです。http://<url>?num1=number1&num2=number2 という URL を呼び出すと、その結果には渡された 2 つの数の和が含まれている必要があります。このプログラムはさまざまな言語で作成することができます。ここでは例として JSP (リスト 1) と PHP (リスト 2) を使用します。JSP プログラムは Eclipse IDE で作成されています。
リスト 1. JSP を使用した REST サービス
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Sum</title>
</head>
<body>
<% if (request.getParameter("num1") == null ||
request.getParameter("num2") == null) { %>
<p>
<b>Wrong URL!!!</b>
</p>
<p>
<b>Enter URL in this format: </b>
<i>
http://<url>?num1=number1&num2=number2</i>
</p>
<% } else { %>
<b>Number 1:</b>
<i><%= request.getParameter("num1") %></i>
<br>
<b>Number 2:</b>
<i><%= request.getParameter("num2") %></i>
<br>
<b>Sum:</b>
<i><%= Integer.parseInt(request.getParameter("num1")) +
Integer.parseInt(request.getParameter("num2")) %></i>
<br>
<% } %>
</body>
</html>
|
リスト 2 は同じプログラムを PHP で作成したものです。
リスト 2. PHP を使用した REST サービス
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Sum</title>
</head>
<body>
<?php if ($_GET["num1"] == NULL || $_GET["num2"] == NULL) { ?>
<p><b>Wrong URL!!!</b></p>
<p>
<b>Enter URL in this format: </b>
<i>http://<url>?num1=number1&num2=number2</i>
</p>
<?php } else { ?>
<b>Number 1:</b>
<i><?= $_GET["num1"] ?></i>
<br>
<b>Number 2:</b>
<i><?= $_GET["num2"] ?></i>
<br>
<b>Sum:</b>
<i><?= $_GET["num1"] + $_GET["num2"] ?></i>
<br>
<?php } ?>
</body>
</html>
|
この 2 つの例の間に大きな違いはありません。このプログラム自体は 2 つの言語の機能をすべて活用しているわけではありません。この例から、どちらの言語も基本的な点に関しては同程度であることがわかります。
JSP の特徴から、エンタープライズ・レベルで JSP を使用することができます。例えば JSP を使用すると、まったく初めてプログラムを呼び出した場合にプログラムがサーブレットとしてメモリーにロードされます。その後のすべてのリクエストではメモリー内のプログラムが呼び出されるため、最初の呼び出し後の呼び出しでは応答時間が短くなります。また JSP は Java 環境にも理想的です。しかし PHP の場合にはプログラムが呼び出されるたびにプログラムがメモリーにロードされるため、重要なアプリケーションでは応答時間が長くなるかもしれません。
エンタープライズ・レベルの選択肢として JSP の方が適していると言える、もう 1 つの注目すべき特徴は、JSP に備わるマルチスレッド機能です。PHP にはマルチスレッドのサポートが組み込まれていません。
このシナリオの目標はプログラムにフィード・リンクを提供することです。このプログラムではフィードを取得し、フィード内にあるすべてのタイトルを一覧表示する必要があります。もう少しこのプログラムを興味深いものにするために、RSS フィードではなく JSON フォーマットのフィードを購読することにします。
リスト 3 のコード・スニペットは O'Reilly から引用したものであり、Java コードで作成されています。
リスト 3. Java コードを使用したフィード・リーダー
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.apache.commons.io.IOUtils;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
public class JsonParser {
public static void main(String[] args) throws Exception {
String urlString =
"http://pipes.yahoo.com/pipes/pipe.run?_id=df36e60df711191549cf529e1df96884&
_render=json&
textinput1=and&urlinput1=http%3A%2F%2Ffeeds.wired.com%2Fwired%2Findex";
URL url = new URL(urlString);
URLConnection urlCon = url.openConnection();
InputStream is = urlCon.getInputStream();
String jsonTxt = IOUtils.toString(is);
JSONObject json = (JSONObject) JSONSerializer.toJSON(jsonTxt);
JSONObject value = json.getJSONObject("value");
JSONArray items = value.getJSONArray("items");
String title;
for (Object item : items) {
title=((JSONObject)item).getString("title");
System.out.println("\n" + title);
}
}
}
|
リスト 4 は同じプログラムを Python で作成したものです。
リスト 4. Python を使用したフィード・リーダー
#!/usr/bin/python import urllib.request url = "http://pipes.yahoo.com/pipes/pipe.run? _id=df36e60df711191549cf529e1df96884&_render=json& textinput1=and&urlinput1=http%3A%2F%2Ffeeds.wired.com%2Fwired%2Findex" HTTPdata = urllib.request.urlopen(url) json_data = eval(HTTPdata.read()) for item in json_data['value']['items']: print (item['title']) |
この Python プログラムは、さらに簡略化して、たった 3 行のプログラムにすることができます。そのためにはリスト 4 の最初の 2 行をそのままにし、それ以外のコードをリスト 5 の行で置き換えます。
リスト 5. リスト 4 を簡略化した 3 行目のコード
for item in eval((urllib.request.urlopen("http://pipes.yahoo.com/pipes/pipe.run?
_id=df36e60df711191549cf529e1df96884&_render=json&textinput1=and&
urlinput1=http%3A%2F%2Ffeeds.wired.com%2Fwired%2Findex"))
.read()))['value']['items']:print (item['title']) |
このサンプル・アプリケーションは 2 つの言語の柔軟性を示しています。どちらの言語も、必要なライブラリーのすべてをネイティブではサポートしておらず、必要なパッケージをインポートする必要があります。Python の場合にはデフォルトで JSON を操作することができるため、Java よりもはるかに単純です。Java コードの場合には、JSON ライブラリーとその依存関係を取得しないとプログラムが動作しないため、Python よりもはるかに困難です。
エンタープライズ・アプリケーションの場合には、パフォーマンス、セキュリティー、保守性、開発時間に関してデザイナーとプログラマーがぎりぎりのところで勝負をしなければなりません。単に最高のパフォーマンスを値として示すプログラミング言語を使用すればよいわけではありません。他の重要な要素として、本番稼働までの時間、柔軟性、そのプログラムを既存のインフラストラクチャーといかに適切に統合できるか、などを考慮する必要があります。
プログラムが使用される環境も重要な役割を担います。エンタープライズ・レベルで作成されるプログラムは決して単独で実行されるプログラムではありません。各プログラムはさらに大きな目的の一部となるため、相互運用性が重要な要素となります。
Web サービスを Java コードで実装した企業が、信頼性の高いプラットフォームとして WebSphere MQ を追加したいとします。その場合、WebSphere MQ の C API を使用してアプリケーションを作成してもまったく無意味であり、Java コードを選択する必要があります。
次期プロジェクトとして、情報技術やコンピューターと無関係の分野で調査を行うとします。例えば、このプロジェクトには、画像処理、音声処理、透かし、場合によると株式市場の調査が含まれるかもしれません。皆さんは特定のリアルタイム動作をシミュレートするコードを作成する必要がありますが、あまりコンピューターに詳しくありません。
このプロジェクトには間に合わせのコードが大量に必要です。最も重要な要素は本番稼働までの時間です。この場合の本番稼働までの時間の意味は、より大きな本来の課題に取りかかれるように、どの程度早くコンポーネントを稼働させられるかということであり、この段階では相互運用性をまったく気にせずに簡単なスタブを作成するのと非常によく似ています。このプロジェクトは本格的な製品になるかもしれませんが、現時点では初期段階にあるため、プロトタイピングを行えることが重要な要件です。
こうした場合には MATLAB や LISP などの言語が役立つかもしれません。もし C でプロトタイピングを開始したとすると、変数やポインターなどの詳細に入り込む羽目になり、調査に関する面での実際の結果をほとんど得られないかもしれません。MATLAB は C/C++ や Fortran を統合することができるため、MATLAB から C コードを呼び出したり C コードから MATLAB を呼び出したりすることができます。
この記事では、プログラミング言語を選択する際に考慮すべき要素の概要を説明しました。ただし、この記事で取り上げた要素のみを考慮すればよいわけではありません。例えば、非常に経験の長いプログラマーが、それまで考慮対象としていなかった言語を提案した場合には、その言語も評価する必要があります。
この記事を読んだことで、皆さんの次期プロジェクトでプログラム言語の選択プロセスが容易になることをお祈りします。多くの言語が常に進化しており、常に改善の余地があります。
学ぶために
- Computer
Language Benchmarks Game では 10 数種類の単純なタスクに対し、約 24 種類の異なるプログラミング言語で作成されたプログラムのパフォーマンスに関する暫定的な結果を提供しています。
- Google
App Engine についての資料を読んでください。Google App Engine を使用すると、Google のインフラストラクチャー上で Web アプリケーションを実行することができます。
- 最初のベンチマークの結果の 1 つ、2003年の Computer Language Shootout Scorecard では、各言語のパフォーマンスを測定し、ベンチマークの結果を要約しています。
- 「The PHP
Scalability Myth」は PHP が実際にスケーラブルであることを解説しています。
- CPAN
(Comprehensive Perl Archive Network) について学んでください。
- Stack Overflowでは、PHP、ASP、JSP、CGI などの速度に関する議論が行われています。
- MathWorks から MATLAB の情報を入手してください。
- リスト 3 に使用したコード・スニペットは O'Reilly Answers の How to Parse
JSON in Java から引用したものです。
- developerWorks の Web development ゾーン: Web ベースのさまざまなソリューションを解説した記事が豊富に用意されています。
- developerWorks の Technical
events and webcasts: 最新情報を入手してください。
製品や技術を入手するために
- IBM のソフトウェアを無料で試してみてください。試用版をダウンロードすることも、オンライン評価版にログインすることも、Sandbox 環境で製品を操作することも、クラウドを介して IBM 製品にアクセスすることもできます。100 を超える IBM 製品の評価版のなかから選ぶことができます。
議論するために
- 今すぐ developerWorks
プロフィールを作成し、プログラム言語に関するウォッチ・リストを設定してください。developerWorks
コミュニティーとずっとつながっていられます。
- Web
開発に関心を持つ他の developerWorks メンバーを見つけてください。
- Web
の話題に焦点を絞った developerWorks のグループの 1 つに参加し、皆さんの知識を共有してください。

Jerry Reghunadh はインドのバンガロールにある IBM のシステム・ソフトウェア技術者です。彼は WebSphere Service Registry and Repository チームのメンバーです。彼は 6 年を超える業界経験を持ち、主な専門は WebSphere DataPower SOA Appliance、XML、自動化です。WSRR に加わる前は、XB60 アプライアンスと XI50 アプライアンスのための DataPower 開発チームと、WebSphere Quick Connect Appliance チームのメンバーでした。彼は DataPower デプロイメント・アーキテクトとして働いた経験もあります。
