Re: Das ist kein Bug Kategorie: Programmierung (von Dietmar Weickert - 22.03.2004 13:51) | ||
Als Antwort auf Re: Das ist kein Bug von Olaf - 21.03.2004 9:50 | ||
| ||
Hallo Olaf! > da C2 ja eine getypte Sprache ist könnte der Compiler auch mal auf die linke Seite schauen, > wie es "richtige" Programmiersprachen, wie z.B. Java tun. ... Deine Einteilung in richtige und falsche Programmiersprachen läuft hier ziemlich ins Leere. Auch dass du C und Java diesbezüglich vergleichst, lässt auch auf wenig Kenntnis bei Programmiersprachen und Compilern schlie�en. C wurde entwickelt, um den verschiedensten Assembler-Sprachen eine strukturierte und standardisierte Programmiersprache gegenüber zu stellen. Aus diesem Grund ist C immer maschinennah und hängt im Verhalten von der Wortbreite des Prozessors ab. Entsprechend verhalten sich C-Programme unterschiedlich, je nachdem, ob sie auf 16-, 32- oder 64-Bit-Prozessoren (um nur die gängigsten heraus zu greifen) laufen. Dies trifft ganz besonders auf Schiebe-Operatoren zu, und der hat in C (Operator << bzw. >>) den Typ des linken Operanden, unabhängig vom rechten. Wenn ich mich auf einem 16-Bit-Prozessor befinde, und ich programmiere die Expression 1<<25, dann erhalte ich - ja nach Prozessor - 0 oder (-1). Will ich als Ergebnistyp long erzwingen, benötige ich entweder eine die cast ((long int) 1)<<25 oder eine long-Konstante: 1L<<25. Java wurde entwickelt, um - auf den Konzepten von C++ aufbauend - eine Programmiersprache zu definieren, deren Programme sich auf allen Plattformen immer gleich verhalten. Deshalb laufen Java-Programme auch nie direkt auf einem Prozessor sondern in einer virtuellen 32-Bit-Maschine, die die Umsetzung für den jeweiligen Prozessor vornimmt. Hier gibt es auch den einzigen Konnex zur VMC der C-Control II, nur handelt es sich bei der VMC eben um eine virtuelle 16-Bit-Maschine. Abgesehen davon ist mir kein einziger Compiler bekannt, der sich bei der Auswertung von Operanden danach richtet, welchen Typ die Variable hat, die das Ergebnis des gesamten Ausdruckes erhält. Alle Compiler werten zuerst den Ausdruck aus, und erst im Zuge der Zuweisung kommen - falls notwendig - neurliche Typ-Umwandlungen zum tragen, um die Typen von Variable und Ausdruck mit einander kompatibel zu machen. Man kann also wirklich nur zusammen fassen, dass die VMC korrekt und den Spezifikationen entsprechend arbeitet. Alle anderen Ergebnisse wären bei einer 16-Bit-VM sogar als Bug zu interpretieren. Beste Grü�e, Dietmar. | ||
Antwort schreiben Antworten: |