Warum behandeln so viele Sprachen Zahlen, die mit 0 beginnen, als Oktal?

21

Ich habe gelesen, wo sind Oktale nützlich? und es scheint, als wären Oktale etwas, was einst nützlich war.

Viele Sprachen behandeln vorangestellte Zahlen mit einer 0 als Oktal, sodass das Literal 010tatsächlich 8 ist. Einige davon sind JavaScript, Python (2.7) und Ruby.

Aber ich verstehe nicht wirklich, warum diese Sprachen ein Oktal benötigen, besonders wenn die Notation mit größerer Wahrscheinlichkeit eine Dezimalzahl mit einer überflüssigen 0 bezeichnet.

JavaScript ist eine clientseitige Sprache, Oktal scheint ziemlich nutzlos zu sein. Alle drei sind in anderer Hinsicht ziemlich modern, und ich glaube nicht, dass es viel Code mit einer Oktalnotation geben würde, der durch das Entfernen dieses "Features" beschädigt würde.

Meine Fragen lauten also:

  • Gibt es irgendeinen Sinn dieser Sprachen, die Oktalliterale unterstützen?
  • Wenn oktale Literale notwendig sind, warum nicht so etwas verwenden 0o10? Warum eine alte Notation kopieren, die einen nützlicheren Anwendungsfall überschreibt?
Manishearth
quelle
24
Akzeptieren Sie als Antwort "Jugendliche während eines Interviews zu verwirren"?
Yannis
11
gemäß C-Syntax + Blindkopie
Ratschenfreak
1
@Manishearth C hat es von seinen Vorfahren geerbt. Java hat es, weil C es hat. Die meisten anderen haben es, weil C und Java es haben.
Ingo
2
Man sieht immer noch oktale Unix-Dateiveränderungen: chmodmit 0666 oder 0777 für Gruppen von 3 Bits für Benutzer, Gruppe und andere: Lesen, Schreiben, Ausführbar.
Joop Eggen
3
@Llepwryd In älteren Browsern gab parseInt('010')es in der Tat 8 zurück, daher alle Ratschläge, die immer zu verwenden sind parseInt(foo, 10)(und es ist immer noch eine Gewohnheit für mich)
Izkata

Antworten:

34

Blindkopie von C, so wie es Ratschenfreak in seinem Kommentar sagte

Die überwiegende Mehrheit der "Sprachdesigner" hat heutzutage nur noch C und seine Kopien gesehen (C ++, Java, Javascript, PHP und wahrscheinlich ein paar Dutzend andere, von denen ich noch nie gehört habe). Sie haben noch nie FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL berührt, um nur einige zu nennen.

Der Umgang mit mehreren Programmiersprachen war im Lehrplan für Informatik einmal obligatorisch, und dazu gehörte nicht, C, C ++ und Java als drei separate Sprachen zu zählen.

Octal wurde in früheren Tagen verwendet, weil es das Lesen von binären Anweisungswerten erleichterte. Der PDP-11 hatte zum Beispiel im Grunde genommen einen 4-Bit-Opcode, 2 3-Bit-Registernummern und 2 3-Bit-Zugriffsmechanismusfelder. Das Wort im Oktal auszudrücken, machte alles klar.

Aufgrund der frühen Assoziation von C mit dem PDP-11 wurde die Oktalnotation aufgenommen, da sie zu dieser Zeit bei PDP-11 sehr häufig war.

Andere Maschinen hatten Befehlssätze, die sich nicht gut auf Hex abbilden ließen. Der CDC 6600 hatte ein 60-Bit-Wort, wobei jedes Wort typischerweise 2 bis 4 Anweisungen enthielt. Jeder Befehl bestand aus 15 oder 30 Bits.

Beim Lesen und Schreiben von Werten handelt es sich um ein gelöstes Problem, das zumindest in der Verteidigungsbranche mit einer bekannten Best-Practice-Methode der Branche verbunden ist. Sie DOKUMENTIEREN Ihre Dateiformate. Wenn das Format dokumentiert ist, gibt es keine Unklarheit, da das Dokument Ihnen mitteilt, ob Sie eine Dezimalzahl, eine Hexadezimalzahl oder eine Oktalzahl betrachten.

Hinweis: Wenn Ihr E / A-System standardmäßig eine führende 0 (Oktal) verwendet, müssen Sie für Ihre Ausgabe eine andere Konvention verwenden, um hexadezimale Werte anzugeben. Dies ist nicht unbedingt ein Gewinn.

Meiner persönlichen Meinung nach hat Ada es am besten gemacht: 2 # 10010010 #, 8 # 222 #, 16 # 92 # und 146 repräsentieren alle den gleichen Wert. (Das wird mir wahrscheinlich mindestens drei Abstimmungen bringen, nur um Ada zu erwähnen.)

John R. Strohm
quelle
11
Du wurdest herabgestimmt, weil du Ada erwähnt hast ... nur ein Scherz
kufi
12
Ich bin gespannt, wie Sie auf die Zahl gekommen sind, die weit über 50% der "Sprachdesigner" ausmacht - warum zitiert die Angst? - habe keine Erfahrung mit irgendetwas außer C Nachkommen. Ich habe gut 16 Jahre meines Lebens damit verbracht, mich jeden Tag mit professionellen Sprachdesignern zu unterhalten, und keiner von ihnen entspricht Ihrer Beschreibung.
Eric Lippert
Javascript wurde als "wir wollen im Browser
lispeln
2
@Izkata: Tatsächlich hat mir Waldemar Horwat einmal erzählt, dass er JavaScript als im Wesentlichen Common Lisp mit einer C-ähnlichen Syntax ansieht. Tatsächlich definierte Waldemar eine Metasprache, schrieb einen Interprepter für seine Metasprache in Common Lisp und schrieb dann die JavaScript-Spezifikation in seiner Metasprache, wodurch er die Spezifikation tatsächlich ausführen konnte . Es war eine clevere Technik.
Eric Lippert
Warum wurde 0 verwendet? Wäre es nicht sinnvoll, ein nicht numerisches Zeichen zu verwenden? Hatte der ANSI-Standard nicht die Voraussicht von Fehlern, die durch Zahlen verursacht wurden, die die Basis zehn haben wollten?
Old Badman Grey
6

Sie bekommen es von C. Warum kopieren? Da sich die Basisimplementierung von allen 3 in C befindet, ist die Standardimplementierung von Python CPython . Ruby wurde ursprünglich auch in C gebaut . Javascript ist hier der interessanteste Fall. Es läuft im Browser. Möchten Sie erraten, in welchem ​​Format der erste Webbrowser geschrieben wurde?

Warum werden diese drei Sprachen in C implementiert? Weil sie alle auf UNIX-Systemen basieren. Es handelt sich also um eine Konvention, die vom Ökosystem bestimmt wird. Perl macht das auch. Lua würde es wahrscheinlich tun, wenn Lua lieber ganze Zahlen als doppelte verwendet .

Es ist also eine Frage der Umgebung, in der diese Sprachen in C geschrieben sind, damit sie ihre Konventionen von C übernehmen. Eine gute unterstützende Konsequenz ist Visual Basic, das stattdessen & O verwendet. Soweit es nötig ist, scheint es eher eine undichte Abstraktion zu sein, die zur Konvention geworden ist als alles andere.

Weltingenieur
quelle
Hat Mosaic JavaScript unterstützt? Wenn nein, wie wird dies erwähnt?
Svick
2
@svick Dies war die Basis für Netscape Navigator.
Weltingenieur
2

Konsistenz hat einen Wert. Wenn Sie nicht zuverlässig bestimmen können, wie eine Zahl übersetzt werden soll, haben Sie echte Probleme bei der Verwendung eines Werts in verschiedenen Kontexten.

Es bedeutet auch, dass Sie keinen eigenen Parser schreiben müssen. Es ist von großem Wert, gut getestete Bibliotheksroutinen zu verwenden.

Auch wenn Sie die führende 0-Syntax nicht unterstützen, haben Sie keine einfache Möglichkeit, Oktalwerte zu schreiben.

Wir sind zwar nicht mehr so ​​stark von Oktalzahlen abhängig wie früher, aber sie sind immer noch von Wert. Während die gleichen Ergebnisse mit Hexadezimalzahlen erzielt werden können, ist in einigen Zusammenhängen das Oktal leichter zu verstehen.

Bisher habe ich nur eine Verwendung für führende Nullen in Dezimalzahlen gesehen. Dies erfolgt bei der Anzeige und Eingabe von Dezimalfeldern mit fester Länge wie z. B. Identifikationsnummern. Es ist Jahre her, dass ich solche Felder mit einer führenden Null gesehen habe. Während dies die verfügbaren Werte um 10% verringert, wird das Problem beseitigt, dass Benutzer bei der Eingabe häufig die führenden Nullen weglassen.

BillThor
quelle
3
Die Felder mit führenden Nullen sind Zeichenfolgen, visuelle Darstellungen mit eigener Bedeutung, keine Zahlen.
Pieter B
1
+1 für chmod 438 ./myfileschrecklich halten!
Ingo
2
Warum nicht eine 0o10Syntax zulassen ? Ich glaube, Python unterstützt das. Sie können jederzeit auf einfache Weise Oktalwerte schreiben, die die Zahl nicht mehr zu einer normalen Zahl machen. Ich habe Leute gesehen, die versucht haben, nachgestellte Nullen im Code für die Ausrichtung und einfache Manipulation zu verwenden, und die durch die Oktalnotation in den Fuß gebissen wurden
Manishearth,
Ich kann den Wunsch nach einem Mittel zum Schreiben von Oktalwerten zusätzlich zu Binär- und Hexadezimalwerten verstehen. Ich kann auch verstehen, dass die Interpretation eines Compilers 031als Halloween (31. Oktober) und nicht als Weihnachten (25. Dezember) ein gewisses Risiko darstellen kann, wenn Programmierer Code kopieren, der in einer Sprache geschrieben ist, die die letztere Implementierung verwendet. Ich sehe jedoch keinen Grund, warum eine Sprache nicht das Beste aus beiden Welten erzielen kann, 0q31wenn sie als Notation unterstützt, wenn ein Oktal gewünscht wird, oder wenn die 0t025Basis zehn das Einfügen von Werten mit führenden Nullen in Makros zulässt und führende Nullen ohne Basisbezeichner einfach verbietet .
Supercat
@supercat Verwendung der führenden 0 zur Darstellung von Oktaldatumsstützen, zumindest für Ihre Jugend. Die Fälle, in denen es häufig verwendet wird, sind Fälle, in denen die Bits eine Bedeutung haben und die Interpretation der Zahl als Dezimalzahl nur für Werte unter 8 korrekt ist. Das Hinzufügen zusätzlicher Zeichen (einschließlich führender Nullen auf Dezimalzahlen) kann eher verwirrend als hilfreich sein . Ich würde mit Sicherheit fragen, warum ein Datum 012 031, 010 031 oder 012 025 geschrieben wurde.
BillThor