Perché così tante lingue trattano i numeri che iniziano con 0 come ottali?


22

Ho letto Dove sono utili gli ottali? e sembra che gli ottali siano qualcosa che una volta era utile.

Molte lingue trattano i numeri che precedono con uno 0 come ottali, quindi il letterale 010è in realtà 8. Alcuni di questi sono JavaScript, Python (2.7) e Ruby.

Ma non vedo davvero perché queste lingue abbiano bisogno dell'ottale, specialmente quando l'uso più probabile della notazione è di indicare un numero decimale con uno 0 superfluo.

JavaScript è una lingua lato client, l'ottale sembra piuttosto inutile. Tutti e tre sono piuttosto moderni in un altro senso, e non penso che ci sarebbe molto codice usando la notazione ottale che verrebbe interrotta rimuovendo questa "caratteristica".

Quindi, le mie domande sono:

  • C'è qualche punto di queste lingue a sostegno dei letterali ottali?
  • Se sono necessari valori letterali ottali, perché non usare qualcosa del genere 0o10? Perché copiare una vecchia notazione che sostituisce un caso d'uso più utile?

24
Accetterete "di confondere i giovani durante un'intervista" come risposta?
yannis,

11
conforme alla sintassi C + copia cieca
maniaco del cricchetto

1
@Manishearth C l'ha ereditato dai suoi antenati. Java ce l'ha, perché ce l'ha C. Molti altri ce l'hanno, perché ce l'hanno C e Java.
Ingo,

2
Si vedono ancora le giuste modifiche al file Unix ottale: chmodcon 0666 o 0777 per gruppi di 3 bit per utente, gruppo e altri: lettura, scrittura, eseguibile.
Joop Eggen,

3
@Llepwryd Nei browser più vecchi, parseInt('010')ha effettivamente restituito 8, quindi tutti i consigli da usare sempre parseInt(foo, 10)(ed è ancora un'abitudine per me)
Izkata

Risposte:


34

Copia cieca di C, proprio come ha detto un maniaco del cricchetto nel suo commento

La stragrande maggioranza dei "progettisti del linguaggio" in questi giorni non ha mai visto altro che C e le sue copie (C ++, Java, Javascript, PHP e probabilmente alcune decine di altri di cui non ho mai sentito parlare). Non hanno mai toccato FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL, solo per citarne alcuni.

Una volta, l'esposizione a più linguaggi di programmazione era OBBLIGATORIA nel curriculum di informatica e ciò non includeva il conteggio di C, C ++ e Java come tre linguaggi separati.

In passato Octal veniva utilizzato perché rendeva più semplice la lettura dei valori delle istruzioni binarie. Il PDP-11, ad esempio, BASICALMENTE aveva un codice operativo a 4 bit, 2 numeri di registro a 3 bit e 2 campi del meccanismo di accesso a 3 bit. Esprimere la parola in ottale ha reso tutto ovvio.

A causa della prima associazione di C con il PDP-11, fu inclusa la notazione ottale, poiché all'epoca era molto comune sui PDP-11.

Altre macchine avevano serie di istruzioni che non si associavano bene all'esagono. Il CDC 6600 aveva una parola di 60 bit, con ogni parola che conteneva in genere da 2 a 4 istruzioni. Ogni istruzione era di 15 o 30 bit.

Per quanto riguarda la lettura e la scrittura di valori, questo è un problema risolto, con una buona pratica del settore ben nota, almeno nel settore della difesa. DOCUMENTI i tuoi formati di file. Non c'è alcuna ambiguità quando il formato è documentato, perché il documento TI DICE se stai guardando un numero decimale, un numero esadecimale o un numero ottale.

Nota anche: se il tuo sistema I / O è impostato per default a 0 che significa ottale, devi usare qualche altra convenzione sull'output per indicare valori esadecimali. Questa non è necessariamente una vittoria.

Secondo la mia opinione personale, Ada ha fatto meglio: 2 # 10010010 #, 8 # 222 #, 16 # 92 # e 146 rappresentano tutti lo stesso valore. (Probabilmente mi faranno almeno tre voti negativi proprio lì, solo per menzionare Ada.)


11
Ti ho votato per aver citato Ada ...
sto

12
Sono curioso di sapere come sei arrivato alla cifra che oltre il 50% dei "progettisti linguistici" - perché la paura cita? - non ha esperienza con nulla tranne che per i discendenti C. Ho trascorso ben sedici anni della mia vita a parlare ogni giorno con designer linguistici professionisti e nessuno di questi corrisponde alla tua descrizione.
Eric Lippert,

Javascript è stato descritto come "vogliamo fare lisp nel browser" per interessare il suo designer, se ricordo bene l'intervista ...
Izkata

2
@Izkata: In effetti, una volta Waldemar Horwat mi disse che considerava JavaScript essenzialmente come Lisp comune con una sintassi simile al C. In effetti Waldemar ha definito un metalinguaggio, ha scritto un'interpretazione del suo metalinguaggio in Common Lisp, quindi ha scritto le specifiche JavaScript nel suo metalinguaggio, consentendogli così di eseguire effettivamente le specifiche. Era una tecnica intelligente.
Eric Lippert,

Perché è stato usato 0 però? Non avrebbe senso usare un carattere non numerico? Lo standard ANSI non aveva la previsione di bug causati da numeri che intendevano essere base dieci?
Old Badman Grey

6

Lo ottengono da C. Perché copiarlo? Poiché l'implementazione di base di tutti e 3 è in C. L'implementazione predefinita di Python è CPython . Rubino è stato originariamente costruito nel C pure. Javascript è il caso più interessante qui. Viene eseguito nel browser. Vuoi indovinare in cosa è stato scritto il primo browser web ?

Quindi perché tutte e tre queste lingue dovrebbero essere implementate in C? Perché tutti hanno origine su sistemi UNIX. Quindi è un caso di convenzione guidata dall'ecosistema. Anche Perl fa questo. Lua probabilmente lo farebbe se Lua usasse numeri interi anziché doppi .

Quindi è una questione ambientale di queste lingue essere scritto in C in modo da prendere le loro convenzioni da C. Un buon corollario di supporto è Visual Basic che usi & O invece. Per quanto ne abbia bisogno, sembra più un'astrazione che perde trasformata in convenzione di ogni altra cosa.


Mosaic ha supportato JavaScript? In caso contrario, come è rilevante menzionarlo?
svick

2
@svick È la linea di base per Netscape Navigator.
Ingegnere mondiale,

2

C'è un valore nella coerenza. Se non riesci a determinare in modo affidabile come un numero verrà tradotto, avrai problemi reali nell'usare un valore in contesti diversi.

Significa anche che non è necessario scrivere il proprio parser. C'è un grande valore nell'uso di routine di libreria ben testate.

Inoltre, se non supporti la sintassi 0 iniziale, non hai un modo semplice per scrivere valori ottali.

Sebbene non dipendiamo tanto dai numeri ottali come facevamo una volta, sono comunque di valore. Mentre gli stessi risultati possono essere ottenuti con numeri esadecimali, in alcuni contesti l'ottale è più facile da capire.

Finora ho visto un solo uso per zeri iniziali in numeri decimali. Cioè nella visualizzazione e immissione di campi decimali a lunghezza fissa come numeri di identificazione. Sono passati anni da quando ho visto campi del genere con uno zero iniziale. Mentre questo riduce i valori disponibili del 10%, elimina il problema che gli utenti spesso tralasciano gli zeri iniziali quando li inseriscono.


3
I campi con zeri iniziali sono stringhe, rappresentazioni visive con significato proprio, non numeri.
Pieter B,

1
+1 considera chmod 438 ./myfileTerribile!
Ingo,

2
Perché non consentire una 0o10sintassi? Credo che Python lo supporti. Puoi sempre creare un modo semplice per scrivere valori ottali che non rendono il numero non più un numero normale. Ho visto persone tentare di usare gli zero finali nel codice per l'allineamento e la facile manipolazione e venir morso al piede con notazione ottale
Manishearth,

Riesco a capire il desiderio di avere un mezzo per scrivere valori ottali, oltre a binario ed esadecimale. Posso anche capire che far interpretare un compilatore 031come Halloween (31 ottobre) anziché Natale (25 dicembre) potrebbe comportare dei rischi se i programmatori copiassero un codice scritto in un linguaggio che utilizza quest'ultima implementazione. Non vedo alcun motivo, tuttavia, perché una lingua non possa ottenere il meglio da entrambi i mondi supportando 0q31come notazione quando si desidera l'ottale o 0t025per base-dieci per consentire valori di macro-incollaggio con zero iniziali e semplicemente vietando zero iniziali senza identificatori di base .
supercat

@supercat Usa lo 0 iniziale per rappresentare le date dell'ottava almeno per la tua giovinezza. I casi in cui viene utilizzato frequentemente sono casi in cui i bit hanno significato e l'interpretazione del numero come un numero decimale è corretta solo per valori inferiori a 8. L'aggiunta di caratteri aggiuntivi (inclusi zeri iniziali su numeri decimali) può essere più confusa che utile . Chiederei sicuramente perché è stata scritta una data 012 031, 010 031 o 012 025.
BillThor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.