言語サポート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2018/02/16 08:45 UTC 版)
C++ Standard Template Library にクラステンプレートとして std::dequeが用意されている。内部の実装方法は規定されていないが、通常は1つ以上の固定サイズ配列を用いて実装されている。両端だけでなくランダムアクセスをサポートしており、キューの中間部分も直接読み書きできる(ただし、キュー両端への挿入・削除がO(1)なのに対し、中間への挿入・削除はO(n)となる)。 Java 6 Collections Framework に Deque インタフェースがあり、両端での追加・取出し機能を提供している。これを実装したクラスとして ArrayDeque や LinkedList がある。こちらも前者が動的配列実装、後者が連結リスト実装である。 Python 2.4 collections モジュールがあり、両端キューオブジェクトをサポートしている。 PHP 5.3 SPL extension に 'SplDoublyLinkedList' クラスがあり、両端キューデータ構造の実装に使える。それまでは配列の関数 array_shift/unshift/pop/push しか使えなかった。
※この「言語サポート」の解説は、「両端キュー」の解説の一部です。
「言語サポート」を含む「両端キュー」の記事については、「両端キュー」の概要を参照ください。
言語サポート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/04/29 20:30 UTC 版)
LISPやScheme、Prologといったプログラミング言語は、片方向リストを組み込みで装備している。多くの関数型言語では、リストを構成するノードを「consセル」と呼ぶ。consセルには "car" 部分と "cdr" 部分があり、"car" 部はそのノードのデータへの参照、"cdr" 部は次のノードへの参照を格納している。consセルは他のデータ構造にも使われるが、主な用途はリストを構成することである。 抽象データ型やテンプレートをサポートする言語では、連結リストの抽象データ型やテンプレートを使って、連結リストを構築できる。 オブジェクト指向プログラミング言語では、次のようなクラスが連結リスト用に用意されている。 C++(STL) - std::list) Java - java.util.LinkedListクラス .NET - System.Collections.Generic.LinkedList
※この「言語サポート」の解説は、「連結リスト」の解説の一部です。
「言語サポート」を含む「連結リスト」の記事については、「連結リスト」の概要を参照ください。
言語サポート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/16 18:58 UTC 版)
C++およびC99以降のC言語は inline キーワードによるインライン関数を標準サポートしている。Microsoft Visual C++はバージョン2017においてもC99をフルサポートしておらず、C言語モードでは inline キーワードをサポートしていないが、代わりにインライン関数は独自拡張の __inline キーワードで対応している。Microsoft Visual C++やg++などは、インライン関数として指定されていなくてもインライン展開すべき関数を自動的に展開するオプションを用意している。Adaでは pragma をインライン関数として使うことができる。Delphi (Object Pascal) はバージョン2005以降でインライン関数のサポートを追加した。JavaやJavaScriptは言語仕様には存在しないが、JITコンパイラが最適化の一環でインライン展開することもある。OracleのJava SEコンパイラはインラインディレクティブオプションをサポートする。関数型言語など他の多くの言語はインライン関数をサポートしていないが、インライン展開を積極的に行うことが多い。インライン展開の方針はコンパイラによって異なる。 C99/C++でのインライン関数の定義例および使用例を以下に示す。 inline int max(int a, int b) { if (a > b) return a; else return b;}...int x = 1, y = -2;int z = max(x--, y); // 1 C++ではクラスおよび構造体のインラインメンバー関数を定義することもできる。クラスおよび構造体の型定義内に直接実装を記述したメンバー関数は、暗黙的にinlineとなる。 class MyClass { int m_number1; int m_number2;public: explicit MyClass(int number1, int number2) : m_number1(number1), m_number2(number2) {} inline int getNumber1() const { return this->m_number1; } int getNumber2() const { return this->m_number2; } // 暗黙的に inline となる。 int getSum() const;};inline int MyClass::getSum() const { return this->m_number1 + this->m_number2; } C++では、関数テンプレート、コンパイラが暗黙的に宣言と定義を自動生成するデフォルトコンストラクタ、C++11以降のconstexpr関数も暗黙的にinlineである。
※この「言語サポート」の解説は、「インライン関数」の解説の一部です。
「言語サポート」を含む「インライン関数」の記事については、「インライン関数」の概要を参照ください。
言語サポート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/21 14:22 UTC 版)
リストの最大値と最小値を求める機能を持つ言語は多々あるが、汎用的な選択を組み込み機能で持っている言語はほとんどない。C++ は例外的に nth_element メソッドのテンプレートを持っており、線形時間での選択が期待できることを保証している。その実装がこれまで説明したアルゴリズムを使用している可能性は高いが、規定はされていない。(ISO/IEC 14882:2003(E) と 14882:1998(E) のセクション25.3.2参照。 また、SGI STL の nth_elementを参照) C++ では、partial_sort アルゴリズムも提供されており、k 個の最小要素をソートした状態で選択する処理を O(nlog k) の時間で行う。k 個の最大要素を選択するアルゴリズムは提供されていないが、順序判定を逆転させれば簡単に実現できる。 PerlにはCPANより Sort::Key::Top というモジュールが出ていて、n 個の要素を選択する関数群が提供されている。 ソートアルゴリズムの言語サポートの方が多いため、実際には単純にソートを行ってから選択する方法が(性能的には不利であるが)多く使われている。
※この「言語サポート」の解説は、「選択アルゴリズム」の解説の一部です。
「言語サポート」を含む「選択アルゴリズム」の記事については、「選択アルゴリズム」の概要を参照ください。
言語サポート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/21 21:57 UTC 版)
幾つかのプログラミング言語では組み込みの例外処理機能を用意している。例えばAda、C++、Java、Scala、C#、JavaScript、OCamlがそうである。これらの言語では専用の言語機能によってプログラマが例外処理を記述する手間を軽減している。 例外が発生したことを見落として正常時の動作を継続してしまうと、より深刻・致命的な異常を招くおそれがある。それを避けるには例外が発生したことのチェックを綿密に行い、例外が検出された場合には適切な事後処理を行う他ない。しかし、大規模なプログラムではこのようなチェックは膨大なものとなり、本来目的としている正常時の処理よりも多くの記述を必要とする場合すらある。 そこで、これらの言語では例外の発生チェックをほぼ自動化している。例外が発生すると現在の処理を中断する。発生した例外の事後処理を担当できるハンドラを探して次々にコールスタック(関数呼び出し)を遡り、適切なハンドラを見つけるとそれに事後処理を任せる。これにより、遡る途中にあったこの例外を処理する能力を持たない処理は自動的に中断されることになる。 Schemeでは言語レベルでの例外処理を持たないが、これは継続が存在するため例外をライブラリレベルで実現できるからである(標準仕様であるSRFI-34で定義されている)。
※この「言語サポート」の解説は、「例外処理」の解説の一部です。
「言語サポート」を含む「例外処理」の記事については、「例外処理」の概要を参照ください。
言語サポート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/09/26 22:08 UTC 版)
「ロック (計算機科学)」の記事における「言語サポート」の解説
「バリア (計算機科学)」も参照 プラットフォーム(OS)やプログラミング言語によっては、様々なロックをサポートしている。 POSIXスレッドAPIはロックサポートを提供する。Microsoft WindowsはWindows APIによってスレッド間およびプロセス間のロックサポートを提供する。 CとC++はプラットフォーム(OS)固有のロック機能やAPIに容易にアクセス可能であるが、C99までのISO/IEC標準では、スレッドや排他制御のための標準APIは存在しなかった。C11以降はPOSIXスレッドベースのスレッドライブラリを標準化したが、必須ではなくオプション扱いである。C++03までのISO/IEC標準でも、同様にスレッドを標準サポートしていなかったが、C++11以降はBoost C++ライブラリをベースに標準化されたスレッディング機能をサポートしている。OpenMP標準は一部コンパイラがサポートしており、プラグマを使ってクリティカルセクションを指定できる。Visual C++ ではコードに synchronize 属性を付与でき、同期しなければならないメソッドを指定できるが、Windowsアーキテクチャと Visual C++ コンパイラにおける「COMオブジェクト」固有である。 Java は synchronized という修飾子を提供しており、コードのブロックであるメソッドまたはオブジェクトに対してロックを配置でき、並行性セーフなデータ構造を特徴とするライブラリも提供している。 C#言語には、lock という予約語があり、他のスレッドに邪魔されずに実行可能なコードブロックを定義する。 VB.NET では SyncLock という予約語があり、C# の lock とほぼ同様である。 Python にはそのような予約語はないが、ロックの取得・解放のための低レベルな排他制御機構を使用可能である。 Ruby も同期のための予約語を提供していないが、低レベル排他制御オブジェクトを明示的に使用することは可能である。 x86のアセンブリ言語では、LOCK というプレフィックスを配することで不可分操作であることを保証でき、他のプロセッサが途中で干渉してくるのを避けることができる。 Objective-C では "@synchronized" という予約語でコードブロックにロックを配することができ、また NSLock、NSRecursiveLock、NSConditionLockというクラスや NSLocking というロック用プロトコルも提供している。
※この「言語サポート」の解説は、「ロック (計算機科学)」の解説の一部です。
「言語サポート」を含む「ロック (計算機科学)」の記事については、「ロック (計算機科学)」の概要を参照ください。
言語サポート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/09/26 21:23 UTC 版)
「参照 (計算機科学)」の記事における「言語サポート」の解説
アセンブリ言語では、参照はメモリアドレスや配列のインデックスで表現される。これを使うには注意が必要である。メモリアドレスは何を指しているかわからないし、指しているものの大きさも構造も意味もアドレスからはわからない。そのような情報はロジック自体に組み込む。その結果、間違ったプログラムが参照を間違って解釈してエラーが発生し、プログラマは途方にくれることになる。 最初の不透明参照のひとつとして、LISP言語のconsセルがある。これは単純化すれば他の2個のLISPオブジェクトへの参照から構成されるデータ構造であり、他のconsセルへの参照も持つことが出来る。この構造で単純な線形リストを構成することもできるし、「ドットリスト」と呼ばれる二分木を構成することもできる。 他の初期の言語FORTRANは明示的な参照を持っていないが、参照渡しで暗黙のうちにそれを使っている。 C言語で導入されたポインタは、原始的な参照の形態のひとつである。これはアセンブリ言語の生アドレス (raw address) 表現と似ているが、ポインタの参照しているデータが誤って解釈されることのないよう、コンパイル時に使用される静的なデータ型の概念を導入しているという点で異なる。しかし、C言語は「弱い型システム」を採用していることから、型変換(あるデータ型の値を明示的に他のデータ型の値に変換すること)によって不正なポインタを容易に生成することができるため、誤った解釈は依然として生じうる。Cの後継とも言えるC++は、新たな型変換演算子の導入、標準ライブラリでのスマートポインタ導入などによりポインタの型安全性を強化しようと試みているが、Cとの互換性維持のため意図的にこれらの安全機構を出し抜くことができる能力を依然として有している。なお、C++には、さらに型としても「参照」というものがある(#C++の「参照」を参照)。 ガベージコレクションをサポートするような多くの高水準言語では、reference などと称される不透明な参照を採用している。これらの参照はC言語のポインタのようなデータ型であるが、参照を生のアドレス値に変換したり、逆にアドレス値から参照を生成したり、といった危険な変換ができないという点でC言語よりずっと安全になっている。このように「管理された」言語 (managed language) では、参照は実際には指すべきデータへのポインタへのポインタになっていることが多い。C/C++から見れば、これらの言語は二段階ポインタを参照に使っていることになる(典型的な実装としては)。ガベージコレクタだけが不透明性を生む中間のポインタに直接アクセスすることができる。一般に参照同士の演算もサポートされていない。
※この「言語サポート」の解説は、「参照 (計算機科学)」の解説の一部です。
「言語サポート」を含む「参照 (計算機科学)」の記事については、「参照 (計算機科学)」の概要を参照ください。
- 言語サポートのページへのリンク