и позволяющий эффективно определять новый объект ( экземляр
класса ), наследующий свойства класса .Предоставляя в распоряжение программиста библиотеку встроенных классов , Visual FoxPro позволяет вводить новые классы и создавать новые библиотеки классов .
Программы и приложения (CODE).В Visual FoxPro предоставлена возможность гибкого сочетания объектно - ориентированного стиля программирования с процедурно - ориентированными средствами ,
предусматривающая создание программных и процедурных файлов (PRG - файлов ) на языке FoxPro. Причем один из этих файлов выбирается в качестве главного ("запускающего") модуля , активизирующего соответствующие объекты , каждый из которых в свою очередь активизирует другие и т .п. .В результате компиляции проекта имеется возможность получения как EXE -файла, так и специального APP - файла , представляющего из себя промежуточный результат компиляции и выполняемого интерпретатором Visual FoxPro. Такие APP - - файлы , называемые приложениями , являются более компактными по сравнению с соответствующими EXE - файлами , однако могут выполняться только при наличии среды Visual FoxPro.
Другие объекты (OTHER) включают меню , текстовые и другие файлы , необходимые для разработки программ . Visual FoxPro представляет эффективные средства средства генерации меню - диалога .
Область применения СУБД Visual FoxPro охватывает достаточно широкий класс задач, однако наиболее очевидный эффект достигается
для информационно -расчетных задач , характерной особенностью которых является сочетание обработки больших информационных массивов с вычислительными задачами . Это - бухгалтерский учет , анализ финансово -хозяйственной деятельности предприятий , информационно - поисковые системы , системы автоматизации делопроизводства и т .п.
Для эффективной разработки и создания качественного программного продукта , ориентированного на решение перечисленных задач , очень важное значение имеет концептуальный подход к разработкам . Это -
- достаточно емкое понятие , предусматривающее в первую очередь строгую математическую формализацию модели разработки , с помощью которой можно было бы наиболее просто и компактно
описать и в дальнейшем эффективно реализовать сложные структурные связи между объектами и алгоритмами их обработки , четко отделяя второстепенные моменты от главных .
Например , разработка компьютерной бухгалтерии предусматривает создание комплекса подсистем : расчет заработной платы , касса , банк , материально складской учет , учет основных средств , работа с подотчетными лицами , поставщики -получатели и т .п. Каждая из подсистем должна включать в себя средства для получения огромного
числа различных отчетных документов с учетом различных бухгалтерских операций и специфики бухгалтерской отчетности для разных типов организаций . Кроме этого необходимо обеспечить возможности обмена данными между этими подсистемами и
экспорта результатов работы подсистем в автоматизированное рабочее место главного бухгалтера с целью получения конечных бухгалтерских документов (баланс , главная книга и т .п.). Все это представляет из себя достаточно сложную и трудоемкую задачу ,“лобовое” решение которой как правило не приносит ожидаемых результатов . С другой стороны концептуальный анализ этой проблемы показывает , что основная часть
перечисленных подсистем имеет одну и ту же общую основу , сводящуюся к расчету остатков на текущий период из оборотов и остатков предыдущего периода .Следовательно, разработку необходимо начинать с создания средств расчета остатков ,которые в последующем могут существенно облегчить задачу разработки и реализации упомянутых подсистем . Другим важным аспектом разработки
бухгалтерской системы является создание единых справочников , представляющих из себя источники первичной информации для всех соответствующих подсистем (план счетов , справочник финансовых операций с бухгалтерскими проводками , справочник источников финансирования , справочник подразделений предприятия и т .п.),
правильная организация которых обеспечивает универсальность и хорошую адаптируемость системы к изменениям .
Объектно - ориентированные средства , позволяя абстрагирование (обобщения) объектов разработки приложений с последующей их конкретизацией , представляют наиболее адекватный инструмент для создания различных информационно - расчетных приложений и удачно
“провоцируют” разработчиков этих приложений на выбор
концептуальных решений .
3.Теория и методы трансляции.
Трансляция - это процесс перевода текста исходной программы в эквивалентную объектную программу. Программное обеспечение ,
реализующее этот процесс называется транслятором . Если в результате трансляции генерируется объектная программа на ассемблере или некотором машинном языке, то вместо трансляции используется понятие компиляции , а сам транслятор называется компилятором.
Языки интерпретируемого типа предусматривают получение
в результате трансляции так называемого промежуточного кода
( традиционно - это линеаризованная структура со ссылками на программные модули) , выполнение которого осуществляется специальной программой , называемой интерпретатором. Для языков интерпретируемого типа происходит частичная компиляция , завершаемая генерацией промежуточного кода , который затем интерпретируется . Чаще всего интерпретатором называется программное обеспечение , реализующее весь этот процесс целиком ,
то есть частичная компиляция с генерацией промежуточного кода плюс интерпретация промежуточного кода . Поскольку и в том и другом случае выполняется процесс компиляции ( в случае интерпретации неполный ) , в последующем изложении материала будем в основном использовать термины "компиляция" и "компилятор" вместо "трансляция" и "транслятор" соответственно .
Большинство теоретических работ и методов для практической
реализации компиляторов появилось в 1970-х , а некоторые из них еще раньше. Первые разработки в этой области предусматривали создание нового компилятора для каждого нового появляющегося языка
программирования практически с самого начала . Однако существенная трудоемкость этого процесса и стремление к универсализации стимулировали появление инстументальных программных средств для автоматизации процесса создания компиляторов . В результате появился программный инструментарий , обеспечивающий генерацию готового компилятора на основе описания синтаксиса и семантики соответствующего языка программирования . Этот инструментарий , впоследствии названный " компилятором компиляторов " , получил большое распространение в процессе создания компиляторов . К числу самых известных разработок в этом плане можно отнести генераторы лексического и синтаксичес-кого анализаторов LEX и YACC , работающих в UNIX -среде .
К настоящему времени опубликовано достаточно большое количество работ , посвященных теории и практике компиляции , однако большинство из них либо содержат сложно воспринимаемый теоретический базис , либо представляют слишком прагматический материал . В этой связи рекомендуется использовать книгу [ 6 ] , которая достаточно прозрачно и компактно представляет теоретические и практические основы компиляции . Представляемый в пособии материал
никоим образом не претендует на полноту охвата всех существующих методов компиляции .Вместо этого предлагается материал , позволяющий акцентировать внимание на концептуальных основах процесса компиляции и принципиального понимания соответствующих методов .
3.1. Определение языка.
Определение языка программирования также , как и любого другого языка,основывается на двух главных понятиях :синтаксис и семантика.
Синтаксис определяет правила для описания правильных конструкций языка , а семантика - смысловую интерпретацию этих конструкций .
3.1.1.Синтаксис .
Существует множество различных способов описания синтаксиса языков программирования . Если язык состоит из конечного числа строк , то его определение может быть сделано перечислением всех его элементов . Так как все языки программирования содержат бесконечное число строк , то требуется найти способ представления бесконечного числа строк конечным образом .
Рассмотрим примеры описания бесконечного числа строк символов.
Пример1 . Язык который состоит из произвольного количества символа x
Может быть определен в виде выражения { x n | n>0 } , где n - целое , а
умножение здесь трактуется как конкатенация .
Пример2 . Язык который состоит из произвольного количества
символа x , после которого следует произвольное количество
символов y . Этот язык определяется в виде выражения
{ x m y n | m,n>0 } , где m,n - целые .
Пример 3. Если язык определить в виде выражения
{ x m y n | m,n ³ 0 } , то допустимыми являются строки вида
xxx ( при n=0 ) ,уууу (при m=0) , а также пустая строка (при m=0 , n=0), которую будем обозначать <> .
Пример 4 . Язык , определенный в примере 3 , можно переопределить
по другому : x * y * , где символ "* " (звездочка Клини) обозначает , что предшествующий ему элемент , используется нуль или большее число раз (представление с помощью языка регулярных выражений ).
Пример 5 . Выражение вида xx * yy * определяет язык , каждая строка которого содержит как минимум по одному элементу x и y .
Рассмотрим формальное определение регулярных выражений , которые были использованы в перечисленных выше примерах . Вводится понятие алфавита , представляющего конечный набор символов . Например ,
{ A..Z } , { 0..9 } , { А..Я } и т.п. .
Регулярными выражениями являются :
1) пустая строка (<>) ;
2) любой элемент из алфавита .
Далее , если P и Q - регулярные выражения , то регулярными являются
выражения :
3) PQ (Q следует за P ) ;
4) P | Q (P или Q) ;
5) P * ( нуль или большее число вхождений P) .