0で始まる数値を8進数とみなすのは歴史的に何から始まったのでしょうか?また、そのための必然性は何だったのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/06/08 16:24:00
  • 終了:2006/06/11 02:03:27

回答(4件)

id:sibazyun No.1

sibazyun回答回数1721ベストアンサー獲得回数2332006/06/08 16:53:26

ポイント20pt

これは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の本に書いてある、としています。こちらについては未調査です。

id:dayofgreen

ありがとうございます。知りたいのは、なぜ0をつけることを8進数という意味という仕様にしたのか?そしてそれは何が起源なのかということです。

2006/06/08 17:57:12
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012006/06/08 17:00:30

ポイント40pt

>0で始まる数値を8進数とみなす

C言語では、その通りですがアセンブラやBASICなど処理系によって表記方法は異なります。

>歴史的

C言語での話であるとすればC言語(あるいは祖先のB言語)で8進数が使えるようになった時がスタート時ということになるでしょうけど、C言語の誕生年くらいしか情報は無いので何年の何月何日までは・・・

http://www.bohyoh.com/CandCPP/C/history.html

>必然性

推測に過ぎませんが、簡潔に区別できるような手段であれば何でも良かったのだと思います。(ゼロではなくオー:8進数:Octal notationが起源のようには思いますが、、、)

id:dayofgreen

ありがとうございます。おっしゃるようなことを知りたいわけです。たとえば、BCPLやB言語でも同じ仕様だったのか?C言語だけでなくJavaScriptなど最近の言語でもまだこの仕様は受け継がれており、決して過去の遺物とは言えないようです。

2006/06/08 17:57:20
id:quintia No.3

quintia回答回数545ベストアンサー獲得回数602006/06/08 19:15:43

ポイント80pt

コンパイラ・コンパイラや字句解析/構文解析を取り扱ったことはありますか?

単純に言ってしまいますが、空白(やタブや改行)が単語の区切りをあらわすとして、ある単語が、命令なのか、演算子なのか、宣言なのか、文字列リテラルなのか、数値リテラルなのか、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).

http://en.wikipedia.org/wiki/0x

「先頭が"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.

http://en.wikipedia.org/wiki/Octal

1.の回答にもあるとおり、1ワードが24bitだったようで、かつては16進数よりも8進数の方が都合がよかったということのようです。故に、8進数の区別はできるだけ効率的であるべき――というのは、判定に要する文字数が少なければ少ないほどいい――だったわけです。

ということで、"数字"であって、通常の10進数表記では先頭にくる必要がない"0"が、8進数表記の区別のために割り当てられたことが納得できますか? (それが最適だったのかどうかはおいておくとしても)

id:dayofgreen

丁寧な説明をありがとうございます。「0」がもっとも都合が良かったことは明快に理解できました。特にリソースの少なかった時代以下に少ないステップで処理をするかということを考えるとここに帰結したのだろうということも予想できます。あとは、いつからこれが使われ始めたのかを知りたいと思います。

2006/06/09 09:08:53
id:dungeon-master No.4

dungeon-master回答回数571ベストアンサー獲得回数402006/06/09 05:35:07

ポイント80pt

一応、根拠になる資料も集めてみましたが、肝心の部分は推測の域を出ないことを

お断りしておきます。

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 のみが知るところです。

id:dayofgreen

ありがとうございます。表記については前のかたの情報が参考になりました。

2006/06/11 02:01:54

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません