Интерпретатор языка с для электронного обучения программированию

УДК 681.3.06

Д. Г. Хохлов, А. П. Кирпичников, Г. Х. Халид ИНТЕРПРЕТАТОР ЯЗЫКА С ДЛЯ ЭЛЕКТРОННОГО ОБУЧЕНИЯ ПРОГРАММИРОВАНИЮ

Ключевые слова: электронное обучение программированию, оценка программы учащегося, интерпретатор языка С.

Описывается учебный интерпретатор языка С для системы электронного обучения программированию. Рассматривается его использование для оценки программ учащихся.

Keywords: e-learning on programming, learner's program estimation, interpreter of C language.

The interpreter of C language for the electronic learning system on programming is described. It's using for leaner's program estimation is considered.

Введение

В статье рассматривается разработанный авторами учебный интерпретатор упрощенного языка С. Этот интерпретатор предназначен для обучения студентов программированию.

Для использования языка программирования необходимо его реализовать, то есть разработать транслятор этого языка. Существуют два основных способа реализации языка программирования: в виде компилятора и в виде интерпретатора [1 - 4].

Компилятор - это транслятор, который переводит исходную программу, написанную на языке программирования, в объектную программу на машинном языке.

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

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

Интерпретатор - это транслятор, который читает программу, написанную на языке программирования, и выполняет описанные в ней операции без получения машинной программы.

Постановка задачи

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

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

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

В то же время, в отличие от интерпретатора, компилятор не может обнаружить большинство семантических ошибок и ошибок в алгоритме программы, которые обнаруживаются только динамически - во время выполнения программы.

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

Простейший пример - явную ошибку деления на ноль: х / 0 компилятор еще может обнаружить (без выполнения программы), а неявные ошибки этого типа, например:

у = 0; ... x / y

или:

x /

только

сможет обнаружить, скорее всего, интерпретатор при выполнении программы.

При обучении программированию главной целью является приобретение обучаемыми (учениками) навыков разработки и отладки программ, а не их длительная эксплуатация. Отладив одну программу, обучаемый обычно начинает разрабатывать следующую программу.

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

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

Поэтому для обучения программированию использовать интерпретаторы удобнее

компиляторов, так как интерпретаторы позволяют:

- лучше обнаруживать не только синтаксические ошибки, но и семантические и прагматические ошибки - несоответствие программы решаемой задаче, показать место программной ошибки;

- полнее проверить и оценить корректность алгоритма и программы ученика;

- внутренние данные - значения величин выполняемой программы.

- полнее оценить эффективность программы ученика по времени и памяти;

- полнее проверить знания не только синтаксиса, но и семантики языка программирования.

Пример использования интерпретатора

В качестве примера рассмотрим одну из возможных версий программы «Коды символов» на языке С KODY_SIM.С [1, 2]. Эта программа вводит символы входного текста из входного файла

(например, INPUT.TXT), и выводит в выходной файл (например, OUTPUT.TXT) через пробел код каждого символа в восьмеричной и десятичной системах счисления.

Файл KODY_SIM.С содержит исходный текст программы на языке С (рис. 1).

В результате трансляции получен исполнимый файл KODY_SIM.EXE.

Пример входного файла INPUT.TXT:

А+В.

В результате выполнения этой программы командой операционной системы:

KODY_SIM.EXE <ШРиТ.ТХТ >ОиТРШ\ТХТ получается файл OUTPUT.TXT:

А=65=101 +=43=53 В=66=102 .=46=56

// Программа "Коды символов"

#include <stdio.h>

// Рекурсивная функция вывода целого числа x с основанием baza void kod(int x, int baza) { int y;

if

kod (y, baza); putchar(x % baza + '0'); return;

// Вывод младшей цифры числа x

}

char sim;

int main

// Текущий символ входного текста // Главная функция программы

{

while ((sim = getch()) != EOF) { putchar(sim);

putchar( putchar( putchar(

}

return 0;

) ; kod(sim, 10) ;

); kod(sim, 8); );

// ввод символа sim

// вывод символа sim // вывод 10-го кода символа // вывод 8-го кода символа

// Код успешного завершения программы

}

Рис. 1 - Программа "Коды символов"

В результате интерпретации программы полезно получить не только ее выходные данные, но и трассировочную таблицу - протокол изменения значений переменных и выражений при исполнении исходной программы (с желательной возможностью «прокрутки» исполнения вперед и назад по времени).

Структура интерпретатора, как и любой программы, включает его данные и алгоритм функционирования.

Структура (база) данных интерпретатора включает:

- выполняемую программу,

- входной файл с исходными данными решаемой задачи

- выходной файл выполняемой программы (результаты ее выполнения),

- таблицу имен функций и величин выполняемой программы,

Пример. Трассировочная таблица получения файла OUTPUT.TXT (показана на рис. 2 сокращенно: без входа в функцию kod и ее пошагового выполнения; пробел обозначен подчеркиванием: '_').

sim = A

(sim!=EOF) = да x = 65

baza = 10 8

+

B

EOF

Вывод:

A=65=101

да 43 10 8 +=43=53

да 66

да 46

10 8

10 8

B=66=102 .=46=56

OUTPUT.TXT: A=65=101 +=43=53 B=66=102 .=46=56 Рис. 2 - Трассировочная таблица работы интерпретатора

110

нет

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

Для реализации интерпретатора используются алгоритмы трансляции (интерпретации) выражений методом стека с приоритетами и интерпретации операторов методом рекурсивного спуска [1 - 4].

Выводы

Описанный интерпретатор реализован в виде программы размером около 1000 строк на языке С. Он используется в КНИТУ-КАИ для начального обучения программированию студентов 1 курса, в дисциплинах по трансляции языков программирования для более старших курсов и будет использован для оценки программ учащихся в системе электронного обучения программированию [5 - 8].

Литература

1. Хохлов Д. Г. Методы программирования на языке С: практикум: в 2 ч. - М.: БИНОМ. Лаборатория знаний, 2014. Ч. 1. 335 с., Ч. 2. 376 с.

2. Хохлов Д. Г. Программирование на языке высокого уровня. Часть 2. Методы программирования: Учебник. -Казань: Мастер Лайн, 2009. 270 с.

3. Хохлов Д. Г. Системное программное обеспечение: Учебное пособие. - Казань: Мастер Лайн, 2009. 178 с.

4. Казанский турнир по программированию / Под ред. Д.Г. Хохлова. - Казань: Изд-во Казан. гос. техн. ун-та, 2010. 232 с.

5. Хохлов Д. Г., Кирпичников А. П., Захарова З. Х., Лоповок Е. Е., Вербицкая А. А., Захаров А. Н., Халид Г. Х. Оценка программ учащихся с использованием нечеткого логического вывода в системе электронного обучения программированию // Вестн. Казан. технол. ун-та. - 2014. - Т. 17, № 15. С. 334 - 337.

6. Хохлов Д. Г., Кирпичников А. П., Захарова З. Х. , А. А. Вербицкая Е. Е., Лоповок Е. Е. Захаров А. Н., Халид Г. Х. Оценка программ учащихся с использованием нейронной сети в системе электронного обучения программированию // Вестн. технол. ун-та. - 2015. - Т. 18, № 15. С. 234 - 238.

7. Хохлов Д. Г. Электронное обучение программированию: проблематика и подходы // Международный электронный журнал "Образовательные технологии и общество (Educational Technology & Society)" - 2012. - V.15. - №1. - С. 567 -593. - ISSN 1436-4522. URL: http://ifets.ieee.org/russian/periodical/journal.html

8. Хохлов Д. Г., Захаров А. Н., Захарова З. Х., Подавалов А.А. Оценка качества студенческих программ при электронном обучении программированию // Вестник КГТУ им. А. Н. Туполева, 2011. № 4. С. 153 - 156.

© Д. Г. Хохлов - канд. техн. наук, доцент; доцент кафедры автоматизированных систем обработки информации и управления КНИТУ им. А. Н. Туполева, hohlovdg@mail.ru; А. П. Кирпичников - д-р физ.-мат. наук, зав. кафедрой интеллектуальных систем и управления информационными ресурсами КНИТУ, kirpichnikov@kstu.ru; Г. Х. Халид - аспирант кафедры автоматизированных систем обработки информации и управления КНИТУ им. А. Н. Туполева, The_boss7@mail.ru.

© D. G. Khokhlov - PhD, Associate Professor of the Department of Automated Information Processing Systems & Control, KNRTU named after A.N. Tupolev, hohlovdg@mail.ru; A. P. Kirpichnikov - Dr. Sci, Head of the Department of Intelligent Systems & Information Systems Control, KNRTU, e-mail: kirpichnikov@kstu.ru; G. H. Khalid - Graduate Student of the Department of Automated Information Processing Systems & Control, KNRTU named after A.N. Tupolev, e-mail: The_boss7@mail.ru.