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


21

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

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

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

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

그래서 내 질문은 :

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

24
"면접 중에 젊은이들을 혼동하는 것"을 대답으로 받아들입니까?
yannis

11
C 구문 + 블라인드 복사를 준수
래칫 괴물

1
@Manishearth C는 그것을 조상으로부터 물려 받았습니다. C는 그것을 가지고 있기 때문에 Java는 그것을 가지고 있습니다. C와 Java가 있기 때문에 대부분의 사람들이 그것을 가지고 있습니다.
Ingo

2
chmod사용자, 그룹 및 기타 사용자를위한 3 비트 그룹의 경우 0666 또는 0777로 읽기, 쓰기, 실행 파일의 8 진 Unix 파일 권한 변경이 여전히 표시 됩니다.
Joop Eggen

3
@Llepwryd 구식 브라우저에서는 parseInt('010')실제로 8을 반환했기 때문에 항상 사용하는 모든 조언 parseInt(foo, 10)(그리고 그것은 여전히 ​​습관입니다)
Izkata

답변:


34

래칫 괴물이 말한 것처럼 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 개의 다운 보트가있을 것입니다.)


11
Ada를 언급 한 것에 대해 당신을 공감했습니다 ... 농담
kufi

12
"언어 디자이너"의 50 % 이상을 차지하는 인물이 어떻게 등장했는지 궁금 합니다. -C 자손 이외의 경험이 없습니다. 저는 16 년 동안 제 전문 언어 디자이너들과 매일 대화하면서 그 중 어느 것도 당신의 설명과 일치하지 않았습니다.
Eric Lippert

Javascript는 인터뷰를 올바르게 기억한다면 디자이너가 관심을 갖도록 "브라우저에서 lisp하고 싶다"고 설명했습니다.
Izkata

2
@Izkata : 실제로 Waldemar Horwat은 JavaScript를 C와 같은 구문을 사용하여 본질적으로 Common Lisp로 본 적이 있다고 말했습니다. 실제로 Waldemar는 metalanguage를 정의하고 Common Lisp에서 metalanguage에 대한 인터프리터를 작성한 다음 metalanguage에 JavaScript 스펙을 작성하여 실제로 스펙을 실행할 수있게했습니다 . 영리한 기술이었습니다.
Eric Lippert

왜 0이 사용 되었습니까? 숫자가 아닌 문자를 사용하는 것이 타당하지 않습니까? ANSI 표준은 10 진수가 되려는 숫자로 인한 버그에 대한 예견이 없었습니까?
Old Badman Grey

6

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

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

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


Mosaic가 JavaScript를 지원 했습니까? 그렇지 않다면 어떻게 언급하는 것이 적절합니까?
svick

2
@svick Netscape Navigator의 기준입니다.
세계 엔지니어

2

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

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

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

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

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


3
선행 0이있는 필드는 문자열이 아니라 숫자가 아닌 고유 한 의미의 시각적 표현입니다.
Pieter B

1
+1 chmod 438 ./myfile끔찍한 것으로 간주하십시오 !
Ingo

2
0o10구문을 허용하지 않는 이유는 무엇 입니까? 나는 파이썬이 그것을 지원한다고 믿는다. 숫자를 더 이상 일반 숫자로 만들지 않는 8 진 값을 작성하는 간단한 방법을 항상 만들 수 있습니다. 나는 사람들이 정렬과 쉬운 조작을 위해 코드에서 후행 0을 사용하려고 시도하고 8 진수 표기법으로 발에 물린 것을
보았습니다

나는 바이너리와 16 진수 외에 8 진수 값을 쓰는 수단을 갖고 자하는 열망을 이해할 수 있습니다. 또한 031프로그래머가 크리스마스 (12 월 25 일)가 아니라 할로윈 (10 월 31 일)으로 해석 하면 프로그래머가 후자의 구현을 사용하는 언어로 작성된 코드로 복사하는 경우 약간의 위험이 발생할 수 있음을 이해할 수 있습니다. 그러나 0q318 진수가 필요할 때 표기법 을 지원 하거나 0t025기본 10으로 매크로 붙여 넣기 값을 선행 0으로 허용하고 기본 지정자를 사용하지 않고 선행 0을 간단히 금지 하여 언어가 두 세계의 장점을 모두 달성 할 수없는 이유는 없습니다. .
supercat

@supercat 선행 0을 사용하여 적어도 청소년에게 8 진 날짜를 나타냅니다. 자주 사용되는 경우는 비트에 의미가있는 경우이며 숫자를 10 진수로 해석하는 것은 8보다 작은 값에 대해서만 정확합니다. 추가 문자 (10 진수의 선행 0 포함)를 추가하면 도움이되는 것보다 더 혼란 스러울 수 있습니다 . 나는 왜 날짜가 012 031, 010 031, 또는 012 025로 쓰여 졌는지 물어볼 것이다.
BillThor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.