프로그래밍 언어의 직교성을 확인 / 증명하는 방법은 무엇입니까? #에서는 public또는 static메소드 서명을 사용할 수 있습니다

직교성 개념을 알고 있지만 프로그래밍 언어의 관점에서이를 검증 / 증명할 수있는 방법이 있습니까?

예를 들어 C #에서는 public또는 static메소드 서명을 사용할 수 있습니다 . 둘 중 하나 또는 둘 다 사용할 수 있고 서로 간섭하지 않으므로 서로 직교합니까?

내 질문은 나머지 기능, 특히 서로 관련되지 않은 기능에 대해 어떻게 생각합니까?

모든 기능이 함께 공존해야합니까?

100 % 직교 프로그래밍 언어가 있습니까?



답변

직교성이 C #과 같은 범용 고차 언어의 경우 유용하거나 유효한 측정 기준으로 사용될 수 있는지 잘 모르겠습니다. 언어의 작은 부분 인 “연산”과 “피연산자”의 구별이 필요하기 때문입니다. C #과 같은 고급 언어로 구별 할 수 있습니다.

직교성에 대한 나의 이해는 특정 특정 CPU 또는 마이크로 컨트롤러 의 명령어 세트직교성 이 데이터 유형에 따라이 CPU 또는 컨트롤러에 의해 수행되는 동작에 제약이 있는지를 나타내는 어셈블러 언어 에 기초한다. 모든 CPU가 소수 또는 길이가 다른 수의 연산을 지원하는 것은 아니기 때문에 초기에는 이것이 중요했습니다.

이와 관련 하여 C # 자체가 아닌 스택 머신 언어를 C # 컴파일러의 대상으로 사용 하는 공용 중급 언어 의 직교성을 확인하고 싶습니다 .

C #의 직교성에 정말로 관심이 있고 여기서 (오전의 목적으로) 착각하지 않은 경우 유전자 프로그래밍 알고리즘을 찾는 것이 좋습니다 . 그것들을 사용하여 주어진 키워드 세트 (심지어 무의미한 키워드)에서 다른 프로그램을 생성 할 수 있으며 컴파일 가능한지 자동으로 확인할 수 있습니다. 이를 통해 언어의 어떤 요소가 결합 될 수 있는지 자동으로보고 직교성 메트릭의 일부 측면을 도출 할 수 있습니다.


답변

“직교성”이라는 용어는 정확한 수학적 개념에 대한 평신도의 용어입니다. 언어 용어는 초기 대수학을 구성합니다 (Wikipedia에서 찾아보십시오).

기본적으로 “구문과 의미 사이에는 1-1 대응 관계가 있습니다”를 의미합니다. 즉, 사물을 표현하는 방법은 정확히 한 가지가 있으며 특정 장소에 표현을 할 수 있으면 다른 표현도 가능합니다.

“직교”에 대해 생각하는 또 다른 방법은 구문이 대체 원칙을 따르는 것입니다. 예를 들어, 표현식을위한 슬롯이있는 명령문이있는 경우 모든 표현식을 여기에 넣을 수 있으며 결과는 여전히 구문 상 유효한 프로그램입니다. 또한 교체하면

나는 “의미”가 계산 결과를 의미하지 않는다는 것을 강조하고 싶다. 분명히 1 + 2와 2 + 1은 모두 3과 같습니다. 그러나 항은 서로 다르며 결과가 같더라도 다른 계산을 의미합니다. 두 가지 정렬 알고리즘이 다른 것처럼 의미가 다릅니다.

“추상 구문 트리”(AST)에 대해 들어 보셨을 것입니다. 여기서 “추상”이라는 단어는 정확히 “직교”를 의미합니다. 기술적으로 대부분의 AST는 실제로 추상적이지 않습니다!

“C”프로그래밍 언어에 대해 들어 보셨나요? C 타입 표기법은 추상적이지 않습니다. 치다:

int f(int);

여기에 함수 선언 반환 유형이 int있습니다. 이 함수에 대한 포인터의 유형은 다음과 같습니다.

int (*)(int)

함수의 타입은 쓸 수 없습니다! C 타입 표기법은 큰 시간을 빨아! 추상적이지 않습니다. 직교하지 않습니다. 이제 int 대신 위의 타입을 받아들이는 함수를 만들고 싶다고합시다.

int (*) ( int (*)(int) )

다 괜찮아요 ..하지만 .. 우리가 대신 돌려주고 싶다면?

int (*)(int) (*) (int)

웁스! 유효하지 않습니다. Parens를 추가 할 수 있습니다 :

(int (*)(int)) (*) (int)

웁스! 그것은 작동하지 않습니다. 우리는 이것을해야합니다 (유일한 방법입니다!) :

typedef int (intintfunc*) (int);
intintfunc (*)(int)

이제는 괜찮지 만 여기서 typedef를 사용해야하는 것은 좋지 않습니다. C는 짜증나. 추상적이지 않습니다. 직교하지 않습니다. ML에서이를 수행하는 방법은 다음과 같습니다.

 int -> (int -> int)

구문 수준에서 C를 정죄합니다.

자 이제 C ++를 flog 할 수 있습니다. 템플릿으로 위의 어리 석음을 수정하고 ML과 같은 표기법을 얻을 수 있습니다.

fun<int, int>
fun< fun<int,int>, int>

그러나 실제 형식 시스템은 기본적으로 참조에 의해 결함 T이 있습니다. 형식이면 T&형식입니까? 구문 수준에서 U = T & 유형 인 경우 U &가 허용되지만 T & 만 의미합니다. 참조에 대한 참조는 원래 참조입니다. 짜증나! 고유성 요구 사항을 의미 적으로 위반합니다. 더 나쁘다 : T & &는 구문 상 허용되지 않는다 : 이것은 대체 원칙을 어긴 다. 따라서 C ++ 참조는 바인딩 시간 (구문 분석 또는 유형 분석)에 따라 두 가지 방식으로 직교성을 위반합니다. 이 작업을 올바르게 수행하는 방법을 이해하려면 포인터에 문제가 없습니다!

실제 언어는 거의 직교하지 않습니다. 표현의 명료 함을 가장하는 Scheme조차도 그렇지 않습니다. 그러나 많은 훌륭한 언어는 “합리적으로 직교 특징 기반에 가깝다”고 판단 될 수 있으며 이는 구문과 기본 의미에 모두 적용되는 언어에 대한 권장 사항입니다.


답변

직교성을 입증하는 것은 부정적인 것을 증명합니다. 직교가 아닌 구조가 없다는 것을 의미합니다. 즉, 무언가 직교 가 아닌 것을 증명하는 것이 훨씬 쉽습니다 .

실제로, 대부분의 사람들은 프로그래밍 언어의 직교성에 대해 완전히 직교하는 것이 아닌 학위 단위로 이야기합니다. 한 문맥에서 무언가를하는 것에 대한 지식이 다른 문맥으로 번역되고 “당신이 기대하는 것을 행할 때”, 그 언어는 더 직교하다고합니다. LISP는 모든 것이 목록 이기 때문에 고도로 직교하는 것으로 간주 되지만 사용하기 쉽도록 중복성이 있기 때문에 100 % 직교라고 말할 수는 없습니다. C ++은 생각했던 방식대로 작동하지 않는 작은 “gotchas”가 많기 때문에 매우 직교하지 않은 것으로 간주됩니다.


답변

경고, 나는이 주제에 대해 아무것도 모른다.

Wikipedia를 간략히 살펴보면 직교성이 대부분 디자인 패턴 및 시스템 디자인에 관한 것임을 알 수 있습니다. 프로그래밍 언어와 관련하여 항목은 가능한 각 동작에 대해 하나의 명령 만 있거나 명령이 다른 명령과 겹치지 않으면 명령 세트가 직교 함을 나타냅니다.

C #의 경우 대부분의 구문 트릭 ( foreach기억이 떠오름)이 특수하게 구성된 기본 구문 버전의 프런트 엔드 ( 루프 foreach가 됨 )라는 점에서 직교라고 생각합니다 for. 구문 설탕은 추가 방법을 제공하지만 전반적으로 언어는 단일 방식으로 만 작업을 지원합니다. 그리고 마지막으로, 그것은 모두 MSIL(또는 요즘 부르는 것)으로 컴파일 되고 MSIL직교 가능성이 높습니다.

문법적인 설탕 재료가 본질적으로 “딱딱한”방법으로 “래퍼”라는 경고에주의를 기울이면 언어의 다양한 기능을 분석하고 설탕을 생략하고 실제로 중첩되는 구성이 있는지 확인할 수 있습니다. 그렇지 않다면 언어를 직교로 선언 할 수 있다고 생각합니다.

내 두 센트


답변

내 질문은 나머지 기능, 특히 서로 관련되지 않은 기능에 대해 어떻게 생각합니까?

계속하고있는 일을 계속하면서 효과가 있거나 금지 된 모든 조합을 열거합니다.

그게 다야. 너무 아파요.

모든 기능이 함께 공존해야합니까?

경우 모든 기능이 서로 간섭하지 않는 분리 된 부분 집합으로 분할 할 수 있습니다, 다음 있는지, 모든 분별있는 것입니다.

모든 데이터 구조는 모든 기본 유형과 작동합니다. 모든 표현식 연산자는 모든 유형으로 작동합니다. 그것들은 직교성의 일반적인 정의입니다. 그러나 더 많이 (또는 더 적게) 원할 수 있습니다

그러나 때로는 직교하지 않은 운영 체제 또는 레거시 라이브러리로 인해 특별한 경우가 있습니다.

또한 일부 유형은 실제로 매우 적합하지 않습니다. 예를 들어 Python을 사용하면 “순서”에 대한 두 개의 사전 객체를 비교할 수 있습니다. 그러나 사전 사이에 “순서”에 대한 합리적인 정의는 거의 없습니다. 파이썬은 하나를 정의하지만 논쟁의 여지가 있습니다. 이 특별한 경우로 인해 사전이 직교성 테스트에 실패합니까?

“직교 적으로”직교하는 방법은? 언어의 직교성에 만족하기 위해 무엇 을보아야 합니까 ?


답변

직교 특징의 목록은 실제로 대부분의 프로그래밍 언어에서 길다.

  • 익명 클래스가 Java 리플렉션과 충돌
  • Java 리플렉션과의 일반 및 유형 삭제 충돌
  • 배열은 객체이지만 특수 유형으로 인해 다른 객체와 다소 다릅니다.
  • 정적 메소드와 인스턴스 메소드가 동일하지 않습니다. 예를 들어 정적 메소드를 재정의 할 수 없습니다
  • 중첩 된 클래스는 생각 후
  • 메시지 디스패치 전략에 대한 동적 대 정적 입력의 영향 (예 : C # 의이 경우 참조 )
  • 기타

내 마음에 오는 몇 가지가 있지만 다른 언어도 있고 다른 언어도 있습니다.

언어 기능간에 미묘한 간섭이 없는지 확인하기가 어렵습니다. CAR Hoare가 그의 논문에서 “프로그래밍 언어 디자인에 대한 힌트”를 지적한 것처럼 :

언어 디자인의 일부는 혁신으로 구성됩니다. 이 활동은 새로운 언어 기능을 제공합니다. 언어 디자인의 가장 어려운 부분은 통합에 있습니다 . 제한된 언어 기능 세트를 선택하고 결과가 더 이상 거친 가장자리가없는 일관된 간단한 프레임 워크가 될 때까지이를 연마합니다.

아마도 직교성을 높이기위한 좋은 조치는 개념을 통일하는 것입니다 (@ karl-bielfeld 답변의 방향으로 진행). 모든 것이 목록이나 물건이라면, 갈등이 줄어 듭니다. 또는 애프터 클래스를 중첩시키지 않고 핵심 기능으로 만듭니다.

대부분의 프로그래밍 언어 용지는 공식화 된 언어의 하위 집합 ( “핵심”)에서 언어의 특정 속성 (예 : 유형 사운드)을 증명합니다. 여기서 우리는 반대로해야합니다. 모든 기능이 안전하게 구성되어 있음을 증명하십시오. 또한 이는 “구성”의 의미를 정의해야 함을 의미합니다. “달린다”는 뜻입니까? (이 경우 동적 및 정적 타이핑이있는 엣지 케이스에 대한 위의 링크가 안전합니다). “안전하다”는 뜻입니까? 개발자의 관점에서 예측 가능하다는 의미입니까?

이 모든 것은 매우 흥미롭지 만 매우 도전적입니다.


답변