Gibt es einen in Javascript oder Java geschriebenen C-Interpreter?
Ich brauche keinen vollständigen Interpreter, aber ich muss in der Lage sein, das Programm Schritt für Schritt auszuführen und die Werte von Variablen, den Stack … all das in einer Webschnittstelle zu sehen.
Die Idee ist, C-Anfängern zu helfen, indem sie ihnen die schrittweise Ausführung des Programms zeigen. Wir verwenden GWT, um die Schnittstelle zu erstellen. Wenn also etwas in Java vorhanden ist, sollten wir es verwenden können.
Ich kann es an meine Bedürfnisse anpassen, aber wenn ich es vermeiden kann, den Parser / Abstract-Syntax Tree Walker / Stack-Manipulation zu schreiben … das wäre großartig.
Bearbeiten :
Um es klar zu sagen, ich möchte nicht das komplette C simulieren, weil einige Programme wirklich knifflig sein können.
Mit Schritt meine ich eine grundlegende Operation wie: Ausdrucksauswertung, Affirmation, Funktionsaufruf.
Das CI, das simuliert werden soll, enthält: Variablen, for, while, Funktionen, Arrays, Zeiger, mathematische Funktionen. Kein goto, String-Funktionen, ctypes.h, setjmp.h … (zumindest vorerst).
In diesem Beispiel haben wir den C-Code manuell in eine Javascript-Darstellung konvertiert, aber es ist begrenzt (Ausdrücke wie z a == 2 || a = 1 werden nicht behandelt) und ist auf manuell konvertierte Programme beschränkt.
Wir haben einen C-Compiler auf einem Remote-Server zur Verfügung, damit wir überprüfen können, ob der Code korrekt ist (und kein undefiniertes Verhalten aufweist). Das Parsing / die AST-Konstruktion kann auch remote erfolgen (also in jeder Sprache), aber das AST-Walking muss in Javascript sein, um auf der Clientseite ausgeführt zu werden.
Das könntest du dir mal anschauen JavaScript-PC-Emulator das auch eine Form von Linux ausführt und einen C-Compiler hat (aber vielleicht etwas zu weit außerhalb des Geltungsbereichs).
– Felix Klinge
26. Mai 2011 um 16:59 Uhr
@Felix: Das ist interessant, aber eher getrennt von dem, was OP wollte. @Loïc: C wird nicht wirklich in “Schritten” ausgeführt oder ist zumindest nicht erforderlich. Am ehesten wären Sequenzpunkte. Ich erwähne dies nur, weil das Lernen von C, als ob es laut Quelle in “High-Level-Asm” -Schritten ausgeführt würde, eine Hauptquelle für Missverständnisse für Anfänge in C ist.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
26. Mai 2011 um 17:04 Uhr
@Felix: Das sind ungefähr 50 Abstraktionsebenen. Der JS-Code emuliert einige x86-Hardware, ein Linux-Kernel läuft darauf und führt verschiedene ausführbare Dateien aus, darunter tcc das in C geschrieben wurde, aber in Form von x86-Opcodes ausgeführt wird. TCC kompiliert C-Programme ziemlich direkt in ausführbare x86-Dateien, und dieser x86-Code wird wiederum von dem oben erwähnten Stack ausgeführt. Viel Glück bei der Verwendung von Javascript!
– Benutzer395760
26. Mai 2011 um 17:05 Uhr
@all: yeah … um nur die Werte und den Stack zu inspizieren, ist es wirklich nicht geeignet … entschuldige.
– Felix Klinge
26. Mai 2011 um 17:07 Uhr
@Felix: nicht das, wonach ich gesucht habe, aber interessant @R..: mit Schritt meine ich eine grundlegende Operation wie Affektiertheit, Ausdrucksauswertung, Funktionsaufruf. Ich möchte die Ausführung Zeile für Zeile verfolgen.
– Loïc Février
26. Mai 2011 um 17:13 Uhr
ataylor
Da ist ein C-Grammatik verfügbar für Antlr die Sie verwenden können, um einen C-Parser in Java und möglicherweise auch JavaScript zu generieren.
Es gibt em-scripten, das LLVM-Sprachen in JS konvertiert, indem Sie ein wenig darauf hacken, und Sie können möglicherweise einen C-Interperter erstellen.
Picoc ist ein C-Interpreter, der in C geschrieben ist. Es könnte möglich sein, ihn mit Emscripten in JavaScript zu kompilieren.
– Anderson Green
15. März 2016 um 2:24 Uhr
Adam Davis
felixhs JSCPP-Projekt bietet einen C++-Interpreter in Javascript, allerdings mit einigen Einschränkungen.
var JSCPP = require('JSCPP');
var launcher = JSCPP.launcher;
var code="int main(){int a;cin>>a;cout<<a;return 0;}";
var input="4321";
var exitcode = launcher.run(code, input);
console.info('program exited with code ' + exitcode);
Ab März 2015 befindet sich dies in aktiver Entwicklung, so dass es, obwohl es nutzbar ist, noch Bereiche gibt, in denen es weiter ausgebaut werden kann. Überprüfen Sie die Dokumentation auf Einschränkungen. Es sieht so aus, als könnten Sie es vorerst ohne weitere Probleme als reinen C-Interpreter mit eingeschränkter Bibliotheksunterstützung verwenden.
Leider fällt dieser Interpreter schon an printf("foo")
– kungfooman
20. Februar 2016 um 22:46 Uhr
printf benötigt #include <cstdio> zu arbeiten .. hier ist eine Online-Version felixhao28.github.io/JSCPP
– Milahu
15. August 2020 um 12:16 Uhr
steveha
Ich kenne keine in JavaScript geschriebenen C-Interpreter, aber hier ist eine Diskussion der verfügbaren C-Interpreter:
Gibt es einen Interpreter für C?
Sie sollten besser nach einer Art virtueller Maschine suchen, die auf JavaScript ausgeführt wird, und dann nachsehen, ob Sie einen C-Compiler finden können, der den richtigen Maschinencode für die VM ausgibt. Ein wahrscheinlicher scheint LLVM zu sein; Wenn Sie eine JavaScript-VM finden, die LLVM ausführen kann, sind Sie in bester Verfassung.
Ich habe ein paar Google-Suchen durchgeführt und Emscripten gefunden, das C-Code direkt in JavaScript übersetzt! Vielleicht kannst du damit etwas anfangen:
Vielleicht können Sie Emscripten so modifizieren, dass es nach jeder kompilierten Zeile von C einen “Sequenzpunkt” ausgibt, und dann können Sie Ihre simulierte Umgebung in einem einzigen Schritt von Sequenzpunkt zu Sequenzpunkt ausführen.
Ich glaube, Emscripten implementiert LLVM, also kann es tatsächlich virtuelle Register haben; Wenn ja, könnte es für Ihre Zwecke ideal sein.
steveha
Ich weiß, dass Sie C-Code angegeben haben, aber vielleicht möchten Sie eine JavaScript-Emulation einer einfacheren Sprache in Betracht ziehen. Bitte beachten Sie insbesondere FORTH.
FORTH läuft auf einer extrem einfachen virtuellen Maschine. In FORTH gibt es zwei Stacks, einen Datenstack und einen Steuerfluss-Stack (als “Rückgabe”-Stack bezeichnet); plus einige globale Speicher. Ursprünglich war FORTH eine 16-Bit-Sprache, aber es gibt inzwischen viele 32-Bit-FORTH-Implementierungen.
Da der FORTH-Code sozusagen “nah an der Maschine” ist, ist es leicht zu verstehen, wie alles funktioniert, wenn Sie sehen, wie es funktioniert. Ich habe FORTH gelernt, bevor ich C gelernt habe, und ich fand es eine wertvolle Lernerfahrung.
Es sind bereits mehrere FORTH-Interpreter in JavaScript verfügbar. Die virtuelle FORTH-Maschine ist so einfach, dass es nicht lange dauert, sie zu implementieren!
Sie könnten sogar einen C-zu-FORTH-Übersetzer besorgen und die Schüler beobachten lassen, wie die virtuelle FORTH-Maschine kompilierten C-Code interpretiert.
Ich halte diese Antwort für einen Weitschuss für Sie, also höre ich hier auf zu schreiben. Wenn Sie tatsächlich an der Idee interessiert sind, kommentieren Sie unten und fragen Sie nach weiteren Details, und ich werde sie gerne teilen. Es ist lange her, seit ich einen FORTH-Code geschrieben habe, aber ich erinnere mich immer noch gerne daran, und ich würde gerne mehr über FORTH sprechen.
BEARBEITEN: Obwohl diese Antwort auf eine negative Punktzahl herabgestuft wurde, werde ich sie hier belassen. Eine Simulation für Bildungszwecke ist IMHO wertvoller, wenn die Simulation einfach und leicht verständlich ist. Die einfache stapelbasierte virtuelle Maschine für FORTH ist sehr einfach, aber Sie könnten C-Code kompilieren, um darauf zu laufen. (In den 80er Jahren wurde sogar ein CPU-Chip hergestellt, der FORTH-Anweisungen als nativen Maschinencode hatte.) Und wie gesagt, ich habe FORTH persönlich studiert, als ich ein absoluter Anfänger war, und es hat mir geholfen, Assembler und C zu verstehen.
Die Frage hat keine akzeptierte Antwort, jetzt über zwei Jahre nachdem sie gestellt wurde. Es könnte sein, dass Loïc Février keinen passenden JavaScript-Interpreter gefunden hat. Wie gesagt, es gibt bereits mehrere JavaScript-Interpreter für die virtuelle FORTH-Maschine. Daher ist diese Antwort praktisch.
Benutzer15150266
C ist eine kompilierte Sprache, keine interpretierte Sprache, und verfügt über Funktionen wie Zeiger, die JS vollständig nicht unterstützt, sodass das Interpretieren von C in Javascript nicht wirklich sinnvoll ist
13820000cookie-checkC-Interpreter in Javascript geschriebenyes
Das könntest du dir mal anschauen JavaScript-PC-Emulator das auch eine Form von Linux ausführt und einen C-Compiler hat (aber vielleicht etwas zu weit außerhalb des Geltungsbereichs).
– Felix Klinge
26. Mai 2011 um 16:59 Uhr
@Felix: Das ist interessant, aber eher getrennt von dem, was OP wollte. @Loïc: C wird nicht wirklich in “Schritten” ausgeführt oder ist zumindest nicht erforderlich. Am ehesten wären Sequenzpunkte. Ich erwähne dies nur, weil das Lernen von C, als ob es laut Quelle in “High-Level-Asm” -Schritten ausgeführt würde, eine Hauptquelle für Missverständnisse für Anfänge in C ist.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
26. Mai 2011 um 17:04 Uhr
@Felix: Das sind ungefähr 50 Abstraktionsebenen. Der JS-Code emuliert einige x86-Hardware, ein Linux-Kernel läuft darauf und führt verschiedene ausführbare Dateien aus, darunter
tcc
das in C geschrieben wurde, aber in Form von x86-Opcodes ausgeführt wird. TCC kompiliert C-Programme ziemlich direkt in ausführbare x86-Dateien, und dieser x86-Code wird wiederum von dem oben erwähnten Stack ausgeführt. Viel Glück bei der Verwendung von Javascript!– Benutzer395760
26. Mai 2011 um 17:05 Uhr
@all: yeah … um nur die Werte und den Stack zu inspizieren, ist es wirklich nicht geeignet … entschuldige.
– Felix Klinge
26. Mai 2011 um 17:07 Uhr
@Felix: nicht das, wonach ich gesucht habe, aber interessant @R..: mit Schritt meine ich eine grundlegende Operation wie Affektiertheit, Ausdrucksauswertung, Funktionsaufruf. Ich möchte die Ausführung Zeile für Zeile verfolgen.
– Loïc Février
26. Mai 2011 um 17:13 Uhr