1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル

おそらく Eclipse 特別な玹介は䞍芁になっお久しいです。 Eclipse Java 開発ツヌル (JDT。 ほずんどの開発者が「Eclipse」ずいう蚀葉から連想するのは、この人気のあるオヌプン゜ヌス Java IDE です。 ただし、Eclipse は、開発ツヌルを統合するための拡匵可胜なプラットフォヌム (Eclipse プラットフォヌム) であり、JDT など、そのベヌスに基づいお構築された倚数の IDE でもありたす。 Eclipse は、Eclipse プラットフォヌムず JDT の開発を調敎するトップレベルのプロゞェクトである Eclipse プロゞェクトず、その開発の成果物である Eclipse SDK の䞡方です。 最埌に、Eclipse はプロゞェクトの巚倧なコミュニティを持぀オヌプン゜ヌスの財団ですが、そのすべおが Java で曞かれおいるわけではなく、開発ツヌル (プロゞェクトなど) に関連しおいるわけではありたせん。 ゚クリプス IoT О 日食の科孊。 Eclipse の䞖界は非垞に倚様です。

この蚘事は本質的に抂芁であり、統合開発ツヌルを構築するためのプラットフォヌムずしおの Eclipse アヌキテクチャの基本のいく぀かを怜蚎し、テクノロゞヌの基盀を圢成する Eclipse コンポヌネントの最初のアむデアを瀺したす。 「新しいコンフィギュレヌタヌ」のプラットフォヌム 1C: Enterprise。 1C:゚ンタヌプラむズ開発ツヌル。 もちろん、察象読者ずしお Eclipse 開発者のみに焊点を圓おおいるわけではないこずも含め、そのようなレビュヌは必然的に倧郚分が衚面的でかなり限定的なものになるでしょう。 ただし、経隓豊富な Eclipse 開発者であっおも、この蚘事で興味深い情報を芋぀けるこずができるこずを願っおいたす。 たずえば、比范的新しく、あたり知られおいないプロゞェクトである「Eclipse の秘密」の XNUMX ぀に぀いお説明したす。 Eclipseハンドラヌ、1Cによっお蚭立され、サポヌトされおいたす。
1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル

Eclipse アヌキテクチャの抂芁

たず、䟋を䜿甚しお Eclipse アヌキテクチャの䞀般的な偎面をいく぀か芋おみたしょう。 Eclipse Java 開発ツヌル (JDT)。 䟋ずしお JDT を遞択したのは偶然ではありたせん。 これは、Eclipse に登堎した最初の統合開発環境です。 Eclipse C/C++ Development Tooling (CDT) などの他の *DT Eclipse プロゞェクトは埌に䜜成され、基本的なアヌキテクチャ原則ず個々の゜ヌス コヌド フラグメントの䞡方を JDT から借甚しおいたす。 JDT で定められたアヌキテクチャの基本は、1C:Enterprise Development Tools を含む、Eclipse プラットフォヌム䞊に構築されたほがすべおの IDE に今日でも関連しおいたす。

たず第䞀に、Eclipse は、特定のプログラミング蚀語をサポヌトするように蚭蚈された機胜から蚀語に䟝存しない機胜が分離され、UI に䟝存しない「コア」コンポヌネントが関連するコンポヌネントから分離される、かなり明確なアヌキテクチャの階局構造によっお特城づけられるこずに泚意する必芁がありたす。ナヌザヌむンタヌフェむスをサポヌトしたす。

したがっお、Eclipse プラットフォヌムは蚀語に䟝存しない共通のむンフラストラクチャを定矩し、Java 開発ツヌルはフル機胜の Java IDE を Eclipse に远加したす。 Eclipse プラットフォヌムず JDT はどちらもいく぀かのコンポヌネントで構成されおおり、それぞれが UI に䟝存しない「コア」たたは UI レむダヌに属したす (図 1)。

1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル
米。 1. EclipseプラットフォヌムずJDT

Eclipse プラットフォヌムの䞻なコンポヌネントをリストしおみたしょう。

  • ランタむム — プラグむンのむンフラストラクチャを定矩したす。 Eclipse はモゞュヌル匏アヌキテクチャヌを特城ずしおいたす。 基本的に、Eclipse は「拡匵ポむント」ず「拡匵機胜」のコレクションです。
  • — XNUMX ぀以䞊のプロゞェクトを管理したす。 プロゞェクトは、ファむル システムに盎接マップされるフォルダヌずファむルで構成されたす。
  • 暙準りィゞェット ツヌルキット (SWT) - オペレヌティング システムず統合された基本的なナヌザヌ むンタヌフェむス芁玠を提䟛したす。
  • ゞェむフェむス — SWT 䞊に構築された倚数の UI フレヌムワヌクを提䟛したす。
  • ワヌクベンチ — Eclipse UI パラダむム (゚ディタヌ、ビュヌ、パヌスペクティブ) を定矩したす。

Eclipse プラットフォヌムは、デバッグ、比范、怜玢、チヌムなど、統合開発ツヌルを構築するための他の倚くの䟿利なコンポヌネントも提䟛しおいるず蚀わなければなりたせん。 ゜ヌス コヌドの「スマヌト ゚ディタヌ」を構築するための基瀎である JFace Text に぀いおは、特に蚀及する必芁がありたす。 残念ながら、この蚘事の範囲内では、これらのコンポヌネントや UI レむダヌ コンポヌネントをざっず調べるこずさえできたせん。そのため、このセクションの残りの郚分では、UI レむダヌ コンポヌネントの䞻芁な「コア」コンポヌネントの抂芁に限定しお説明したす。 Eclipse プラットフォヌムず JDT。

コアランタむム

Eclipse プラグむン むンフラストラクチャは以䞋に基づいおいたす。 OSGi そしおプロゞェクトによっお提䟛される 日食春分点。 各 Eclipse プラグむンは OSGi バンドルです。 OSGi 仕様では、特に、バヌゞョン管理ず䟝存関係の解決のメカニズムが定矩されおいたす。 これらの暙準メカニズムに加えお、Equinox では次の抂念が導入されおいたす。 拡匵ポむント。 各プラグむンは独自の拡匵ポむントを定矩でき、同じたたは他のプラグむンによっお定矩された拡匵ポむントを䜿甚しおシステムに远加機胜 (「拡匵機胜」) を導入するこずもできたす。 OSGi および Equinox メカニズムの詳现な説明は、この蚘事の範囲を超えおいたす。 Eclipse のモゞュヌル化は完党なものであり (ランタむムを含むサブシステムは XNUMX ぀以䞊のプラグむンで構成されたす)、Eclipse のほがすべおが拡匵機胜であるこずに泚意しおください。 さらに、これらの原則は、OSGi が導入されるずっず前に Eclipse アヌキテクチャに組み蟌たれおいたした (圓時、OSGi によく䌌た独自のテクノロゞが䜿甚されおいたした)。

コアワヌクスペヌス

Eclipse プラットフォヌム䞊に構築されたほがすべおの統合開発環境は、Eclipse ワヌクスペヌスで動䜜したす。 通垞、IDE で開発されたアプリケヌションの゜ヌス コヌドが含たれるワヌクスペヌスです。 ワヌクスペヌスはファむル システムに盎接マップされ、フォルダヌずファむルを含むプロゞェクトで構成されたす。 これらのプロゞェクト、フォルダヌ、ファむルは次のように呌ばれたす。 資源 ワヌクスペヌス。 Eclipse のワヌクスペヌス実装は、ファむル システムに関連するキャッシュずしお機胜するため、リ゜ヌス ツリヌのトラバヌスを倧幅に高速化できたす。 さらに、ワヌクスペヌスは、次のような倚くの远加サヌビスを提䟛したす。 リ゜ヌス倉曎の通知メカニズム О むンクリメンタルビルダヌむンフラストラクチャ.

Core Resources コンポヌネント (org.eclipse.core.resources プラグむン) は、ワヌクスペヌスずそのリ゜ヌスのサポヌトを担圓したす。 特に、このコンポヌネントは、次の圢匏でワヌクスペヌスぞのプログラムによるアクセスを提䟛したす。 リ゜ヌスモデル。 このモデルを効果的に䜿甚するには、クラむアントはリ゜ヌスぞのリンクを提瀺する簡単な方法が必芁です。 この堎合、モデル内のリ゜ヌスの状態を盎接保存するオブゞェクトをクラむアント アクセスから隠すこずが望たしいでしょう。 そうしないず、たずえばファむルを削陀する堎合、クラむアントはモデル内に存圚しないオブゞェクトを保持し続ける可胜性があり、その埌問題が発生したす。 Eclipse は、ず呌ばれるものを䜿甚しおこの問題を解決したす。 ハンドル リ゜ヌス。 ハンドルはキヌずしお機胜し (ワヌクスペヌス内のリ゜ヌスぞのパスのみを知っおいたす)、リ゜ヌスの状態に関する情報を盎接保存する内郚モデル オブゞェクトぞのアクセスを完党に制埡したす。 このデザむンはパタヌンのバリ゚ヌションです ハンドル・本䜓.

米。 図 2 は、リ゜ヌス モデルに適甚されたハンドル/ボディ むディオムを瀺しおいたす。 IResource むンタヌフェむスはリ゜ヌスのハンドルを衚し、API ではありたせんが、このむンタヌフェむスを実装する Resource クラスや本䜓を衚す ResourceInfo クラスずは異なり、API です。 ハンドルはワヌクスペヌス ルヌトを基準ずしたリ゜ヌスぞのパスのみを認識しおおり、リ゜ヌス情報ぞのリンクは含たれおいないこずを匷調したす。 リ゜ヌス情報オブゞェクトは、いわゆる「芁玠ツリヌ」を圢成したす。 このデヌタ構造は完党にメモリ内に具䜓化されたす。 ハンドルに察応するリ゜ヌス情報むンスタンスを芋぀けるには、そのハンドルに栌玍されおいるパスに埓っお芁玠ツリヌをたどりたす。

1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル
米。 2. IResource ず ResourceInfo

埌で説明するように、リ゜ヌス モデルの基本蚭蚈 (ハンドルベヌスず呌ぶこずもできたす) は、Eclipse の他のモデルにも䜿甚されたす。 ここでは、この蚭蚈の特城的な特性をいく぀か挙げおみたしょう。

  • ハンドルは倀オブゞェクトです。 倀オブゞェクトは、その等䟡性がアむデンティティに基づいおいない䞍倉オブゞェクトです。 このようなオブゞェクトは、ハッシュされたコンテナヌのキヌずしお安党に䜿甚できたす。 ハンドルの耇数のむンスタンスが同じリ゜ヌスを参照できたす。 それらを比范するには、equals(Object) メ゜ッドを䜿甚する必芁がありたす。
  • ハンドルはリ゜ヌスの動䜜を定矩したすが、リ゜ヌスの状態に関する情報は含たれたせん (ハンドルに栌玍される唯䞀のデヌタは、リ゜ヌスぞのパスである「キヌ」です)。
  • ハンドルは、存圚しないリ゜ヌス (ただ䜜成されおいないリ゜ヌス、たたはすでに削陀されたリ゜ヌス) を参照しおいる可胜性がありたす。 リ゜ヌスの存圚は、IResource.exists() メ゜ッドを䜿甚しお確認できたす。
  • 䞀郚の操䜜は、ハンドル自䜓に保存されおいる情報のみに基づいお実装できたす (いわゆるハンドル専甚操䜜)。 䟋ずしおは、IResource.getParent()、getFullPath() などがありたす。 このような操䜜を成功させるために、リ゜ヌスが存圚する必芁はありたせん。 成功するためにリ゜ヌスが存圚する必芁がある操䜜は、リ゜ヌスが存圚しない堎合に CoreException をスロヌしたす。

Eclipse は、ワヌクスペヌス リ゜ヌスの倉曎を通知するための効率的なメカニズムを提䟛したす (図 3)。 リ゜ヌスは、Eclipse IDE 自䜓内で実行されたアクションの結果ずしお、たたはファむル システムずの同期の結果ずしお倉曎される可胜性がありたす。 どちらの堎合も、通知を賌読しおいるクラむアントには、倉曎に関する詳现情報が「リ゜ヌス デルタ」の圢匏で提䟛されたす。 デルタは、ワヌクスペヌス リ゜ヌス (サブ) ツリヌの XNUMX ぀の状態間の倉曎を蚘述し、それ自䜓がツリヌです。各ノヌドはリ゜ヌスぞの倉曎を蚘述し、子リ゜ヌスぞの倉曎を蚘述する次のレベルのデルタのリストを含みたす。

1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル
米。 3. IResourceChangeEvent ず IResourceDelta

リ゜ヌス デルタに基づく通知メカニズムには次の特城がありたす。

  • デルタは再垰的合成の原理を䜿甚しお構築されるため、単䞀の倉曎ず倚数の倉曎は同じ構造を䜿甚しお蚘述されたす。 サブスクラむバ クラむアントは、デルタのツリヌを介した再垰降䞋を䜿甚しおリ゜ヌス倉曎通知を凊理できたす。
  • デルタには、リ゜ヌスの移動やそれに関連付けられた「マヌカヌ」の倉曎 (たずえば、コンパむル ゚ラヌはマヌカヌずしお衚されたす) など、リ゜ヌスぞの倉曎に関する完党な情報が含たれおいたす。
  • リ゜ヌス参照はハンドルを通じお行われるため、delta はリモヌト リ゜ヌスを自然に参照できたす。

すぐにわかるように、リ゜ヌス モデル倉曎通知メカニズムの蚭蚈の䞻芁コンポヌネントは、他のハンドルベヌスのモデルにも関連したす。

JDTコア

Eclipse ワヌクスペヌス リ゜ヌス モデルは、蚀語に䟝存しない基本的なモデルです。 JDT コア コンポヌネント (プラグむン org.eclipse.jdt.core) は、Java の芳点からワヌクスペヌス構造をナビゲヌトおよび分析するための API、いわゆる「Java モデル」(Javaモデル。 この API は、フォルダヌずファむルの芳点から定矩される基瀎ずなるリ゜ヌス モデル API ずは察照的に、Java 芁玠の芳点から定矩されたす。 Java 芁玠ツリヌの䞻なむンタヌフェむスを図に瀺したす。 4.

1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル
米。 4. Java モデル芁玠

Java モデルは、リ゜ヌス モデルず同じハンドル/ボディ むディオムを䜿甚したす (図 5)。 IJavaElement はハンドルであり、JavaElementInfo は本䜓の圹割を果たしたす。 IJavaElement むンタヌフェむスは、すべおの Java 芁玠に共通のプロトコルを定矩したす。 そのメ゜ッドの䞀郚はハンドル専甚です: getElementName()、getParent() など。 JavaElementInfo オブゞェクトには、察応する芁玠の状態、぀たりその構造ず属性が栌玍されたす。

1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル
米。 5. IJavaElement ず JavaElementInfo

Java モデルには、リ゜ヌス モデルず比范しお、基本的なハンドル/ボディ蚭蚈の実装にいく぀かの違いがありたす。 䞊で述べたように、リ゜ヌス モデルでは、ノヌドがリ゜ヌス情報オブゞェクトである芁玠ツリヌは完党にメモリ内に含たれたす。 ただし、Java モデルは、.java および .class ファむルの内郚構造 (型、フィヌルド、メ゜ッド) も衚すため、リ゜ヌス ツリヌよりもはるかに倚くの芁玠を含めるこずができたす。

メモリ内の芁玠のツリヌ党䜓が完党に具䜓化されるこずを避けるために、Java モデルの実装では、芁玠情報の制限されたサむズの LRU キャッシュが䜿甚されたす。ここで、キヌはハンドル IJavaElement です。 芁玠情報オブゞェクトは、芁玠ツリヌがナビゲヌトされるずきにオンデマンドで䜜成されたす。 この堎合、最も䜿甚頻床の䜎い項目がキャッシュから削陀され、モデルのメモリ消費量は指定されたキャッシュ サむズに制限されたたたになりたす。 これはハンドルベヌスの蚭蚈のもう XNUMX ぀の利点であり、そのような実装の詳现がクラむアント コヌドから完党に隠蔜されたす。

Java 芁玠ぞの倉曎を通知するメカニズムは、䞀般に、䞊で説明したワヌクスペヌス リ゜ヌスぞの倉曎を远跡するメカニズムず䌌おいたす。 Java モデルの倉曎を監芖したいクラむアントは、IJavaElementDelta を含む ElementChangedEvent オブゞェクトずしお衚される通知をサブスクラむブしたす (図 6)。

1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル
米。 6. ElementChangedEvent ず IJavaElementDelta

Java モデルにはメ゜ッド本䜓や名前解決に関する情報が含たれおいないため、Java で蚘述されたコヌドの詳现な分析のために、JDT コアは远加の (ハンドルベヌスではない) モデルを提䟛したす。 抜象構文ツリヌ (抜象構文ツリヌ、AST)。 AST は゜ヌステキストを解析した結果を衚したす。 AST ノヌドは、゜ヌス モゞュヌルの構造の芁玠 (宣蚀、挔算子、匏など) に察応し、゜ヌス テキスト内の察応する芁玠の座暙に関する情報ず、(オプションずしお) 名前解決に関する情報が含たれおいたす。いわゆるぞのリンクの圢匏 バむンディング。 バむンディングは、コンパむラに認識される、型、メ゜ッド、倉数などの名前付き゚ンティティを衚すオブゞェクトです。 ツリヌを圢成する AST ノヌドずは異なり、バむンディングは盞互参照をサポヌトし、通垞はグラフを圢成したす。 抜象クラス ASTNode は、すべおの AST ノヌドの共通の基本クラスです。 ASTNode サブクラスは、Java 蚀語の特定の構文構造に察応したす。

構文ツリヌは倧量のメモリを消費する可胜性があるため、JDT はアクティブな゚ディタに察しお XNUMX ぀の AST のみをキャッシュしたす。 Java モデルずは異なり、AST は通垞、「䞭間」の「䞀時的な」モデルずみなされ、そのメンバヌは、AST の䜜成に぀ながった操䜜のコンテキスト倖でクラむアントによっお参照されるべきではありたせん。

リストされおいる XNUMX ぀のモデル (Java モデル、AST、バむンディング) は、JDT で「むンテリゞェントな開発ツヌル」を構築するための基瀎を圢成したす。これには、さたざたな「ヘルパヌ」を備えた匷力な Java ゚ディタ、゜ヌス コヌドを凊理するためのさたざたなアクション (むンポヌト リストの敎理など) が含たれたす。カスタマむズされたスタむルに埓った名前ず曞匏蚭定)、怜玢およびリファクタリング ツヌル。 この堎合、Java モデルは、開発䞭のアプリケヌションの構造を芖芚的に衚珟するための基瀎ずしお䜿甚されるため、特別な圹割を果たしたす (たずえば、パッケヌゞ ゚クスプロヌラヌ、アりトラむン、怜玢、呌び出し階局など)。タむプ階局)。

1C:Enterprise Developments Tools で䜿甚される Eclipse コンポヌネント

図では、 図 7 は、1C:Enterprise Development Tools のテクノロゞヌ プラットフォヌムの基盀を圢成する Eclipse コンポヌネントを瀺しおいたす。

1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル
米。 7. 1C:゚ンタヌプラむズ開発ツヌルのプラットフォヌムずしおの Eclipse

゚クリプスプラットフォヌム 基本的なむンフラストラクチャを提䟛したす。 前のセクションでは、このむンフラストラクチャのいく぀かの偎面に぀いお説明したした。

Eclipse モデリング フレヌムワヌク (EMF) は、構造化デヌタをモデル化する䞀般的な手段を提䟛したす。 EMF は Eclipse プラットフォヌムに統合されおいたすが、通垞の Java アプリケヌションで個別に䜿甚するこずもできたす。 倚くの堎合、新しい Eclipse 開発者は、Eclipse プラットフォヌムの耇雑さをただ完党には理解しおいたせんが、すでに EMF に粟通しおいたす。 このような圓然の人気の理由の XNUMX ぀は、ナニバヌサル デザむンです。これには、特に、統合されたメタレベル API が含たれおおり、これにより、䞀般的な方法であらゆる EMF モデルを操䜜できたす。 EMF が提䟛するモデル オブゞェクトの基本実装ず、メタモデルに基づいおモデル コヌドを生成するサブシステムにより、開発速床が倧幅に向䞊し、゚ラヌの数が枛少したす。 EMF には、モデルのシリアル化、モデルぞの倉曎の远跡などのためのメカニズムも含たれおいたす。

真の汎甚ツヌルず同様に、EMF は幅広いモデリング問題の解決に適しおいたすが、䞀郚のクラスのモデル (たずえば、䞊で説明したハンドルベヌスのモデル) では、より特殊なモデリング ツヌルが必芁になる堎合がありたす。 EMF に぀いお話すこずは、特に XNUMX ぀の蚘事の限られた範囲内で、ありがたい仕事です。なぜなら、これは別の本の䞻題であり、かなり分厚い本だからです。 EMF の基瀎ずなる䞀般化の質の高いシステムにより、モデリングに特化したさたざたなプロゞェクトの誕生が可胜になり、それらはトップレベル プロゞェクトに含たれるこずに泚意しおください。 日食モデリング EMF自䜓も同様です。 そのようなプロゞェクトの XNUMX ぀が Eclipse Xtext です。

Eclipse Xtext 「テキスト モデリング」むンフラストラクチャを提䟛したす。 Xtext は䜿甚したす アントラヌ ゜ヌス テキストず EMF を解析しお結果の ASG (抜象セマンティック グラフ、本質的に AST ずバむンディングの組み合わせ) を衚珟するためのもので、「セマンティック モデル」ずも呌ばれたす。 Xtext によっおモデル化された蚀語の文法は、Xtext 独自の蚀語で蚘述されたす。 これにより、ANTLR の文法蚘述を生成できるだけでなく、AST シリアル化メカニズム (぀たり、Xtext はパヌサヌずアンパヌサヌの䞡方を提䟛したす)、コンテキスト ヒント、およびその他の倚数の蚀語コンポヌネントを取埗するこずもできたす。 䞀方、Xtext で䜿甚される文法蚀語は、たずえば ANTLR で䜿甚される文法蚀語ほど柔軟性がありたせん。 したがっお、実装された蚀語を Xtext に「曲げる」必芁がある堎合がありたす。これは、れロから開発される蚀語に぀いお話しおいる堎合には通垞問題になりたせんが、すでに確立された構文を持぀蚀語では受け入れられない堎合がありたす。 それにもかかわらず、Xtext は珟圚、プログラミング蚀語ずその開発ツヌルを構築するための Eclipse の䞭で最も成熟し、機胜が豊富で倚甚途なツヌルです。 特に、ラピッドプロトタむピングに最適なツヌルです。 ドメむン固有蚀語 (ドメむン固有蚀語、DSL)。 前述の ANTLR ず EMF に基づく「蚀語コア」に加えお、Xtext は、むンデックス䜜成メカニズム、増分構築、「スマヌト ゚ディタヌ」などを含む倚くの䟿利な高レベル コンポヌネントを提䟛したすが、ハンドルは省略されおいたす。ベヌスの蚀語モデル。 EMF ず同様に、Xtext も別の本に倀する䞻題であり、珟時点ではそのすべおの機胜に぀いお簡単に話すこずすらできたせん。

1C:゚ンタヌプラむズ開発ツヌルは、EMF 自䜓ず他の倚くの Eclipse モデリング プロゞェクトの䞡方を積極的に䜿甚したす。 特に、Xtext は、組み蟌みプログラミング蚀語やク゚リ蚀語などの 1C:Enterprise 蚀語の開発ツヌルの基盀の XNUMX ぀です。 これらの開発ツヌルのもう XNUMX ぀の基盀は、Eclipse Handly プロゞェクトです。これに぀いおは埌で詳しく説明したす (リストされおいる Eclipse コンポヌネントの䞭で、ただ最も知られおいたせん)。

Eclipseハンドラヌは、Eclipse Technology のトップレベル プロゞェクトのサブプロゞェクトであり、1 幎に 2014C によっお Eclipse Foundation に行われた最初のコヌド寄皿の結果ずしお誕生したした。 それ以来、1C はプロゞェクトの開発をサポヌトし続けおいたす。熱心なコミッタヌは䌚瀟の埓業員です。 このプロゞェクトは小芏暡ですが、Eclipse のかなりナニヌクな分野を占めおいたす。その䞻な目的は、ハンドルベヌスのモデルの開発をサポヌトするこずです。

ハンドル/ボディ むディオムなどのハンドルベヌスのモデルの基本的なアヌキテクチャ原理に぀いおは、䟋ずしおリ゜ヌス モデルず Java モデルを䜿甚しお説明したした。 たた、リ゜ヌス モデルず Java モデルの䞡方が Eclipse Java 開発ツヌル (JDT) の重芁な基盀であるこずにも蚀及したした。 たた、ほずんどすべおの *DT Eclipse プロゞェクトは JDT に䌌たアヌキテクチャを持っおいるため、すべおではないにしおも、ハンドルベヌスのモデルが Eclipse プラットフォヌム䞊に構築された倚くの IDE の基瀎になっおいるず蚀っおも過蚀ではありたせん。 たずえば、Eclipse C/C++ 開発ツヌル (CDT) には、JDT での Java モデルず同じ圹割を CDT アヌキテクチャで果たすハンドルベヌスの C/C++ モデルがありたす。

Handly が登堎するたで、Eclipse はハンドルベヌスの蚀語モデルを構築するための特殊なラむブラリを提䟛しおいたせんでした。 珟圚存圚するモデルは、䞻に Java モデル コヌドを盎接適甚 (別名コピヌ/ペヌスト) するこずによっお䜜成されたした。 蚱可される堎合 Eclipse パブリック ラむセンス (EPL)。 (明らかに、これは通垞、たずえば Eclipse プロゞェクト自䜓に぀いおは法的な問題ではありたせんが、クロヌズド ゜ヌス補品に぀いおは問題ありたせん。) この手法は、その本質的な無蚈画性に加えお、よく知られた問題を匕き起こしたす。゚ラヌに適応する際にコヌドの重耇が発生し、等さらに悪いこずに、結果ずしお埗られるモデルは「それ自䜓」のたたであり、統合の可胜性を掻甚しおいないこずです。 しかし、ハンドルベヌスの蚀語モデルの共通の抂念ずプロトコルを分離するず、EMF の堎合ず同様に、それらを操䜜するための再利甚可胜なコンポヌネントの䜜成に぀ながる可胜性がありたす。

Eclipse がこれらの問題を理解しおいなかったわけではありたせん。 2005 幎に遡りたす マルティン・゚シュリマン、CDT プロトタむプ開発の経隓を芁玄し、 䞻匵した ハンドルベヌスのモデルを含む蚀語モデルの共通むンフラストラクチャを䜜成する必芁性。 しかし、よくあるこずですが、タスクの優先順䜍が高いため、これらのアむデアの実装は実珟したせんでした。 䞀方、*DT コヌドの因数分解は、Eclipse でただ開発が進んでいないトピックの XNUMX ぀です。

ある意味、Handly プロゞェクトは、EMF ずほが同じ問題を解決するように蚭蚈されおいたすが、ハンドルベヌスのモデル、䞻に蚀語の問題 (぀たり、䜕らかのプログラミング蚀語の構造の芁玠を衚す) が察象です。 Handy を蚭蚈するずきに蚭定した䞻な目暙は次のずおりです。

  • 䞻題領域の䞻な抜象化の特定。
  • コヌドの再利甚により、ハンドルベヌスの蚀語モデルの実装の劎力を削枛し、品質を向䞊させたす。
  • 結果のモデルに統合されたメタレベル API を提䟛し、蚀語ハンドルベヌスのモデルで動䜜する共通の IDE コンポヌネントを䜜成できるようにしたす。
  • 柔軟性ず拡匵性。
  • Xtext ずの統合 (別のレむダヌ内)。

共通の抂念ずプロトコルを匷調するために、蚀語ハンドルベヌスのモデルの既存の実装が分析されたした。 Handly が提䟛する䞻なむンタヌフェむスず基本的な実装を図に瀺したす。 8.

1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル
米。 8. Handly芁玠の共通むンタヌフェヌスず基本実装

IElement むンタヌフェむスは芁玠のハンドルを衚し、すべおの Handly ベヌスのモデルの芁玠に共通です。 抜象クラス Element は、䞀般化されたハンドル/ボディ メカニズムを実装したす (図 9)。

1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル
米。 9. IElement ず汎甚ハンドル/ボディの実装

さらに、Handly は、モデル芁玠の倉曎を通知するための䞀般化されたメカニズムを提䟛したす (図 10)。 ご芧のずおり、これはリ゜ヌス モデルや Java モデルに実装された通知メカニズムずほが同様であり、IElementDelta を䜿甚しお芁玠倉曎情報の統䞀された衚珟を提䟛したす。

1C のテクノロゞヌ プラットフォヌムずしおの Eclipse: ゚ンタヌプラむズ開発ツヌル
米。 10. 䞀般的なむンタヌフェむスず Handly 通知メカニズムの基本実装

䞊で説明した Handly パヌツ (図 9 および 10) を䜿甚しお、ほがすべおのハンドルベヌスのモデルを衚すこずができたす。 䜜成甚 蚀語的な モデルに加えお、プロゞェクトは远加機胜を提䟛したす。特に、゜ヌス テキスト構造の芁玠の共通むンタヌフェむスず基本実装、いわゆる ゜ヌス芁玠 (図8)。 ISourceFile むンタヌフェむスは゜ヌス ファむルを衚し、ISourceConstruct は゜ヌス ファむル内の芁玠を衚したす。 抜象クラス SourceFile および SourceConstruct は、゜ヌス ファむルずその芁玠の操䜜をサポヌトする䞀般化されたメカニズムを実装したす。たずえば、テキスト バッファヌの操䜜、゜ヌス テキスト内の芁玠の座暙ぞのバむンド、モデルず䜜業コピヌ バッファヌの珟圚の内容の調敎などです。 、など。 通垞、これらのメカニズムの実装は非垞に困難ですが、Handly は高品質の基本実装を提䟛するこずで、ハンドルベヌスの蚀語モデルを開発する劎力を倧幅に削枛できたす。

䞊蚘のコア メカニズムに加えお、Handly は、テキスト バッファヌずスナップショットのむンフラストラクチャ、゜ヌス コヌド ゚ディタヌずの統合サポヌト (Xtext ゚ディタヌずのすぐに䜿甚できる統合を含む)、およびいく぀かの䞀般的な UI コンポヌネントを提䟛したす。゜ヌスコヌド゚ディタヌで䜜業し、アりトラむンフレヌムワヌクなどのモデルを操䜜したす。 その機胜を説明するために、プロゞェクトでは、Handly での Java モデルの実装など、いく぀かの䟋を提䟛しおいたす。 (JDT での Java モデルの完党な実装ず比范しお、このモデルは明確にするために意図的に倚少簡略化されおいたす。)

前述したように、Handly の初期蚭蚈ずその埌の開発における䞻な焊点は、スケヌラビリティず柔軟性であり、今埌もそうであり続けたす。

原則ずしお、ハンドルベヌスのモデルは「蚭蚈䞊」非垞にうたく拡匵できたす。 たずえば、ハンドル/ボディのむディオムを䜿甚するず、モデルが消費するメモリの量を制限できたす。 しかし、ニュアンスもありたす。 したがっお、Handly のスケヌラビリティをテストしたずきに、通知メカニズムの実装に問題が発芋されたした。倚数の芁玠が倉曎されるず、デルタの構築に時間がかかりすぎるずいう問題がありたした。 同じ問題が、察応するコヌドがか぀お適応された JDT Java モデルにも存圚するこずが刀明したした。 Handly のバグを修正し、JDT 甚にも同様のパッチを甚意したした。これはありがたいこずに受け入れられたした。 これは、Handly を既存のモデル実装に導入するず朜圚的に圹立぀可胜性がある䞀䟋にすぎたせん。この堎合、そのようなバグは XNUMX か所だけで修正できるためです。

既存のモデル実装に Handly を実装するには、ラむブラリに倧幅な柔軟性が必芁です。 䞻な問題は、API モデル党䜓での䞋䜍互換性を維持するこずです。 この問題はで解決されたした ハンドリヌ0.5 これは、開発者によっお定矩され完党に制埡されるモデル固有の API を、ラむブラリによっお提䟛される統合メタレベル API から明確に分離するこずによっお実珟されたす。 これにより、Handly を既存の実装に実装するこずが技術的に可胜になるだけでなく、新しいモデルの開発者が API を蚭蚈する際に倧きな自由が埗られたす。

柔軟性には他の偎面もありたす。 たずえば、Handly はモデルの構造にほずんど制限を課さず、汎甚蚀語ずドメむン固有蚀語の䞡方をモデル化するために䜿甚できたす。 ゜ヌス ファむルの構造を構築する際、Handly は AST 衚珟の特定の圢匏を芏定せず、原則ずしお AST 自䜓の存圚を必芁ずしないため、ほがすべおの解析メカニズムずの互換性が保蚌されたす。 最埌に、Handly は Eclipse ワヌクスペヌスずの完党な統合をサポヌトしおいたすが、Eclipse ワヌクスペヌスずの統合により、ファむル システムを盎接操䜜するこずもできたす。 Eclipseファむルシステム EFS。

珟行版 ハンドリヌ0.6 2016幎XNUMX月に発売されたした。 プロゞェクトは珟圚育成段階にあり、API はただ最終的に修正されおいないずいう事実にもかかわらず、Handly は「早期採甚者」ずしお機胜するリスクを負った XNUMX ぀の倧きな商甚補品ですでに䜿甚されおいたす。ただ埌悔しないでください。

䞊で述べたように、これらの補品の 1 ぀は 1C:Enterprise Development Tools であり、Handly は最初から、組み蟌みプログラミング蚀語やク゚リ蚀語などの XNUMXC:Enterprise 蚀語の高レベル構造の芁玠をモデル化するために䜿甚されたす。 。 もう XNUMX ぀の補品は䞀般にはあたり知られおいたせん。 これ コダシップスタゞオ、特定甚途向け呜什セット プロセッサ (ASIP) 甚の統合蚭蚈環境で、チェコの䌁業 Codasip 瀟内ずそのクラむアント (以䞋を含む) の䞡方で䜿甚されおいたす。 AMD, AVG, Mobileye, シグマデザむン。 Codasip は、2015 幎からバヌゞョン Handly 0.2 から実皌働環境で Handly を䜿甚しおいたす。 Codasip Studio の最新リリヌスでは、0.5 幎 2016 月にリリヌスされたバヌゞョン 4000 が䜿甚されおいたす。 Codasip で IDE 開発を率いる Ondřej Ilčík 氏は、このプロゞェクトに連絡を取り、「サヌドパヌティの採甚者」を代衚しお重芁なフィヌドバックを提䟛しおいたす。 圌は自由時間を芋぀けおプロゞェクトの開発に盎接参加し、Handly サンプルの XNUMX ぀である Java モデルの UI レむダヌ (箄 XNUMX 行のコヌド) を実装するこずもできたした。 採甚者による Handly の䜿甚に関するさらに詳しい盎接の情報は、このペヌゞでご芧いただけたす。 導入事䟋 プロゞェクト。

API の安定性が保蚌されたバヌゞョン 1.0 がリリヌスされ、プロゞェクトがむンキュベヌション状態を終了した埌、Handly に新しい採甚者が珟れるこずを期埅しおいたす。 その間、プロゞェクトは API のテストずさらなる改善を続け、幎 XNUMX 回の「メゞャヌ」リリヌス - XNUMX 月 (Eclipse の同時リリヌスず同じ日) ず XNUMX 月にリリヌスし、導入者が信頌できる予枬可胜なスケゞュヌルを提䟛したす。 たた、プロゞェクトの「バグ率」は䞀貫しお䜎いレベルを維持しおおり、Handly は最初のバヌゞョン以来、早期採甚者の補品で確実に動䜜しおいるこずも付け加えおおきたす。 Eclipse Handy をさらに詳しく調べるには、次を䜿甚できたす。 入門チュヌトリアル О アヌキテクチャの抂芁.

出所 habr.com

コメントを远加したす