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

Министерство  образования РФ

ДАГЕСТАНСКИЙ  ГОСУДАРСТВЕННЫЙ 

ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ 
 
 
 
 

Кафедра ПОВТиАС 
 
 
 
 
 
 

КУРСОВАЯ  РАБОТА

ПО  ДИСЦИПЛИНЕ: «ТЯП» 

«СТРУКТУРА СОРЕМЕННОЙ СИСТЕМЫ ПРОГРАММИРОВАНИЯ» 

  
 
 
 
 
 
 
 

ВЫПОЛНИЛА: СТ-КА ГР. 3144

УВАЙСОВА  К.

ПРОВЕРИЛ: МУСТАФАЕВ А.Г. 
 
 
 
 
 
 
 
 
 
 
 

МАХАЧКАЛА 2004г.

                                                  ВВЕДЕНИЕ

 

РАЗВИТИЕ  СИСТЕМ ПРОГРАММИРОВАНИЯ 

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

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

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

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

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

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

        Весь  этот комплекс программно-технических  средств в настоящее  время составляет понятие «система программирования».

Современные системы программирования

ПОНЯТИЕ И СТРУКТУРА СИСТЕМЫ  ПРОГРАММИРОВАНИЯ 

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

КОМПИЛЯТОРЫ 

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

          Основным  модулем системы  программирования всегда является компилятор.

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

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

          Напомним  основные термины  и понятия.

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

          Близко  по смыслу к этому  понятию понятие компилятор.

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

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

          Таким образом, компиляторы  – это вид трансляторов.

          Напомним  также, что существует еще принципиально  отличное понятие  «интерпретатор».

          Интерпретатор – это программа, которая воспринимает входную программу на исходном языке и выполняет ее. (Интерпретатор не порождает результирующую программу и никакого результирующего кода.) 

           

          Основные  блоки (фазы) компилятора, их функции  

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

  1. Лексический анализ.
  2. Работа с таблицами.
  3. Синтаксический анализ, или разбор.
    1. Генерация кода, или трансляция в промежуточный код (например, языка ассемблер).
  1. Оптимизация кода.
  2. Генерация объектного кода.
 

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

           

        Лексический анализ

        Входом является цепочка символов некоторого алфавита.

        Некоторые комбинации символов в программе рассматриваются  как единые объекты  – лексемы (например, зарезервированные  слова, идентификаторы, числовые константы).

        Работа  лексического анализатора  состоит в том, чтобы сгруппировать  определенные символы в единые синтаксические объекты – лексемы.

        Выходом является последовательность лексем.

        Например, в результате лексического анализа следующей  цепочки символов

        Cost:= (price + tax) * 0.9

        будет обнаружено, что cost, price, tax являются лексемами типа идентификатор; 0.9 – лексема типа константа; :=, +, * - являются лексемами.

        Работа  с таблицами 

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

        Синтаксический анализ

        Вход  – цепочка лексем.

        На  этом этапе исследуется  цепочка лексем и  устанавливается, удовлетворяет  ли она структурным  условиям, явно сформулированным в определении  синтаксиса языка.

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

        Генерация кода

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

        Замечание. На практике чаще одновременно строится и дерево, и код.

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

         

        На  двух этапах – синтаксического  разбора и в  начале этапа подготовки к генерации кода – выполняется семантический анализ. Семантический анализатор проверяет семантические соглашения входного языка, проверяет элементарные семантические (смысловые) нормы языков программирования, напрямую не связанных с входным языком; дополняет внутреннее представление программы в компиляторе операторами и действиями, неявно предусмотренными семантикой входного языка.

        Оптимизация кода

        Попытка сделать объектные  программы более  эффективными (т.е. быстрее  работающими или  более компактными).

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

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

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

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

        Генерация объектного кода

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

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

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

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

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

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

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

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

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

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

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

        - получить от компилятора  результаты его  работы в виде  набора объектных  файлов;

        - подать весь набор  полученных объектных  файлов вместе  с необходимыми  библиотеками подпрограмм  на вход компоновщику;

        - получить от компоновщика  единый файл программы  (исполняемый файл) и подготовить  его к выполнению  с помощью загрузчика;

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

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

Со  временем разработчики компиляторов постарались  облегчить труд пользователей, предоставив им все  необходимое множество  программных модулей  в составе одной  поставки компилятора. Теперь компиляторы  поставлялись уже  вкупе со всеми  необходимыми сопровождающими техническими средствами. Кроме того, были унифицированы форматы объектных файлов и файлов библиотек подпрограмм. Теперь разработчики, имея компилятор от одного производителя, могли в принципе пользоваться библиотеками и объектными файлами, полученными от другого производителя компиляторов. Для написания командных файлов компиляции был предложен специальный командный язык — язык Makefile. Он позволял в достаточно гибкой и удобной форме описать весь процесс создания программы от порождения исходных текстов до подготовки ее к выполнению. Это было удобное, но достаточно сложное техническое средство, требующее от разработчика высокой степени подготовки и профессиональных знаний, поскольку сам командный язык Makefile был по сложности сравним с простым языком программирования. Язык Makefile стал стандартным средством, единым для компиляторов всех разработчиков.

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

Следующим шагом в развитии средств разработки стало появление  так называемой «интегрированной среды разработки».

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

Создание  интегрированных  сред разработки стало  возможным благодаря  бурному развитию персональных компьютеров  и появлению развитых средств интерфейса пользователя (сначала текстовых, а потом и графических). Их появление на рынке определило дальнейшие развитие такого рода технических средств. Пожалуй, первой удачной средой такого рода можно признать интегрированную среду программирования Turbo Pascal на основе языка Pascal производства фирмы Borland. Ее широкая популярность определила тот факт, что со временем все разработчики компиляторов обратились к созданию интегрированных средств разработки для своих продуктов. Развитие интегрированных сред несколько снизило требования к профессиональным навыкам разработчиков исходных программ. Теперь в простейшем случае от разработчика требовалось только знание исходного языка (его синтаксиса и семантики). При создании прикладной программы ее разработчик мог в простейшем случае даже не разбираться в архитектуре целевой вычислительной системы

Дальнейшее  развитие средств  разработки также  тесно связано  с повсеместным распространением развитых средств  графического интерфейса пользователя. Такой  интерфейс стал неотъемлемой составной частью многих современных ОС и так называемых графических оболочек. Со временем он стал стандартом «де-факто» практически во всех современных прикладных программах Это не могло не сказаться на требованиях, предъявляемых к средствам разработки программного обеспечения. В их состав были сначала включены соответствующие библиотеки, обеспечивающие поддержку развитого графического интерфейса пользователя и взаимодействие с функциями API (application program interface, прикладной программный интерфейс операционных систем). А затем для работы с ними потребовались дополнительные средства, обеспечивающие разработку внешнего вида интерфейсных модулей. Такая работа была уже более характерна для дизайнера, чем для программиста.

Для описания графических элементов программ потребовались соответствующие языки. На их основе сложилось понятие «ресурсов»(1) (resources) прикладных программ. Ресурсами прикладной программы будем называть множество данных, обеспечивающих внешний вид интерфейса пользователя этой программы, и не связанных напрямую с логикой выполнения программы. Характерными примерами ресурсов являются:

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

Весь  этот комплекс программно-технических  средств в настоящие  время составляет новое понятие, которое  здесь названо  «системой программирования.

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

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

  

  

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

 

Текстовый  ®¬  Исходная    ®¾ Компилятор  ®¾ Объектная ®¾ Редактор  ¾¬  Библиотеки

редактор               программа                                     программа            связей

                                                                                                                       ¯

                                                                                                               Исполняемый

                                                                                                                    файл                                                                                                                      

 ¯

Редактор  ®¬  Исходный код ®¾ Компилятор  ®¾ Ресурсы    ®¾ Загрузчик

ресурсов             ресурсов                 ресурсов              интерфейса                                                                                                                       

 ¯  

                                                                                                    Выполнение программы 

 

Примерами современных систем программирования являются

Системы программирования Turbo Pascal, Borland Pascal, Borland Delphi, Borland C++ Builder,

Microsoft Visual Basic, Microsoft Visual C++. Новейшими системами программирования являются система, построенная на базе языка С# и системы, ориентированные на концепцию .NET.

Системы программирования языка  С под ОС Linux и UNIX (функции загрузчика выполняются самой ОС) долгое время не требовали наличия интегрированной среды и вполне могли быть ограничены командными файлами компиляции. Однако стали появляться и системы программирования, построенные на базе интегрированных сред разработки. В основном они строятся в графической среде на базе стандартного графического интерфейса пользователя на основе среды X Windows.

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

(1) Термин «ресурсы»  следует признать  не слишком удачным, так как этим словом обозначаются очень многие понятия, связанные с вычислительными системами (например, ресурсы вычислительного процесса). Однако так сложилось, что этот термин применяется при работе со средствами разработки, поэтому придется принять его. 

(2) Наверное, с точки  зрения терминологии  компиляторы ресурсов  правильнее было  бы назвать «трансляторы»,  так как в результате  своей работы они  обычно порождают  не объектный файл, а некий промежуточный  код ресурсов. Однако  термин «компилятор ресурсов» стал уже общепринятым.