Aloha ;)
Zum Zweiten Teil:
Die Spezifikation von asm.js verlässt sich darauf
Die verlinkte asm.js sagt von sich selbst, daß sie deprecated sei …
Ich hab aber keine Zeit, asm.js mit WebAssembly zu vergleichen, um rauszufinden, ob es Sinn ergibt, den Link auf asm.js durch einen auf WebAssembly zu ersetzen …
Ich hab jetzt keine mega krasse Ahnung davon, aber irgendwie liest sich für mich auch die Begründung mit asm.js irgendwie quatschig. Zumindest schreiben wir:
Der unäre +-Operator kann für BigInt-Werte nicht verwendet werden. Für diesen Operator ist spezifiziert, dass er einen Number-Wert erzeugt. Die Spezifikation von asm.js verlässt sich darauf und würde verletzt, wenn in der Variablen a ein BigInt Wert stünde und +a ein BigInt liefert.
Und der verlinkte asm.js-Artikel der MDN sagt:
It is a very small, strict subset of JavaScript that only allows things like while, if, numbers, top-level named functions, and other simple constructs. It does not allow objects, strings, closures, and basically anything that requires heap allocation.
Hallo? asm.js erlaubt keine Objekte oder andere Dinge, die heap allocation brauchen, also auch keine BigInt-Objekte, oder was übersehe ich hier? Und wenn asm.js gar keine BigInt-Objekte erlaubt, warum begründen wir dann das Verhalten des unären +-Operators in Bezug auf BigInts mit asm.js, und wenn das für den unären +-Operator eine valide Begründung wäre, warum dann nicht auch für den normalen +-Operator?
Irgendwie habe ich das Gefühl, dass diese Begründung von vornherein nicht so sinnvoll war, oder ich verstehe sie nicht richtig (beides möglich). In zweiterem Fall braucht es eine erklärende Umformulierung, in ersterem Fall könnte sie auch weg. Das stünde für mich da an erster Stelle, vor der Frage, ob man jetzt stattdessen auf WebAssembly verlinkt.
Ich habe mal noch in einem Draft der BigInt-Erfinder nachgelesen (siehe Unterpunkt 4.2.2 und dort den Block „Motivation“). Dort wird auch auf asm.js verwiesen, der Link geht in die eigene Readme-Datei des Proposals - nur ist dort der entsprechende Absatz schon gelöscht worden.
Um den Absatz wiederzufinden, kann man in der History zurückgehen und findet dort die Begründung:
Don't break asm.js
Although this proposal introduces operator overloading, it throws in any of the cases that asm.js depends on for setting up type checking. asm.js relies on a few identies:
Unary + followed by an expression is always either a Number, or results in throwing. For this reason, unfortunately, + on a BigInt needs to throw, rather than being symmetrical with + on Number: Otherwise, previosly "type-declared" asm.js code would now be polymorphic.
[...]
This proposal makes special allowances to make BigInt usable in asm.js code to build support for 64-bit integers, by including the standard library functions BigInt.asUintN and BigInt.asIntN as well as BigUint64Array and BigInt64Array. The operator overloading in this proposal should not complicate the asm.js model: asm.js already treats operators as "overloaded" between floats, doubles, and signed and unsigned integers.
Interessant ist, dass diese Begründung und ein zugehöriges Beispiel mittlerweile aus dem Readme-Dokument gestrichen wurde (mit Verweis „BigInt will not be added to asm.js; use WebAssembly instead.“), dass das Proposal zu BigInt aber den unären +-Operator immer noch nicht enthält, mittlerweile ohne sinnvolle Begrüdung.
Das alles liest sich für mich wie „wir haben das ursprünglich so gebaut, um asm.js nicht zu verletzen, haben jetzt aber festgestellt, dass wir asm.js gar nicht unterstützen werden weil ist eh deprecated, aber die Entscheidung mit dem unären + können wir jetzt erstmal trotzdem nicht rückgängig machen“.
Vielleicht sollten wir das dann auch so schreiben? Z.B.:
Der unäre +-Operator kann für BigInt-Werte nicht verwendet werden. Für diesen Operator ist spezifiziert, dass er einen Number-Wert erzeugt oder eine Exception wirft. Ursprünglich wäre das ein Problem im Zusammenhang mit dem mittlerweile veralteten asm.js gewesen, das sich auf dieses Verhalten verlässt. Ob nun, da asm.js nicht weiter unterstützt wird, irgendwann die Unterstützung des unären +-Operators für BigInt-Werte kommen wird, ist noch unklar.
Grüße,
RIDER