ja, aber ich bin so ein leser, der manche Worte - vorallem Namen nie ganz liest, und einfach nur vom Aussehen her kennt. Array war für mich dann immer area - ich hab's ja vorher auch nie ausgesprochen.
zum Programmieren: Ich wollte meinem Bruder Programmieren lernen (er wollte auch). Ich hab dann in einigen Programmierer-Foren herumgefragt, was da das gescheiteste ist. Basic wollte ich aus Prinzip net. C ist zach. Dann sind wir auf Delphi gestoßen. Vermutlich war's das falsche Buch - aber da ist's am Anfang nur um zusammenklicken von irgendwelchen Forms gegangen. Irgendwie hat er dann das Interesse verloren und hat - obwohl schon 100, 200 seiten vom buch durchgearbeitet - noch kein If oder irgendwas gemacht. In der Schule müssen's C lernen - Consolen-Geschichte. Auch wenn's im ersten Eindruck langweilig ist -man sieht halt schneller was man *selber* gemacht hat.
Ich Programmiere jetzt eine zeitlang in C# in der Firma und habe schon verdammt vielen Programmiersprachen. C# ist echt voll geil. Nach jahrelangem Webprogrammieren mit Perl, PHP und klassischem ASP ist es sooo cool wieder mal so richtig objektorientiert programmieren zu können. Mit C(++) bin ich irgendwie nich so richtig zum Objektorientierten Programmieren gekommen.
Ich muss sagen, dass ich es schon etwas übertreibe, was Optimierung auf Geschwindigkeit betrifft - da ich normalerweise ganz gut sagen kann, was der Prozessor macht, wenn ich dieses und jenes schreibe.
Ich glaube z.B. dass vielen Programmierern, die nie in C oder Assembler programmiert haben net wissen, wie aufwändig String-Manipulationen sind. In der Zeit in der ein String der Länge n in Großbuchstaben umgewandelt wird, kann man schätzungsweise mindestens 4 x n Integer-Berechnungen, Sprünge, Entscheidungen (if) etc. durchführen.
oder ein anderes Beispiel: Der Code schaut ja im ersten Moment nicht spektakulär aus.
int i = 100000;
int j = 2000000 + i; // ein Taktzyklus
// integers können direkt in die 32-Bit Prozessor-Register gespeichert werden. Oft werden die Variablen vom Compiler komplett wegoptimiert.
string str = "a";
str = str + "b";
// das können extrem viele Taktzyklen werden. String wird länger, passt nicht mehr in den speicherbereich => neuer Speicherbereich reservierern, dazu muss eventuell vom BS ein neuer Speicherbereihc reserviert werden. Der ursprüngliche String muss in den neuen String reinkopiert werden, das was angehängt wird dann ebenfalls. C-basierte Strings (so wie sie der Prozesser intern verwendet) haben keinen Längenzähler. Der String muss also immer von vorne bis hinten durchgecheckt werden, wie lange er ist. (2n Taktzyklen). Ich nehme allerdings an, dass die meisten String-Klassen Längezähler mitspeichern (Pascal tat das schon immer). Allerdings müssen die dann wieder extra kopiert und berechnet werden.
.NET hat z.B. eine eigene String-Builder Klasse, die vorallem bei vielen Concatenationen verwendet werden soll, da sie wissen wie furchtbar langsam sowas ist:
str = "Seite " + strTitel + " " + i.ToString() ....;
bei jedem + wird das von mir oben erklärte ausgeführt. Die Stringbuilder-Klasse reserviert vorher schon genügend Speicherplatz und spart sich dann meist das Speicherplatzreservieren bei jedem Anfügen.
Ganz schlimm ist es ja bei solchen Sprachen wie das alte Basic, wo es keine echten Typen gab. Schreib mal in C oder in Assembler eine Funktion, die einen String in eine Zahl umwandelt. Dann weiß man was das jedesmal kostet, wenn man mit Datentypen nicht sauber umgeht. Da sind bei einer einzigen Anweisung gleich mal 100erte Taktzyklen Unterschied zwischen einer Typ-basierten Sprache und einer typlosen.
Und wenn ich dann noch bedenke, wieviel Bereichsüberprüfungen Visual Basic gemacht hat, dann wird einem klar, dass VB pro Anweisung viel, viel mehr Taktzyklen braucht, als C.
Aber das neue .NET (inkl. VB) ist eh auch typbasiert. Das bringt schon verdammt viel. Bereichsüberprüfungen sind schon auch noch drinnen, aber nicht mehr so arg.
Umgekehrt sind viele der Sicherheitslücken dadurch bedingt, das C einfach keine Bereichsüberprüfungen hat. z.B. der typische Buffer-Overflow: Ich reserviere mir ein Array mit 256 Einträgen. Sprachen wie VB oder auch .NET überprüfen bei einem Zugriff auf das Array, ob du eh nicht das - 1 oder das 257. abfragst. Wenn ja, bekommst an Fehler. D.h. diese Sprachen fügen bei jeder Abfrage einen Befehl ein, ob der Index eh noch passt. Damit kann man natürlich keine Geschwindigkeitskritischen Sachen machen. Z.B. Treiber (Netzwerk, Grafik, Sound, ...) oder sowas.
In C gibt's sowas nicht. Wenn du sagst, ich will das 257. Element von meinen 256, dann erhältst du einen Speicherbereich, der gar nicht zu dem Array gehört, sondern den dahinter. Angenommen an dieser Stelle (direkt nach dem Array) steht ein Code-Bereich - also ein Bereich, den der Prozessor irgendwann mal ausführt. Dann könnte ich da z.B. meinen eigenen Virus/Wurm-Code reinschreiben.
Konkret: Protokoll ist so definiert, dass bestimmte Daten nur 256 Bytes lang werden dürfen. Schlampig programmiert, kein Überlauf abgefragt, und irgendein Hacker schickt einfach nicht daten, die nur 256 Bytes groß sind, sonder eben größere, wobei nach den 256 eben der böse Code drinnen steht. Die Daten werden in Gutem glauben in den Buffer geschrieben, sind aber beim 256. nicht aus, sondern gehen weiter. Die Daten überschreiben einfach den Code der normal ausgeführt werden würde.
Das war quasi ein primitives Beispiel von am Buffer-Overflow.
Also momentan ist mein Favorit sicher C# für alles was schnell gehen muss, aber einfach zu Implementieren sein soll. Allerdings brauch ich es sicher von Zeit zu Zeit hardcore-C zu programmieren. Des ist noch viel mehr Kick.
![[Bild: icon_wink.gif]](https://www.downhill-board.com/images/graemlins/icon_wink.gif)
Aber mit C# kommst schneller zum Ziel. Java kenne ich leider nicht und außer JSP/Servlet Webseiten habe ich noch keine g'scheiten Java-Programme gesehen. (langsam, absturzgefährdet und nicht Windows-konform). Die Rangers Seiten werden ich weiterhin mit PHP programmieren - obwohl ich schon einiges vermisse im Vergleich zu C#. Aber C# ist halt kommerziell und man ist momentan noch total von Microsoft abhängig. Es gibt allerdings schon .NET Open-Source Ports.
Aber ich hab schon mehrmals geträumt so a Forum wie dieses hier in C zu schreiben, das großteils im Speicher läuft. Es würde zig mal mehr (wenn net 100 mal) mehr gleichzeitige Besucher auf dem gleichen Server schaffen...
Aber da würde man sicher mal ein, zwei Jahre sitzen...