Ist eine universelle Assemblersprache für alle Computer möglich?

23

Ich möchte ein paar Fragen zur Assemblersprache stellen. Ich verstehe, dass es der Maschinensprache sehr nahe kommt und sie schneller und effizienter macht.

Bedeutet das, dass wir unterschiedliche Computerarchitekturen haben, dass ich in Assembly für unterschiedliche Architekturen unterschiedlichen Code schreiben muss? Wenn ja, warum nicht Assembly, schreiben Sie einmal - lassen Sie jede Art von Sprache laufen? Wäre es nicht einfacher, es einfach universell zu machen, sodass Sie es nur einmal schreiben und auf praktisch jedem Computer mit unterschiedlichen Konfigurationen ausführen können? (Ich denke, dass es unmöglich wäre, aber ich hätte gerne konkrete, detaillierte Antworten.)

Manche Leute sagen vielleicht, C ist die Sprache, nach der ich suche. Ich habe C noch nie benutzt, aber ich denke, es ist immer noch eine Hochsprache, obwohl es wahrscheinlich schneller als Java ist. Ich könnte mich hier irren.

nTuply
quelle
10
Welche Recherchen haben Sie durchgeführt? Wir erwarten, dass Sie vor dem Fragen Nachforschungen anstellen, um eine bessere Frage zu stellen. Es ist viel über Assemblersprache geschrieben.
DW
4
Wir erwarten von Ihnen, dass Sie vor dem Fragen eine beträchtliche Menge an Recherchen / Selbststudien durchführen und uns in der Frage mitteilen, welche Recherchen Sie durchgeführt haben. In diesem Fall könnte die Forschung das Lesen relevanter Wikipedia-Artikel (z. B. zu Assemblersprache und Computerarchitektur) und das Lesen eines Lehrbuchs zur Computerarchitektur umfassen. Um dies zu einer besseren Frage zu machen: Recherchieren Sie, falls noch nicht geschehen, und bearbeiten Sie dann die Frage, um die Recherche zu erläutern, die Sie durchgeführt haben. Oft hilft Ihnen diese Art der Recherche, eine bessere Frage zu formulieren. Auf jeden Fall hilft es den Antwortenden, das zu vermeiden, was Sie bereits wissen.
DW
15
Beginnen Sie damit, zu verstehen, warum es keine Sprache namens Assembly gibt.
Raphael
2
Ein "klassisches" Problem bei der C-Portabilität sind unterschiedliche Primitivgrößen (z. B. Ganzzahlen) auf unterschiedlicher Hardware und einige andere.
vzn
3
Dies ist eher ein soziales als ein technisches Problem. Sie müssen alle CPU-Hersteller davon überzeugen, dass ihre CPUs dieselbe Maschinensprache akzeptieren. (Eigentlich würde x86 fast so
aussehen

Antworten:

45

Assembler - Sprache ist eine Möglichkeit , um Schreibbefehle für den Computer - Befehlssatz , in einer Weise , die für die menschliche Programmierer leicht verständlicher ist.

Unterschiedliche Architekturen haben unterschiedliche Befehlssätze: Die zulässigen Befehlssätze sind für jede Architektur unterschiedlich. Aus diesem Grund können Sie nicht hoffen, dass Sie ein "Write-Once-Run-Anywhere" -Montageprogramm haben. Beispielsweise unterscheidet sich der Befehlssatz, der von x86-Prozessoren unterstützt wird, erheblich von dem Befehlssatz, der von ARM-Prozessoren unterstützt wird. Wenn Sie ein Assembly-Programm für einen x86-Prozessor geschrieben haben, enthält es viele Anweisungen, die vom ARM-Prozessor nicht unterstützt werden, und umgekehrt.

Der Hauptgrund für die Verwendung der Assemblersprache besteht darin, dass sie die Steuerung Ihres Programms auf sehr niedriger Ebene ermöglicht und alle Anweisungen des Prozessors ausnutzt: Passen Sie das Programm an, um Funktionen zu nutzen, die für den jeweiligen Prozessor einzigartig sind läuft weiter, manchmal kann man das Programm beschleunigen. Die Write-Once-Run-Anywhere-Philosophie widerspricht dem grundsätzlich.

DW
quelle
1
Ich denke, diese Frage wird bereits im 3. Absatz meiner Antwort beantwortet. Wie Sie sagten, wäre ein solches Schema nicht effizient, weshalb es grundsätzlich mit dem Hauptgrund für die Verwendung der Assemblersprache unvereinbar wäre.
DW
26
@nTuply Sobald Sie Ihre Assemblersprache so ändern, dass sie für verschiedene Computer geeignet ist, wird sie zu einer Hochsprache mit einer fürchterlichen Assemblersyntax. Wenn Sie sich für eine Hochsprache entschieden haben, können Sie auch eine mit freundlicherer Syntax verwenden und den Compiler die harte Arbeit machen lassen.
David Richerby
15
Es ist keine ganz blöde Idee, eine "Assemblersprache" zu haben, die für verschiedene Maschinen übersetzt wird, denn genau das ist LLVMs "IR". Aus den von David angegebenen Gründen schreiben Sie jedoch normalerweise keine LLVM-Assembly. Auch weil Sie 99 von 100 Fällen schlechter schreiben als das Übersetzen Ihres C in LLVM. Assemblersprachen sind möglicherweise effizienter als Hochsprachen, aber in den Händen der meisten aktuellen Programmierer, die über die für die Optimierung erforderliche Zeit verfügen, erreichen sie ihr Potenzial ohnehin nicht.
Steve Jessop
9
@nTuply, das gibt es. Der Übergang von dieser zusätzlichen Assemblersprache zu Maschinenanweisungen wird als Kompilierung bezeichnet.
Paul Draper
3
@PJTraill Es gibt keinen Grund, einen Compiler in Assembler auf einem modernen System zu schreiben, mit Ausnahme des allerersten Bootstrapping-Schritts (und meistens auch dann nicht). Compiler geschrieben in einer Hochsprache ist erheblich wahrscheinlicher tatsächlich wartbar zu sein. Also compare Wie kann eine Sprache, deren Compiler in C geschrieben ist, jemals schneller sein als C? . Der Zweck eines Compilers ist die Übersetzung von einer Sprache (der Quellsprache) in eine andere (normalerweise Maschinensprache für eine bestimmte Architektur und ein bestimmtes Betriebssystem). Dies kann in jeder Sprache geschrieben werden.
ein Lebenslauf vom
13

Die DEFINITION der Assemblersprache ist, dass es sich um eine Sprache handelt, die direkt in Maschinencode übersetzt werden kann. Jeder Operationscode in Assemblersprache wird in genau eine Operation auf dem Zielcomputer übersetzt. (Nun, es ist etwas komplizierter: Einige Assembler bestimmen automatisch einen "Adressierungsmodus" basierend auf Argumenten für einen Op-Code. Das Prinzip ist jedoch, dass eine Assemblierungszeile in eine maschinensprachliche Anweisung übersetzt wird.)

Sie könnten zweifellos eine Sprache erfinden, die wie Assemblersprache aussieht, aber auf verschiedenen Computern in verschiedene Maschinencodes übersetzt wird. Aber per Definition wäre das keine Assemblersprache. Es wäre eine höhere Sprache, die der Assemblersprache ähnelt.

Ihre Frage ähnelt der Frage: "Ist es möglich, ein Boot zu bauen, das nicht schwimmt oder auf andere Weise über Wasser fährt, aber Räder und einen Motor hat und an Land fahren kann?" Die Antwort wäre, dass ein solches Fahrzeug per Definition kein Boot wäre. Es klingt eher wie ein Auto.

Jay
quelle
1
C wurde oft als "portable Assemblersprache" bezeichnet.
Larry Gritz
2
@ LarryGritz Sicher. Und als C erfunden wurde, war es bahnbrechend: Es bot viel von der Macht der Assemblersprache mit der Benutzerfreundlichkeit eines kompilierten. Aber per Definition ist es immer noch eine kompilierte Sprache
Jay
8

Es gibt keinen begrifflichen (I daresay, keine Computerwissenschaft ) Grund gegen eine Assemblersprache mit für alle Computer in der Welt. In der Tat würde das viele Dinge viel einfacher machen. Was die Theorie angeht, so sind sie alle gleich, bis auf ein bisschen Funky Bijection.

In der Praxis gibt es jedoch unterschiedliche Chips für unterschiedliche Zwecke mit unterschiedlichen Operationen und Konstruktionsprinzipien (z. B. RISC vs CISC), die unterschiedlichen Zielen dienen, und die Befehlssätze, die sie bedienen, und damit die Assemblersprachen unterscheiden sich. Letztendlich ist die Antwort dieselbe wie bei der Frage, warum es so viele verschiedene Programmiersprachen gibt : unterschiedliche Ziele, unterschiedliche Entwurfsentscheidungen.

Das heißt, Sie können natürlich Abstraktionsebenen einführen, um zu einer gemeinsamen Schnittstelle zu gelangen. x86 zum Beispiel wird seit geraumer Zeit auf Chip-Ebene abgeschafft. Es gibt ein kleines Stück Hardware, das x86-Anweisungen in das übersetzt, womit Ihr Prozessor wirklich arbeitet. Sprachen wie C wären ein weiterer Schritt von der Hardware entfernt (wenn auch nur ein winziger), bis hin zu Sprachen wie Haskell, Java oder Ruby. Ja, Compiler sind eine der wichtigsten Errungenschaften der Informatik, da sie es ermöglichen, Bedenken auf diese Weise zu trennen.

Raphael
quelle
6
"Wenn es sich um einen winzigen handelt" - genau dort sind Ihre beiden Arten von Programmierern. Diejenigen, die C als eine Sprache auf niedriger Ebene betrachten, weil seine Grundoperationen ähnlich aussehen wie die Dinge, die in CPU-Befehlssätzen erscheinen, und diejenigen, die C als eine Sprache auf hoher Ebene betrachten, weil es nicht der gleiche Befehlssatz wie die Maschine ist.
Steve Jessop
Wenn Sie mit Assemblersprache eine Sprache meinen, die die vollständige Kontrolle über den für einen bestimmten Hardwaretyp (oder eine bestimmte Hardwarefamilie) generierten Maschinencode gibt, ist es möglich, zu einem bestimmten Zeitpunkt eine Sprache für alle Computer in unserer Welt zu definieren müssen sich ständig ändern. Es würde zwar (wenn es gut entworfen ist) die Lernkurve für das Codieren einer neuen Architektur verkürzen, aber ich gehe davon aus, dass jeder Auftrag, den Sie damit ausführen möchten, statt eines Compilers nur für einen winzigen Bruchteil von Architekturen gelten würde. Dass Computer auf abstrakter Ebene gleich sind, ist ein roter Hering, es geht um Maschinencode.
PJTraill
7

Sie erwähnen den Satz "einmal schreiben, irgendwo laufen", ohne seine Bedeutung zu bemerken. Das ist der Marketing - Slogan für Sun Microsystem , die im Handel das Konzept einer erfundenen „virtuellen Maschine“ und „Bytecode“ für Java, obwohl möglicherweise hat die Idee , in der Wissenschaft 1 entstanden sein st. Die Idee wurde später von Microsoft für .NET kopiert, nachdem Sun sie erfolgreich wegen Verstoßes gegen die Java-Lizenzierung verklagt hatte. Java-Bytecodes sind eine Implementierung der Idee einer maschinenübergreifenden Assemblierung oder Maschinensprache. Sie werden für mehrere andere Sprachen als Java verwendet und können theoretisch zum Kompilieren einer beliebigen Sprache verwendet werden. Nach vielen Jahren fortschrittlicher Optimierung kommt Java den kompilierten Sprachen sehr nahe und zeigt, dass das Ziel einer leistungsfähigen plattformunabhängigen virtuellen Maschinentechnologie im Allgemeinen erreichbar ist.

Eine weitere neue Idee, die in einem frühen Stadium Ihren Anforderungen entspricht, heißt Recomputation Project und dient der wissenschaftlichen Forschung, könnte aber auch für andere Zwecke verwendet werden. Die Idee ist, Computerexperimente über die Technologie virtueller Maschinen replizierbar zu machen. Dies ist hauptsächlich die Idee, verschiedene Maschinenarchitekturen auf beliebiger Hardware zu simulieren.

vzn
quelle
8
Sun hat weder virtuelle Maschinen noch Bytecode erfunden, sie waren nicht einmal die erste Gruppe, die damit Geld verdient hat. P-Code nachschlagen.
Jmoreno
@jmoreno: Vielleicht möchte er auch Smalltalk nachschlagen.
Bob Jarvis - Reinstate Monica
Der Artikel erhebt keinen Anspruch auf von Sun erfundenen virtuellen Maschinen- / Bytecode. Es gibt eine andere Geschichte, die nicht zitiert, aber angedeutet ist. Übrigens eine andere Schlüsseltechnologie, die hier sehr relevant ist: Google Native Client (Chrome-Funktion)
vzn
5

Gründe auf hohem Niveau

Wenn Sie darüber nachdenken, macht ein Mikroprozessor eine erstaunliche Sache: Mit ihm können Sie eine Maschine (wie eine Waschmaschine oder einen Aufzug) nehmen und einen ganzen Block von kundenspezifischen Mechanismen oder Schaltkreisen durch billiges, in Massenproduktion hergestelltes Silizium ersetzen Chip. Sie sparen viel Geld für Teile und viel Zeit für das Design.

Aber warten Sie, ein Standard- Chip, der unzählige Sonderanfertigungen ersetzt ? Es kann keinen einzigen perfekten Mikroprozessor geben, der für jede Anwendung perfekt ist. Einige Anwendungen müssen den Stromverbrauch minimieren, müssen jedoch nicht schnell sein. andere müssen schnell sein, müssen aber nicht einfach zu programmieren sein, andere müssen kostengünstig sein usw.

Wir haben also viele verschiedene "Geschmacksrichtungen" von Mikroprozessoren, jede mit ihren eigenen Stärken und Schwächen. Es ist wünschenswert, dass alle Benutzer einen kompatiblen Befehlssatz verwenden, da dies die Wiederverwendung von Code ermöglicht und es einfacher macht, Personen mit den richtigen Fähigkeiten zu finden. Der Befehlssatz wirkt sich jedoch auf die Kosten, die Komplexität, die Geschwindigkeit, die Benutzerfreundlichkeit und die physischen Einschränkungen des Prozessors aus. Daher haben wir einen Kompromiss: Es gibt einige "Mainstream" -Befehlssätze (und viele kleinere) und In jedem Befehlssatz gibt es viele Prozessoren mit unterschiedlichen Eigenschaften.

Oh, und wenn sich die Technologie ändert, ändern sich all diese Kompromisse, sodass sich Anweisungssätze entwickeln, neue entstehen und alte sterben. Selbst wenn es einen "besten" Befehlssatz von heute gäbe, könnte es nicht in 20 Jahren sein.

Hardware-Details

Die wahrscheinlich größte Entwurfsentscheidung in einem Befehlssatz ist die Wortgröße , dh wie groß eine Zahl ist, die der Prozessor "natürlich" manipulieren kann. 8-Bit-Prozessoren verarbeiten Zahlen von 0 bis 255, während 32-Bit-Prozessoren Zahlen von 0 bis 4.294.967.295 verarbeiten. Code, der für einen entwickelt wurde, muss für einen anderen komplett überarbeitet werden.

Es geht nicht nur darum, Anweisungen von einem Befehlssatz in einen anderen zu übersetzen. Ein völlig anderer Ansatz kann in einem anderen Befehlssatz vorzuziehen sein. Auf einem 8-Bit-Prozessor kann beispielsweise eine Nachschlagetabelle ideal sein, während auf einem 32-Bit-Prozessor eine arithmetische Operation für denselben Zweck besser wäre.

Es gibt andere Hauptunterschiede zwischen Befehlssätzen. Die meisten Anweisungen lassen sich in vier Kategorien einteilen:

  • Berechnung (Arithmetik und Logik)
  • Kontrollfluss
  • Datentransfer
  • Prozessorkonfiguration

Prozessoren unterscheiden sich darin, welche Art von Berechnungen sie ausführen können und wie sie sich dem Kontrollfluss, der Datenübertragung und der Prozessorkonfiguration nähern.

Beispielsweise können einige AVR-Prozessoren weder multiplizieren noch dividieren. Während alle x86-Prozessoren können. Wie Sie sich vielleicht vorstellen können, kann die Eliminierung der für Aufgaben wie Multiplikation und Division erforderlichen Schaltkreise einen Prozessor einfacher und billiger machen. Diese Vorgänge können weiterhin mithilfe von Softwareroutinen ausgeführt werden, wenn sie benötigt werden.

Mit x86 können arithmetische Anweisungen ihre Operanden aus dem Speicher laden und / oder ihre Ergebnisse im Speicher speichern. ARM ist eine Load-Store-Architektur und verfügt daher nur über wenige dedizierte Anweisungen für den Speicherzugriff. Mittlerweile verfügt x86 über dedizierte Anweisungen für bedingte Verzweigungen, während ARM die bedingte Ausführung praktisch aller Anweisungen ermöglicht . ARM ermöglicht auch das Durchführen von Bitverschiebungen als Teil der meisten arithmetischen Anweisungen. Diese Unterschiede führen zu unterschiedlichen Leistungsmerkmalen, Unterschieden im internen Design und den Kosten der Chips sowie Unterschieden in den Programmiertechniken auf Assemblersprachenebene.

Fazit

Der Grund, warum es unmöglich ist, eine universelle Assemblersprache zu haben, ist, dass man den Code neu entwerfen muss, um Assembler-Code von einem Befehlssatz in einen anderen zu konvertieren - etwas, das Computer noch nicht können.

Artelius
quelle
Hervorragende Antwort! Die Leute verstehen nicht gut genug, dass es bei uns überall Computer gibt, die programmiert werden müssen. Es sind nicht nur die Anwendungen, die wir auf unseren Bildschirmen sehen. Wie viele Milliarden Chips werden pro Jahr hergestellt?
Phs
4

Hinzu kommt die wunderbare Antwort von DW: Wenn Sie einen Assembler haben möchten, müssen Sie alle Architekturen beibehalten, einen perfekten Übersetzer unter sich haben und vollständig verstehen, was Sie tun.
Einige stark optimierte Codes für eine Architektur müssten deoptimiert, auf einer abstrakteren Ebene verstanden und für eine andere optimiert werden.
Wenn dies jedoch möglich wäre, hätten wir einen perfekten C-Compiler, und das Schreiben in reiner Assembly wäre überhaupt nicht vorteilhaft.
Der wichtigste Punkt bei der Verwendung von Assembler ist die Leistung, die von den neuesten Compilern nicht beeinträchtigt werden kann.
Das Schreiben eines solchen Programms wäre noch schwieriger als bei vorhandenen Compilern, und das Beibehalten aller neuen Architekturen, die erstellt werden, würde es noch schwieriger machen.
Und für "one only" -Programme würde dies auch vollständige Abwärtskompatibilität bedeuten.

Böse
quelle
In den allermeisten Fällen führt gcc eine bessere Optimierung durch als ein Programmierer. Der Hauptzweck von Assembler besteht darin, Dinge zu tun, die Sie in C nicht tun können, wie auf Register zuzugreifen. Wenn Sie sich den Linux-Quelltextbaum ansehen, ist das ziemlich genau das, wofür sie Assembly verwenden.
Slebetman
Mit @slebetman - gcc können Sie eine Variable in ein Register einfügen, ohne auf die Assembly zurückgreifen zu müssen.
Jirka Hanika
@JirkaHanika: Sprechen Sie über CPU-Register oder spezielle Hardware-Register, die mit speziellen Anweisungen angesprochen werden? Ich vermute, Slebetman meint letzteres.
PJTraill
"All codes" - "GCC does better" = "Sie verwenden Assembler". Ja, Sie können auf Register zugreifen, ohne Assembler einfügen zu müssen.
Evil
@PJTraill - Slebetmans Kommentar ist im Allgemeinen hervorragend und sollte vielleicht in die Antwort aufgenommen werden. Aber beide seiner Beispiele (Registerzugriff und Linux-Quellbaum) speisen wahrscheinlich häufige Missverständnisse, anstatt dass sie hervorragende Beispiele dafür sind, was man in C mit gcc-Erweiterungen nicht machen kann . diese sollten ersetzt oder weggelassen werden. (Wenn es heute eine HW-Anweisung gibt, etwas zu tun, haben Sie in einem Jahr die entsprechende gcc-Erweiterung. Nicht immer, aber sehr oft. Beispiele Alter.)
Jirka Hanika
3

Microsoft hat MSIL als Intermediate Assembler-Sprache erfunden . Programme würden von C # oder VB.Net nach MSIL kompiliert. Zur Laufzeit wurde die MSIL mit einem JIT- Compiler zu Maschinencode für die Maschine kompiliert, auf der sie ausgeführt wurde . Die Datei mit der MSIL war eine .EXE-Datei mit einigen Anweisungen zum Starten des Programms in X86. Auf einem ARM-Prozessor geben Sie das Wort mono vor dem Programmnamen ein, um es auszuführen.

Russell Harkins
quelle
Was ist der Unterschied zwischen "Intermediate Assembler" und "Virtual Machine"?
Bob Jarvis - Wiedereinsetzung von Monica
@ BobJarvis: Einer ist Code, während der andere ein Interpreter ist. Sie sollten gefragt haben, was der Unterschied zwischen Intermediate Assembly und Bytecode ist
Slebetman
Dies scheint die Frage nicht zu beantworten. Solange jede Maschine MSIL anders kompiliert / zusammensetzt, ist nichts Universelles daran und der Zweck einer solchen Kompilierung ist die Portierung generischer Funktionen und nicht die Ausnutzung eines bestimmten Befehlssatzes, der, wie DW hervorhebt, das (oder das) ist a) Grund für die Verwendung von Assembler.
PJTraill
3

Wie bereits erwähnt, ist LLVM dem bisher am nächsten. Ein großes Hindernis für eine wirklich universelle Sprache sind grundlegende Unterschiede in Bezug auf implizite Kompromisse: Parallelität, Speichernutzung, Durchsatz, Latenz und Stromverbrauch. Wenn Sie explizit im SIMD-Stil schreiben, wird möglicherweise zu viel Speicher verwendet. Wenn Sie explizit im SISD-Stil schreiben, erhalten Sie eine suboptimale Parallelisierung. Wenn Sie den Durchsatz optimieren, wird die Latenz beeinträchtigt. Wenn Sie den Single-Threaded-Durchsatz (dh die Taktrate) maximieren, wird die Akkulaufzeit beeinträchtigt.

Zumindest müsste der Code mit den Kompromissen versehen werden. Was am wichtigsten sein kann, ist, dass die Sprache gute algebraische / Typeneigenschaften hat, die dem Compiler viel Spielraum zum Optimieren und Erkennen logischer Inkonsistenzen geben.

Dann ist da die Frage nach undefiniertem Verhalten. Ein Großteil der Geschwindigkeit von C und Assemblersprachen beruht auf undefiniertem Verhalten. Wenn Sie undefiniertes Verhalten eingestehen, das tatsächlich vorkommt, werden Sie letztendlich als Sonderfälle behandelt (dh: architektur- und kontextspezifische Hacks).

rauben
quelle
0

Vielleicht suchen Sie eine Universal Turning Machine-Notation, in der sich alle auf die Symbole für die Befehle einigen. ( https://en.wikipedia.org/wiki/Universal_Turing_machine )

Ein Assembler, der eine Turning Acceptable-Sprache in den zugrunde liegenden herstellerspezifischen Maschinencode übersetzt und für all diese Dinge erstellt, die wir Computer nennen.

In der Kunst der Computerprogrammierung gibt es ein Beispiel dafür, wie dies aussehen könnte.

Aber stellen Sie sich die Frage "Warum ist ihre Sprache nicht eine im Handel erhältliche universelle Sprache, die mit allen Computern verwendet werden kann?" (2) Wirtschaftlichkeit, Bereitstellung von Inkompatibilität zwischen Maschinen verschiedener Marken und Anbietern ist eine Geschäftsstrategie sowie das Ergebnis begrenzter Ressourcen (Zeit / Geld) zum Entwerfen von Maschinen.

Chris
quelle
Die Frage ist nach einer Assemblersprache, mit der jeder Computer programmiert werden kann, und nicht nach einer Assemblersprache, die im Sinne der "universellen Turingmaschine" universell ist.
David Richerby
1
Church-Turing sagt uns, dass die UTC das kann, was jeder programmierbare Computer kann. Abgesehen von begrenzten physischen Speicherproblemen. Eine Assemblersprache für eine UTC ist durchaus machbar. Aber wie gesagt, kulturelle und wirtschaftliche Praktikabilität kann die tatsächliche Implementierung und Akzeptanz auf dem Markt einschränken.
Chris
Sie vermissen das größte Problem, nämlich die Leistung ! Warum sollte man eine Sprache verwenden, die 1000-mal langsamer ist, nur für das hochgesteckte Ziel, Hardware-Agnostiker zu sein? Die Turing-Maschine ist ein schreckliches Modell für das praktische Rechnen.
Artelius
1
Würden die Kommentatoren gerne Informatik anbieten, um ihre Behauptungen zu stützen? Dies ist immerhin das Informatikforum.
Chris
1
Ich bin kein CS-Experte. Was ich jedoch glaube, ist, dass die von Neumann-Architektur ein brillantes Stück Technik ist, das ein Gleichgewicht zwischen Programmierbarkeit und Leistung herstellt, während die Turing-Maschine zeigen soll, dass selbst die einfachste Maschine alles berechnen kann, was eine komplexere Maschine könnte. Sicher, Sie können einer Turing-Maschine immer mehr Funktionen hinzufügen (mehr Bänder, Arithmetik), aber dann haben Sie das gleiche Problem, das Sie anfangs hatten, nämlich Leute, die sich nicht auf einen Befehlssatz einigen. Außerdem verursacht das Fehlen von Direktzugriff bei vielen Algorithmen einen hohen Overhead.
Artelius
0

Annahme: Kompilieren und Optimieren einer Hochsprache L1 zu einer Niedrigsprache L0 ist einfacher als Kompilieren und Optimieren einer Hochsprache L2 (höher als L1) zu L0; einfacher in dem Sinne, dass Sie beim Kompilieren von L1 nach L0 angeblich optimierten Code generieren können als von L2 nach L0.

Ich denke, die Annahme ist wahrscheinlich richtig, deshalb verwenden wahrscheinlich die meisten Compiler eine einfache Zwischensprache (IR / LLVM).

Wenn dies zutrifft, verwenden Sie eine Low-Level-Sprache L0 und schreiben Sie Compiler, um L0 in andere Low-Level-Sprachen zu übersetzen. Verwenden Sie beispielsweise den MIPS-Befehlssatz und kompilieren Sie ihn zu x86, arm, power, ...

-Taoufik

Taoufik Dachraoui
quelle
Sie wissen also nicht, ob Ihre Antwort richtig ist? Und kann es nicht unterstützen?
Evil