2011-12-01 12 views
8

Ci sono domande su why Java doesn't support unsigned types e alcune domande su come gestire i tipi senza segno. Ho fatto qualche ricerca, e sembra che Scala non supporti anche i tipi di dati non firmati. La limitazione nella progettazione del linguaggio di Java e Scala, nel bytecode generato, o nella stessa JVM? Potrebbe esserci un linguaggio che gira su JVM ed è altrimenti identico a Java (o Scala), ma supporta i tipi di dati primitivi senza segno?La mancanza di tipi primitivi non firmati di Java è una caratteristica di Java la piattaforma o Java del linguaggio?

risposta

8

Java Bytecode Specification solo defines signed types:

I tipi integrali sono byte, short, int, e lungo, i cui valori sono 8-bit, 16 bit, 32 bit e 64 bit con segno interi a due complementi

Ma un linguaggio implementato sulla JVM può probabilmente aggiungere un tipo non firmato a livello sintattico e gestire la conversione in fase di compilazione.

+0

Non ho mai pensato di guardare le specifiche del bytecode. Avrei dovuto. Ho solo guardato le specifiche della lingua Java e vari documenti Scala. –

+0

"Gli operatori di interi incorporati non indicano un overflow (positivo o negativo) in alcun modo, si avvolgono in overflow." Ciò indicherebbe anche che se gestisci correttamente i casi, puoi effettivamente implementare tipi di dati non firmati usando gli operatori aritmetici standard. –

+0

Nel passato lavoravo con l'API di QuckTime Java che era solo un wrapper attorno alla libreria nativa di QuickTime che, se la mia memoria mi serviva, era piena di tipi interi non cancellati. Era un po 'imbarazzante api-saggio, ma la conversione firmata senza segno funzionava bene. –

2

La gestione dell'aritmetica non firmata è un problema di lingua/implementazione, non di piattaforma: potrebbe essere simulato su qualsiasi piattaforma, anche se non vi fosse alcun supporto nativo.

La JVM non ha un tipo, quindi Java/Scala/ecc. non supportarlo "out of the box".

3

Sebbene tipo unsigned potrebbe essere emulato a livello bytecode ci sono alcuni inconvenienti con quel:

  • Performance: Si avrebbe bisogno di diverse operazioni di bytecode per ogni semplice operazione aritmetica. Le prestazioni del codice che utilizzano i tipi non firmati non firmati sarebbero due o tre volte peggiori rispetto al codice che utilizza i tipi firmati.

  • Compatibilità: la maggior parte delle lingue in esecuzione su una JVM tenta di essere molto compatibile con l'enorme quantità di codice Java disponibile. Questo naturalmente verrebbe immediatamente rovinato quando verranno introdotti tipi aggiuntivi o quando alcune variabili con tipi "conosciuti" devono essere gestite diversamente.

Alla luce di ciò, i vantaggi per i tipi non firmati sono IMHO trascurabili.

+0

Le aggiunte e le sottrazioni di numeri uguali non sarebbero influenzate. Il confronto sarebbe probabilmente il più grande fastidio. – supercat

+0

@supercat: perché la pensi così? –

+1

Le uniche operazioni a cui posso pensare saranno interessate dalla divisione, i confronti e le conversioni in tipi "long" o floating-point. Di questi, i confronti sarebbero usati più frequentemente degli altri e normalmente richiederebbero il minor tempo possibile. – supercat

Problemi correlati