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 010
tatsä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?
quelle
chmod
mit 0666 oder 0777 für Gruppen von 3 Bits für Benutzer, Gruppe und andere: Lesen, Schreiben, Ausführbar.parseInt('010')
es in der Tat 8 zurück, daher alle Ratschläge, die immer zu verwenden sindparseInt(foo, 10)
(und es ist immer noch eine Gewohnheit für mich)Antworten:
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.)
quelle
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.
quelle
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.
quelle
chmod 438 ./myfile
schrecklich halten!0o10
Syntax 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 wurden031
als 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,0q31
wenn sie als Notation unterstützt, wenn ein Oktal gewünscht wird, oder wenn die0t025
Basis zehn das Einfügen von Werten mit führenden Nullen in Makros zulässt und führende Nullen ohne Basisbezeichner einfach verbietet .