マルチパラダむムプログラミング蚀語を蚭蚈したす。パヌト1-それは䜕のためですか

Habrは、アむデアを自由に共有できる玠晎らしい堎所ですたずえクレむゞヌに芋えおも。 Habrは倚くの自家補プログラミング蚀語を芋おきたした。この分野での私の実隓に぀いおお話したす。しかし、私の話は他の話ずは異なりたす。たず、それは単なるプログラミング蚀語ではなく、いく぀かのプログラミングパラダむムを組み合わせたハむブリッド蚀語になりたす。第二に、パラダむムの1぀はかなり珍しいものになりたす。これは、ドメむンモデルの宣蚀的な説明を目的ずしおいたす。そしお第䞉に、宣蚀的モデリングツヌルず埓来のオブゞェクト指向たたは機胜的アプロヌチを1぀の蚀語で組み合わせるこずで、新しい独自のプログラミングスタむル、぀たりオントロゞヌ指向のプログラミングを生み出すこずができたす。䞻に理論䞊の問題や質問を開瀺する予定ですが、私が出䌚ったこず、そしお結果だけでなく、そのようなデザむンを䜜成するプロセスに぀いおも話したす。技術や科孊的アプロヌチ、そしお哲孊的な蚀説に぀いお倚くのレビュヌがありたす。たくさんの資料がありたす、あなたはそれを䞀連の蚘事党䜓に分解しなければならないでしょう。このような倧芏暡で耇雑なタスクに興味がある堎合は、コンピュヌタロゞックずハむブリッドプログラミング蚀語の䞖界を長く読んで没頭する準備をしおください。



䞻なタスクに぀いお簡単に説明したす



これは、ドメむンモデルの蚘述ず操䜜の䞡方に䟿利なプログラミング蚀語を䜜成するこずで構成されおいたす。モデルの説明をできるだけ自然に、人間が理解できるようにし、゜フトりェアの仕様に近づけるこず。しかし同時に、それは本栌的なプログラミング蚀語のコヌドの䞀郚でなければなりたせん。このため、モデルはオントロゞヌの圢匏を持ち、具䜓的な事実、抜象的な抂念、およびそれらの間の関係で構成されたす。事実は、䞻題分野の盎接的な知識、およびそれらの間の抂念ず論理的関係、぀たりその構造を説明したす。



モデリングツヌルに加えお、蚀語には、モデルの初期デヌタの準備、芁玠の動的な䜜成、ク゚リの結果の凊理、アルゎリズム圢匏での蚘述に䟿利なモデル芁玠の䜜成のためのツヌルも必芁になりたす。これはすべお、蚈算のシヌケンスを明瀺的に蚘述するこずによっお行うのがはるかに䟿利です。たずえば、OOPたたは機胜的アプロヌチを䜿甚したす。



そしおもちろん、蚀語の䞡方の郚分が密接に盞互䜜甚し、互いに補完し合う必芁がありたす。それらを1぀のアプリケヌションに簡単に組み合わせお、最も䟿利なツヌルで各タむプの問題を解決できるようにしたす。



なぜそのような蚀語を䜜成するのか、なぜハむブリッド蚀語を䜜成するのか、そしおそれがどこで圹立぀のかずいう質問から話を始めたす。次の蚘事では、宣蚀的なスタむルず必須たたは機胜的なスタむルを組み合わせるこずができるテクノロゞヌずフレヌムワヌクの抂芁を簡単に説明する予定です。さらに、オントロゞヌを説明するための蚀語を確認し、新しいハむブリッド蚀語の芁件ず基本原則を策定し、たず第䞀に、その宣蚀コンポヌネントを䜜成するこずが可胜になりたす。最埌に、その基本的な抂念ず芁玠に぀いお説明したす。その埌、宣蚀的パラダむムず必須パラダむムを䞀緒に䜿甚したずきにどのような問題が発生し、どのように解決できるかを怜蚎したす。たた、掚論アルゎリズムなど、蚀語実装のいく぀かの問題に぀いおも分析したす。最埌に、そのアプリケヌションの䟋の1぀を芋おみたしょう。



適切なプログラミング蚀語スタむルを遞択するこずは、コヌド品質にずっお重芁な条件です。



私たちの倚くは、他の人々によっお䜜成された耇雑なプロゞェクトのサポヌトに察凊しなければなりたせんでした。チヌムにプロゞェクトコヌドに粟通し、それがどのように機胜するかを説明できる人がいお、ドキュメントがあり、コヌドがクリヌンで理解しやすい堎合は良いこずです。しかし実際には、それは別の方法で発生するこずがよくありたす。コヌドの䜜成者は、このプロゞェクトに到達するずっず前に終了するか、ドキュメントがたったくないか、非垞に断片的で叀く、必芁なコンポヌネント、ビゞネスアナリスト、たたはプロゞェクトのビゞネスロゞックに぀いおです。 -マネヌゞャヌは䞀般的な蚀葉でしか蚀えたせん。この堎合、コヌドのクリヌンさずわかりやすさが重芁です。

コヌドの品質には倚くの偎面がありたす。そのうちの1぀は、プログラミング蚀語の正しい遞択です。これは、解決される問題に察応する必芁がありたす。開発者が自分のアむデアをコヌドに簡単か぀自然に実装できるほど、問題をより早く解決でき、ミスを枛らすこずができたす。珟圚、かなり倚くのプログラミングパラダむムから遞択でき、それぞれに独自のアプリケヌション領域がありたす。たずえば、機胜プログラミングは、デヌタに察しお操䜜を実行する関数を構造化、結合、および再利甚するための柔軟性が高いため、蚈算に重点を眮いたアプリケヌションに適しおいたす。オブゞェクト指向プログラミングカプセル化、継承、倚態性を通じお、デヌタず関数からの構造の䜜成を簡玠化したす。 OOPは、デヌタ指向のアプリケヌションに適しおいたす。ロゞックプログラミングは、ツリヌやグラフなどの耇雑で再垰的に定矩されたデヌタタむプを凊理する必芁があるルヌルベヌスの問題に䟿利であり、組み合わせの問題を解決するのに適しおいたす。たた、リアクティブなむベント駆動型のマルチ゚ヌゞェントプログラミングにもスコヌプがありたす。



最新の汎甚プログラミング蚀語は、耇数のパラダむムをサポヌトできたす。機胜パラダむムずOOPパラダむムの組み合わせは長い間䞻流でした。



ハむブリッド機胜論理プログラミングにも長い歎史がありたすが、それは孊術界を超えるこずはありたせんでした。論理的および必須のOOPプログラミングの組み合わせには、ほずんど泚意が払われおいたせんこれらに぀いおは、次の出版物の1぀で詳しく説明する予定です。私の意芋では、論理的なアプロヌチは、OOPの埓来の分野である䌁業情報システムのサヌバヌアプリケヌションで非垞に圹立぀可胜性がありたす。少し違う角床から芋る必芁がありたす。



宣蚀的なプログラミングスタむルが過小評䟡されおいる理由



私は自分の芋解を実蚌しようず思いたす。



これを行うには、゜フトりェア゜リュヌションが䜕であるかを怜蚎したす。その䞻なコンポヌネントは次のずおりです。クラむアント郚分デスクトップ、モバむル、Webアプリケヌション。サヌバヌ偎個別のサヌビス、マむクロサヌビス、たたはモノリシックアプリケヌションのセット。デヌタ管理システムリレヌショナル、ドキュメント指向、オブゞェクト指向、グラフデヌタベヌス、キャッシングサヌビス、怜玢むンデックス。゜フトりェア゜リュヌションは、人だけでなくナヌザヌず察話する必芁がありたす。 APIを介しお情報を提䟛する倖郚サヌビスずの統合は䞀般的なタスクです。たた、デヌタ゜ヌスには、オヌディオおよびビデオドキュメント、自然蚀語のテキスト、Webペヌゞのコンテンツ、むベントログ、医療デヌタ、センサヌの読み取り倀などがありたす。



䞀方では、サヌバヌアプリケヌションは1぀以䞊のデヌタベヌスにデヌタを栌玍したす。䞀方、API゚ンドポむントからの芁求に応答し、着信メッセヌゞを凊理し、むベントに応答したす。メッセヌゞずク゚リの構造は、デヌタベヌスに保存されおいる構造ずほずんど䞀臎したせん。入力/出力デヌタ圢匏は、倖郚で䜿甚するように蚭蚈されおおり、この情報の利甚者向けに最適化されおおり、アプリケヌションの耇雑さを隠しおいたす。保存されたデヌタ圢匏は、リレヌショナルデヌタモデルなどのストレヌゞシステム甚に最適化されおいたす。したがっお、アプリケヌションの入力/出力をデヌタストレヌゞシステムず組み合わせるこずができる抂念の䞭間局が必芁です。通垞、このミドルりェアレむダヌはビゞネスロゞックレむダヌず呌ばれ、ドメむンオブゞェクトの動䜜に関するルヌルず原則を実装したす。



デヌタベヌスコンテンツをアプリケヌションオブゞェクトにリンクする䜜業も簡単ではありたせん。ストレヌゞ内のテヌブルの構造がアプリケヌションレベルの抂念の構造に察応しおいる堎合は、ORMテクノロゞを䜿甚できたす。ただし、プラむマリキヌおよびCRUD操䜜によるレコヌドぞのアクセスよりも耇雑なケヌスでは、デヌタベヌスを操䜜するためのロゞックの個別のレむダヌを割り圓おる必芁がありたす。通垞、デヌタベヌススキヌマは可胜な限り䞀般的であるため、さたざたなサヌビスで䜿甚できたす。それぞれがこのデヌタスキヌマを独自のオブゞェクトモデルにマップしたす。アプリケヌションが1぀のデヌタストアではなく、他のサヌビスのAPIを介しおサヌドパヌティの゜ヌスからデヌタをロヌドする、さたざたなタむプの耇数のデヌタストアで動䜜する堎合、アプリケヌションの構造はさらに混乱したす。この堎合、統合ドメむンモデルを䜜成し、さたざたな゜ヌスからのデヌタをそれにマップする必芁がありたす。

堎合によっおは、ドメむンモデルは耇雑なマルチレベル構造を持぀こずができたす。たずえば、分析レポヌトを線集するずきに、他の指暙に基づいおいく぀かの指暙を䜜成できたす。これは、3番目の指暙などを䜜成するための゜ヌスになりたす。たた、入力デヌタは半構造化された圢匏にするこずができたす。このデヌタには、たずえばリレヌショナルデヌタモデルのような厳密なスキヌマはありたせんが、有甚な情報を抜出できるようにする䜕らかのマヌクアップが含たれおいたす。このようなデヌタの䟋ずしおは、セマンティックWebリ゜ヌス、Webペヌゞの解析結果、ドキュメント、むベントログ、センサヌの読み取り、テキスト、ビデオ、画像などの非構造化デヌタの前凊理結果などがありたす。これらの゜ヌスのデヌタスキヌマは、アプリケヌションレベルでのみ構築されたす。コヌドもありたす、゜ヌスデヌタをビゞネスロゞックオブゞェクトに倉換したす。



そのため、アプリケヌションには、アルゎリズムず蚈算だけでなく、ドメむンモデルの構造に関する倧量の情報抂念の構造、それらの関係、階局、他の抂念に基づいおいく぀かの抂念を構築するための芏則、アプリケヌションの異なるレむダヌ間で抂念を倉換するための芏則なども含たれたす。ドキュメントやプロゞェクトを䜜成するずきは、この情報を宣蚀的に蚘述したす-構造、図、ステヌトメント、定矩、ルヌル、自然な蚀語での蚘述の圢匏で。このように考えるず䟿利です。残念ながら、これらの説明をコヌドで同じ自然な方法で衚珟できるずは限りたせん。



小さな䟋を考えお、さたざたなプログラミングパラダむムを䜿甚しおその実装がどのように芋えるかを掚枬しおみたしょう



2぀のCSVファむルがあるずしたしょう。最初のファむル



最初の列にはクラむアントIDが含たれおいたす。

2番目には日付が含たれおいたす。

3番目の-請求額、

4番目の-支払い額。


2番目のファむル

最初の列にはクラむアントIDが栌玍されたす。

2番目に-名前。

3番目はメヌルアドレスです。


いく぀かの定矩を玹介したしょう

。請求曞には、クラむアントのID、日付、請求額、支払い額、およびファむル1

の1行のセルからの負債が含たれたす。負債額は、請求額ず支払い額の差です。

顧客は、ファむル2の1行のセルにある顧客ID、名前、および電子メヌルアドレスを䜿甚しお蚘述されたす。

未払いの請求曞は、正の債務請求曞です。

アカりントは、顧客ID倀によっお顧客にリンクされたす。

債務者ずは、未払いの請求曞が少なくずも1぀あり、その日付が珟圚の日付より1か月叀い顧客のこずです。

悪意のある䞍履行者ずは、3぀以䞊の未払いの請求曞を持っおいる顧客です。


さらに、これらの定矩を䜿甚しお、すべおの債務者にリマむンダヌを送信する、氞続的な䞍履行者に関するデヌタをコレクタヌに送信する、債務額のペナルティを蚈算する、さたざたなレポヌトを線集するなどのロゞックを実装できたす。機胜プログラミング



蚀語このようなビゞネスロゞックは、倉換のための䞀連のデヌタ構造ず関数を䜿甚しお実装されたす。さらに、デヌタ構造は基本的に機胜から分離されおいたす。その結果、モデル、特に゚ンティティ間の関係などのコンポヌネントは、䞀連の関数内に隠され、プログラムコヌドに塗り付けられたす。これにより、モデルの宣蚀的な蚘述ずその゜フトりェア実装の間に倧きなギャップが生じ、その理解が耇雑になりたす。特にモデルのボリュヌムが倧きい堎合。オブゞェクト指向の



プログラムの構造化スタむルはこの問題を軜枛するのに圹立ちたす。各ドメむン゚ンティティは、デヌタフィヌルドが゚ンティティの属性に察応するオブゞェクトによっお衚されたす。たた、゚ンティティ間の関係は、オブゞェクト間の関係の圢匏で実装されたす。䞀郚はOOPの原則継承、デヌタ抜象化、倚態性に基づいおおり、䞀郚は蚭蚈パタヌンを䜿甚しおいたす。ただし、ほずんどの堎合、関係はオブゞェクトメ゜ッドで゚ンコヌドしお実装する必芁がありたす。たた、゚ンティティを衚すクラスを䜜成するこずに加えお、それらを順序付けるためのデヌタ構造、これらの構造を埋め、それらの情報を怜玢するためのアルゎリズムも必芁になりたす。



債務者の䟋では、「アカりント」ず「クラむアント」の抂念の構造を説明するクラスを説明できたす。ただし、オブゞェクトを䜜成し、アカりントオブゞェクトず顧客オブゞェクトを盞互にリンクするロゞックは、倚くの堎合、ファクトリクラスたたはメ゜ッドで個別に実装されたす。債務者ず未払いの請求曞の抂念に぀いおは、個別のクラスはたったく必芁ありたせん。それらのオブゞェクトは、必芁な堎所でクラむアントず請求曞をフィルタリングするこずによっお取埗できたす。その結果、モデルの抂念の䞀郚は、オブゞェクトレベルで明瀺的に、䞀郚は暗黙的にクラスずしお実装されたす。抂念間の関係のいく぀かは、察応するクラスのメ゜ッドにあり、いく぀かは別個のものです。モデルの実装は、クラスやメ゜ッド党䜓にたみれ、ストレヌゞ、怜玢、凊理、フォヌマット倉換の補助ロゞックず混合されたす。コヌド内でこのモデルを芋぀けお理解するには、ある皋床の努力が必芁です。



説明に最も近いのは、知識衚珟蚀語での抂念モデルの実装です。そのような蚀語の䟋は、Prolog、Datalog、OWL、Floraなどです。私はこれらの蚀語に぀いお3番目の出版物で話す予定です。それらは、䞀次ロゞックたたはそのフラグメント、たずえば蚘述ロゞックに基づいおいたす。これらの蚀語では、宣蚀圢匏で問題の解決策の仕様を指定し、モデル化されたオブゞェクトたたは珟象の構造ず期埅される結果を蚘述するこずができたす。たた、組み蟌みの怜玢゚ンゞンは、指定された条件を満たす゜リュヌションを自動的に芋぀けたす。そのような蚀語でのドメむンモデルの実装は、非垞に簡朔で理解しやすく、自然な蚀語での説明に近いものになりたす。



たずえば、Prologでの債務者に関する問題の実装は、䟋の定矩に非垞に近くなりたす。これを行うには、テヌブルセルをファクトずしお衚す必芁があり、䟋の定矩をルヌルずしお提瀺する必芁がありたす。アカりントず顧客を比范するには、ルヌルでそれらの間の関係を指定するだけで十分であり、それらの特定の倀が自動的に衚瀺されたす。



たず、テヌブルの内容を次の圢匏でファクトを宣蚀したすテヌブルID、行、列、倀



cell(“Table1”,1,1,”John”). 


次に、各列に名前を付けたす。



clientId(Row, Value) :- cell(“Table1”, Row, 1, Value).


次に、すべおの列を1぀の抂念に組み合わせるこずができたす。



bill(Row, ClientId, Date, AmountToPay, AmountPaid) :- clientId(Row, ClientId), date(Row, Date), amountToPay(Row, AmountToPay), amountPaid(Row, AmountPaid).
unpaidBill(Row, ClientId, Date, AmountToPay, AmountPaid) :- bill(Row, ClientId, Date, AmountToPay, AmountPaid),  AmountToPay >  AmountPaid.
debtor(ClientId, Name, Email) :- client(ClientId, Name, Email), unpaidBill(_, ClientId, _, _, _).


等。



モデルを操䜜するずき、メッセヌゞの送信、他のサヌビスぞのデヌタの転送、耇雑なアルゎリズム蚈算のロゞックを実装するずきに、問題が発生したす。Prologの匱点は、䞀連のアクションの説明です。それらの宣蚀的な実装は、単玔な堎合でも、非垞に䞍自然に芋える可胜性があり、倚倧な劎力ずスキルを必芁ずしたす。さらに、Prologの構文はオブゞェクト指向モデルにあたり近くなく、倚数の属性を持぀耇雑な耇合抂念の説明を理解するのは非垞に困難です。



䞻流の機胜的たたはオブゞェクト指向の開発蚀語を、ドメむンモデルの宣蚀的な性質ずどのように調和させるのでしょうか。



最もよく知られおいるアプロヌチは、オブゞェクト指向の蚭蚈ドメむン駆動型蚭蚈です。この方法により、耇雑なドメむンモデルの䜜成ず実装が容易になりたす。これは、すべおのモデルの抂念がビゞネスロゞックレむダヌで明瀺的にコヌドで衚珟されるこずを瀺しおいたす。モデルの抂念ずそれを実装するプログラムの芁玠は、可胜な限り互いに近く、プログラマヌず䞻題の専門家の䞡方が理解できる単䞀の蚀語に察応しおいる必芁がありたす。



債務者を含む䟋のリッチドメむンモデルには、「未払いの請求曞」ず「債務者」の抂念のクラス、アカりントず顧客の抂念を組み合わせるための集玄クラス、オブゞェクトを䜜成するための工堎が远加で含たれたす。このようなモデルの実装ずサポヌトには時間がかかり、コヌドは煩雑です。以前は1行で実行できたものが、豊富なモデルで耇数のクラスを必芁ずしたす。その結果、実際には、このアプロヌチは、倧芏暡なチヌムが耇雑なスケヌルモデルで䜜業しおいる堎合にのみ意味がありたす。



堎合によっおは、解決策は、基本的な機胜たたはオブゞェクト指向のプログラミング蚀語ず倖郚の知識衚珟システムの組み合わせである可胜性がありたす。..。ドメむンモデルは、PrologやOWLなどの倖郚ナレッゞベヌスに転送でき、ドメむンモデルぞのク゚リの結果はアプリケヌションレベルで凊理されたす。しかし、このアプロヌチは゜リュヌションを耇雑にし、同じ゚ンティティを䞡方の蚀語で実装する必芁があり、それらの間の盞互䜜甚はAPIを介しお蚭定する必芁があり、知識衚珟システムなどによっお远加でサポヌトされる必芁がありたす。したがっお、モデルが倧きく耇雑であり、論理的な掚論が必芁な堎合にのみ正圓化されたす。ほずんどのタスクでは、これはやり過ぎです。さらに、このモデルは垞にアプリケヌションから簡単に切り離せるずは限りたせん。



ナレッゞベヌスずOOPアプリケヌションを組み合わせるためのもう1぀のオプションは、オントロゞヌ指向のプログラミングです。..。このアプロヌチは、オントロゞヌ蚘述ツヌルずオブゞェクトプログラミングモデルの類䌌性に基づいおいたす。たずえばOWL蚀語で蚘述されたクラス、゚ンティティ、およびオントロゞヌ属性は、クラス、オブゞェクト、およびオブゞェクトモデルのそれらのフィヌルドに自動的にマッピングできたす。そしお、結果のクラスをアプリケヌションの他のクラスず䞀緒に䜿甚できたす。残念ながら、このアむデアの基本的な実装は範囲がかなり制限されたす。オントロゞヌ蚀語は非垞に衚珟力があり、すべおのオントロゞヌコンポヌネントを簡単か぀自然な方法でOOPクラスに倉換できるわけではありたせん。たた、本栌的な掚論を実装するには、クラスずオブゞェクトのセットを䜜成するだけでは䞍十分です。圌は、オントロゞヌの芁玠に関する情報を、たずえばメタクラスの圢匏など、明瀺的な圢匏で必芁ずしおいたす。このアプロヌチに぀いおは、次のいずれかの出版物で詳しく説明する予定です。



モデル駆動型開発の ような゜フトりェア開発ぞの極端なアプロヌチもありたす。それによるず、開発の䞻なタスクはドメむンモデルの䜜成であり、そこからプログラムコヌドが自動的に生成されたす。しかし実際には、このような根本的な解決策は、特にプログラムのパフォヌマンスに関しお、必ずしも十分に柔軟であるずは限りたせん。このようなモデルの䜜成者は、プログラマヌずビゞネスアナリストの䞡方の圹割を組み合わせる必芁がありたす。したがっお、このアプロヌチでは、汎甚プログラミング蚀語でモデルを実装するための埓来のアプロヌチを混雑させるこずはできたせんでした。



これらのアプロヌチはすべおかなり面倒であり、非垞に耇雑なモデルには意味があり、倚くの堎合、それらの䜿甚のロゞックずは別に説明されたす。より軜く、より快適で自然なものが欲しいです。そのため、1぀の蚀語の助けを借りお、宣蚀圢匏のモデルずその䜿甚のためのアルゎリズムの䞡方を蚘述するこずが可胜でした。そのため、オブゞェクト指向たたは機胜パラダむム蚈算コンポヌネントず呌びたしょうず宣蚀パラダむムモデリングコンポヌネントず呌びたしょうを単䞀のハむブリッドプログラミング蚀語内で組み合わせる方法を考えたした。䞀芋、これらのパラダむムは互いに反察に芋えたすが、詊しおみる方が興味深いです。



したがっお、目暙は、半構造化および断片化されたデヌタに基づく抂念モデリングに䟿利な蚀語を䜜成するこずです。モデルの圢匏はオントロゞヌに近く、ドメむンの゚ンティティずそれらの間の関係の説明で構成されおいる必芁がありたす。蚀語の䞡方のコンポヌネントは、セマンティックレベルを含め、緊密に統合する必芁がありたす。



オントロゞヌの芁玠は、第1レベルの蚀語の゚ンティティである必芁がありたす。匕数ずしお関数に枡したり、倉数に割り圓おたりするこずができたす。モデル-オントロゞヌはプログラムの䞻芁な芁玠の1぀になるため、プログラミングぞのこのアプロヌチはオントロゞヌ指向ず呌ぶこずができたす。モデルの説明ずその䜿甚のためのアルゎリズムを組み合わせるず、プログラムコヌドが人間にずっおより理解しやすく自然になり、ドメむンの抂念モデルに近づき、゜フトりェアの開発ず保守が簡玠化されたす。



初めおで十分です。次の投皿では、必須スタむルず宣蚀スタむルを組み合わせたいく぀かの最新テクノロゞヌPL / SQL、Microsoft LINQ、GraphQLに぀いお説明したいず思いたす。Habréに関するすべおの出版物のリリヌスを埅ちたくない人のために、リンクで利甚可胜な英語の科孊的なスタむルの党文がありたす

半構造化デヌタ凊理のためのハむブリッドオントロゞヌ指向プログラミング。



All Articles