Подтвердить что ты не робот

C переводчик, написанный на javascript

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

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

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

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


Изменить:

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

Я не знаю ни одного C-переводчика, написанного на JavaScript, но здесь обсуждаются доступные C-переводчики:

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

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

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

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

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

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

Ответ 4

Я знаю, что вы указали 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.

Вопрос не имеет принятого ответа, теперь через два года после его запроса. Возможно, Loïc Février не нашел подходящего переводчика JavaScript. Как я уже сказал, уже существует несколько интерпретаторов JavaScript для виртуальной машины FORTH. Поэтому этот ответ является практическим.

Ответ 5

felixh Проект АКПП предоставляет интерпретатор С++ в 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 с ограниченной библиотечной поддержкой, без каких-либо дополнительных проблем.