Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sranaya_informatika.doc
Скачиваний:
24
Добавлен:
12.04.2015
Размер:
2.48 Mб
Скачать

43 Понятие о системе программирования

1. ОСНОВНЫЕ ФУНКЦИИ И КОМПОНЕНТЫ

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

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

* трансляторы с языков высокого уровня;

* средства редактирования, компоновки и загрузки программ;

* макроассемблеры (машинно-ориентированные языки);

* отладчики машинных программ.

Системы программирования, как правило, включают в себя

* текстовый редактор (Edit), осуществляющий функции записи и редактирования исходного текста программы;

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

* запускатель программ (Run), осуществляющий процесс выполнения программы;

* компилятор (Compile), предназначенный для компиляции или интерпретации исходного текста программы в машинный код с диагностикой синтаксических и семантических (логических) ошибок;

* отладчик (Debug), выполняющий сервисные функции по отладке и тестированию программы;

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

Ядро системы программирования составляет язык. Существующие языки программирования можно разделить на две группы: процедурные и непроцедурные, рис.1.

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

Процедурные языки разделяют на языки низкого и высокого уровня.

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

Перечислим наиболее известные системы программирования.

1. Фортран (FORmula TRANslating system - система трансляции формул); старейший и по сей день активно используемый в решении задач математической ориентации язык.

2. Бейсик (Beginner's All-purpose Symbolic Instruction Code - универсальный символический код инструкций для начинающих); несмотря на многие недостатки и изобилие плохо совместимых версий - самый популярный по числу пользователей.

3. Алгол (ALGOrithmic Language - алгоритмический язык); сыграл большую роль в теории, но для практического программирования сейчас почти не используется.

4. ПЛ/1 (PL/I Programming Language - язык программирования первый). Многоцелевой язык; сейчас почти не используется.

5. Си (С - «си»); широко используется при создании системного программного обеспечения.

6. Паскаль (Pascal - назван в честь ученого Блеза Паскаля); чрезвычайно популярен как при изучении программирования, так и среди профессионалов. На его базе созданы несколько более мощных языков (Модула, Ада, Дельфи).

7. Кобол (COmmon Business Oriented Language - язык, ориентированный на общий бизнес); в значительной мере вышел из употребления.

8. Дельфи (Delphi) - язык объектно-ориентированного «визуального» программирования; в данный момент чрезвычайно популярен.

9. Джава (Java) - платформенно-независимый язык объектно-ориентированного программирования, чрезвычайно эффективен для создания интерактивных веб-страниц.

Среди непроцедурных языков наиболее известны

1. Лисп (Lisp);

2. Пролог (PROgramming in LOGic);

3. Оккам (назван в честь философа У. Оккама).

44Microsoft Visual Basic — средство разработки программного обеспечения, разрабатываемое корпорацией Microsoft и включающее язык программирования и среду разработки. Язык Visual Basic унаследовал дух, стиль и отчасти синтаксис своего предка — языка Бейсик, у которого есть немало диалектов. В то же время Visual Basic сочетает в себе процедуры и элементы объектно-ориентированных и компонентно-ориентированных языков программирования. Среда разработки VB включает инструменты для визуального конструирования пользовательского интерфейса.

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

Первое признание серьёзными разработчиками Visual Basic получил после выхода версии 3 — VB3. Окончательное признание как полноценного средства программирования для Windows — при выходе версии 5 — VB5. Версия VB6, входящая в состав Microsoft Visual Studio 6.0, стала по-настоящему зрелым и функционально богатым продуктом. После этого разработчики из Microsoft существенно изменили направление развития данной технологии.

Visual Basic .NET не позволяет программировать по-старому, ибо по сути является совершенно другим языком, таким же, как и любой другой язык программирования для платформы .NET. Индивидуальность языка, так же как и его преимущества (простота, скорость создания программ, лёгкость использования готовых компонент) при использовании в среде .NET не имеют такого значения, как раньше — всё сосредоточено на возможностях самой системы .NET, на её библиотеке классов. Поэтому сегодня (сентябрь 2010) нужно говорить о классическом Visual Basic, его диалектах Visual Basic for Applications (VBA) и Visual Basic Scripting Edition(VBScript) и о языке для платформы .NET — Visual Basic .NET.

45Технологии программирования  — технологии разработки программ для ЭВМ, которые будут использоваться людьми для решения различных задач на ЭВМ.

Технологии программирование включают:

  1. Анализ и постановка задач

  2. Проектирование - разработка спецификаций

  3. Проектирование  — разработка алгоритмов

  4. Написание исходных текстов программ

  5. Тестирование и отладка программ

  6. Испытания и сдача программ

  7. Сопровождение программ

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

  • указание последовательности выполнения технологических операций;

  • перечисление условий, при которых выполняется та или иная операция;

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

Прикладная программа, разработанная специально для Windows95 или Windows NT называетсяприложением WIN32 (WIN32 application). Поэтому в дальнейшем мы будем использовать термин“приложение” вместо термина “прикладная программа”.

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

В Windows95 и Windows NT реализована вытесняющая мультизадачностьна уровне потоковПоток (thread) описывает последовательность исполнения кода внутри процесса. В соответствии с установленным приоритетом система выделяет каждому потоку кванты процессорного времени, задаваемые системным таймером. Любому потоку в приложении соответствует некоторая функция - функция потока.  При запуске приложения создается процесс, а в его рамках – первичный поток, который и получает управление. Приложение  должно  состоять  как  минимум  из  одной  функции – функции первичного потока,  которая  при  программировании  на  языке  С  заменяет  функцию main  и должна быть определена  следующим  образом:

            int   WINAPI WinMain  (HINSTANCE   hinstance ,  HINSTANCE   hPrevinstance,

                                                       LPSTR   lpszCmdLine,        int  nCmdShow)

 { //    Тело    функции    }

Все  параметры ,  получаемые  функцией  WinMain ,  формируются  операционной системой. Параметры  hinstance  и hPrevinstance представляют  собой  соответственно  идентификаторы  текущей  и  предыдущей  копии  приложения. Приложения WIN32 функционируют в изолированных виртуальных адресных пространствах и в силу этого не имеют возможности определить через параметр hPrevinstance, не запущено ли приложение вторично. Этот параметр использовался в предыдущих версиях Windows, для приложений WIN32 он всегда равен нулю.  Параметр lpszCmdLine - дальний  указатель на строку  запуска  приложения ,  параметр nCmdShow указывает рекомендуемый приложению способ представления главного окна  при  запуске. Приложение может игнорировать этот  параметр, однако это не является хорошим стилем программирования. Обычно значение данного параметра передается без изменений функции ShowWindow для отображения на  экране главного окна приложения. Ниже приведены возможные значения параметра nCmdShow, определенные как константы с префиксами

SW_HIDE- скрыть окно и активизировать другое окно;

SW_MINIMIZE– минимизировать окно и активизировать окно верхнего уровня в системном списке;          

            SW_RESTORE – активизировать и отобразить окно в его первоначальном размере и позиции;

SW_SHOW- активизировать и отобразить окно в его текущем размере и позиции;

SW_SHOWMAXIMIZED - активизировать и отобразить окно в полном размере;

SW_SHOWMINIMIZED - активизировать и отобразить окно в виде пиктограммы; 

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

SW_SHOWNA- отобразить окно в текущем состоянии, активное окно остается активным;

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

SW_SHOWNORMAL – аналогично SW_RESTORE.

Модификатор вызова WINAPI определяет порядок помещения в стек параметров функции при вызове. Для функций также определены следующие модификаторы:

            #define CALLBACK    __stdcall

#define WINAPI      __stdcall

#define APIENTRY    WINAPI

#define APIPRIVATE  __stdcall

#define PASCAL      __stdcall

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

8

            Сделаем одно важное замечание относительно используемых типов данных. Для приложений Windowsопределено множество новых типов данных, которые выведены из стандартных типов данных языка С. Однако, при программировании следует использовать именно новые типы данных, а не их стандартные эквиваленты. В противном случае будет затруднена модификация программ для их использования в последующих версиях Windows. Например, прототип функции WinMain не изменился при переходе  от API  WIN16 (Windows 3.1) к API WIN32. Однако, в WIN16 тип HINSTANCE представлял собой 16-разрядное целое, а в WIN32 он стал 32-разрядным. Во избежание ошибок рекомендуется в исходном тексте вводить строгий контроль типов при помощи определения :

 #define STRICT

Кроме того при именовании переменных следует придерживаться так называемой “венгерской нотации”, согласно которой имя переменной должно начинаться с одной или нескольких строчных букв, отражающих ее тип. Так, в параметре hInstance функции WinMain префикс h  означает идентификатор   (handle), а префикс lpsz в lpszCmdLine означает дальний указатель на ASCIIZ-строку (long pointer on string zero).

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

            Для нормальной работы приложения функция потока (то есть в нашем случае – функция WinMain) должна обрабатывать сообщения. Сообщение представляет собой сформированную операционной системой информацию о некотором событии во “внешнем” (по отношению к потоку) мире, о котором, по мнению ОС, должен “узнать” поток. Имеется три основных источника сообщений : аппаратура, потоки других процессов (или одного процесса – в случае мультипотоковых приложений) и сама ОС.

При нажатии клавиши на клавиатуре, кнопки мыши, перемещении мыши или при других операциях с аппаратурой драйвер устройства распознает соответствующее аппаратное событие и помещает информацию о нем в очередь системного потока необработанного ввода (RIT – raw input thread). Главной задачей RITявляется определение потока, которому необходимо направить информацию об аппаратном событии. Так, в случае сигнала от мыши, RIT определяет поверх какого окна находится курсор мыши, а в случае сигнала от клавиатуры RITопределяет, какой поток является приоритетным потоком (foreground thread), т.е. с каким потоком пользователь работает в данный момент.  Затем RIT направляет информацию о событии в виртуальную очередь ввода выбранного потока. ОС преобразует эту информацию в сообщение, которое направляется в очередь сообщений потока, которому принадлежит виртуальная очередь ввода.

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

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

            typedef  struct    tagMSG

            {          HWND        hwnd; // идентификатор окна ,  которому  направлено сообщение

                        UINT           message; // цифровой  код  (номер) сообщения 

                        WPARAM  wParam;// специфическая   для  каждого  сообщения

                        LPARAM    lParam;//                         информация                                      

                        DWORD      time;// время создания  сообщения

                        POINT          pt;// положение курсора в момент создания сообщения

            }  MSG;

9

Коды сообщений определены как  константы с различными префиксами. Сообщениям,  предназначенным для  управления окнами, соответствуют константы с префиксами WM_. Наиболее часто используемые сообщения будут нами рассмотрены по мере необходимости.  Полный список и описание сообщений можно найти в справочной документации и в электронном справочнике WIN32 Programmer’s Reference системы программирования BorlandC++ 5.01.

            Для обработки сообщений функция потока должна  содержать цикл обработки  сообщений(message loop). Основу  этого цикла  составляют  две  функции API WIN32,  имеющие  следующие  прототипы:

BOOL GetMessage (LPMSG lpmsg ,  HWND  hwnd, UINT uMsgFilterMin , UINT uMsgFilterMax);

LONG DispatchMessage(const MSG  * lpmsg);

Простейший  цикл обработки  сообщений выглядит следующим  образом:

            MSG      msg;

                  .   .   .

            while (GetMessage(&msg ,  0 ,  0  ,  0 ) ) {    DispatchMessage(&msg);       }

Функция GetMessage извлекает очередное сообщение из очереди сообщений вызвавшего ее потока. Параметр lpmsg - дальний указатель на структуру  типа MSG. Параметр hwnd (идентификатор окна) определяет конкретное окно из числа окон, созданных потоком, которому  послано  сообщение. Сообщения, инициируемые устройствами ввода, такими как клавиатура или мышь, посылаются окну, владеющему фокусом ввода (активному окну). В каждый момент времени поток либо вообще не владеет фокусом ввода (пользователь работает с окном другого потока), либо фокус ввода принадлежит одному из его окон. Если в качестве второго параметра  функции  GetMessage указан NULL  ( или 0 ) ,  то  сообщения  будут выбираться  для всех  окон, принадлежащих вызвавшему функцию потоку.  Третий  и четвертый параметры функции  GetMessage задают диапазон номеров сообщений ,  извлекаемых  из очереди.  Если  оба  параметра  содержат нуль ,  то извлекаются все  сообщения ,  направленные потоку. Функция GetMessage возвращает значение FALSE в случае, если извлекается сообщение WM_QUIT, во всех остальных случаях возвращается значение TRUE. Выборка сообщения WM_QUIT приводит к выходу из цикла, после чего обычно поток завершается. Следует также отметить важную особенность функции GetMessage : если функция обнаруживает, что очередь сообщений потока пуста, то поток блокируется и ему не выделяется процессорное время до тех пор, пока новое сообщение не поступит в очередь. Если пусты очереди всех прикладных потоков, то обычно процессорное время распределяется между низкоприоритетными системными потоками, в частности, запускается хранитель экрана.

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

            Функции  окна  соответствует  следующий  прототип  (имя  функции  выбирается  произвольно):

LRESULT  CALLBACK WndProc ( HWND  hwnd ,  UINT  msg ,

                                                            WPARAM  wParam  ,  LPARAM lParam);

Параметры  функции  полностью  аналогичны  соответствующим  полям  стуктуры  MSG.

            Типичная  структура  функции  окна  имеет  следующий  вид :

10

            LRESULT  CALLBACK WndProc ( HWND  hwnd ,  UINT  msg ,

                                                                       WPARAM  wParam  ,  LPARAM lParam);

            { //  обработка  сообщений              

                        switch (msg)  

                                {   case  сообщени :{   .   .   .   return 0 ; }

                                   case  сообщениe  :{   .   .   .   return 0 ; }

                                        .      .      .

 case   WM_DESTROY :

                             {

                               // это сообщение приходит ,  когда  пользователь закрывает окно

                                PostQuitMessage(0);  // посылаем  в очередь  сообщение WM_QUIT

                                return 0 ;

                              }

                          }

             // остальные сообщения  обрабатываются  по умолчанию

             return  DefWindowProc ( hwnd ,  msg ,  wParam  ,  lParam ); 

            }

Фактически функция окна представляет собой один большой оператор выбора из обрабатываемых функцией       окна сообщений и содержит обработчики этих сообщений. Как правило, программист планирует обработку далеко не всех сообщений, поступающих в функцию окна. Поэтому, перед возвратом из функции необработанные сообщения передаются на обработку по умолчанию функции DefWindowProc. Значение, возвращаемое функцией окна в общем случае определяется тем, какое обрабатывалось сообщение. Обратим также внимание на обработку сообщения WM_DESTROY, которое поступает в функцию окна, когда пользователь закрывает окно. Если речь идет о главном окне приложения, то стандартно после закрытия этого окна приложение должно быть завершено. Для этого при помощи функции PostQuitMessage в очередь сообщений соответствующего потока посылается сообщение WM_QUIT. Это один из примеров посылки сообщения в собственную очередь.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]