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

 

3.1.1.Средства создания программ

 

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

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

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

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

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

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

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

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

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

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

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

Исполнимый код – это законченная программа, которую можно запустить на любом компьютере, где установлена операционная система, для которой эта программа создавалась. Как правило, итоговый файл имеет расширение .ЕХЕ или .СОМ.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Дальнейшее развитие средств разработки также тесно связано с повсеместным распространением развитых средств графического интерфейса пользователя. Та­кой интерфейс стал неотъемлемой составной частью многих современных ОС. Со временем он стал стандар­том “де-факто” практически во всех современных прикладных программах.

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

Для описания графических элементов программ потребовались соответствую­щие языки. На их основе сложилось понятие “ресурсов” (resources) приклад­ных программ.

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

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

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