概要
スクリプト言語は、ここ数年で Web アプリケーション プログラミングにおいてますます人気が高まっています。このペーパーでは、現在最も人気のある 3 つの言語、PHP、Python、Ruby の違い、利点、欠点を見つけようとします。明らかに彼らには独自の意見や支持があるため、客観的な事実を述べ、科学的アプローチを満足させることは困難な作業です。 3 つの言語は、歴史、進化、人気、構文、セマンティクス、機能、セキュリティ、パフォーマンスに関して Web アプリケーションのコンテキストで評価されます。最後に、最終的な結論として、最も有望な言語が提案されます。
1. はじめに
動的スクリプト プログラミング言語は、一般的なプログラミング言語として主流の市場に到達しました。これらには、C++ などの古典的な静的言語と区別する特定の特性があります。
-- 動的に型指定されます
-- 構文に焦点を当てます
-- 自動メモリ管理とガベージ コレクションがあります
-- ほとんどが解釈されます(コンパイル可能性ではありません)
これらのプロパティは、迅速なプロトタイピング、迅速なコード変更、およびテスト ルーチンを可能にするため、Web アプリケーション開発にとって魅力的です。選択した特定の言語に応じて、特定の言語の価値にも違いがあります。ただし、この記事は動的言語と静的言語の比較に関するものではなく、PHP、Python、Ruby という 3 つの動的言語間の比較です。この紹介では、この言語の歴史と人気について詳しく説明します。論文の作業の主な部分は、構文とセマンティクス、言語機能、セキュリティとパフォーマンスの比較です。最終的には、すべての調査結果を概説し、プログラマーとユーザーのニーズに基づいて推奨事項を作成する結論が得られます。
この記事では、3 つの言語の紹介、その機能と可能性の概要、Web 開発に関連する属性の比較、およびエンジニアリング言語を評価する際の意思決定のガイダンスを示します。
1.1 歴史
Web アプリケーション開発の歴史は比較的浅いです。当初は、静的ファイルをリンクすることがほとんどでした。 Mehdi Jazayeri は、Web アプリケーション エンジニアリングとソフトウェア エンジニアリングの歴史は似ているが、Web アプリケーション エンジニアリングの規模ははるかに小さいと指摘しました [14]。彼は、初期には、Web ページを生成するために Perl で記述された構造や生成スクリプトがあまりなかったことを示しています。したがって、スクリプトに埋め込まれたコンテンツと HTML マークアップ コードに大きな問題があり、コードの管理が困難になります。このとき、PHP は逆のアプローチ、つまり HTML コンテンツにスクリプト コードを挿入するという方法で市場に参入しました。
PHP は 1994 年に Ram Lerdorf によって開始され、「Personal Home Page」の略称でした (1997 年に PHP: Hypertext Preprocessor に置き換えられました)。 PHP 言語は PHP チームによって開発され、正式な言語仕様がないため、現在は事実上の標準になっています [12]。これはオープン ソース ライセンスの条件に基づいてリリースされており、開発ドキュメントはオンラインで自由に入手できます [13]。
Web アプリケーション エンジニアリングが成熟するにつれて、ソフトウェア エンジニアは、大規模で複雑なプロジェクトを実装するには関心事を分離する必要があることに気づきました。 Web 開発におけるよく知られたデザイン パターンである Model-View-Controller [17] が新たに注目を集めています。 PHP は当初からオブジェクト指向プログラミングをサポートしていませんでしたが、モデル ビュー コントローラー設計パターンを使用するニーズに応えるために、その機能が継続的に言語に追加されました。
同時に、Python プログラミング言語は数年前から存在しています。 Python は、World Wide Web が一般公開される少し前の 1991 年に Guido van Rossum によって開発されました。これは最初からフル機能の汎用言語であり、PHP のような Web スクリプト言語として特化して使用されたわけではありません。その言語の正式な仕様もありませんが、事実上の標準は Python Software Foundation [20] によって提供されています (C で記述されているため、その実装は CPython を指します)。互換性のある Python 実装を提供するプロジェクトは他にもいくつかあります。たとえば、Jython は Java で書かれており、基礎となる Java プラットフォームを使用します。 IronPython は C# で書かれており、.NET フレームワークを利用します。 PyPy と呼ばれる実装は Python 自体で書かれています。 PHP と同様に、Python には強力なオープンソースの背景があり、包括的なオンライン開発ドキュメントも付属しています [10]。
もう 1 つのプログラミング言語が 1995 年に誕生しました。Ruby はまつもとゆきひろ氏によって開発されたスクリプト言語で、Python とよく似た概念を持っています。 Ruby は完全にオブジェクト指向のプログラミング言語であり、プログラミング言語 Smalltalk の影響を強く受けています。 Ruby には C で書かれた実装仕様があり、オープンソースです (これも PHP や Python に似ています)。 Ruby 言語の開発は、正式な拠点や組織を持たないオープン コミュニティによる共同作業です。言語仕様と開発ドキュメントはどちらもオンラインで無料で入手できます [9]。
1.2 人気
会社が十分な数の従業員を抱えるためには、使用される言語の人気が非常に重要です。人気のない言語や未知の言語は、ソフトウェアを作成するのと同じくらい、維持および開発するために計画された冒険です。したがって、プロジェクトにどの言語を使用するかを決定することは、プログラミング言語の人気にも依存します。
この時点で、人気の測定は非常に難しいことを述べておきたいと思います。代表的なデータを収集するのは難しいため、いかなる種類の結果も真の科学的証拠とはみなされません。
人気の指標の 1 つは、TIOBE プログラミング コミュニティ インデックスです[6]。熟練したエンジニア、コース、サードパーティベンダー、検索エンジンの評価に基づいてプログラミング言語をランク付けします。 Web サイトには、「このインデックスは、自分のプログラミング スキルがまだ最新のものであるかどうかを確認したり、新しいソフトウェア システムの構築を開始する際にどのプログラミング言語を使用するべきか戦略的な決定を下す際に使用できます。」と記載されています。2009 年 5 月には、PHP は 4 位にランクされました。 Python が 6 位、Ruby が 10 位でした。
もう 1 つの方法は、IRC やニュースグループなどのオンライン メディアでの議論を測定することです。 Anton Ertl は、さまざまな企業で使用されているさまざまな言語をカウントするデータ ページを提供しています。 2009 年 3 月の時点で、Python が 1 位、Ruby が 4 位、PHP が 9 位にランクされています。 TIOBE インデックスと同様に、プログラミング言語の人気に関する Web サイトがあり、これも IRC 評価と Slashdot などのディスカッション Web サイトに基づいています [5]。この標準化されたディスカッション サイトでは、最終的に Python が 3 位、Ruby が 6 位、PHP が 9 位にランクインしました。
Web プログラミング言語のコンテキストを考慮して、既存のソフトウェア エコシステムについても考慮することができます。前述したように、3 つの言語はすべて密接に関連しており、無料のオープンソース ソフトウェアであるため、使用できる Web フレームワークやコンテンツ管理システムが多数あります。 PHP は、ほんの数例を挙げると、MediaWiki、Drupal、Joomla、WordPress などの最も一般的なコンテンツ管理システムで使用されています。 Python 用の最も人気のある Web フレームワークは Zope アプリケーション サーバーで、Plone や Django などのコンテンツ管理システムで使用されます。 Ruby はよく知られた Ruby on Rails Web フレームワークを提供しますが、使用できる一般的なコンテンツ管理システムはありません。
PHP は、中小企業や個人顧客に大きな利点をもたらします。PHP は、ほぼすべての共有ホスティングプロバイダーで利用でき、現在ではサーバー上で実行環境をセットアップするのが最も簡単です。
つまり、PHP、Python、Ruby は常に人気のある言語のトップ 10 に入る、世界で有名な言語です。 PHP は検索エンジンの評価において有利であり、ホスティング プロバイダーで利用できます。 Python はメディアの評価について議論する際に有利です。 PHP は最も人気のあるフル機能のコンテンツ管理システムを提供し、プログラミングのスキルがなくても Web サイトを構築できます。一方、Python と Ruby は利用可能な Web フレームワークを示し、柔軟性が高くなりますが、より多くのプログラミング作業が必要になります。
2. 構文とセマンティクスの比較
この章では、PHP、Python、Ruby の 3 つの言語で比較できるコード スニペットとプログラミング言語の構造について説明します。
2.1 PHP
はじめにで述べたように、PHP はドキュメントのコンテンツにコードを直接埋め込むテクノロジーを発明しました。簡単な例をリスト 1.1 に示します。リクエストが渡されると、スクリプトがトリガーされ、組み込みの PHP echo コマンドが実行されます。
リスト 1.1. HTML ドキュメントに埋め込まれた PHP コード
リスト 1.2. ログイン情報を確認する簡単な PHP の例
これは、小規模で静的な Web ページには便利ですが、Web が成長するにつれて、さらに複雑な場合、埋め込みコードは、ビュー、デザイン、外観を担当するテンプレート (テンプレート エンジン) に移動します。
ビジネス ロジック コードは他のファイルから分離されているため、明確さと保守性が向上します。ここでは典型的な PHP コード スニペットの例を示し、基本的な言語構造をリスト 1.2 に示します。これは、Web アプリケーションのセキュリティに関する Armin Ronacher の研究から引用されています [19]。
ご覧のとおり、PHP 構文は C 言語の構文から来ており、関数は言語の中心的な要素です。現在のバージョンには名前空間がありません (将来の PHP 5.3 で導入される予定です)。すべての関数には一意の名前が必要です。変数は $ 記号で始まる必要があり、初期化は必要ありません。特別なキーワード (「global」) を使用してアクセスできます。 PHP には、暗黙的な型変換を使用する弱い型システムがあり、たとえば、整数と文字列はブール式で比較できます。これにより、どのような場合に演算子を使用すべきか混乱や不確実性が生じることがよくありますが、PHP ドキュメントには比較表とヒントが記載されています。
上記の例では、MySQL データベース ステートメントがコードに直接統合されていますが、データベース システムが PHP 関数と密接に結合しているため、これは長い間 PHP の欠点でした。 PHP 5.1 が PDO (PHP Data Objects) をサポートするまで、これは構造ベースの機能を利用してデータベース層を抽象化する方法でした。
オブジェクト指向プログラミング パラダイムは、PHP 言語にとって比較的新しいもので、PHP 4 で導入され、PHP 5 で強化されました。ただし、PHP の手続き型コードのルーツは、今日のほとんどの PHP Web フレームワークとコンテンツ管理システムで明らかですが、手続き型アプローチからオブジェクト指向アプローチへの移行プロセスが存在します。
PHP は初心者にとって学びやすいと常に考えられてきました。サンプル コードはオンラインの多くの場所で入手でき、一般的なタスクを実行するには数行のコードが必要です。 Web アプリケーション用の完全なソフトウェア テクノロジとして、有名な LAMP スタック (Linux Apache MySQL PHP) は無料であり、優れたドキュメントとチュートリアルが用意されています。この構文は C や Java などのよく知られた言語に似ているため、多くのプログラマはその構文に精通しています。 PHP の動作は常に非常に堅牢です。暗黙的な型変換を使用し、警告を維持し、重大なエラーが発生した場合にのみエラー警告を表示します (これは初心者にとっては利点ですが、複雑なコードにとっては開発の罠でもあります)。これらの要因により、PHP は強力なユーザー ベースとなり、多くのシステムに貢献します。
2.2 Python
Python は、しばらくして Python で Web スクリプトが一般的になり始めるまで、当初は特に Web アプリケーションに重点を置いた言語ではありませんでした。 1 つ目の方法は、リスト 1.3 に示すように CGI (Common Gateway Interface) を使用する方法です。
リスト 1.3. Hello World フィールドを返す単純な Python スクリプト
Web フレームワークは Python で書かれていますが、Web サーバー ゲートウェイと通信するために CGI、mod Python などのさまざまなテクノロジーを使用します。したがって、このフレームワークは、さまざまな Web サーバーやさまざまなゲートウェイ インターフェイスと互換性がありません。この問題の解決策は WSGI です。「WSGI は Web サーバー ゲートウェイ インターフェイスです。これは、Web アプリケーションが Web サーバーおよびアプリケーション サーバーと通信するための仕様です (適用範囲ははるかに低いですが)。これは Python 標準であり、詳細は次のとおりです。」 PEP 333. 「[7] WSGI を使用すると、ソース コードに触れることなく、環境またはネットワーク アプリケーションのゲートウェイ システムを変更できます。したがって、その利点はより便利です。 WSGI によると、Python Web アプリケーションはリスト 1.4 に示すような最も単純な形式で実装できます。
リスト 1.4. WSGI 経由の Hello World プログラム
統一されたインターフェースを持つことは、このアプローチには適していますが、初心者にとっては少し複雑でもあります。上記の PHP や CGI ソリューションのように、より詳細な情報は暗黙的ではなく明示的に定義する必要があります。
リスト 1.5 は、PHP のログイン検証の例と同じ部分を Python で実装しています。これは、Web アプリケーションのセキュリティに関する Armin Ronacher の研究にも由来しています [19]。
リスト 1.5. Python 関数でのログイン情報の検証
PHP と比較すると、Python は元々オブジェクト指向言語ですが、このモードに限定されず、手続き型プログラミングなどもサポートしています。機能的な特徴。キーワードの数が少ないため、その構文は読みやすく理解しやすいことが証明されています。 Python 構文は、1 つの主要な構文属性において PHP や Ruby と異なります。それは、コード ブロック (関数本体など) 内でインデントが必須であるということです。これは、ソース コードが常に厳密に構造化されていることを意味しますが、これは他のほとんどのプログラミング言語では強制されません。 Python のステートメント定義はコロンで区切る必要はありません (改行は行の終わりを示します) が、コロンを使用することは許可されています。
Python の型システムは強力です。実行時のエラーには最新の呼び出しのトレースバックが含まれており、開発者にデバッグ情報が提供されます。
2.3 Ruby
Ruby は、主要な Web フレームワークを 1 つだけ備えたプログラミング言語です: Ruby on Rails。 CGI をゲートウェイとして使用し、独自の Web サーバーも提供しますが、開発とテストのみに推奨されます。ここでは hello world の例は省略します。リスト 1.6 は、Ruby で実装された認証ログイン機能の例を示しています。
リスト 1.6. Ruby を使用したログイン情報の検証
Ruby 構文は Python に似ていますが、セマンティクスは少し異なります。Ruby は純粋にオブジェクト指向であり、Smalltalk 言語構文を中心に構造化されています。これは、プリミティブ型は複合型とは異なり、オブジェクトはメッセージを送信することによって通信することを意味します。すべてのオブジェクトは任意のメッセージを受信し、例外処理の形式で未知のメッセージを処理できます。ジョブなどのプリミティブ オブジェクトを含むすべての言語構造は、パラメーター固有のメッセージを受け取るオブジェクトとして扱われます。
Ruby ではステートメントを改行文字で区切ったり、最後にセミコロンを追加したりすることもできます。 Ruby は Python のような強制インデントを使用せず、コード ブロックを表すために do キーワード (または中括弧の省略形) を使用します。また、手続き型プログラミング パラダイム、一部の関数型言語構造、メタデータ プログラミングもサポートしています。
Ruby は最小驚きの原則に従っています。これは、言語が直感的に使用できるように設計されており、予想される動作が実際の動作に対応する必要があることを意味します。 Ruby は非常に動的な言語であり、組み込み型のセマンティクスを変更する機能など、実行時にすべてのオブジェクトの動作を変更する機能を備えています。これにより、まったく予期しない結果が生じる可能性があります。たとえば、条件文の「true」と「false」の意味を逆にすると、ほとんどのプログラムが破損します。したがって、すべてのプログラムが信頼できることを確認し、変更できるものと変更できないものに関するルールやガイドラインを定義する必要があります。
2.4 読みやすさと使いやすさ
プログラミング言語ユーザーにとって、読みやすさと使いやすさを実現するものを定義するのは困難です。 PHP は非常に特殊なアプローチに従っており、広く文書化されており、おそらく C プログラマーにとって最も馴染みのあるものです。厳密な強制インデントと少数のキーワード セットを備えた Python は、プログラミングの初心者にとって最良の選択かもしれません。最後に、Ruby は、その優雅さと強力なプログラミング表現力により、Smalltalk 愛好家や経験豊富なプログラマにアピールする可能性があります。
Python は 3 つの言語の中で最も読みやすい構文を持っているように見えますが (インデントを強制する構造のため)、Ruby が最も便利であるようです (驚きが少ないという原則のため)。もちろん、ほとんどのプログラマーは C ベースの構文に精通しているため、PHP は非常に読みやすい言語です。
3. 言語機能の比較
この章では、場合によっては Web アプリケーション開発に役立つプログラミング言語の機能をいくつかリストします。
3.1 例外処理
例外処理は 3 つの言語すべてで提供されます。 Python と Ruby は当初から利用可能で、PHP はバージョン 5 で追加されました。その結果、一部の PHP コンテンツ管理システムには、コードやフレームワークに適切な例外処理サポートが欠けており、この機能は広く利用されていません。
言語間の違いは、他のキーワードによって形成される構文のみです。 PHP には、例外を処理するための "try/catch/finally" と、例外をトリガーするための "throw" 操作があります。 Python では「try /reason/finally」と「raise」が使用され、Ruby では「begin /rescue/ensure」と「raise」が提供されます。このシステムはどの言語でも同様に動作し、ほとんどのプログラマーが期待するとおりに処理します。 Python バージョン 2.5 では、オブジェクトで標準のクリーンアップ操作を定義できるようにする新しい追加機能が導入されました (たとえば、操作が失敗したか成功したかに関係なく、ファイル オブジェクトは閉じられます)。プログラマは「finally」について心配する必要がなくなり、ソース コードの長さが短縮され、大規模なプログラムのパフォーマンスに影響を与える可能性がある適切なクリーンアップが保証されます。参考として PEP 343[1] を参照してください。
3.2 リレーショナル データベースの抽象化
ほとんどすべての最新の Web アプリケーションは、データを保存および取得するための基礎となるデータベースを必要とします。使いやすく、安全で、ベンダーに依存しないリレーショナル データベースを開発するには、単純で昔ながらの SQL ステートメントを抽象化する適切な方法が必要です。
PHP と MySQL データベース システムには長い歴史があります。 PHP Web アプリケーションは、昔も今も特定のデータベースと密接に結合されています。 PHP 5.1 のリリース以来、PHP データ オブジェクト (PDO) と呼ばれる概念が SQL ベースのデータベース システムの抽象化レイヤーとして導入されました。 PDO と標準 SQL ステートメントを使用することにより、Web アプリケーションのソース コードをあまり変更せずにデータベース システムを変更できるようになりました。サードパーティ ライブラリのオブジェクト リレーショナル マッピング (ORM) も利用できますが、これらはほとんどの既存のコンテンツ管理システムでは使用されず、PHP Web フレームワークはそれらの一部のみを使用します。
Python は、PEP 249 でデータベース API [2] を指定し、異なるデータベースにアクセスしたり、異なるデータベース システムにアクセスしたりする際の類似性モジュールの開発を促進します。一般的な Python Web フレームワークを使用する場合、いくつかの ORM ツールが含まれており、さらにオブジェクト指向データベース アクセスを可能にする抽象化レイヤーが追加されているのが一般的です。
Ruby は、唯一の人気のある Web フレームワークである Ruby on Rails で ActiveRecord システムを使用し、ORM パターンを提供します。他の言語フレームワークと同様のタスクを実行するための ORM ツールとして使用できます。
つまり、データベース抽象化サポートは 3 つの言語すべてに存在し、ORM はすべての Web フレームワークで広く使用されています。 PHP は、そのデータベース抽象化が既存の長年にわたる PHP プロジェクトにまだ採用されていないため、他の 2 つの言語より若干遅れています。
3.3 関数型言語の機能
Python と Ruby はどちらも関数型言語の機能をサポートしています。これらはすべて、リスト型とコレクション型で動作するリスト理解メカニズム、つまり第一級市民として扱われる関数と、匿名関数を記述するための「lambda」キーワードを備えています。
Ruby は、コードのブロックを関数呼び出しの引数として受け取る概念であるクロージャーを実装しています (Python でも同じ動作を実現できます)。これは、ファーストクラス関数と自由変数を使用して、クロージャ内でスコープと有効期間を維持する機能的な特徴です。
PHP は関数型プログラミングに特に重点を置いているわけではありませんが、関数名を文字列として変数に格納し、それを使用して関数参照を呼び出すことは可能です。これは非常に基本的で不完全な関数の動作にすぎないため、PHP は関数のパラダイムをエレガントに提供できません。
3.4 インタラクティブな説明
PHP、Python、Ruby の標準実装はすべて、ウィンドウ対話型解釈機能を提供します。これは、一部のコマンド ラインがステートメントや式を 1 行ずつ受け入れ、結果をすぐに出力する対話モードで翻訳を開始できることを意味します。たとえば、小さなコード スニペットを直接テストして結果を観察したり、コードを含むファイルを編集、保存、実行することなく構文を直接実験したりするために利用できます。この機能は初心者にとって特に価値があり、経験豊富なプログラマーにとっても一定のテスト効果があります。
インタラクティブな開発とテストが存在し、3 つの言語すべてでうまく機能します。
3.5 Duck 型
Duck 型は、オブジェクト指向動的型付け言語におけるポリモーフィズム パラダイムです。オブジェクトのプロパティとメソッドは、オブジェクトの適用性を決定します。オブジェクトのタイプによって決定されるわけではありません。 Python と Ruby はアヒル型の使用を促進および奨励し、例外をキャッチするための適切なメカニズムを提供します。一方、PHP はアヒル型を利用できる言語として指定されておらず、代わりに継承によるポリモーフィズムの使用を推奨しています。 PHP では、関数またはメソッドのパラメーターが特定の型で指定され、間違った型が渡されるとエラーがスローされる、型ヒンティングと呼ばれる概念が導入されました。
アヒルのジャンルを利用してソフトウェアを作成するプログラマーは、PHP の代わりに Python または Ruby の使用を検討する必要があります。
3.6 PHP の主な欠点
PHP プラットフォームには、Nikolaj Cholakov [8] によって説明されているいくつかの大きな欠点があり、ここでそれらを要約します。 PHP では、初期化されていない変数の使用が許可されており、多くの場合、独自の命名規則や、異なるパラメーター コマンドを使用する同様の関数が使用されます。また、名前空間もなかったので、関数には一意の関数名を付ける必要がありました。利用可能な関数の数が非常に多く、その中には同じタスクを実行する関数もあったため、プログラマは混乱しやすかったのです。エラー処理は 2 回解決されます。「set_error_handler()」を使用した手続き指向と、例外処理を使用したオブジェクト指向です。
PHP は「register_globals」や「magic quotes」などの機能でも有名ですが、これらは構文から削除されているため、この記事では説明しません。
3.7 その他の違い
2 つの言語には他にも詳細な違いがありますが、これらは Web アプリケーションにとっては特に重要ではありません。 PHP はスレッド (同時プログラミング) をサポートせず、Python と Ruby は生成関数として「yield」ステートメントを提供します (Python と Ruby では、yield の使用法にセマンティクスの違いがあります)。ここでは、あまり詳しく説明しません。
4. セキュリティの比較
セキュリティを重視する Web アプリケーションの最も重要な部分はユーザー入力です。攻撃を回避するには、ユーザー名とパスワードの資格情報、コメント、フォーラムの投稿、その他のコンテンツなど、Web アプリケーションに外部から送信されるデータをクリーンかつ安全に保つことが重要です。このセクションでは、いくつかの一般的な攻撃手法について説明します。
4.1 SQL インジェクション
SQL インジェクションは、データベースのクエリに使用される特別な意味を持つ SQL ステートメント文字 (コメントのエスケープ シーケンスとして使用される文字列 "??" など) を使用する攻撃です。 PHP では、関数を使用してこのような特殊文字を削除することができます (例についてはリスト 1.2 を参照) が、これはデータベースに依存せず、移植性がありません。 PDO (PHP データ オブジェクト) で SQL ステートメントを使用することをお勧めします。クエリは安全な方法で構築されます (悪意のあるデータはエンコードされるか、自動的にエスケープされます)。 Python はデータベース API を使用して同じアプローチを実装し (リスト 1.5 を参照)、Ruby も Rails フレームワークでこれに対する自動サポートを提供します。これらの API を使用する場合、SQL インジェクションは 3 つの言語すべてで問題になりません。
4.2 クロスサイト スクリプティング攻撃 (XSS)
クロスサイト スクリプティングは、準備された悪意のあるスクリプトのフラグメントを Web アプリケーションのコンテンツに挿入し、被害者のブラウザで実行する攻撃です。対応する対策は、ユーザー (この場合は攻撃者) に提供される入力を厳密にサニタイズすることです。 PHP、Python、Ruby は、潜在的に危険な入力をエスケープする機能を提供しており、Web フレームワークの多くのテンプレート エンジンもエスケープ、さらには自動エスケープを提供します。 3 つの言語はすべて、この攻撃に対処できるように設計されています。
4.3 サーバーサイドのコード実行
スクリプト言語には通常、Web アプリケーションのセキュリティを破る非常に危険な機能「eval()」または「exec()」が含まれています。この関数の目的は、文字列変数に格納されたコードを実行することです。文字列変数がユーザー生成のコンテンツで構成されている場合、eval を使用すると大きなセキュリティ ホールが発生します。 3 つの言語はすべてこの機能を提供しますが、その使用は推奨されません。
4.4 PHP セキュリティ欠陥
PHP は安全な方法で使用できますが、不適切な言語設計に起因するいくつかの中核的なセキュリティ問題があります。 Suhosin のようなプロジェクトでは、バッファ オーバーフローやフォーマット文字列の脆弱性に関連する問題を修正するための保護システムと PHP ハード パッチを提供しています。 PHP では不適切なプログラミングが行われ、Web アプリケーション開発中に多くのバグが発生する可能性があります。 National Vulnerability Database にあるストレージの脆弱性の約 3 分の 1 は PHP に関連しています。これを念頭に置くと、セキュリティを重視するアプリケーションには PHP が最適な選択ではない可能性があります。
4.5 パフォーマンスの比較
パフォーマンス、速度、応答性はすべて Web アプリケーションにとって非常に重要な要素ですが、これらの特性を客観的に測定することは困難です。ネットワーク速度と応答時間、データベース接続、Web サーバーのパフォーマンス、サーバー ハードウェアのパフォーマンス、発生するリクエストの数など、システム環境全体がパフォーマンスに影響します。
ただし、プログラミング言語の選択、つまり特定の言語の実装も影響します。 Computer Language Benchmark Game [3] は、さまざまなプログラミング言語のパフォーマンスを比較しようとします。このページには、「言語の実装をどうやってテストするのですか?できません。特定のプログラムを測定します。」一般的に理解されている言語を使用してプログラミング タスクを解決し、同じハードウェアとオペレーティング システム上で実行します。その結果に基づいて、PHP、Python、Ruby が最終リストにランク付けされます。主な理由は、これらのスクリプト言語はマシンコードにコンパイルされず、実行時に解釈されるため、3 つの言語はすべて比較的近いものであり、全体的なテスト ランキングでのパフォーマンスの差は 10% 以内です。これら 3 つの言語はいずれも、他の 2 つよりも大幅に優れているようには見えません。興味深いことに、Ruby のパフォーマンスはバージョン 1.8 から 1.9 に大幅に向上しており、バージョン 1.9 の中央値はバージョン 1.8 の約 2 倍でした (これは、バージョン 1.9 がバイトコード コンパイラと仮想マシンに関連しているという事実に関係していると思われます)実行))。リストには JRuby 実装も含まれており、リファレンス実装と非常によく似た動作をします。
パフォーマンスを向上させる一般的な方法は、キャッシュ システム速度の最適化を使用することです。 PHP 拡張機能は、リクエストごとにソース コードを解析してコンパイルする必要を避けるために、コンパイルされたバイトコードのキャッシュを非常に一般的かつ広範に使用します。 Python は、Web アプリケーション用のキャッシュ システム、つまり memcached2 も提供します。これは、もともと Django Web 開発フレームワークで使用されていた、より一般的なメモリ キャッシュ システムです。 Ruby は、先ほど述べた memcached などのアプリケーション キャッシュ メカニズムを実装することもできます。
つまり、これらの言語のすべての評価結果はほぼ同じであるため、全体的なパフォーマンスの勝者を結論付けるのは困難です。
6. 関連作品
Web アプリケーション エンジニアリングを扱う文献はたくさんあります。Mehdi Jazayeri は Web アプリケーションの傾向と現状について興味深い記事を書きました [14]。Vosloo と Kourie Web は、 Web フレームワークの概要と概念 [22]、Armin Ronacher が非常に実用的なセキュリティ関連の問題を文書化しました [19]。この記事のエントリ ポイントは、明示的な使用法のほんの一部です。Web 開発が成長し続けるにつれて、将来さらに多くの発見が行われることが予想されます。
スクリプト言語には、表現型プログラミングのプラグマティズムを説明するための Ronald Loui のスクリプト言語の使用など、スクリプト言語の概要に関する Luis Rei らの研究など、多くの記事も含まれています [16]。
さらに、この記事には各言語の比較に関する資料もいくつかあります。 Nikolaj Cholakov は PHP を分析していくつかの欠点を要約し [8]、Xavier Spriet は PHP のセキュリティと構成についていくつかの提案をしました [21]。 Gred Lindstrom[15] は Python プログラミングを紹介して説明し、David Geer は Ruby on Rails の概要を説明しました[11]。
PHP、Python、Ruby はすべて無料のオープンソース言語であるため、多くの関連作業とヘルプがオンラインで入手できます。この記事で提供されている Web リソースを参照できます [13][10][9]。
7. 結論
この記事では、Web アプリケーション エンジニアリングの観点から、PHP、Python、Ruby の 3 つの動的プログラミング言語のさまざまな側面を提案します。その中で、言語間の比較を行うために、プロパティ、特性、およびセキュリティが議論され、分析されています。さまざまな言語のプログラマ(またはユーザー)にとって、メリットとデメリットはある程度指摘されます。
どの言語を選択するかは、まず次の使用例に基づいて決定する必要があります: Web アプリケーションは何を達成しようとしているのか? Web ストアやニュース Web サイトなどの一般的なタスクに使用する場合は、おそらく PHP コンテンツ管理システムが最適な選択です。迅速な開発をサポートし、個々のニーズに応じて拡張できます。欠点は柔軟性です。拡張機能はシステムのデータ モデルと内部プログラム フローに密接に結びついています。ソフトウェアがより特殊な目的で使用されることを目的としている場合は、Web フレームワークを最初から構築するのが最善です。この場合、表 1 を検討してください。表 1 には、最良の選択から最悪の選択まで、さまざまなケースにおけるさまざまな言語の選択についてアドバイスするために重要な基準がリストされています。
リスト 1. さまざまな状況に基づく PHP、Python、Ruby の比較
機能の選択 | 詳細な説明 | ベスト | 中 | 最悪 |
人気 | 求人市場 | PHP | Python | Ruby |
信頼性 | ほとんどの既存システム上で | PHP | Python | Ruby |
可読性 | 保守性とユーザー固有 | Python | PHP Ruby | - |
使いやすさ | ラピッドプロトタイピングと開発 | Ruby | Python | PHP |
セキュリティ | 重要なアプリケーション
| Python Python Ruby
| - | - |
データベース抽象化 | 独立したオブジェクト リレーショナル マッピングを提供 | Python Ruby | PHP | - |
例外処理 | エラー制御とリカバリ | Python Ruby | PHP | - |
関数的特徴 | 関数型プログラミング技術の可能性 | Python Ruby | - | PHP |
異なる言語間の違いをよりよく理解するために、図 1 を参照してください | 図 1 言語間の相対的な比較。スケールは 0 (最悪) から 10 (最高) に変化します |
| 免責事項: プログラミング言語 PHP、Python、Ruby はすべて永続的に開発中であるため、この表は今後数か月または数年で変更される可能性があります。客観的な事実から結果を得ようとし、言語分析を行います。ただし、プログラミング言語の選択は常に個人的な経験に関連しているため、言語について議論することは個人的な好みであり、特定の不合理な要素が含まれることがよくあります。 最後の提案として、一般的なユースケースとして Python Web アプリケーションを使用すると、Ruby には強力な裏付けがありますが、まだ普及していないと思います。 PHP は、あまりプログラミングやカスタマイズが必要ないという要件がある一般的なコンテンツ管理システムでのみ使用できます。
|