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


21

オクタルどこで役立ちますか?オクタルは昔々便利だったようです。

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

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

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

だから、私の質問は:

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

24
「面接中に若者を混乱させる」ことを答えとして受け入れますか?
ヤニス

11
C構文に準拠+ブラインドコピー
ラチェットフリーク

1
@Manishearth Cはその祖先から継承しました。CにはJavaがあるため、Javaにもあります。CとJavaが持っているため、他のほとんどの人がそれを持っています。
インゴ

2
8進数のUnixファイルの権利の変更がまだ見chmodられます。ユーザー、グループ、その他の3ビットのグループの場合は0666または0777、読み取り、書き込み、実行可能です。
ジョープエッゲン

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を3つの異なる言語としてカウントすることは含まれていませんでした。

Octalは、バイナリ命令値の読み取りを容易にするため、以前は使用されていました。たとえば、PDP-11には、BASICALLYには4ビットのオペコード、2つの3ビットのレジスタ番号、2つの3ビットのアクセスメカニズムフィールドがありました。単語を8進数で表現すると、すべてが明らかになりました。

Cの初期のPDP-11との関連付けにより、8進数表記が含まれていました。これは当時のPDP-11で非常に一般的だったためです。

他のマシンには、ヘックスに適切にマッピングされない命令セットがありました。CDC 6600には60ビットのワードがあり、各ワードには通常2〜4個の命令が含まれていました。各命令は15または30ビットでした。

値の読み取りと書き込みに関しては、これは解決された問題であり、少なくとも防衛業界では業界でよく知られたベストプラクティスがあります。ファイル形式をドキュメント化します。文書は10進数、16進数、または8進数のいずれであるかを通知するので、形式を文書化するときにあいまいさはありません。

注:I / Oシステムがデフォルトで8進数を意味する先頭の0になっている場合は、16進数値を示すために出力で他の規則を使用する必要があります。これは必ずしも勝利ではありません。

私の意見では、Adaは最高の結果を出しました。2#10010010#、8#222#、16#92#、および146はすべて同じ値を表しています。(それはおそらく、Adaに言及するためだけに、少なくとも3回のダウン投票を私にもたらすでしょう。)


11
エイダに言及...冗談をのためにあなたをDownvoted
kufi

12
「言語デザイナー」の50%はるかに超える数字にあなたがどのように来たのか知りたいのですが、なぜ怖い言葉が引用されるのですか?-Cの子孫以外の経験はありません。私は毎日16年間、プロの言語デザイナーと話をしてきましたが、あなたの説明と一致する人はいません。
エリックリッパー

Javascriptが私が...正しくそのインタビューを覚えていれば、その設計者は、興味を取得する「我々は、ブラウザでLispのやりたい」と説明した
Izkata

2
@Izkata:確かに、Waldemar Horwatは、JavaScriptを本質的にCのような構文を持つCommon Lispと見なしていると言っていました。実際、Waldemarはメタ言語を定義し、Common Lispでメタ言語のインタープリターを作成し、メタ言語でJavaScript仕様を作成したため、仕様を実際に実行できました。それは賢いテクニックでした。
エリックリッパー

なぜ0が使用されたのですか?数字以外の文字を使用するのは理にかなっていないでしょうか?ANSI規格には、10を基数とする数値によって引き起こされるバグの先見性がありませんでしたか?
オールドバッドマングレイ

6

Cから取得します。なぜコピーするのですか?3つすべての基本実装はCであるため。Pythonのデフォルト実装はCPythonです。Rubyも元々Cで構築されました。ここでは、Javascriptが最も興味深いケースです。ブラウザで実行されます。最初のWebブラウザーが何で書かれたのかを推測することに注意してください。

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

したがって、これらの言語の環境がCで記述されているかどうかは問題であるため、Cから慣習を取ります。これをサポートする優れた結果は、代わりに&Oを使用するVisual Basic です。それを必要とする限り、それは他のものよりも漏れやすい抽象化された慣習のようです。


MosaicはJavaScriptをサポートしましたか?そうでない場合、それをどのように言及することが重要ですか?
svick

2
@svickこれは、Netscape Navigatorのベースラインです。
ワールドエンジニア

2

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

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

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

かつてのように8進数にあまり依存していませんが、それらはまだ価値があります。16進数でも同じ結果が得られますが、状況によっては8進数の方が理解しやすい場合があります。

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


3
先頭にゼロが付いているフィールドは、文字列であり、数字ではなく、独自の意味を持つ視覚的な表現です。
ピーターB

1
+1 chmod 438 ./myfileひどいことを検討してください!
インゴ

2
なぜ0o10構文を許可しないのですか?Pythonはそれをサポートしていると思います。数値が通常の数値でなくなることのない、8進数の値を記述する簡単な方法をいつでも作成できます。私は人々が整列し、容易な操作のためのコードの末尾にゼロを使用しようと見ている、と進表記で足に刺さ
Manishearth

2進および16進に加えて、8進値を書き込む手段を持ちたいという願望を理解できます。コンパイラー031がクリスマス(12月25日)ではなくハロウィーン(10月31日)として解釈することは、プログラマーが後者の実装を使用する言語で書かれたコードをコピーする場合、リスクをもたらす可能性があることも理解できます。ただし、0q318進数が必要な場合は表記としてサポートすることによって、または0t02510 進数で先行ゼロを含むマクロペースト値を許可し、基本指定子なしで先行ゼロを単に禁止することによって、言語が両方の世界の最高を達成できない理由はわかりません。
supercat

@supercat先行する0を使用して、少なくとも青少年までの8進数の日付を表します。頻繁に使用される場合は、ビットに重要性があり、10進数としての数値の解釈は8未満の値に対してのみ正しい場合です。追加の文字(10進数の先行ゼロを含む)の追加は役立つよりも混乱する可能性があります。私は日付が012 031、010 031、または012 025.に書かれた理由を問い合わせ確かだろう
BillThor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.