왜 그렇게 많은 언어가 0으로 시작하는 숫자를 8 진수로 취급합니까? 불필요한 0으로 10 진수를

8 진수는 어디에 유용합니까?를 읽었습니다 . 8 진수는 한때 유용했던 것 같습니다.

많은 언어에서 앞에 0이 오는 숫자를 8 진수로 취급하므로 리터럴 010은 실제로 8입니다. 그 중 몇 가지는 JavaScript, Python (2.7) 및 Ruby입니다.

그러나 특히 이러한 표기법이 8 진수가 필요한 이유를 알지 못합니다. 특히 표기법을 더 많이 사용하는 것이 불필요한 0으로 10 진수를 표시하는 경우입니다.

JavaScript는 클라이언트 측 언어이며, 8 진법은 쓸모가없는 것 같습니다. 세 가지 모두 다른 의미에서 꽤 현대적이며,이 “기능”을 제거함으로써 8 진수 표기법을 사용하는 코드가 많이있을 것이라고 생각하지 않습니다.

그래서 내 질문은 :

  • 8 진 리터럴을 지원하는 이러한 언어가 있습니까?
  • 8 진 리터럴이 필요한 경우와 같은 것을 사용하지 않는 이유는 무엇 0o10입니까? 더 유용한 유스 케이스를 대체하는 이전 표기법을 복사해야하는 이유는 무엇입니까?


답변

래칫 괴물이 말한 것처럼 C의 맹인 복사

요즘 “언어 디자이너”의 대다수는 C와 그 사본 (C ++, Java, Javascript, PHP 및 아마도 내가 들어 본 적이없는 수십 명의 다른 사람들) 외에는 아무것도 본 적이 없습니다. 그들은 FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL을 만지지 않았습니다.

옛날 옛적에 컴퓨터 과학 커리큘럼에서는 여러 프로그래밍 언어에 대한 노출이 필수였으며 C, C ++ 및 Java를 세 개의 개별 언어로 계산하는 것은 포함되지 않았습니다.

Octal은 이진 명령어 값을 더 쉽게 읽을 수있게했기 때문에 초기에 사용되었습니다. 예를 들어, PDP-11은 기본적으로 4 비트 opcode, 2 3 비트 레지스터 번호 및 2 3 비트 액세스 메커니즘 필드를 가졌습니다. 8 진수로 단어를 표현하면 모든 것이 분명해졌습니다.

C의 PDP-11과의 초기 연관성 때문에, 8 진 표기법이 포함되어 있는데, 당시 PDP-11에서 매우 흔했기 때문입니다.

다른 기계에는 16 진수로 잘 매핑되지 않은 명령어 세트가있었습니다. CDC 6600에는 60 비트 단어가 있으며 각 단어에는 일반적으로 2-4 개의 명령어가 포함됩니다. 각 명령은 15 또는 30 비트였습니다.

가치를 읽고 쓰는 것과 관련하여, 이것은 적어도 방위 산업에서 잘 알려진 업계 모범 사례를 통해 해결 된 문제입니다. 파일 형식을 문서화합니다. 10 진수, 16 진수 또는 8 진수를보고 있는지 여부에 관계없이 TELLS가 ​​문서를 표시하므로 형식이 문서화 될 때 모호성이 없습니다.

참고 : I / O 시스템의 기본값이 0을 8 진수로 설정하면 16 진수 값을 나타 내기 위해 출력에 다른 규칙을 사용해야합니다. 반드시 승리는 아닙니다.

개인적으로는 Ada가 최선을 다했습니다. 2 # 10010010 #, 8 # 222 #, 16 # 92 # 및 146은 모두 동일한 값을 나타냅니다. (Ada를 언급하기 위해 저에게 적어도 3 개의 다운 보트가있을 것입니다.)


답변

그들은 C에서 그것을 얻습니다. 왜 복사합니까? 3의 기본 구현은 모두 C이므로 Python의 기본 구현은 CPython 입니다. 루비는 원래 C 로 만들어졌습니다 . Javascript가 가장 흥미로운 경우입니다. 브라우저에서 실행됩니다. 최초의 웹 브라우저 가 작성된 것을 추측하고 싶습니까?

그렇다면이 세 언어가 모두 C로 구현되는 이유는 무엇입니까? 모두 UNIX 시스템에서 시작 되었기 때문입니다. 생태계에 의해 주도되는 관행입니다. 도 이것을한다. 루아는 루아 가 배가 아닌 정수를 사용한다면 가능할 것이다 .

따라서 C로 작성된 이러한 언어의 환경에 대한 질문이므로 C에서 규칙을 가져옵니다. 좋은 지원 목록은 & O를 대신 사용하는 Visual Basic입니다 . 그것이 필요한 한, 그것은 다른 어떤 것보다 누설이 많은 추상화로 전환 된 것으로 보입니다.


답변

일관성에는 가치가 있습니다. 숫자가 어떻게 변환 될지 확실하게 결정할 수 없다면, 다른 상황에서 값을 사용하는 데 실제 문제가있을 것입니다.

또한 자체 파서를 작성하지 않아도됩니다. 잘 테스트 된 라이브러리 루틴을 사용하면 큰 가치가 있습니다.

또한 선행 0 구문을 지원하지 않으면 8 진 값을 작성하는 간단한 방법이 없습니다.

우리가 한 번했던 것처럼 8 진수에 많이 의존하지는 않지만 여전히 가치가 있습니다. 16 진수로 동일한 결과를 얻을 수 있지만 일부 상황에서는 8 진법을 이해하기가 더 쉽습니다.

지금까지 나는 십진수에서 0을 선행하는 유일한 사용법을 보았습니다. 이는 식별 번호와 같은 고정 길이 10 진수 필드의 표시 및 입력에 있습니다. 필자가 0 인 필드를 본 지 몇 년이 지났습니다. 이렇게하면 사용 가능한 값이 10 % 감소하지만 사용자가 입력 할 때 종종 선행 0을 벗어나는 문제가 제거됩니다.