web-dev-qa-db-ja.com

なぜ多くの言語が0で始まる数値を8進数として扱うのですか?

私は読んだ 8進数はどこに役立つのか? そして、8進数はかつて有用であったもののようです。

多くの言語では、0で始まる数値を8進数として扱うため、リテラル010は実際には8です。これらのいくつかは、JavaScript、Python(2.7)、およびRubyです。

しかし、これらの言語が8進数を必要とする理由は本当にわかりません特に表記法のより可能性の高い使用法が、余分な0の10進数を示すことです。

JavaScriptはクライアント側の言語です。8進数はかなり役に立たないようです。他の意味では3つすべてがかなりモダンであり、8進数表記を使用してこの「機能」を削除すると壊れるコードは多くないと思います。

だから、私の質問は:

  • これらの言語が8進リテラルをサポートする点はありますか?
  • 8進リテラルが必要な場合は、0o10のようなものを使用してみませんか?より便利なユースケースをオーバーライドする古い表記をコピーするのはなぜですか?
22
Manishearth

ラチェットフリーク がコメントで述べたように、Cのブラインドコピー

最近の「言語デザイナー」の大多数は、Cとそのコピー(C++、Java、Javascript、PHP、そしておそらく私が聞いたことのない他の数十人)以外には何も見たことがない。彼らは、いくつか挙げると、FORTRAN、COBOL、LISP、Pascal、Oberon、FORTH、APL、BLISS、SNOBOLに触れたことはありません。

むかしむかし、コンピュータサイエンスのカリキュラムでは複数のプログラミング言語に触れることが必須であり、C、C++、およびJavaを3つの別個の言語としてカウントすることは含まれませんでした。

Octalは、バイナリ命令値の読み取りを容易にするため、以前のバージョンで使用されていました。たとえば、PDP-11には、BASICALLYに4ビットのオペコード、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システムがデフォルトで8進数を意味する先行0になっている場合は、16進値を示すために出力で他の規則を使用する必要があります。これは必ずしも勝利ではありません。

私の個人的な意見では、エイダは最善を尽くしました:2#10010010#、8#222#、16#92#、146はすべて同じ値を表します。 (これにより、Adaについて言及するためだけに、少なくとも3つの反対投票が可能になります。)

34
John R. Strohm

Cから取得します。なぜコピーするのですか? 3つすべてのベース実装はCであるからです。Pythonのデフォルト実装は CPython です。 Rubyは、最初に組み込み [〜#〜] c [〜#〜] も組み込まれています。JavaScriptは、ここで最も興味深いケースです。ブラウザで実行されます。 最初のウェブブラウザ が何で書かれたかを推測するには?

では、なぜこれら3つの言語すべてがCで実装されるのでしょうか。それらはすべてUNIXシステムを起源としているためです。つまり、エコシステムによって推進されている慣例の場合です。 Perl もこれを行います。 Luaは、Luaが doubles ではなく integers を使用した場合におそらく発生します。

したがって、Cで記述されているこれらの言語の環境の問題なので、Cの規則を採用します。優れたサポート結果は、代わりに &O を使用するVisual Basicです。それを必要とする限り、それは何よりもリークの多い抽象化された慣習のようです。

6
World Engineer

一貫性には価値があります。数値がどのように変換されるかを確実に判断できない場合は、さまざまなコンテキストで値を使用すると、実際に問題が発生します。

また、独自のパーサーを作成する必要がないことも意味します。十分にテストされたライブラリルーチンを使用することには大きな価値があります。

また、先頭の0構文をサポートしていない場合、8進値を書き込む簡単な方法がありません。

8進数には以前ほど依存していませんが、それでも価値があります。 16進数でも同じ結果が得られますが、コンテキストによっては8進数の方がわかりやすい場合があります。

これまでのところ、10進数の先行ゼロの使用は1つしかありません。これは、識別番号のような固定長の10進数フィールドの表示と入力です。私がそのようなフィールドに先行ゼロがあるのを見てきてから何年かになります。これにより、使用可能な値が10%減少しますが、ユーザーが先頭のゼロを入力するときに、ゼロを省略することがよくあるという問題はなくなります。

2
BillThor