Применение естественно-языковых конструкций в программировании: преобразования текста программы в более удобный вид
А.В. Заболеева-Зотова, А.В. Пастухов
Волг.ГТУ
Постановка задачи
В настоящее время большинство языков программирования имеют следующие две особенности:
- традиционная ориентация на простоту компиляции, а не на удобство программиста;
- использование английского языка в качестве языка прототипа.
Такая ситуация имеет и свои плюсы, и свои минусы. К плюсам можно отнести однозначность синтаксиса (как следствие его строгости), высокую скорость трансляции и легкость создания таких языков и трансляторов (подавляющее большинство алгоритмических языков рассчитаны на описание КС-грамматикой). К минусам же – «неестественность» используемых конструкций и неудобство использования фактически «иностранного» языка, для тех, у кого английский не является основным языком.
Даже если мы пока не будем учитывать важность языка-прототипа, первый минус уже влечет множество проблем и явля ется одной из основных причин наличия семантических ошибок в тексте программы. Строгий синтаксис позволяет облегчить поиск ошибок в программе, но, увы, в основном синтаксических, а не семантических.
«Неестественность» текста заставляет человека самостоятельно переводить его на свой естественный язык. Хотя этот процесс может и не осознаваться индивидом, тем не менее, значительная часть ресурсов уходит на «перевод» и эта часть отбирается у других задач, выполняемых параллельно, в частности – у процесса анализа текста. Человеку гораздо легче понять и проанализировать сложный текст на родном языке, нежели простой, но на иностранном. Уменьшив долю такого «перевода» мы освободим силы программиста для анализа и проверки текста.
Второй минус важен только для программистов, не владеющих свободно английский языком. Ситуация полностью аналогична описанной выше, но при этом задача перевода еще более усложняется, так как еще больше внимания обращается на понимание текста и, как следствие, еще меньше – на его анализ. Все это повышает вероятность совершения или пропуска ошибки, особенно для начинающих.
Применение ЕЯ-препроцессора
Основной идеей при решении данной проблемы является повышение естественности текста программы на языках программирования. Изменять собственно архитектуру языка не представляется необходимым, ведь проблема заключается не в алгоритмических средствах, а в интерфейсе с разработчиком. К тому же важна совместимость со старым кодом и, поэтому, разработка принципиально нового языка не представляется разумным шагом. Более адекватным подходом является создание препроцессора с расширенной версии языка в базовый язык программирования. В таком случае можно использовать все накопленные библиотеки и более гибкий естественный синтаксис.
Характерной чертой всех естественных языков является целая гамма средств уменьшения избыточности текста. Основная их задача – уменьшить повторяемость определенных понятий, передавая активный элемент и контекст далее по тексту. Это позволяет сосредоточить внимание адресата на главном, не отвлекая его на детали. Алгоритмические же языки построены на концепции избыточной полноты информации и именно из-за её обилия (подчас не необходимой или неадекватно представленной) возникают проблемы при анализе текста программы. После рассмотрения выразительных средств, используемых в естественных языках, были выбраны сочинительные конструкции, анафорические конструкции и дескриптивные референции.
Использование сочинительных конструкций
Использование сочинительных конструкций в алгоритмических языках позволит достичь сразу несколько целей.
Во-первых, это позволит группировать логически объединенные фрагменты кода программы. Такая конструкция значительно удобнее для понимания человеком и совокупность операторов воспринимается как целостное действие, а не последовательность отдельных операций.
Во-вторых, это позволит снизить избыточность текста за счет совместного использования общего компонента конструкции. Примерами такого применения сочинительных конструкций могут являться единая группа аргументов для нескольких функций, единая функция для нескольких наборов аргументов, уникальный объект – владелец свойств или методов, к которым производится адресация. Такая конструкция аналогична операторам типа with…do в языке Паскаль, но, за счет более естественного синтаксиса, она проще воспринимается и анализируется человеком (рис.1).
Palette.Add(Red);
Palette.Add(Blue); Û Palette add red, blue and green.
Palette.Add(Green);
Window.Open;
Window.Maximize; Û Open, maximize and refresh Window.
Window.Refresh;
Окно.Открыть;
Окно.Максимизировать; Û Открыть, максимизировать и обновить окно.
Окно.Обновить;
Рис.1
Дескриптивные референции
Под термином «дескриптивная референция» имеется в виду конструкция, идентифицирующая объект исходя из его принадлежности к определенному классу и набору характеристик, позволяющих отличить его от других объектов данного класса.
При работе с множеством объектов гораздо удобнее указать класс объектов (например «стол» или «окно») и его специфические характеристики (например, «крашеный» или «диалоговое»), чем использовать уникальные идентификаторы. Традиционной заменой таких конструкций в языках программирования служат итерационные процедуры поиска нужного объекта и системы индексов для последующей адресации.
Помимо упрощения процедуры поиска объекта, такая конструкция имеет еще одно преимущество: она позволяет выделить наиболее важные свойства искомого объекта, привлечь внимание человека читающего текст к этим свойствам, оставляя «за кадром» все менее важное (рис. 2).
|
Active, child window Þ
Рис. 2
Анафорические конструкции
Третьим предложенным компонентом являются анафорические конструкции. Этот инструмент также предназначен для понижения избыточности текста. Его механизм заключается в использовании слов-заменителей для обозначения объекта, вместо повторного введения его в фокус внимания адресата. Такие слова заменители делятся на три основных класса: этот, такой и другой (аналогично для множественного числа). Таким образом, появляется возможность не только обратиться повторно к объекту, но и работать со связанными с ним объектами.
Как и в случае с дескриптивной референцией, это удобно, если речь идет о выборке объектов. Не следует также забывать и о том, что анафора воспринимается человеком легче, чем повторное именование объекта. Это обусловлено тем, что при использовании анафоры контекст и фокусный объект предыдущей части автоматически наследуются, и не происходит изменения объекта, на который направлено внимание адресата. В случае же повторного именования формально происходит смена фокусного объекта на новый, а, следовательно, необходима дополнительная обработка по сравнению объекта с предыдущим и их отождествлению. Результат является тем же, но требует больших ресурсов (за счет всех остальных «процессов», в том числе и за счет уменьшения внимания на анализ текста), к тому же – текст воспринимается как менее целостный, чем при использовании связного контекста (рис. 3).
MainWindow.Open; Open MainWindow. {… } Maximize it.
MainWindow.Maximize;
|
|
|
|
|
MainWindow.Open; Open MainWindow. {… } Minimize others.
{Minimize all others}
|
|
|
|
|
Рис. 3
Синтаксис
В дополнение к этим трем выразительным средствам стоит добавить и более гибкий синтаксис. В современных языках программирования порядок лексем строго определен и не может быть изменен. Как уже говорилось ранее, в этом есть свои плюсы и минусы. Минусы в том, что порядок элементов оператора не всегда совпадает с их порядком в естественном языке. Например, в объектном Паскале создание объекта выглядит следующим образом: TObject.Create (Объект создать). Гораздо более естественно звучит словосочетание Create TObject (Создать объект). Та же проблема может возникнуть и при вызове метода с аргументами. Такие словосочетания не причиняют большого неудобства, но текст в целом воспринимается как сложный для чтения из-за постоянного преобразования порядка элементов словосочетания (а это опять-таки отбирает ресурсы у других процессов). В этом случае отказ от строгой последовательности (хотя бы в указанных пределах) представляется оправданным и облегчающим понимание текста.
Дополнительно повысить «естественность» текста поможет использование словосочетаний, вместо однословных идентификаторов. Их введение незначительно усложнит задачу анализа, зато добавит выразительности и естественности в текст программы.
Использование родного языка разработчика
Все, что было описано выше, применимо к алгоритмическим языкам, основывающимся на английском языке. Логично перейти от английского языка к основному языку разработчика и взять его за основу при создании или расширении языка программирования. В нашем случае таким языком будет русский. Для этого нам лишь придется добавить использование кириллицы и изменяемые формы слов (рис. 4).
Open, maximize and refresh Main window.
ß
Открыть, максимизировать и обновить основное окно.
Рис. 4
Чтобы создать транслятор для такого языка программирования необходимо дополнить стандартный набор технологий, использующийся при создании трансляторов для КС-языков, методами, заимствованными из обработки текстов на естественном языке. В предложенном варианте языка, программа, как и обычно, делится на два фрагмента: объявлений (декларативный) и описаний методов (императивный).
Декларативная часть принципиально не отличается от её реализации в традиционных языках программирования. Исключением является лишь возможность использования словосочетаний в качестве идентификаторов. В ходе анализа данного фрагмента кода программы, помимо традиционного заполнения базы данных языковых конструкций, также производится анализ словосочетаний-идентификаторов. Анализ проводится с помощью категориальной грамматики русского языка. Его результатом является описание структуры словосочетания в виде дерева подчинения. Данный метод был выбран как более простой и удобный (хоть и не вполне адекватный) по сравнению с методом систем составляющих или гибридными методами (например, системы синтаксических групп). Эти деревья используются для поиска идентификаторов в тексте.
При анализе тела метода, сначала производится анализ каждого предложения с помощью категориальной грамматики русского языка (той же, что и для анализа словосочетаний). После построения дерева подчинения, описывающего структуру предложения, необходимо выявить конкретные конструкции языка. Для этого анализируются вхождения идентификаторов в предложение. Допускаются и «разорванные» идентификаторы (то есть разъединенные другими), но при этом они должны быть полными (содержать все слова) и находится внутри фрагмента, в котором разрешено разбиение.
Например, словосочетание, входящее в условие, может быть фрагментировано только в пределах этого условия. Среди найденных идентификаторов выделяются те, которые не имеют конкурентов на покрываемый ими участок кода. Они, а также ключевые слова, числа и т.д., используются в качестве островов для начала анализа грамматикой, описывающей язык программирования. Островной метод разбора был применен нами из-за того, что он позволяет учесть такие особенности текста как нестрогий порядок слов и неоднозначность идентификаторов (в случае их конкуренции за фрагменты текста).
Именно на этапе анализа грамматикой формального языка и происходит обработка дескриптивных референций, сочинительных и анафорических конструкций. Сочинительные конструкции классифицируются (например: сочинение методов, характеристик объекта, аргументов) и соответствующим образом обрабатываются. В случае сочинения методов им сопоставляется общий владелец, наборам аргументов – последовательность вызовов метода с каждым из наборов и т.д. Для дескриптивной референции в текст подставляется вызов процедуры поиска объекта по набору характеристик. Для анафоры из контекста выясняются дополнительные характеристики объекта, и также вставляется вызов процедуры поиска объекта по характеристикам. Объект ищется не среди всего множества объектов, удовлетворяющих условиям, но только среди тех, которые предварительно были использованы в тексте. Очевидно, что при выборе объекта необходимо руководствоваться принципом LIFO и выбирается последний из упомянутых подходящих объектов. Но действия по поиску объекта осуществляются уже на этапе выполнения кода, так как они опираются на сведения доступные лишь во время работы программы.
Заключение
Все описанные выше средства и механизмы направлены на одну цель: уменьшить работу человека по преобразованию текста программы в более удобный для себя вид. Представление кода в более удобной форме, в свою очередь, уменьшит число допускаемых и пропускаемых смысловых ошибок.
Другим интересным аспектом использования данной технологии является возможность создания многоязыковых средств разработки. Один и тот же формальный язык программирования можно «локализовывать» заменой грамматики, описывающей естественный язык. И наоборот, можно заменять язык программирования, сохраняя естественный язык-прототип. Все это позволит улучшить средства разработки и сделать их более удобными и дружественными.
Литература
- Pastuhov, A. Zaboleeva-Zotova Introductiong natural language phenomenas into the programming language //«Аррlication of the conversion research results for international cooperation SIBCONVERS’99» /Proceedings Volume 2 may 18-20, 1999, Tomsk, Russia IEE Catalog Number: 99EX246 ISBN: 0-7803-5172-X (Softbound Ed.) 0-7803-5173-8 (Microfiche Ed) Library of Congress: 98-88248
- Pastuhov, A. Zaboleeva-Zotova Using natural language constraction in the programming languages //«Interactive Systems: The Problems of Human-Computer Interaction».-Proceedeng of the Interactionol Conference, 22-24 september 1999.-Ulianovsk,1999
А. В. Заболеева-Зотова Моделирование текстообразования при описании структуры технической системы // Сб. научн. трудов ВолгГТУ «Концептуальное проектирование в образовании, технике и технологии»-
Волгоград, 1997