Здравствуй, %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