|
vlc
Anmeldungsdatum: 5. Dezember 2007
Beiträge: 201
|
Erunno schrieb: vlc Hier ein gültiges Beispiel dieses Codes; und der Compiler warnt nicht!
Kommt auch keine Warnung, wenn man sich alle Warnungen anzeigen lässt mit dem Schalter -Wall?
$ gcc -pedantic -o t t.c
$ gcc -Wall -o t t.c
t.c: In function `copy':
t.c:5: warning: suggest parentheses around assignment used as truth value Die Warnung kann ich allerdings mit der "sinnvollsten" aller Klammern umgehen: $ head -n 6 t.c
#include <stdio.h>
void copy(const char* a, char* b)
{
while ((*b++ = *a++));
}
$ gcc -Wall -o t t.c
$
|
|
Gon
Anmeldungsdatum: 2. September 2007
Beiträge: 161
|
Mit der Klammer machst du aber deutlich, dass du bewusst eine Zuweisung in einer While-Schleife willst und nicht nur aus versehen "=" statt "==" geschrieben hast.
Da sehe ich kein Problem.
|
|
DocBriggs
Anmeldungsdatum: 7. April 2008
Beiträge: 335
|
Das Problem ist, dass wir das hier auf einen absolut simplen Fall begrenzen. Nehmen wir mal ein großes Programm, welches einfach nicht das macht, was es soll... Daher sagte ich, ich würde lieber Java-Code warten, als solchen Rotz.
|
|
vlc
Anmeldungsdatum: 5. Dezember 2007
Beiträge: 201
|
Ich arbeite mit C in der embedded Software Entwicklung und C geht mir ehrlich gesagt ziemlich auf den Keks. Gefühlte 90% aller schwierigen Probleme (mehr als einen Tag Fehlersuche) sind entweder fehlerhafte Typecasts und amoklaufende Pointer. Java fällt mangels Arbeitsspeicher / Prozessorleistung aus. Mein Favorit ist Ada (für embedded).
|
|
vlc
Anmeldungsdatum: 5. Dezember 2007
Beiträge: 201
|
Hier ein weiterer meiner Lieblinge. Habe vor ein paar Monaten fast zwei Tage gebraucht, um das Ding zu finden: $ cat t.c
#include <stdio.h>
int main()
{
int i[3];
i[0] = 0;
i[1] = 1;
i[3] = 2;
printf("%i\n", i[0]);
printf("%i\n", i[1]);
printf("%i\n", i[2]);
return 0;
}
$ gcc -Wall -pedantic -o t t.c
$ ./t
0
1
134513691
$ War schon seit ca. 4 Jahren im Code und ist erst vor kurzem aufgefallen, nachdem sich die Linkorder geändert hat und bei i[2] ein ungültiger Wert stand. Ist mir bis heute schleierhaft, wieso das dem Compiler nicht auffällt.
|
|
DocBriggs
Anmeldungsdatum: 7. April 2008
Beiträge: 335
|
Array überladen 😬 *hrhr* Aber es müsste einem C-Compiler auffallen, oder bin ich da falsch informiert?
|
|
Gon
Anmeldungsdatum: 2. September 2007
Beiträge: 161
|
War schon seit ca. 4 Jahren im Code und ist erst vor kurzem aufgefallen, nachdem sich die Linkorder geändert hat und bei i[2] ein ungültiger Wert stand. Ist mir bis heute schleierhaft, wieso das dem Compiler nicht auffällt.
Fällt doch dem Java-Compiler auch nicht auf?
int[] i = new int[3];
i[0] = 0;
i[1] = 1;
i[3] = 2;
Lässt sich einwandfrei kompilieren. Führt natürlich direkt zu einer Exception beim Start. Übrigens ist das hier ja auch kein Vergleich von Java vs C++, sondern es geht um "Java ist crap". Nur weil man die Schwächen einer anderen Sprache gezielt darstellt, rechtfertigt das nicht Java's Schwächen. Gruß,
Gon
|
|
DocBriggs
Anmeldungsdatum: 7. April 2008
Beiträge: 335
|
Stimmt schon, aber mit der Exception hätte der gute Mann nicht 2 Tage für die Fehlersuche gebraucht. Der Fehler tritt zur Laufzeit auf, wird aber angezeigt. Bei SWT ist das z.B. Gold wert. Ich hab bis jetzt auch noch nichts Stichhaltiges gehört, dass Java Crap ist.
|
|
BodomBeachTerror
Anmeldungsdatum: 24. März 2008
Beiträge: 788
|
DocBriggs schrieb: Array überladen 😬 *hrhr* Aber es müsste einem C-Compiler auffallen, oder bin ich da falsch informiert?
Nein. Das ist dem egal, aber es wird in jedem Tutorial, Buch oder ähnlichem ausdrücklich gesagt, dass man darauf achten muss!!
|
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4735
|
@DocBriggs: Java hat eine relativ geringe Ausdruckststärke, sonst müsste man für einfache Sachen nicht so viel tippen. Ausdruckststärke ist etwas anderes als Mächtigkeit. @derMani: Alles ist ein Objekt bedeutet nicht, dass man Wrapperklassen verwenden muss, für Sachen die in Java eben kein Objekt sind. Oder sich mit der Reflection-API Stellvertreter für Klassen und Methoden erzeugen muss. Es gibt Sprachen in denen diese Dinge von Haus aus schon Objekte sind. Und OOP bedeutet auch nicht, dass man alles in Klassen stecken muss. Nicht einmal, dass es Klassen geben muss. Das heisst schliesslich objektorientiert und nicht klassenorientiert. Was ist so speziell an primitiven Datentypen, dass man sie nicht als Objekte sehen kann, sondern ihnen in der Sprache eine Extrawurst braten muss? Bevor es Autoboxing gab, war das teilweise nervig und mit Autoboxing gibt's immer noch ein paar skurrile Randfälle. Und "Performance" lasse ich nicht gelten, denn das man die Typen in der Sprache wie Objekte behandeln kann, bedeutet nicht, dass der Compiler keinen speziellen Code für "maschinennahe" Datentypen generieren darf. @BodomBeachTerror: Windows ist auch verbreitet und beliebt. Das sagt nichts über Qualität aus. 😉 @vlc: Den Fehler kann man aber mit entsprechenden Bibliotheken aufspüren. Valgrind findet zwar nicht die Zuweisung, aber den Zugriff auf i[2], das ja einen nicht initialisierten Wert enthält: ==4481== Use of uninitialised value of size 4
==4481== at 0x40827FB: (within /lib/tls/i686/cmov/libc-2.6.1.so)
==4481== by 0x4084799: vfprintf (in /lib/tls/i686/cmov/libc-2.6.1.so)
==4481== by 0x408C942: printf (in /lib/tls/i686/cmov/libc-2.6.1.so)
==4481== by 0x80483D2: main (test.c:11) Und am Ende der Funktion fällt auch auf, das sich der alte Stapelzeiger-Wert auf dem Stapel unerwartet verändert hat: ==4481== Warning: client switching stacks? SP change: 0xBEF75668 --> 0xFFFFFFFE
|
|
BodomBeachTerror
Anmeldungsdatum: 24. März 2008
Beiträge: 788
|
@BodomBeachTerror: Windows ist auch verbreitet und beliebt. Das sagt nichts über Qualität aus. 😉
Naja, ich meine Windows hat Qualität, es funktioniert doch oder nicht?
Natürlich gibt es manche Sachen die funktionieren nicht, aber das ist bei jedem OS so.
|
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4735
|
Insofern hat Java auch Qualität. Es funktioniert. Eine prima Sprache für "discipline & bondage"-Fans und etwas, was man "Codemonkeys" in Indien zum Umsetzen von Vorgaben geben kann, ohne dass sie viel kaputt machen können. Aber eine Beleidigung für jeden kreativen, selbstständig denkenden Programmierer. 😈
|
|
vlc
Anmeldungsdatum: 5. Dezember 2007
Beiträge: 201
|
Marc 'BlackJack' Rintsch schrieb: Insofern hat Java auch Qualität. Es funktioniert. Eine prima Sprache für "discipline & bondage"-Fans und etwas, was man "Codemonkeys" in Indien zum Umsetzen von Vorgaben geben kann, ohne dass sie viel kaputt machen können. Aber eine Beleidigung für jeden kreativen, selbstständig denkenden Programmierer. 😈
Also in den Firmen, in denen ich bisher gearbeitet habe, waren immer selbsständig denkende Programmierer beschäftigt. Einige waren sogar kreativ. Das hat trotzdem nicht verhindert, dass solche Fehler im Code aufgetaucht sind. Einfach nur schreiben "don't do that" reicht nicht. Die Sprache muss da mithelfen. Schließlich und endlich heißt Fehlersuche Zeit zu verlieren und damit steigende Projektkosten. Ganz nebenbei: Ada entdeckt das Problem sofort 😀 $ cat t.adb
with Ada.Text_Io;
use Ada.Text_Io;
procedure T is
I : array (1..3) of integer;
begin
I(1) := 1;
I(2) := 2;
I(4) := 3;
Put_Line("I(1) = " & I(1)'Img);
Put_Line("I(2) = " & I(2)'Img);
Put_Line("I(3) = " & I(3)'Img);
end T;
$ gnatmake t.adb
gcc-4.2 -c t.adb
t.adb:9:06: warning: value not in range of subtype of "Standard.Integer" defined at line 5
t.adb:9:06: warning: "Constraint_Error" will be raised at run time
gnatbind -x t.ali
gnatlink t.ali
$ ./t
raised CONSTRAINT_ERROR : t.adb:9 range check failed
|
|
schlonz
Anmeldungsdatum: 30. November 2005
Beiträge: 294
|
DasIch schrieb: Das sind halt unterschiedliche Ansätze "Der Programmierer ist doof und muss geschützt werden" vs. "Der Programmierer >weiß was er tut", ich bevorzuge letzteren.
Hello World schrieb: Ein kompetenter Programmierer weiß was er tut und braucht keine Programmiersprache, die ihm das vorschreibt.
Ich glaube Ihr schiesst beide am eigentlichen Ziel vorbei.
Es geht nicht darum, den Programmiere vor seinem eigenen Code zu schützen. Man traut Euch zu, dass Ihr für Euch lesbaren Code schreiben könnt.
Motivation zur Beschneidung der Sprache ist vielmehr die Einsicht, dass ein Programmierer in seinem Leben mehr Zeit mit dem Lesen und Warten fremden Codes, als mit dem Schreiben eigenens verbringt. Und auf die Hirnfürze seiner Vorgänger hat man eben keinen Einfluss.
|
|
DasIch
Anmeldungsdatum: 2. November 2005
Beiträge: 1130
|
schlonz schrieb: Man traut Euch zu, dass Ihr für Euch lesbaren Code schreiben könnt.
Motivation zur Beschneidung der Sprache ist vielmehr die Einsicht, dass ein Programmierer in seinem Leben mehr Zeit mit dem Lesen und Warten fremden Codes, als mit dem Schreiben eigenens verbringt.
Darauf wird auch bei Python großen wert gelegt. Trotzdem ist alles ein Objekt, es gibt Properties, Operator Überladung usw. genauso wie in anderen Sprachen. Irgendwie scheint es doch Menschen zu geben die damit sehr gut leben können. Boilerplate Code macht Code auch nicht lesbarer.
|