Post by Rainer WeikusatPost by Peter J. HolzerEin weiterer Grund wäre "existing code matters", aber das scheint mir
hier keine Rolle gespielt zu haben - denn da Overflow nun undefined war,
Das tatsaechlich Verhalten war vor der C-Norm unter keinen Umstaenden
in irgendeinem konkreten 'undefiniert' und sogar dass die C-Norm es als
'undefiniert' bezeichnet, ist das Ergebnis einer kreativen
Interpretation des Textes seitens der Leute, die es gerne so haben
wollten.
So kreativ muss man da nicht sein. Das wird explizit im Standard als
Beispiel angeführt:
| 3.4.3 undefined behavior
[...]
| EXAMPLE An example of undefined behavior is the behavior on integer
| overflow.
Nun sind Beispiele nicht normativ, und es könnte sein, dass sich
herausstellt, dass der normative Text des Standards das Verhalten bei
Integer-Overflow doch definiert. Das ist aber einigermaßen
unwahrscheinlich. C11 ist mittlerweile die 3. Version des Standards
(Errata nicht mitgerechnet) und das wäre auch schon anderen Leuten als
dem Herrn Weikusat aufgefallen.
Post by Rainer WeikusatDer Abschnitt ueber 'signed integer conversions' konstatiert
Otherwise, the new type is signed and the value cannot be
represented in it; either the result is implementation-defined
or an implementation-defined signal is raised.
Wir sprechen hier aber nicht über eine "conversion", sondern über
arithmetische Operationen.
Post by Rainer WeikusatDie 'undefiniert'-Theorie bezieht sich auf eine andere Stelle,
If an exceptional condition occurs during the evaluation of an
expression (that is, if the result is not mathematically defined
or not in the range of representable values for its type), the
behavior is undefined.
Genau.
Post by Rainer WeikusatJetzt ist der parenthetische Text aber eine Erlaeuterung dh eigentlich
eine Fussnote,
Das halte ich jetzt für "eine kreative Interpretation des Textes seitens
einer Person, die es so haben will".
Post by Rainer Weikusat'exceptional condition' wird im vollstaendigen Rest des Textes nicht
in der Bedeutung von 'Situation die irgendjemand fuer
aussergewoehnlich haelt'
Das ist eine typische Weikusat-Unterstellung.
Post by Rainer Weikusatbenutzt sondern als terminus technicus fuer 'hardware trap', vgl
The conversion of a floating constant shall not raise an
exceptional condition
Eher umgekehrt: Der Hardware-Trap ist eine mögliche Folge der
exceptional condition.
Post by Rainer Weikusatund 'es ist undefiniert' steht in offensichtlichem Widerspruch zu 'it is
implementation defined (or ....)'.
Es wäre ein Widerspruch, wenn es sich auf den gleichen Sachverhalt
beziehen würde, ja.
Post by Rainer WeikusatPost by Peter J. HolzerPost by Rainer Weikusatgibt es auch immer noch Leute, die Entschieden(!) davon ueberzeugt
sind, das modulo-Arithmetik ueberhaupt keine Existenzberechtigung
haben duerfte,
http://blog.regehr.org/archives/1154
denn sie produziert ja "falsche Ergebnisse"
Der schreibt nicht, dass Modulo-Arithmetik überhaupt keine
Existenzberechtigung hat, sondern dass Arithmetik mit Overflow der
default sein sollte.
Systems programming languages, such as Rust, Go, and D, have
default integer types that wrap. This is bad because unexpected
wrapping causes programs to produce incorrect results
Hier ist allerdings der Code falsch und nicht das Verhalten der
Maschine.
Das ist eine unsinnige Unterscheidung (gerade von Dir, der Du Dich
gerade darüber aufregst, dass Compiler nicht den Code erzeugen, den Du
von Ihnen erwartest). Das Programm produziert nicht den gewünschten
Output, also ist der Output falsch. Natürlich ist das (abgesehen von
Compiler-Bugs) primär das Problem des Programmierers, der halt die
Semantik seiner Programmiersprache nicht ausreichend verstanden bzw.
berücksichtigt hat. Wenn aber eine Programmiersprache eine Semantik hat,
die nicht zum Problemen passt, dann kann man durchaus sagen, dass diese
Programmiersprache für den gewählten Anwendungszweck "falsch" ist.
Er argumentiert, dass modulo-Arithmetik für int-Typen nur für wenige
Anwendungszwecke passend ist und daher der dafault in einer
Programmiersprache Trap-on-overflow sein sollte, was in weiterer Folge
heißt, dass die Hardware einen Weg zur Verfügung stellen sollte, das
effizient zu implementieren.
Ich bin etwas skeptisch bezüglich seiner Annahme, dass Overflow-Checks
teuer sind *und* durch eine Hardware-Implementation wesentlich billiger
würden. Benchmarks mit -ftrapv würden ersteres beantworten (bitte mit
clang, nicht mit gcc - die gcc-Implementation schaut sehr ineffizient
aus), für letzteres bräuchte man natürlich Silizium. x86 im 386er-Modus
hat noch die INTO-Instruktion. Ist »add; into« signifikant schneller als
»add; jo«? Wenn nein, ist into nur deshalb langsam, weil es keiner
verwendet, oder gibt es technische Gründe warum das langsam sein muss?
Post by Rainer WeikusatPost by Peter J. HolzerWenn Du Code schreibst, der in C undefiniertes Verhalten hat, und gerne
definiertes Verhalten hättest, solltest Du vielleicht eine andere
Programmiersprache wählen. C ist nun mal die "the compiler will get its
revenge"-Sprache.
Was Du ueber micht glauben oder schreiben moechtest ist an dieser Stelle
ohne Belang: Es ist meiner Ansicht nach nicht Aufgabe eines
Compilers, Programmierer daran zu hindern, unportablen Code zu
schreiben, falls sie das aus irgendeinem Grund moechten.
Sie hindern dich eh nicht daran. Du musst halt dann nur damit leben,
dass Dein unportabler Code nicht auf allen Plattformen wie gewünscht
funktioniert - wenn Du Pech hast, auch nicht auf den Plattformen, an
denen Du interessiert bist.
hp
--
_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | ***@hjp.at | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel