{"id":15799,"date":"2022-02-27T08:37:10","date_gmt":"2022-02-27T07:37:10","guid":{"rendered":"https:\/\/www.bernd-leitenberger.de\/blog\/?p=15799"},"modified":"2022-02-27T08:37:10","modified_gmt":"2022-02-27T07:37:10","slug":"compiler-interpreter-und-ihre-schwaechen","status":"publish","type":"post","link":"https:\/\/www.bernd-leitenberger.de\/blog\/2022\/02\/27\/compiler-interpreter-und-ihre-schwaechen\/","title":{"rendered":"Compiler, Interpreter und ihre Schw&auml;chen"},"content":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_15799\" class=\"pvc_stats all  \" data-element-id=\"15799\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/www.bernd-leitenberger.de\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p>Zeit, dass ich mich mal wieder einem Computerthema widme. Das heutige Thema war als ich mit der Computerei anfing \u2013 Anfang der Achtziger Jahre \u2013 \u201ein\u201c, ist heute aber kein Thema mehr. Es geht darum, wie ein ausf&uuml;hrbares Programm erzeugt wird. Da heute zwar viel mehr Leute einen Computer oder ein Ger&auml;t das einen Computer beinhaltet wie ein Smartphone oder Tablett nutzen, aber nicht mehr wie fr&uuml;her Programmieren (m&uuml;ssen) zuerst mal eine Erkl&auml;rung.<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vg02.met.vgwort.de\/na\/497d58037a464c15a3734e15d86e51c8\" width=\"1\" height=\"1\" alt=\"\"\/><!--more--><\/p>\n<p>Prozessoren interpretieren das Bitmuster, dass sie aus dem Speicher holen als Befehle. Jeder Befehl hat einen eigenen Code. Diese unterste Ebene nennt man Maschinensprache, in ihr w&uuml;rde man ein Programm als eine Folge von Zahlen schreiben. Wer als ich anfing \u201epatchte\u201c man so Programme, gab tats&auml;chlich so auch Befehle ein, meist als Hexadezimalzahl. So kann man aber keine gr&ouml;&szlig;eren Programme schreiben. Daher liefert jeder Prozessorhersteller f&uuml;r einen neuen Prozessor zumindest ein Programm: den Assembler. In ihr hat jeder Befehl ein meist kryptische K&uuml;rzel, aber das ist immerhin besser zu merken als eine Zahl. Daneben berechnet der Assembler Adressen und er erlaubt das Arbeiten mit Konstanten und Variablen.<\/p>\n<p>Ein Assembler ist aber auf einen Prozessor beschr&auml;nkt und jeder Prozessor hat einen anderen Befehlssatz. F&uuml;r die L&ouml;sung eines Problems muss man sich zuerst in die Architektur des Prozessors einarbeiten und bei einem anderen Prozessor f&auml;ngt man von vorne an.<\/p>\n<p>In den F&uuml;nfziger Jahren entstanden die ersten Hochsprachen in denen die Befehle viel abstrakter und dem Erfahrungswert von Menschen z.B. wie man mathematischen Gleichungen formuliert oder Abl&auml;ufe organisiert, angepasst wurden. Die beiden ersten waren FORTRAN f&uuml;r mathematische Probleme und COBOL f&uuml;r kaufm&auml;nnische Probleme. Doch damit der Prozessor diese Sprache verstand, braucht man ein Programm das diese Befehle in die Befehle des Prozessors &uuml;bersetzte. Die ersten Sprachen verwandten alle Compiler. So wird ein Programm bezeichnet, dass das Hochsprachenprogramm direkt in den Bin&auml;rcode des Prozessors &uuml;bersetzt. Man erh&auml;lt ein ausf&uuml;hrbares Programm, dass ohne den urspr&uuml;nglichen Quelltext auf jedem Computer mit diesem System (Prozessor, aber auch Betriebssystem) ausf&uuml;hrbar ist.<\/p>\n<p>Das hat Vorteile f&uuml;r den Softwareentwickler, der so den Quelltext beh&auml;lt und damit auch sein geistiges Eigentum. Es hat auch Vorteile f&uuml;r den Kunden, denn das ausf&uuml;hrbare Programm entspricht dem in Maschinensprache. Er muss es nicht erst in Maschinensprache &uuml;bersetzen. Allerdings braucht man zum Entwickeln einige Programme \u2013 einen <a href=\"https:\/\/www.bernd-leitenberger.de\/smarteditor.shtml\">Editor<\/a>, eine einfache Textverarbeitung um den Quelltext zu schreiben, den Compiler und f&uuml;r die Fehlersuche einen Debugger. In der praktischen Arbeit musste man dauernd zwischen diesen drei Programmen wechseln, bis <a href=\"https:\/\/www.bernd-leitenberger.de\/turbo-pascal-history.shtml\">Turbo Pascal<\/a> 1983 alle drei Programme erstmalig zusammenfasste und eine IDE schuf (IDE = Integrated Development Enviroment).<\/p>\n<p>Es gab schon immer das Bestreben vor allem f&uuml;r das Erlernen der Programmierung dies einfacher zu machen. F&uuml;r BASIC, (Beginners All Symbolic Instruction Code) eine Lehrsprache die Studenten an FORTRAN heranf&uuml;hren sollte, wurde das Konzept des Interpreters verwendet. Bei einem Interpreter f&uuml;hrt der Computer jeden Befehl sofort aus und gibt das Ergebnis aus. Programme werden in <a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2016\/09\/22\/basic-und-die-heimcomputer\/\">BASIC<\/a> dadurch entwickelt, dass man jede Zeile nummeriert. So f&uuml;hrt der Interpreter sei nicht sofort aus, dann muss man das Programm mit \u201eRun\u201c starten. Ein Interpreter macht dann im Prinzip das gleiche wie ein Compiler. Er holt sich jede Programmzeile und &uuml;bersetzt sie in Maschinencode. Er macht das aber nie mit dem ganzen Programm, sondern immer nur dem teil den er gerade ausf&uuml;hren muss, das ist eine Anweisung, Das ist aber aus zwei Gr&uuml;nden langsamer. Zum einen braucht die &Uuml;bersetzung Zeit. Bei meinem l&auml;ngsten Turbo Pascal Programm das ich auf einem 8-Bit Rechner schrieb, dauerte das &Uuml;bersetzen einige Minuten. Ich habe mir dann jedes mal einen Kaffee geholt. Gut diese Zeit verteilt sich beim Interpreter auf Tausende Programmzeilen, sodass jede einzelne Zeile schnell &uuml;bersetzt ist. Der zweite Punkt ist wichtiger. In Programmen wird immer ein Gro&szlig;teil des Codes wiederholt, man spricht von einer Schleife. W&auml;re dem nicht so, niemand m&uuml;sste ein Programm schreiben, sondern k&ouml;nnte auch alles von Hand berechnen. Bei einem (klassischen) Interpreter wird aber bei jeder Wiederholung neu &uuml;bersetzt, was das Programm sehr verlangsamen kann.<\/p>\n<p>Trotzdem wurde praktisch jeder Heimcomputer in den Achtziger Jahren mit einem BASIC-Interpreter ausgeliefert. Aus einem einfachen Grund \u2013 ohne Diskettenlaufwerk konnte man nicht die f&uuml;r einen Compiler ben&ouml;tigten drei Programme Editor, Compiler, Assembler im Speicher halten. Auch ist im Speicher bei einem Compiler neben dem Quelltext das gesamte Programm, man ben&ouml;tigt also mehr Speicher. Daneben war BASIC eine so einfache Programmiersprache, das der Interpreter in einigen Kilobyte Speicher unterbringbar war. Der <a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2020\/02\/07\/der-basic-interpreter\/\">BASIC Interpreter<\/a> war zugleich Betriebssystem. Es gab auch andere interpretierte Programmiersprachen, viele f&uuml;r den Einsatz in Lehre wie LOGO oder Comal, andere wegen der einfacheren M&ouml;glichkeit Fehler zu finden, wie bei Lisp, der allerersten interpretierten Sprache. Als ich zu Programmieren anfing, hatten Interpreter keinen guten Ruf. Das lag zum einen daran, das alle von gr&ouml;&szlig;eren Systemen bekannten Hochsprachen compiliert waren, wie Pascal, C, Cobol. Algol oder FORTRAN. Die bekannteste interpretierte Sprache war aber BASIC das wegen des eingeschr&auml;nkten Sprachstandards und der Fehleranf&auml;lligkeit keinen guten Ruf hatte. Vor allem aber waren die Rechner damals langsam und da wollte man nicht auch noch viel Rechenzeit f&uuml;r das dauernde &Uuml;bersetzen opfern.<\/p>\n<p>BASIC starb mit den Heimcomputern aus. Wert in den Neunzigern entwickelte, tat dies mit Compilern. Meist in <a href=\"https:\/\/www.bernd-leitenberger.de\/pascal-und-c.shtml\">C oder Pascal<\/a>. Mit Java kam ein neuer Interpretertyp auf. Java ist eine objektorientierte Sprache, die sich in der Syntax an C anlehnt. Also durchaus nicht so was \u201eeinfaches\u201c wie BASIC. Java sollte aber auf jeder Plattform laufen. Dazu w&auml;hlte man den (auch nicht neuen) Weg eines Zwischencodes. Der Java-Compiler erstellt aus Java-Quellcode einen plattformunabh&auml;ngigen Bytecode. Der von einer Java-Virtual Maschine auf dem Rechner dann interpretiert wird. Der Bytecode ist aber plattformunabh&auml;ngig, kann wie ein Maschinenspracheprogramm weitergegeben werden. Um die Nachteile des Interpreters bez&uuml;glich Geschwindigkeit zu kompensieren, gibt es auch Just-In-Time Compiler, die beim Starten des Bytecodes ein Maschinenspracheprogramm erzeugen. Das ist aber nicht Standard. Dieses Konzept verwandten auch andere Programmiersprachen wie die Konkurrenzsprache zu Java, C# von Microsoft. Es ist zumindest deutlich schneller als Java, das ich als langsam in Erinnerung habe, vor allem bis ein Programm &uuml;berhaupt startet.<\/p>\n<p>Seitdem sind etliche neue Sprachen erschienen, die meisten interpretiert. Entweder weil es nicht anders m&ouml;glich ist, wie dies z.B. bei PHP und Javascript, wo der Quellcode in einer HTML Seite steckt oder weil so die Plattformunabh&auml;ngigkeit gew&auml;hrleistet wird. Die besteht bei der Dominanz der <a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/2021\/01\/31\/was-im-bestand-hat-codebasen\/\">IA-64 Architektur<\/a> heute nicht mehr in der Unterst&uuml;tzung vieler anderer Prozessoren als vielmehr darin das heute niemand mehr Programme mit Textausgaben schreibt. Jede grafische Oberfl&auml;che hat aber andere Routinen f&uuml;r die Ausgabe und jeweils ein anderes Design. Damit ein Programm trotzdem plattformunabh&auml;ngig ist, muss es praktisch zur Laufzeit die richtigen Routinen aufrufen.<\/p>\n<p>Heute sehr popul&auml;r ist Python. Python ist einfach zu erlernen und leistungsf&auml;hig und es ist interpretiert. Bei der Geschwindigkeit heutiger Rechner spielt der Nachteil der Geschwindigkeit eines Interpreters selten eine Rolle. Wenn dies der Fall ist, dann nutzt man mit Python eben C-Bibliotheken, die in Maschinencode codiert wird, z.B. wenn es um k&uuml;nstliche Intelligenz (KI) geht.<\/p>\n<p>Was aber immer bleibt ist, wie gut der Compiler selbst ist, egal ob er ein nativer Compiler ist oder in einem Interpreter versteckt ist. Das Problem ist nicht neu. Das erste Mal das man versuchte die Geschwindigkeit von erzeugtem Code von Interpretern\/Compilern zu messen ist, meiner Ansicht nach das \u201eSieve\u201c Benchmark von <a href=\"https:\/\/archive.org\/details\/byte-magazine-1981-09\/page\/n181\/mode\/1up\">Byte (9\/1981)<\/a>. Er ermittelt die Primzahlen zwischen 2 und 8191 und wurde in dem Heft in verschiedensten Programmiersprachen ver&ouml;ffentlicht, darunter etlichen von denen ich bis heute nie geh&ouml;rt habe. Es gibt auch eine Liste der Resultate verschiedener Interpreter und Compiler. Hier sieht man auch das die Programmiersprache nicht unbesiegt &uuml;ber die Geschwindigkeit entscheidet. Das zweitschnellste Ergebnis hatte ein C-Compiler. Ein anderer C-Compiler lieferte auf demselben Rechner aber auch das langsamste Ergebnis: 337-mal langsamer!<\/p>\n<p>Die Ergebnisse best&auml;tigten aber, dass Compiler in der Regel schneller sind als Interpreter, den auf den letzten Pl&auml;tzen tummeln sich etliche BASIC-Interpreter, 34 bis 300-mal langsamer als der Spitzenreiter w&auml;hrend das compilierte Microsoft Basic nur um den Faktor 1,32 langsamer war. Die Geschwindigkeit liegt auch an der Implemtierung des Interpreters\/Compilers.<\/p>\n<p>Das grundlegende Problem ist das ein Compiler die m&ouml;glichst beste L&ouml;sung suchen soll. Dabei gibt es oft einen Konflikt: Soll der Code schneller oder kompakter sein. Das schlie&szlig;t sich oft aus. Kompakter Code packt m&ouml;glichst viel in Unterroutinen, die aufgerufen werden. Doch das Aufrufen kostet Zeit. Wiederholt man den Code, so wird das Programm zwangsl&auml;ufig l&auml;nger. Das grundlegende Problem ist aber das der Code maschinell nach Regeln erstellt wird. Eine Untersuchung von Compilern erzeugtem Code ergab, dass 80 Prozent des Codes nur 20 Prozent der verf&uuml;gbaren Instruktionen verwenden \u2013 und die restlichen 20 Prozent die restlichen 80 Prozent der Instruktionen. Das ist ein typisches Beispiel f&uuml;r die <a href=\"https:\/\/www.bernd-leitenberger.de\/blog\/tag\/8020-regel\/\">80\/20 Regel oder Paretoprinzip<\/a>. Das f&uuml;hrte in den Achtzigern dazu, das man neue Prozessoren nach dem <a href=\"https:\/\/www.bernd-leitenberger.de\/risc-cisc.shtml\">RISC Prinzip<\/a> entwarf \u2013 sie sollten nur diese 20 Prozent der Befehle einsetzen, die aber schneller ausf&uuml;hren. Eine der damals entstandenen Architekturen, die ARM-Architektur steckt heute in jedem Smartphone.<\/p>\n<p>Ich bin auf die Problematik gekommen, weil ich derzeit eine kleine Reihe &uuml;ber Prozessoren schreibe die Intel herausbrachte und sich zu Flops entwickelten. Ich habe schon &uuml;ber den <a href=\"https:\/\/www.bernd-leitenberger.de\/iAPX432.shtml\">iAPX 432<\/a> und <a href=\"https:\/\/www.bernd-leitenberger.de\/i860.shtml\">i860<\/a> geschrieben. Beim i860 war es so, dass dessen Spitzenperformance nur zu einem Bruchteil mit Compilern erreicht wurden, weil diese nicht das Leerlaufen der Caches vorhersagen k&ouml;nnen \u2013 die Caches waren beim i860 nur 4\/8 KByte gro&szlig;. Heute sind sie aus gutem Grund einige Megabytes gro&szlig;. Ein &auml;hnliches Schicksal hat der n&auml;chste Fehlschlag der Itanium, bei dem der Compiler die Befehle so gruppieren sollte, das er schnell ausgef&uuml;hrt werden kann. Auch das klappte nicht.<\/p>\n<p>Das grundlegende Problem ist, dass auch nach Jahrzehnten Compilerentwicklung diese relativ \u201edumm\u201c sind. Sie ersetzen eben einen Hochspracheinbefehl 1:1 durch eine Maschiensprachensequenz und sehen nicht die Umgebung in der diese Befehlsfolge sich befindet.<\/p>\n<p>Vor einigen Jahren hat die ct\u2019 in der Ausgabe 12\/2014 unter dem Titel \u201eMatrix reloaded\u201c mal einen <a href=\"https:\/\/www.heise.de\/select\/ct\/archiv\/2014\/12\/seite-176\">Test ver&ouml;ffentlicht<\/a>. Sie haben eine einfache Matrizenmultiplikation geschrieben, nur wenige Zeilen Code, der entscheidende Teil geht sogar in eine Zeile:<\/p>\n<p>c[i][j] += a[i][k] * b[k][j];<\/p>\n<p>Diese Zeile wird in drei Schleifen (i,J,k) f&uuml;r Spalten und Zeilen der beiden Matrizen durchlaufen. Nun gibt es einen Befehl, der genau diese Zeile durchf&uuml;hrt: FMA \u2013 fused Add Multiply. Dieser Befehl kann bei AVX256 sogar vier doppelt genaue und acht einfach genaue Zahlen in einem Takt addieren und multiplizieren. Das bedeutet pro Takt sollte er acht bzw. 16 Flie&szlig;kommaoperationen durchf&uuml;hren, multipliziert man dies mit dem Takt und den vier Kernen des Prozessors <a href=\"https:\/\/www.intel.de\/content\/www\/de\/de\/products\/sku\/76087\/intel-core-i74750hq-processor-6m-cache-up-to-3-20-ghz\/specifications.html\">Core i7- 4750HQ Prozessors<\/a> (4 Kerne, maximal 3,2 GHz, Hyperthreading) so sind dies 102,4 GFlops, Hyperthreading sollte weitere 30% erreichen also 133,12 Gflops.<\/p>\n<p>Das Ergebnis: Microsofts C-Compiler erreicht 3,2 GFlops, wenn man AVX explizit nutzt und das dem Compiler mitteilt, steigert sich das auf 6,5 GFlops \u2013 er nutzt aber nur einen Kern. Mit einer Erweiterung f&uuml;r den Compiler, die alle Kerne nutzt, klettert das dann auf 37 GFLOPS. Trotzdem \u2013 nur ein Viertel der theoretischen Leistung. Es zeigte sich im Test auch, dass die Ergebnisse extrem sensitiv waren wie der Code aufgebaut war. F&uuml;hrte man die Initialisierung von C in einer vorgezogenen Schleife durch, so war die Geschwindigkeit in der Rechenschleife eine andere, als wenn dies in der Rechenschleife direkt erfolgte.<\/p>\n<p>Intel als Prozessorhersteller sollte bessere Compiler liefern und sie sind auch besser. Sie kommen 5-8 GFlops bei einem Kern, auf 20 GFLOPS mit AVX Unterst&uuml;tzung und Nutzung aller Kerne, nimmt man die Erweiterung OpenMP hinzu, kommt man auf 37 GFLOPS \u2013 ein vielfaches der Basisleistung. Doch programmiert man die Matrieznmultiplikation nicht selbst, sondern nutzt eine Bibliotheksfunktion, von der man annehmen kann, dass sie optimal programmiert ist, wahrscheinlich in Assembler, so erreicht man 140 GFLOPs.<\/p>\n<p>Das zeigt das Dilemma auf. Eigentlich ist die Zeile ein Idealfall f&uuml;r den erw&auml;hnten Fused Multiply Add. Der Befehl macht zuerst mit zwei Operanden eine Multiplikation und addiert dann das Ergebnis zu einem dritten Operanden, der so aufsummiert wird. Genau das steht aber in der Zeile. (Die Parallelit&auml;t von 2 Operationen pro Takt erh&auml;lt man dadurch, dass der Prozessor pro Kern mehrere Rechenwerke hat, und je eines f&uuml;r die Multiplikation eines Paares und ein anderes f&uuml;r die Addition des vorherigen Paares (letzter Schleifendurchlauf). Da die Datenstruktur ein Array ist, sollte der Compiler als erste Ma&szlig;nahme das Array in n Teiloperationen zerlegen, die er auf die n logischen Kerne verteilt. Als zweite Ma&szlig;nahme m&uuml;sste er je vier Rechnungen, z.B. mit Index i bis i+3 in einer FMA Operation zusammenfassen.<\/p>\n<p>Nur das tut er nicht, und hilfreich ist auch nicht, dass es eine Bibliothekfunktion vom Compilerhersteller gibt, die in Assembler die Spitzenperformance herausholt, denn diese Bibliothek ist eben f&uuml;r gerade diesen Fall nutzbar, sobald man einen eigenen Fall hat bei dem z.B. noch jeweils eine Konstante addiert werden muss, ist sie nicht mehr nutzbar.<\/p>\n<p>Das ist keine Ausnahme. Der (beim Schreiben des Blogs) aktuell schnellste Rechner weltweit, der <a href=\"https:\/\/blog.de.fujitsu.com\/data-driven\/fugaku-der-aktuell-weltweit-leistungsstaerkste-supercomputer\/\">Fugako Supercomputer<\/a> leistet im LINPACK-Benchmark auf 152.064 Nodes eine gemessene Performance von 415,53 PFLOPS (theoretisches Maximum: 537 Pflops). Der LINPACK ist im Prinzip eine Matrizenmultiplikation wie auch im ct-Test. Nur ist das nicht repr&auml;sentativ f&uuml;r echte Anwendungen. Im HPCG \u2013 High Performance Conjugate Gradient Benchmark, der reale naturwissenschaftlich-technische Anwendungen simuliert, sind es bei 138.240 Nodes ein Bestwert von 13.366 Pflops. Also 2.732 Gflops pro Node beim Linpack, 96 Gflops pro Node beim HPCG \u2013 das sind gerade mal 3,5 Prozent der theoretischen Spitzenleistung!<\/p>\n<p>Gibt es einen Ausweg aus dem Dilemma? Da man in Jahrzehnten den Compiler anscheinend kaum verbessern konnte, w&auml;re der logische Weg den Prozessor anzupassen. Versuche einen Prozessor zu erzeugen die direkt Hochsprachenkonstrukte ausf&uuml;hren, anstatt viel einfacheren befehlen scheiterten. Der zweite Weg ist es, auf Spezialbefehle wie eben FMA zu verzichten und die einfachen Befehle schneller auszuf&uuml;hren. Dieser Ansatz <a href=\"https:\/\/www.bernd-leitenberger.de\/cisc-risc.shtml\">RISC<\/a> konnte aber auch nicht die IA64 Architektur vom Thron verdr&auml;ngen. F&uuml;r beide Architekturans&auml;tze gibt es die physikalisch bedingte, gleiche maximale Taktfrequenz die man vor etwa seit 20 Jahren erreicht hat. (Schon damals erreichte man 3,8 GHz, heute geht es mit maximal 5 GHz nicht wesentlich schneller). Dann ist aber die CISC Architektur, die IA64 hat immer schneller als RISC. Zudem kommen ja auch bei RISC mit jeder Generation neue Befehle hinzu und so wird RISC immer mehr zu CISC. Gerade der Itanium ist ein Beispiel wie eine neue Prozessorarchitektur nicht die Erwartungen erf&uuml;llt, die man an sie hatte.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_15799\" class=\"pvc_stats all  \" data-element-id=\"15799\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/www.bernd-leitenberger.de\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p>Zeit, dass ich mich mal wieder einem Computerthema widme. Das heutige Thema war als ich mit der Computerei anfing \u2013 Anfang der Achtziger Jahre \u2013 \u201ein\u201c, ist heute aber kein Thema mehr. Es geht darum, wie ein ausf&uuml;hrbares Programm erzeugt wird. Da heute zwar viel mehr Leute einen Computer oder ein Ger&auml;t das einen Computer [&hellip;]<\/p>\n","protected":false},"author":169,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[1635,4821,3673,4819,1750,1005,4820],"class_list":["post-15799","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-basic","tag-cisc","tag-compiler","tag-interpreter","tag-java","tag-paretoprinzip","tag-risc","entry"],"a3_pvc":{"activated":true,"total_views":8172,"today_views":0},"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":18676,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/05\/31\/die-glorreichen-10-programmiersprachen\/","url_meta":{"origin":15799,"position":0},"title":"Die glorreichen 10 \u2013 Programmiersprachen","author":"Bernd Leitenberger","date":"31. Mai 2026","format":false,"excerpt":"Ich wollte mal eine Reihe in dieser Rubrik \u00fcber Programmiersprachen machen. Zuerst dachte ich daran eine Liste nach meinen pers\u00f6nlichen Favoriten zu erstellen. Anfangs bef\u00fcrchtete ich, dass ich gar nicht auf 10 komme, aber es sind tats\u00e4chlich mehr, wenngleich ich in vielen Sprachen nur kleine Programme verfasst habe oder mich\u2026","rel":"","context":"In &quot;Die Glorreichen 10&quot;","block_context":{"text":"Die Glorreichen 10","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/die-glorreichen-10\/"},"img":{"alt_text":"","src":"https:\/\/vg09.met.vgwort.de\/na\/4073c4f9dc6943a08702cdde13605d43","width":350,"height":200},"classes":[]},{"id":18683,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/06\/01\/die-glorreichen-10-programmiersprachen-2\/","url_meta":{"origin":15799,"position":1},"title":"Die glorreichen 10 \u2013 Programmiersprachen (2)","author":"Bernd Leitenberger","date":"1. Juni 2026","format":false,"excerpt":"Der heutige Teil schlie\u00dft nahtlos an den ersten Teil an, der gestern erschien. Es geht um 10 Kriterien anhand derer man Programmiersprachen kategorisieren kann. Maschinennah oder universell, aber komplex Als eine maschinennahe Sprache bezeichnet man eine Sprache, die nahe den M\u00f6glichkeiten von Prozessoren ist. Das Paradebeispiel ist C. Alle Prozessoren\u2026","rel":"","context":"In &quot;Die Glorreichen 10&quot;","block_context":{"text":"Die Glorreichen 10","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/die-glorreichen-10\/"},"img":{"alt_text":"","src":"https:\/\/vg09.met.vgwort.de\/na\/7f5d9cf5265047179df05b778bf455b5","width":350,"height":200},"classes":[]},{"id":18610,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/27\/galileos-cds-teil-1\/","url_meta":{"origin":15799,"position":2},"title":"Galileos CDS &#8211; Teil 1","author":"Bernd Leitenberger","date":"27. M\u00e4rz 2026","format":false,"excerpt":"Hall\u00f6chen, es wird Zeit das ich mich mal wieder melde. Es gab zwei Gr\u00fcnde, warum ich mich so rar gemacht habe. Das eine ist das es gerade nicht so viel aktuelles gibt, au\u00dfer einem Update zu Artemis, zu dem ich vielleicht noch etwas schreibe. W\u00e4hrend Trump das ganze Programm nach\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\/4fb81c7bafbd4d9d88b5695abdb33d29","width":350,"height":200},"classes":[]},{"id":18612,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/28\/galileos-cds-teil-2\/","url_meta":{"origin":15799,"position":3},"title":"Galileos CDS \u2013 Teil 2","author":"Bernd Leitenberger","date":"28. M\u00e4rz 2026","format":false,"excerpt":"So, heute geht es weiter mit Teil 2 \u00fcber Galileos CDS, dieser Beitrag schlie\u00dft nahtlos an den ersten Beitrag von gestern an, wie man schon an der ersten Textzeile sieht. Nach der Einleitung im ersten Teil geht es heute weiter damit warum der RCA 1802 genutzt wurde und was seine\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\/191e4b0728de42829cf656027b84dc82","width":350,"height":200},"classes":[]},{"id":18614,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/29\/galileos-cds-teil-3\/","url_meta":{"origin":15799,"position":4},"title":"Galileos CDS &#8211; Teil 3","author":"Bernd Leitenberger","date":"29. M\u00e4rz 2026","format":false,"excerpt":"So nun zum dritten Teil \u00fcber das prim\u00e4re Computersystem von Galileo, das CDS. Nachdem sich die ersten beiden Teile nur mit dem RCA 1802, warum er gew\u00e4hlt wurde und seiner Architektur befassten geht es heute um das Computersystem selbst. Der Artikel schlie\u00dft so an seine beiden Vorg\u00e4nger gestern und vorgestern\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\/6e7f572a246b4ac395de9c260733b707","width":350,"height":200},"classes":[]},{"id":18380,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/09\/03\/die-glorreichen-10-das-war-mal-weg-pc-hardware\/","url_meta":{"origin":15799,"position":5},"title":"Die glorreichen 10 &#8211; Das war mal weg: PC Hardware","author":"Bernd Leitenberger","date":"3. September 2025","format":false,"excerpt":"Ich will heute mal zwei ZDF Info \/ Neo Sendungen verbinden. Die glorreichen 10, die bei mir als Vorlage f\u00fcr einige Blogs dienten und die von mir noch mehr gesch\u00e4tzte Sendung \"Das war mal weg\", wo es um Dinge geht, die fr\u00fcher fast jeder hatte und die heute aus unserem\u2026","rel":"","context":"In &quot;Die Glorreichen 10&quot;","block_context":{"text":"Die Glorreichen 10","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/die-glorreichen-10\/"},"img":{"alt_text":"","src":"https:\/\/vg02.met.vgwort.de\/na\/876c61d389304d98aa0332fadd769381","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\/15799","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=15799"}],"version-history":[{"count":0,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/15799\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/media?parent=15799"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/categories?post=15799"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/tags?post=15799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}