153

プログラミング言語について話すとき、「直交性」とはどういう意味ですか?

直交性の例は何ですか?

4

17 に答える 17

284

直交性とは「Aを変えてもBは変わらない」という性質です。直交システムの例はラジオで、局を変更しても音量は変わらず、その逆も同様です。

非直交システムは、速度を変えると方向が変わるヘリコプターのようなものです。

プログラミング言語では、これは、命令を実行すると、その命令以外は何も起こらないことを意味します (デバッグにとって非常に重要です)。

命令セットを参照する場合にも、特定の意味があります。

于 2009-10-06T19:01:54.067 に答える
41

Eric S. Raymond の「UNIX プログラミングの芸術」より

直交性は、複雑な設計をコンパクトにするのに役立つ最も重要な特性の 1 つです。純粋な直交設計では、操作に副作用はありません。各アクション (API 呼び出し、マクロ呼び出し、または言語操作のいずれであっても) は、他に影響を与えることなく 1 つのことだけを変更します。制御しているシステムの各プロパティを変更する方法は 1 つだけです。

于 2009-10-06T19:01:46.233 に答える
20

別の部分に目に見えない影響を与えることなく、1 つのことを変更できると考えてください。

于 2009-10-06T19:02:23.127 に答える
13

大まかに言って、直交性とは、相互に最小限の影響しか及ぼさないような2つのものの間の関係です。

この用語は数学に由来し、2つのベクトルが直角に交差する場合は直交します。

典型的な2次元デカルト空間(X / Y軸を持つ典型的なグリッド)について考えてみてください。x=1とy=1の2本の線をプロットします。2本の線は直交しています。xを変更することでx=1を変更できます。これは他の行には影響せず、その逆も同様です。

ソフトウェアでは、この用語は、互いに独立して動作するシステムの2つの部分について話している状況で適切に使用できます。

于 2009-10-06T19:05:40.660 に答える
12

コンストラクトのセットがある場合。プログラマーがこれらの構造を自由に組み合わせることができる場合、その言語は直交していると言われます。たとえば、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.
于 2009-10-06T19:03:49.457 に答える
5

答えのほとんどは非常に長い間、そしてあいまいですらあります。重要なのは、ツールが直交している場合、他のすべてを台無しにすることなく、より優れたツールを優先して、追加、交換、または削除できるということです。

これは、ハンマーとのこぎりを持っている大工の違いです。これは、ハンマーやのこぎりに使用できます。または、木材を鋸で挽いてから一緒にハンマーで叩くように設計された、新しいハンマー/のこぎりの組み合わせを持っています。どちらも鋸引きとその後のハンマーで機能しますが、鋸引きを必要とするがハンマーではないタスクを取得した場合は、直交ツールのみが機能します。同様に、ハンマーの代わりにネジを締める必要がある場合、ハンマーが直交している(混同されていない)場合は、のこぎりを捨てる必要はありません。

典型的な例はunixコマンドラインツールです。ディスクの内容を取得するためのツール(dd)、ファイルから行をフィルタリングするためのツール(grep)、それらの行をファイルに書き込むためのツール(cat)などがあります。すべてを自由に組み合わせて組み合わせることができます。

于 2009-10-06T22:18:30.913 に答える
3

プログラミング言語に関するプロジェクトの決定について話している間、直交性は、過去に見たものに対してその言語に関する他のことを予測するのがいかに簡単であるかと見なされる場合があります。

たとえば、ある言語では次のことができます。

str.split

文字列を分割するため

長さ(文字列)

長さを取得するため。

より直交する言語では、常に str.x または x(str) を使用します。

オブジェクトのクローンを作成するとき、または何か他のことを行うときに、使用するかどうかがわかります。

クローン(obj)

また

obj.クローン

これは、プログラミング言語が直交していることに関する主なポイントの 1 つです。これにより、マニュアルを参照したり、誰かに尋ねたりする必要がなくなります。

ウィキペディアの記事では、複雑な設計または低レベル言語での直交性について詳しく説明しています。上記のコメントで誰かが示唆したように、セベスタの本は直交性について明確に語っています。

1 つの文だけを使用する場合、プログラミング言語は、未知の部分が、これまでに見たものに基づいて期待どおりに動作する場合、直交していると言えます。または... 驚きはありません。

;)

于 2009-10-06T19:22:52.573 に答える
1

ウィキペディアから:

直交性は、複雑な設計の実現可能性とコンパクトさを促進するシステム設計プロパティです。直交性は、システムのコンポーネントによって生成された技術的効果を変更しても、システムの他のコンポーネントに副作用が発生したり伝播したりしないことを保証します。コンポーネントで構成されるシステムの緊急動作は、その論理の正式な定義によって厳密に制御されるべきであり、統合の悪さ、つまりモジュールとインターフェースの非直交設計から生じる副作用によってではありません。直交性は、副作用を引き起こさず、副作用に依存しない設計を簡単に検証できるため、テストと開発の時間を短縮します。

たとえば、車には直交するコンポーネントとコントロールがあります (たとえば、車両の加速は、加速機能にのみ関連するコンポーネント以外には影響しません)。一方、非直交設計では、ステアリングがブレーキに影響を与えたり (電子安定性制御など)、速度がサスペンションに影響を与えたりする可能性があります [1]。したがって、この用法は数学における直交の使用から派生したものと見なされます。ベクトルを基底ベクトルのセットの各メンバーに個別に射影し、基底ベクトルが相互に直交。

命令セットは、命令が任意のアドレッシング モードで任意のレジスタを使用できる場合、直交していると言われます。この用語は、命令を、その構成要素が命令フィールドであるベクトルと見なしたことに由来します。1 つのフィールドは操作対象のレジスタを識別し、もう 1 つのフィールドはアドレッシング モードを指定します。直交命令セットは、レジスタとアドレッシング モードのすべての組み合わせを一意にエンコードします。

可能な限り簡単に言えば、一方を変更しても他方に影響がない場合、2 つのことは直交しています。

于 2009-10-06T19:03:02.850 に答える
1

直交性とは、言語が、プログラムを表現するために必要に応じて組み合わせることができる一連の独立したプリミティブ構成要素で構成されている度合いを意味します。結合方法に制限がない場合、機能は直交しています

Example : non-orthogonality

PASCAL: 関数は構造化された型を返すことができません。関数型言語は高度に直交しています。

于 2015-12-09T14:13:33.783 に答える
1

ウィキペディアから:

コンピュータサイエンス

直交性は、複雑な設計の実現可能性とコンパクトさを促進するシステム設計プロパティです。直交性は、システムのコンポーネントによって生成された技術的効果を変更しても、システムの他のコンポーネントに副作用が発生したり伝播したりしないことを保証します。コンポーネントで構成されるシステムの緊急動作は、そのロジックの正式な定義によって厳密に制御する必要があります。統合の失敗、つまりモジュールとインターフェイスの非直交設計による副作用ではありません。直交性は、副作用を引き起こさず、副作用に依存しない設計を検証しやすいため、テストと開発の時間を短縮します。

たとえば、車には直交するコンポーネントとコントロールがあります (たとえば、車両の加速は、加速機能のみに関連するコンポーネント以外には影響しません)。一方、非直交設計では、ステアリングがブレーキ (たとえば、電子安定性制御) に影響を与えたり、速度がサスペンションに微調整されたりする可能性があります。1したがって、この用法は数学における直交の使用から派生したものと見なされます。ベクトルを基底ベクトルのセットの各メンバーに個別に射影し、基底ベクトルが相互に直交しています。

命令セットは、命令が任意のアドレッシング モードで任意のレジスタを使用できる場合、直交していると言われます。この用語は、命令を、その構成要素が命令フィールドであるベクトルと見なしたことに由来します。1 つのフィールドは操作対象のレジスタを識別し、もう 1 つのフィールドはアドレッシング モードを指定します。直交命令セットは、レジスタとアドレッシング モードのすべての組み合わせを一意にエンコードします。

于 2009-10-06T19:01:11.853 に答える
0

プログラミングにおける直交性:

直交性は重要な概念であり、比較的少数のコンポーネントを比較的少数の方法で組み合わせて目的の結果を得る方法に対処します。シンプルさと関連しています。設計の直交性が高いほど、例外は少なくなります。これにより、プログラミング言語でのプログラムの学習、読み書きが容易になります。直交機能の意味は、文脈とは無関係です。重要なパラメーターは対称性と一貫性です (たとえば、ポインターは直交概念です)。

ウィキペディアより

于 2014-01-18T12:28:21.967 に答える
0

プログラミング言語の直交性とは、比較的少数のプリミティブ構造のセットを比較的少数の方法で組み合わせて、言語の制御構造とデータ構造を構築できることを意味します。さらに、プリミティブのすべての可能な組み合わせは合法的で意味があります。たとえば、データ型を考えてみましょう。言語に 4 つのプリミティブ データ型 (integer、float、double、および character) と 2 つの型演算子 (配列とポインター) があるとします。2 つの型演算子をそれ自体と 4 つのプリミティブ データ型に適用できれば、多数のデータ構造を定義できます。直交言語機能の意味は、プログラムでの出現のコンテキストとは無関係です。(直交という言葉は、互いに独立している直交ベクトルの数学的概念に由来します。) 直交性は、プリミティブ間の関係の対称性から生じます。直交性の欠如は、言語の規則に対する例外につながります。たとえば、ポインターをサポートするプログラミング言語では、言語で定義された特定の型を指すポインターを定義できる必要があります。ただし、ポインターが配列を指すことが許可されていない場合、潜在的に有用なユーザー定義データ構造の多くを定義できません。IBM メインフレーム コンピュータと VAX シリーズのミニコンピュータのアセンブリ言語の 1 つの側面を比較することにより、設計概念としての直交性の使用を説明できます。1 つの単純な状況を考えます。メモリまたはレジスタに存在する 2 つの 32 ビット整数値を加算し、2 つの値のいずれかを合計で置き換えます。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 の後を除いて e の前の i) を学ぶことの難しさを証明することができます。

于 2015-08-15T22:17:52.530 に答える