"직교성"이란 무엇입니까?


답변:


255

직교성 은 "A를 변경해도 B는 변경되지 않습니다"를 의미하는 속성입니다. 직교 시스템의 예로는 라디오가 있는데, 방송국을 변경해도 볼륨이 변경되지 않고 그 반대의 경우도 마찬가지입니다.

비 직교 시스템은 속도를 변경하면 방향이 바뀔 수있는 헬리콥터와 같습니다.

프로그래밍 언어에서 이것은 명령어를 실행할 때 해당 명령어 만 발생한다는 것을 의미합니다 (디버깅에 매우 중요 함).

명령어 세트를 참조 할 때도 특정 의미가 있습니다 .


이 대답은 신호와 시스템의 "중첩"이론을 상기시킵니다.
Özgür

1
이 단어의 다양한 용법에 대한 매우 명확한 설명 : c2.com/cgi/wiki?DefinitionOfOrthogonal
로렌조 솔라노

그렇다면 함수형 프로그래밍은 완전히 직교할까요?
corazza 2013-10-11

@yannbane은 흥미로운 질문입니다. 이론적으로는 이론적 기능적 언어에 따라 사실 일 수 있습니다. 실제로는 기능 언어조차도 상태를 변경할 수있는 방법이 있습니다.
C. Ross

1
헬리콥터 예제는 "Pragmatic Programmer"에서 가져온 것입니다. :)
스리 칸스 Karumanaghat

36

Eric S. Raymond의 "Art of UNIX programming"에서

직교성은 복잡한 설계도 간결하게 만드는 데 도움이되는 가장 중요한 속성 중 하나입니다. 순전히 직교 디자인에서는 작업에 부작용이 없습니다. 각 작업 (API 호출, 매크로 호출 또는 언어 작업)은 다른 작업에 영향을주지 않고 한 가지만 변경합니다. 제어하는 시스템의 각 속성을 변경하는 방법은 단 하나뿐입니다.


16

다른 부분에 눈에 띄지 않는 영향을주지 않고 한 가지를 변경할 수 있다고 생각하십시오.


12

일련의 구성이있는 경우. langauge는 프로그래머가 이러한 구성을 자유롭게 혼합 할 수 있도록 허용하는 경우 직교 라고합니다 . 예를 들어 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.

사실 나는 이것을 내 책에서 보았지만 여전히 그것이 무엇인지 이해하지 못합니다.
AhmetB-Google 2010 년

LOL 저는이 책을 사용하고 있으며 책의 온라인 퀴즈에서이 질문을 보았습니다. 이런 우연이. 나도 1 장을 읽어야 할 것 같다.
AhmetB-Google 2010 년

2
단순히 리턴과 배열이 합쳐질 때 더 복잡하다는 말입니다. 배열 사이의 상호 작용에 대해 생각하지 않고는 배열 주위에 리턴을 사용할 수 없습니다. 이상적으로는 반환의 의미와 배열이 무엇인지 알고 배열을 반환하는 것이 무엇을하는지 알 수 있지만 실제로는 C가 배열 (및 반환)에 대한 구현 세부 정보를 노출하기 때문에 그보다 더 복잡합니다.
Lee B

이러한 "직교"의 의미는 en.wikipedia.org/wiki/Orthogonality_(programming)에 의해 다루어 지지만 내용이 거의없는 새 페이지입니다.
outis

1
이것은 프로그래밍 맥락에서 직교성에 대한 "더 정확한"대답입니다. "직교성"은 프로그래밍 구조가 다른 구조와 혼합 될 수 있으며 그 의미는 여전히 동일하게 유지됨을 의미합니다.
treecoder

11

대체로 직교성은 서로에 최소한의 영향을 미치는 두 가지 간의 관계입니다.

이 용어는 수학에서 비롯됩니다. 여기서 두 벡터는 직각으로 교차하면 직교합니다.

일반적인 2 차원 데카르트 공간 (X / Y 축이있는 일반적인 그리드)을 생각해보십시오. x = 1 및 y = 1의 두 선을 플로팅합니다. 두 선은 직교합니다. x를 변경하여 x = 1을 변경할 수 있으며 이는 다른 행에 영향을 미치지 않으며 그 반대의 경우도 마찬가지입니다.

소프트웨어에서이 용어는 서로 독립적으로 작동하는 시스템의 두 부분에 대해 말하는 상황에서 적절하게 사용될 수 있습니다.


5

대부분의 답변은 매우 길고 모호합니다. 요점은 도구가 직각이면 다른 모든 것을 조이지 않고도 더 나은 도구를 위해 추가, 교체 또는 제거 할 수 있다는 것입니다.

망치와 톱질에 사용할 수있는 망치와 톱을 사용하는 목수, 또는 나무를 톱질 한 다음 함께 망치로 만드는 새로운 망치 / 톱 콤보를 가진 목수의 차이점입니다. 톱질과 망치질은 모두 작동하지만, 톱질이 필요하지만 망치질이 아닌 작업을 수행하면 직교 도구 만 작동합니다. 마찬가지로 망치로 치는 대신 나사를 조여야하는 경우 톱이 직각 (혼합되지 않음)이면 망치를 버릴 필요가 없습니다.

고전적인 예는 유닉스 명령 줄 도구입니다. 디스크의 내용을 가져 오는 도구 (dd), 파일에서 줄을 필터링하는 도구 (grep), 해당 줄을 파일 (cat)에 쓰는 도구 등이 있습니다. 마음대로 혼합하고 일치시킬 수 있습니다.


2

프로그래밍 언어에 대한 프로젝트 결정에 대해 이야기하는 동안 직교성은 과거에 본 것에 대해 해당 언어에 대한 다른 것을 예측하는 것이 얼마나 쉬운 지로 보일 수 있습니다.

예를 들어, 하나의 언어로 다음을 가질 수 있습니다.

str.split

문자열을 분할하고

len (str)

길이를 얻기 위해.

더 직교하는 언어에서는 항상 str.x 또는 x (str)를 사용합니다.

개체를 복제하거나 다른 작업을 수행 할 때

클론 (obj)

또는

obj.clone

이것이 프로그래밍 언어가 직교하는 주요 요점 중 하나입니다. 그러면 매뉴얼을 참조하거나 다른 사람에게 물어볼 필요가 없습니다.

위키피디아 기사는 복잡한 디자인이나 저수준 언어의 직교성에 대해 더 많이 설명합니다. 누군가가 의견에 대해 위에서 제안했듯이 Sebesta 책은 직교성에 대해 명확하게 이야기합니다.

내가 한 문장 만 사용한다면, 프로그래밍 언어는 당신이 본 것에 따라 알 수없는 부분이 예상대로 작동 할 때 직교라고 말할 것입니다. 아니면 ... 놀라지 마세요.

;)


이 답변은 다른 사람과 일치하지 않습니다. 이것은 "less-coupling"또는 "side-effectlessness"라인에있는 다른 것들과는 대조적으로 함수 호출 또는 전체 구조 간의 일관성을 주장합니다.
Özgür

이것은 내가 일반적으로 들었던 사용법입니다. 직교하는 이유는 X.ToString과 X.GetType이 있으면 객체를 변경하고 구문이 동일하거나 함수를 변경할 수 있고 구문이 동일하기 때문이라고 생각합니다. 개체는 기능과 무관합니다.
dwidel

1

에서 위키 피 디아 :

컴퓨터 과학

직교성은 복잡한 설계의 실현 가능성과 간결성을 촉진하는 시스템 설계 속성입니다. 직교성은 시스템의 구성 요소에 의해 생성 된 기술적 효과를 수정해도 부작용이 생성되거나 시스템의 다른 구성 요소에 전파되지 않음을 보장합니다. 구성 요소로 구성된 시스템의 발생하는 동작은 모듈과 인터페이스의 비 직교 설계와 같은 부적절한 통합으로 인한 부작용이 아니라 논리의 공식 정의에 의해 엄격하게 제어되어야합니다. 직교성은 부작용을 일으키거나 의존하지 않는 설계를보다 쉽게 ​​확인할 수 있기 때문에 테스트 및 개발 시간을 줄여줍니다.

예를 들어, 자동차에는 직교 구성 요소와 제어 장치가 있습니다 (예 : 차량 가속은 가속 기능에만 관련된 구성 요소 외에는 영향을주지 않음). 반면에 직각이 아닌 디자인은 제동에 영향을 미치거나 (예 : 전자식 안정성 제어) 속도가 서스펜션에 영향을 미칠 수 있습니다. 1 결과적으로,이 사용법은 수학에서 직교를 사용하여 파생 된 것으로 보입니다. 서로 직교합니다.

어떤 명령어가 모든 주소 지정 모드에서 레지스터를 사용할 수있는 경우 명령어 세트는 직교라고합니다. 이 용어는 명령어를 구성 요소가 명령어 필드 인 벡터로 간주 한 결과입니다. 한 필드는 작동 할 레지스터를 식별하고 다른 필드는 주소 지정 모드를 지정합니다. 직교 명령어 세트는 레지스터 및 주소 지정 모드의 모든 조합을 고유하게 인코딩합니다.


아, 방금이 스텁을 방문했습니다 . en.wikipedia.org/wiki/Orthogonality_%28programming%29 죄송합니다.
AhmetB-Google 2010 년

1

에서 위키 백과 :

직교성은 복잡한 설계의 실현 가능성과 간결성을 촉진하는 시스템 설계 속성입니다. 직교성은 시스템의 구성 요소에 의해 생성 된 기술적 효과를 수정해도 부작용이 생성되거나 시스템의 다른 구성 요소에 전파되지 않음을 보장합니다. 구성 요소로 구성된 시스템의 발생하는 동작은 모듈과 인터페이스의 비 직교 설계와 같은 부적절한 통합으로 인한 부작용이 아니라 논리의 공식 정의에 의해 엄격하게 제어되어야합니다. 직교성은 부작용을 일으키거나 의존하지 않는 설계를보다 쉽게 ​​확인할 수 있기 때문에 테스트 및 개발 시간을 줄여줍니다.

예를 들어, 자동차에는 직교 구성 요소와 제어 장치가 있습니다 (예 : 차량 가속은 가속 기능에만 관련된 구성 요소 외에는 영향을주지 않음). 반면에 직각이 아닌 디자인은 제동에 영향을 미치거나 (예 : 전자식 안정성 제어) 속도가 서스펜션에 영향을 미칠 수 있습니다. [1] 결과적으로,이 사용법은 수학에서 직교의 사용에서 파생 된 것으로 보입니다. 벡터를 기본 벡터 세트의 각 구성원에 개별적으로 투영하고 기본 벡터가 다음과 같은 경우에만 투영을 추가하여 부분 공간에 벡터를 투영 할 수 있습니다. 상호 직교.

어떤 명령어가 모든 주소 지정 모드에서 레지스터를 사용할 수있는 경우 명령어 세트는 직교라고합니다. 이 용어는 명령어를 구성 요소가 명령어 필드 인 벡터로 간주 한 결과입니다. 한 필드는 작동 할 레지스터를 식별하고 다른 필드는 주소 지정 모드를 지정합니다. 직교 명령어 세트는 레지스터 및 주소 지정 모드의 모든 조합을 고유하게 인코딩합니다.

가능한 가장 간단한 용어로 말하자면, 하나를 변경해도 다른 것에 영향을 미치지 않으면 두 가지가 직교합니다.


1

고급 언어에서 직교성이 부족한 예로서 C에서 다음 규칙과 예외를 고려하십시오. C에는 두 종류의 구조화 된 데이터 유형 인 배열과 레코드 (구조체)가 있지만 레코드는 함수에서 반환 될 수 있지만 배열은 반환 할 수 없습니다. 구조의 멤버는 void 또는 동일한 유형의 구조를 제외한 모든 데이터 유형이 될 수 있습니다. 배열 요소는 void 또는 함수를 제외한 모든 데이터 유형이 될 수 있습니다. 매개 변수는 배열이 아닌 경우 값으로 전달됩니다.이 경우 실제로는 참조로 전달됩니다 (C 프로그램에서 아래 첨자가없는 배열 이름의 모양은 배열의 첫 번째 요소의 주소로 해석되기 때문입니다).


0

프로그래밍 언어에서 프로그래밍 언어 기능은 제한 (또는 예외)없이 제한되는 경우 직교라고합니다. 예를 들어 파스칼에서 함수는 구조화 된 유형을 반환 할 수 없습니다. 이것은 함수에서 값을 반환하는 데 대한 제한입니다. 따라서 우리는 비 직교 기능으로 간주됩니다. ;)


0

프로그래밍의 직교성 :

직교성은 원하는 결과를 얻기 위해 상대적으로 적은 수의 구성 요소를 비교적 적은 수의 방법으로 결합하는 방법을 다루는 중요한 개념입니다. 단순함과 관련이 있습니다. 디자인이 직교할수록 예외는 적습니다. 이를 통해 프로그래밍 언어로 프로그램을 배우고, 읽고, 작성하기가 더 쉬워집니다. 직교 기능의 의미는 컨텍스트와 무관합니다. 주요 매개 변수는 대칭과 일관성입니다 (예 : 포인터는 직교 개념 임).

에서 위키 백과


0

프로그래밍 언어의 직교성은 상대적으로 적은 수의 기본 구조 집합을 비교적 적은 수의 방법으로 결합하여 언어의 제어 및 데이터 구조를 구축 할 수 있음을 의미합니다. 게다가 가능한 모든 프리미티브 조합은 합법적이고 의미가 있습니다. 예를 들어 데이터 유형을 고려하십시오. 언어에 4 개의 기본 데이터 유형 (정수, 부동, 이중 및 문자)과 2 개의 유형 연산자 (배열 및 포인터)가 있다고 가정하십시오. 두 가지 유형 연산자를 자신과 네 가지 기본 데이터 유형에 적용 할 수 있으면 많은 데이터 구조를 정의 할 수 있습니다. 직교 언어 기능의 의미는 프로그램에서 나타나는 컨텍스트와 무관합니다. (직교라는 단어는 서로 독립적 인 직교 벡터의 수학적 개념에서 비롯됩니다. ) 직교성은 주요 요소들 간의 관계의 대칭성에서 비롯됩니다. 직교성이 부족하면 언어 규칙에 대한 예외가 발생합니다. 예를 들어, 포인터를 지원하는 프로그래밍 언어에서는 언어에 정의 된 특정 유형을 가리키는 포인터를 정의 할 수 있어야합니다. 그러나 포인터가 배열을 가리 키도록 허용되지 않으면 잠재적으로 유용한 많은 사용자 정의 데이터 구조를 정의 할 수 없습니다. IBM 메인 프레임 컴퓨터와 VAX 시리즈 미니 컴퓨터의 어셈블리 언어의 한 측면을 비교하여 설계 개념으로 직교성의 사용을 설명 할 수 있습니다. 하나의 간단한 상황을 고려합니다. 메모리 나 레지스터에있는 두 개의 32 비트 정수 값을 추가하고 두 값 중 하나를 합계로 바꿉니다. IBM 메인 프레임에는이를위한 두 가지 지침이 있습니다.

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 명령어 설계는 단일 명령어가 레지스터 또는 메모리 셀을 피연산자로 사용할 수 있다는 점에서 직교합니다. 가능한 모든 방법으로 결합 할 수있는 피연산자를 지정하는 두 가지 방법이 있습니다. IBM 디자인은 직교하지 않습니다. 4 개의 피연산자 조합 중 2 개만 합법적이며 2 개는 서로 다른 명령어 A 및 AR이 필요합니다. IBM 디자인은 더 제한적이므로 쓰기가 어렵습니다. 예를 들어, 두 개의 값을 더하고 합계를 메모리 위치에 저장할 수 없습니다. 또한 제한 사항과 추가 지침으로 인해 IBM 디자인을 배우기가 더 어렵습니다. 직교성은 단순성과 밀접한 관련이 있습니다. 언어 설계가 직교할수록 언어 규칙에 필요한 예외가 적습니다. 예외가 적을수록 디자인의 규칙 성이 높아져 언어를 배우고, 읽고, 이해하기가 더 쉬워집니다. 영어의 중요한 부분을 배운 사람은 누구나 많은 규칙 예외를 배우는 것이 어렵다는 것을 증언 할 수 있습니다 (예를 들어, c 이후를 제외하고 e 이전에 i).


0

직교성은 언어가 프로그램을 표현하기 위해 필요에 따라 결합 될 수있는 독립적 인 기본 구조 세트로 구성되는 정도를 의미합니다. 결합 방법에 제한이없는 경우 기능은 직각입니다.

Example : non-orthogonality

PASCAL : 함수는 구조화 된 유형을 반환 할 수 없습니다. 기능적 언어는 매우 직교합니다.


0

직교성의 기본 개념은 개념적으로 관련되지 않은 것은 시스템에서 관련되어서는 안된다는 것입니다. 데이터베이스 및 UI와 같이 실제로 다른 것과 관련이없는 아키텍처 부분은 함께 변경할 필요가 없습니다. 하나를 변경해도 다른 하나가 변경되어서는 안됩니다.


-5

행렬의 직교성 확인 :

직교성은 매트릭스와 관련 될 수도 있습니다.

Matrix *(transpose of matrix)= identity matrix. 

직교성에 대한 YouTube 비디오를 보려면 아래 링크를 클릭하십시오.
https://youtu.be/tNekLaxnfW8


질문은 분명히 프로그래밍에 관한 것입니다.
aggsol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.