クエリ: stlは次のどのプログラミングパラダイムに基づいているのか
文章: プログラミングパラダイム プログラミングパラダイムは、プログラマにプログラムの見方を与えるものと言える。例えばオブジェクト指向プログラミングでは、プログラムとはオブジェクトを作りそれを管理するもの。関数型言語では、状態を持たない関数の評価の連続。 プログラミング言語が違えば、対応できるパラダイムも違ってくる。SmalltalkやJavaは、手続き型やオブジェクト指向、Haskellは、関数プログラミング、というように、比較的少数のパラダイムに対応している。一方、多数のパラダイムに対応した言語(マルチパラダイムプログラミング言語)もある。 多くのプログラミングパラダイムには禁じ手がある。純粋な関数型プログラミングでは、副作用があってはならない。構造化プログラミングでは、gotoの無制限な利用が戒められる。特にこの理由により、古いスタイルに慣れた者からは、よく非現実的または過剰に厳密なものと見なされる。しかし、こうした特定のテクニックを避けることで、プログラミング言語の一般の法則に制約されず、プログラムの正確さ(または単にその動作の理解)についての法則を証明しやすくする。
文章: 構造化された並行性 構造化された並行性(こうぞうかされたへいこうせい、英: structured concurrency)は、プログラミング言語における並行処理、非同期処理のAPIのパラダイムのひとつで、呼び出した非同期処理ルーチンが完了するまで呼び出し元の特定のブロックが完了しないことを保証することをいう。 構造化された並行性の「構造化」(structured) の名は、1960年代に提唱されたプログラミング手法である構造化プログラミング (structured programming) を引き継いでいる。 構造化された並行性は、非同期処理の開始と終了が明確に入れ子になることが非同期処理の構造化へのアプローチとなるとみなし、このことが明快さのみならずエラー処理などにおいて従来の手法より有利な点をもつとする。 文章: 並行制約プログラミング 1970年代初めに生まれた論理プログラミングの考え方は、その宣言的な性格を活かしつつより表現力を大きくするため、一般的な制約を扱うように拡張され、Prolog II(1980)やProlog III(1987)、IBMのJafferやLassezらが1987年に発表した制約論理プログラミングスキーマCLP(X)に基づいた各種言語などに発展していった。 それと並行して、論理プログラミングでの導出時のゴールをプロセス、ゴール間で共有する論理変数を通信チャネルと見なす、van Emdenとde Luceanaらの論理プログラミングのプロセス的解釈(1979) から、ガード付きコマンドの考えに基づいたガード付きホーン節でプロセスの生成や通信を表現する並行論理プログラミングの考え方が生まれた。ShapiroのConcurrent Prolog(1983) や上田によるGHC (1985) やKL1などの様々なプログラミング言語や各種のプログラミングテクニックが開発され、また第五世代コンピュータプロジェクトで並列マシンのオペレーティングシステムや言語処理系、さまざまな応用プログラムの作成に利用された。 1987年にMichael Maherはより抽象化された並行論理プログラミングの論理的解釈を与え、並行論理プログラミングでの通信と同期とを制約ストア(変数値に関する部分情報の格納場所)と受信したい情報との含意(implication)の関係として定式化した 。Vijay Saraswatらはこれらの解釈を特定のデータ領域に限定しない制約全般に広げ、より一般化された並行制約プログラミングの計算理論が整備された。 文章: 医学上の未解決問題 エビデンスに基づく医学(EBM)は、医療行為や研究の中心的なパラダイムとなっている。しかし、EBMの周りに議論が続いており、患者の大規模なサンプルから得られた結果を個人にどのように適用できるかについて議論が続いている。 文章: Standard Triangulated Language STLは三次元形状を表現するデータを保存するファイルフォーマットのひとつである。名称の由来は光造形法を意味する光造形法(英: Stereolithography)である。Standard Triangulated Language や Standard Tessellation Language の略称とされることもある。 米国のスリーディー・システムズ(英語版)によって開発された三次元CADソフト用のファイルフォーマットとして作られた。3次元形状を扱う多くのソフトにサポートされており、特にラピッドプロトタイピングシステムのファイルフォーマットとしても利用されている。 文章: スマート・コントラクト その他にも、プログラミングパラダイムによる分類ではデータフロー型の言語であるZilliqaのScillaなど、いくつかの例外も存在する。 文章: 並行論理プログラミング 複数の通信しあうプロセスの集まりでプログラムを構成するという考え方は、1977年にKahnとMcQueenから、 1978年にHoareから提案された。 KahnとMcQueenが提案したものは、複数のプロセスがストリームを介して通信を行う言語で、プロセス間の非同期通信とプロセスの動的生成を許し、プロセス自体は決定的な動作を行うものだった。Hoareが提案したものはガード付きコマンドの考えに基づいたCSPで、この時点ではプロセスの動的生成や非同期通信などの機能は含まれていなかった。 1979年にvan Emdenとde Luceanaは、KahnとMcQueenのモデルを論理プログラミングに適用し、導出時のゴールをプロセス、共通論理変数を通信チャネルと見なす、論理プログラミングのプロセス的解釈を与えた。 ClarkとGregoryは1981年にRelational Languageを提案した。Clarkらはその前に並行実行の機能をPrologに追加したIC-Prologという言語を開発したが、制御機構が複雑になりうまくいかないことが分かった。IC-Prologからバックトラックの機能を取り除きCSPのアイデアを取り入れたRelational Languageは、非同期通信やプロセスの動的生成の機能を含むもので、その後の並行論理プログラミング言語の基礎になった。 ShapiroはRelational Languageをより単純化し、ガードの制限を緩めたConcurrent Prologを1983年に発表した。同時に並行論理プログラミングでの様々なプログラミング手法がConcurrent Prolog上で開発された。 Concurrent Prologに影響を受けたClarkらは、Relational Languageの後継言語であるPARLOGを設計した。 文章: カーゴ・カルト・プログラミング カーゴ・カルト・プログラミングは、目の前の問題について経験の浅いプログラマが、他の場所にあるプログラムコードを、その仕組みや、それが本当に必要かどうかを理解することなしに、別の場所にコピーするときに生じうる。 また、他の場所で見つけてきた設計手法やコーディングスタイルを、それが生まれた背景理由などを理解しないまま盲目的に適用した結果にも見ることができる。例えば、ひと目見れば分かるようなコードに不要なコメントを加えたり、あるプログラミングパラダイムの慣習に過度に固執したり、ガベージコレクションが自動的に収集するオブジェクトに対して解放コードを記述することなどが挙げられる。 カーゴ・カルトという語句は、元々は第二次世界大戦後の南太平洋で見られた先住民の宗教に由来している。これらの人々は、戦時中素晴らしい積荷をもたらしてくれた神のような飛行機を呼び出そうと、一心不乱に精巧な飛行機の模型や滑走路を作り上げた。コンピュータプログラミングにおいてこの語句が使用されるようになったのは、おそらくリチャード・P・ファインマンのカーゴ・カルト・サイエンス(英語版)から派生したものと考えられる。 文章: 標準C++ライブラリ 標準C++ライブラリは、プログラミング言語C++の標準規格で定められたライブラリである。これはクラスと関数などの集合であり、汎用的なコンテナとそれを操作する関数、関数オブジェクト、汎用的な文字列とストリーム(コンソールやファイルとの入出力)、言語機能サポート、数学関数ライブラリ(超越関数の近似を含む)などといった一般的かつ汎用的な関数などから構成される。また、ISO C90規格の標準Cライブラリも含んでいる(C++11でC99互換のライブラリも追加された)。標準C++ライブラリはそのほとんどが名前空間std内にある。C++11規格以降では標準ライブラリに大幅な拡張や機能追加が行なわれた。 Standard Template Library (STL) は標準C++ライブラリの一部分で、コンテナ、アルゴリズム、イテレータ、関数オブジェクトなどを含むものである。 C言語と異なり、標準C++ライブラリのヘッダには末尾に拡張子 (.h) が付かない。 文章: 並行制約プログラミング 並行制約プログラミングが他の多くのプログラミングパラダイムと異なる部分は、通常の手続型言語のような「値を格納」するという考え方ではなく「制約を格納」する、という考え方である。制約(例えば"X ≧ 10")は特定の変数に対する部分情報を表している。計算中、システムの状態は制約ストア(store)と呼ばれる制約の集合で表される。プロセスは制約ストアに別の制約(例えば"X ≦ 20")を追加(tell)することでシステムの状態を変更し、制約ストアの観測(ask)を行い与えられた制約が制約ストアの内容から導き出せるか調べることで同期と通信を行う。 プロセス計算(process calculi)の立場でみた場合、並行制約プログラミングは以下のオペレータから構成される。 例えば、並行論理プログラミングは、並行制約プログラミングをエルブラン領域(Herbrand universe)という有限木で表されるデータ領域に適用し、制約を等号制約(ユニフィケーション)のみに制限したものと見なすことができ、プログラムを以下の節の集まりで表現したものととらえることができる。 文章: アスペクト指向プログラミング アスペクト指向プログラミングは、横断的関心を実装する手法によって、プログラムのモジュール性を高めることを目的にしたプログラミングパラダイムである。横断的関心とは、関心の分離によるモジュールの複数以上にまたがっている共通機能を意味している。AOPはこの横断的関心を、既存コードに設けた間接点を通しての振る舞い助言(advice)の追加によって、コード変更を伴なわずに実装できるようにしている。任意の間接点および振る舞い助言の定義をまとめたモジュールがアスペクトと呼ばれ、これが横断的関心の表現体になる。例としては、全ての関数呼出しにログ出力を伴わせたい時に、全関数冒頭にjoint pointを設けてログ出力コードをadviceにしたアスペクトをプログラム内に定義することで、自動的に各関数呼出しとログ出力が同時実行されるようになる。 アスペクト指向は本来、命令型プログラミングの一角を占めるパラダイムであり、オブジェクト指向とは異なる視点で命令型を発展させたサブジェクト指向の一種でもある。状態の遷移がプロセスに影響を与える命令型の特性(プログラム副作用)に加えて、サブジェクト指向はプロセスもsubjectに基づいた遷移対象にしている。オブジェクト指向は、状態とプロセスの抽象化を追求したパラダイムなので、プロセスの具象/抽象を問わずにaspectに基づいた遷移対象にできるアスペクト指向と直交している。 しかし現状のアスペクト指向は、オブジェクト指向のコードをサポートする役割に留まっていることが多く、独立したパラダイムとして扱われることは稀である。OOP言語JavaにAOPを追加した「AspectJ」がその代表例である。純粋OOP言語RubyもAOP由来の機能を補完的に取り入れている。 文章: 命令型プログラミング 命令型プログラミングは、プログラムの状態を変化させるステートメントを基本文に用いる総称的なプログラミングパラダイムである。ステートメントではコマンド(命令文)が多用される。宣言型プログラミングと対をなしてのプログラミング言語の分類用語としても扱われている。宣言型の数学的性質に対して、命令型はノイマン型コンピュータ向けの計算機科学特有の性質である。このパラダイムは、手続き型、構造化、モジュラー、オブジェクト指向などを包括している。 ステートメント上のコマンドで状態は変化され、変化した状態の参照でステートメントの動作も変化することは副作用と呼ばれる。コマンドと副作用の存在によって命令型プログラミングは、各オペレータを状態の遷移と照らし合わせて解釈することになる。このことから命令型はhow a program operates(どう処理するか)と形容される。 宣言型プログラミングの基本文の式の方針は、コマンドと副作用を持たないことなので、そこでの参照透過な各オペレータは、その定義のままに把握できる。このことから宣言型はwhat a program accomplishes(なにを果たすか)と形容される。 文章: ソフトウェア工学 人が臓器からなるように、ソフトウェアもコンポーネントからなる構造をもつ。この構造をソフトウェアアーキテクチャという。デザインパターン/アンチパターンはアーキテクチャより詳細度の高い構造である。またプログラミングの指針をプログラミングパラダイムという。パラダイムは結果として構造に影響を与える。例えば構造化プログラミング、オブジェクト指向プログラミングが挙げられる。 文章: 科学的コンセンサス 科学的コンセンサスが時間とともにどのように変化するかについては、哲学的・歴史的に多くの説がある。科学の変化の歴史は非常に複雑であり、現在の科学的コンセンサスから見て過去の「勝者」と「敗者」を表現する傾向があるため、科学の変化の正確で厳密なモデルを考えることは非常に困難である。これは、科学の様々な分野が、それぞれ異なる証拠と実験的アプローチを用いて、多少異なる方法で機能していることが要因である。 科学的変化のモデルのほとんどは、科学実験によって生み出される新しいデータに依存している。カール・ポパーは、何回実験をしても科学理論を証明することはできないが、たった1回の実験で反証できるため、科学は反証に基づくべきであると提唱した。これは科学に対する論理的な理論ではあるが、ある意味で「時間を超越した」ものであり、科学が時間とともにどのように進歩すべきかという見解を必ずしも反映していない。 このアプローチに最も大きな影響を与えたのはトーマス・クーンである。彼は実験データは常に理論に完全に適合しないデータを提供し、反証だけでは科学の変化や科学的コンセンサスの崩壊には至らないと主張した。彼は、科学的コンセンサスは「パラダイム」という形で機能すると提唱した。パラダイムとは、ある分野の様々な研究者を結びつける理論や、その理論自体の本質に関する基礎的な仮定である。クーンは、多くの「重要な」異常が蓄積された後にのみ、科学的コンセンサスは「危機」の時期を迎えると主張した。このとき、新しい理論が模索され、やがて1つのパラダイムが古い理論に勝利することになる。真理に向かう直線的な歩みではなく、一連のパラダイムシフトである。また、クーンのモデルは、理論の変化の社会的・個人的側面をより明確に強調し、科学的コンセンサスが決して純粋な論理や事実の問題ではないことを歴史的事例を通じて示した。 文章: 命令型プログラミング 手続き型は、100+200の答えを、状態内の消費税と照らし合わせて解釈して330にする。計算式枠外の状態を吟味しつつオペレータの計算を進めるのがprocedural(手続き的)と言われる。更にそれがその時の状態内のポイントの多さで315や305にもなる。状態遷移がオペレータの結果にも反映されるのが副作用である。計算式が状態を変化させることと、計算式が状態の影響を受けることは通常セットになるので、命令型と手続き型は後に融合的に扱われるようになった。 手続き型がしばしば、命令文を順次実行していくや記憶領域に代入して状態を変化させていくなどと説明されるのはこのためである。副作用の活用は、より小さなメモリ容量でのより効率的なプロセス拡充をもたらせたので、命令型パラダイムはノイマン型コンピュータプログラムの基本になった。 なお、プログラミング視点での手続き型は、命令型プログラムに手続きの定義と呼び出しの機能を加えて、構造性とモジュール性を備えさせたパラダイムを意味している。高水準言語の普及後はこの意味の方が一般的になった。 命令型に対する宣言型というプログラミング理論構図が重視され始めたのは1970年代からであり、副作用によるオペレータのブラックボックス化偏重への見直しがその動機になっている。副作用を前提にした命令型に対して、参照透過性を前提にしてオペレータのホワイトボックス化を重視しているのが宣言型である。 文章: Javaに対する批判 ソースコードレベルでのプログラミングパラダイムの追加や記述性の改善を求めて、Java仮想マシン (JVM) 上で動作するScalaやKotlinといった後発言語も出現しているが、JVMベースの互換言語であるがゆえに、JVMに存在する制約もまた残されている。