double arrow

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


Си (англ. C) — стандартизированный процедурный язык программирования, разработанный в начале 1970-х годов сотрудниками BellLabs Кеном Томпсоном и Денисом Ритчи как развитие языка Би. Си был создан для использования в операционной системе UNIX. С тех пор он был портирован на многие другие операционные системы и стал одним из самых используемых языков программирования. Он является самым популярным языком для создания системного программного обеспечения.

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

Системное программирование (или программирование систем) — подраздел программирования, заключающийся в работе над системным программным обеспечением.

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




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

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

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

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



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

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

- использование препроцессора для, например, определения макросов и включения файлов с исходным кодом;

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

- минимальное число ключевых слов;

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

- указатели на функции и статические переменные

- области действия имён;

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

Вот некоторые особенности других языков программирования, которых не имеет Си:

- автоматическое управление памятью;

- поддержка объектно-ориентированного программирования (при этом первые версии C++ генерировали код программы на языке Си);

- замыкание;

- вложенные функции (существуют компиляторы языка Си реализующие эту функцию, например компилятор GNU);

- полиморфизм функций и операторов;

- встроенная поддержка многозадачности и сети;

- функции высшего порядка;

Главным качеством языка C, которое делает его именно языком системного программиста, является то, что "C - это язык относительно "низкого уровня"... Это означает, что C имеет дело с объектами того же вида, что и большинство ЭВМ, а именно, с символами, числами и адресами. Чрезвычайно важным свойством языка C, которого нет в других языках, является адресная арифметика. Над данными типа "указатель" возможны арифметические операции, причем в них могут учитываться размеры тех объектов, которые адресуются указателем.



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

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

процедурно-ориентированный язык C вместе с тем представляет все кодовые составляющие программы в виде функций. Это дает возможность применять язык C и як инструмент функционально-ориентированного программирования.

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

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

· Виртуальные машины могут использоваться для:

· защиты информации и ограничения возможностей программ ;

· исследования производительности ПО или новой компьютерной архитектуры;

· эмуляции различных архитектур;

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

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

· Тестирования и отладки системного программного обеспечения;

· и пр.

JavaVirtualMachine —виртуальная машина Java, часть среды исполнения Java, выполняющая интерпретацию Java байт-кода.JavaVirtualMachine специфицируется набором команд байт-кода, набором регистров, стеком, сборщиком мусора и пространством хранения методов.Java байт-код – машинно-независимый код, который генерирует Java-компилятор. Байт-код выполняется Java-интерпретатором. Виртуальная машина Java полностью стековая: не требуется сложная адресация ячеек памяти и большое количество регистров. Поэтому команды JVM короткие, большинство из них имеет длину 1 байт, отчего команды JVM называют байт-кодами (bytecodes), хотя имеются команды длиной 2 и 3 байта (средняя длина команды составляет 1,8 байта).

Программа, написанная на языке Java, переводится компилятором в байт-код. Байт-код записывается в одном или нескольких файлах, может храниться во внешней памяти или передаваться по сети. Это особенно удобно благодаря небольшому размеру файлов с байт-кодом. Полученный в результате компиляции байт-код можно выполнять на любом компьютере, имеющем систему, реализующую JVM (в не зависимости от типа какого-либо конкретного процессора и архитектуры ПК). Так реализуется принцип Java: «Написано однажды, выполняется где угодно».

В архитектуре AS/400 сочетаются концепции иерархической архитектуры, архитектуры на базе микроядра, виртуальной машины и объектно-ориентированного подхода. В иерархической структуре самый нижний слой программного обеспечения выделен в, так называемый, Системный Лицензионный Внутренний Код (SLIC) и составляет микроядро. SLIC обеспечивает аппаратную независимость верхних уровней программного обеспечения - приложений и OS/400.

Интерфейс микроядра - в AS/400 он называется MI (machineinterface - машинный интерфейс) - обеспечивает функционально полную систему команд, в символьном виде представляемую высокоуровневым языком ассемблера. Таким образом, MI предоставляет лежащему выше программному обеспечению интерфейс некоторой виртуальной машины. И приложения, и сама ОС OS/400 разрабатываются на уровне MI (или выше), не имея доступа к интерфейсам, лежащим ниже MI, в том числе, и к командам реального процессора. Переносимость программного обеспечения - приложений и ОС - обеспечивается на уровне MI-кодов. MI-код не является непосредственно исполняемым, он должен быть переведен в команды реального процессора. Однако, процесс трансляции расположен ниже уровня MI, он совершенно прозрачен для приложений и для ОС. Среди команд MI имеются как команды, близкие к обычным машинным командам, оперирующие байтами, словами, числами и т.п., так и команды, оперирующие с интегрированными структурами данных - объектами, обрабатываемыми микроядром. Впрочем, "обычные" команды MI также можно назвать объектно-ориентированными: команды содержат не собственно данные, а ссылки на объекты, содержащие наряду с самими данными и описания их типа, размера и т. п.

AS/400 отличается значительной степенью системной интеграции и высоким уровнем системных интерфейсов. Ряд системных функций в AS/400 выполняются SLIC (лежат ниже уровня MI), ряд - OS/400, выполнение же большинства функций распределено между ОС и микроядром.







Сейчас читают про: