МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОНИКИ И МАТЕМАТИКИ
Кафедра Информационно-коммуникационных технологий
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к дипломному проекту (работе)
На тему _Механизмы обеспечения качества обслуживания в корпоративных сетях__
Студент _Суханов.Ю.В______________________________________________________
Руководитель проекта Леохин Ю.Л.
Допущен к защите
Консультанты проекта: Леохин Ю.Л.
Специальная часть
Конструкторско-технологическая часть
Экономическая часть
Техника безопасности
Зав. Кафедрой Азаров В.Н.
МОСКВА 2009 г.
Аннотация
В данном отчете содержатся обоснование выбранной темы для дипломного проектирования с анализом возможных методов решения постановленной задачи. Анализ возможных методов проводится на основе литературных источников и нормативно-техничиских документов, относящихся к теме дипломной работы (проекта). В отчете включены материалы по охране труда и техники безопасности
-
Введение.
-
Актуальность.
Преимущества компьютеризации неоспоримы. Но наряду с теми преимуществами, которые дает использование высоких технологий в организациях и на производстве, у сотрудников компаний, задействованных в управлении этими ресурсами и их обслуживании, возникают дополнительные проблемы. "Жертвами" прогресса становятся исполнительные и финансовые директора компаний, руководители структурных ИТ-подразделений, бухгалтерия, и, конечно же, системные администраторы. Во многих компаниях начал действовать закон перехода количества в качество: количество приобретенной техники требует качественного управления ею.
Задачи, которые приходится в связи с этим решать, достаточно разнообразны. Это и рациональное планирование финансирования, и приобретение оптимальной по своим характеристикам вычислительной техники, в том числе запасных комплектующих, и организация инвентарного учета поступающего оборудования (закрепление его за материально ответственными лицами), и ведение контроля над перемещением оборудования между структурными подразделениями организации. Кроме того, необходимо своевременно получать информацию о возникающих неисправностях, регистрировать комплектующие, хранящиеся на складе и расходуемые при ремонте техники, вовремя фиксировать изменения в конфигурации оборудования, произошедшие в результате модернизации
-
Практическая значимость.
Практическая значимость данной работы заключается в автоматизированном учете комплектующих на предприятии.
Предусмотрена возможность объединения комплектующих в конфигурации для более удобного управления. Предусмотрена возможность многопользовательской работы.
-
Специальная часть
-
Анализ имеющегося программного обеспечения в данной области
-
Программа учета оргтехники АС Корус 1.04
Программа обладает следующими функциями:
-
учет закупки техники;
-
постановка ее на учет и списание (с формированием соответствующих актов);
-
учет перемещения техники по подразделениям организации;
-
учет производимых ремонтов, замены частей и производимой профилактики учитываемого оборудования;
-
учет закупки программного обеспечения и установки его на компьютеры;
-
учет картриджей и их заправок;
-
учет смены картриджей на принтерах, ксероксах и другом печатающем оборудовании;
-
учет закупки и выдачи расходных материалов в подразделения организации;
-
учет распределения оргтехники по hub’ам и switch'ам;
-
получение всевозможных отчетов, по любой хранимой информации в программе.
АС состоит из ряда программ:
-
учета оргтехники, расходных материалов, сетевого оборудования;
-
автоматизации процесса плановой инвентаризации;
-
печати отчетных документов (актов ввода, списания, технического состояния и пр.);
-
администрирования системы.
Целевые пользователи системы:
-
сотрудники отделов ИТ;
-
бухгалтеры организации;
-
системные администраторы;
-
руководящий состав организации;
-
сотрудники службы учета и ремонта оргтехники.
Работа в сети:
-
многопользовательская работа с разграничением прав доступа;
-
возможность учета средств, находящихся в разных филиалах одной организации или в разных организациях. Получение как совместных, так и раздельных отчетов.
Вывод
Так как общедоступных программ найти не удалось, делаем вывод что наша программа должна обладать следующими функциями:
-
учет перемещения техники по подразделениям организации;
-
учет производимых ремонтов, замены частей и производимой профилактики учитываемого оборудования;
-
получение всевозможных отчетов, по любой хранимой информации в программе.
-
Возможность гибко изменять схему данных программы
-
многопользовательская работа с разграничением прав доступа;
-
Анализ и выбор СУБД
-
MySQL
MySQL – Свободная система управления базами данных
MySQL является решением для малых и средних приложений. Входит в LAMP. Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы.
Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типа MyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей. Более того, СУБД MySQL поставляется со специальным типом таблиц EXAMPLE, демонстрирующим принципы создания новых типов таблиц. Благодаря открытой архитектуре и GPL-лицензированию, в СУБД MySQL постоянно появляются новые типы таблиц.
ез
MySQL имеет API для языков Delphi, С, С++, Lisp, Perl, PHP, Python, Ruby, SmallTalk, Tcl
3.2.1.2 Возможности версии MySQL 4.0
-
Практически полная реализация ANSI SQL-99, плюс расширения;
-
Межплатформенная совместимость;
-
Независимые типы таблиц (MyISQM для быстрого чтения, InnoDB для транзакций и ссылочной целостности);
-
Транзакции;
-
Поддержка SSL;
-
Кэширование запросов;
-
Репликация: один головной сервер на одного подчинённого, много подчинённых на одного головного;
-
Полнотекстовая индексация и поиск с использованием типа таблиц MyISAM;
-
Внедрённая библиотека базы данных;
-
Поддержка Юникода (UTF-8);
-
Таблицы InnoDB обеспечивают соответствие требованиям ACID;
-
Встроенный сервер, позволяющий включать MySQL в автономные приложения.
3.2.1.3 Возможности версии MySQL 4.1
-
Вложенные запросы и производные таблицы;
-
Новая система кодировок и сортировок;
-
Более быстрый и гибкий протокол клиент-сервер с поддержкой подготовленных запросов, обеспечивающий их оптимальное исполнение;
-
Новая программа установки и настройки для Microsoft Windows и GNU/Linux;
-
Защищённые через OpenSSL соединения клиент-сервер;
-
Высоко-оптимизированная библиотека, которая может быть использована в сторонних программах;
-
Полноценная поддержка Юникода (UTF-8 и UCS2);
-
Стандартные пространственные типы данных GIS, для хранения географической информации;
-
Улучшенный полнотекстовый поиск и система помощи.
3.2.1.4 Возможности версии MySQL 5.0
-
хранимые процедуры и функции;
-
обработчики ошибок;
-
курсоры;
-
триггеры;
-
представления;
-
информационная схема (так называемый системный словарь, содержащий метаданные).
3.2.1.5 Версия MySQL 5.1 продолжает путь к стандарту SQL:2003.
-
сегментирование — возможность разбить одну большую таблицу на несколько частей, размещенных в разных файловых системах, основываясь на определенной пользователем функции. При определенных условиях это может дать серьезное увеличение производительности и, кроме того, облегчает масштабирование таблиц.
-
изменено поведение ряда операторов, для обеспечения большей совместимости со стандартом SQL2003;
-
построчная репликация (row-based репликация), при которой в бинарный лог будет записываться только информация о реально измененных строках таблицы вместо оригинального (и, возможно, медленного) текста запроса. Построчную репликацию можно использовать только для определенных типов sql-запросов, в терминах MySQL - смешанная (mixed) репликация;
-
встроенный планировщик периодически запускаемых работ. По синтаксису добавление задачи похоже на добавление триггера к таблице, по идеологии - на crontab;
-
дополнительный набор функций для обработки XML, реализация поддержки XPath;
-
новые средства диагностики проблем и утилиты для анализа производительности. Расширены возможности по управлению содержимым лог-файлов, логи теперь могут быть сохранены и в таблицах general_log и slow_log. Утилита mysqlslap позволяет провести нагрузочное тестирование БД с записью времени реакции на каждый запрос;
-
для упрощения операции обновления подготовлена утилита mysql_upgrade, которая выполнит проверку всех существующих таблиц на предмет совместимости с новой версией, и при необходимости выполнит надлежащие корректировки;
-
MySQL Cluster отныне выпущен как отдельный продукт, базирующийся на MySQL 5.1 и хранилище NDBCLUSTER;
-
значительные изменения в работе MySQL Cluster, такие, как, например, возможность хранения табличных данных на диске;
-
возврат к использованию встроенной библиотеки libmysqld, отсутствовавшей в MySQL 5.0;
-
API для плагинов, которое позволяет загружать сторонние модули, расширяющие функциональность (например, полнотекстовый поиск), без перезапуска сервера.
-
реализация парсера полнотекстового поиска в виде plug-in;
-
новый тип таблиц Maria (устойчивый к сбоям клон MyISAM);
3.2.1.6 Приимущества MySQL
-
Многопоточность. Поддержка нескольких одновременных запросов.
-
Оптимизация связей с присоединением многих данных за один проход.
-
Записи фиксированной и переменной длины.
-
ODBC драйвер в комплекте с исходником
-
Гибкая система привилегий и паролей.
-
До 16 ключей в таблице. Каждый ключ может иметь до 15 полей.
-
Поддержка ключевых полей и специальных полей в операторе CREATE.
-
Поддержка чисел длинной от 1 до 4 байт (ints, float, double, fixed), строк переменной длины и меток времени.
-
Интерфейс с языками C и perl.
-
Основанная на потоках, быстрая система памяти.
-
Утилита проверки и ремонта таблицы ( isamchk).
-
Все данные хранятся в формате ISO8859_1.
-
Все операции работы со строками не обращают внимания на регистр символов в обрабатываемых строках.
-
Псевдонимы применимы как к таблицам, так и к отдельным колонкам в таблице.
-
Все поля имеют значение по умолчанию. INSERT можно использовать на любом подмножестве полей.
-
Легкость управления таблицей, включая добавление и удаление ключей и полей.
3.2.1.7 Тип таблиц Maria
Maria, - новый
MySQL тип таблиц для хранения данных. Maria представляет собой расширенную версию хранилища MyISAM, с добавлением средств сохранения целостности данных после краха.
Основные достоинства Maria
-
В случае краха производится откат результатов выполнения текущей операции или возврат в состояние до команды LOCK TABLES. Реализация через ведение лога операций;
-
Возможность восстановления состояния из любой точки в логе операций, включая поддержку CREATE/DROP/RENAME/TRUNCATE. Может быть использовано для создания инкрементальных бэкапов, через периодическое копирование лог файла.
-
Поддержка всех форматов столбцов MyISAM, расширена новым форматом "rows-in-block", использующим страничный способ хранения данных, при котором данные в столбцах могут кэшироваться;
-
В будущем будет реализовано два режима: транзакционный и без отражения в логе транзакций, для не критичных данных.
-
Размер страницы данных равен 8Кб (в MyISAM 1Кб), что позволяет достичь более высокой производительности для индексов по полям фиксированного размера, но медленнее в случае индексирования ключей переменной длинны.
3.2.2 PostgreSQL
PostgreSQL - свободнаяобъектно-реляционная система управления базами данных (СУБД)
3.2.2.1 Функции
Функции являются блоками кода, исполняемыми на сервере, а не на клиенте БД. Хотя они могут писаться на чистом SQL, реализация дополнительной логики, например, условных переходов и циклов, выходит за рамки собственно SQL и требует использования некоторых языковых расширений. Функции могут писаться с использованием одного из следующих языков:
-
Встроенный процедурный язык PL/pgSQL, во многом аналогичный языку PL/SQL, используемому в СУБД Oracle;
-
Скриптовые языки — PL/Lua, PL/LOLCODE, PL/Perl, plPHP, PL/Python, PL/Ruby, PL/sh, PL/Tcl и PL/Scheme;
-
Классические языки — C, C++, Java (через модуль PL/Java);
-
Статистический язык R (через модуль PL/R).
PostgreSQL допускает использование функций, возвращающих набор записей, который далее можно использовать так же, как и результат выполнения обычного запроса.
Функции могут выполняться как с правами их создателя, так и с правами текущего пользователя.
Иногда функции отождествляются с хранимыми процедурами, однако между этими понятиями есть различие.
-
Триггеры
-
Триггеры определяются как функции, инициируемые DML—операциями. Например, операция INSERT может запускать триггер, проверяющий добавленную запись на соответствия определённым условиям. При написании функций для триггеров могут использоваться различные языки программирования (см. выше).
-
Триггеры ассоциируются с таблицами. Множественные триггеры выполняются в алфавитном порядке.
-
Правила и представления
Механизм правил (англ. rules) представляет собой механизм создания пользовательских обработчиков не только DML-операций, но и операции выборки. Основное отличие от механизма триггеров заключается в том, что правила срабатывают на этапе разбора запроса, до выбора оптимального плана выполнения и самого процесса выполнения. Правила позволяют переопределять поведение системы при выполнении SQL-операции к таблице. Хорошим примером является реализация механизма представлений (англ. views): при создании представления создается правило, которое определяет, что вместо выполнения операции выборки к представлению система должна выполнять операцию выборки к базовой таблице/таблицам с учетом условий выборки, лежащих в основе определения представления. Для создания представлений, поддерживающих операции обновления, правила для операций вставки, изменения и удаления строк должны быть определены пользователем.
-
Индексы
В PostgreSQL имеется поддержка индексов следующих типов: B-дерево, хэш, R-дерево, GiST, GIN. При необходимости можно создавать новые типы индексов, хотя это далеко не тривиальный процесс. Индексы в PostgreSQL обладают следующими свойствами:
-
возможен просмотр индекса не только в прямом, но и в обратном порядке — создание отдельного индекса для работы конструкцииORDER BY ... DESC не нужно;
-
возможно создание индекса над несколькими столбцами таблицы, в том числе над столбцами различных типов данных;
-
индексы могут быть функциональными, то есть строиться не на базе набора значений некоего столбца/столбцов, а на базе набора значений функции от набора значений;
-
индексы могут быть частичными, то есть строиться только по части таблицы (по некоторой её проекции); в некоторых случаях это помогает создавать намного более компактные индексы или достигать улучшения производительности за счет использования разных типов индексов для разных (например, с точки зрения частоты обновления) частей таблицы;
-
планировщик запросов может использовать несколько индексов одновременно для выполнения сложных запросов.
-
Многоверсионность
PostgreSQL поддерживает одновременную модификацию БД несколькими пользователями с помощью механизма Multiversion Concurrency Control (MVCC). Благодаря этому практически отпадает нужда в блокировках чтения и принцип ACID соблюдается очень эффективным способом.
-
Типы данных
PostgreSQL поддерживает большой набор встроенных типов данных:
-
Численные типы
-
Целые
-
С фиксированной точкой
-
С плавающей точкой
-
Денежный тип (отличается специальным форматом вывода, а в остальном аналогичен числам с фиксированной точкой с двумя знаками после запятой)
-
Символьные типы произвольной длины
-
Двоичные типы (включая BLOB)
-
Типы «дата/время» (полностью поддерживающие различные форматы, точность, форматы вывода, включая последние изменения в часовых поясах)
-
Булев тип
-
Перечисление
-
Геометрические примитивы
-
Сетевые типы
-
IP и IPv6—адреса
-
CIDR—формат
-
МАС—адрес
-
UUID—идентификатор
-
XML—данные
-
Массивы
-
OID—типы
-
Псевдотипы
Более того, пользователь может самостоятельно создавать новые требуемые ему типы и программировать для них механизмы индексирования с помощью GiST.
-
Пользовательские объекты
PostgreSQL может быть расширен пользователем для собственных нужд практически в любом аспекте. Есть возможность добавлять собственные:
-
Преобразования типов
-
Типы данных
-
Домены (пользовательские типы с изначально наложенными ограничениями)
-
Функции (включая агрегатные)
-
Индексы
-
Операторы (включая переопределение уже существующих)
-
Процедурные языки
3.2.2.8 Надежность
Согласно результатам автоматизированного исследования различного ПО на предмет ошибок, в исходном коде PostgreSQL было найдено 20 проблемных мест на 775 000 строк исходного кода (в среднем, одна ошибка на 39 000 строк кода). Для сравнения: MySQL— 97 проблем, одна ошибка на 4 000 строк кода; FreeBSD (целиком) — 306 проблем, одна ошибка на 4 000 строк кода; Linux (только ядро) — 950 проблем, одна ошибка на 10 000 строк кода.
Вывод
После проведенного анализа выбрана база данных MySQL 5.1, поскольку она обладает следующими уникальными свойствами
-
сегментирование
-
встроенный планировщик периодически запускаемых работ
-
новые средства диагностики проблем и утилиты для анализа производительности
3.3 Выбор языка программирования высокого уровня
3.3.1. Язык программирования высокого уровня Си
Язык программирования Си отличается максимализмом функций. Авторы языка хотели, чтобы программы на нём легко компилировались с помощью однопроходного компилятора, после компиляции каждой элементарной составляющей программы соответствовало весьма небольшое число машинных команд, а использование базовых элементов языка не задействовало библиотекувремени выполнения. Однопроходный компилятор компилирует программу, не возвращаясь назад, к уже откомпилированному тексту. Поэтому использованию функции должно предшествовать её объявление. Код на Си можно легко писать на низком уровне абстракции, почти как на ассемблере. Иногда Си называют «универсальным ассемблером» или «ассемблером высокого уровня», что отражает различие языков ассемблера для разных платформ и единство стандарта Си, код которого может быть скомпилирован без изменений практически на любой модели компьютера. Си часто называют языком среднего уровня или даже низкого уровня, учитывая то, как близко он работает к реальным устройствам.
Компиляторы Си разрабатываются сравнительно легко благодаря относительно низкому уровню языка и скромному набору элементов. Поэтому данный язык доступен на самых различных платформах (возможно, круг этих платформ шире, чем у любого другого существующего языка). К тому же, несмотря на свою низкоуровневую природу, язык позволяет создавать переносимые программы и поддерживает программиста в этом. Программы, соответствующие стандарту языка, могут компилироваться на самых различных компьютерах.
Си (как и ОС UNIX, с которой он долгое время был связан) создавался программистами и для программистов, круг которых был бы ненамного шире круга разработчиков языка. Несмотря на это, область использования языка значительно шире задач системного программирования.
Си создавался с одной важной целью: сделать более простым написание больших программ с минимумом ошибок по правилампроцедурного программирования, не добавляя лишних накладных расходов на итоговый код программы компилятором, как это всегда делают языки очень высокого уровня, такие как Бейсик. С этой стороны Си имеет следующие важные особенности:
-
простую языковую базу, из которой вынесены в библиотеки многие существенные возможности, вроде математических функций или функций управления файлами;
-
ориентацию на процедурное программирование, обеспечивающую удобство применения структурного стиля программирования;
-
систему типов, предохраняющую от бессмысленных операций;
-
использование препроцессора для, например, определения макросов и включения файлов с исходным кодом;
-
непосредственный доступ к памяти компьютера через использование указателей;
-
минимальное число ключевых слов;
-
передачу параметров в функцию по значению, а не по ссылке (при этом передача по ссылке выполняется с помощью указателей);
-
указатели на функции и статические переменные
-
области действия имён;
-
записи — определяемые пользователем собирательные типы данных (структуры), которыми можно манипулировать как одним целым;
Вот некоторые особенности других языков программирования, которых
не имеет Си:
-
автоматическое управление памятью;
-
поддержка объектно-ориентированного программирования (при этом первые версии C++ генерировали код программы на языке Си);
-
замыкание;
-
вложенные функции (существуют компиляторы языка Си реализующие эту функцию, например компилятор GNU);
-
полиморфизм функций и операторов;
-
встроенная поддержка многозадачности и сети
-
функции высшего порядка
-
карринг.
Несмотря на то, что в Си нет столь многого, а это было важно в начале, язык был хорошо принят, потому что он позволял быстро создавать компиляторы для новых платформ, а также позволял программистам довольно точно представлять, как выполняются их программы. Благодаря этому программы, написанные на Си, эффективнее написанных на многих других языках. Как правило, лишь оптимизированный вручную код на ассемблере может работать ещё быстрее, потому что он даёт полный контроль над машиной, однако развитие современных компиляторов вместе с усложнением современных процессоров быстро сократило этот разрыв.
Одним из последствий высокой эффективности и переносимости Си стало то, что многие компиляторы, интерпретаторы и библиотеки других языков высокого уровня часто выполнены на языке Си.
3.3.1.1 Типы
Си имеет ту же систему типов, что и другие потомки Алгола, такие как Паскаль. Существуют типы для целых чисел различных размеров, имеющих знак и не имеющих его, чисел с плавающей запятой, символов, перечисляемых типов (enum) и записей (struct). Кроме того, язык Си имеет тип объединения (union), позволяющий программисту создавать структуры, способные хранить данные разных типов, но только одного типа единовременно.
Хранение данных
Одной из самых важных функций любого языка программирования является предоставление возможностей для управления памятью и объектами, хранящимися в ней.
В Си есть три разных способа выделения памяти для объектов:
-
Статическое выделение памяти: пространство для объектов создаётся в области хранения данных кода программы в момент компиляции; время жизни таких объектов совпадает со временем жизни этого кода.
-
Автоматическое выделение памяти: объекты можно временно хранить в стеке; эта память затем автоматически освобождается и может быть использована снова, после того, как программа выходит из блока, использующего её.
-
Динамическое выделение памяти: блоки памяти нужного размера могут запрашиваться во время выполнения программы с помощью библиотечных функций malloc, realloc и free из области памяти, называемой кучей. Эти блоки освобождаются и могут быть использованы снова после вызова для них функции free.
Все три этих способа хранения данных пригодны в различных ситуациях и имеют свои преимущества и недостатки. Например, статическое выделение памяти не имеет накладных расходов по выделению, автоматическое выделение — лишь малые расходы при выделении, а вот динамическое выделение потенциально требует больших расходов и на выделение, и на освобождение памяти. С другой стороны, память стека гораздо больше ограничена, чем статическая, или память в куче. Только динамическая память может использоваться в случаях, когда размер используемых объектов заранее неизвестен. Большинство программ на Си интенсивно используют все три этих способа.
Там, где это возможно, предпочтительным является автоматическое или статическое выделение памяти, потому что такой способ хранения объектов управляется компилятором, что освобождает программиста от трудностей ручного выделения и освобождения памяти, как правило, служащего источником трудно отыскиваемых ошибок в программе. К сожалению, многие структуры данных имеют переменный размер во время выполнения программы, поэтому из-за того, что автоматически и статически выделенные области должны иметь известный фиксированный размер во время компиляции, очень часто требуется использовать динамическое выделение. Массивы переменного размера — самый распространённый пример такого использования памяти.
3.3.1.2 Проблемы
Многие элементы Си потенциально опасны, а последствия неправильного использования этих элементов зачастую непредсказуемы.Керниган говорит: «Си — инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво». В связи со сравнительно низким уровнем языка многие случаи неправильного использования опасных элементов не обнаруживаются и не могут быть обнаружены ни при компиляции, ни во время исполнения. Это часто приводит к непредсказуемому поведению программы. Иногда в результате неграмотного использования элементов языка появляются уязвимости в системе безопасности. Необходимо заметить, что использования многих таких элементов можно избежать.
Чаще всего источником ошибки является обращение к несуществующему элементу массива. Несмотря на то, что Си непосредственно поддерживает статические массивы, он не имеет средств проверки индексов массивов (проверки границ). Например, возможна запись в шестой элемент массива из пяти элементов, что, естественно, приведёт к непредсказуемым результатам. Частный случай такой ошибки называется ошибкой переполнения буфера. Ошибки такого рода приводят к большинству проблем с безопасностью.
Другим потенциальным источником опасных ситуаций служит механизм указателей. Указатель может указывать на абсолютно любой объект в памяти, включая даже и сам машинный код программы, что может приводить к непредсказуемым эффектам. Несмотря на то, что большинство указателей, как правило, указывают на безопасные места, они легко могут быть передвинуты в уже небезопасные области памяти с помощью арифметики указателей; память, на которую они указывают, может быть освобождена и использована по-другому («висячие указатели»); они могут быть не инициализированы («дикие указатели»); или же они просто могут получить любое значение путём приведения типов или присваивания значения другого повреждённого указателя. Другие языки пытаются решить эти проблемы путём использования более ограниченных типов — ссылок.
Одна из таких проблем — то, что автоматически и динамически создаваемые объекты не инициализируются, поэтому в начале они имеют такое значение, какое осталось в памяти, выделенной для них, от ранее удалённых объектов. Такое значение полностью непредсказуемо, оно меняется от одной машины к другой, от запуска к запуску, от вызова функции к вызову. Если программа попытается использовать такое неинициализированное значение, то придёт к непредсказуемому результату. Большинство современных компиляторов пытаются обнаружить эту проблему в некоторых случаях.
Ещё одной распространённой проблемой является то, что память не может быть использована снова, пока она не будет освобождена программистом с помощью функции free(). В результате программист может случайно забыть освобождать эту память, но продолжать её выделять, занимая всё большее и большее пространство. Это обозначается термином утечка памяти. Наоборот, возможно освободить память слишком рано, но продолжать её использовать. Из-за того, что система выделения может использовать освобождённую память по-другому, это ведёт к непредсказуемым последствиям. Эти проблемы решаются в языках со сборкой мусора. С другой стороны, если память выделяется в функции и должна освобождаться после выхода из функции, данная проблема решается с помощью автоматического вызова деструкторов в языке C++, или с помощью локальных массивов, используя расширения С99.
Функции с переменным количеством аргументов также являются потенциальным источником проблем. В отличие от обычных функций, имеющих прототип, стандартом не регламентируется проверка функций с переменным числом аргументов. Если передаётся неправильный тип данных, то возникает непредсказуемый, если не фатальный результат. Например, семейство функций printfстандартной библиотеки языка Си, используемое для генерации форматированного текста для вывода, хорошо известно за его потенциально опасный интерфейс с переменным числом аргументов, которые описываются строкой формата. Проверка типов в функциях с переменным числом аргументов является задачей каждой конкретной реализации такой функции, однако многие современные компиляторы в частности проверяют типы в каждом вызове printf, генерируя предупреждения в случаях, когда список аргументов не соответствует строке формата. Следует заметить, что невозможно статически проконтролировать даже все вызовы функции printf, поскольку строка формата может создаваться в программе динамически, поэтому как правило никаких проверок других функций с переменным числом аргументов компилятором не производится.
Для помощи программистам на Си в решении этих и многих других проблем было создано большое число отдельных от компиляторов инструментов. Такими инструментами являются программы дополнительной проверки исходного кода и поиска распространённых ошибок, а также библиотеки, предоставляющие дополнительные функции, не входящие в стандарт языка, такие как проверка границ массивов или ограниченная форма сборки мусора.
3.3.1.3 Известные компиляторы языка Си
-
Borland C++
-
C++ Builder
-
Digital Mars
-
DJGPP
-
GNU Compiler Collection
-
Intel C++ compiler
-
LCC
-
Microsoft Visual Studio MinGW
-
Open Watcom
-
Sun Studio
-
TinyCC
3.3.1.4 Компиляторы на динамические языки и платформы
Иногда, в целях переноса тех или иных библиотек, функций и инструментов, написанных на Си, в иную среду, требуется компиляция Си-кода на язык более высокого уровня или в код виртуальной машины, предназначенной для такого языка.
Следующие проекты предназначены для этих целей:
-
Clue — компилятор из ANSI Си в Lua, Javascript, Perl, Java, Common Lisp.
-
Alchemy — компилятор из Си/C++ в ActionScript Virtual Machine (AVM2). Позволяет использовать Си-библиотеки в Flash- и Adobe AIR-приложениях.
-
AMPC — компилятор из Си в виртуальную машину Java
3.3.2 Язык программирования высокого уровня С++
Си++ — компилируемый строго типизированный язык рограммированияобщего назначения. Поддерживает разные парадигмы программирования: процедурную,обобщённую, функциональную; наибольшее внимание уделено поддержке объектно-ориентированного программирования.
Название «Си++» происходит от Си, в котором унарный оператор ++ обозначает инкрементпеременной.
В 1990-х годах язык стал одним из наиболее широко применяемых языков программирования общего назначения.
При создании Си++ стремились сохранить совместимость с языком Си. Большинство программ на Си будут исправно работать и с компилятором Си++. Си++ имеет синтаксис, основанный на синтаксисе Си.
3.3.2.1 Новые возможности по сравнению с Си
Нововведениями Си++ в сравнении с Си являются:
-
поддержка объектно-ориентированного программирования;
-
поддержка обобщённого программирования через шаблоны;
-
дополнительные типы данных;
-
исключения;
-
пространства имён;
-
встраиваемые функции;
-
перегрузка операторов;
-
перегрузка имён функций;
-
ссылки и операторы управления свободно распределяемой памятью;
-
дополнения к стандартной библиотеке.
Язык Си++ во многом является надмножеством Си. Новые возможности Си++ включают объявления в виде выражений, преобразования типов в виде функций, операторы new и delete, тип bool, ссылки, расширенное понятие константности, подставляемые функции, аргументы по умолчанию, переопределения, пространства имён, классы (включая и все связанные с классами возможности, такие как наследование, функции-члены, виртуальные функции, абстрактные классы и конструкторы), переопределения операторов, шаблоны, оператор ::, обработку исключений, динамическую идентификацию и многое другое. Язык Си++ также во многих случаях строже относится к проверке типов, чем Си.
В Си++ появились комментарии в виде двойной косой черты («//»), которые были в предшественнике Си — языке BCPL.
Некоторые особенности Си++ позднее были перенесены в Си, например ключевые слова const и inline, объявления в циклах for и комментарии в стиле Си++ («//»). В более поздних реализациях Си также были представлены возможности, которых нет в Си++, например макросы vararg и улучшенная работа с массивами-параметрами.
3.3.2.2 Стандартная библиотека
Стандартная библиотека Си++ включает стандартную библиотеку Си с небольшими изменениями, которые делают её более подходящей для языка Си++. Другая большая часть библиотеки Си++ основана на Стандартной Библиотеке Шаблонов (STL). Она предоставляет такие важные инструменты, как контейнеры (например, векторы и списки) и итераторы (обобщённые указатели), предоставляющие доступ к этим контейнерам как к массивам. Кроме того, STL позволяет сходным образом работать и с другими типами контейнеров, например, ассоциативными списками, стеками, очередями.
Используя шаблоны, можно писать обобщённые алгоритмы, способные работать с любыми контейнерами или последовательностями, определяемыми итераторами.
Так же, как и в Си, возможности библиотек активизируются использованием директивы #include для включения стандартных файлов. Всего в стандарте Си++ определено 50 таких файлов.
STL до включения в стандарт Си++ была сторонней разработкой, в начале — фирмы HP, а затем SGI. Стандарт языка не называет её «STL», так как эта библиотека стала неотъемлемой частью языка, однако многие люди до сих пор используют это название, чтобы отличать её от остальной части стандартной библиотеки (потоки ввода/вывода (iostream), подраздел Си и др.).
Проект под названием STLport, основанный на SGI STL, осуществляет постоянное обновление STL, IOstream и строковых классов. Некоторые другие проекты также занимаются разработкой частных применений стандартной библиотеки для различных конструкторских задач. Каждый производитель компиляторов Си++ обязательно поставляет какую-либо реализацию этой библиотеки, так как она является очень важной частью стандарта и широко используется.
3.3.2.3 Достоинства и недостатки языка
Прежде всего, необходимо подчеркнуть, что оценивать достоинства и, в особенности, недостатки С++ необходимо в контексте тех принципов, на которых строился язык, и требований, которые к нему изначально предъявлялись.
Достоинства
C++ — чрезвычайно мощный язык, содержащий средства создания эффективных программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов самого различного назначения. В частности:
-
Поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, ООП,
-
Имеется возможность работы на низком уровне с памятью, адресами, портами.
-
Возможность создания обобщённых алгоритмов для разных типов данных, их специализация и вычисления на этапе компиляции, используя шаблоны.
-
Кроссплатформенность. Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем.
-
Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования — при необходимости язык позволяет обеспечить максимальную эффективность программы.
Недостатки
Отчасти недостатки C++ унаследованы от языка-предка — Си, — и вызваны изначально заданным требованием возможно большей совместимости с Си. Это такие недостатки, как:
-
Синтаксис, провоцирующий ошибки:
-
Операция присваивания обозначается как = , а операция сравнения как ==. Их легко спутать, при этом операция присваивания возвращает значение, поэтому присваивание на месте выражения является синтаксически корректным, а в конструкциях цикла и ветвления появление числа на месте логического значения также допустимо, так что ошибочная конструкция оказывается синтаксически правильной. Типичный пример подобной ошибки:
Здесь в условном операторе по ошибке написано присваивание вместо сравнения. В результате вместо того, чтобы сравнить текущее значение x с нулём, программа присвоит x нулевое значение, а потом интерпретирует его как значение условия в операторе if. Так как нуль соответствует логическому значению «ложь» (false), блок операторов в условной конструкции не выполнится никогда. Ошибки такого рода трудно выявлять, впрочем, в последнее время компиляторы выдают предупреждение, когда обнаруживают потенциально ошибочный код.
-
Операции присваивания (=), инкрементации (++), декрементации (--) и другие возвращают значение. В сочетании с обилием операций это позволяет, хотя и не обязывает, программиста создавать трудночитаемые выражения. Наличие этих операций в Си было вызвано желанием получить инструмент ручной оптимизации кода, но в настоящее время оптимизирующие компиляторы обычно генерируют оптимальный код и на традиционных выражениях. С другой стороны, один из основных принципов языков C и C++ — позволять программисту писать в любом стиле, а не навязывать «хороший» стиль.
-
Макросы (#define) являются мощным, но опасным средством. Они сохранены в C++ несмотря на то, что необходимость в них, благодаря шаблонам и встроенным функциям, не так уж велика. В унаследованных стандартных С-библиотеках много потенциально опасных макросов.
-
Некоторые преобразования типов неинтуитивны. В частности, операция над беззнаковым и знаковым числами выдаёт беззнаковый результат.
-
Необходимость записывать break в каждой ветви оператора switch и возможность последовательного выполнения нескольких ветвей при его отсутствии провоцирует ошибки из-за пропуска break. Эта же особенность позволяет делать сомнительные «трюки», базирующиеся на избирательном неприменении break и затрудняющие понимание кода.
-
Препроцессор, унаследованный от С, очень примитивен. Это приводит с одной стороны к тому, что с его помощью нельзя (или тяжело) осуществлять некоторые задачи метапрограммирования, а с другой, вследствие своей примитивности, он часто приводит к ошибкам и требует много действий по обходу потенциальных проблем. Некоторые языки программирования (например, Scheme иNemerle) имеют намного более мощные и более безопасные системы метапрограммирования (также называемые макросами, но мало напоминающие макросы С/С++).
-
Плохая поддержка модульности (по сути, в классическом Си модульность на уровне языка отсутствует, её обеспечение переложено на компоновщик). Подключение интерфейса внешнего модуля через препроцессорную вставку заголовочного файла (#include) серьёзно замедляет компиляцию при подключении большого количества модулей (потому что результирующий файл, который обрабатывается компилятором, оказывается очень велик). Эта схема без изменений скопирована в C++. Для устранения этого недостатка, многие компиляторы реализуют механизм прекомпиляции заголовочных файлов Precompiled Headers.
К собственным недостаткам C++ можно отнести:
-
Сложность и избыточность, из-за которых C++ трудно изучать, а построение компилятора сопряжено с большим количеством проблем. В частности:
-
В языке практически полностью сохранён набор конструкций Си, к которому добавлены новые средства. Во многих случаях новые средства и механизмы позволяют делать то же самое, что и старые, но в языке сохраняются оба варианта.
-
Поддержка множественного наследования реализации в ООП-подсистеме языка вызывает целый ряд логических проблем, а также создаёт дополнительные трудности в реализации компилятора.
-
Шаблоны в своём исходном виде приводят к порождению кода очень большого объёма, а введённая позже в язык возможность частичной спецификации шаблонов трудно реализуема и не поддерживается многими существующими компиляторами.
-
Недостаток информации о типах данных во время компиляции (CTTI).
-
Метапрограммирование на основе шаблонов C++ сложно и при этом ограничено в возможностях. Оно состоит в реализации средствами шаблонов C++ интерпретатора примитивного функционального языка программирования выполняющегося во время компиляции. Сама по себе данная возможность весьма привлекательна, но такой код весьма трудно воспринимать и отлаживать. Языки Lisp/Scheme, Nemerle и некоторые другие имеют более мощные и одновременно более простые для восприятия подсистемы метапрограммирования. Кроме того, в языке D реализована сравнимая по мощности, но значительно более простая в применении подсистема шаблонного метапрограммирования.
-
Хотя декларируется, что С++ мультипарадигменный язык, реально в языке отсутствует поддержка функционального программирования. Отчасти, данный пробел устраняется различными библиотеками (Loki, Boost) использующими средства метапрограммирования для расширения языка функциональными конструкциями (например, поддержкой лямбд/анонимных методов), но качество подобных решений значительно уступает качеству встроенных в функциональные языки решений. Такие возможности функциональных языков, как сопоставление с образцом, вообще крайне сложно эмулировать средствами метапрограммирования.
-
Некоторые считают недостатком языка C++ отсутствие встроенной системы сборки мусора. С другой стороны, в C++ имеется достаточно средств, позволяющих почти исключить использование опасных указателей, нет принципиальных проблем и в реализации и использовании сборки мусора (на уровне библиотек, а не языка). Отсутствие встроенной сборки мусора позволяет пользователю самому выбрать стратегию управления ресурсами.
3.2.4 Язык программирования высокого уровня LISP
LISP— семейство языков программирования, программы и данные в которых представляются системами линейных списков символов. Лисп является вторым в истории (после Фортрана) высокоуровневым языком программирования, который используется по сей день. Слово «lisp» имеет также значение «детский лепет», что не случайно, так как тематика, которая интересовала создателя Лиспа Джона Маккарти была тесным образом связана с исследованиями человеческой речи[источник?]: Маккарти занимался исследованиями в области искусственного интеллекта и созданный им язык по сию пору является одним из основных средств моделирования различных аспектов ИИ.
Традиционный Лисп имеет динамическую систему типов. Язык является функциональным, но многие поздние версии обладают также чертами императивности, к тому же, имея полноценные средства символьной обработки становится возможным реализовать объектно-ориентированность, примером такой реализации является платформа CLOS.
Язык Лисп, наряду с языком Ada, прошел процесс фундаментальной стандартизации для использования в военном деле и промышленности, в результате чего появился стандарт Common Lisp. Его реализации существуют для большинства платформ. С полным списком реализаций можно ознакомиться здесь: Common Lisp Implementation.
Одной из базовых идей языка Lisp является представление каждого символа как узла многокоординатной символьной сети; при этом координаты, свойства, уровни сети записаны в так называемых слотах символа. Основные слоты:
-
имя символа (основополагающее Аристотелево А=А из которого вырастает (-ли?) лямбда-исчисление),
-
функциональный слот,
-
слот-значение
-
расширяемый список свойств (можно свободно расширить слотовую систему удобным для решения задачи способом).
3.2.4.1 Синтаксис
Основной механизм Лиспа — инкапсулированная в список определяющая голова списка и подключённый к ней хвост списка, который рекурсивно также может быть списком. Лисп-машина способна воспринимать каждый поступающий на неё список на самом абстрактном уровне, например как мета-Лисп-машину, модифицирующую воспринимающую машину. В такой динамичной, высокоабстрактной среде можно реализовать как строго-научные системы, так и неисчислимое множество программистских трюков и генераторов всевозможных машин.
Любая программа на Лиспе состоит из последовательности выражений (форм). Результат работы программы состоит в вычислении этих выражений. Все выражения записываются в виде списков — одной из основных структур Лиспа, поэтому они могут легко быть созданы посредством самого языка. Это позволяет создавать программы, изменяющие другие программы или макросы, позволяющие существенно расширить возможности языка.
Внешне исходный код программы на Лиспе отличается обилием круглых скобок; редактирование программ значительно упрощается использованием текстового редактора, поддерживающего автоматическое выравнивание кода, подсветку соответствующих пар скобок и такие специальные команды, как «перейти через список вправо» и т. д.
Под словами "Лисп-редактор" скрывается технология Emacs текстовых процессоров / лексических анализаторов и много других фундаментальных технологических идей, вошедших в операционную среду Линукс (Особенно Debian). Содержательна также история EMACS: она связана с одним из лидеров свободного программного обеспечения Столлманом.
Список является последовательностью элементов любого рода, в том числе других списков. Например, (1 3/7 'foo #'+) состоит из целого числа, рациональной дроби, символа foo и указателя на функцию сложения. Выражения представляются списками впрефиксной записи: первый элемент должен быть формой, то есть функцией, оператором, макросом или специальным оператором; прочие элементы суть аргументы, передаваемые форме для обработки. Функция list возвращает список состоящий из её аргументов: например, (list 1 3/7 'foo #'+) возвращает список, упомянутый ранее. Если некоторые элементы являются выражениями, то сначала вычисляется их значение: (list 1 2 (list 1 2)) возвращает (1 2 (1 2)). Арифметические операторы действуют так же, например (+ 4 (* 2 3)) выдаёт 10.
Специальные операторы позволяют управлять последовательностью вычислений. С их помощью реализуются ветвления и циклы. Оператор if позволяет вычислить одно из двух выражений в зависимости от выполнения условия, которое тоже является выражением. Если его результат не nil, то вычисляется первый аргумент, иначе вычисляется второй. Например, (if nil (list 1 2 "foo") (list 3 4 "bar")) всегда возвращает (3 4 "bar").
Символьная природа языка (то есть отсутствие в символьном пространстве традиционной метрической геометрии расстояний, последовательностей и т. д) позволяет легко и продуктивно распараллеливать Лисп-процессы. Что нашло использование в сверхмощных телекоммуникационных, сетевых Лисп-системах.
При всей мощности символьного подхода, он не может занять место контининтуальных (нейро) систем (не-машин!) нейрокомпьютеров. Т. н. проблема образования категорий из сенсорных данных.
3.2.4.2 Применение
Первые области применения Лиспа были связаны с символьной обработкой данных и процессами принятия решений (см. проектыFranz).
Наиболее популярный сегодня диалект Коммон Лисп является универсальным языком программирования. Он широко используется в самых разных проектах: Интернет-серверы и службы, серверы приложений и клиенты, взаимодействующие с реляционными и объектными базами данных, научные расчёты и игровые программы.
Одно из направлений использования языка Lisp — его использование в качестве скриптового языка, автоматизирующего работу в ряде прикладных программ.
-
Лисп используется как язык сценариев в САПР AutoCAD (диалект AutoLISP)
-
Лисп является одним из базовых средств текстового редактора Emacs (Диалект EmacsLISP). По сути, большая часть Emacs написана на EmacsLISP, что даёт неограниченные возможности расширения функциональности.
-
В оконном менеджере Sawfish применяется специальный диалект Лиспа Rep, который в значительной степени повторяет диалект Лиспа от Emacs.
-
Диалект Scheme используется в качестве одного из скриптовых языков в графическом процессоре Gimp.
-
Диалект GOAL используется для высокодинамичных трёхмерных игр.
-
Лисп может использоваться для написания скриптов в аудиоредакторе Audacity
Сферы применения Лиспа многообразны: наука и промышленность, образование и медицина, от декодирования генома человека до системы проектирования авиалайнеров.
3.3.2 Язык программирования высокого уровня Python
Python — высокоуровневый язык программирования общего назначения с акцентом на производительность разработчика и читаемость кода. Синтаксис ядра Питона минималистичен. В то же время стандартная библиотека включает большой объём полезных функций.
Python поддерживает несколько парадигм программирования, в том числе структурное,объектно-ориентированное, функциональное, императивное и аспектно-ориентированное. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. Код в Питоне организовывается в функции и классы, которые могут объединяться в модули (которые в свою очередь могут быть объединены в пакеты).
Эталонной реализацией Питона является интерпретатор CPython, поддерживающий большинство активно используемых платформ.[1] Он распространяется свободно под очень либеральной лицензией, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные. Есть реализации интерпретаторов для JVM (с возможностью компиляции), MSIL (с возможностью компиляции), LLVM и других. Проект PyPy предлагает реализацию Питона на самом Питоне, что уменьшает затраты на изменения языка и постановку экспериментов над новыми возможностями.
Python — активно развивающийся язык программирования, новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют ANSI, ISO или другие официальные стандарты, их роль выполняет CPython.
3.3.2.1 Синтаксис и семантика
Язык обладает чётким и последовательным синтаксисом, продуманной модульностью и масштабируемостью, благодаря чему исходный код написанных на Питоне программ легко читаем
3.3.2.2 Недостатки
следующая страница>