プログラミング言語について話すとき、「直交性」とはどういう意味ですか?
直交性のいくつかの例は何ですか?
プログラミング言語について話すとき、「直交性」とはどういう意味ですか?
直交性のいくつかの例は何ですか?
回答:
直交性は、「Aを変更してもBを変更しない」という意味の特性です。直交システムの例はラジオであり、ステーションを変更しても音量は変更されず、その逆も同様です。
非直交システムは、速度を変えると方向を変えることができるヘリコプターのようなものです。
プログラミング言語では、これは、命令を実行すると、その命令しか発生しないことを意味します(デバッグには非常に重要です)。
エリックS.レイモンドの「Art of UNIX programming」から
直交性は、複雑な設計でもコンパクトにするのに役立つ最も重要な特性の1つです。完全に直交する設計では、操作に副作用はありません。各アクション(API呼び出し、マクロ呼び出し、または言語操作のいずれか)は、他に影響を与えることなく1つの変更のみを行います。制御しているシステムの各プロパティを変更する方法は1つだけです。
他の部分に目に見えない影響を与えることなく、1つのことを変更できることを考えてください。
構成のセットがある場合。プログラマがこれらの構成要素を自由に混合できるようにする場合、言語は直交していると言われます。たとえば、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)などがあります。すべてを自由に組み合わせることができます。
プログラミング言語に関するプロジェクトの決定について話している間、直交性は、過去に見たものについてその言語について他のことを予測することがどれほど簡単であると見なされるかもしれません。
たとえば、ある言語では次のことが可能です。
str.split
文字列を分割し、
len(str)
長さを得るために。
より直交する言語では、常にstr.xまたはx(str)を使用します。
オブジェクトのクローンを作成するか何かをするとき、あなたは
clone(obj)
または
obj.clone
これは、直交するプログラミング言語の主要なポイントの1つです。これにより、マニュアルを参照したり、誰かに尋ねたりする必要がなくなります。
ウィキペディアの記事では、複雑なデザインや低水準言語の直交性について詳しく説明しています。上記のコメントで誰かが提案したように、セベスタの本は直交性について明確に述べています。
私が1つの文のみを使用する場合、その未知の部分があなたが見たものに基づいて期待どおりに機能するとき、プログラミング言語は直交していると言えます。または...驚きはありません。
;)
ウィキペディアから:
コンピュータサイエンス
直交性は、複雑な設計の実現可能性とコンパクトさを促進するシステム設計プロパティです。直交性は、システムのコンポーネントによって生成された技術的効果を変更しても、システムの他のコンポーネントに副作用が発生したり伝播したりしないことを保証します。コンポーネントで構成されるシステムの緊急時の動作は、論理の正式な定義によって厳密に制御する必要があります。統合が不十分なために生じる副作用、つまりモジュールとインターフェースの非直交設計によって制御する必要はありません。直交性により、副作用を引き起こしたり、依存したりしない設計を検証することが容易になるため、テストと開発の時間が短縮されます。
たとえば、自動車には直交するコンポーネントとコントロールがあります(たとえば、車両の加速は、加速機能にのみ関連するコンポーネント以外には影響しません)。一方、非直交設計では、ステアリングがブレーキ(電子安定性制御など)に影響を与えたり、速度がサスペンションを微調整したりする場合があります。1その結果、この使用法は数学での直交の使用から派生していると考えられます:基底ベクトルのセットの各メンバーに個別に投影し、基底ベクトルの場合に限り投影を追加することにより、ベクトルを部分空間に投影できます相互に直交しています。
任意の命令が任意のアドレッシングモードで任意のレジスタを使用できる場合、命令セットは直交しているといいます。この用語は、命令をその構成要素が命令フィールドであるベクトルと見なすことから生じます。1つのフィールドは操作対象のレジスターを識別し、もう1つのフィールドはアドレッシングモードを指定します。直交命令セットは、レジスタとアドレッシングモードのすべての組み合わせを一意にエンコードします。
ウィキペディアから:
直交性は、複雑な設計の実現可能性とコンパクトさを促進するシステム設計プロパティです。直交性は、システムのコンポーネントによって生成された技術的効果を変更しても、システムの他のコンポーネントに副作用が発生したり伝播したりしないことを保証します。コンポーネントで構成されるシステムの緊急時の動作は、論理の正式な定義によって厳密に制御する必要があります。統合が不十分なために生じる副作用、つまりモジュールとインターフェースの非直交設計によって制御する必要はありません。直交性により、副作用を引き起こしたり、依存したりしない設計を検証することが容易になるため、テストと開発の時間が短縮されます。
たとえば、自動車には直交するコンポーネントとコントロールがあります(たとえば、車両の加速は、加速機能にのみ関連するコンポーネント以外には影響しません)。一方、非直交設計では、ステアリングがブレーキ(電子安定制御など)に影響を与えたり、速度がサスペンションを微調整したりする場合があります[1]。その結果、この使用法は数学での直交の使用から派生していると見なされます。1つは基底ベクトルのセットの各メンバーに個別に投影し、基底ベクトルが相互に直交します。
任意の命令が任意のアドレッシングモードで任意のレジスタを使用できる場合、命令セットは直交しているといいます。この用語は、命令をその構成要素が命令フィールドであるベクトルと見なすことから生じます。1つのフィールドは操作対象のレジスターを識別し、もう1つのフィールドはアドレッシングモードを指定します。直交命令セットは、レジスタとアドレッシングモードのすべての組み合わせを一意にエンコードします。
可能な限り簡単に言えば、一方を変更しても他方に影響がない場合、2つのことが直交します。
プログラミング言語の直交性とは、比較的少数のプリミティブコンストラクトのセットを比較的少数の方法で組み合わせて、言語の制御およびデータ構造を構築できることを意味します。さらに、可能なすべてのプリミティブの組み合わせは合法で意味があります。たとえば、データ型について考えます。言語に4つのプリミティブデータ型(整数、浮動小数点、倍精度浮動小数点数、および文字)と2つの型演算子(配列とポインター)があるとします。2つの型演算子をそれ自体と4つのプリミティブデータ型に適用できる場合、多数のデータ構造を定義できます。直交言語機能の意味は、プログラムでのその出現のコンテキストとは無関係です。(直交という言葉は、互いに独立している直交ベクトルの数学的概念に由来します。)直交性は、プリミティブ間の関係の対称性から生じます。直交性の欠如は、言語の規則の例外につながります。たとえば、ポインターをサポートするプログラミング言語では、その言語で定義されている特定の型を指すポインターを定義できるはずです。ただし、ポインターが配列を指すことが許可されていない場合、多くの潜在的に有用なユーザー定義データ構造を定義できません。IBMのメインフレームコンピュータとVAXシリーズのミニコンピュータのアセンブリ言語の1つの側面を比較することにより、設計概念としての直交性の使用を説明できます。単一の単純な状況を考慮します。メモリまたはレジスタにある2つの32ビット整数値を追加し、2つの値の1つを合計に置き換えます。IBMメインフレームには、この目的のために2つの指示があります。
A Reg1, memory_cell
AR Reg1, Reg2
ここで、Reg1およびReg2はレジスタを表します。これらの意味論は
Reg1 ← contents(Reg1) + contents(memory_cell)
Reg1 ← contents(Reg1) + contents(Reg2)
32ビット整数値のVAX加算命令は次のとおりです。
ADDL operand_1, operand_2
そのセマンティクスは
operand_2 ← contents(operand_1) + contents(operand_2)
この場合、どちらのオペランドもレジスタまたはメモリセルにすることができます。VAX命令の設計は直交しており、1つの命令でレジスタまたはメモリセルをオペランドとして使用できます。オペランドを指定するには2つの方法があり、すべての可能な方法で組み合わせることができます。IBMの設計は直交ではありません。4つのオペランドの組み合わせのうち2つだけが有効であり、2つは異なる命令AおよびARを必要とします。IBMの設計はより制限されているため、書き込みが少なくなっています。たとえば、2つの値を加算して合計をメモリ位置に保存することはできません。さらに、制限と追加の指示があるため、IBMの設計を学ぶのはより困難です。直交性は単純さと密接に関連しています。言語の設計が直交的であるほど、言語ルールで必要な例外は少なくなります。例外が少ないほど、デザインの規則性が高くなり、言語の学習、読み取り、理解が容易になります。英語のかなりの部分を学んだ人なら誰でも、その多くの規則の例外(たとえば、cの後を除いてiの前にe)を学ぶことの難しさを証明することができます。
行列の直交性をチェックします。
直交性は行列に関しても可能です。
Matrix *(transpose of matrix)= identity matrix.
直交性に関するYouTubeビデオを表示するには、以下のリンクをクリックしてください。
https://youtu.be/tNekLaxnfW8