{"id":6051,"date":"2012-03-12T00:16:59","date_gmt":"2012-03-11T23:16:59","guid":{"rendered":"http:\/\/www.bernd-leitenberger.de\/blog\/?p=6051"},"modified":"2012-03-12T09:10:04","modified_gmt":"2012-03-12T08:10:04","slug":"die-seuche-c","status":"publish","type":"post","link":"https:\/\/www.bernd-leitenberger.de\/blog\/2012\/03\/12\/die-seuche-c\/","title":{"rendered":"Die Seuche &#8222;C&#8220;"},"content":{"rendered":"<p>Zeit mich mal wieder unbeliebt zu machen, oder besser gesagt zu provozieren. Es geht um die f&uuml;r mich &uuml;belste Programmiersprache: &#8222;C&#8220;. Warum ist C so &uuml;bel? Nun man k&ouml;nnte es auf den Punkt bringen, das hat dieser <a href=\"http:\/\/www.bernd-leitenberger.de\/echte-programmierer.shtml\" target=\"_blank\">Aufsatz <\/a>getan, der nicht von mir stammt, aber den ich &uuml;bernommen habe. Fangen wir mal an mit einigen Mythen, die immer genannt werden, wenn es um die Vorteile von &#8222;C&#8220; geht:<\/p>\n<p>&#8222;C ist maschinennah und daher besonders gut geeignet f&uuml;r die Programmierung von hardwarenahen Programmen wie Betriebssystemen.&#8220;<\/p>\n<p>Dieser Mythos mag in den siebziger Jahren gegolten haben, aber danach nicht mehr. Das hat nun auch weniger mit der Sprache zu tun, sondern mit dem Compiler, der den Code erzeugt. F&uuml;r alle, die nicht so mit Assembler vertraut sind: die meisten Prozessoren haben Befehle die bei bestimmten Situationen geeignet sind und schneller ausgef&uuml;hrt werden als andere, sozusagen Spezialf&auml;lle. So ver&auml;ndern die Befehle INC und DEC einen Operanden um jeweils 1 und das Schieben eines Registers entspricht einer Division oder Multiplikation mit 2. Diese Operationen gehen schneller als eine Addition\/Subtraktion oder Division\/Multiplikation.<!--more--><\/p>\n<p>Derartige Operationen gibt es in C. Der Vorteil: Es ist so ein einfacher und effizienter Compiler erstellbar, da praktisch eine Arbeit des Compilers, n&auml;mlich den optimalen Code zu erstellen, auf den Programmierer ausgelagert wurde. Doch das ist keine Eigenschaft der Sprache, denn nat&uuml;rlich hindert niemand den Ersteller eines Compilers daran aus einer Instruktion wie a=a+1 den gleichen Code wie bei a++ zu generieren. Und das funktioniert nicht nur bei C so. Schon als in den achtziger Jahren Turbo Pascal herauskam schlug es viele etablierte C-Compiler, weil dieser Compiler so effizient war. Nur eben nicht mit der Sprache C, sondern Pascal.<\/p>\n<p>Mit der Maschinenn&auml;he ist aber dann schon Schluss, denn wirklich maschinenah kann keine Hochsprache sein. Sie soll ja auf unterschiedlichen Prozessoren laufen. Erweiterungen, die es in C aber auch anderen Sprachen gibt, um Assemblercode einzuf&uuml;gen oder Betriebssystemroutinen aufzurufen sind nicht Bestandteil des Standards.<\/p>\n<p>Mit der Geschwindigkeit von C ist es auch so, dass sie nicht an der Sprache fest machbar ist, sondern am Compiler. Microsoft reklamiert f&uuml;r sein .NET dass es unter Umst&auml;nden schneller als C ist, weil diese Sprache erst zur Laufzeit &uuml;bersetzt werden soll und dann die Befehle nutzt die der Prozessor unterst&uuml;tzt, w&auml;hrend ein kompiliertes Programm sich immer an den kleinsten Standard halten muss. Wie ich schon erw&auml;hnte zeigte auch schon die Vergangenheit, dass andere Sprachen C leicht in Geschwindigkeit schlagen, wenn der Compiler entsprechend gut ist.<\/p>\n<p>Diesen heute praktisch nicht mehr vorhandenen &#8222;Vorteilen&#8220; stehen etliche Nachteile gegen&uuml;ber.<\/p>\n<p>Das erste ist, das C recht schlampig ausgelegt wurde, damit man wenig Aufwand mit dem Compiler hat. Es wurde auf fundamentale Sicherheits&uuml;berpr&uuml;fungen verzichtet, wichtige Funktionen wurden durch einfache, aber fehleranf&auml;llige L&ouml;sungen ersetzt und Verantwortung auf den Programmierer ausgelagert. Einige Beispiele:<\/p>\n<p>Es ist in C, anders als in anderen Programmiersprachen bei if eine Zuweisung erlaubt also &#8222;if (c=5) &#8220; anstatt &#8222;if (c==5)&#8220;. Das ist &auml;u&szlig;erst fehlertr&auml;chtig vor allem weil jeder von der Mathematik ja noch das &#8222;=&#8220; als Vergleichsoperator kennt.<\/p>\n<p>Die String-Bibliothek in C lagert praktisch die gesamte Verantwortung auf den Programmierer aus, denn es ist eigentlich keine Stringbibliothek: Es ist nur eine Konvention, dass ein String ein dynamisches Array ist der mit einer bin&auml;ren Null endet. Anders als wie bei vielen Ger&uuml;chten geglaubt wird, ist es auch nicht effizient. Denn bei allen Operationen die mit einem String n&ouml;tig sind, muss man Zeichenweise das Array durchlaufen bis man die bin&auml;re Null findet. Ein System dass die L&auml;nge vor dem ersten Zeichen speichert w&auml;re viel effizienter. Das erlaubt es Blockkopier\/Verschiebebefehle von Prozessoren zu benutzen, die es schon bei 8-Bittern gibt.<\/p>\n<p>Der Pr&auml;prozessor ist im Prinzip eine programmgesteuerte Suchen\/Ersetzfunktion. Ich bin beim Suchen\/Ersetzen in meinem Quelltext sehr vorsichtig und nun soll ich das machen mit einem Text denn ich nicht mal, sondern nur der Compiler zu Gesicht bekommt? Vergiss es!<\/p>\n<p>Das wohl problematischste und inzwischen auch allgemein bekannteste Sicherheitsl&uuml;cke von C: Der Buffer-Overflow. Er entsteht dadurch das Strings einer Routine nicht als Wertparameter, sondern als Zeiger &uuml;bergeben werden. Die Routine muss dann in eine lokalen Variablen den String kopieren und wenn der Speicher hier kleiner als der String ist, dann &uuml;berschreibt der String andere Variablen und die danach folgende R&uuml;cksprungadresse. Das wird ausgenutzt um verschiedene &uuml;ber das Internet erreichbare Dienste zu missbrauchen um Schadcode in Systeme einzuschleusen. So was ist nicht m&ouml;glich bei Systemen die eine andere Stringverarbeitung haben wie z.B. Felder vor dem ersten Zeichen in denen die L&auml;nge steht und die es auch erlauben Strings anders zu &uuml;bergeben.<\/p>\n<p>Die Frage ist wie immer: was n&uuml;tzt es und was bringt es? Nat&uuml;rlich ist es von Vorteil, manchmal auf die niedrigste Ebene einer Maschine zu kommen. Doch dann halte ich es f&uuml;r besser eine definierte Schnittstelle zu Assembler einzubauen, weil dann der Benutzer wei&szlig; was er tut. So hat man eine Hochsprache kombiniert mit der Fehleranf&auml;lligkeit von Assembler. Der Nutzen f&uuml;r alle die nicht in Assembler programmieren wollen oder auf Betriebssystemebene gehen wollen ist aber nicht gegeben, sie m&uuml;ssen nur mit den Nachteilen leben. Mein fr&uuml;herer Informatikprofessor hat mal C als &#8222;Superassembler&#8220; bezeichnet und das trifft es ganz gut. Nur ist leider C nicht so au&szlig;er Mode gekommen wie Assembler&#8230;.<\/p>\n<p>Das verr&uuml;ckte ist, dass es einige Leute gibt, die so was lieben und die offensichtlich Einfluss haben, sonst h&auml;tte sich die Sprache nicht durchgesetzt. Das ist ein Kontrast zum t&auml;glichen Leben, wo wir in der Regel Sicherheit haben wollen und Leute die bewusst drauf verzichten, als Freaks ansehen. Also wenn jemand Fahrrad ohne Bremsen f&auml;hrt oder ein Auto ohne Airbag, Gurte und Knautschzone herstellt, dann w&uuml;rde das wenig Verst&auml;ndnis bei den meisten anderen Leuten hervorrufen. 100 Stunden pro Wochen Programmierer mit Vorliebe f&uuml;r Pizza, Coke und Abneigung gegen Duschen und soziale Bindungen, also die die in Firmen rasch aufsteigen, scheinen aber genau das zu lieben und machen so Karriere und f&uuml;hren zum Einsatz von C den sie nun dank ihres Einflusses unternehmensweit durchsetzen k&ouml;nnen.<\/p>\n<p>Okay, inzwischen hat man vieles entsch&auml;rft. Compiler haben nun standardm&auml;&szlig;ig einige Optionen mit denen man die meisten &Uuml;bel von C begegnen kann, aktiviert. Will man eigentlich standardkonforme Programme erstellen, muss man sie erst wieder deaktivieren. C hat sich auch weiter entwickelt, so diese unselige Definitionen der Funktionsk&ouml;pfe im K&amp;R Standard, die eigentlich keiner so richtig verstanden hat.<\/p>\n<p>Das Problem ist nat&uuml;rlich das so ein System wie magisch alle Freaks anzieht und die dann darauf aufbauend noch schlimmere entwickeln, wie z.B. C++ (C erweitert um die Unverst&auml;ndlichkeit und Komplexheit), Perl (f&uuml;r alle die C Quelltexte zu verst&auml;ndlich und die Syntax zu leicht merkbar finden) oder Linux (ohne zwanzig Kommandozeilenoptionen f&uuml;r jedes Programm, die man sich nicht merken kann, nur halb so lustig) oder regul&auml;re Ausdr&uuml;cke (so einfach, dass es vom Entwickler ein ganzes Buch dar&uuml;ber gibt und nat&uuml;rlich ist die Standardeinstellung jedes RegEx Systems &#8222;gierig&#8220;, obwohl die Benutzer es meistens &#8222;nicht gierig&#8220; haben wollen.<\/p>\n<p>Ich denke anders: Entwicklungssysteme sollen mir das Leben einfach machen. Ich m&ouml;chte schnell Programme entwickeln und nicht dauernd &uuml;ber Fehler stolpern, die man abfangen kann. Nennt mich Warmduscher oder Bequemlichkeitsfreak, aber ich bin zumindest kein Masochist. Wenn ich dran denke welche Probleme schon meine Studis mit einer Programmiersprache mit doppelten Airbags haben, ich wage nicht dran zu denken was passiert wenn die in C programmieren m&uuml;ssten&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zeit mich mal wieder unbeliebt zu machen, oder besser gesagt zu provozieren. Es geht um die f&uuml;r mich &uuml;belste Programmiersprache: &#8222;C&#8220;. Warum ist C so &uuml;bel? Nun man k&ouml;nnte es auf den Punkt bringen, das hat dieser Aufsatz getan, der nicht von mir stammt, aber den ich &uuml;bernommen habe. Fangen wir mal an mit einigen [&hellip;]<\/p>\n","protected":false},"author":169,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[1725,1316,1726,2402,2403],"class_list":["post-6051","post","type-post","status-publish","format-standard","hentry","category-computer","tag-c","tag-linux","tag-pascal","tag-pearl","tag-regulare-ausdrucke","entry"],"a3_pvc":{"activated":false,"total_views":1114,"today_views":0},"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":18458,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/10\/23\/die-agena-c-2\/","url_meta":{"origin":6051,"position":0},"title":"Die Agena C","author":"Bernd Leitenberger","date":"23. Oktober 2025","format":false,"excerpt":"Wie ihr sicher bemerkt habt, war es etwas ruhig hier im Blog. Der Grund ist ganz einfach, ich habe mich endlich entschlossen, einen Schlussstrich zu ziehen. Nein, nicht unter dem Blog. Seit f\u00fcnf Jahren will ich Band 2 des Apolloprogramms fertigstellen und habe in den letzten Jahren eigentlich immer nur\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg04.met.vgwort.de\/na\/d6474dec02b34cf385a0dfced0cffb64","width":350,"height":200},"classes":[]},{"id":18430,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/10\/06\/treibstoffgewinnung-auf-dem-mars\/","url_meta":{"origin":6051,"position":1},"title":"Treibstoffgewinnung auf dem Mars","author":"Bernd Leitenberger","date":"6. Oktober 2025","format":false,"excerpt":"Bis es eine Kolonie auf dem Mars gibt wird es sicher noch Jahrzehnte dauern, wenn \u00fcberhaupt. Ich bin jetzt 60 und glaube nicht, das ich dies noch erleben werde. Chancen g\u00e4be es f\u00fcr eine Expedition, also einen Flug zum Mars, einen Aufenthalt dort, der aus himmelsmechanischen Gr\u00fcnden etwa eineinhalb Jahre\u2026","rel":"","context":"In &quot;Chemie&quot;","block_context":{"text":"Chemie","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/chemie\/"},"img":{"alt_text":"","src":"https:\/\/vg01.met.vgwort.de\/na\/1098a0be1f3743bcb77eed3bd08301c5","width":350,"height":200},"classes":[]},{"id":5216,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2011\/08\/10\/fcea2\/","url_meta":{"origin":6051,"position":2},"title":"FCEA2","author":"Bernd Leitenberger","date":"10. August 2011","format":false,"excerpt":"CEA2 (Chemical Equilibrium with Applications) ist ein seit gut 30 Jahren entwickeltes NASA Programm mit dem verschiedenste Probleme bei Gasphasen berechnet werden k\u00f6nnen. Ich beschr\u00e4nke mich auf das, was Raumfahrtliebhaber wohl am meisten machen: Die Berechnung der Performance von Triebwerken bei Raketen. Ich will die Benutzung des Programmes einmal erl\u00e4utern,\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg01.met.vgwort.de\/na\/89efc24160614a1a93d97d19447e81a6","width":350,"height":200},"classes":[]},{"id":18539,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/02\/24\/die-thor-delta-entwicklung-kompakt\/","url_meta":{"origin":6051,"position":3},"title":"Die Thor-Delta Entwicklung &#8211; kompakt","author":"Bernd Leitenberger","date":"24. Februar 2026","format":false,"excerpt":"Was die Delta von allen anderen Tr\u00e4gerasketen, nicht nur der USA, sondern auch weltweit, unterscheidet ist die enorme Anzahl an Versionen. Selbst wenn man die milit\u00e4rischen Varianten ausklammert, gibt es elf Versionen bei der Buchstabennummerierung und (wenn man die Delta 3 ausklammert, weil sie keine Delta-Stufe mehr einsetzt) acht Versionen\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg07.met.vgwort.de\/na\/59224b87a3b84e6fb74064a0157d7cfa","width":350,"height":200},"classes":[]},{"id":18406,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/09\/23\/der-blogautor-von-der-ki-beurteilt\/","url_meta":{"origin":6051,"position":4},"title":"Der Blogautor von der KI beurteilt","author":"Bernd Leitenberger","date":"23. September 2025","format":false,"excerpt":"Ich nutze inzwischen auch eine KI. Prim\u00e4r zu Recherche, im Browser https:\/\/www.perplexity.ai die f\u00fcr Recherchen (nach Eigenauskunft) spezialisiert ist. Seit ich vor mehr als zwei Jahren die KI zum ersten Mal getestet habe, hat diese sich enorm gebessert. Sie fabuliert weniger und ist intelligenter. Damals konnte man noch die AI\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/vg01.met.vgwort.de\/na\/c334c52e97b74da9b82424a9e80c6d97","width":350,"height":200},"classes":[]},{"id":18415,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/10\/01\/die-groessten-raetsel-in-der-fruehen-erdgeschichte-2\/","url_meta":{"origin":6051,"position":5},"title":"Die gr&ouml;&szlig;ten R&auml;tsel in der fr&uuml;hen Erdgeschichte (2)","author":"Bernd Leitenberger","date":"1. Oktober 2025","format":false,"excerpt":"So weiter geht es mit dem Artikel zu fragen oder R\u00e4tseln der fr\u00fchen Erdgeschichte also vor dem Kambrium. Dieser Teil schlie\u00dft inhaltlich an den ersten Teil von gestern an. Die langsame Evolution der Eukaryoten Biologen unterscheiden zwischen Prokaryonten und Eukaryoten. Alle Bakterien, einschlie\u00dflich der Cyanobakterien, sind Prokaryoten \u2013 Zellen ohne\u2026","rel":"","context":"In &quot;Chemie&quot;","block_context":{"text":"Chemie","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/chemie\/"},"img":{"alt_text":"","src":"https:\/\/vg01.met.vgwort.de\/na\/e534ab16d0564d968b03e686e6c982bb","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/6051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/users\/169"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/comments?post=6051"}],"version-history":[{"count":0,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/6051\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/media?parent=6051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/categories?post=6051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/tags?post=6051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}