- •История
- •Конфигурация первого ibm pc
- •Ключевые технологи
- •Последующее развитие модельного ряда
- •Системное программное обеспечение. Операционные системы.
- •Операционные системы.
- •Классификация ос.
- •1.1 Возможности, которые предоставляет ос Linux
- •1.3 Характерные особенности Linux как ос
- •Операционная система ms dos.
- •Файловая система.
- •Операционная система Windows
- •Графический интерфейс
- •Объектно-ориентированный подход
- •Типы окон:
- •Элементы окон.
- •Компьютерные вирусы и антивирусные средства
- •Более строгое определение
- •Основные разновидности вирусов.
- •Системы программирования к этой категории относятся программы, предназначенные для разработки программного обеспечения:
- •Виды инструментального по
- •Константы и переменные
- •Присваивание
- •Приоритет
- •Вызов операторов с присваиванием
- •Арифметические операторы
- •Логические операторы
- •Операторы сравнения
- •Условный оператор if
Системы программирования к этой категории относятся программы, предназначенные для разработки программного обеспечения:
ассемблеры — компьютерные программы, осуществляющие преобразование программы в форме исходного текста на языке ассемблера в машинные команды в виде объектного кода.
трансляторы - программы или технические средства, выполняющее трансляцию программы.
компиляторы — Программы, переводящие текст программы на языке высокого уровня, в эквивалентную программу на машинном языке.
интерпретаторы — Программы (иногда аппаратные средства), анализирующие команды или операторы программы и тут же выполняющие их
компоновщики (редакторы связей) — программы, которые производят компоновку — принимают на вход один или несколько объектных модулей и собирают по ним исполнимый модуль.
препроцессоры исходных текстов — это компьютерные программы, принимающие данные на входе и выдающие данные, предназначенные для входа другой программы, например, такой, как компилятор
Отла́дчик (debugger)- является модулем среды разработки или отдельным приложением, предназначенным для поиска ошибок в программе.
текстовые редакторы — компьютерные программы, предназначенные для создания и изменения текстовых файлов, а также их просмотра на экране, вывода на печать, поиска фрагментов текста и т. п.
специализированные редакторы исходных текстов — текстовые редакторы для создания и редактирования исходного кода программ. Специализированный редактор исходных текстов может быть отдельным приложением, или быть встроен в интегрированную среду разработки (IDE).
библиотеки подпрограмм — сборники подпрограмм или объектов, используемых для разработки программного обеспечения.
Редакторы графического интерфейса
Перечисленные инструменты могут входить в состав интегрированных сред разработки
Виды инструментального по
Текстовые редакторы
Интегрированные среды разработки
SDK
Компиляторы
Интерпретаторы
Линковщики
Парсеры и генераторы парсеров (см. Javacc)
Ассемблеры
Отладчики
Профилировщики
Генераторы документации
Средства анализа покрытия кода
Средства непрерывной интеграции
Средства автоматизированного тестирования
Системы управления версиями
и др.
Вопрос №17. Классификация языков программирования.
Существуют различные классификации языков программирования.По наиболее распространенной классификации все языки программирования, в соответствии с тем, в каких терминах необходимо описать задачу, делят на языки низкого и высокого уровня.Если язык близок к естественному языку программирования, то он называется языком высокого уровня, если ближе к машинным командам, – языком низкого уровня. В группу языков низкого уровня входят машинные языки и языки символического кодирования: Автокод, Ассемблер. Операторы этого языка – это те же машинные команды, но записанные мнемоническими кодами, а в качестве операндов используются не конкретные адреса, а символические имена. Все языки низкого уровня ориентированы на определенный тип компьютера, т. е. являются машинно–зависимыми.
Машинно–ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.).
К языкам программирования высокого уровня относят Фортран (переводчик формул – был разработан в середине 50–х годов программистами фирмы IBM и в основном используется для программ, выполняющих естественно – научные и математические расчеты), Алгол, Кобол (коммерческий язык – используется, в первую очередь, для программирования экономических задач), Паскаль, Бейсик (был разработан профессорами Дармутского колледжа Джоном Кемени и Томасом Курцом.), Си (Деннис Ритч – 1972 году), Пролог (в основе языка лежит аппарат математической логики) и т.д.
Эти языки машинно–независимы, т.к. они ориентированы не на систему команд той или иной ЭВМ, а на систему операндов, характерных для записи определенного класса алгоритмов. Однако программы, написанные на языках высокого уровня, занимают больше памяти и медленнее выполняются, чем программы на машинных языках.
Программу, написанную на языке программирования высокого уровня, ЭВМ не понимает, поскольку ей доступен только машинный язык. Поэтому для перевода программы с языка программирования на язык машинных кодов используют специальные программы – трансляторы.
Существует три вида транслятора: интерпретаторы (это транслятор, который производит пооператорную обработку и выполнение исходного кода программы), компиляторы (преобразует всю программу в модуль на машинном языке, после чего программа записывается в память компьютера и лишь потом исполняется) и ассемблеры (переводят программу, записанную на языке ассемблера, в программу на машинном языке).
Языки программирования также можно разделять на поколения:
– языки первого поколения: машинно–ориентированные с ручным управлением памяти на компьютерах первого поколения.
– языки второго поколения: с мнемоническим представлением команд, так называемые автокоды.
– языки третьего поколения: общего назначения, используемые для создания прикладных программ любого типа. Например, Бейсик, Кобол, Си и Паскаль.
– языки четвертого поколения: усовершенствованные, разработанные для создания специальных прикладных программ, для управления базами данных.
– языки программирования пятого поколения: языки декларативные, объектно–ориентированные и визуальные. Например, Пролог, ЛИСП (используется для построения программ с использованием методов искусственного интеллекта), Си++, Visual Basic, Delphi.
Языки программирования также можно классифицировать на процедурные и непроцедурные.
В процедурных языках программа явно описывает действия, которые необходимо выполнить, а результат задается только способом получения его при помощи некоторой процедуры, которая представляет собой определенную последовательность действий.
Среди процедурных языков выделяют в свою очередь структурные и операционные языки. В структурных языках одним оператором записываются целые алгоритмические структуры: ветвления, циклы и т.д. В операционных языках для этого используются несколько операций. Широко распространены следующие структурные языки: Паскаль, Си, Ада, ПЛ/1. Среди операционных известны Фортран, Бейсик, Фокал.
Непроцедурное (декларативное) программирование появилось в начале 70-х годов 20 века, К непроцедурному программированию относятся функциональные и логические языки.
В функциональных языках программа описывает вычисление некоторой функции. Обычно эта функция задается как композиция других, более простых, те в свою очередь делятся на еще более простые задачи и т.д. Один из основных элементов функциональных языков – рекурсия. Оператора присваивания и циклов в классических функциональных языках нет.
В логических языках программа вообще не описывает действий. Она задает данные и соотношения между ними. После этого системе можно задавать вопросы. Машина перебирает известные и заданные в программе данные и находит ответ на вопрос. Порядок перебора не описывается в программе, а неявно задается самим языком. Классическим языком логического программирования считается Пролог. Программа на Прологе содержит, набор предикатов–утверждений, которые образуют проблемно–ориентированную базу данных и правила, имеющие вид условий.
Можно выделить еще один класс языков программирования – объектно–ориентированные языки высокого уровня. На таких языках не описывают подробной последовательности действий для решения задачи, хотя они содержат элементы процедурного программирования. Объектно–ориентированные языки, благодаря богатому пользовательскому интерфейсу, предлагают человеку решить задачу в удобной для него форме.
Первый объектно-ориентированный язык программирования Simula был создан в 1960-х годах Нигаардом и Далом.
Ява – язык для программирования Internet, позволяющий создавать безопасные, переносимые, надежные, объектно–ориентированные интерактивные программы. Язык Ява жестко связан с Internet, потому, что первой серьезной программой, написанной на этом языке, был браузер Всемирной паутины.
В последнее время, говоря о программировании в Internet, часто имеют в виду создание публикаций с использованием языка разметки гипертекстовых документов HTML. Применение специальных средств (HTML–редакторов) позволяет не только создавать отдельные динамически изменяющиеся интерактивные HTML–документы, используя при этом данные мультимедиа, но и редактировать целые сайты.
Вопрос №18. Парадигмы программирования.
Паради́гма программи́рования — это совокупность идей и понятий, определяющих стиль написания программ. Парадигма в первую очередь определяется базовой программной единицей и самим принципом достижения модульности программы. В качестве этой единицы выступают определение (декларативное, функциональное программирование), действие (императивное программирование), правило (продукционное программирование), диаграмма переходов (автоматное программирование) и др. сущности. В современной индустрии программирования очень часто парадигма программирования определяется набором инструментов программиста, а именно, языком программирования и используемыми библиотеками.
Парадигма программирования определяет то, в каких терминах программист описывает логику программы. Например, в императивном программировании программа описывается как последовательность действий, а в функциональном программировании представляется в виде выражения и множества определений функций (слово определение (англ. definition) следует понимать в математическом смысле). В популярном объектно-ориентированном программировании (в дальнейшем ООП) программу принято рассматривать как набор взаимодействующих объектов. ООП, в основном[1], есть по сути императивное программирование, дополненное принципом инкапсуляции данных и методов в объект (принцип модульности) и наследованием (принципом повторного использования разработанного функционала).
Важно отметить, что парадигма программирования не определяется однозначно языком программирования — многие современные языки программирования являются мультипарадигменными, то есть допускают использование различных парадигм. Так на языке Си, который не является объектно-ориентированным, можно писать объектно-ориентированным образом, а на Ruby, в основу которого в значительной степени положена объектно-ориентированная парадигма, можно писать согласно стилю функционального программирования.
Приверженность определённого человека какой-то одной парадигме иногда носит настолько сильный характер, что споры о преимуществах и недостатках различных парадигм относятся в околокомпьютерных кругах к разряду так называемых «религиозных» войн — холиваров.
Вопрос №20. Встроенные типы данных.
Обычно в состав встроенных типов данных включаются такие типы, операции над значениями которых напрямую или, по крайней мере, достаточно эффективно поддерживаются командами компьютеров. В современных компьютерах к таким "машинным" типам относятся целые числа разного размера (от одного до восьми байт), булевские значения (поддерживаемые обычно за счет наличия признаков условной передачи управления) и числа с плавающей точкой одинарной и двойной точности (обычно четыре и восемь байт соответственно). В более ранних компьютерах часто поддерживалась десятичная арифметика с фиксированной точкой (например, в мейнфреймах компании IBM и супер-миникомпьютерах компании Digital), но в настоящее время прямая аппаратная поддержка такой арифметики отсутствует практически во всех распространенных процессорах. В соответствии с этим, в традиционный набор встроенных типов обычно входят следующие (мы будем говорить про размеры внутреннего представления значений этих типов, хотя в спецификациях языков такая информация, как правило, отсутствует):
Тип CHARACTER (или CHAR) в разных языках - это
либо набор печатных символов из алфавита, зафиксированного в описании языка (для большинства языков англоязычного происхождения этот алфавит соответствует кодовому набору ASCII);
либо произвольная комбинация нулей и единиц, размещаемых в одном байте.
В первой интерпретации (свойственной языкам линии Паскаль) для значений типа CHAR определены только операции сравнения в соответствии с принятым алфавитом. Например, при использовании ASCII выполняются соотношения 0 < 1 < ...< 9 < A < B < ...< Z < a < b < ...< z; известно, что если значение переменной x удовлетворяет условию 0 <= x <= 9, то это значение - цифра; если A <= x <= Z, то значение x - прописная буква; если a <= x <= z, то значение x - строчная буква и т.д. При использовании этой интерпретации арифметические операции над символьными значениями не допускаются.
Во второй интерпретации (свойственной языкам линии Си) литеральными константами типа CHAR по-прежнему могут быть печатные символы из принятого в языке алфавита, но возможно использование и числовых констант, задающих желаемое содержимое байта. В этом случае, как правило, над значениями типа CHAR возможно выполнение не только операций сравнения, но и операций целочисленной арифметики.
Наконец, в некоторых языках явно различают тип CHAR как чисто символьный тип и тип сверхмалых целых (TINY INTEGER) как тип целых чисел со значениями, умещающимися в один байт.
В современных компьютерах, как правило, поддерживается целочисленная байтовая арифметика, обеспечивающая как первую, так и вторую интерпретацию типа CHAR.
Тип BOOLEAN в тех языках, где он явно поддерживается, содержит два значения - TRUE (истина) и FALSE (ложь). Несмотря на то, что для хранения значений этого типа теоретически достаточно одного бита, обычно в реализациях переменные этого типа занимают один байт памяти. Для всех типов данных, для которых определены операции сравнения, определены также и правила, по которым эти операции сравнения вырабатывают булевские значения. Над булевскими значениями возможны операции конъюнкции (& или AND), дизъюнкции (| или OR) и отрицания (~ или NOT), определяемые следующими таблицами истинности: TRUE AND TRUE = TRUE TRUE AND FALSE = FALSE FALSE AND TRUE = FALSE FALSE AND FALSE = FALSE TRUE OR TRUE = TRUE TRUE OR FALSE = TRUE FALSE OR TRUE = TRUE FALSE OR FALSE = FALSE NOT FALSE = TRUE NOT TRUE = FALSE
При работе с булевскими значениями в языках баз данных некоторую проблему вызывает то, что по причине возможности хранения в базе данных неопределенных значений операции сравнения могут вырабатывать не два, а три логических значения: TRUE, FALSE и UNKNOWN. Поэтому в языке SQL-92, например, используется не двухзначная, а трехзначная логика, в результате чего логические операции при их обработке в серверах баз данных определяются расширенными таблицами (мы приводим их с учетом коммутативности двуместных операций):
TRUE AND TRUE = TRUE TRUE AND FALSE = FALSE TRUE AND UNKNOWN = UNKNOWN FALSE AND UNKNOWN = FALSE TRUE OR TRUE = TRUE TRUE OR FALSE = TRUE TRUE OR UNKNOWN = TRUE FALSE OR UNKNOWN = UNKNOWN NOT FALSE = TRUE NOT TRUE = FALSE NOT UNKNOWN = UNKNOWN
Помимо общего возрастания сложности и недостаточной удовлетворительности трехзначной логики для целей работы с базами данных, неприятность состоит в отсутствии поддержки этой логики в языках программирования (как, впрочем, и в отсутствии явной поддержки неопределенных значений).
В языках линии Си прямая поддержка булевского типа данных отсутствует, но имеется логическая интерпретация значений целых типов. Значением операции сравнения может быть "0" (FALSE) или "1" (TRUE). Значение целого типа "0" интерпретируется как FALSE, а значения, отличные от нуля, - как TRUE. В остальном все работает как в случае наличия явной поддержки булевского типа.
Тип целых чисел в общем случае включает подмножество целых чисел, определяемое числом разрядов, которое используется для внутреннего представления значений. При определении типа целых чисел обычно стремятся к тому, чтобы множество его значений было симметрично относительно нуля (собственно, это стимулируется и стандартными свойствами машинной целочисленной арифметики). Поэтому приходится тратить один бит на значение знака числа и при использовании n бит для внутреннего представления целого соответствующий тип содержит значения в диапазоне от -2(n-1) до 2(n-1). В подавляющем большинстве современных процессоров отрицательные целые числа обычно представляют в дополнительном коде.
В языках, ориентированных на 32-разрядные компьютеры, в частности, в стандартных Си и Си++ для рационального использования памяти допускаются модификации целого типа short integer (обычно 16-разрядные), integer (обычно то же самое, что и long integer) и long integer (обычно 32-разрядные), а также байтовые целые (char). При этом поддерживаются автоматические преобразования значений типов меньшего размера к значениям типов большего размера. Пока не очень понятно, какие встроенные целые типы будут зафиксированы в будущем "64-разрядном" стандарте языка Си, но многие компании считают разумным использовать модель под названием LP64, в которой предполагается размер char - 8 бит, размер short integer - 16 бит, размер integer - 32 бита и размер long integer и long long integer - 64 бита.
Наряду со знаковыми целыми типами в языках часто поддерживаются беззнаковые целые. Такие типы в линии языков Паскаль называются CARDINAL, а в линии языков Си именуются путем добавления модификатора unsigned к названию соответствующего целого типа. Таким образом, в последнем случае существуют типы unsigned char, unsigned short integer, unsigned integer и unsigned long integer. Поскольку множество значений типа unsigned в два раза мощнее множества значений соответствующего целого типа, то поддерживается их автоматическое преобразование только к целым типам большего размера.
Наконец, для поддержки численных вычислений в языках обычно специфицируется встроенный тип чисел с плавающей точкой с базовым названием REAL или FLOAT. Обычно в описании языков не фиксируется диапазон и точность значений такого типа. Они уточняются в реализации и обычно существенно зависят от особенностей целевого процессора. В языках семейства Си (32-разрядных) специфицированы три разновидности типа чисел с плавающей точкой - float (обычно с размером 16 бит), double float (размером в 32 бит) и long double float (размером 64 бит).
Вопрос №21. Константы и переменные.
