プログラミング言語について話すとき、「直交性」とはどういう意味ですか?
直交性の例は何ですか?
Eric S. Raymondの 「UNIXプログラミングの技術」 から
直交性は、複雑な設計でもコンパクトにするのに役立つ最も重要な特性の1つです。純粋に直交する設計では、操作に副作用はありません。各アクション(API呼び出し、マクロ呼び出し、または言語操作)は、他に影響を与えることなく1つのことだけを変更します。制御しているシステムの各プロパティを変更する唯一の方法があります。
他の部分に目に見えない影響を与えることなく、あるものを変えることができると考えてください。
概して、直交性は2つのものの間の関係であり、相互の影響は最小限に抑えられます。
この用語は、2つのベクトルが直交する場合に直交する数学に由来しています。
典型的な2次元のデカルト空間(X/Y軸を持つ典型的なグリッド)について考えてください。 x = 1とy = 1の2行をプロットします。 2本の線は直交しています。 xを変更することでx = 1を変更できますが、これは他の行に影響を与えず、その逆も同様です。
ソフトウェアでは、この用語は、互いに独立して動作するシステムの2つの部分について話している状況で適切に使用できます。
コンストラクトのセットがある場合。プログラマーがこれらの構成を自由に混在させることができる場合、言語はorthogonalと言われます。たとえば、Cでは配列(静的配列)を返すことはできません。この場合、Cは非直交であると言われます。
int[] fun(); // you can't return a static array.
// Of course you can return a pointer, but the langauge allows passing arrays.
// So, it is unorthognal in case.
ほとんどの答えは非常に長く、あいまいです。要点は、ツールが直交している場合、他のすべてを台無しにすることなく、より優れたツールを優先して、ツールを追加、交換、または削除できることです。
それは、ハンマーとソーを持っている大工とハンマーやソーイングに使用できる大工、または木材を鋸で切ってから一緒に叩くように設計されたいくつかの新しいハンマー/ソーのコンボを持つことの違いです。どちらものこぎりで切断してから一緒にハンマーで打つことができますが、ソーイングを必要とするがハンマーで打つ必要のないタスクがある場合は、直交ツールのみが機能します。同様に、ハンマーの代わりにネジを締める必要がある場合、ハンマーと直交する(混同しない)場合、鋸を捨てる必要はありません。
UNIXのコマンドラインツールの典型的な例:ディスクの内容を取得するツール(dd)、ファイルから行をフィルタリングするツール(grep)、ファイルにそれらの行を書き込むツール(cat)などがあります。すべてを自由に組み合わせて一致させることができます。
from wikipedia :
コンピュータサイエンス
直交性は、複雑な設計の実現可能性とコンパクトさを促進するシステム設計プロパティです。直交性により、システムのコンポーネントによって生成される技術的効果を変更しても、システムの他のコンポーネントに副作用が発生したり伝播したりすることはありません。コンポーネントで構成されるシステムの緊急時の動作は、不十分な統合、つまりモジュールとインターフェイスの非直交設計に起因する副作用ではなく、その論理の正式な定義によって厳密に制御する必要があります。直交性は、副作用を引き起こさず、それらに依存しない設計を検証しやすいため、テストおよび開発時間を短縮します。
たとえば、自動車には直交するコンポーネントと制御があります(たとえば、車両の加速は、加速機能にのみ関係するコンポーネント以外には影響しません)。一方、非直交設計では、ステアリングがブレーキ(電子安定性制御など)に影響したり、速度がサスペンションを調整したりする可能性があります。 1 したがって、この使用法は数学における直交の使用:基底ベクトルのセットの各メンバーにベクトルを個別に投影し、基底ベクトルが相互に直交する場合にのみ投影を追加することにより、ベクトルを部分空間に投影できます。
命令がアドレス指定モードでレジスタを使用できる場合、命令セットは直交していると言われます。この用語は、命令を、コンポーネントが命令フィールドであるベクトルと見なすことから生じます。 1つのフィールドは操作対象のレジスタを識別し、別のフィールドはアドレッシングモードを指定します。直交命令セットは、レジスタとアドレッシングモードのすべての組み合わせを一意にエンコードします。
から ウィキペディア :
直交性は、複雑な設計の実現可能性とコンパクトさを促進するシステム設計プロパティです。直交性により、システムのコンポーネントによって生成される技術的効果を変更しても、システムの他のコンポーネントに副作用が発生したり伝播したりすることはありません。コンポーネントで構成されるシステムの緊急時の動作は、不十分な統合、つまりモジュールとインターフェイスの非直交設計に起因する副作用ではなく、その論理の正式な定義によって厳密に制御する必要があります。直交性は、副作用を引き起こさず、それらに依存しない設計を検証しやすいため、テストおよび開発時間を短縮します。
たとえば、自動車には直交するコンポーネントと制御があります(たとえば、車両の加速は、加速機能にのみ関係するコンポーネント以外には影響しません)。一方、非直交設計では、ステアリングがブレーキ(電子安定性制御など)に影響したり、速度がサスペンションを微調整したりする可能性があります。[1]その結果、この使用法は数学の直交の使用から派生しているように見えます:基底ベクトルのセットの各メンバーにベクトルを個別に投影し、基底ベクトルが相互に直交。
命令がアドレス指定モードでレジスタを使用できる場合、命令セットは直交していると言われます。この用語は、命令を、コンポーネントが命令フィールドであるベクトルと見なすことから生じます。 1つのフィールドは操作対象のレジスタを識別し、別のフィールドはアドレッシングモードを指定します。直交命令セットは、レジスタとアドレッシングモードのすべての組み合わせを一意にエンコードします。
可能な限り単純な用語で言えば、一方を変更しても他方に影響がない場合、2つのことは直交しています。
プログラミング言語でのプロジェクトの決定について話している間、直交性は、過去に見たものについてその言語に関する他のことを予測するのがどれほど簡単であるとみなされるかもしれません。
たとえば、1つの言語で次のことができます。
str.split
文字列を分割し、
len(str)
長さを取得するため。
より直交する言語では、常にstr.xまたはx(str)を使用します。
オブジェクトのクローンを作成するか、何か他のことを行う場合、使用するかどうかがわかります。
clone(obj)
または
obj.clone
これは、プログラミング言語が直交していることの主要なポイントの1つです。これにより、マニュアルを参照したり、誰かに尋ねたりする必要がなくなります。
ウィキペディアの記事では、複雑な設計または低レベル言語の直交性について詳しく説明しています。誰かが上記のコメントについて提案したように、セベスタの本は直交性についてはっきりと述べています。
1つの文のみを使用する場合、プログラミング言語は、その未知の部分があなたが見たものに基づいて期待どおりに動作する場合に直交すると言います。または...驚きはありません。
;)
プログラミングの直交性:
直交性は重要な概念であり、比較的少数のコンポーネントを比較的少数の方法で組み合わせて、望ましい結果を得る方法に取り組んでいます。それは単純さに関連しています。設計が直交するほど、例外が少なくなります。これにより、プログラミング言語でのプログラムの学習、読み取り、書き込みが容易になります。直交フィーチャの意味はコンテキストに依存しません。重要なパラメーターは対称性と一貫性です(たとえば、ポインターは直交概念です)。
from ウィキペディア
直交性の基本的な考え方は、概念的に関連していないものをシステム内で関連させるべきではないということです。データベースやUIなど、実際には他とは何の関係もないアーキテクチャの部分は、一緒に変更する必要はありません。一方を変更しても、他方は変更されません。
直交性とは、プログラムを表現するために必要に応じて組み合わせることができる独立したプリミティブ構造のセットで言語が構成される度合いを意味します。組み合わせ方法に制限がない場合、機能は直交します。
Example : non-orthogonality
Pascal:関数は構造化型を返すことができません。関数型言語は高度に直交しています。
プログラミング言語では、プログラミング言語の機能が制限(または例外)なしで制限されている場合、その機能は直交していると言われます。たとえば、Pascalでは、関数は構造化型を返すことができません。これは、関数から値を返す際の制限です。したがって、それは非直交特徴とみなされます。 ;)
高水準言語の直交性の欠如の例として、Cの次の規則と例外を考慮してください。Cには2種類の構造化データ型、配列とレコード(構造)がありますが、関数からレコードを返すことはできますが、配列は返すことができません。構造体のメンバーは、voidまたは同じ型の構造体を除く任意のデータ型にすることができます。配列要素は、voidまたは関数を除く任意のデータ型にすることができます。パラメーターは配列である場合を除き、値で渡されます。配列の場合、実際には参照で渡されます(Cプログラムで添え字のない配列名の出現は、配列の最初の要素のアドレスと解釈されるため)