はじめに
MegaFonは、通信サービスの提供だけに仕事が限定されないダイナミックなテクノロジー企業です。 たとえば、当社の資産の中には、顧客がさまざまな情報やサービスを受け取る多数のインターネットサイトがあります。 Webプロジェクトを改善および開発するプロジェクトの一環として、他の開発者に役立つ製品を作成しています。 今日、それらの最初のものを紹介したいと思います-Histoneテンプレートエンジンは、Apache Software License 2.0の下で配布されるオープンソースプロジェクトです。 しかし、まず最初に。
ヒストンとは?
あなたの多くは、Webアプリケーションを作成するときにさまざまなテンプレートエンジンを使用します。 状況は、特定の形式で提示されたデータから、変換のルールを定義するテンプレートを使用してHTMLコードを生成する必要がある場合です。 数年前、サーバー上でHTMLコードを生成するためにテンプレートエンジンが積極的に使用され( Smarty 、 FreeMarker 、 Velocity )、今日ではブラウザーで直接HTMLコードを生成する必要が増えています。 このようなテンプレートエンジンの例には、 TrimPathテンプレート 、 Mustache 、 Google Closure Templateなどが含まれます。
さまざまなプラットフォームで動作するように作成されたさまざまなソリューションをすべて備えているため、サーバーとWebブラウザーの両方で実行できるテンプレートエンジンは多くありません。 それぞれに利点と重大な欠点があります。 私たちの意見では、これらの欠点のいくつかは重大であり、サーバーとWebブラウザーの両方で機能するテンプレートエンジンのすべての利点を十分に活用することはできません。
Histoneプロジェクトは、Java、JavaScript、およびPHPの実装で新しいオープンソースのクロスプラットフォームテンプレートエンジンを作成する試みです。 独自のソリューションの開発を開始する前に、既存のクロスプラットフォームテンプレートエンジンの利点と欠点を調査しました。 最新のWebアプリケーションの構築に広く使用されている人気のあるテンプレートエンジンのみを分析し、関心のある3つの実装(Java、JavaScript、PHP)のうち少なくとも2つを持たないソリューションは考慮しませんでした。
長所 | 短所 | |
Google閉鎖テンプレート | -テンプレートのソースコードはJavaScriptでコンパイルされる | -テンプレートを使用するには、特別なユーティリティを使用して前処理する必要があります。 テンプレートへの変更はすべて再コンパイルする必要があるため、これはブラウザベースのアプリケーションの開発を大幅に複雑にします。
-テンプレートの構文は複雑すぎます。これはプログラマーには理解されますが、テンプレート設計者には必然的に困難をもたらします。 -独自の拡張機能を作成するための複雑なメカニズム。 JavaScriptバージョンの機能を増やすことはできません。これにより、テンプレートをクロスプラットフォームで使用する場合に拡張メカニズムが適用できなくなります。 -PHPバージョンなし |
口ひげ | -多くのプログラミング言語のあらゆるバリエーションに存在します。 | -デザイナーが理解するのが難しい型破りな構文。
-テンプレート言語には、いくつかの重要な設計が欠けているため、一部のプロジェクトの状況では、このテンプレートエンジンを使用することができません(少なくとも些細ではありません)。 -拡張メカニズムの文書化は非常に不十分です。 |
既存の製品を分析した後、私たちのチームは、上記の製品の長所を備えた新しいテンプレートエンジンを作成し、私たちにとって重要な短所と短所を修正することにしました。 その結果、開発の基礎となった主要なアイデアのリストが作成されました。
- 1つのテンプレート-テンプレートエンジンの多くの実装。 テンプレートの構文は、その処理に使用されるプログラミング言語とは無関係です。 これは、同じテンプレートをサーバーとブラウザーの両方で処理し、同じ結果を得るために必要です。
- 従来の直感的な構文。 テンプレートエンジンによって処理される構造は、区切り記号{{and}}の間に配置され、その他はすべて、テンプレートを「そのまま」処理した結果になります。
- テンプレートから直接コードを実行できない。 多くのテンプレートエンジンは、対応するプログラミング言語のコードをテンプレートから直接実行できます。 これにより、特定の言語のコード挿入で他の言語の実装でそのようなテンプレートを使用することはできません。 したがって、Histoneでのこのような可能性は完全に排除されます。
- 簡単に拡張できます。 テンプレートの処理に使用されるプログラミング言語に関係なく、提供されているAPIを使用すると、新しい関数またはプロパティを追加してテンプレートで使用し、プロジェクトのニーズを満たすことができます。
- 異なるプラットフォームで処理されるテンプレートに単一のデータソースを使用する機能。 Histoneがサポートするために必要なすべてを備えている汎用データ形式はJSONです。 実装言語が持つデータ型のセットに関係なく、テンプレート言語を使用すると、JSON形式用に定義されたデータ型のサブセットを操作できます。
- テンプレートが実行されている環境に関するデータをテンプレートに提供します。 テンプレートには、処理対象のプラットフォームに関する特定の情報が提供されます。 たとえば、ブラウザで処理する場合、画面の解像度またはブラウザウィンドウサイズに関する情報はテンプレートで利用でき、サーバーで処理する場合、テンプレートはオペレーティングシステムまたはサーバー要求ヘッダーに関するデータを受信できます。
- クロスプラットフォームで簡単な移植。 JavaScript、Java、およびPHPの実装は、そのまま使用できます。 コードの論理編成とともに特定の外部ライブラリの使用を拒否すると、Histoneの実装を他のプログラミング言語(C ++、Ruby、Objective-C、ActionScriptなど)に移植できます。
- パフォーマンス。 Google Closure Templatesとは異なり、Histoneはテンプレートコードを、処理が計画されているプログラミング言語のソースコードに変換しません。 代わりに、製品に含まれる特別なユーティリティを使用して、テンプレートのソースコードを解析および解析の段階をバイパスして実行されるフォームにコンパイルすることができます(最も高価な操作)。 さらに、この段階で、外部から定義された関数、プロパティ、変数に依存しないテンプレートの部分が実行されます。
建築
テンプレートエンジンの一部として、相互に関連する3つのコンポーネントを区別できます。
- 字句解析器。 テンプレート文字列をトークン(元の文字列の文字のシーケンスをグループに結合)に解析します。 実装言語に組み込まれた正規表現エンジンを使用して作成されました。
- パーサー パターン文字列を解析します。その結果は、入力シーケンスの構文構造を反映した抽象構文ツリーです。 再帰降下アルゴリズムを使用して作成されました。
- 通訳 抽象構文ツリーの命令を実行します。その間に、テンプレートの処理結果が生成されます。 算術演算、関数呼び出し、プロパティの読み取りなどを実行するテンプレートエンジンの最も重要な部分
明らかに、正規表現と再帰降下パーサーに基づく字句解析器を使用することは、そのようなシステムを構築するための最も効果的なアプローチではありませんが、これは私たちの主要なタスクがテンプレート解釈プロセスの最大速度を保証することであったという事実によって正当化されます。 実際の条件では、テンプレートのソースコードを使用した作業はプロジェクトの開発中にのみ行われるため、パブリックアクセスのWebアプリケーションはソースコードの代わりにテンプレートの抽象構文ツリーを使用できるため、字句解析と構文解析を完全に排除できます。
テンプレートの構文
テンプレートは、テンプレート処理中にテンプレートエンジンによってコンテンツが実行される特別なテンプレートタグが挿入されたテキストドキュメントです。 テンプレートタグは、{{and}}文字で囲まれたテンプレート言語の構造です。 これらの文字以外のテキストドキュメントの断片は、テンプレートを変更せずに処理した結果に転送されます。
構文の基本
説明 | 例 |
コメント | {{*コメント*}} |
加工防止 | {{%{{2 * 2}}%}} |
プロパティ値または変数値を表示する | {{myValue}}
{{myProp.foo.bar}} {{myObject ["foo"]。bar}} |
関数とマクロの呼び出し | {{loadText( "file.txt")}}
{{global.min(10、20、30)}} {{myMacro( "foo"、 "bar")}} |
メソッド呼び出し | {{"String" .toUpperCase()}}
{{123.isNumber()}} |
データ型
説明 | 例 |
定義されていない値 | {{undefined}} |
値なし | {{null}} |
ブール値 | {{true}}
{{false}} |
数字 | {{10}}
{{3.14}} {{12E-4}} |
行 | {{"String"}}
{{'string'}} |
配列 | {{[1、2、3]}}
{{["Foo": "bar"]}} |
運営
説明 | 例 |
追加 | {{10 + 2}} |
減算 | {{10-2}} |
乗算 | {{10 * 2}} |
部門 | {{10/2}} |
除算の残り | {{10 mod 2}} |
単項マイナス | {{-10}} |
同様に | {{10は10}} |
等しくない | {{10 isNot 2}} |
もっと | {{10> 2}} |
少ない | {{2 <10}} |
より大きいか等しい | {{10> = 2}} |
より小さいか等しい | {{2 <= 10}} |
論理的な「OR」 | {{trueまたはfalse}} |
論理的な「および」 | {{true and false}} |
論理的な「NOT」 | {{not true}} |
三項演算子 | {{true? true:false}} |
構造
説明 | 例 |
変数宣言 | {{var myVar = 10}}
{{var myVar}} ... {{/ var}} |
状態 | {{trueの場合}}
... {{elseif 42}} ... {{else}} ... {{/ if}} |
サイクル | {{値の値について}}
... {{/ for}} {{キーの場合:値の値}} ... {{/ for}} |
マクロ | {{マクロmyMacro(arg1、arg2)}}
... {{/マクロ}} |
インポートテンプレート | {{import "common.tpl"}} |
関数またはマクロの呼び出し | {{call myProc( "arg1"、 "arg2")}}
arg3 {{/ call}} |
おわりに
この記事では、新しいオープンソースのクロスプラットフォームテンプレートエンジンの主な機能を簡単に説明しようとしました。 テンプレートの内部構造と基本構文に精通しています。 Histoneが動作するテクノロジーの詳細な説明に興味がある場合は、次の投稿でそれを伝えることができます。この投稿では、使用する字句解析プログラムの動作を調べます。
プロジェクトの開発に積極的に参加し、リソースに適用できます。 私たちのチームはすべての質問にお答えします。