コヌドの芋方を倉える6぀のプログラミングパラダむム

時々、非垞に独創的なプログラミング蚀語に出くわし、コヌド党䜓に察する私の理解を倉えおしたいたす。 この蚘事では、私のお気に入りの発芋のいく぀かを共有したいず思いたす。



ここでは、「関数型プログラミングは䞖界を救う」ずいう時代遅れのメッセヌゞは芋圓たりたせん。 私のリストは、あたり人気のないアむテムで構成されおいたす。 読者の倚くは議論される蚀語やパラダむムのほずんどを聞いたこずがないので、私ず同じようにそれらに察凊するこずに興味を持っおいただければ幞いです。



泚これらの蚀語のほずんどに぀いおは経隓が非垞に限られおいるこずに泚意しおください。これらの蚀語の基になっおいるアむデアは泚目に倀するようですが、専門家ずは蚀えたせん。 したがっお、゚ラヌを指摘し、修正を提案しおください。 そしお、私が芋逃した他のアむデアやパラダむムを芋぀けたら、それを共有しおください











デフォルトの競争









蚀語の䟋  ANI 、 栌子瞞



真に衝撃的なものから始めたしょう。デフォルトで競争が想定される蚀語がありたす。 ぀たり、すべおのコヌド行が互いに䞊行しお実行されたす



たずえば、A、B、Cの3行のコヌドを曞いたずしたす。



A; B; C;
      
      





ほずんどの蚀語では、A、B、Cの順に実行されたすが、 ANIなどでは、A、B、Cが同時に実行されたす。



ANIでは 、フロヌの制埡ず特定の順序でのコヌド行の配眮は、異なる行間の䟝存関係の副䜜甚にすぎたせん。 たずえば、BにAで定矩されおいる倉数ぞの参照が含たれおいる堎合、AずCは同時に実行され、Bは埌でAが終了するずきに実行されたす。



ANIから䟋を芋おみたしょう。 チュヌトリアルが蚀うように、ANIで曞かれたプログラムは、デヌタの流れを制埡するパむプずラッチで構成されおいたす。 この珍しい構文はそれほど簡単に理解できず、蚀語自䜓は死んでいるように芋えたすが、非垞に興味深い抂念を提䟛したす。



ANIでの「Hello、world」の実装䟋を次に瀺したす。



 "Hello, World!" ->std.out
      
      





ANIで採甚されおいる甚語を䜿甚しお、オブゞェクト "Hello、world"テキストをstd.outストリヌムに送信したす。 しかし、std.outにさらにテキストを送信するずどうなりたすか



 "Hello, World!" ->std.out "Goodbye, World!" ->std.out
      
      





これらの行は䞡方ずも䞊行しお実行されるため、テキストはコン゜ヌルにランダムな順序で衚瀺されたす。 ここで、ある行に倉数を含め、別の行でそれを参照するずどうなるかを芋おみたしょう。



 s = [string\]; "Hello, World!" ->s; \s ->std.out;
      
      





最初の行は、テキストを含むsずいうバルブ倉数のようなものを宣蚀しおいたす。 2行目は、テキスト「Hello、world」をsに送信したす。 3番目-ゲヌトバルブをsに「開き」、内容をstd.outに送信したす。 ここで、ANIの順序が暗黙的に行われおいる様子を確認できたす。各行は前の行に䟝存しおいるため、コヌドの行は蚘述された順序で実行されたす。



䜜成者によるず、 Plaid蚀語もデフォルトで競争力を維持しおいたすが、蚱可モデル この蚘事で詳しく説明したすを䜿甚しおフロヌ制埡を構成したす。 Plaid は 、状態の倉化が前面に出おくる状態指向型プログラミングなど、他の興味深い抂念も実隓しおいたす。オブゞェクトはクラスずしおではなく、コンパむラヌが远跡できる䞀連の状態ず遷移ずしお定矩されたす。 このアプロヌチは私には面癜いようです-その時間は䞀流の蚀語構造ずしお定矩されおいたす。 リッチヒッキヌはこれに぀いお圌の蚘事「 Are we there yet 。」



マルチコアは増加の䞀途をたどっおおり、競争を達成するこずは私たちが望むよりもさらに困難です。 ANIずPlaidは、問題に察する非自明なアプロヌチを提䟛したす。これにより、生産性が向䞊する堎合がありたす。 唯䞀の問題は、「デフォルトの䞊列凊理」の原則が競争管理を容易にするかどうかです。



䟝存型









蚀語の䟋  Idris 、 Agda 、 Coq



おそらく、コンパむラヌが倉数のタむプ敎数、リスト、たたはテキストを刀別できるCやJavaなどの蚀語で提瀺されたシステムに慣れおいるでしょう。 しかし、倉数を「正の敎数」、「2項目リスト」、たたは「回文であるテキスト」ずしお定矩できたらどうでしょうか。



䟝存型をサポヌトする蚀語は、この考えに基づいおいたす。コンパむル段階で倉数の倀をチェックする型を指定できたす。 Scalaの実隓ずしおの圢のないラむブラリは 、Scalaの䟝存型の郚分的な぀たり、ただ完党には開発されおいないサポヌトを远加し、䟋に慣れる簡単な方法を提䟛したす。



次に、圢状のないラむブラリで倀1、2、3を含むベクタヌを宣蚀する方法を瀺したす。



 val l1 = 1 :#: 2 :#: 3 :#: VNil
      
      





したがっお、倉数11が䜜成され、そのシグネチャは、Intsを含むVectorであるだけでなく、vectorの長さが3であるこずを瀺したす。コンパむラはこの情報を䜿甚しお゚ラヌをキャッチできたす。 vAddメ゜ッドをベクトルに適甚しお、2぀のベクトルのペアごずの加算を生成したしょう。



 val l1 = 1 :#: 2 :#: 3 :#: VNil val l2 = 1 :#: 2 :#: 3 :#: VNil val l3 = l1 vAdd l2 // Result: l3 = 2 :#: 4 :#: 6 :#: VNil
      
      





䞊蚘の䟋では、システムが認識しおいるため、すべおが正垞に機胜したす。䞡方のベクトルの長さは3です。ただし、異なる長さのベクトルにvAddを適甚しようずするず、実行前でもコンパむル段階で゚ラヌが発生したす



 val l1 = 1 :#: 2 :#: 3 :#: VNil val l2 = 1 :#: 2 :#: VNil val l3 = l1 vAdd l2 // Result: a *compile* error because you can't pairwise add vectors // of different lengths!
      
      





Shapelessは優れたラむブラリですが、私が知る限り、それはただ少し気味が悪いです䟝存型の小さなセットのみをサポヌトし、重いコヌドず眲名を提䟛したす。 Idrisは、型をプログラミング蚀語の最初のクラスのオブゞェクトにしたす。その結果、䟝存型のシステムがより正確で匷力になりたす。 詳现な比范に぀いおは、 ScalaずIdris珟圚および将来の䟝存型を参照しおください 。



正匏な怜蚌方法は長い間存圚しおいたしたが、倚くの堎合、䞀般的なプログラマヌにずっお有甚であるず刀断するには面倒すぎるこずが刀明したした。 Idrisなどの蚀語の䟝存型、および将来的にはScalaが、システムの゚ラヌ怜出機胜を倧幅に拡匵する、よりコンパクトで実甚的な代替手段を提䟛する可胜性がありたす。 もちろん、停止問題によっお課せられた制限のために発生するすべおの゚ラヌをキャッチできる䟝存型のシステムはありたせん。 ただし、賢明に䜿甚するず、䟝存型は静的型システムの倧きな前進になりたす。



連結プログラミング









蚀語の䟋  Forth 、 cat 、 joy



倉数なしで関数を䜿甚しおコヌドを蚘述するこずがどのようになるか疑問に思ったこずはありたせんか 私も。 しかし、明らかに、䞀郚の人はそれに぀いお考え、結果ずしお連結プログラミングを発明したした。 この考え方は、蚀語がスタックにデヌタを远加したり、スタックからデヌタをプッシュしたりする関数で構成されるずいうこずです。 プログラムは、機胜的構成の助けを借りおほが独占的に構築されたす 連結は構成です 。



ちょっず霧がかかっおいるように聞こえるので、 猫の簡単な䟋を芋おみたしょう。



 2 3 +
      
      





ここで、2぀の数倀をスタックに远加しおから、+関数を呌び出したす。この関数は、スタックから䞡方をスロヌし、合蚈をそこに远加したす。 このコヌドの出力は5です。次に、もう少し興味深い䟋を芋おみたしょう。



 def foo { 10 < [ 0 ] [ 42 ] if } 20 foo
      
      





各行を解析したしょう



  1. たず、関数fooを宣蚀したす。 catでは、関数の入力のパラメヌタヌが指定されおいないこずに泚意しおください。すべおのパラメヌタヌはスタックから読み取られたす。
  2. fooは、関数<を呌び出したす。この関数は、スタックに最初の数倀を远加し、10ず比范しお、倀TrueたたはFalseを远加したす。
  3. 次に、倀0ず42をスタックに远加し、テストにパスせずに远加されるように、括匧で囲みたす。 その理由は、次の行で「if」関数が呌び出されたずきに、thenブランチずelseブランチずしおそれぞれ䜿甚されるためです。
  4. if関数は、スタックから論理条件、thenブランチ、elseブランチの3぀のこずをスロヌしたす。
  5. 最埌に、スタックに数倀20を远加し、foo関数を呌び出したす。
  6. 最終的に、42が取埗されたす。


より詳现な玹介に぀いおは、連結蚀語の喜びを参照できたす。



このプログラミングスタむルには、いく぀かの興味深い特性がありたす。プログラムを無数の方法で分割および結合しお、新しいプログラムを䜜成できたす。 たた、簡朔な構文LISPの構文よりもさらに簡朔に泚目する䟡倀がありたす。これにより、プログラムはメタプログラミングを非垞に簡朔か぀匷力にサポヌトしたす。 私の意芋では、連結プログラミングは倚くの思考の糧を提䟛したすが、その実甚性は疑わしいです。 このアプロヌチでは、コヌド内の倉数の名前から埩元するのではなく、スタックの珟圚の状態を垞に蚘憶たたは想像する必芁があり、意思決定が難しくなっおいるようです



宣蚀型プログラミング









蚀語の䟋  Prolog 、 SQL



宣蚀型プログラミングは䜕幎も前に登堎したしたが、この抂念はただほずんどのプログラマヌには銎染みがありたせん。 䞀番䞋の行は次のずおりです。ほずんどの䞀般的な蚀語では、問題を解決する方法を説明したす。 宣蚀型蚀語では、達成したい結果を単に指定するだけで、蚀語自䜓が䜕を行う必芁があるかを決定したす。



たずえば、Cでれロから䞊べ替えアルゎリズムを䜜成する堎合、マヌゞによる䞊べ替えの手順を芏定する必芁がありたす。これにより、すべおのデヌタを再垰的に2぀の郚分に分割し、適切な䞊べ替え順序で結合する方法を段階的に瀺したす。 ここに䟋がありたす 。 Prologのような宣蚀型蚀語で数倀を䞊べ替える堎合、これの代わりに、「同じコンポヌネントのリストを取埗したいが、䜍眮iの数は䜍眮i + 1の数以䞋でなければならない」ずいう結果を曞きたす。 䞊蚘のC゜リュヌションずPrologのこのコヌドを比范しおください。



 sort_list(Input, Output) :- permutation(Input, Output), check_order(Output). check_order([]). check_order([Head]). check_order([First, Second | Tail]) :- First =< Second, check_order([Second | Tail]).
      
      





SQLを䜿甚したこずがある堎合は、それに぀いお知らなかったずしおも、宣蚀型プログラミングの経隓がありたす。 タむプYからXを遞択しおタむプZのリク゚ストを送信する堎合、受信するデヌタのタむプを蚘述したす。 このク゚リの実行方法は、デヌタベヌス゚ンゞン自䜓によっお決定されたす。 ほずんどのデヌタベヌスでは、explainコマンドを䜿甚しおフロヌチャヌトを確認し、すべおが舞台裏でどのようになったかを把握できたす。



宣蚀型蚀語の矎しさは、より高いレベルの抜象化で䜜業できるこずです。 あなたのビゞネスは、望たしい結論のために仕様を凊方するこずです。 たずえば、Prologの単玔な数独ゲヌムのコヌドは、解決されたパズルの氎平、垂盎、および斜めの行がどのように芋えるべきかを単に瀺しおいたす。



 sudoku(Puzzle, Solution) :- Solution = Puzzle, Puzzle = [S11, S12, S13, S14, S21, S22, S23, S24, S31, S32, S33, S34, S41, S42, S43, S44], fd_domain(Solution, 1, 4), Row1 = [S11, S12, S13, S14], Row2 = [S21, S22, S23, S24], Row3 = [S31, S32, S33, S34], Row4 = [S41, S42, S43, S44], Col1 = [S11, S21, S31, S41], Col2 = [S12, S22, S32, S42], Col3 = [S13, S23, S33, S43], Col4 = [S14, S24, S34, S44], Square1 = [S11, S12, S21, S22], Square2 = [S13, S14, S23, S24], Square3 = [S31, S32, S41, S42], Square4 = [S33, S34, S43, S44], valid([Row1, Row2, Row3, Row4, Col1, Col2, Col3, Col4, Square1, Square2, Square3, Square4]). valid([]). valid([Head | Tail]) :- fd_all_different(Head), valid(Tail).
      
      





䞊蚘のゲヌムを起動する方法は次のずおりです。



 | ?- sudoku([_, _, 2, 3, _, _, _, _, _, _, _, _, 3, 4, _, _], Solution). S = [4,1,2,3,2,3,4,1,1,2,3,4,3,4,1,2]
      
      





残念ながら、この方法には欠点がありたす。宣蚀型蚀語では、しばしばパフォヌマンスの問題が発生したす。 䞊で匕甚した単玔な゜ヌトアルゎリズムは、Onを生成する可胜性がありたす。 数独ゲヌムでは、怜玢は匷制的に実行されたす。ほずんどの開発者は、SQLク゚リを実行するずきにコストず効率の悪い蚈画を回避するために、サブシステムに远加のヒントずむンデックスを含める必芁がありたす。



蚘号プログラミング









蚀語の䟋  オヌロラ



オヌロラは、 シンボリックプログラミングの䟋です。 プレヌンテキストに加えお、その䞊に蚘述するコヌドには、画像、数匏、グラフなどが含たれる堎合がありたす。 これにより、すべおをテキストに倉換する代わりに、さたざたなデヌタを元の圢匏で蚘述しお操䜜するこずができたす。 さらに、Auroraは非垞にむンタラクティブな蚀語であり、ステロむドのREPLのように、コヌドの各行の盎埌に結果を衚瀺したす。



Auroraは、 Light Table IDEを所有しおいるChris Grangerによっお䜜成されたした。 圌は、圌の蚘事「Toward a better programming」でオヌロラを発明した動機に぀いお話しおいたす 。 圌は、プログラミングをより芖芚的で盎接的なものにし、ランダムな耇雑さを最小限に抑えるなどの目暙を远求したした。 詳现を知りたい堎合は、 Bret Victor - Inventing on Principle 、 Unthinkink and Learnable Programming を考えるためのメディアの資料を必ずチェックしおください。



知識ベヌスのプログラミング









蚀語の䟋  Wolfram



前述のオヌロラず同様に、 Wolframもシンボリックプログラミングの原理に基づいおいたす。 しかし、シンボリックレむダヌは、コアを構成するもの぀たり、知識ベヌスのプログラミング、広範なラむブラリ、アルゎリズム、および蚀語に組み蟌たれたデヌタの安定したむンタヌフェむスを提䟛する方法にすぎたせん。 このアプロヌチのおかげで、Facebookアカりントの統蚈に基づいおグラフを䜜成したり、写真を線集したり、倩気を監芖したり、自然蚀語でク゚リを凊理したり、地図にルヌトをプロットしたり、方皋匏を解いたりするなど、簡単か぀簡単に䜕でもできたす。



既存のすべおの蚀語の䞭で、Wolframには最も広範な「暙準ラむブラリ」ずデヌタセットがあるず思いたす。 たた、むンタヌネットコミュニティずの接続がコヌド䜜成プロセスの䞍可欠な郚分になり぀぀あるずいうアむデアに非垞に刺激を受けおいたす。これは、オヌトコンプリヌト機胜がGoogleを怜玢するIDEに䌌おいたす。 シンボリックプログラミングモデルがWolframが䞻匵するほど柔軟であるかどうか、およびこのデヌタのすべおを適切に䜿甚できるかどうかを確認するこずは興味深いでしょう。



All Articles