C интерпретатор написан на JavaScript - PullRequest
30 голосов
/ 26 мая 2011

Есть ли какой-нибудь интерпретатор C, написанный на javascript или java?

Мне не нужен полный переводчик, но мне нужно иметь возможность выполнять пошаговое выполнение программы и видетьзначения переменных, стек ... все это в веб-интерфейсе.

Идея состоит в том, чтобы помочь новичкам в C, показав им пошаговое выполнение программы.Мы используем GWT для построения интерфейса, поэтому, если что-то существует в Java, мы можем использовать его.

Я могу изменить его в соответствии со своими потребностями, но если я могу избежать написания синтаксического синтаксического синтаксического анализатора / дереваманипуляция с ходом / стеком ... это было бы здорово.


Редактировать:

Чтобы было ясно, я не хочу моделировать полный C, потому что некоторыепрограммы могут быть очень хитрыми.

Под шагом я подразумеваю базовую операцию, такую ​​как: оценка выражения, аффектация, вызов функции.

CI, который требуется смоделировать, будет содержать: переменные, дляфункции, массивы, указатели, математические функции.Нет goto, строковые функции, ctypes.h, setjmp.h ... (по крайней мере, на данный момент).

Вот прототип: http://www.di.ens.fr/~fevrier/war/simu.html

В этом примере мы преобразовали вручнуюкод C представляет собой представление javascript, но оно ограничено (выражения, такие как a == 2 || a = 1, не обрабатываются) и ограничено программами, конвертированными вручную.

Мы располагаем компилятором C на удаленном сервере, поэтому мы можемпроверьте правильность кода (и не имеет неопределенного поведения).Конструкцию синтаксического анализа / AST также можно выполнять удаленно (например, на любом языке), но для выполнения на стороне клиента необходимо, чтобы ход AST шел в javascript.

Ответы [ 5 ]

5 голосов
/ 26 мая 2011

Для antlr доступна грамматика C , которую можно использовать для создания синтаксического анализатора C в Java и, возможно, также в JavaScript.

4 голосов
/ 03 июля 2012

Существует em-scripten, который конвертирует языки LLVM в JS, немного взломав его, и вы сможете создать интерпретатор языка C.

1 голос
/ 03 апреля 2015

felixh * Проект JSCPP предоставляет интерпретатор C ++ в Javascript, хотя и с некоторыми ограничениями.

https://github.com/felixhao28/JSCPP

Так примерПрограмма может выглядеть следующим образом:

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);

По состоянию на март 2015 года она находится в стадии активной разработки, поэтому, пока она пригодна для использования, все еще существуют области, в которых она может продолжать расширяться.Проверьте документацию на наличие ограничений.Похоже, вы можете использовать его как прямой интерпретатор C с ограниченной библиотечной поддержкой, без каких-либо проблем.

1 голос
/ 04 июля 2012

Я знаю, что вы указали код C, но вы можете рассмотреть эмуляцию JavaScript более простого языка. В частности, пожалуйста, рассмотрите FORTH.

FORTH работает на очень простой виртуальной машине. В FORTH есть два стека, стек данных и стек потока управления (называемый стеком возврата); плюс немного глобальной памяти. Первоначально FORTH был 16-битным языком, но сейчас существует множество 32-битных реализаций FORTH.

Поскольку FORTH-код вроде «близок к машине», легко понять, как все это работает, когда вы видите, как он работает. Я выучил FORTH до того, как выучил C, и обнаружил, что это ценный опыт обучения.

В JavaScript уже есть несколько интерпретаторов FORTH. Виртуальная машина FORTH настолько проста, что ее реализация не займет много времени!

Вы могли бы даже тогда получить переводчик C-to-FORTH и позволить ученикам смотреть, как виртуальная машина FORTH интерпретирует скомпилированный код C.

Я считаю этот ответ долгожданным для вас, поэтому я перестану писать здесь. Если вы на самом деле заинтересованы в идее, прокомментируйте ниже и попросите более подробную информацию, и я буду рад поделиться ими. Прошло много времени с тех пор, как я написал любой код FORTH, но я до сих пор помню его с любовью, и я был бы рад рассказать больше о FORTH.

РЕДАКТИРОВАТЬ: Несмотря на то, что этот ответ был отрицательно оценен, я собираюсь оставить его здесь. Имитация для образовательных целей ИМХО более ценна, если симуляция проста и понятна. Простая виртуальная машина на основе стека для FORTH очень проста, но вы можете скомпилировать код C для запуска на ней. (В 80-х был даже изготовлен чип процессора, в котором инструкции FORTH были в качестве собственного машинного кода.) И, как я уже сказал, я лично изучал FORTH, когда я был новичком, и это помогло мне понять язык ассемблера и C.

На вопрос нет принятого ответа, сейчас прошло более двух лет с момента его постановки. Возможно, Лоик Февриер не нашел подходящего интерпретатора JavaScript. Как я уже сказал, уже существует несколько интерпретаторов JavaScript для виртуальной машины FORTH. Поэтому этот ответ является практическим.

1 голос
/ 03 июля 2012

Я не знаю ни одного интерпретатора C, написанного на JavaScript, но вот обсуждение доступных интерпретаторов C:

Есть ли интерпретатор для C?

Возможно, вам лучше поискать виртуальную машину любого типа, которая работает поверх JavaScript, а затем посмотреть, сможете ли вы найти компилятор C, который выдает правильный машинный код для виртуальной машины.Скорее всего, это будет LLVM;если вы можете найти виртуальную машину JavaScript, которая может запускать LLVM, то вы будете в отличной форме.

Я сделал несколько поисков в Google и нашел Emscripten, который напрямую переводит код C в JavaScript!Возможно, вы можете сделать что-то с этим:

https://github.com/kripken/emscripten/wiki

Возможно, вы можете изменить Emscripten так, чтобы он выдавал «точку последовательности» после каждой скомпилированной строки C, а затем вы можете создать свою симулированную средуодин шаг от точки последовательности к точке последовательности.

Я полагаю, что Emscripten реализует LLVM, поэтому он может фактически иметь виртуальные регистры;если это так, то это может быть идеально для ваших целей.

...