programing

왜 C는 C99 이전에 부울 데이터 유형이 없었습니까?

newstyles 2023. 6. 8. 19:25

왜 C는 C99 이전에 부울 데이터 유형이 없었습니까?

당신이 할 수 있다는 것을 알아요#define일부 정수이지만, C는 C99 이전에 전용 부울 데이터 유형을 가지고 있지 않은 이유는 무엇입니까?

프로그래밍과 논리학에서 너무나 흔한 일이기 때문에 명시적인 유형과 표기법이 없다는 것을 이해할 수 없습니다.

도서관에서 약간의 시간을 보낸다면, 여러분은 추측할 필요가 없습니다.다음은 Dennis Ritchie의 C의 진화에 관한 논문에서 발췌한 몇 가지 진술입니다.맥락은 데니스가 Ken Thompson의 언어 B를 기반으로 하고 있다는 것입니다. 이것은 아주 작은 PDP-7이라는 단어 주소 기계에서 구현되었습니다.증가하는 관심 때문에, 그 그룹은 최초의 PDP-11 중 하나를 얻었습니다.데니스는 다음과 같이 쓰고,

PDP-11의 등장은 B의 의미론적 모델의 몇 가지 부적절함을 드러냈습니다.첫째, BCPL에서 거의 변경되지 않고 상속된 문자 처리 메커니즘은 서툴렀습니다. 라이브러리 절차를 사용하여 포장된 문자열을 개별 셀에 분산한 다음 재포장하거나 개별 문자에 액세스하고 교체하는 것은 바이트 지향 기계에서 어색하고 심지어 바보 같은 느낌을 받기 시작했습니다.

B와 BCPL 모델은 포인터를 다루는 데 간접비를 암시했습니다. 언어 규칙은 포인터를 단어 배열의 인덱스로 정의함으로써 포인터를 단어 인덱스로 표현하도록 강요했습니다.각 포인터 참조는 포인터에서 하드웨어가 예상하는 바이트 주소로 런타임 스케일 변환을 생성했습니다.

이러한 모든 이유로 문자와 바이트 주소 지정에 대처하고 다가오는 부동 소수점 하드웨어에 대비하기 위해 타이핑 체계가 필요한 것처럼 보였습니다.다른 문제, 특히 형식 안전인터페이스 점검은 나중에 문제가 될 때만큼 중요하게 보이지 않았습니다.

(내 것을 강조합니다.)

이 논문은 계속해서 새로운 포인터 의미론을 발명하고, 어레이를 작동시키고, 이 새로운 flangle을 수용하기 위한 Dennis의 노력에 대해 설명합니다.struct:-) 이디어유. 형안에대구는별것하를은수훨중않다보니지았습이지요해까나중씬정아리과전언한념 :-)

C는 사실 더 높은 수준의 어셈블리 언어에 불과합니다.네, 그것은 제어 구조와 다른 것을 가지고 있고 심지어 조립자가 확실히 필요로 하지 않는 유형도 가지고 있습니다.

하지만 이 언어는 수십 년 전에 고안되었습니다.그리고 모든 부울 결과는 프로세서의 상태 워드에 있는 개별 비트로 귀결되기 때문에 프로세서에 통합 데이터 유형을 사용하는 것만으로도 충분했습니다.그리고 일부 유형 검사를 생략할 수 있기 때문에 컴파일러를 약간 덜 복잡하게 만들었습니다(이후의 언어에서 제어 구조는 부울 값을 필요로 하며, C에서는 0 또는 다른 것의 적분 값만 필요함).

CPU에는 "boolean type"이 없으며, 바이트와 그 수에 대해서만 작동하므로 당시에는 부울 형식이 이점을 제공하지 않았기 때문에 의미가 없습니다("0" 또는 "null이 아님"만 확인할 수 있는데 왜 유형을 사용합니까).

0을 거짓으로 처리하고 0이 아닌 것을 참으로 처리하는 것이 일반적이었습니다.을 가지고 를 들어, 이: 예를에대신, 것에에▁of▁this대,신들.while (remaining != 0)그냥 사용할 수 있습니다.while (remaining).

일부 언어는 참 존재 -1을 표준화했습니다.는 (하는) 이진법에서, 개는의보 2대에표완기법의그비이위유사부함이분때나해의서용타컴음수기니입아이기퓨문다터단닌비서가에위)이기 때문입니다.1111111110진수 -1)입니다.

시간이 지나면서 컴파일러 정의 상수를 사용하면 많은 잠재적인 혼란을 방지할 수 있다는 것을 깨달았습니다.C++를 한 지 오래되었지만, 0이 아닌 값은 여전히 "참"으로 평가될 것이라고 꽤 확신합니다.

0이 거짓이고 0이 아닌 것이 모두 참인 정수 유형으로 충분하다고 생각됩니다.

오래된 C는 실제로 불리언 유형을 "누락"한 것이 아닙니다. 단지 모든 통합 유형이 불리언을 저장하는 이중 의무를 수행하는 데 적합한 것으로 간주되었을 뿐입니다.이에 대한 두 가지 주요 이유를 알 수 있습니다.

  • 비트 일반적이지 부울" 할 수 "부울" 클 입니다. 부울은 여전히 최소 크기입니다.char어쨌든(효율적으로 액세스하려면).

  • 다 유형좁은보다 좁은 int는 확대됨으로 넓어집니다.int어쨌든 식에서 - 그래서 부울 연산자는 여전히 작업할 것입니다.int피연산자

..따라서 전용 부울 유형이 실질적인 이점을 제공할 만큼 설득력 있는 사례는 없었던 것 같습니다.

결과를 을 기억하세요. - C 어에생부결로연집있성과는다습합이니산자 (0 하 1 의정됨또는는를)!,&&,||,!=,==,<,<=,>그리고.>=따라서 존재하지 않는 전용 부울 유형입니다.

부울을 저장하는 데 사용하는 유형은 일반적으로 공간과 시간 간의 균형을 나타냅니다.일반적으로 int(일반적으로 4바이트)를 사용하면 (적어도 개별 작업에 대해) 가장 빠른 결과를 얻을 수 있습니다.반면에 매우 많은 수를 사용하는 경우에는 한 바이트를 사용하거나 심지어는 한 바이트를 패킹하여 저장하는 각 값이 한 비트만 사용하도록 하는 것이 훨씬 더 합리적일 수 있습니다. 하지만 그렇게 하면 한 비트를 읽거나 쓰는 것이 훨씬 더 비싸집니다(추가 코드 사용).

정말 "옳은" 대답이 하나도 없었기 때문에, 그들은 사용자가 작성하고 있는 프로그램의 요구 사항에 따라 결정하는 것을 사용자에게 맡겼습니다.

그렇다면 진짜 문제는 왜 C99에 부울 형식이 추가되었는가 하는 것입니다.제 추측에는 몇 가지 요인이 관련되어 있습니다.첫째로, 그들은 프로그래머의 가독성과 편리성이 가능한 최고의 성능을 제공하는 것보다 더 중요하다는 것을 깨달았습니다.둘째, 컴파일러는 이제 상당히 더 많은 글로벌 분석을 수행하므로, 누군가 특정 프로그램에 가장 적합한 표현을 선택하는 컴파일러를 작성할 수도 있다는 것을 추측할 수 있습니다(실제로는 모르지만).

역사적 이유, 아마도:

알골의 영향을 많이 받은 CPL은 아마도 부울형이었을 것이지만, 제 구글푸는 이것에 대한 참조를 찾기에 충분하지 않았습니다.하지만 CPL은 그 시대에 비해 너무 야심적이었기 때문에 BCPL이라는 이름의 축소된 버전이 만들어졌는데, 이는 사용 가능한 하드웨어에 실제로 구현할 수 있다는 이점이 있었습니다.

BCPL은 오직 하나의 유형 - '단어' - 을 가지고 있었는데, 이는 불리언 컨텍스트에서 거짓으로 해석되었습니다.0그리고 만약 그렇다면 사실입니다.~0의 보완을 함)0그것은 가치를 나타낼 것입니다.-1할당된 2-치수 정수로 해석되는 경우).다른 값의 해석은 구현에 따라 다릅니다.

여전히 활자가 없는 후계자 B 이후, C는 활자 시스템을 다시 도입했지만, 여전히 이전 세대의 활자가 없는 특성에 큰 영향을 받았습니다.

정수와 호환되지 않는 별도의 "Boolean" 유형을 추가하는 것은 단순히 정수를 목적으로 사용하는 것보다 컴파일러를 더 복잡하게 만들었을 것입니다.정수와 호환되는 별도의 부울 유형을 사용하면 0 또는 1이 아닌 값을 부울 개체에 저장하거나 "0" 또는 "1"과 관련된 비트 패턴이 없는 표현을 가진 부울 개체에 대해 숫자 계산을 수행할 수 있는 결과를 지정해야 합니다.주어진:

someBool = intFunction();
someInt = someBool;

일부를 요구하는intFunction이 0이 아닌 값을 반환하는 경우 int는 1을 받아야 합니다. 일반적으로 위의 값이 다음보다 비싸집니다.

someChar = intFunction();
someInt = someChar;

이전의 의미론이 필요한 경우, 다음을 통해 부울 형식을 사용하지 않고 달성할 수 있습니다.

someChar = !!intFunction();
someInt = someChar;

부울 형식을 사용하여 수행할 수 있는 모든 작업도 부울 형식 없이 수행할 수 있고 문자 형식을 사용하는 코드가 부울 형식보다 더 효율적일 수 있는 경우가 많기 때문에, 저는 그것들이 실제로 필요한 것은 전혀 없다고 제안하고 싶습니다.

왜냐하면 그들은 하나를 넣지 않았기 때문입니다.만약 그것이 단편적으로 들린다면 미안하지만, 기본적으로 그것은 그렇게 정의되지 않았습니다.

대부분의 사람들이 #참과 거짓을 정의한다는 것을 기억하세요.

당신은 bool이 표준이라고 말할 수 있지만 - 분명히 그것은 10년 전에 만들어진 C99 이전에는 표준이 아니었습니다;) 그들은 그것이 없어진 것이 명백해졌을 때 그것을 추가했습니다.

왜냐하면 프로그래밍 언어의 누락된 데이터 유형을 포함한 모든 것을 예측할 수 없기 때문입니다.

언급URL : https://stackoverflow.com/questions/2426000/why-didnt-c-have-a-boolean-data-type-prior-to-c99