Научная статья на тему 'Обзор интерпретатора подмножества языка с++ LabC++'

Обзор интерпретатора подмножества языка с++ LabC++ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
87
15
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ / SOFTWARE / ИНТЕРПРЕТАТОР / INTERPRETER / ЛЕКСИЧЕСКИЙ АНАЛИЗ / LEXICAL ANALYSIS

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Сарамуд М. В., Ефремова С. В., Бурдина Е. В., Перанцев Д. Г.

Описывается интерпретатор LabC++, его основные функции и переменные, использующиеся в самом процессе интерпретации.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Сарамуд М. В., Ефремова С. В., Бурдина Е. В., Перанцев Д. Г.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

REVIEW OF THE SUBSET OF C++ INTERPRETER LABC++

The paper describes LabC++ interpreter, its basic functions and variables used in the process of interpretation.

Текст научной работы на тему «Обзор интерпретатора подмножества языка с++ LabC++»

Математические методы моделирования, управления и анализа данных

УДК 004.6

ОБЗОР ИНТЕРПРЕТАТОРА ПОДМНОЖЕСТВА ЯЗЫКА С++ LABC++

М. В. Сарамуд, С. В. Ефремова, Е. В. Бурдина, Д. Г. Перанцев

Сибирский государственный аэрокосмический университет имени академика М. Ф. Решетнева Российская Федерация, 660037, г. Красноярск, просп. им. газ. «Красноярский рабочий», 31

E-mail: [email protected]

Описывается интерпретатор LabC++, его основные функции и переменные, использующиеся в самом процессе интерпретации.

Ключевые слова: программное обеспечение, интерпретатор, лексический анализ.

REVIEW OF THE SUBSET OF C++ INTERPRETER LABC++

M. V. Saramud, S. V. Efremova, E. V. Burdina, D. G. Perantsev

Reshetnev Siberian State Aerospace University 31, Krasnoyarsky Rabochy Av., Krasnoyarsk, 660037, Russian Federation E-mail: [email protected]

The paper describes LabC++ interpreter, its basic functions and variables used in the process of interpretation.

Keywords: software, interpreter, lexical analysis.

Интерпретатор - это средство выполнения программы на С++. Суть процесса интерпретации можно описать с помощью следующего алгоритма: Пока (есть_лексемы) { получи следующую лексему; выполни назначенное действие; }.

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

Рассмотрим предварительный просмотр в интерпретаторе. Прежде чем интерпретатор начнет выполнение программы, следует решить две важные организационные задачи: должны быть найдены и инициализированы все глобальные переменные; должно быть определено местоположение каждой функции в программе.

Эти задачи выполняются в интерпретаторе процедурой предварительного просмотра. В LabC++ весь выполняемый код сосредоточен внутри функций, поэтому интерпретатору незачем выходить за пределы функций. Но объявления глобальных переменных находятся вне функций. Следовательно, необходимо обработать эти объявления с помощью предварительного просмотра программы. У интерпретатора нет другого (эффективного) способа узнать о них.

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

Обнаружение точек входа для всех функций служит и другой цели. Как мы знаем, выполнение программы на С++ начинается не с первой строки кода, а с запуска функции main(). Более того, не требуется, чтобы описание этой функции было первым в программе. Следовательно, необходимо найти местоположение функции main() в исходном коде для того, чтобы выполнение программы могло начаться с этой точки (следует помните также о том, что объявления глобальных переменных могут предшествовать функции main(), поэтому даже если она описана в исходном коде первой, это вовсе необязательно означает, что с первой строки кода). Поскольку процедура предварительного просмотра находит точки входа для всех функций, она определяет точку вхождения в main(). Функция, выполняющая предварительный просмотр программы, называется prescan(). Функция prescan() работает следующим образом. Каждый раз, когда обнаруживается открывающая фигурная скобка, переменная brace увеличивается на единицу. Когда же найдена закрывающая фигурная скобка, переменная brace уменьшается на единицу. Следовательно, если переменная brace больше нуля, текущая лексема читается из тела функции. Если же при обнаружении переменной brace равна нулю, пресканер знает, что найдена глобальная переменная. Точно так же, если при brace, равной нулю, обнаружено имя функции, то это должно быть определение функции (напоминаем, что интерпретатор Lab С++ не поддерживает прототипы функций).

Функция interp() - это сердце интерпретатора. Она решает, какое действие предпринять, основываясь на лексеме, следующей за текущей во входном потоке. Эта функция интерпретирует одну логическую единицу кода и завершается. Если единица кода

Решетнеескцие чтения. 2015

содержит один оператор, то он интерпретируется, и функция возвращается. Если же прочитана открывающая фигурная скобка, то интерпретируются все операторы, входящие в блок. Для этого служит переменная-флаг - block, которой присваивается 1, если считана открывающая фигурная скобка. Благодаря этому функция продолжает интерпретировать операторы до тех пор, пока не будет прочитана закрывающая фигурная скобка.

Если нет вызовов таких функций, как exit(), программа на С++ завершается, когда обнаружена последняя фигурная скобка (или оператор return) - необязательно в последней строке исходного кода. Это одна из причин, по которой функция interp() выполняет оператор или блок кода, а не всю программу целиком. Кроме того, концептуально С++ состоит из блоков кода. Следовательно, функция interp() вызывается каждый раз, когда обнаружен новый блок кода. Это может быть блок функции и блок, начинающийся в различных операторах С++, таких как if. В процессе выполнения программы интерпретатор LabC++ может вызывать функцию interp() рекурсивно.

Функция interp() работает следующим образом. Сначала она определяет, не обнаружен ли в программе оператор break. Если да, то глобальная переменная breakfound будет равна true. Эта переменная сохраняет свое значение, пока она не будет очищена другой частью интерпретатора. Это видно при описании интерпретации управляющих операторов.

Предположим, что breakfound равна false, тогда функция interp() читает следующую лексему из программы. Если прочитан идентификатор, то текущий оператор - выражение, поэтому вызывается анализатор выражений. Поскольку анализатор будет читать первую лексему выражения самостоятельно, она возвращается во входной поток с помощью функции putbacko. Когда завершится функция eval_exp(), переменная token будет содержать последнюю лексему, прочитанную анализатором выражений, которая должна быть точкой с запятой, если обрабатываемый оператор синтаксически корректен. Если лексема не содержит точки с запятой, выводится сообщение об ошибке.

Если следующая лексема программы - открывающая фигурная скобка, переменной block присваивается 1, и текущий размер стека, названного local_var_stack, помещается в стек nest_scope_stack. Стек lосаl_var_stack содержит все локальные переменные, включая те, которые объявлены в областях видимости вложенных блоков. И наоборот, если следующая лексема - закрывающая фигурная скобка, стек iocai_var_stack усекается до размера, заданного в вершине стека nest_scope_stack. Это действие эффективно удаляет любые локальные переменные, которые могли быть объявлены внутри блока. Таким образом, "{" вызывает сохранение размера стека локальных переменных, а "}" возвращает стеку его предыдущий размер. Описанный механизм поддерживает вложенные локальные области видимости переменных.

Наконец, если лексема - ключевое слово, выполняется оператор switch, вызывающий соответствующую процедуру для обработки оператора. В функции get_token () ключевым словам поставлены в соответ-

ствие целочисленные эквиваленты, что позволяет использовать оператор switch вместо требуемой последовательности операторов if, включающих сравнения строк (которые выполняются очень медленно) [1-5].

Библиографические ссылки

1. Ковалёв И. В., Кузнецов А. С. Генерация компиляторов мультисинтаксических языков программирования мультиверсионных систем // Программные продукты и системы. 2008. № 4. С. 31.

2. Каюков Е. В., Бахмарева К. К., Зеленков П. В. Разработка современных программных комплексов // Информационно-телекоммуникационные системы и технологии (ИТСИТ-2012) : материалы Всерос. молодежной конф. 2012. С. 30-31.

3. Шилдт Г. Искусство программирования на С++. БХВ-Петербург, 2005. С. 384.

4. Model of the reliability analysis of the distributed computer systems with architecture "CLIENT-SERVER" / I. V. Kovalev [et al.] // IOP Conference Series: Materials Science and Engineering 17. Сер. XVII International Scientific Conference "Reshetnev Readings". 2015. С. 012009.

5. Kovalev I. V., Zelenkov P. V., Tsarev M. Y. The control of developing a structure of a catastrophe-resistant system of information processing and control // IOP Conference Series: Materials Science and Engineering 17. Сер. XVII International Scientific Conference "Reshetnev Readings". 2015. С. 012008.

References

1. Kovalev I. V., Kuznetsov A. S. Generatsiya kompi-lyatorov mul'tisintaksicheskikh yazykov programmiro-vaniya mul'tiversionnykh system. Programmnye produkty i sistemy. 2008. No. 4, рp. 31.

2. Kayukov E. V., Bakhmareva K. K., Zelenkov P. V. Razrabotka sovremennykh programm-nykh kompleksov // Materialy vserossiiskoi molodezhnoi konferentsii "Informatsionno-telekommunikatsionnye sistemy i tekhnologii (ITSIT-2012) ". 2012. Рр. 30-31.

3. Herbert Schildt. Iskusstvo programmirovaniya na C++ [Teach Yourself C++]. BKhV-Peterburg, 2005. Рp. 384.

4. Kovalev I. V., Zelenkov P. V., Karaseva M. V., Tsarev M. Y., Tsarev R. Y. Model of the reliability analysis of the distributed computer systems with architecture "CLIENT-SERVER" // IOP Conference Series: Materials Science and Engineering 17. Сер. XVII International Scientific Conference "Reshetnev Readings" 2015. Рp. 012009.

5. Kovalev I. V., Zelenkov P. V., Tsarev M. Y. The control of developing a structure of a catastrophe-resistant system of information processing and control // IOP Conference Series: Materials Science and Engineering 17. Сер. XVII International Scientific Conference "ReshetnevReadings". 2015. Рp. 012008.

© Сарамуд М. В., Ефремова С. В., Бурдина Е. В., Перанцев Д. Г., 2015

i Надоели баннеры? Вы всегда можете отключить рекламу.