これは10で十進の8、100で十進の64を表す表記法についてですね。http://en.wikipedia.org/wiki/Octal によると、米国原住民のYuki族の言語とメキシコ原住民のPamea族の言語が八進だった(指の数ではなく、指の間の数を数える)そうですが、これは除いておきます。
コンピュータで、もともとは二進数をほんとうに二進01のみで表していたのが、これではいかにも不便だということで、1960年代のIBMのメインフレームの時代に始まり、unixにも受け継がれたものです。現在は十六進(10で十進の16)が盛んですが、当初は、数字以外の要素を使う必要がないことから八進が使われました。特に、コンピュータの1ワードが24ビット、あるいは36ビットというIBMのメインフレームでは、3ビットの8進数では、8文字ないし12文字でぴったりと来ていました。
現在は、パソコンの1ワードは16ビットないし32、64ビットなので、16進、つまり4ビットの倍数がぴったりときていますが。
。。。ということをお知りになりたいのでしょうか。
なお、上記サイトには、スウェーデンのカルロス12世が欧州での8進数の発明者であると、Donald Knuthの本に書いてある、としています。こちらについては未調査です。
>0で始まる数値を8進数とみなす
C言語では、その通りですがアセンブラやBASICなど処理系によって表記方法は異なります。
>歴史的
C言語での話であるとすればC言語(あるいは祖先のB言語)で8進数が使えるようになった時がスタート時ということになるでしょうけど、C言語の誕生年くらいしか情報は無いので何年の何月何日までは・・・
http://www.bohyoh.com/CandCPP/C/history.html
>必然性
推測に過ぎませんが、簡潔に区別できるような手段であれば何でも良かったのだと思います。(ゼロではなくオー:8進数:Octal notationが起源のようには思いますが、、、)
ありがとうございます。おっしゃるようなことを知りたいわけです。たとえば、BCPLやB言語でも同じ仕様だったのか?C言語だけでなくJavaScriptなど最近の言語でもまだこの仕様は受け継がれており、決して過去の遺物とは言えないようです。
コンパイラ・コンパイラや字句解析/構文解析を取り扱ったことはありますか?
単純に言ってしまいますが、空白(やタブや改行)が単語の区切りをあらわすとして、ある単語が、命令なのか、演算子なのか、宣言なのか、文字列リテラルなのか、数値リテラルなのか、etc... をコンパイラは認識する必要があります。
さて、ある単語が数値リテラルかどうかを簡単に判別するには? という話です。
Wikipediaの"0x"の項目から引用。
C and languages with a similar syntax (such as C++, C#, Java and Javascript) prefix hexadecimal numerals with "0x", e.g. "0x5A3". The leading "0" is used so that the parser can simply recognize a number, and the "x" stands for hexadecimal (cf. 0 for Octal).
「先頭が"0"であることで、パーサに数値であることを簡単に認識させることができます」という内容のことが書いてあります。
数値リテラルかどうかを判定するには、先頭が数字であれば確かに楽です。
8進数を示す数値リテラルは先頭がoctで始まる、などという文法を作ってしまうと、例えば oct11 は数値リテラル(10進数の9)ですが、octagon は数値リテラルではない、ということになります。この2種類を区別するのに4文字も読みこまないといけません。これは非効率です。
で、cf. の先であるOcatlの項目から。(1.の回答と同じURLです)
At the time when octal originally became widely used in computing, systems such as the IBM mainframes that employed 24-bit (or 36-bit) words.
1.の回答にもあるとおり、1ワードが24bitだったようで、かつては16進数よりも8進数の方が都合がよかったということのようです。故に、8進数の区別はできるだけ効率的であるべき――というのは、判定に要する文字数が少なければ少ないほどいい――だったわけです。
ということで、"数字"であって、通常の10進数表記では先頭にくる必要がない"0"が、8進数表記の区別のために割り当てられたことが納得できますか? (それが最適だったのかどうかはおいておくとしても)
丁寧な説明をありがとうございます。「0」がもっとも都合が良かったことは明快に理解できました。特にリソースの少なかった時代以下に少ないステップで処理をするかということを考えるとここに帰結したのだろうということも予想できます。あとは、いつからこれが使われ始めたのかを知りたいと思います。
一応、根拠になる資料も集めてみましたが、肝心の部分は推測の域を出ないことを
お断りしておきます。
UNIX http://ja.wikipedia.org/wiki/Unix
B言語 http://ja.wikipedia.org/wiki/B%E8%A8%80%E8%AA%9E
C言語 http://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E
プログラミング言語年表 http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A...
歴史的な側面。
C言語の元になったB言語は8進定数の表記はCと同じモノがありましたが、16進表記は
用意されていなかったようです。
http://www.icl.pku.edu.cn/bswen/_old_stuff/c/kbman.html
B言語に影響を与えたBCTLには8進も16進もありましたが、C言語で採用された表記
とは異なっていたようです。
というわけで、頭0はB言語が始まりと言えそうです.
8進の必然について。
UNIXは最初アセンブラで開発され、後にB言語、C言語で書き直したと言われています。
http://www.village.org/pdp-11/faq.pages/WhatPDP.html
PDP-7とPDP-8のどちらで最初にUNIXが開発されたのかは諸説ありますが、
PDP-7は18bit機、PDP-8は12bit機であり、PDP-11が出るまでPDPシリーズに16bit機は
ありませんでした。
7,8どちらにしろ3bit区切りで割り切れるbitのアーキテクチャですから、数字のみで
バイナリ値を簡潔に表記できる8進数は、必然だったと考えられます。
その代わり、16進表記は必須でなかったと。
後で16bitアーキテクチャであるPDP-11にUNIXを乗せることになると、当然16進表記が
都合が良いため、C言語では16進表記に0xという前置を採用したと考えられます。
頭0の必然について。
これが一番謎です。
アーキテクチャ上8進数を使う場面が多く、簡単に表記したかったからと思われます。
古いBCPLの規格では8進数をスペシャルキャラクター+数字の列で表していたので、
これをB言語に取り入れる際にスペシャルキャラクターの使用を避け、0を前置する
ことにしたという見方が自然だと思います。
http://www.cs.auckland.ac.nz/compsci105s2c/lectures/JavaHex.pdf
その他記号をなぜ使わなかったかも謎ですが、すでに使っていたか、拡張のために
リザーブしたか…、あるいはパースのロジックをコンパクトにするためだったのかも。
OctalのOの意味で0をつけたのかどうかは不明です。
アルファベットのOにすると、変数名などにOで始まる名前が使いにくくなるから
というのは想像できます。
すべては Ken Thompson のみが知るところです。
ありがとうございます。表記については前のかたの情報が参考になりました。
ありがとうございます。知りたいのは、なぜ0をつけることを8進数という意味という仕様にしたのか?そしてそれは何が起源なのかということです。