Интерпретатор для… Си

в 5:38, , рубрики: python, интерпретатор, Программирование, метки: , ,

Здравствуй, %username%!

Недавно меня посетила идея

Многие новички не хотят изучать Си (да и вообще все языки-компиляторы) из-за того, что даже после внесения незначительной правки, нужно перекомпилировать программу, что отнимает немало времени.
У интерпретаторов такого изъяна нет. У некоторых языков, например у python, есть даже интерактивный интерпретатор, котороый вообще позволяет не думать о второстепенных командах, по запуску приложения, и полностью отдаться процессу изучения языка.
Но что мешает написать интерпретатор (конечно это мы делать не будем) для Си?

Что это такое?

Идея такого интерпретатора заключается в том, чтобы он спрашивал у пользователя команды, сам вел учет всех функций, выводил нужные переменные и САМ компилировал и моментально выводил результат.
Вот как будет выглядеть диалог с таким «Интерпретатором»:

>>>int sqr(int a) {
... return a*a;
... }
Function sqr writen.
>>>int tmp;
>>>tmp=5;
>>>tmp
5
>>>tmp=sqr(tmp);
>>>tmp
25

Как видите это тот же python, только это Си) Не правда ли было бы удобнее для новичков?

Что он должен уметь?

  • Ну естественно в первую очередь он должен писать приглашения, отлавливать вывод и смотреть, что ввел пользователь.
  • Если то, что ввел пользователь — это функция, то ввести специальные приглашения и запоминать всё, что будет введено до последней фигурной скобки. Дальше все это он должен записать в отдельный файл с именем функции и сделать INCLUDE в главном файле.
  • Если же это просто команда на Си, то добавить её в функцию main в главном файле. Если при этом определяется переменная, то для удобства чтения записать её в шапку функции.
  • Если это INCLUDE, макрос либо ещё что-то, что должно находится в начале файла, то записать это в необходимое место.
  • Если это имя переменной без точки с запятой на конце, то вывести эту переменную на экран, добавив в конец main соответствующий printf, запустив программу и отловив весь вывод, кроме этой переменной. В конце убрать printf из main.
  • Так же если введено имя функции, которая уже была записана, то открыть файл с ней на редактирование.
  • Должна быть функция «отката во времени» какая есть в bpython. т.е. по нажатию Ctrl+Z по порядку идет возврат строчек из main.
  • Ну и много много опциональных фич.

Как это организовать?

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

#include "sqr.c"
#include <stdio.h>

main(){
int tmp;
tmp=5;
tmp=sqr(tmp);
}

Т.е, как уже было написано, интерпретатор будет сам ставить include на второстепенные функции и на важные модули, вроде stdio.

Скорее всего для удобства необходимо будет после каждой новой строчки (почти после каждой) в функции main перкомпилировать главный файл и запускать его на выполнение, отлавливая вывод, который уже был и выводя только новый, появившийся с новой строчкой.
Это не будет отнимать много времени, т.к. в интерпретаторе большие программы не пишутся. А для компиляции учебной программы на современных компьютерах не уйдет много времени.

Эпилог.

Конечно, с таким «интерпретатором» для Си, изучение языка будет гораздо проще и быстрее. Но осталось не решено ещё много практических вопросов, которые я оставляю на совесть программиста такого интерпретатора.

Если вы дочитали эту статью до конца, и так и не поняли практического смысла такого инструмента или слова «интерпретатор» и «Си» не уживаются в вашей голове, то можете сразу же забыть все что вы узнали и не морочить себе голову)

Автор: Korivanor

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js