Научная статья на тему 'Разработка многоязыкового редактора на основе семантической модели программы'

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

CC BY
666
138
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ОБУЧАЮЩАЯ СИСТЕМА / СЕМАНТИЧЕСКИЙ РЕДАКТОР / УЧЕБНЫЙ ЯЗЫК / СЕМАНТИЧЕСКАЯ МОДЕЛЬ / СИНТАКСИС КАК ИНТЕРФЕЙС / ГРАММАТИКА ПРЕДСТАВЛЕНИЯ / TRAINING SYSTEM / SEMANTIC EDITOR / EDUCATIONAL LANGUAGE / SEMANTIC MODEL / SYNTAX AS INTERFACE / GRAMMAR OF REPRESENTATION

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Грачёв Дмитрий Александрович, Лаптев Валерий Викторович

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

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

DEVELOPMENT OF THE MULTILANGUAGE EDITOR ON THE BASIS OF SEMANTIC MODEL OF THE PROGRAM

The problem of development of the training environment for initial training in programming is considered. The semantic editor distinctive feature of which is an opportunity to submit the same program in different programming languages is described. The editor operates with semantic model of the program in the form of a semantic tree. The offered approach allowed completely refuse a phase of parse of a code, and significantly reduced the lexical analysis. The system allows addition of new syntax and provides the creation of methodical materials directly in the editor.

Текст научной работы на тему «Разработка многоязыкового редактора на основе семантической модели программы»

УДК [004.588:004.432.2]:004.4’232 ББК 32.973.2-018:32.973.23

Д. А. Грачёв, В. В. Лаптев

РАЗРАБОТКА МНОГОЯЗЫКОВОГО РЕДАКТОРА НА ОСНОВЕ СЕМАНТИЧЕСКОЙ МОДЕЛИ ПРОГРАММЫ

D. A. Grachev, V. V. Laptev

DEVELOPMENT OF THE MULTILANGUAGE EDITOR ON THE BASIS OF SEMANTIC MODEL OF THE PROGRAM

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

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

The problem of development of the training environment for initial training in programming is considered. The semantic editor distinctive feature of which is an opportunity to submit the same program in different programming languages is described. The editor operates with semantic model of the program in the form of a semantic tree. The offered approach allowed completely refuse a phase of parse of a code, and significantly reduced the lexical analysis. The system allows addition of new syntax and provides the creation of methodical materials directly in the editor.

Key words: training system, semantic editor, educational language, semantic model, syntax as interface, grammar of representation.

Введение

Выбор первого языка программирования и соответствующей среды при начальном обучении программированию - важное решение, которое должен принять преподаватель. Как показал анализ, в России в настоящее время нет ни доминирующего языка, ни общепринятой среды программирования для начального обучения. Как правило, используется либо одна из разновидностей Basic [1], либо некоторый вариант Pascal (см., например, [2, 3]), либо некоторое подмножество стандартных C/C++ [4, 5]. Хотя C/C++ довольно популярен в университетской среде России, его использование для начального обучения вызывает большие сомнения [6].

В последнее время наметилась тенденция использовать для начального обучения программированию русскоязычный псевдокод. Этому способствует то, что в контрольноизмерительных материалах ЕГЭ по информатике в заданиях на программирование наряду с языками Паскаль, Си, Бейсик используется и псевдокод. Однако для продуктивного обучения псевдокод должен поддерживаться средой программирования. Одна из первых реализаций подобного подхода - среда КуМир [7, 8], в которой используется придуманный академиком А. П. Ершовым школьный алгоритмический язык - простой алголоподобный язык с русской лексикой и встроенными командами управления программными исполнителями (Робот, Чертёжник). Другой реализацией является школьная сборка, разработанная Ф. В. Ткачевым на основе среды BlackBox Component Builder [9]. В этой системе при написании кода программы в редакторе ключевые слова языка программирования Component Pascal разрешается вводить как в русской, так и в английской лексике.

Практика использования этих систем показала, что при начальном обучении программированию русская лексика предпочтительнее английской. К. Поляков, обучавший школьников в среде КуМир, отмечает, что русские команды воспринимаются учениками намного легче английских [10]. Ф. В. Ткачев, обучавший школьников в среде BlackBox (школьная сборка), тоже говорит о том, что «для начинающих программистов все-таки важно видеть понятные слова на

родном языке» [11]. Система BlackBox имеет, в отличие от среды КуМир, одно важное свойство -она позволяет переключить язык программированния в обе стороны: и в русскую лексику, и в английскую. Это, очевидно, облегчит обучаемому в дальнейшем переход к профессиональным средам с англоязычными языками программирования.

Исследования мыслительной деятельности профессиональных программистов показали [12], что программист при решении программистских задач использует знания двух типов:

- семантические знания, которые представляют собой обобщенные базовые понятия программирования и схемы алгоритмов и не связаны ни с конкретным языком программирования, ни с конкретным средством разработки;

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

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

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

Концепции разработки

В [14] были сформулированы требования к учебному языку и обучающей системе по программированию. Разработанный в соответствии с требованиями учебный язык программирования Semantic Language и его интерпретатор описаны в [15]. Разработка программ на учебном языке должна осуществляться в интегрированной среде (Integrated Development Environment, IDE). Интегрированная среда объединяет в единую систему множество системных программ: редактор, компилятор (и (или) интерпретатор), компоновщик, отладчик, профайлер, мейкер и т. п. Очевидно, что учебная среда должна быть похожа на современную интегрированную среду для профессиональной разработки программ - это в перспективе облегчит обучаемому переход к профессиональной деятельности.

Наиболее важной частью любой интегрированной среды является редактор кода, который и обеспечивает взаимодействие пользователя-программиста со средой. Современные промышленные среды [16, 17] обеспечивают некоторую поддержку языка разработки. Например, практически во всех современных средах осуществляется цветовая подсветка синтаксиса ключевых слов и объектов программы, предоставляется возможность сворачивать и разворачивать блоки кода: классы, модули, условные операторы и операторы цикла, определения подпрограмм, пространства имен и т. п. Во многих средах предоставляется набор так называемых сниппетов (snippets), обеспечивающих вставку конструкций языка по короткой комбинации клавиш или даже по одной горячей клавише. Часто обеспечивается интеллектуальная навигация по коду, например переход от вызова метода к его определению и обратно. Результаты этих операций отражаются в окне редактора. Подобные возможности позволяют значительно снизить количество ошибок при наборе кода и существенно повышают производительность программиста.

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

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

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

Таким образом, желательно, чтобы в обучающей среде редактор кода не оперировал символами текста, а был ориентирован на язык программирования. В соответствии с этим подходом и с учетом свойств современных IDE нами был сформулирован ряд концепций реализации редактора кода обучающей среды:

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

- изменение ключевых слов в коде должно быть невозможным;

- ошибки должны определяться в момент набора программы;

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

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

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

- должен быть обеспечен механизм добавления нового синтаксиса;

- редактор должен при необходимости обеспечивать традиционные операции редактирования текста;

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

В настоящее время все эти концепции реализованы в редакторе кода учебной интегрированной среды Semantic IDE [18]. Этот редактор мы называем семантическим.

Семантическая модель программы

Автор языка C++ Б. Страуструп отмечал [19], что главным препятствием на пути развития языка являются символьно-ориентированные инструменты (в частности, текстовый редактор кода). Более перспективный и интересный подход - отказаться от традиционного текстового представления и реализовать инструментарий на основе семантических понятий языка программирования. В этом случае синтаксис языка представляет собой интерфейс между исполнителем программ (интерпретатором, виртуальной машиной) и пользователем (программистом). И как всякий интерфейс, его можно заменять, не изменяя базовой семантики языка.

Для реализации этой концепции была разработана семантическая модель программы на учебном языке. Семантическая модель программы состоит из семантических моделей операторов. Пусть m - семантическая модель оператора учебного языка, которая в общем виде представляет собой кортеж:

m = -имя, параметры, правило/, где имя - это ключевое слово оператора. Состав параметров, которые и определяют семантику, зависит от конкретного оператора. Семантическое правило представляет собой логическое выражение, которое должно быть истинным (true). Например, для оператора присваивания требуется проверять совпадение типов левой и правой части. Для одного оператора может быть определено несколько семантических моделей, отличающихся параметрами.

Учебный язык включает простые операторы и блочные операторы. В качестве примеров рассмотрим семантические модели некоторых простых операторов учебного языка. Для оператора объявления константы определена единственная модель:

m_const = -constant, type = <symple>, name, <exp>,

not (include(name, Names)) and equal(type(<exp>), type(name))/

В этой модели определены следующие элементы:

- constant - ключевое слово оператора;

- type - тип константы;

- <symple> - значение типа; семантическое понятие, определяющие простые типы учебного языка;

- name - имя константы;

- <exp> - инициализирующее выражение;

- not (include(name, Names)) and equal(type(<exp>), type(name)) - семантическое правило. Это правило определяет:

- not(include(name, Names)) - требование, чтобы имя не было определено ранее (не включено в множество Names определенных ранее имен;

- equal(type(<exp>), type(name)) - необходимость проверки совпадения типов константы и инициализирующего выражения.

Для оператора объявления переменной определены две модели: m_var = -variable, type, name>

m_var = -variable, type = -symple>, name, -exp>, equal(type(-exp>), type(name))>

Модель оператора ввода определена так:

m_in = -input, name, equal(type(name), -symple>) >

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

Модель оператора вывода:

m_out = -output, -exp>, equal(kind(exp), left) >

В данном случае семантическое правило говорит о том, что выражение в операторе вывода должно быть L-value (в смысле С++). Аналогичную проверку надо выполнять и для оператора присваивания:

m_let = -let, -lexp>, -rexp>, equal(kind(lexp), left) and equal(type(-lexp>), type(rexp))>

Семантическое правило говорит о том, что, кроме проверки L-value, необходимо проверять и совпадение типов левого и правого выражения оператора.

Самым простым оператором является оператор импорта: m_imp = -import, name, include(name, ModuleMames)>

Семантическое правило определяет, что имя в операторе должно входить в множество имен модулей (стандартных и определенных программистом).

Блочные отличаются тем, что включают тело - последовательность операторов учебного языка. Обозначим последовательность операторов учебного языка как Р:

Р = mj m2 ..., mw,

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

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

Sexe = { m_const, m_var, m_let, m_in, m_out, m_call}

Sdcl = { m_const, m_var, m_type, m_proc, m_func }

Simp = { m_imp }

Множество Sexe включает операторы, которые могут задаваться в теле операторов определения процедур, функций, методов, в теле оператора цикла и условного оператора. С помощью множество Sdcl определяет состав операторов объявления, которые разрешается задавать в теле модуля. И множество Simp определяет возможности конструирования последовательности операторов импорта. Тогда модель оператора определения модуля определяется так: m_module = -module, name, PI, P2, P3, include(name, ModuleNames) and include(Pl, Simp) and include(P2, Sdcl) and include(P2, Sexe) >

Эта модель определяет, что в теле оператора определения модуля должны задаваться три последовательности операторов: последовательность операторов импорта, последовательность операторов объявления и в секции инициализации - последовательность исполняемых операторов.

Из моделей блочных операторов самой простой является модель оператора цикла: m_while = -while, <exp>, Р, equal(type(exp), boolean) and include(P, Sexe)>

Похожую модель имеет условный оператор. Однако для условного оператора требуется определить еще модели вложенных ветвей else_if и else:

m_elseif = <else_if, <exp>, P, equal(type(exp), boolean) and include(P,Sexe)> m_else = <else, P, include(P,Sexe) >

Определим множество операторов, которые могут входить в тело условного:

Sif = Sexe U { m_elseif, m_else }

Тогда семантическая модель условного оператора определяется так:

m_if = <if, <exp>, P, equal(type(exp), boolean) and include(P,Sif) and last(P,m_else) >

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

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

В каждом узле имеется ссылка на следующий узел-оператор. Таким образом, последовательность операторов программы представляет собой последовательный список узлов семантического дерева. В узлах, соответствующих блочным операторам учебного языка [15], имеется еще одна ссылка - на первый вложенный оператор тела. Блочными операторами являются операторы цикла, условные операторы, операторы определения подпрограмм, оператор определения модуля и оператор определения типа.

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

Единицей интерпретации является оператор - узел дерева. Схема работы интерпретатора представляет собой алгоритм обхода семантического дерева в глубину с запуском процедуры интерпретации для текущего узла (оператора). На языке Semantic Language с использованием условного оператора Дейкстры [20] схема представляет собой рекурсивный метод класса Интерпретатор: метод (Узел этот) Интерпретировать() если

|этот.Дочерний # пусто():

вызвать этот.Дочерний.Интерпретировать();

|этот.Следующий # пусто():

вызвать этот.Следующий.Интерпретировать(); конец ветвления; вызвать память.СобратьМусор(); конец Интерпретировать;

В реализации на языке C# применены паттерны Visitor и Observer [21]. Для каждого оператора реализована индивидуальная процедура интерпретации.

Редактирование кода

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

вильном виде. Это гарантирует отсутствие ошибок набора ключевых слов. Редактор разрешает символьный ввод только в строго определенных позициях оператора. Например, в операторе объявления переменной разрешено вводить посимвольно только имя переменной. Аналогично в операторе импортирования модуля посимвольно вводится только имя модуля.

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

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

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

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

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

Синтаксис языка программирования как интерфейс

В интерфейсе среды Semantic IDE реализован переключатель лексики, с помощью которого устанавливается язык представления ключевых слов (русский или английский). На рис. 1 показано представление программы вычисления факториала на языке Semantic Language в английской и русской лексике. Ключевые слова выделены жирным шрифтом.

module Факториал start

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

variable integer i := 1; variable real current := 1; constant integer N = 15; while i < N do

let current := current * i; let i := i + 1; output '\n'; output current; end of while; end Факториал.

модуль Факториал начало

переменная целое i := 1; переменная вещ current := 1; константа целое N = 15; пока i < N делать

присвоить current := current * i; присвоить i := i + 1; вывести '\n'; вывести current; конец цикла; конец Факториал.

Рис. 1. Представление программы на языке Semantic Language

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

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

Регулярная структура семантического дерева позволяет реализовать идею Б. Страуструпа о сменяемом синтаксисе языка программирования. Синтаксис каждого языка определяется в системе собственной грамматикой представления. В настоящий момент в среде Semantic IDE обеспечивается представление программы в 4 видах: на псевдокоде (учебный язык Semantic Language), С-подобный, Pascal-подобный и Basic-подобный. Эти четыре представления соответствуют языкам, используемым в тестах ЕГЭ по информатике. С-подобный синтаксис разработан на основе языка Java [22], а за образец Pascal-подобного принят синтаксис языка Component Pascal [3], реализованного в системе BlackBox Component Builder [9]. Basic-подобный синтаксис в основном соответствует синтаксису Microsoft Visual Basic [23].

Грамматика языка не используется для синтаксического анализа программы и нужна только для определения внешнего представления программы в окне редактора кода. Поэтому загрузка грамматики производится один раз во время запуска Semantic IDE. В грамматике каждой семантической единице языка соответствует правило представления, задаваемое в формате РБНФ. Например, оператор присваивания в грамматике представления Semantic Language задан таким правилом:

<Assign> := "присвоить" <expression> ":=" <expression>";"

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

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

Нетерминалы, представленные в правой части правил, представляют собой параметры данной семантической единицы. В правилах для блочных операторов нетерминал <body> говорит о следующим: данная семантическая единица имеет тело, что в узле дерева представляется ссылкой на дочерний узел. В данном случае узел имеет два параметра: слева параметр-выражение, представляющий объект, которому присваивается значение правого параметра-выражения.

То же правило в грамматике Pascal-подобного представления выглядит так:

<Assign> := "%ПРИСВ ОИТЬ""% "<expression> ":=" <expression>";"

В грамматике Си-подобного представления это правило выглядит следующим образом:

<Assign> ::= "%присвоить""% "<expression> "=" <expression>";"

Знак процента «%» в начале слова означает, что это слово является исключением в данном синтаксисе. В данном случае это правило говорит о том, что в Си-подобных и Pascal-подобных языках в операторе присваивания отсутствует ключевое слово «присвоить» (английское слово «let»). В кодовом окне такие слова подсвечиваются зеленым цветом - чтобы обучаемый легко мог их отличить от ключевых слов и идентификаторов. Представление программы вычисления факториала в Pascal-подобном виде показано нарис. 2 (слова-исключения подчеркнуты).

MODULE Факториал;

BEGIN

VAR i: INTEGER := 1;

VAR current: REAL := 1;

CONST N: INTEGER = 15;

WHILE i < N DO

LET current := current * i;

LET i := i + 1;

Log.Out ('\n');

Log.Out(current);

END

END Факториал.

Рис. 2. Представление программы на языке Semantic Language в Pascal-подобном виде

Полная грамматика для Pascal-подобного представления в русской лексике выглядит так:

<Root> ::= <body>

<While> ::= "ПОКА" -expression/ "ПОВТОРЯТЬ"<Ьо?у>"КОНЕЦ"

<DoNTimes> ::= "СДЕЛАТЬ" -expression/ "РАЗ"<Ьо?у>"КОНЕЦ"";"

<Array> ::= "%МАССИВ" <name>":" "МАССИВ" <expression> "ТИПА" <Type>";"

<Assign> ::= "%ПРИСВОИТЬ" <expression> ":=" <expression>";"

<Call> ::= "%ВЫЗВАТЬ" <expression>";"

<Constant> ::= "КОНСТАНТА" <name>":" <Type> "=" <expression>";"

<Field> ::= "%ПОЛЕ" <name><visibility>": "<Type>";"

<lnput> ::= "Жypнaл.Ввecти""{"<expression>");"

<NullOperator> ::= <keyword>

<Output> ::= "Жypнaл.Вывecти""{"<expression>");"

<Return> ::= "ВЕРНУТЬ" <expression>";"

<Variable> ::= "ПЕРЕМЕННАЯ" <name>":" <Type>";"

<VariableWithlnit> ::= "ПЕРЕМЕННАЯ" <name>":" <Type> ":=" <expression>";"

<Beginning> ::= "НАЧАЛО"<body>

<Comment> ::= "{*" <text> "*)"

<Do> ::= "ПОВТОРЯТЬ"<body>"ПОКА" <expression>";"

<Else> ::= "ИНАЧЕ"<body>

<Elself> ::= "А ЕСЛИ" <expression> "ТОГДА" <body>

<lf> ::= "ЕСЛИ" <expression> "ТОГДА" <body> "КОНЕЦ"

<Module> ::= "МОДУЛЬ" <name>";"<body>"КОНЕЦ" <endname>";"

<RecordType> ::= <visibility> "ЗАПИСЬ" <name> "=" "ЗАПИСЬ""{"<Type>")"<body>"КОНЕЦ" <endname>";"

<Function> ::= <visibility> "ПРОЦЕДУРА" <name>"{"<FormalParameters>"):"<Type>";"

<body>

"КОНЕЦ" <endname>";"

<Procedure> ::= <visibility> "ПРОЦЕДУРА" <name> "{" <FormalParameters> ");" <body>

"КОНЕЦ" <endname>";"

<MethodFunc> ::= <visibility> "ПРОЦЕДУРА""{"<ClassParam>")"<name>"{"<FormalParams>")" ":" <Type> ";"

<body>

"КОНЕЦ" <endname>";"

<MethodProc> ::=<visibility> "ПРОЦЕДУРА""{" <ClassParameter>")" <name> "{"<FormalParameters>");" <body>

"КОНЕЦ" <endname>";"

<Parameter> ::= <mode> <name>":" <Type>

<TypeParameter> ::= <mode> <Type>

<ArrayType> ::= "МАССИВ" <expression> "ТИПА" <Type>

<ProcedureType> ::= "ПРОЦЕДУРА" "{"<FormalParameters>")"

<FunctionType> ::= "ПРОЦЕДУРА""{" <FormalParameters> "):" <Type>

<PointerType> ::= "УКАЗАТЕЛЬ НА" <Type>

<SimpleType> ::= "ЦЕЛОЕ" | "ВЕЩЕСТВЕННОЕ" | "БУЛЕВСКОЕ" | "СИМВОЛ"

<ClassParameter> ::= <name>":" <Type>

<lmport> ::= "ПОДКЛЮЧИТЬ" <name>";"

Подчеркнем, что подобная грамматика используется редактором только для изображения программы на экране, а не для синтаксического анализа. В правой части некоторых правил встречаются нетерминалы, для которых правило в грамматике отсутствует. Например, для нетерминала <Type> может быть определено следующее правило:

<Type> ::=<RecordType>|<ArrayType>| <ProcedureType> | <FunctionType> | <PointerType> | <SimpleType>

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

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

Оператор-комментарий

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

В пределах комментария разрешается посимвольный ввод любого текста и выполняются традиционные текстовые операции с символами и строками. Разрешены и обычные операции с буфером обмена - это позволяет вставлять фрагменты материалов из других программ (например, из MS Word). В операторе-комментарии можно создать таблицы, разрешается вставлять рисунки и видеоролики. Обеспечивается возможность связывания комментариев с помощью гиперссылок, в том числе и с другими файлами проекта.

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

Заключение

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

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

В настоящий момент развитие среды продолжается: разрабатывается семантическая модель объектно-ориентированной части учебного языка, реализуется механизм наследования языке Semantic Language, разрабатываются модули стандартной библиотеки, развивается система справочной информации.

Архитектура системы спроектирована таким образом, что без особых проблем позволяет разработчику добавлять новый синтаксис языка программирования. Разработан и включен в среду сокращенный Python-подобный синтаксис представления программы. В дальнейшем, после проведения ряда экспериментов, будет определен фиксированный формат грамматики представления и реализована подсистема, которая позволит писать грамматику представления непосредственно в редакторе Semantic IDE. Это обеспечит преподавателю возможность добавлять в систему новые языки программирования, не прибегая к помощи разработчиков.

Регулярная структура семантического дерева позволяет реализовать конвертеры в промышленные языки программирования: C#, Java, C++ - это откроет возможность профессионального программирования в рамках обучающей среды.

Работа поддержана грантами «У.М.Н.И.К.» в 2011 и 2012 гг. и грантом «Старт» в 2013 г. Работающую версию среды можно загрузить с сайта sem_tech.net.

СПИСОК ЛИТЕРАТУРЫ

1. Ведяева Е. С. Возможности языков программирования Visual Basic при обучении алгоритмизации и программированию / Е. С. Ведяева, С. Ю. Ведяева / Информационные технологии в образовании. XVIII Междунар. конф.-выставка: сб. тр. конф. Ч. VI. - М.: МИФИ, 2008. - С. 19-20.

2. Бельчусов А. А. Повышение эффективности обучения программированию в школе и вузе / А. А. Бельчусов, А. В. Степанов // Материалы V Всерос. науч.-практ. конф. «Проблемы информатизации образования: региональный аспект», Чебоксары, 25-27 апреля 2007 г. - Чебоксары, 2007. - С. 27-33.

3. Потопахин В. В. Современное программирование с нуля! / В. В. Потопахин. - М.: ДМК Пресс, 2010. -242 с.

4. Онищенко В. А. Проблемы контроля знаний в компьютерном учебнике по языкам программирования / В. А. Онищенко // Материалы V Всерос. науч.-практ. конф. «Проблемы информатизации образования: региональный аспект», Чебоксары, 25-27 апреля 2007 г. - Чебоксары, 2007. - С. 241-245.

5. Хохлов Д. Г. Электронное обучение основам программирования: проблематика и подходы / Д. Г. Хохлов // Образовательные технологии и общество (Educational Technology & Society).-2012.-Т. 15,№ 1.-С. 567-593.

6. Столяров А. В. Язык С и начальное обучение программированию / А. В. Столяров: http://www. stolyarov. info/pvt/anti_c.

7. Кушниренко А. Г. Программирование для математиков / А. Г. Кушниренко, Г. В. Лебедев: учеб. пособие для вузов. - М.: Наука, 1988. - 384 с.

8. Кушниренко А. Г., Лебедев В. Г. 12 лекций о том, для чего нужен школьный курс информатики и как его преподавать / А. Г. Кушниренко, В. Г. Лебедев: метод. пособие. - М.: Лаборатория Базовых Знаний, 2000. - 464 с.

9. Информатика-21. Программное обеспечение: http://www.inr.ac.ru/~info21/software.htm.

10. Поляков К. КуМир и школьная информатика / К. Поляков: http://kpolyakov.blogspot.ru/2011/04/blog-post_5678.html.

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

11. Куркина Л. Г. Русифицированные мини-исполнители во вводных курсах программирования / Л. Г. Куркина, Ф. В. Ткачев, И. А. Цвелая: http://www.inr.ac.ru/~info21/texts/bytic-xx-2009.htm.

12. Шнейдерман Б. Психология программирования. Человеческий фактор в вычислительных и информационных системах / Б. Шнейдерман. - М.: Радио и связь, 1984. - 304 с.

13. Дединский И. Р. Аналитический подход к довузовскому преподаванию программирования / И. Р. Дединский: http://storage.ded32.net.ru/Lib/Doc/AnalyticApproach2010.pdf.

14. Лаптев В. В. Требования к современной обучающей среде по программированию / В. В. Лаптев // Объектные системы-2010 (Зимняя сессия): материалы II Междунар. науч.-практ. конф., Ростов-на-Дону, 10-12 ноября 2010 г. - Ростов н/Д, 2010. - С. 104-110.

15. Грачёв А. Д. Разработка учебного языка программирования и интерпретатора для обучающей среды / А. Д. Грачёв, В. В. Лаптев // Объектные системы-2012: материалы VI Междунар. науч.-практ. конф., Ростов-на-Дону, 10-12 мая 2012 г. - Ростов н/Д: ШИ ЮРГТУ (НПИ), 2012. - С. 92-101.

16. Давыдов С. В. IntelliJ IDEA. Профессиональное программирование на Java / С. В. Давыдов, А. А. Ефимов. - СПб.: БХВ-Петербург, 2005. - 800 с.

17. Пауэрс Л. Microsoft Visual Studio 2008 / Л. Пауэрс, М. Снелл. - СПб.: БХВ-Петербург, 2009. - 1200 с.

18. Грачев Д. А., Лаптев В. В. Семантический редактор автоматизированной обучающей системы по программированию // Свидетельство об офиц. регистрации программ для ЭВМ № 2011619172, Россия -зарегистрировано 25.11.2011.

19. Страуструп Б. Дизайн и эволюция С++ / Б. Страуструп. - М.: ДМК Пресс; СПб.: Питер, 2006. - 448 с.

20. Дейкстра Э. Дисциплина программирования / Э. Дейкстра. -М.: Мир, 1978. -275 с.

21. Гамма Э. Приемы объектно-ориентированного проектирования. Паттерны проектирования /

Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. - СПб.: Питер, 2001. - 368 с.

22. Хорстман К. С. Java 2. Библиотека профессионала. Т. 1. Основы / К. С. Хорстман, Г. Корнелл. -М.: ООО «Изд. дом «Вильямс», 2011. - 816 с.

23. Ольсен Э. Visual Basic.NET. Разработка классов: Справочник / Э. Ольсен, Д. Эллисон, Дж. Спир. -М.: СП ЭКОМ, 2003. - 416 с.

REFERENCES

1. Vediaeva E. S., Vediaeva S. Iu. Vozmozhnosti iazykov programmirovaniia Visual Basic pri obuchenii algoritmizatsii i programmirovaniiu [The possibilities of the programming languages Visual Basic at training in

algorithmization and programming]. Informatsionnye tekhnologii v obrazovanii. XVIIIMezhdunarodnaia konfer-entsiia-vystavka: Sbornik trudov uchastnikov konferentsii. Ch. VI. Moscow, MIFI, 2008, pp. 19-20.

2. Bel'chusov A. A., Stepanov A. V. Povyshenie effektivnosti obucheniia programmirovaniiu v shkole i vuze [Increase in efficiency of training in programming at schools and universities]. Materialy V Vserossiiskoi nauchno-prakticheskoi konferentsii «Problemy informatizatsii obrazovaniia: regional'nyi aspekt», Cheboksary, 25-27 aprelia 2007 g. Cheboksary, 2007, pp. 27-33.

3. Potopakhin V. V. Sovremennoe programmirovanie s nulia! [Modern programming from zero]. Moscow, DMK Press, 2010. 242 p.

4. Onishchenko V. A. Problemy kontrolia znanii v komp'iuternom uchebnike po iazykam programmiro-vaniia [The problems of the control of knowledge in electronic manual on the programming languages]. Materialy V Vserossiiskoi nauchno-prakticheskoi konferentsii «Problemy informatizatsii obrazovaniia: regional’nyi aspekt», Cheboksary, 25-27 aprelia 2007 g. Cheboksary, 2007, pp. 241-245.

5. Khokhlov D. G. Elektronnoe obuchenie osnovam programmirovaniia: problematika i podkhody [E-training in the basics of programming: theory and approaches]. Obrazovatel'nye tekhnologii i obshchestvo (Educational Technology ' Society), 2012, vol. 15, no. 1, pp. 567-593.

6. Stoliarov A. V. Iazyk C i nachal'noe obuchenie programmirovaniiu [Language С and the initial training in programming]: http://www.stolyarov.info/pvt/anti_c.

7. Kushnirenko A. G., Lebedev G. V. Programmirovanie dlia matematikov [Programming for mathematicians]. Moscow, Nauka Publ., 1988. 384 p.

8. Kushnirenko A. G., Lebedev V. G. 12 lektsii o tom, dlia chego nuzhen shkol'nyi kurs informatiki i kak ego prepodavat'. Metodicheskoe posobie [12 lectures on the necessity of the school course of computer science and how to teach it. Manual]. Moscow, Laboratoriia Bazovykh Znanii, 2000. 464 p.

9. Informatika-21. Programmnoe obespechenie [Software]: http://www.inr.ac.ru/~info21/software.htm.

10. Poliakov K. KuMir i shkol'naia informatika [KuMir and school computer science]: http://kpolyakov.blogspot.ru/2011/04/blog-post_5678.html.

11. Kurkina L. G., Tkachev F. V., Tsvelaia I. A. Rusiftsirovannye mini-ispolniteli vo vvodnykh kursakh programmirovaniia [Russian mini-executors in introductory courses of programming]: http://www.inr.ac.ru/~info21/texts/bytic-xx-2009.htm.

12. Shneiderman B. Psikhologiia programmirovaniia. Chelovecheskii faktor v vychislitel'nykh i informatsionnykh sistemakh [Programming psychology. Human factor in computational and information systems]. Moscow, Radio i sviaz' Publ., 1984. 304 p.

13. Dedinskii I. R. Analiticheskiipodkhodk dovuzovskomu prepodavaniiuprogrammirovaniia [Analytical approach to the pre-university teaching of programming]: http://storage.ded32.net.ru/Lib/Doc/AnalyticApproach2010.pdf.

14. Laptev V. V. Trebovaniia k sovremennoi obuchaiushchei srede po programmirovaniiu [Requirements to the modern training environment in programming]. Ob"ektnye sistemy-2010 (Zimniaia sessiia). Materialy II Mezhdunarodnoi nauchno-prakticheskoi konferentsii. Rostov-na-Donu, 10-12 noiabria 2010 g. Rostov-on-Don, 2010, pp. 104-110.

15. Grachev A. D., Laptev V. V. Razrabotka uchebnogo iazyka programmirovaniia i interpretatora dlia obuchaiushchei sredy [Development of training programming language and interpreter for the training environment]. Ob"ektnye sistemy-2012. Materialy VI Mezhdunarodnoi nauchno-prakticheskoi konferentsii, Rostov-na-Donu, 10-12 maia 2012 g. Rostov-on-Don, ShI IuRGTU (NPI), 2012, pp. 92-101.

16. Davydov S. V., Efimov A. A. IntelliJ IDEA. Professional'noe programmirovanie na Java [Professional programming on Java]. Saint Petrsburg, BKhV-Peterburg, 2005. 800 p.

17. Pauers L., Snell M. Microsoft Visual Studio 2008. Saint Petersburg, BKhV-Peterburg, 2009. 1200 p.

18. Grachev D. A., Laptev V. V. Semanticheskii redaktor avtomatizirovannoi obuchaiushchei sistemy po programmirovaniiu [Semantic editor of automated training system of programming]. Svidetel'stvo ob ofitsial'noi registratsii programm dlia EVM no. 2011619172, Russia, zaregistrirovano 25.11.2011.

19. Straustrup B. Dizain i evoliutsiia C++ [Design and evolution C++]. Moscow, DMK Press; Saint Petersburg, Piter Publ., 2006. 448 p.

20. Deikstra E. Distsiplinaprogrammirovaniia [Programming discipline]. Moscow, Mir Publ., 1978. 275 p.

21. Gamma E., Khelm R., Dzhonson R., Vlissides Dzh. Priemy ob"ektno-orientirovannogo proektirovaniia. Patterny proektirovaniia [Techniques of object-oriented projecting. Projecting patterns]. Saint Petersburg, Piter Publ., 2001. 368 p.

22. KhorstmanK. S., Kornell G. Java 2. Bibliotekaprofessionala. Vol. 1. Osnovy. Moscow, Vil'iams, 2011. 816 p.

23. Ol'sen E., Ellison D., Spir Dzh. Visual Basic.NET. Razrabotka klassov. Spravochnik [Class development. Reference]. Moscow, SP EKOM Publ., 2003. 416 p.

Статья поступила в редакцию 18.06.2013

ИНФОРМАЦИЯ ОБ АВТОРАХ

Грачёв Дмитрий Александрович - Ас траханс кий государс твенный техничес кий университет; магистрант кафедры «Автоматизированныге системы обработки информации и управления»; dagrachev@list.ru.

Grachev Dmitriy Aleksandrovich - Astrakhan State Technical University; Master’s degree Student of the Department "Automated Systems of Information Processing and Management"; dagrachev@list.ru.

Лаптев Валерий Викторович - Ас траханс кий гос ударс твенный техничес кий универ-с итет; канд. техн. наук, доцент; доцент кафедры «Автоматизированные с ис темы обработки информации и управления»; Laptev@ilabsltd.com.

Laptev Valeriy Victorovich - Astrakhan State Technical University; Candidate of Technical Sciences, Assistant Professor; Assistant Professor of the Department "Automated Systems of Information Processing and Management"; Laptev@ilabsltd.com.

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