in JavaScript, divisione per zero con argomenti "intero" agisce come punti flottanti voglia:In che modo asm.js gestisce lo split-per-zero?
1/0; // Infinity
-1/0; // -Infinity
0/0; // NaN
Le specifiche asm.js dice che la divisione con argomenti interi restituisce intish
, che deve essere immediatamente costretto a con o senza segno. Se facciamo questo in javascript, divisione per zero con argomenti "integer" restituisce sempre zero dopo coercizione:
(1/0)|0; // == 0, signed case.
(1/0) >> 0; // == 0, unsigned case.
Tuttavia, in lingue con i tipi interi effettivi come Java e C, dividendo un numero intero da zero è un errore e l'esecuzione si arresta in qualche modo (ad esempio, genera un'eccezione, fa scattare una trappola, ecc.).
Anche questo sembra violare le firme di tipo specificate da asm.js. Il tipo di Infinity
e NaN
è double
e di /
è presumibilmente (dalla spec):
(firmato, firmato) → intish ∧ (non firmato, non firmato) → intish ∧ (doppia ?, il doppio?) → doppia ∧ (float float ?,?) → floatish
Tuttavia se uno di questi ha un denominatore zero, il risultato è double
, così sembra come il tipo può essere solo:
(doppia ?, il doppio?) → doppia
Cosa ci si aspetta che accada nel codice asm.js? Segue javascript e restituisce 0 o divide per zero produce un errore di runtime? Se segue javascript, perché è corretto che la digitazione sia errata? Se produce un errore di runtime, perché le specifiche non lo menzionano?
Quindi il principio generale qui è che asm.js eredita tutta la semantica di JS più tipi numerici extra e il suo fino ai compilatori che prendono di mira asm.js per implementare la semantica del loro linguaggio (ad es. Di C) sopra a quelli. 'INT_MIN/-1' non è definito in C, ma in asm.js dopo il troncamento è di nuovo INT_MIN (overflow con segno) e poiché il comportamento non è definito in C è ok? –
@FrancisAvila ci sono due compilatori: LLVM che genera codice asm.js da C/C++ e SpiderMonkey/V8 che genera assembly da JavaScript. SpiderMonkey ha una scorciatoia per il codice asm.js valido (OdinMonkey), ma quella scorciatoia deve ancora essere JavaScript valido al 100%. V8 fa qualcosa di simile con TurboFan, ma non convalida il sottoinsieme asm.js (solo "use asm" è sufficiente per attivarlo). LLVM deve generare il codice asm.js che segue le regole C, ed è per questo che 'INT_MIN/-1' può fare tutto ciò che vuole perché non è definito, quindi il risultato di JavaScript è buono come qualsiasi. SpiderMonkey/V8 non sanno nulla delle regole C! –