Проблемно-ориентированный язык

 

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

К числу проблемно-ориентированных алгоритмических языков относятся языки, специально разработанные для описания процессов решения задач некоторого узкого класса. Например, язык Фортран был разработан специально для программирования научных задач. Язык программирования Кобол в основном предназначался для решения экономических задач. Система программирования GPSS ориентирована на моделирование систем с помощью событий. В терминах этого языка легко описывается класс моделей массового обслуживания. Там, где результаты исследований выражаются в терминах времени ожидания, длины очереди, использования ресурсов и т.п., применение языка GPSS полностью оправдано.

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

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

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

В языках программирования высокого уровня нет точного соответствия между языковыми конструкциями и машинными командами. Преобразование строк исходного кода в последовательности двоичных команд осуществляется транслятором. К таким языкам относятся PL /1, Pascal, C, C++, Java. Все они менее эффективно используют аппаратуру по сравнению с языками Ассемблера, но позволяют быстрее создавать приложения. В результате им удалось практически полностью вытеснить языки Ассемблера при создании крупных приложений.

Языки программирования высокого уровня отличаются от Ассемблеров, во-первых, тем, что они являются более высокоуровневыми, и, во-вторых, используют более строгий контроль типов данных. Термин “высокоуровневый” означает следующее: многие детали обрабатываются автоматически, а программисту для создания своего приложения приходится писать меньшее количество строк. В частности:

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

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

• для описания структур управления программист может использовать также такие ключевые слова, как if, while; последовательности машинных команд, соответствующие этим описаниям, транслятор генерирует динамически.

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

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

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

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

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

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

 

Операционная система

 

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

Под ОС понимается комплекс программ, функ­ции которых определяют ВС с точки зрения пользователя. Операционная система является посредником между компьютером и пользовательскими программами. Работая на машине с ОС, пользователь не обращается непосредственно к машинным операциям. Скорее, он дает запросы (задания) программам ОС, которые затем уже используют машинные операции. ОС, как правило, содержат большое семейство программ. Объем ядра достаточно простой ОС составляет примерно 100–500 Кбайт программного кода. Существуют и более компактные ОС, так ОС реального времени QNX имеет ядро порядка 20 Кб, а вся ОС, включая интерфейс пользователя и ряд служебных программ (например, браузер Интернет), помещается на дискете 1,44 Мбайт. Новейшие ОС могут иметь значительно больший объем – десятки и сотни мегабайт.

ОС обеспечивает выполнение основных двух задач:

• поддержку работы всех программ, обеспечение их взаимодействия с аппаратурой;

• предоставление пользователям возможностей общего управления машиной.

В простейшем случае ОС содержит следующие основные компоненты:

• файловую систему;

• драйверы внешних устройств;

• процессор командного языка.

Драйвер – специальная программа, обеспечивающая работу устройств ЭВМ. Драйверы загружаются в память компьютера при загрузке операционной системы.

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

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

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

Эта задача охватывает комплекс управления и распределения ресур­сов системы для:

• длительного хранения данных и управления ими (внешняя память);

• выполнения программ пользователей (процессор и оперативная па­мять);

• использования устройств ввода/вывода, включая устройства для дальней передачи данных (устройства ввода/вывода).

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

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

Наряду с этим на структуру ОС и ее функции существенное влияние оказывает число пользовательских программ, одновременно обрабаты­ваемых системой, и в связи с этим говорят о режиме работы системы. Если ОС выполняет пользовательские программы строго одну после другой, т.е. в каждый момент времени в процессе обработки находится только одна программа, то говорят об одно- или монопрограммном ре­жиме работы системы. При этом каждая программа выполняется без ее прерываний в процессе вычислений. Этот режим используется только в очень простых ОС, ориентированных на одного пользователя. Из соображений более полного использования ресурсов ВС и одновре­менного обслуживания многих пользователей ОС в большинстве случаев обрабатывают одновременно (параллельно) несколько программ (соответственно запросов пользователей). Таким образом, если в один и тот же момент времени в процессе выполнения может находиться много программ, то говорят о много- или мультипрограммном режиме работы системы.

На эксплуатационную ситуацию ВС существенно влияют вид желае­мого использования ВС и число ее пользователей. В однопользователь­ском режиме ВС используется только одним пользователем. В этом слу­чае достаточно однопрограммного режима работы ВС. Однако если и здесь желательно определенные запросы пользователя выполнять парал­лельно, т.е. наряду друг с другом (типичный пример – печать результатов как фоновый процесс), то однопрограммного режима работы системы уже недостаточно даже в случае одного пользователя. В многопользова­тельском режиме многие пользователи одновременно применяют ВС. Ес­ли к тому же пользователи ведут диалог с ВС, то говорят о системе разде­ления времени (time sharing); в этом случае требуется мультипро­граммный режим работы ВС. При этом программы пользователей (которые считаются упорядоченными и замкнутыми в кольцо) поочеред­но получают определенный квант процессорного времени. Функциони­рование системы разделения времени требует учета готовых к выполне­нию программ, и благодаря этому ОС осуществляет управление выпол­нением программ.

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

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

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

• потребность процессорного времени;

• текущие потребности памяти;

• потребности для длительного хранения данных;

• приоритет;

• специальные правовые отношения.

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

Обычно ОС через имеющиеся в распоряжении пользователя опера­ции (команды, адресованные ОС) делает возможным доступ к соответст­вующим службам ОС, которые, в частности, охватывают следующие виды работ:

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

• хранение данных;

• передачу сообщений другим пользователям и (через сеть) другим ВС;

• доступ к специальным терминальным (конечным) устройствам (в ча­стности, к устройствам вывода).

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

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

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

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