먼저, 여기서는 "C"만 언급하지만 C ++에도 동일하게 적용됩니다.
Godel을 언급 한 의견은 부분적으로 (그러나 부분적으로 만) 적절했습니다.
당신이 그것을 내려 할 때, C 표준에 정의되지 않은 동작입니다 주로 단지 표준 시도가 정의하는 것 사이의 경계를 지적하고, 무엇을하지 않습니다.
고델의 정리 (2 개가 있음)는 기본적으로 완전하고 일관된 것으로 입증 될 수있는 수학 시스템을 정의하는 것은 불가능하다고 기본적으로 말합니다. 규칙을 완성 할 수 있도록 (그가 다루는 경우는 자연수에 대한 "일반적인"규칙), 그렇지 않으면 일관성을 증명할 수는 있지만 둘 다 가질 수는 없습니다.
C와 같은 경우에는 직접 적용되지 않습니다. 대부분의 경우 시스템의 완전성 또는 일관성에 대한 "확장 성"은 대부분의 언어 설계자에게 우선 순위가 아닙니다. 동시에 그렇습니다. 아마도 "완벽한"시스템을 정의하는 것이 불가능하다는 것을 알면서도 (적어도 어느 정도) 영향을 받았을 것입니다. 그러한 일이 불가능하다는 것을 알면 뒤로 물러서서 조금 숨을 쉬고 그들이 정의하려는 대상의 경계를 결정하기가 조금 쉬워 졌을 수 있습니다.
오만 혐의로 기소 될 위험이 있지만, 나는 C 표준이 두 가지 기본 아이디어에 의해 지배되는 것으로 특징 지었다.
- 이 언어는 가능한 한 다양한 하드웨어를 지원해야합니다 (이상적으로는 모든 "정상적인"하드웨어를 합리적인 하한값으로 낮추십시오).
- 언어는 주어진 환경에 대해 가능한 한 다양한 소프트웨어 작성을 지원해야합니다.
첫 번째는 누군가가 새로운 CPU를 정의하는 경우 디자인이 최소한 몇 가지 간단한 지침에 가깝게 떨어지지 않는 한 C를 훌륭하고 견고하며 사용할 수 있도록 구현하는 것이 가능해야한다는 것을 의미합니다. Von Neumann 모델의 일반적인 순서를 따르고 C 구현을 허용하기에 충분한 최소한의 메모리를 제공합니다. "호스트 된"구현 (OS에서 실행되는 구현)의 경우 파일과 합리적으로 일치하는 특정 개념을 지원해야하며 특정 최소 문자 집합 (91이 필요함)을 갖는 문자 집합이 있어야합니다.
두 번째는 하드웨어를 직접 조작하는 코드를 작성하는 것이 가능해야 의미, 그래서 궁극적으로 있습니다 당신은 부트 로더, 운영체제 등 어떤 OS없이 실행되는 임베디드 소프트웨어, 같은 것을 쓸 수 있습니다 어떤 이 점에서 한계가 있으므로 거의 모든 실제 운영 체제, 부트 로더 등에 는 어셈블리 언어로 작성된 코드가 약간 포함되어있을 수 있습니다 . 마찬가지로, 작은 임베디드 시스템이라도 호스트 시스템의 장치에 액세스 할 수 있도록 사전 작성된 라이브러리 루틴이 적어도 포함되어있을 가능성이 있습니다. 정확한 경계를 정의하기는 어렵지만 그러한 코드에 대한 종속성을 최소화해야합니다.
언어에서 정의되지 않은 동작은 주로 언어가 이러한 기능을 지원하려는 의도에 의해 결정됩니다. 예를 들어, 언어를 사용하면 임의의 정수를 포인터로 변환하고 해당 주소에있는 모든 것에 액세스 할 수 있습니다. 표준은 수행 할 때 어떤 일이 일어날 지 말하려고 시도하지 않습니다 (예를 들어, 일부 주소에서 읽는 경우에도 외부에 영향을 줄 수 있음). 동시에, C로 작성할 수있는 어떤 종류의 소프트웨어 가 필요 하기 때문에 그러한 작업을 수행하지 못하게하려고 시도하지 않습니다 .
다른 디자인 요소로 인해 정의되지 않은 동작이 있습니다. 예를 들어 C의 다른 의도는 별도의 컴파일을 지원하는 것입니다. 이것은 (예를 들어) 우리 대부분이 일반적인 링커 모델로 보는 것과 거의 비슷한 링커를 사용하여 조각을 "링크"할 수 있음을 의미합니다. 특히 언어의 의미에 대한 지식없이 별도의 컴파일 된 모듈을 완전한 프로그램으로 결합 할 수 있어야합니다.
컴파일러 기술의 한계로 인해 존재하는 또 다른 유형의 정의되지 않은 동작 (C보다 C ++에서 더 일반적 임)이 있습니다. 기본적으로 우리가 알고있는 것은 오류이며 컴파일러가 오류로 진단하기를 원할 것입니다. 그러나 컴파일러 기술에 대한 현재의 한계를 감안할 때 모든 상황에서 진단이 가능하다는 것은 의심의 여지가 있습니다. 이들 중 다수는 별도의 편집과 같은 다른 요구 사항에 의해 결정되므로 충돌 요구 사항의 균형을 맞추는 문제가되며,이 경우위원회는 일반적으로 가능한 문제를 진단 할 수없는 경우에도 더 큰 기능을 지원하기로 결정했습니다. 가능한 모든 문제를 진단 할 수있는 기능을 제한하는 대신.
이러한 의도 의 차이는 C와 Java 또는 Microsoft의 CLI 기반 시스템과 같은 차이점을 대부분 이끌어냅니다. 후자는 훨씬 더 제한된 하드웨어 세트로 작업하거나 소프트웨어가 대상으로하는 더 구체적인 하드웨어를 에뮬레이트하도록 요구하는 것으로 상당히 명시 적으로 제한됩니다. 또한 하드웨어의 직접적인 조작 을 방지 하기 위해 JNI 또는 P / Invoke (및 C와 같이 작성된 코드)와 같은 것을 사용하여 그러한 시도를하도록 요구합니다.
잠시 고델의 정리로 돌아가서, 우리는 비슷한 것을 그릴 수있다. 자바와 CLI는 "내부적으로 일관성있는"대안을 선택했고 C는 "완전한"대안을 선택했다. 물론 이것은 매우 거친 비유 입니다. 어떤 경우 에도 내부 일관성 또는 완전성에 대한 공식적인 증거를 시도하는 사람은 아무도 없습니다 . 그럼에도 불구하고 일반적인 개념은 그들이 선택한 선택 에 상당히 밀접하게 부합 합니다 .