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

21

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 ottale, quindi il letterale 010 è in realtà 8. Alcuni di questi sono JavaScript, Python (2.7) e Ruby.

Ma non vedo davvero perché questi linguaggi abbiano bisogno di ottale, specialmente quando l'uso più probabile della notazione è quello di denotare un numero decimale con uno 0 superfluo.

JavaScript è un linguaggio 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 spezzata rimuovendo questa "caratteristica".

Quindi, le mie domande sono:

  • C'è qualche punto in queste lingue che supporta i letterali ottali?
  • Se sono necessari letterali ottali, perché non utilizzare qualcosa come 0o10 ? Perché copiare una vecchia notazione che sovrascrive un caso d'uso più utile?
posta Manishearth 14.01.2014 - 14:52
fonte

3 risposte

34

Copia cieca di C, proprio come cricchetto" ha detto nel suo commento

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

C'era una volta che l'esposizione a più linguaggi di programmazione era OBBLIGATORIA nel curriculum di informatica, e che non includeva il conteggio di C, C ++ e Java come tre lingue separate.

L'ottale è stato utilizzato nei giorni precedenti perché rendeva più semplice la lettura dei valori delle istruzioni binarie. Il PDP-11, ad esempio, BASICALLY 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 precedente associazione di C con il PDP-11, è stata inclusa la notazione ottale, poiché era molto comune sui PDP-11 al momento.

Altre macchine avevano insiemi di istruzioni che non erano mappati bene in esadecimale. Il CDC 6600 aveva una parola di 60 bit, con ogni parola contenente in genere da 2 a 4 istruzioni. Ogni istruzione era di 15 o 30 bit.

Per quanto riguarda la lettura e la scrittura dei valori, questo è un problema risolto, con una ben nota best practice di settore, almeno nel settore della difesa. DOCUMENTO 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 ha come valore predefinito 0, significa che devi usare qualche altra convenzione sul tuo output per indicare valori esadecimali. Questa non è necessariamente una vittoria.

Secondo la mia opinione personale, Ada ha fatto il meglio: 2 # 10010010 #, 8 # 222 #, 16 # 92 # e 146 rappresentano tutti lo stesso valore. (Questo probabilmente mi procurerà almeno tre downvotes proprio lì, solo per menzionare Ada.)

    
risposta data 14.01.2014 - 15:40
fonte
6

L'hanno preso da C. Perché copiare? Poiché l'implementazione di base di tutti e 3 è in C. L'implementazione predefinita di Python è CPython . Ruby è stato originariamente creato in C . Javascript è il caso più interessante qui. È eseguito nel browser. Ti va di indovinare in cosa è stato scritto primo browser ?

Quindi perché tutte e tre queste lingue saranno implementate in C? Perché provengono tutti da sistemi UNIX. Quindi è un caso di convenzione guidato dall'ecosistema. Perl fa altrettanto. Lua probabilmente lo farebbe se Lua usasse interi anziché raddoppia .

Quindi è una questione sull'ambiente in cui questi linguaggi vengono scritti in C, quindi prendono le loro convenzioni da C. Un buon corollario di supporto è Visual Basic che utilizza & O . Per quanto ne abbia bisogno, sembra essere più un'astrazione che perde la convenzione trasformata che altro.

    
risposta data 14.01.2014 - 15:47
fonte
2

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

Significa anche che non devi scrivere il tuo parser. C'è un grande valore nell'usare routine di librerie ben testate.

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

Anche se non dipendiamo tanto dai numeri ottali come una volta, essi hanno ancora valore. Mentre gli stessi risultati possono essere ottenuti con numeri esadecimali, in alcuni contesti l'ottale è più facile da capire.

Finora ho visto solo un uso per indicare gli zeri nei numeri decimali. Questo è nel display e nella voce di campi decimali a lunghezza fissa come numeri di identificazione. Sono passati anni da quando ho visto campi come quello con uno zero iniziale. Mentre questo riduce i valori disponibili del 10%, elimina il problema che gli utenti spesso lasciano fuori gli zeri iniziali quando li inseriscono.

    
risposta data 14.01.2014 - 15:19
fonte

Leggi altre domande sui tag