Классификация языков программирования

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

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

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

Классификация языков программирования. При разделении программ на системные и прикладные возникло и разделение в языках программирования - одни их них (Basic, Fortran) предназначены для прикладного программирования, другие (Assembler, С, Java) - для системного. В настоящее время используются языки программирования (C++, , Microsoft Visual C++ и др.), предназначенные для создания программ как системного, так и прикладного уровней.

Языки программирования также подразделяются на низкоуровневые и высокоуровневые языки (см. приложение А).

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

Высокоуровневый язык программирования (их часто называют алгоритмическими) - язык программирования, разработанный для быстроты и удобства использования программистом. Слово «высокоуровневый» здесь означает, что язык предназначен для решения абстрактных высокоуровневых задач и оперирует не инструкциями к оборудованию, а логическими понятиями и абстракцией данных. Это позволяет быстрее программировать сложные задачи и обеспечивает относительную независимость от оборудования. Использование разнообразных трансляторов и интерпретаторов обеспечивает связь программ, написанных при помощи языков высокого уровня, с различными операционными системами и оборудованием, в то время как их исходный код остается, в большей части, неизменным. Наиболее распространенными языками подобного типа являются Fortran, Pascal, C++, Visual Basic, Java,Cobol (common business-oriented language), Python, Ruby, Perl, Delphi, PHP и многие другие.

Языки программирования также можно разделить на компилируемые и интерпретируемые,хотя такоеразделение является несколько условным. Так, для любого традиционно компилируемого языка, как, например, Паскаль, можно написать интерпретатор. Кроме того, большинство современных «чистых» интерпретаторов не исполняют конструкции языка непосредственно, а компилируют их в некоторое высокоуровневое промежуточное представление (например, с разыменованием переменных и раскрытием макросов). Для любого интерпретируемого языка можно создать компилятор - например, язык Лисп, изначально интерпретируемый, может компилироваться без каких бы то ни было ограничений.

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

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

Языки программирования, если в качестве признака классификации взять синтаксис образования его конструкций, можно условно разделить на классы:

· машинные языки - языки программирования, воспринимаемые аппаратной частью компьютера (машинные коды);

· машинно-ориентированные языки - языки программирования, которые отражают структуру конкретного типа компьютера (ассемблеры);

· машинно-независимые языки - не зависящие от архитектуры компьютера языки программирования для отражения структуры алгоритма (Паскаль, Бейсик, Фортран и др.);

· языки функционального программирования - языки, в которых основными конструктивными элементами являются функции. Тексты программ на функциональных языках программирования описывают «как решить задачу», но не предписывают последовательность действий для решения. Примеры языков функционального программирования: Лисп, Haskell, Clean, ML и др.;

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

· процедурно-ориентированные языки - языки программирования, в которых имеется возможность описания программы как совокупности процедур. Процедуры, также известны как подпрограммы, методы, или функции (это не математические функции, но функции, подобные тем, которые используются в функциональном программировании). Процедуры просто содержат последовательность шагов для выполнения. В ходе выполнения программы любая процедура может быть вызвана из любой точки, включая данную процедуру. Примеры процедурных языков программирования: Basic, С, Pascal, Visual Basic, С++, и др.

· объектно-ориентированные языки - языки, благоприятствующие объектно-ориентированному (ОО) программированию. Примеры ОО-языков программирования: Ada, С++, Delphi (Object Pascal), С#, Java и др.

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

- создание/модификация свойств/удаление таблиц в базе данных;

- поиск, отбор, сортировка информации по запросам пользователей;

- добавление новых записей;

- модификация существующих записей;

- удаление существующих записей.

Первые базы данных появились очень давно, как только появилась потребность в обработке больших массивов информации и выборки групп записей по определенным признакам. Для этого был создан структурированный язык запросов SQL (Structured Query Language). Он основан на мощной математической теории и позволяет выполнять эффективную обработку баз данных, манипулируя не отдельными записями, а группами записей.

Для управления большими базами данных и их эффективной обработки разработаны системы управления базами данных (СУБД). Практически в каждой СУБД помимо поддержки языка SQL имеется также свой уникальный язык, ориентированный на особенности этой СУБД и не переносимый на другие системы. Сегодня в мире насчитывается три ведущих производителя СУБД: Microsoft (SQL Server), IBM (JDB2) и Oracle. Их продукты нацелены на поддержку одновременной работы тысяч пользователей в сети, а базы данных могут храниться в распределенном виде на нескольких серверах. В каждой из этих СУБД реализован собственный диалект SQL, ориентированный на особенности конкретного сервера, поэтому программы, подготовленные для разных СУБД, друг с другом, как правило, несовместимы.

С появлением персональных компьютеров были созданы так называемые настольные СУБД. Родоначальником современных языков программирования баз данных для ПК принято считать СУБД dBase II, язык которой был интерпретируемым. Затем для него были созданы компиляторы, появились СУБД FoxPro и Clipper, поддерживающие диалекты этого языка. Сегодня самой распространенной настольной СУБД стала система Microsoft Access.

· языки моделирования (UML, GPSS). При создании программ и формировании структур баз данных нередко применяются формальные способы их представления - формальные нотации, с помощью которых можно визуально представить (изобразить с помощью мыши) таблицы баз данных, поля, объекты программы и взаимосвязи между ними в системе, имеющей специализированный редактор и генератор исходных текстов программ на основе созданной модели. Такие системы называются CASE-системами. В них активно применяются нотации IDEF, а в последнее время все большую популярность завоевывает язык графического моделирования UML.

· языки программирования для Интернета. С активным развитием глобальной сети было создано немало реализаций популярных языков программирования, адаптированных специально для Интернета (Perl, PHP, Tcl/Tk, VRML и др.). Все они отличаются характерными особенностями: языки являются интерпретируемыми, интерпретаторы для них распространяются бесплатно, а сами программы - в исходных текстах. Такие языки называют скрипт-языками. Также существуют специальные языки разметки web-документов публикуемых в сети Интернет (например, HTML, XML).

Языки web-программирования делятся на две группы: клиентские и серверные. Как следует из названия, клиентские языки обрабатываются на стороне пользователя, а если проще - программы на клиентском языке обрабатывает браузер. Отсюда следует и недостаток - обработка скрипта зависит от браузера пользователя, и пользователь имеет полномочия настроить свой браузер так, чтобы он вообще игнорировал скрипты. Преимущество же клиентского языка заключается в том, что обработка скриптов на таком языке может выполняться без отправки документа на сервер. Программа сразу проверит правильное заполнение формы перед отправкой, и, если необходимо, выведет ошибку. Отсюда же вытекает и то ограничение, что с помощью клиентского языка программирования ничто не может быть записано на сервер. Самым распространенным из клиентских языков является JavaScript, разработчиками которого является компания Netscape совместно с компанией Sun Microsystems. Другой вариант клиентского языка это, например, VBScript.

Важной стороной работы серверных языков является СУБД. Это, по сути, тоже сервер, на котором в определенном пользователем порядке хранится разная необходимая информация, которая может быть вызвана в любой момент. Это библиотека, в которой все материалы аккуратно сложены по полочкам и в любой момент могут быть взяты. В настоящее время стали известны СУБД, обращение к которым производится посредством Structured Query Language (SQL), или языком структурированных запросов.

· скриптовые языки (англ. scripting language, также называют язык сценариев) - языки программирования, разработанные для записи «сценариев», последовательностей операций, которые пользователь может выполнять на компьютере. Простые скриптовые языки раньше часто называли языками пакетной обработки (batch languages). Сценарии всегда интерпретируются, а не компилируются. В прикладной программе, сценарий (скрипт) - это программа, которая автоматизирует некоторую задачу, которую без сценария пользователь делал бы вручную, используя интерфейс программы. Примеры скриптовых языков программирования:

- универсальные скриптовые языки:Forth, Perl, Python, PHP,
Tcl ( Tool command language), Ruby, ERM, Lua и др.

- встроенные в прикладные программы: VBA (Visual Basic Application), AutoLISP, Emacs Lisp, MAXScript и др.,

- командные оболочки: AppleScript, bash, csh, JCL, пакетные файлы MS DOS (.bat) и файлы командного процессора Microsoft Windows NT (.cmd), REXX и др.

- встраиваемые: JavaScript, Sleep, Script.NET и др[16].

· языки описания интерфейсовили IDL (англ. Interface Description Language) - описательный компьютерный язык, синтаксически похожий на C++. Примеры языков описания интерфейсов: CORBA IDL (разработан OMG для описания интерфейсов распределенных объектов - названий методов и типов переменных-аргументов), COM IDL (аналогичная CORBA IDL разработка Microsoft, созданная для описания интерфейсов между модулями COM).

· интегрированные системы программирования (Microsoft Visual Basic, Borland Delphi, Borland C++ Builder, Symantec Café).

§ 12.2. Основные понятия языков программирования

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

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

Выражения бывают трех видов:

1) арифметическими, вычисляющими числовой результат;

2) логическими, вычисляющими логический результат;

3) строчными, отражающими символьную информацию.

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

1) сложения +; 2) вычитания –; 3) умножения *; 4) деления /.

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

1. Арифметическое выражение записывается в одну строку.

2. Знаки действий не пропускаются.

3. Применяются только круглые скобки.

Арифметическое выражение стоит справа от оператора присваивания.

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

Например, выражение i+3 состоит из одной операции сложения и двух операндов - переменной i и числовой константы - 3.

Каждое выражение имеет значение, которое определяется в момент выполнения оператора, содержащего это выражение. Если на момент вычисления выражения i+3 в переменной i будет хранится число 5 то значение этого выражения будет равно 8.

Логическое выражение. В языках программирования имеются и логические выражения, которые могут принимать только два значения: ИСТИНА и ЛОЖЬ. Чаще всего false ассоциируется с нулем, а true с числом 1 или просто любым ненулевым значением.

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

Существуют следующие операции сравнения:

1) равно = (= =); 2) меньше <; 3) больше >; 4) больше или равно>=; 5) меньше или равно<=; 6) неравно <> (или !=)[17].

Например, логическое выражение 1 < 5 истинно, а 5 < 5 ложно.

Наиболее часто используются следующие логические операции AND, OR, NOT.

Приоритеты всех логических операций ниже, чем приоритеты операций сравнения, поэтому операции сравнения всегда выполняются первыми. Приоритет логических операций NOT (НЕ), AND (И), OR (ИЛИ).

Строчные выражения. Строки в языках программирования всегда заключаются в кавычки. Как правило строки можно сравнивать друг с другом на эквивалентность (равно и не равно) В некоторых языках программирования допускается также сравнение типа больше/меньше Кроме того часто допускается операции склеивания строк «+» (конкатенация). Например, в результате выполнения оператора присвоения STR:=«3mp3»+ «.musik» + «.ru» переменная STR примет значение «3mp3.musik.ru».

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

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

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

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

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

1) количество байт, которое эта переменная будет занимать в памяти;

2) набор операций, который можно производить над этой переменной в программе.

Самые элементарные типы переменных называются стандартными.

К стандартным типам переменных относятся:

1) логические значения;

2) целые типы;

3) вещественные типы;

4) множество литер, или символов, выводимые на экран или печать.

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

Значительно большие возможности заключают в себе структурированные данные, определяемые разработчиком программы (в пределах возможностей используемого им языка программирования), К структурированию данных разработчика программы толкает как логика прикладной задачи, так и чисто утилитарное соображение: при наличии в задаче большого количества входных и выходных данных отдельное именование каждого из них может оказаться практически невозможным.

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

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

Если все элементы, образующие структуру, однотипны (например, - целые числа или символы), то структура является однородной; если же в ней «перепутаны» элементы разной природы (например, числа чередуются с символами), то неоднородной.

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

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

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

Этапы разработки программ

Разработка программы решения задачи на ЭВМ предусматривает следующие шаги:

1. Выбор языка программирования.

2. Составление проекта программы.

3. Создание файла с текстом программы[18].

4. Трансляция программы, т.е. перевод ее с языка высокого уровня на язык машинных кодов[19]. На этом этапе транслятором автоматически осуществляется проверка соответствия программы требованиям языка программирования, на котором она написана.

Трансляция может выполняться с использованием средств компиляторов или интерпретаторов.

Компилятор транслирует всю программу, но без ее выполнения.

Интерпретатор, в отличие от компилятора, выполняет пооператорную обработку и выполнение программы.

5. Компоновка программы – выполняется с помощью специальной программы компоновщика, как правило, называемой LINKER (редактор связей) и заключается в генерации загрузочного модуля[20] программы, т.е. создании исполняемого файла типа EXE. Компоновщик подключает к программе пользователя все необходимые библиотеки и создает карту распределения оперативной памяти для данной программы, которая, кстати, может быть полезна при отладке больших программ.

6. Устранение ошибок:

6.1. Отладка - устранение синтаксических и других элементарных ошибок в программах на этапах трансляции и сборки. Ошибки в программах бывают двух видов:

· синтаксические ошибки - несоответствие формальным требованиям языка программирования. На них указывает транслятор при трансляции и линковщик при сборке программы.

· семантические ошибки - смысловые (логические) ошибки; при них программа «работает», но работает неправильно, т.е. не по заданию. Поиск этих ошибок происходит с помощью логического анализа работы программы и ее тестирования[21].

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

Выделяют следующие уровни тестирования:

· модульное тестирование (Unit-тестирование) - тестируется минимально возможный для тестирования компонент, например, отдельный класс или функция.

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

· системное тестирование - тестируется интегрированная система на ее соответствие исходным требованиям.

· регрессионное тестирование (англ. regression testing, от лат. regressio - движение назад) - собирательное название для всех видов тестирования программного обеспечения (ПО), направленных на обнаружение ошибок в уже протестированных участках исходного кода. Такие ошибки - когда после внесения изменений в программу перестает работать то, что должно было продолжать работать - называют регрессионными ошибками. После внесения изменений в очередную версию, регрессионные тесты подтверждают, что сделанные изменения не повлияли на функциональность предыдущей версии.

· альфа-тестирование - имитация реальной работы с системой штатными разработчиками, либо реальная работа с системой потенциальными пользователями/заказчиком на стороне разработчика. Часто альфа-тестирование применяется для законченного продукта в качестве внутреннего приемочного тестирования. Иногда альфа-тестирование выполняется отладчиком или с использованием окружения, которое помогает быстро выявлять найденные ошибки. Обнаруженные ошибки могут быть переданы разработчику для дополнительного исследования в окружении, подобном тому, в котором будет использоваться ПО.

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

Одними из наиболее распространенных технологий тестирования являются:

· стратегия черного ящика;

· стратегия белого ящика;

· регрессионное тестирование.

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

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

Если «альфа-» и «бета-тестирование» относятся к стадиям до выпуска продукта, тестирование «белого ящика» и «черного ящика» имеет отношение к способам, которыми тестировщик достигает цели.

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

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

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

7. Выполнение программы, проверка результатов. Если они ошибочны, то происходит редактирование текста программы и возврат к
4 шагу. Если результаты устраивают пользователя, то процесс разработки программы заканчивается.

Вопросы и задания для самопроверки

1. Что называется программой?

2. Что такое язык программирования?

3. Дайте классификацию языков программирования.

4. Поясните следующие понятия: выражение, оператор, операция.

5. Какие виды выражений вы знаете?

6. Перечислите стандартные типы переменных.

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

8. Поясните, в чем различие между отладкой и тестированием программы?

9. Какие виды ошибок могут встречаться в программе?

10. Назовите уровни тестирования программного обеспечения.

11. Опишите существующие технологии тестирования.

12. Дайте понятия компилятора, интерпретатора, транслятора, загрузчика, отладчика.

Литература

Основная:

1. Об информации, информационных технологиях и о защите информации: Федеральный закон РФ от 27 июля 2006 г. № 149-ФЗ / Сборник законов РФ. С изменениями и дополнениями на 30 апреля 2007 года. - М.: Эксмо, 2007.

2. ГОСТ 19.701-90 - ЕСПД. Схемы алгоритмов, программ, данных и систем. Обозначения условные и правила выполнения.

3. Словарь по кибернетике: св. 2000 ст. / Под. ред. В.С. Михалевича. - К.: Гл. ред. УСЭ им. М. П. Бажанова, 1989.

4. Информатика. Базовый курс: учебник для вузов / Под. ред. С.В. Симоновича. - СПб.: Питер, 2007.

5. Каймин В.А. Информатика / В.А. Каймин. - М.: ИФРА-М, 2001.

6. С++: процедурно-ориентированное программирование: учебное пособие / Авт.-сост. О.И. Каляпина, С.А. Мишин. – Воронеж: Воронежский институт МВД России, 2008.

Дополнительная:

7. Акулов О.А. Информатика базовый курс / О.А. Акулов, Н.В. Медведев. - М.: Омега-Л, 2008.

8. Магда Ю.С. Аппаратное обеспечение и эффективное программирование / Ю.С. Магда. - СПб.: Питер, 2007.

9. Беляев М.А. Основы информатики : учебник для студентов вузов / М.А. Беляев [и др.]. - Ростов н/Д: Феникс, 2006.

10. Соболь Б.В. Информатика : учебник / Б.В. Соболь и [и др.]. - Ростов н/Д: Феникс, 2006.

11. Максимов Н.В. Архитектура ЭВМ и вычислительных систем : учебник / Н.В. Максимов, Т.Л. Партыка, И.И. Попов. - М.: ФОРУМ: ИНФРМА-М, 2006.

12. Могилев А.В. Информатика / А.В Могилев, Н.И. Пак, Е.К. Хеннер. - М.: Academia, 2004.

13. Новосельцев В.И. Системный анализ: современные концепции / В.И. Новосельцев. - Воронеж: Издательство «Кварта», 2003.

14. Советов Б.Я. Моделирование систем / Б.Я. Советов, Яковлев С.А. - М.: Высшая школа, 2001.

15. Болгов В.В. Цифровые интегральные микросхемы устройств охранно-пожарной сигнализации: учебное пособие / В.В. Болгов. - Воронеж: Воронежская высшая школа МВД России. 1997.

16. Свободная энциклопедия «Википедия» [Электронный ресурс]. – Режим доступа: http://ru.wikipedia.org. - Загл. с экрана.

Приложение А

Наши рекомендации