Программирование
Программирование — процесс создания компьютерных программ, включающий разработку алгоритма, написание кода на языках программирования, а также тестирование, отладку и сопровождение программных модулей.
Программирование используется в разных сферах, например:
Разработка программного обеспечения — создание приложений для компьютеров, мобильных устройств и сайтов.
Автоматизация задач — программы могут выполнять обработку данных, сортировку информации, генерацию отчётов.
Научные исследования — программирование используется для моделирования, симуляции и анализа данных.
Инженерия и робототехника — написание кода играет важную роль в разработке систем автоматизации, роботов и управления техническими устройствами.
Кибербезопасность — программирование помогает разрабатывать системы безопасности и защиты данных, а также предотвращать кибератаки.
Некоторые виды программирования:
Объектно-ориентированное программирование (ООП) — основано на концепции объектов, содержащих данные и методы.
Декларативное программирование — описывает желаемый результат без указания конкретных шагов для его достижения.
Функциональное программирование — основано на математической концепции функции без побочных эффектов.
Логическое программирование — основано на формальной логике, программа представляет собой набор фактов и правил.
Событийно-ориентированное программирование — программы реагируют на события (нажатия клавиш, клики мыши). Характерно для GUI-разработки.
-
Emacs для начинающих
AWK - утилита предназначенная для простых, механических и вычислительных манипуляций над данными. Довольно несложные операции часто необходимо выполнить над целыми пакетами файлов, а писать для этого программу на одном из стандартных языков программирования является утомительным и, как правило, не очень простым делом. Оптимальное решение проблемы - использование специальной утилиты AWK, включающей в себя не громоздкий и удобный язык программирования, позволяющий решать задачи обработки данных с помощью коротких программ, состоящих из двух-трех строк.
Утилита AWK изначально объединяла свойства утилит UNIX - sed и grep. В дальнейшем ее возможности значительно расширились. Настоящая документация ограничивается описанием возможностей утилиты AWK реализованной для компьютеров CONVEX. Утилита AWK была создана в 1977г, американскими авторами: Alfred V.Aho, Brian W.Kernighan и Peter J.Weinberger. Подробное описание всех возможностей утилиты AWK для UNIX дает их издание: ``The AWK Programming Language'', 1988.
AWK сканирует input (стандартный или указываемый набор файлов), и над строками, удовлетворяющими заданному образцу, выполняет указываемые действия. Строка может содержать максимально до 256 символов.
Общая структура AWK-программы
Поля
Значения переменных
Переменные поля
Массивы
Арифметические выражения
Регулярное выражение
Выражение отношения
Комбинация образцов
BEGIN и END
Вывод /Печать/
Присваивание
Встроенные функции
Управляющие структуры
Part: Сравнительное решение задач с помощью SED и AWK
Посчитать количество строк (input)
Напечатать все строки, содержащие "olga"
Напечатать все строки, содержащие "olga", "mike" или "mal"
Напечатать третье поле каждой строки
Напечатать сначала третье, а затем второе поля каждой строки
Добавить строки, содержащие "olga", "mike" или "mal" соответственно к файлам: folga, fmike, fmal
Dave Bodenstab
Введение
Основные термины
Какие форматы файлов шрифтов я могу использовать?
Настройка виртуальной консоли на режим работы 80x60
Использование шрифтов type 1 с системой X11
Использование шрифтов type 1 с пакетом Ghostscript
Codeeqv
Ссылки по теме
Зачем нужен этот документ?
Что такое Emacs?
Разновидности Emacs
План действий.
Установка и настройка MySQL.
Установка словарей.
Установка и настройка PtkDic.
Установка и настройка GtkDic.
Установка J2RE 1.4 и JaLingo.
Установка и настройка Apache с поддержкой PHP и phpMyLingvo.
Заключение (субъективное).
Благодарности.
Синтаксис
Структура документа
Полезные тэги
Тэги корневого раздела [Root Section]
Структурные тэги [Sectioning Tags]
Тэги, образующие списки [List-Making Tags]
Тэги прямого форматирования [Inline Markup Tags]
Перекрестные ссылки
О чем я умолчал
За и против
Дополнительные материалы
Кристоф Шпиль [Christoph Spiel]
Текстовые редакторы для ОС UNIX
GNU Emacs 19.19
UniPress Emacs 2.20e
Siren Editor 1.0
Iris Х Editor 1.3.7
Nedit 3.1.1
TED 2.la
AUIS ez
VEDIT 2.30
Edit*2000 1.40
SlickEdit 2. 3
YUI 1.0 (бета-версия)
Эмуляторы
Nu/TPU 3.0
REDT
Gnus
c
z
x
О
Errors
Emacs для начинающих
Errors-e
Faq
Faq-e
Feedback
Feedback-e
Преобразование файлов в другие форматы в Linux
Fonts
Основными растровыми шрифтами
Как работает txt2html.
Установка заголовка и имени автора.
Создание разделов.
Создание споисков.
Размещение рисунков.
Добавление ссылок.
Новые параграфы и подчеркивания.
Таблицы.
Математические выражения.
Including LaTeX definitions in txt2html
Omitting LaTeX
Заключительные замечания.
Ключи программы.
Примеры.
Локализация, как она есть.
О чем здесь написано ?
Что здесь есть (содержание) :
Index-e
Песнь о Joe
Кодируем помаленьку
Крестоносцы
LaTeX
Общая структура документа
Задание структуры документа
Списки
Определение собственных команд и окружений
Физическая разметка [Inline Markup]
Последовательность вызова утилит LaTeX
Latex2html
Еще раз о ссылках
Гиперссылки
Команды, специфичные для конкретного формата
Плюсы и минусы latex2html
Дополнительные источники
Кристоф Шпиль [Christoph Spiel]
LDP
SGML
Почему SGML а не HTML или какой нибудь другой формат ?
Инструменты
Jade
OpenJade
DSSSL
DocBook DTD (версия 3.1)
Sgmltools-lite
TeX
LyX
Emacs (PSGML)
WordPerfect 2000
DocBook: The Definitive Guide
Aspell
Cygnus DocBook Tools
By
Info? Это что?
Общая структура
Заголовок
Тело документа
Задание структуры и разбиение на разделы
Титульная страница
Условная трансляция
Прямое форматирование
Программы просмотра (браузеры)
Обзор распространенных программ просмотра Info
Плюсы и минусы
Локализация, интернационализация, глобализация.
POSIX locale
Локализация от Microsoft.
Лингвистика и компютеры.
Локализация (l10n), интернационализация (i18n) :
Фирмы - производители программного обеспечения.
Языки, символы, кодировки :
UNICODE
MIME :
Linux :
Ссылки на меня :-)[по результатам /var/log/httpd/referer.log]
Языки, символы и кодировки.
Language
Character
Encoding.
СharSets
Transfer interrupted!
Standarts
POSIX
CHARSET и его имя, или Do you forget about Charset ?
Что такое UNICODE ?
Локализация и почта. MIME.
Категории локализации.
Как включить локализацию ?
Как установить locale ?
Emacs для начинающих
Как проверить, что локализация заработала ?
NLS. Сообщения на родном языке.
Пример (XPG4):
Исходный текст message catalog-a:
Компиляция message catalog-а :
Пример использования message catalog-a :
Запуск:
Ввод/вывод в системе UNIX и локализация.
Кто занимается стандартизацией locale ?
Другие стандарты ISO :
Что значит "программа правильно написана" ?
Функция setlocale() .
Локализация и POSIX.
Как работает locale ? (пример Linux)
Что такое LyX ?
История LyX
Что такое LaTeX ?
Главные характеристики
LyX и LinuxDoc
Приложение. Установка
LyX и LaTeX: организация взаимодействия. Часть 1
Настройки LyX
Проверка орфографии
Настройки клавиатурного ввода
Почитать на ту же тему на сайте Софтерра:
Настройка взаимодействия с LaTeX
Загрузка пакета fontenc
Загрузка пакета inputenc
Загрузка пакета многоязыковой поддержки
Шрифтовое оформление документа
Несколько слов о KLyX
Manual
Manual-e
Англо-русский словарь Мюллера и программы для его использования в UNIX
Описание формата словаря Мюллера, Издание 7. Под GNU GPL.
"MOVA" --- скрипты для работы со словарями в формате "MOVA"
Пролог
Внешний вид и основные возможности
File
Edit
Search
Preferences
Shell
Macro
Windows
Help
Настраиваем NEdit
Language Modes
Auto Indent, Wrap и Tabs
Text Fonts
Customize Menus
Searching
Syntax Highlighting, Statistics Line, Incremental Search Line и Show Line Numbers
Make Backup Copy и Sort Open Prev. Menu
Warning
Initial Window Size
Show Matching (...), Tag Collisions, Popups Under Pointer
Конфигурирование .Xdefaults
Файлы .nedit и .neditdb
Наращиваем мускулы Макросы и Shell
Пример применения HTML-редактор своими руками
Эпилог
Модифицирующие клавиши
Прочие клавиши
Стандартные PC-клавиши
Клавишные комбинации, дублирующие пункты меню
Приложение 2 Пример секции !nedit в файле .Xdefaults для настройки редактора NEdit
Приложение 3 Макросы для разметки html-документов
Настраиваем NEdit, или HTML-редактор своими руками
Создание макрокоманд
Встраивание команд оболочки
Самодельный HTML-редактор
Обзор программы: Nedit
"А напоследок я скажу..."
Thomas Adam
Примечания переводчика
Русификация wscons
Русификация PCVT консоли
Русификация X Window
Настройка XKB
Установка xruskb
Bash
Приложений на базе GTK
Majordomo
Mg - emacs-like text editor
Netscape
Talk
Vi/Ex
Создание PDF документов с использованием DocBook
Что такое DocBook?
Пишем заметку
Добавление текста и другой информации
Преобразование документа в формат PDF
Заключение
Ссылки
Perl's Plain Old Documentation (POD)
Секционирование
Команды прямого форматирования [Inline Markup Commands]
Синхронизация
Формато-специфичные абзацы
Программы для работы с POD
За и против формата POD
Что почитать
XML: свобода, ограниченная только фантазией
Дилемма 0.Применять ли XML вообще?
Emacs для начинающих
Дилемма 2.Как обеспечить устойчивость?
Дилемма 3.Нужна ли схема?
Дилемма 5.Узлы или ребра?
Итог
Азбука кириллизации
Путь первый, новаторский
Путь второй: старый, проверенный
Введение
Русификация X Window и приложений.
Последние советы
Русификация Linux
Русификация RedHat Linux 8.0
Политика
Цели и задачи
Русификация
Переключатель клавиатуры
Шрифты
Альтернативные подходы
Список использованной литературы
Приложение 1. Все любят скриншоты
Конвертор кодировок rusconv
Мая 2002 года
Назначение и Формат использования
Адресация в командах SED
Регулярное выражение
Функции SED
Функция контекстной замены
Сравнительное решение задач с помощью SED и AWK
Посчитать количество строк (input)
Напечатать все строки, содержащие "olga", "mike" или "mal"
Напечатать третье поле каждой строки
Напечатать сначала третье а затем второе поля каждой строки
Добавить стороки, содержащие "olga", "mike" или "mal" соответственно к файлам: folga, fmike, fmal
Добавить в начало каждой строки
SGML - документальный метаязык
Три носителя
Два типа разметки
Три особенности SGML
Три части SGML-документа
Три типа SGML-программ
XML-инициативы набирают силу
Инструментальный набор
SGML: с чем это едят?
Как я набрел на SGML-технологию
Терминология
Особенности SGML
Описательная разметка
Типы документов
Независимость данных
О преимуществах
Почему SGML?
SGML против WYSIWYG
О программном обеспечении
SGML-редактор
Средства форматирования
Используемые программы
Выбор DTD
SGML и Web
Публикация в SGML
Информация к размышлению
Документация
Программное обеспечение
Шпаргалка по редактору "Emacs"
ХОЖДЕНИЕ ПО ФАЙЛАМ
ОКНА, БУФЕРА
ИНФОРМАЦИЯ
ОТКАТКА
БОЛЬШИЕ / МАЛЕНЬКИЕ. РУССКИЕ/ЛАТИНСКИЕ
ПЕРЕМЕЩЕНИЯ ПО ТЕКСТУ
/B> УСТАНОВКА ОКНА В УДОБНОЕ ПОЛОЖЕНИЕ
ВСТАВКА / УДАЛЕНИЕ / РЕДАКТИРОВАНИЕ СТРОКИ
ЗАПОМИНАНИЕ / ВСПОМИНАНИЕ
МАКРОКОМАНДЫ И Т.П.
КОМАНДЫ МИНИБУФЕРА
ПОИСК , И ЗАМЕНА
ФОРМАТИРОВАНИЕ
ПРОЧЕЕ
ФИЛЬТРЫ
Установка параметров
Феньки всякие
ЛИСП
TED
Что такое Ted?
Сравнение
Какие шрифты?
Как усовершенствовать TED?
Функциональность
Выводы
Страница отзывов
Сказ про TeXmacs, или как прикручивали шрифты TeX к графическому режиму, и что из этого получилось
Наследие Emacs
Наследие Emacs - 2
Влияние LaTeX
Гримасы русификации
Как с этим бороться
Tutorial
Tutorial-e
Что нужно писателю, чтобы писать
Редактор текстов - каким хотелось бы видеть
Vi - классика мира Unix
Вариации на тему emacs
Прочие консольные редакторы
Средства KDE - Kedit, Kwrite, Katy
Прочие редакторы для системы X Window
Nedit - на пути к идеалу
Текстовые процессоры
Ted как орудие бюрократа и головотяпа
Содержание
Введение
Как получить Emacs
Редактирование текста в Emacs
Запуск и завершение работы в Emacs
Команды Emacs
Перемещение курсора
Ввод и удаление текста
Emacs для начинающих
Сохранение результатов редактирования
Копирование, перемещение и удаление блоков текста
Поиск и замена текста
Редактирование нескольких файлов
Дополнение имен.
Работа с несколькими окнами.
Настройка редактора Emacs.
Запись и выполнение макросов.
LISP - язык программирования Emacs.
Настройка переменных редактора Emacs.
Возможности встроенной подсказки.
Редактирование Документов SGML в редакторе Emacs и PSGML
Установка PSGML
Запуск PSGML
Объявления SGML и DTD
Использование PSGML
Установка значений переменных PSGML.
Sgml-omittag-transparent
Sgml-balanced-tag-edit
Sgml-auto-insert-required-elements
Sgml-set-face
Sgml-live-element-indicator
Sgml-indent-step
Ввод команд PSGML
Ввод текста.
Разбиение Оперативного Элемента
Вставка тэгов в существующий текст
Вставка элементов через Меню
Выравнивание текста элемента
Структурирование текста
Перемещение курсора в режиме SGML
Удаление, перемещение и копирование элементов.
Копирование элементов
Редактирование атрибутов
Обнаружение ошибок разметки
Вывод результатов проверки
Изменение команды проверки
Другие полезные свойства PSGML
Выделение Разметки шрифтом и цветом
Нормализация Образцов Документа
Помощь при вводе ссылок на объект
Информация о месте текущего элемента в иерархии документа
Краткий справочник. Комбинации клавиш Emacs и PSGML
Использование редактора VI
Сокращения
Предисловие
Начало работы
Выход из VI
Режимы работы VI
Работа в командном режиме
Простые команды редактора VI
Текстовые буферы в редакторе VI
Вырезание и копирование
Вставка
Оформление и контроль
Поиск текста
Настройка VI и EX
Макросы
Переменная EXINIT и файл .exrc
Восстановление данных
Предупреждения для использования VI на рабочих станциях
Обзор команд редактора VI
Вырезание и вставка/удаление текста
Вставка текста
Перемещение по файлу
Перемещение по экрану
Замена текста
Манипулирование символьно/строковым форматированием
Сохранение и выход
Разное
Команды редактора EX
Vim
Vim-2 или "что может быть проще?"
Vim: уже шесть!
Почитать на ту же тему на сайте Софтерра:
Редактор vi
Полноэкранный редактор vi
Командный режим
Режим командной строки
Команды
Редактирование
Командная строка
Повторители
Буферы vi
Многооконное редактирование
Vito
Руководство по редактору vi для начинающих.
Whatrus
Whatrus-e
XML в 10 тезисах
XML — это способ записи структурированных данных
XML немного похож на HTML
XML — это текст, но он не предназначен для чтения
XML умышленно многословен
XML — это семейство технологий
XML нов, но не совсем
XML ведет HTML к XHTML
XML - модульная технология
XML — основа для RDF и Семантической Сети
Технология XML свободна от лицензирования, платформо-независима и хорошо поддерживаема
Встречаем XSLT
Получение значений атрибутов
Сортировка
Инструкция if
Инструкция for-each
Инструкция choose
Saxon
Установка
Xsltproc
Daniel Guerrero
-
OLTP в Зазеркалье
Очевидно, что оптимизация систем баз данных категории OLTP на основе использования основной памяти является хорошей идеей, если соответствующие базы данных помещаются в основную память. Но возможен и ряд других вариантов организации систем баз данных
Аннотация
Введение
Альтернативные архитектуры СУБД
Измерение накладных расходов OLTP
Результаты
Вклад авторов и организация статьи
OLTP в Зазеркалье
Тенденции в области OLTP
Кластерные вычисления
Базы данных, хранимые в основной памяти
Однопотоковый режим в системах OLTP
Высокая доступность в противовес журнализации
Варианты транзакций
Резюме
Shore
Архитектура Shore
Удаление компонентов Shore
OLTP в Зазеркалье
Исследование производительности
Рабочая нагрузка OLPTP
Экспериментальная установка и методология измерений
Экспериментальные результаты
Воздействие на пропускную способность
Payment
New Order
Команды по сравнению с тактами
Следствия для будущих серверов баз данных OLTP
Управление параллелизмом
Поддержка многоядерных процессоров
Управление репликацией
Слабая согласованность
B-деревья с учетом знаний о поведении кэша
Родственные исследования
Заключение
Благодарности
Оценка повторяемости результатов
Литература
-
Введение в теорию программирования. Функциональный подход
Важнейшими математическими формализациями, рассматриваемыми в данном курсе, являются ламбда-исчисление и комбинаторная логика.
Еще в 1924 г. М. Шейнфинкель (Moses Schonfinkel) разработал простую (simple) теорию функций, которая фактически являлась исчислением объектов-функций и предвосхитила появление ламбда-исчисления – математической формализации, поддерживающей языки функционального программирования (т.е. программирования в терминах функций).
Затем в 1934 г. А. Черч (Alonso Church) предложил собственно исчисление ламбда-конверсий (или ламбда-исчисление) и применил его для исследования теории множеств. Вклад ученого был фундаментальным, так что теория до сих пор называется ламбда-исчислением и часто именуется в литературе ламбда-исчислением Черча.
Позднее, в 1940 г., Х. Карри (Haskell Curry) создал теорию функций без переменных (иначе называемых комбинаторами), известную в настоящее время как комбинаторная логика. Эта теория является развитием ламбда-исчисления и представляет собой формальный язык, подобный языку функционального программирования.
Классификация языков программирования
Концепция и возможности подхода .NET
Функциональный подход к программированию
Ламбда-исчисление как формализация языка функционального программирования
Введение
Теоретические сведения
Функции и типы
Типы, объекты и методы .NET
Задание
Варианты заданий
Комбинаторная логика как формальная система
Теория типов и комбинаторная логика
Теоретические сведения
Задание
Варианты заданий
Синтаксис языков программирования
Семантика языков программирования
Теоретические сведения
Задание
Варианты заданий
Рекурсивные функции и множества
Теоретические сведения
Задание
Абстрактные машины и категориальная комбинаторная логика
Категориальная абстрактная машина
Оптимизация вычислений и абстрактные машины
Теоретические сведения
Задание
-
Введение в технологию программирования
Результатом фазы оценки осуществимости являются детальная спецификация, план работы и оценка стоимости. Наиболее традиционной формой плана можно считать сетевой график, который представляется в виде ориентированного графа с двумя выделенными вершинами – начало и конец работы. Вершинами графа являются события, соответствующие пунктам плана, а ребрами – работы
Жизненный цикл программы
Постановка задачи. Оценка осуществимости
Планирование
Управление
Тестирование, обеспечение качества
Групповая разработка, управление версиями
Психология программирования
Организация коллектива разработчиков
Организация коллектива разработчиков в компании Microsoft
Документирование
Сопровождение
Реинжиниринг
Управление качеством
Стандарты ISO
Capability Maturity Model for Software (Модель SEI SW-CMM)
CASE-технологии
Развитие методологии проектирования
Примеры CASE-средств
Понятие встроенной системы
Инструментальная и целевая ЭВМ
Комплекс вычислительных средств
Параллельные процессы
Работа с временными интервалами
Организация вычислительного процесса
Процессы
Данные
Технология RTST
Технология REAL
Как готовить системных программистов
Индустриальная программа подготовки
Наукоград и технопарки в Петергофе
Национальные черты производства ПО
-
Заметки о программировании
Банкир обладает конечным капиталом во флоринах. Он решает принимать клиентов, которые могут занимать у него флорины на следующих условиях
Простой пример
Обобщенная задача взаимного исключения
Замечание
Пример
Новый подход к задаче взаимного исключения
Необходимость в более реалистическом решении
Синхронизирующие примитивы
Определение
Применение синхронизирующих примитивов к задаче взаимного исключения
Типичное использование общего семафора
Избыточность общего семафора
Ограниченный буфер
Взаимодействие через переменные состояния
Пример приоритетного правила
Пример с диалогами
Замечание 1. если оператор при
Замечание 2. окончательная интерпретация
Совершенствование предыдущей программы
Проблема тупиков
Алгоритм банкира
Применение алгоритма банкира
Заключительные замечания
-
Заметки по структурному программированию
Эти заметки относятся к жанру "писем к себе": одни и те же соображения очень часто вертелись у меня в голове, и чтобы отвлечься от них, я был просто вынужден записать их. Перечитывая написанное, я не всегда испытывал полное удовлетворение.
Прежде всего я чувствовал, что страдаю излишним многословием. Тем не менее я, не пытаюсь ужать текст (теперь), во-первых, потому, что это вызвало бы дополнительную задержку и я снова увлекся бы этими размышлениями, а во-вторых, потому что прежний опыт заставляет меня бояться, что я окажусь непонятым: часто программист склонен рассматривать свои (иногда довольно специфические) трудности как суть программирования, и в результате существует большое разнообразие мнений о том, что же такое программирование на самом деле.
Надеюсь, что, несмотря на недостатки моей работы, вам понравятся хотя бы некоторые ее части. Если эти заметки послужат источником вдохновения или позволят вам по-новому оценить профессию программиста, то мои основные цели будут достигнуты.
О количественной ограниченности наших возможностей
О надежности аппаратуры
О наших интеллектуальных средствах
О перечислении
О математической индукции
Об абстракции
Пример доказательства правильности программы
О противоречии между правильностью доказательств и правильностью реализации
О понимании программ
О сравнении программ
Первый пример поэтапного составления программы
О семействах программ
О расплате машинной памятью за ускорение вычислений
О модели программы
Второй пример поэтапного составления программы
О том, чего мы достигли
Организация групп и последовательностей
Более детальные проектные рассмотрения
Проблема восьми ферзей
-
Индустрия программирования
В настоящее время одним из перспективных и экономически оправданных подходов к развитию информационной индустрии является создание информационных технологий (ИТ) и реализующих их систем (ИТ-систем) на принципах открытости. Основными свойствам открытых систем являются переносимость (программ, данных, пользовательских окружений), интероперабельность (сетевая взаимосвязь и совместное использование ресурсов и данных компонентами распределенных систем), масштабируемость (эффективность функционирования в широких диапазонах характеристик производительности и ресурсов). Достижимость этих качеств возможна лишь на основе высокого уровня стандартизованности интерфейсов ИТ-систем и поддерживающих их платформ.
Разделяемая память
Семафоры
Очереди сообщений
Структуры данных, используемые для организации очередей сообщений
Программные каналы
Программные гнезда (sockets)
Одна из возможных конфигураций программных гнезд
Потоки (streams)
Множественные прикладные среды Windows NT
Типичные функции, которые подсистемы
Объектно-ориентированные средства анализа, проектирования и реинжениринга информационных систем
Основные свойства Rational Rose
Типы диаграмм, поддерживаемые Rational Rose
Диаграммы классов
Автоматическое преобразование нотаций
Диаграмма сценариев
Диаграммы сценариев объектов
Диаграмма состояний
Диаграмма процессов
Диаграммы модулей
Автоматическая генерация С++ кода.
Реинжениринг модели
Групповая работа в Rational Rose/C++
Современные аппаратные платформы
Серверы
Кластерные архитектуры
AIM
Основные архитектурные понятия
Эффект конвейеризации при выполнении трех команд - четырехкратное ускорение
Пример устранения конфликтов компилятором
CPI-конвейера R4000 на тестах SPEC
Параллелизм на уровне выполнения
Работа суперскалярного конвейера
Архитектура машин с очень длинным командным словом
Выполнение по предположению (speculation)
Принципы организации основной памяти
Процессоры с архитектурой 80х86 и Pentium
SPARC - Scalable Processor Architecture
PA-RISC (Precision Architecture)
Архитектура MIPS
Организация ввода/вывода
Основные характеристики популярных шин
Магнитные диски
Дисковые массивы
Устройства архивирования информации
Типовая архитектура машины с распределенной памятью
Основные характеристики серверов AlphaServer
Характеристики рабочих станций на базе процессора Alpha
HP 9000 K2X0 vs. Ultra Enterprise 3000
HP 9000 K4X0 vs. Ultra Enterprise 4000
HP 9000 T-Class vs. Ultra Enterprise 5000
Основные характеристики серверов IBM RS/6000
Основные характеристики рабочих станций компании SUN Microsystems
Основные характеристики серверов рабочих групп компании SUN Microsystems
Основные характеристики серверов отделов компании SUN Microsystems
Основные характеристики серверов предприятий компании SUN Microsystems
ИТОЛОГИЯ - наука об информационных технологиях
Основные особенности итологии
Организационная структура в области стандартизации ИТ
Структура JTC1 и состав основных подкомитетов по стандартизации ИТ
Организация ITU-T
Структура знаний итологии
Архитектурные спецификации
Базовые спецификации
Роль и назначение концепции профиля
Определение профилей
Типовая структура документа ISP
Требования к содержанию и формату ISP
Семантика аттестации на соответствие профилю
Свойства профилей
Цели OSE-профилей
Определения
Таксономия OSE-профилей
Таксономия подсетевых услуг
Нетрадиционные среды программирования: от Корнелльского Синтезатора до Java
Тезисы доклада
Графические интерфейсы и средства их разработки
Введение
UIDS/UIMS
X Window
Современное состояние свободно распространяемого программного обеспечения
Фонд свободного программного обеспечения и проект GNU
Другие наиболее распространенные продукты Public Domain
Архитектуры и технологии разработки интероперабельных систем
Потребности применений
Компоненты архитектуры
Интеграция CORBA и WWW-технологий
Семантическая интероперабельность
Заключение
Список литературы
Язык программирования Си++: этапы эволюции и современное состояние
Основные этапы развития языка
История стандартизации
Современное состояние языка
Перспективы
Литература
Опыт разработки переносимой банковской
Индустрия программирования
Сложные проекты на базе современных информационных технологий
Интеграция СУБД в глобальную сеть Internet
Стандартные интерфейсы WWW серверов
Технология ODBC организации доступа к базам данных
Стандарт DDE межпроцессного взаимодействия в операционной системе Windows
Архитектура системы
Интерфейс общения с пользователем посредством Internet
Передача данных от пользователя к обработчику
Взаимодействие серверного и клиентского приложений
Переработка результатов SQL запроса и передача их пользователю
Описание общей схемы функционирования системы
Интегрированный подход к разработке крупных программных систем управления реального времени
Объектно-ориентированная среда для разработки трехмерных графических приложений
Новые проекты в области информационных
Проблема защиты информации в Internet
Протокол SKIP
Эволюции спецификации SKIP
Эволюции продуктной линии SKIP
Требования к сети крупной организации
Windows NT Server - современная 32-разрядная сетевая ОС
Надежность Windows NT
Защищенность Windows NT
Поддержка разнообразных клиентов
Служба каталогов Windows NT - ядро информационной системы
Доменная служба каталогов Windows NT
Роль Windows NT Server в домене
Пользователи и группы
Управление учетными записями
Общие параметры защиты системы
Управление правами на доступ к ресурсам системы
Windows NT - эффективный сервер приложений
Microsoft SQL Server 6.5 отвечает требованиям крупных заказчиков
Microsoft Exchange
SNA Server - обеспечение связи с большими и мини компьютерами
Internet Information Server - составная часть Windows NT Server
Systems Management Server -
Использование Windows NT для построения глобальных сетей
Объединение подсетей в корпоративную сеть
Borland Delphi как инструмент корпоративного разработчика
Критерии выбора корпоративных инструментов в применении к Borland Delphi
Перспективы использования Delphi
Технология проектирования и создания
Система программирования тройного стандарта (3С++)
Введение
Компилятор Си++
Стандартная библиотека Си++: принципы построения
Тестовый пакет
Концепция визуального программирования в IBM VisualAge Smalltalk
Быстрая и надежная разработка приложений с использованием PowerBuilder
Семейство Powersoft Enterprise Series
Введение в PowerBuilder
Инструментальная среда PowerBuilder
Создание приложения в среде PowerBuilder
Возможности интеграции и направления развития
-
Программирование на языке сценариев командной оболочки
Shell -- это командная оболочка. Но это не просто промежуточное звено между пользователем и операционой системой, это еще и мощный язык программирования. Программы на языке shell называют сценариями, или скриптами. Фактически, из скриптов доступен полный набор команд, утилит и программ UNIX.
-
Исследование операций. Линейное, динамическое программирование
В наше время, которое по справедливости называют эпохой научно-технической революции, наука уделяет все большее внимание вопросам организации и управления. Причин этому много. Быстрое развитие и усложнение техники, небывалое расширение масштабов проводимых мероприятий и спектра их возможных последствий, внедрение автоматизированных систем управления (АСУ) во все области практики — все это приводит к необходимости анализа сложных целенаправленных процессов под углом зрения их структуры и организации. От науки требуются рекомендации по оптимальному (разумному) управлению такими процессами. Прошли времена, когда правильное, эффективное управление находилось организаторами «на ощупь», методом «проб и ошибок». Сегодня для выработки такого управления требуется научный подход — слишком велики потери, связанные с ошибками.
Потребности практики вызвали к жизни специальные научные методы, которые удобно объединять под названием «исследование операций». Под этим термином мы будем понимать применение математических, количественных методов для обоснования решений во всех областях целенаправленной человеческой деятельности.
-
Как перестать беспокоиться и начать программировать
Достойна упоминания лишь одна функция: разбиение строки текста на строки меньшей и ограниченной длины с пословным переносом. Практически все остальные случаи жизни можно инкапсулировать в классы :-) Спецификация: void StringWordSplit(AnsiString Str, TStringList *StringList, const unsigned short LengthOfOneLine)
Часть I. Комплект инструментов.
Текстовые ресурсы
Библиотека классов низкого уровня
Класс TAskCursor
Класс AskMoney
Классы AskDate, BCDate, AskTime
Класс TFile
Класс IniFile (производный от TFile)
Класс ToFile (производный от TFile)
Класс TAskRecycleBin
Библиотека функций общего назначения
Графическая библиотека
Пакет компонентов ASK.BPL
Закладка "ASK Controls"
Размышления старого программиста о жизни и о себе
TAskPageControl
TAskDateEdit
TAskEdit, TAskMaskEdit, TAskRxCalcEdit, TAskCurrencyEdit, TAskComboBox, TAskMemo, и т.д.
TAskSpeedButton
TControl * PtrControl0… PtrControl9
TAskSpdBtnGroup.
TAskToolBar.
Пора копнуть поглубже…
-
Компонентный подход в программировании
Помимо методических рекомендаций, при конструировании больших систем часто используются прагматические принципы работы со сложными системами вообще. Они играют значительную роль в выработке качественных технических решений в достаточно широком контексте. Эти принципы позволяют распределять работы между участвующими в проектах людьми с меньшими затратами на обеспечение их взаимодействия и акцентировать внимание каждого из участников на наиболее существенных для его части работы характеристиках системы. К таким принципам относятся использование абстракции и уточнения, модульная разработка и переиспользование.
Принципы работы со сложными системами
Абстракция (abstraction) и уточнение (refinement).
Пример абстракции и уточнения.
Другой пример.
Модульность (modularity).
Пример.
Переиспользование.
Компонентный подход в программировании
Понятие жизненного цикла ПО
Стандарты жизненного цикла
Группа стандартов ISO
Группа стандартов IEEE
Группа стандартов CMM, разработанных SEI
Модели жизненного цикла
Компонентный подход в программировании
"Тяжелые" и "легкие" процессы разработки
Унифицированный процесс Rational
Экстремальное программирование
Компонентный подход в программировании
Анализ предметной области
Выделение и анализ требований
Варианты использования
Компонентный подход в программировании
Качество программного обеспечения
Методы контроля качества
Тестирование
Проверка на моделях
Ошибки в программах
Компонентный подход в программировании
Анализ области решений
Архитектура программного обеспечения
Разработка и оценка архитектуры на основе сценариев
UML. Виды диаграмм UML
Статические диаграммы
Динамические диаграммы
Компонентный подход в программировании
Образцы человеческой деятельности
Образцы анализа
Архитектурные стили
Каналы и фильтры
Многоуровневая система
Компонентный подход в программировании
Данные–представление–обработка
Образцы проектирования
Подписчик
Идиомы
Шаблонный метод
Образцы организации и образцы процессов
Инспекция программ по Фагану
Компонентный подход в программировании
Удобство использования программного обеспечения
Психологические и физиологические факторы
Человеку свойственно ошибаться
Скоростные показатели деятельности человека
Внимание человека
Понятность
Память человека
Разные категории пользователей
Факторы удобства использования и принципы создания удобного ПО
Методы разработки удобного программного обеспечения
Контроль удобства программного обеспечения
Компонентный подход в программировании
Платформы Java и .NET
Лексика
Общая структура программы
Базовые типы и операции над ними
Логический тип
Целочисленные типы
Типы чисел с плавающей точкой
Выражения
Инструкции
Пользовательские типы
Компонентный подход в программировании
Наследование
Элементы типов
Шаблонные типы и операции
Дополнительные элементы описания операций
Описание метаданных
Средства создания многопоточных программ
Библиотеки
Компонентный подход в программировании
Основные понятия компонентных технологий
Общие принципы построения распределенных систем
Синхронное и асинхронное взаимодействие
Транзакции
Компонентный подход в программировании
Web-приложения
Расширяемый язык разметки XML
Платформа Java 2 Enterprise Edition
Связь
Именование
Процессы и синхронизация
Целостность
Отказоустойчивость
Защита
Работа с XML
Платформа .NET
Процессы и синхронизация
Пример 13.1
Пример 13.2
Пример 13.3
Компонентный подход в программировании
Общая архитектура Web-приложений
Уровень бизнес-логики и модели данных в J2EE
Компоненты данных и сеансовые компоненты
Компоненты, управляемые сообщениями
Дескрипторы развертывания компонентов EJB
Уровень модели данных в .NET
Протокол HTTP
Уровень пользовательского интерфейса в J2EE
Сервлеты
Серверные страницы Java
Уровень пользовательского интерфейса в .NET
Компонентный подход в программировании
Развитие технологий J2EE
Jakarta Struts
Java Server Faces
Управление данными приложения. Hibernate
Java Data Objects
Среда Spring
Ajax
Web-службы
Описание интерфейса Web-служб
Связь
Именование
Процессы
Синхронизация и целостность
Отказоустойчивость
Защита
Компонентный подход в программировании
Задачи управления проектами
Окружение проекта
Структура организации–исполнителя проекта
Организационная культура
Заинтересованные в проекте лица
Виды деятельности, входящие в управление проектом
Управление содержанием проекта и качеством
Метрики ПО
Управление ресурсами
Специфика управления персоналом
Управление рисками
Управление коммуникациями и информационным обеспечением
-
Логическое программирование
Если же его вычисление порождает неуспех, тогда новый список целей отбрасывается и происходит возврат (бэктрекинг) к просмотру программы. Этот просмотр продолжается, начиная с предложения, непосредственно следующего за предложением C (C - предложение, использовавшееся последним) и делается попытка достичь успешного завершения с помощью другого предложения
История
Логический вывод
Применение метода резолюций для ответов на вопросы
Особенности языка Пролог
Пример Пролог-программы: родственные отношения
Фразы Хорна как средство представления знания
Алгоритм работы интерпретатора Пролога
Порядок предложений и целей
Этот вызов приводит к бесконечному циклу
Вариант 4
Декларативная и процедурная семантики
Арифметика в Прологе
Структуры
Списки
Примеры использования структур
Ограничение перебора
Вычисление максимума
Процедура проверки принадлежности списку, дающая единственное решение
Добавление элемента списку, если он отсутствует (добавление без дублирования)
Негативная информация
Предположение о замкнутости мира
Тогда и только тогда, когда
Отрицание в явной форме
Преимущества отсечения
Недостатки отсечения
Отрицание определяется через отсечение
Повторение и откат
Повтор, определяемый пользователем
Эквивалентность программ и данных
Предположение об открытости мира
Доступ к программам и обработка программ
Загрузка базы данных (файла с программой)
Информирует систему, что указанный
Программирование второго порядка
Мутанты
Олимпиадная задача
Рекомендуемая литература
-
Объектно-ориентированное программирование
Расширение возможностей вычислительной техники и увеличение масштабных задач, решаемых с помощью ЭВМ, приводят к возрастанию размера и сложности систем программного обеспечения. Если еще два-три десятилетия назад составление программ для ЭВМ являлось в значительной мере искусством, которым владели немногие
-
Объектно-ориентированное программирование в ограничениях
Программирование в ограничениях как самостоятельное научное направление сложилось в конце 60-х – начале 70-х годов прошлого века. Примечательно, что первыми приложениями были задачи обработки изображений и параметрического моделирования пространственно-двумерных сцен.
-
Основы многопоточного и распределенного программирования
Параллельное программирование возникло в 1962 г. с изобретением каналов — независимых аппаратных контроллеров, позволявших центральному процессору выполнять новую прикладную программу одновременно с операциями ввода-вывода других (приостановленных) программ. Параллельное программирование (слово параллельное в данном случае означает "происходящее одновременно"') первоначально было уделом разработчиков операционных систем. В конце 60-х годов были созданы многопроцессорные машины. В результате не только были поставлены новые задачи разработчикам операционных систем, но и появились новые возможности у прикладных программистов.
Первой важной задачей параллельного программирования стало решение проблемы так называемой критической секции. Эта и сопутствующие ей задачи ("обедающих философов", "читателей и писателей" и т.д.) привели к появлению в 60-е годы огромного числа научных работ. Для решения данной проблемы и упрощения работы программиста были разработаны такие элементы синхронизации, как семафоры и мониторы. К середине 70-х годов стало ясно, что для преодоления сложности, присущей параллельным программам, необходимо использовать формальные методы.
Обзор области параллельных вычислений
Суть параллельного программирования
Структуры аппаратного обеспечения
Приложения и стили программирования
Итеративный параллелизм: умножение матриц
Производители и потребители: каналы ОС Unix
Клиенты и серверы: файловые системы
Взаимодействующие равные: распределенное умножение матриц
Обзор программной нотации
Историческая справка
Литература
Упражнения
Процессы и синхронизация
Состояние, действие, история и свойства
Распараллеливание: поиск образца в файле
Синхронизация: поиск максимального элемента массива
Неделимые действия и операторы ожидания
Синхронизация типа "производитель-потребитель"
Обзор аксиоматической семантики
Техника устранения взаимного вмешательства
Свойства безопасности и живучести
Блокировки и барьеры
Критические секции: решения со справедливой стратегией
Барьерная синхронизация
Алгоритмы, параллельные по данным
Основы многопоточного и распределенного программирования
Семафоры
Синтаксис и семантика
Задача об обедающих философах
Распределение ресурсов и планирование
Учебные примеры: библиотека Pthreads
Мониторы
Методы синхронизации
Планирование работы диска: программные структуры
Однопроцессорное ядро
Реализация семафоров в ядре
Реализация мониторов в ядре
Реализация мониторов с помощью семафоров
Удаленный вызов процедур
Основы многопоточного и распределенного программирования
Нотация совместно используемых примитивов
Новые решения задачи о читателях и писателях
Учебные примеры: язык Java
Учебные примеры: язык Ada
Учебные примеры: язык SR
Модели взаимодействия процессов
Управляющий-рабочие (распределенный портфель задач)
Алгоритмы пульсации
Конвейерные алгоритмы
Алгоритмы типа "зонд-эхо"
Алгоритмы рассылки
Алгоритмы передачи маркера
Дублируемые серверы
Реализация языковых механизмов
Асинхронная передача сообщений
Удаленный вызов процедур и рандеву
Синхронное параллельное программирование
Сеточные вычисления
Основы многопоточного и распределенного программирования
Матричные вычисления
Языки, компиляторы, библиотеки и инструментальные средства
Библиотеки параллельного программирования
Распараллеливающие компиляторы
Языки и модели
Инструментальные средства параллельного программирования
Словарь
-
Основы объектно-ориентированного программирования
Все мы хотим, чтобы наше ПО было быстродействующим, надежным, легким в использовании, читаемым, модульным, структурным и т.д. Но эти определения описывают два разных типа качества. Наличие или отсутствие таких качеств, как скорость и простота использования ПО, может быть обнаружено его пользователями. Эти качества можно назвать внешними факторами качества.
Под словом "пользователи" нужно понимать не только людей, взаимодействующих с конечным продуктом, но и тех, кто их закупает, занимается администрированием. Такое свойство, например, как легкость адаптации продуктов к изменениям спецификаций - далее определенная в нашей дискуссии как расширяемость - попадает в категорию внешних факторов, поскольку она может представлять интерес для администраторов, закупающих продукт, хотя и не важна для "конечных пользователей", непосредственно работающих с продуктом.
Такие характеристики ПО, как модульность или читаемость, являются внутренними факторами, понятными только для профессионалов, имеющих доступ к тексту ПО.
Обзор внешних факторов
Корректность (Correctness)
Устойчивость (Robustness)
Расширяемость (Extendibility)
Повторное использование (Reusability)
Совместимость (Compatibility)
Эффективность (Efficiency)
Переносимость (Portability)
Простота использования (Easy of Use)
Функциональность (Functionality)
Своевременность (Timeliness)
Другие качества
О документации
Компромиссы
Ключевые вопросы
О программном сопровождении
Ключевые концепции
О критериях
О критериях
До какой степени мы должны быть догматичными?
Категории
Метод и язык
Бесшовность (seamlessness)
Классы
Утверждения (Assertions)
Классы как модули
Классы как типы
Вычисления, основанные на компонентах
Скрытие информации (information hiding)
Обработка исключений (Exception handling)
Статическая типизация (static typing)
Универсальность (genericity)
Единичное наследование (single inheritance)
Множественное наследование (Multiple inheritance)
Дублируемое наследование (Repeated inheritance)
Ограниченная универсальность (Constrained genericity)
Переопределение (redefinition)
Полиморфизм
Динамическое связывание
Выяснение типа объекта в период выполнения
Отложенные (deferred) свойства и классы
Управление памятью (memory management) и сборка мусора (garbage collection)
Реализация и среда
Автоматическое обновление (automatic update)
Быстрое обновление (fast update)
Живучесть (persistence)
Документация
Быстрый просмотр (browsing)
Библиотеки
Базовые библиотеки
Графика и пользовательские интерфейсы
Механизмы эволюции библиотек
Механизмы индексации в библиотеках
Продолжение просмотра
Библиографические ссылки и объектные ресурсы
Пять критериев
Пять критериев
Декомпозиция
Модульная Композиция
Модульная Понятность
Модульная Непрерывность
Модульная Защищенность
Пять правил
Прямое отображение
Минимум интерфейсов
Слабая связность интерфейсов
Явные интерфейсы
Скрытие информации
Пять принципов
Лингвистические Модульные Единицы
Самодокументирование
Унифицированный Доступ
Открыт-Закрыт
Единственный Выбор
Библиографические замечания
У3.1 Модульность в языках программирования
У3.2 Принцип Открыт-Закрыт (для программистов Lisp)
У3.3 Ограничения на скрытие информации
У3.4 Метрики для модульности (отчетная исследовательская работа)
У3.5 Модульность существующих систем
У3.6 Управление конфигурацией и наследование
Цели повторного использования
Цели повторного использования
Ожидаемые преимущества
Потребители и производители повторно используемых программ
Что следует повторно использовать?
Повторное использование персонала
Повторное использование проектов и спецификаций
Образцы проектов (design patterns)
Повторное использование исходного текста
Повторное использование абстрактных модулей
Повторяемость при разработке ПО
Нетехнические препятствия
Синдром NIH
Фирмы по разработке ПО и их стратегии
Организация доступа к компонентам
Несколько слов об индексировании компонентов
Форматы для распространения повторно используемых компонентов
Оценка
Техническая проблема
Изменения и постоянство
Повторно использовать или переделать? (The reuse-redo dilemma)
Пять требований к модульным структурам
Изменчивость Типов (Type Variation)
Группирование Подпрограмм (Routine Grouping)
Изменчивость Реализаций (Implementation Variation)
Независимость Представлений
Факторизация Общего Поведения
Традиционные модульные структуры
Подпрограммы
Пакеты
Пакеты: оценка
Перегрузка и универсальность
Синтаксическая перегрузка
Семантическая перегрузка (предварительное представление)
Универсальность (genericity)
Основные методы модульности: оценка
Ключевые концепции
Библиографические замечания
Ингредиенты вычисления
Ингредиенты вычисления
Базисный треугольник
Функциональная декомпозиция
Непрерывность
Проектирование сверху вниз
Не только одна главная функция
Обнаружение вершины
Функции и эволюция
Интерфейсы и проектирование ПО
Преждевременное упорядочение
Упорядочивание и ОО-разработка
Возможность повторного использования
Производство и описание
Проектирование сверху вниз: общая оценка
Декомпозиция, основанная на объектах
Расширяемость
Возможность повторного использования
Совместимость
Объектно-ориентированное конструирование ПО
Вопросы
Выявление типов объектов
Описания типов и объектов
Описание отношений и структурирование ПО
Ключевые концепции
Библиографические замечания
Критерии
Критерии
Различные реализации
Представления стеков
Опасность излишней спецификации
Какова длина второго имени?
К абстрактному взгляду на объекты
Использование операций
Политика невмешательства в обществе модулей
Согласованность имен
Можно ли обойтись без абстракций?
Формализация спецификаций
Специфицирование типов
Универсализация (Genericity)
Перечисление функций
Категории функций
Раздел АКСИОМЫ
Две или три вещи, которые мы знаем о стеках
Частичные функции
Предусловия
Полная спецификация
Ничего кроме правды
От абстрактных типов данных к классам
Классы
Как создавать эффективный класс
Роль отложенных классов
Абстрактные типы данных и скрытие информации
Переход к более императивной точке зрения
Назад к тому, с чего начали?
Конструирование объектно-ориентированного ПО
За пределами программ
Дополнительные темы
Еще раз о неявности
Соотношение спецификации и проектирования
Соотношение классов и записей
Альтернативы частичным функциям
Полна ли моя спецификация?
Доказательство достаточной полноты
Ключевые концепции
Библиографические замечания
У6.1 Точки
У6.2 Боксеры
У6.3 Банковские счета
У6.4 Сообщения
У6.5 Имена
У6.6 Текст
У6.7 Покупка дома
У6.8 Дополнительные операции для стеков
У6.9 Ограниченные стеки
У6.10 Очереди
У6.11 Распределители
У6.12 Булевский -- BOOLEAN
У6.13 Достаточная полнота
У6.14 Непротиворечивость
Классы, а не объекты - предмет обсуждения
Классы, а не объекты - предмет обсуждения
Устранение традиционной путаницы
Роль классов
Модули и типы
Класс как модуль и как тип
Унифицированная система типов
Простой класс
Компоненты
Атрибуты и подпрограммы
Класс POINT
Основные соглашения
Распознавание вида компонент
Тело подпрограммы и комментарии к заголовку
Предложение indexing
Обозначение результата функции
Правила стиля
Наследование функциональных возможностей общего характера
Объектно-ориентированный стиль вычислений
Текущий экземпляр
Клиенты и поставщики
Вызов компонента
Принцип единственности цели
Слияние понятий модуль и тип
Роль объекта Current
Квалифицированные и неквалифицированные вызовы
Компоненты-операции
Селективный экспорт и скрытие информации
Неограниченный доступ
Ограничение доступа клиентам
Стиль объявления скрытых компонент
"Внутренний" экспорт
Собираем все вместе
Общая относительность
Большой Взрыв
Системы
Программа main отсутствует
Компоновка системы
Классическое "Hello"
Структура и порядок: программист в роли поджигателя
Обсуждение
Форма объявлений
Атрибуты или функции?
Экспорт атрибутов
Доступ клиентов к атрибутам
Оптимизация вызовов
Архитектурная роль селективного экспорта
Импорт листингов
Присваивание функции результата
Дополнение: точное определение сущности
Ключевые концепции
Библиографические замечания
У7.1 POINT как абстрактный тип данных
У7.2 Завершение реализации POINT
У7.3 Полярные координаты
Объекты
Объекты
Что такое объект?
Базовая форма
Простые поля
Простое представление книги - класс BOOK
Писатели
Ссылки
Идентичность объектов
Объявление ссылок
Ссылка на себя
Взгляд на структуру объектов периода выполнения
Объекты как средство моделирования
Четыре мира программной разработки
Реальность: "седьмая вода на киселе"
Работа с объектами и ссылками
Динамическое создание и повторное связывание
Инструкция создания
Общая картина
Для чего необходимо явное создание объектов?
Процедуры создания
Перекрытие инициализации по умолчанию
Статус экспорта процедур создания
Правила, применимые к процедурам создания
Процедуры создания и перегрузка
Еще о ссылках
Состояния ссылок
Вызовы и пустые ссылки
Операции над ссылками
Присоединение ссылки к объекту
Сравнение ссылок
Значение void
Клонирование и сравнение объектов
Копирование объектов
Глубокое клонирование и сравнение
Глубокое хранилище: первый взгляд на сохраняемость
Составные объекты и развернутые типы
Ссылок не достаточно
Развернутые типы
Роль развернутых типов
Агрегирование
Свойства развернутых типов
Недопустимость ссылок на подобъекты
Присоединение: две семантики - ссылок и значений
Присоединение
Присоединение: ссылочное и копии
Гибридное присоединение
Проверка эквивалентности
Работа со ссылками: преимущества и опасности
Динамические псевдонимы
Семантика использования псевдонимов
Выработка соглашений для динамических псевдонимов
Псевдонимы в ПО и за его пределами
Инкапсуляция действий со ссылками
Обсуждение
Графические соглашения
Ссылки и простые значения
Форма операций клонирования и эквивалентности
Статус универсальных операций
Ключевые концепции
Библиографические замечания
У8.1 Книги и авторы
У8.2 Личности
У8.3 Проектирование нотации
Что происходит с объектами
Что происходит с объектами
Создание объектов
Использование динамического режима
Повторное использование памяти в трех режимах
Отсоединение
Недостижимые объекты
Достижимые объекты в классическом подходе
Достижимые объекты в ОО-модели
Проблема управления памятью в ОО-модели
Три ответа
Несерьезный подход (тривиальный)
Может ли быть оправдан несерьезный подход?
Надо ли заботиться о памяти?
Байт здесь, байт там, и реальные покойники
Восстановление памяти: проблемы
Удаление объектов, управляемое программистом
Проблема надежности
Проблема простоты разработки
Подход на уровне компонентов
Управление памятью связного списка
Работа с утилизированными объектами
Дискуссия
Автоматическое управление памятью
Необходимость автоматических методов
Что в точности понимается под восстановлением?
Подсчет ссылок
Сборка мусора
Механизм сборки мусора
Основа сборки мусора
Сборка по принципу "все-или-ничего"
Продвинутый (Advanced) подход к сборке мусора
Алгоритмы параллельной сборки мусора
Практические проблемы сборки мусора
Класс MEMORY
Механизм освобождения
Сборка мусора и внешние вызовы
Среда с управлением памятью
Основы
Сложные проблемы
Перемещение объектов
Повышенное чувство голода и потеря аппетита (Bulimia and anorexia)
Операции сборщика мусора
Ключевые концепции
Библиографические заметки
У9.1 Модели создания объектов
У9.2 Какой уровень утилизации?
У9.3 Совместное использование стека достижимых элементов
У9.4 Совместное использование
Горизонтальное и вертикальное обобщение типа
Горизонтальное и вертикальное обобщение типа
Необходимость параметризованных классов
Родовые АТД
Проблема
Роль типизации
Родовые классы
Объявление родового класса
Использование родового класса
Терминология
Проверка типов
Правило типизации
Операции над сущностями родового типа
Типы и классы
Массивы
Массивы как объекты
Свойства массива
Размышления об эффективности
Синонимичная инфиксная операция
Стоимость универсализации
Обсуждение: что все-таки не сделано
Ключевые концепции
Библиографические замечания
У10.1 Ограниченная универсализация
У10.2 Двумерные массивы
У10.3 Использование своего формального родового параметра фактически как чужого
Базисные механизмы надежности
Базисные механизмы надежности
О корректности ПО
Выражение спецификаций
Формула корректности
Сильные и слабые условия
Введение утверждений в программные тексты
Предусловия и постусловия
Класс стек
Предусловия
Постусловия
Педагогическое замечание
Контракты и надежность ПО
Права и обязательства
Интуиция (Дзен) и искусство программной надежности: больше гарантий и меньше проверок
Утверждения не являются механизмом проверки вводимых данных
Утверждения это не управляющие структуры
Ошибки, дефекты и другие насекомые
Работа с утверждениями
Императив и аппликатив (применимость)
Замечание о пустоте структур
Проектирование предусловий: толерантное или требовательное?
Предусловия и статус экспорта
Толерантные модули
Инварианты класса
Определение и пример
Форма и свойства инвариантов класса
Инвариант в момент изменения
Кто должен обеспечить сохранность инвариантов
Роль инвариантов класса в программной инженерии
Инварианты и контракты
Когда класс корректен?
Корректность класса
Роль процедур создания
Ревизия массивов
Связывание с АТД
Не просто коллекция функций
Компоненты класса и АТД функции
Выражение аксиом
Функция абстракции
Инварианты реализации
Инструкция утверждения
Инварианты и варианты цикла
Трудности циклов
Сделаем циклы корректными
Ингредиенты доказательства корректности цикла
Синтаксис цикла
Использование утверждений
Утверждения как средство для написания корректного ПО
Использование утверждений для документирования: краткая форма класса
Мониторинг утверждений в период выполнения
Мониторинг утверждений в период выполнения - 2
Каков оптимальный уровень мониторинга?
Нужен ли мониторинг в период выполнения?
Выразительная сила утверждений
Включение функций в утверждения
Инварианты класса и семантика ссылок
Что дальше
Ключевые концепции
Библиографические замечания
Библиографические замечания - 2
У11.1 Комплексные числа
У11.2 Класс и его АТД
У11.3 Полные утверждения для стеков
У11.4 Экспортирование размера
У11.6 Утверждения и экспорт
У11.7 Поиск жучков (bugs)
У11.8 Нарушение инварианта
У11.9 Генерация случайных чисел
У11.10 Модуль "очередь"
У11.11 Модуль "множество"
Постскриптум: Катастрофа Ариан 5
Базисные концепции обработки исключений
Базисные концепции обработки исключений
Отказы
Исключения
Источники исключений
Ситуации отказа
Обработка исключений
Как не следует делать это - C-Unix пример
Как не следует делать это - Ada пример
Принципы обработки исключений
Цепочка вызовов
Механизм исключений
Спаси и Повтори (Rescue и Retry)
Как отказаться сразу
Таблица истории исключений
Примеры обработки исключений
Поломки при вводе
Восстановление при исключениях, сгенерированных операционной системой
Повторение программы, толерантной к неисправностям
N-версионное программирование
Задача предложения rescue
Корректность предложения rescue
Четкое разделение ролей
Когда нет предложения rescue
Продвинутая обработка исключений
Запросы при работе с классом EXCEPTIONS
Какой должна быть степень контроля?
Исключения разработчика
Обсуждение
Дисциплинированные исключения
Должны ли исключения быть объектами?
Методологическая перспектива
Ключевые концепции
Библиографические замечания
У12.1 Наибольшее целое
У12.2 Объект Exception
Взаимодействие с не объектным ПО
Взаимодействие с не объектным ПО
Внешние программы
Улучшенные варианты
Использование внешних программ
ОО-изменение архитектуры (re-architecturing)
Вопрос совместимости: гибридный программный продукт или гибридные языки?
Передача аргументов
Инструкции
Вызов процедуры
Присваивание (Assignment)
Создание (Creation)
Условная Инструкция (Conditional)
Множественный выбор
Циклы
Проверка
Отладка
Повторение вычислений
Выражения
Манифестные константы
Вызовы функций
Текущий объект
Выражения с операторами
Нестрогие булевы операторы
Строки
Ввод и вывод
Лексические соглашения
Ключевые концепции
У13.1 Внешние классы
У13.2 Избегая нестрогих операторов
Многоугольники и прямоугольники
Многоугольники и прямоугольники
Многоугольники
Прямоугольники
Основные соглашения и терминология
Наследование инварианта
Наследование и конструкторы
Пример иерархии
Полиморфизм
Полиморфное присоединение
Что на самом деле происходит при полиморфном присоединении?
Полиморфные структуры данных
Типизация при наследовании
Согласованность типов
Пределы полиморфизма
Экземпляры
Статический тип, динамический тип
Обоснованы ли ограничения?
Может ли быть польза от неведения?
Когда хочется задать тип принудительно
Полиморфное создание
Динамическое связывание
Использование правильного варианта
Переопределение и утверждения
О реализации динамического связывания
Отложенные компоненты и классы
Движения произвольных фигур
Отложенный компонент
Эффективизация компонента
Отложенные классы
Соглашения о графических обозначениях
Что делать с отложенными классами?
Задание семантики отложенных компонентов и классов
Способы изменения объявлений
Повторное объявление функции как атрибута
Обратного пути нет
Использование исходной версии при переопределении
Смысл наследования
Двойственная перспектива
Взгляд на класс как на модуль
Взгляд на класс как на тип
Наследование и децентрализация
Независимость от представления
Парадокс расширения-специализации
Роль отложенных классов
Назад к абстрактным типам данных
Отложенные классы как частичные интерпретации: классы поведения
Не вызывайте нас, мы вызовем вас
Программы с дырами
Роль отложенных классов при анализе и глобальном проектировании
Обсуждение
Явное переопределение
Доступ к предшественнику процедуры
Динамическое связывание и эффективность
Оценка накладных расходов
Статическое связывание как оптимизация
Кнопка под другим именем: когда статическое связывание ошибочно
Подход языка С++ к связыванию
Ключевые концепции
Библиографические замечания
У14.1 Многоугольники и прямоугольники
У14.2 Многоугольник с малым числом вершин
У14.3 Геометрические объекты с двумя координатами
У14.4 Наследование без классов
У14.5 Классы без объектов
У14.6 Отложенные классы и прототип
У14.7 Библиотека поиска в таблицах (семестровый проект)
У14.9 Комплексные числа
Примеры множественного наследования
Примеры множественного наследования
Пример, неподходящий для введения
Может ли самолет быть имуществом?
Числовые и сравнимые значения
Окна - это деревья и прямоугольники
Деревья - это списки и их элементы
Составные фигуры
Брак по расчету
Структурное наследование
Наследование функциональных возможностей
Лунка и кнопка
Оценка
Переименование компонентов
Конфликт имен
Результат переименования
Смена имен и переопределение
Подбор локальных имен
Играем в имена
Использование родительской процедуры создания
Плоские структуры
Плоская форма класса
Применение плоской формы
Краткая плоская форма
Дублируемое наследование
Общие предки
По обе стороны океана
Совместное использование и репликация
Ненавязчивое дублирующее наследование
Правило переименования
Конфликт переопределений
Конфликт при совместном использовании: отмена определения и соединение компонентов
Конфликты при репликации: выделение
Выделение всех компонентов
Сохранение исходной версии при переопределении
Пример повышенной сложности
Дублируемое наследование и универсальность
Правила об именах
Переименование
ОО-разработка и перегрузка
Ключевые концепции
Библиографические замечания
У15.1 Окна как деревья
У15.2 Является ли окно строкой?
У15.3 Завершение строительства
У15.4 Итераторы фигур
У15.5 Связанные стеки
У15.6 Кольцевые списки и цепи
У15.7 Деревья
У15.8 Каскадные или "шагающие" (walking) меню
У15.9 Плоский precursor (предшественник)
У15.10 Дублируемое наследование и репликация
Наследование и утверждения
Наследование и утверждения
Инварианты
Предусловия и постусловия при наличии динамического связывания
Как обмануть клиентов
Как быть честным
Пример
Устранение посредника
Субподряды
Абстрактные предусловия
Правило языка
Замечание математического характера
Глобальная структура наследования
Универсальные классы
Нижняя часть иерархии
Универсальные компоненты
Замороженные компоненты
Запрет повторного объявления
Фиксированная семантика компонентов copy, clone и equality
Не злоупотребляйте замораживанием
Ограниченная универсальность
Вектора, допускающие сложение
Не ОО-подход
Ограничение родового параметра
Игра в рекурсию
И снова неограниченная универсальность
Попытка присваивания
Когда правила типов становятся несносными
Когда правила типов становятся несносными - 2
Проблема
Механизм решения
Правильное использование попытки присваивания
Типизация и повторное объявление
Устройства и принтеры
Одно- и двусвязные элементы
Правило повторного объявления типов
Закрепленные объявления
Несогласованность типов
Примеры из практики
Серьезное затруднение
Понятие опорного элемента
Опорный элемент Current
Еще раз о базовых классах
Правила о закрепленных типах
Когда не используются закрепленные объявления
Статический механизм
Наследование и скрытие информации
Кое-что о политике
Применение
Зачем нужна такая гибкость?
Интерфейс и повторное использование реализаций
Слово в защиту реализаций
Два стиля
Выборочный экспорт
Ключевые концепции
Библиографические замечания
У16.1 Наследование: простота и эффективность
У16.2 Векторы
У16.3 Экстракт?
Проблема типизации
Проблема типизации
Базисная конструкция
Статическая и динамическая типизация
Правила типизации
Реализм
Пессимизм
Статическая типизация: как и почему
Преимущества
Аргументы в пользу динамической типизации
Типизация: слагаемые успеха
"Типизирована ли кроха"?
Типизация и связывание
Ковариантность и скрытие потомком
Ковариантность
Параллельные иерархии
Своенравие полиморфизма
Скрытие потомком
Корректность систем и классов
Практический аспект
Корректность систем: первое приближение
Контравариантность и безвариантность
Использование родовых параметров
Типовые переменные
Полагаясь на закрепление типов
Глобальный анализ
Остерегайтесь полиморфных кэтколлов!
Назад, в Ялту
Одно правило и несколько определений
Оценка
Полное соответствие
Ключевые концепции
Библиографические замечания
Константы базовых типов
Константы базовых типов
Атрибуты-константы
Использование констант
Константы пользовательских классов
Константы с манифестом для этого непригодны
Однократные функции
Применение однократных подпрограмм
Разделяемые объекты
Однократные функции с результатами базовых типов
Однократные процедуры
Параметры
Однократные функции, закрепление и универсальность
Константы строковых типов
Unique-значения
Инициализация: подходы языков программирования
Строковые константы
Unique-значения и перечислимые типы
Ключевые концепции
Библиографические замечания
У18.1 Эмуляция перечислимых типов однократными функциями
У18.2 Однократные функции для эмуляции unique-значений
У18.3 Однократные функции в родовых классах
У18.4 Однократные атрибуты?
-
Основы объектно-ориентированного проектирования
Люди верят заповедям. Сражения за незыблемые "Принципы Истинной Веры" не являются чем-то новым и характерны не только для разработчиков ПО.
Программистская литература, включая ОО-ветвь, учитывает эти естественные желания и предлагает массу рецептов. В результате существует много полезных советов, наряду с еще большим количеством весьма спорных идей.
Следует помнить, что нет простых путей, ведущих к созданию качественного ПО. В предыдущих лекциях несколько раз звучала мысль, что конструирование ПО - это не тривиальная задача, каждый раз бросающая вызов разработчику. За последние годы наше понимание проблем существенно усовершенствовалось, о чем свидетельствует техника, представленная в этой книге. Одновременно выросли наши амбиции и желание создавать проекты больших размеров, работающие быстрее. В конечном счете проблемы остались такими же трудными, как и ранее.
По этим причинам важно понимать достоинства и ограничения, присущие методологии конструирования ПО. От последующих лекций этой книги, как и от всей обширной ОО-литературы, вы имеете право ожидать полезных советов и тех преимуществ, которые может дать опыт людей, создававших ПО. Но ни здесь, и нигде вы не найдете надежного и легкого пути создания качественного ПО.
Методология: что и почему
Как создавать хорошие правила: советы советчикам
Необходимость методологических руководств
Теория
Практика
Повторное использование
Типология правил
Абсолютная положительность
Абсолютная отрицательность
Рекомендации
Исключения
Абстракция и точность
Если это необычно, зафиксируй это
Об использовании метафор
Как важно быть скромным
Библиографические замечания
У1.1 Самоприменение правил
У1.2 Библиотека правил
У1.3 Применение правил
У1.4 Метафоры в сети
Основы объектно-ориентированного проектирования
Многопанельные системы
Первая напрашивающаяся попытка
Функциональное решение: проектирование сверху вниз
Функция переходов
Архитектура программы
Критика решения
Статичность
Объектно-ориентированная архитектура
Закон инверсии
Состояние как класс
Наследование и отложенные классы
Описание полной системы
Класс приложения
Обсуждение
Основы объектно-ориентированного проектирования
Проделки дьявола
Откаты для пользы и для забавы
Многоуровневый откат и повтор: undo и redo
Практические проблемы
Требования к решению
Поиск абстракций
Класс Command
Основной интерактивный шаг
Сохранение последней команды
Действия системы
Как создается объект command
Многоуровневый откат и повтор: UNDO-REDO
Список истории
Реализация Undo
Реализация Redo
Выполнение обычных команд
Аспекты реализации
Аргументы команды
Предвычисленные командные объекты
Представление списка истории
Интерфейс пользователя для откатов и повторов
Роль реализации
Небольшие классы
У3.1 Небольшая интерактивная система (программистский проект)
У3.2 Многоуровневый Redo
У3.3 Undo-redo в Pascal
У3.4 Undo, Skip и Redo
У3.5 Сохранение командных объектов
У3.6 Составные команды
У3.7 Необратимые команды
У3.8 Библиотека команд (проектирование и реализация)
У3.9 Механизм истории
У3.10 Тестирование окружения
У3.11 Интегрируемые функции
Основы объектно-ориентированного проектирования
Изучение документа "технические требования"
Существительные и глаголы
Как избежать бесполезных классов
Нужен ли новый класс?
Пропуск важных классов
Обнаружение и селекция
Сигналы опасности
Большое Заблуждение
Мой класс выполняет...
Императивные имена
Однопрограммные классы
Преждевременная классификация
Классы без команд
Смешение абстракций
Идеальный класс
Общие эвристики для поиска классов
Категории классов
Внешние объекты: нахождение классов анализа
Нахождение классов реализации
Отложенные классы реализации
Нахождение классов проектирования
Другие источники классов
Предыдущие разработки
Адаптация через наследование
Оценивание кандидатов декомпозиции
Находки других подходов
Файлы
Использование ситуаций
КОС (CRC) карты
Подход снизу вверх
Сказка о поиске классов
Метод получения классов
Ключевые концепции
Библиографические замечания
У4.1 Floors как integers
У4.2 Инспектирование объектов
Основы объектно-ориентированного проектирования
Побочные эффекты в функциях
Команды и запросы
Формы побочного эффекта
Ссылочная прозрачность
Объекты как машины
Функции, создающие объекты
Чистый стиль для интерфейса класса
Генераторы псевдослучайных чисел: упражнение
Абстрактное состояние, конкретное состояние
Абстрактное состояние, конкретное состояние - 2
Стратегия
Возражения
Законные побочные эффекты: пример
Много ли аргументов должно быть у компонента?
Важность числа аргументов
Операнды и необязательные параметры (опции)
Принцип
Преимущества, обеспечиваемые Принципом Операндов
Исключения из Принципа Операндов?
Контрольный перечень
Размер класса: Подход списка требований
Определение размера класса
Поддержка согласованности
Запреты и послабления
Активные структуры данных
Представление связного списка
Пассивные классы
Инкапсуляция и утверждения
Критика интерфейса класса
Простые, напрашивающиеся решения
Введение состояния
Поддержка согласованности: инвариант реализации
С точки зрения клиента
Взгляд изнутри
АТД и абстрактные машины
Отделение состояния
Слияние списка и стражей
Выборочный экспорт
Как справляться с особыми ситуациями
Априорная схема
Препятствия на пути априорной схемы
Апостериорная схема
Роль механизма исключений
Эволюция классов. Устаревшие классы
Документирование класса и системы
Показ интерфейса
Документирование на уровне системы
У5.1 Функция с побочным эффектом
У5.2 Операнды и опции
У5.3 Возможные аргументы
У5.4 Число элементов как функция
У5.5 Поиск в связных списках
У5.6 Теоремы в инварианте
У5.7 Двунаправленные списки
У5.8 Альтернативный проект связного списка
У5.9 Вставка в связный список
У5.10 Циклические списки
У5.11 Функции ввода, свободные от побочных эффектов
У5.12 Документация
У5.13 Самодокументированное ПО
Основы объектно-ориентированного проектирования
Как не следует использовать наследование
Покупать или наследовать
Иметь и быть (To have and to be)
Правило изменений
Правило полиморфизма
Резюме
Приложение: техника описателей
Таксомания
Использование наследования: таксономия таксономии
Область действия правил
Ошибочное использование
Общая таксономия
Наследование подтипов
Наследование c ограничением
Наследование с расширением
Подходящая математическая модель
Наследование вариаций
Отмена эффективизации
Наследование с конкретизацией
Структурное наследование
Наследование реализации
Льготное наследование
Использование наследования с отложенными и эффективными классами
Один механизм, или несколько?
Наследование подтипов и скрытие потомков
Определение подтипа
Различные взгляды
Взгляд на подтипы
Необходимость скрытия потомком
Как избежать скрытия потомком
Приложения скрытия потомком
Таксономии и их ограничения
Использование скрытия потомком
Брак по расчету
Это выглядит привлекательно, но правильно ли это?
Как это делается без наследования
Использование кодов символов
Итераторы
Формы льготного наследования
Понимание льготного наследования
Множественные критерии и наследование видов
Классификация при множественных критериях
Наследование вида
Подходит ли нам наследование видов?
Критерии для наследования видов
Как разрабатываются структуры наследования
Специализация и абстракция
Произвольность классификации
Индукция и дедукция
Разнообразие абстракции
Независимость клиента
Совершенствование уровня абстракции
Итоговый обзор: используйте наследование правильно
Приложение: история таксономии
У6.1 Стек, основанный на массиве
У6.2 Метатаксономия
У6.3 Стеки Ханоя
У6.4 Являются ли многоугольники списками?
У6.5 Наследование функциональной вариации
У6.6 Примеры классификации
У6.7 Кому принадлежат итераторы?
У6.8 Наследование типа и модуля
У6.9 Наследование и полиморфизм
Основы объектно-ориентированного проектирования
Общая схема разработки
Структура систем
Эволюция системы
Структура класса
Документация класса
Индексируйте классы.
Использование утверждений
Как обращаться со специальными ситуациями
Повторные объявления
Отложенные классы
Полиморфизм
Формы наследования
Основы объектно-ориентированного проектирования
Дела косметические!
Применение правил на практике
Кратко и явно
Роль соглашений
Самоприменение
Дисциплина и творчество
Выбор правильных имен
Общие правила
Локальные сущности и аргументы подпрограмм
Регистр
Грамматические категории
Стандартные имена
Преимущества согласованного именования
Использование констант
Манифестные и символические константы
Где размещать объявления констант
Заголовочные комментарии и предложения индексации
Комментарии в заголовках: упражнение на сокращение
Заголовочные комментарии предложений feature
Предложения индексирования
Не заголовочные комментарии
Форматирование и презентация текста
Форматирование
Высота и ширина
Детали отступов
Пробелы
Приоритеты и скобки
Война вокруг точек с запятыми
Утверждения
Шрифты
Основные правила
Другие соглашения
У8.1 Стиль заголовочных комментариев
У8.2 Неоднозначность точки с запятой
Основы объектно-ориентированного проектирования
Цели анализа
Задачи
Требования
Облака и провалы
Изменчивая природа анализа
Вклад объектной технологии
Программирование телевизионного вещания
Графики вещания
Сегменты
Программы и реклама
Деловой регламент
Оценка
Представление анализа: разные способы
Методы анализа
Нотация BON (Business Object Notation)
Основы объектно-ориентированного проектирования
Кластеры
Параллельная разработка
Этапы и задачи
Кластерная модель жизненного цикла ПО
Обобщение
Бесшовность и обратимость
Бесшовная разработка
Обратимость: мудрость иногда расцветает слишком поздно
У нас все - лицо
Основы объектно-ориентированного проектирования
Профессиональная подготовка (тренинг) в индустрии
Вводные курсы
Филогенез и онтогенез
Вымощенная дорога к другим подходам
Выбор языка
Другие курсы
Терминология
Среднее и высшее образование
Курсы для аспирантов
Полный учебный план (curriculum)
Вперед к новой педагогике для программистов
Стратегия "от потребителя к производителю"
Абстракция
Ученичество
Обращенный учебный план
Политика многих семестров
Объектно-ориентированный план
Основы объектно-ориентированного проектирования
Предварительный просмотр
Возникновение параллельности
Мультипроцессорная обработка
Многозадачность
Посредники запросов объектов (брокеры объектных запросов - Object Request Broker)
От процессов к объектам
Сходство
Активные объекты
Конфликт активных объектов и наследования
Программируемые процессы
Введение параллельного выполнения
Процессоры
Природа процессоров
Операции с объектом
Дуальная семантика вызовов
Сепаратные сущности
Получение сепаратных объектов
Объекты здесь и там
Параллельная архитектура
Распределение процессоров: файл управления параллелизмом (Concurrency Control File)
Библиотечные механизмы
Правила обоснования корректности: разоблачение предателей
Импорт структур объекта
Вопросы синхронизации
Синхронизация versus взаимодействия
Механизмы, основанные на синхронизации
Механизмы, основанные на взаимодействии
Синхронизация параллельных ОО-вычислений
Доступ к сепаратным объектам
Параллельный доступ к объекту
Резервирование объекта
Ожидание по необходимости
Мультипускатель
Устранение блокировок (тупиков)
Условия ожидания
Буфер - это сепаратная очередь
Предусловия при параллельном выполнении
Парадокс предусловий
Параллельная семантика предусловий
Последовательные и параллельные утверждения
Ограничение проверки правильности
Состояния и переходы
Запросы специальных услуг
Экспресс сообщения
Дуэли и их семантика
Обработка исключений: алгоритм "Секретарь-регистратор"
О том, что будет дальше в этой лекции
Примеры
Обедающие философы
Полное использование параллелизма оборудования
Полное использование параллелизма оборудования - 2
Замки
Сопрограммы (Coroutines)
Система управления лифтом
Сторожевой механизм
Организация доступа к буферам
О правилах доказательств
Резюме параллельного механизма
Синтаксис
Ограничения
Семантика
Минимальность механизма
Полное использование наследования и других ОО-методов
Совместимость с Проектированием по Контракту
Поддержка различия между командами и запросами
Применимость ко многим видам параллельности
Адаптируемость с помощью библиотек
Поддержка программирования сопрограмм
Поддержка использования непараллельного ПО
Поддержка устранения блокировок
Допускается ли одновременный доступ?
Ключевые концепции
У12.1 Принтеры
У12.2 Почему импорт должен быть глубоким
У12.3 "Аномалия наследования"
У12.4 Устранение тупиков (проблема для исследования)
У12.5 Приоритеты
У12.6 Файлы и парадокс предусловия
У12.7 Замки (Locking)
У12.8 Бинарные семафоры
У12.9 Целочисленные семафоры
У12.10 Контроллер сопрограмм
У12.11 Примеры сопрограмм
У12.12 Лифты
У12.13 Сторожа и принцип визитной карточки
У12.14 Однократные подпрограммы и параллельность
Основы объектно-ориентированного проектирования
Сохраняемость средствами языка
Сохранение и извлечение структур объектов
Форматы сохранения
Вне рамок замыкания сохраняемости
Эволюция схемы
Наивные подходы
Преобразование объектов на лету
Выявление
Извещение
Исправление
От сохраняемости к базам данных
Объектно-реляционное взаимодействие
Определения
Операции
Запросы
Использование реляционных баз данных с ОО-ПО
Основания ОО-баз данных
На чем застопорились реляционные БД
Идентичность объектов
Пороговая модель
Дополнительные возможности
Версии объекта
Версии классов и эволюция схемы
Длинные транзакции
Блокировка
ОО-СУБД: примеры
Matisse
Versant
Обсуждение: за пределами ОО-баз данных
Является ли "ОО-база данных" оксюмороном?
Неструктурированная информация
Библиографические замечания
У13.1 Динамическая эволюция схем
У13.2 Объектно-ориентированные запросы
Основы объектно-ориентированного проектирования
Необходимые средства
Конечные пользователи, разработчики приложений и разработчики инструментальных средств
Графические системы, оконные системы, инструментальные средства
Библиотека и конструктор приложений
Применение ОО-подхода
Переносимость и адаптация к платформе
Графические абстракции
Фигуры (изображения)
Координаты
Операции над окнами
Графические классы и операции
Механизмы взаимодействия
События
Контексты и объекты интерфейса пользователя
Обработка событий
Команды
Базисная схема
Состояния
Приложения
Контекст-Событие-Команда-Состояние: резюме
Математическая модель
Основы объектно-ориентированного проектирования
Немного контекста
Пакеты
Реализация стеков
Простой интерфейс
Использование пакета
Реализация
Универсальность
Скрытие представления: частная история
Упрощение управляющей структуры
Возбуждение и обработка исключений
ОО-механизмы языка Ada 95: пример
Ada 95 и объектная технология: оценка
Обсуждение: наследование модулей и типов
Вперед к ОО-языку Ada
У15.1 Как выиграть, не используя скрытия
У15.2 Родовые параметры подпрограммы
У15.3 Классы как задачи (для программистов Ada)
У15.4 Добавление классов к Ada
У15.5 Пакеты-классы
Основы объектно-ориентированного проектирования
Уровни языковой поддержки
ОО-программирование на языке Pascal?
Собственно Pascal
Модульные расширения языка Pascal
ОО-расширения языка Pascal
Fortran
Техника COMMON
Техника подпрограммы с множественным входом
ОО-программирование и язык C
Основные положения
Эмуляция объектов
Эмулирующие классы
OO C: оценка
У16.1 Графические объекты (для программистов на Fortran)
У16.2 Универсальность (для программистов на C)
У16.3 ОО-программирование на C (семестровый проект)
Основы объектно-ориентированного проектирования
Simula
Основные понятия
Доступность
Основные черты языка
Пример
Концепции сопрограмм
Пример сопрограммы
Последовательное выполнение и наследование
Моделирование
Пример моделирования
Simula: оценка
Smalltalk
Языковой стиль
Сообщения
Окружение и производительность
Smalltalk: оценка
Расширения Lisp
Расширения C
Objective-C
C++
Сложность
C++: оценка
Java
Другие ОО-языки
Расширения C: Objective-C, C++
Другие языки
У17.1 Остановимся на коротких файлах
У17.2 Неявный вызов
У17.3 Эмулирующие сопрограммы
У17.4 Моделирование
У17.5 Ссылка на версию предка
Основы объектно-ориентированного проектирования
Компоненты среды
Язык
Развитие
Открытость
Технология компиляции
Требования к компиляции
Технология тающего льда
Анализ зависимостей
Предкомпиляция
Удаленное выполнение
Оптимизация
Инструментальные средства
Bench и процесс разработки
Инструментальные средства высокого уровня
Библиотеки
Реализация интерфейса
Платформы
Перенастройка и просмотр
Извлечения из библиотек Base
Основы объектно-ориентированного проектирования
Универсальность и (versus) наследование
Неограниченная универсальность
Ограниченная универсальность
Наследование
Эмуляция наследования с помощью универсальности
Эмуляция универсальности с помощью наследования
Эмуляция ограниченной универсальности: обзор
Ограниченная универсальность: подпрограммы
Ограниченная универсальность: пакеты
Сочетание универсальности и наследования
Библиографические замечания
УB.1 Искусственные якоря
УB.2 Бинарные деревья и бинарные деревья поиска
УB.3 Более просто используемые матрицы
УВ.4 Полная реализация очередей
-
Основы программирования
Понятие алгоритма - одно из основных понятий программирования и математики. Алгоритм - это последовательность команд, предназначенная исполнителю, в результате выполнения которой он должен решить поставленную задачу. Алгоритм записывается на формальном языке, исключающем неоднозначность толкования. Исполнитель - это человек, компьютер, автоматическое устройство и т.п. Он должен уметь выполнять все команды, составляющие алгоритм, причем механически, "не раздумывая".
Запись алгоритма на формальном языке называется программой. Иногда само понятие алгоритма отождествляется с его записью, так что слова "алгоритм" и "программа" - почти синонимы. Небольшое различие заключается в том, что при упоминании алгоритма, как правило, имеют в виду основную идею его построения, общую для всех алгоритмических языков. Программа же всегда связана с записью алгоритма на конкретном формальном языке.
Алгоритмические языки
Управляющие конструкции алгоритмического языка
Понятие переменной
Основы программирования
Типы переменных
Целочисленные переменные
Кольцо вычетов по модулю m
Интерпретация положительных и отрицательных чисел
Вещественные переменные
Машинный эпсилон
Запись вещественных констант
Основы программирования
Символьные переменные
Логические переменные и выражения
Массивы
Текстовые строки
Основы программирования
Значения "минус" и "плюс бесконечность"
Схема Горнера
Арифметический цикл
Индуктивные функции на последовательностях и индуктивные расширения
Основы программирования
Общая схема
Алгоритм Евклида вычисления наибольшего общего делителя
Быстрое возведение в степень
Вычисление логарифма без использования разложения в ряд
Расширенный алгоритм Евклида
Нахождение корня функции методом деления отрезка пополам
Основы программирования
Устройство компьютера
Оперативная память
Процессор
CISC и RISC-процессоры
Алгоритм работы компьютера
Аппаратный стек
Команды вызова подпрограммы call и возврата return
Аппаратный стек и локальные переменные подпрограммы
Основы программирования
RTL: машинно-независимый Ассемблер
Примеры программ на RTL и Ассемблере Intel 80x86
Вычисление наибольшего общего делителя
Суммирование массива
Внешние устройства и аппаратные прерывания
Виртуальная память и поддержка параллельных задач
Страничная организация памяти
Переключение между процессами и нитями
Основы программирования
Основы языка Си
Структура Си-программы
Функции
Программа "Hello, World!"
Типы переменных
Базовые типы
Целочисленные типы
Тип int
Тип char
Типы short и long
Модификатор unsigned
Вещественные типы
Логический тип
Оператор sizeof
Тип void
Конструирование новых типов
Массивы
Указатели
Сложные описания
Строки
Модификатор const
Модификатор volatile
Оператор typedef
Выражения
Оператор присваивания
Арифметические операции
Операции увеличения и уменьшения
Операции "увеличить на", "домножить на" и т.п.
Логические операции
Операции сравнения
Побитовые логические операции
Операции сдвига
Арифметика указателей
Связь между указателями и массивами
Операция приведения типа
Основы программирования
Управляющие конструкции
Фигурные скобки
Оператор if
Выбор из нескольких возможностей: if...else if...
Пример: решение квадратного уравнения
Цикл while
Пример: вычисление квадратного корня методом деления отрезка пополам
Выход из цикла break, переход на конец цикла continue
Оператор перехода на метку goto
Цикл for
Операция "запятая" и цикл for
Конструкции, которые лучше не использовать
Цикл do...while
Оператор switch (вычисляемый goto)
Прототипы функций
Пример: вычисление наибольшего общего делителя
Передача параметров функциям
Пример: расширенный алгоритм Евклида
Работа с памятью
Статическая память
Стековая, или локальная, память
Динамическая память, или куча
Пример: печать n первых простых чисел
Операторы new и delete языка C++
Структуры
Структуры и указатели
Пример: рекурсивный обход дерева
Структуры и оператор определения типа typedef
Основы программирования
Представление матриц и многомерных массивов
Пример: приведение матрицы к ступенчатому виду методом Гаусса
Работа с файлами
Открытие файла: функция fopen
Константа NULL
Диагностика ошибок: функция perror
Функции бинарного чтения и записи fread и fwrite
Закрытие файла: функция fclose
Пример: подсчет числа символов и строк в текстовом файле
Форматный ввод-вывод: функции fscanf и fprintf
Понятие потока ввода или вывода
Функции scanf и printf ввода и вывода в стандартные потоки
Функции текстового преобразования sscanf и sprintf
Другие полезные функции ввода-вывода
Работа с текстами
Определение типов символов
Работа с текстовыми строками
Копирование строк
Работа с произвольными массивами байтов
Сравнение строк
Поиск
Пример: программа "Записная книжка"
Аргументы командной строки
Разработка больших проектов
Основы программирования
Структуры данных
Общее понятие структуры данных
Массив как базовая структура
Реализация одних структур на базе других
Простейшие структуры данных. Стек. Очередь
Очередь
Реализация очереди на базе массива
Стек
Использование стека в программировании
Реализация стека на базе массива
Реализация стека на языке Си
Использование функции assert для проверки утверждений и ситуация отказ
Стековый калькулятор и обратная польская запись формулы
Реализация стекового калькулятора на Си
Язык PostScript
Основы программирования
Ссылочные реализации структур данных
Массовые операции
Список
Ссылочная реализация списка
Деревья и графы
Множество
Реализации множества: последовательный и бинарный поиск, хеширование
Бинарный поиск
Реализации множества на базе деревьев
AVL-деревья
Красно-черные деревья
Хеширование
Циклы для каждого и итераторы
-
Основы программирования на языке Пролог
В октябре 1981 года Японское министерство международной торговли и промышленности объявило о создании исследовательской организации — Института по разработке методов создания компьютеров нового поколения (Institute for New Generation Computer Technology Research Center). Целью данного проекта было создание систем обработки информации, базирующихся на знаниях. Предполагалось, что эти системы будут обеспечивать простоту управления за счет возможности общения с пользователями при помощи естественного языка. Эти системы должны были самообучаться, использовать накапливаемые в памяти знания для решения различного рода задач, предоставлять пользователям экспертные консультации, причем от пользователя не требовалось быть специалистом в информатике. Предполагалось, что человек сможет использовать ЭВМ пятого поколения так же легко, как любые бытовые электроприборы типа телевизора, магнитофона и пылесоса. Вскоре вслед за японским стартовали американский и европейский проекты.
Появление таких систем могло бы изменить технологии за счет использования баз знаний и экспертных систем. Основная суть качественного перехода к пятому поколению ЭВМ заключалась в переходе от обработки данных к обработке знаний. Японцы надеялись, что им удастся не подстраивать мышление человека под принципы функционирования компьютеров, а приблизить работу компьютера к тому, как мыслит человек, отойдя при этом от фон неймановской архитектуры компьютеров. В 1991 году предполагалось создать первый прототип компьютеров пятого поколения.
Основы программирования на языке Пролог
Алгоритм приведения произвольной формулы исчисления предикатов к множеству дизъюнктов
Алгоритм унификации
Основы программирования на языке Пролог
Основные понятия Пролога
Семантические модели Пролога
Самостоятельные задания
Рекурсия
Самостоятельные задания
Основы программирования на языке Пролог
Основы Турбо Пролога. Структура программы на Турбо Прологе
Структура программы на Турбо Прологе
Директивы компилятора
Раздел описания констант
Раздел описания доменов
Раздел описания предикатов внутренней базы данных
Раздел описания предикатов
Раздел описания предложений
Раздел описания внутренней цели
Предикаты ввода-вывода
Самостоятельные задания
Управление выполнением программы на Прологе
Списки
Самостоятельные задания
Основы программирования на языке Пролог
Сортировка списков
Пузырьковая сортировка
Сортировка вставкой
Сортировка выбором
Быстрая сортировка
Сортировка слияниями
Самостоятельные задания
Основы программирования на языке Пролог
Множества
Самостоятельные задания
Деревья
Самостоятельные задания
Строки
Самостоятельные задания
Файлы
Самостоятельные задания
Внутренние (динамические) базы данных
Самостоятельные задания
Пролог и искусственный интеллект
Самостоятельные задания
-
Основы программирования с помощью MFC
В связи с тем, что сегодня уровень сложности программного обеспечения очень высок, разработка приложений Windows с использованием только какого-либо языка программирования (например, языка C) значительно затрудняется. Программист должен затратить массу времени на решение стандартных задач по созданию многооконного интерфейса. Реализация технологии связывания и встраивания объектов - OLE - потребует от программиста еще более сложной работы.
Чтобы облегчить работу программиста практически все современные компиляторы с языка C++ содержат специальные библиотеки классов. Такие библиотеки включают в себя практически весь программный интерфейс Windows и позволяют пользоваться при программировании средствами более высокого уровня, чем обычные вызовы функций. За счет этого значительно упрощается разработка приложений, имеющих сложный интерфейс пользователя, облегчается поддержка технологии OLE и взаимодействие с базами данных.
Использование класса CTab Ctrl Ernest Avagyan
Оптимизация вывода графики на экран Ernest Avagyan
Проигрывание Wave-файлов под MF Ernest Avagyan
Простая программа, использующая MDI интерфейс
Работа с WinSocket Ernest Avagyan
Создание простого FTP-клиента Ernest Avagyan
Создание простого HTTP-клиента Ernest Avagyan
Создание собственных ActiveX элементов Ernest Avagyan
Классы в C++ Ernest Avagyan
Применение указателей в C++ Ernest Avagyan
Структуры в С++ Ernest Avagyan
Использование таймера Ernest Avagyan
Пример использования MFC в Ernest Avagyan
Работа с библиотеками динамической компоновки (DLL) Ernest Avagyan
Работа со стандартными ресурсамиErnest Avagyan
Основы программирования с помощью библиотеки MFC
-
Основы функционального программирования
Общее представление о функциональном программировании и его применении
Идея функционального программирования опирается на интуитивное понятие о функциях как о достаточно общем механизме представления и анализа решений сложных задач. Механизм функций основательно изучен математиками, и это позволяет программистам наследовать выверенные построения, обладающие предельно высокой моделирующей силой [1]. Систематическое применение функционального программирования впервые достаточно ярко было продемонстрировано Джоном Мак-Карти и его учениками в методах реализации языка Лисп и программирования на этом языке. Наиболее очевидные из этих методов были успешно ассимилированы другими языками и системами программирования. Обычно про функциональное программирование вспоминают при смене технологий, когда возрастает роль аналитики и исследовательских задач. В настоящее время часто употребляют термин "функциональность" при сравнительной характеристике информационных систем, что, видимо, свидетельствует о проявлении новой метрики, заслуживающей отдельного рассмотрения
Математические основы функционального программирования
Лисп и принципы технической поддержки
Пример 2.1
Основы символьной обработки. Базовые средства
Природа данных
Самоописание обработки символьных выражений
Подобие машинным языкам
Данные
Точечная нотация
Основные понятия: программа, функции и выражения
Пример 3.1
Общий подход к обработке символьных выражений и представлению программ
Универсальная функция
Основные методы обработки списков
Определение универсальной функции
Предикаты и истинность в Лиспе
Основы функционального программирования
Пример 4.1
Отображения структур данных и функционалы
Числа и мультиоперации
Функционалы - общее понятие
Безымянные функции
Композиции функционалов, фильтры, редукции
Встроенные функционалы (Clisp)
Подведение итогов
Для самостоятельного решения
Пример 5.2
Интерпретирующая система. Реализационное уточнение интерпретации
Переменные
Константы
Функции
Функции на машинном языке (низкоуровневые)
Специальные формы
Неподвижная точка и самоприменимость функций
Программы для Лисп-интерпретатора.
Пример 6.1
Prog-выражения и циклы
Списки свойств атомов и структура списков
Представление структуры списка
Деструктивные (разрушающие) преобразования структуры списков
Список свободной памяти и сборщик мусора
Гибкий интерпретатор
Пример 7.1
Низкоуровневое программирование. Ассемблер
Абстрактная Лисп-машина. Система команд
Функциональная модель процессора абстрактной машины
Пример 8.1
Компилятор и требования к коду программы
Требования к компиляции Лисп-программ
Компиляция. Венский метод. Операционная семантика
Определение Лисп-компилятора на Лиспе
Основы функционального программирования
Сборка системы и ее рабочий цикл
Реализация динамической памяти и структур данных
Реальный состав системы и внешний мир
Общее представление о декомпозиции программ
ООП на Лиспе
Множественное наследование
Определяемые объекты
Функциональный синтаксис
Экземпляры
Векторная реализация
Еще одна реализация
Средства ООП в CLOS на базе стандарта Clisp
Классы и экземпляры объектов
Свойства слотов
Суперкласс
Недетерминированные процессы
Пересечение множеств A и B
Логические связки
Реализация недетерминированных моделей
Обработка множеств и последовательностей
Пример 12.1
Замедленные вычисления
Смешанные вычисления
Асинхронные процессы и параллелизм
Ранжирование функций
Конструирование распознавателей
Преобразование определений
Построение теорий при разработке программ
Макетирование функций
Мемо-функции и тестирование
Итоги и выводы
Практические аспекты
Развитие парадигм программирования
-
Парадигмы программирования
Знакомое нам из философии слово "парадигма" имеет в информатике и программировании узко профессиональный смысл, сближающий их с лингвистикой. Парадигма программирования как исходная концептуальная схема постановки проблем и их решения является инструментом грамматического описания фактов, событий, явлений и процессов, возможно, не существующих одновременно, но интуитивно объединяемых в общее понятие.
Каждая парадигма программирования имеет свой круг приверженцев и класс успешно решаемых задач. Приняты разные приоритеты при оценке качества программирования, отличаются инструменты и методы работы и соответственно - стиль мышления и изобразительные средства. Нелинейность развития понятий, зависимость их обобщения от индивидуального опыта и склада ума, чувствительность к моде и внушению позволяют выбору парадигм в системе профессиональной подготовки информатиков влиять на восприимчивость к новому.
Пример 2.1
Определение языков программирования
Универсальная функция
Ассемблер
Пример 4.1
Машинно ориентированное программирование
Пример 5.1
Языки макрообработки текстов
Парадигмы программирования
Языки управления процессами
Базовые понятия
Реализация процессов
Взаимодействие параллельных процессов
Пример 7.1
Функциональное программирование
Данные и программы
Пример 8.1
Стандартное (системное) программирование
Декларативное программирование
Парадигмы программирования
Пример 10.1
Объектно-ориентированное программирование
Классы и экземпляры объектов
Свойства слотов
Суперкласс
Пример 11.1
Языки параллельного программирования
Парадигмы программирования
Функции высших порядков
Ранжирование функций
Конструирование распознавателей
Преобразование определений
Парадигмы программирования
Пример 13.1
Оптимизация программ
Ленивые вычисления
Смешанные вычисления
Компилятор и требования к коду программы
Компиляция. Венский метод. Операционная семантика
Разработка программ
Динамика представлений программ
Теоретический каркас
Трудоемкость технологий
Макеты и прототипы
Накопление результатов
Жизненный цикл
Заключение
Распределенные информационные системы
Компонентное программирование
Анализ функционирования
Моделирование парадигм программирования
-
Параллельное программирование
Реализация языка логического программирования ПРОЛОГ на ВС SPMD-архитектуры
Рассмотрим упрощенную задачу в виде ПРОЛОГ-программы, содержащую все характерные элементы решения задачи удовлетворения (сложной) цели на основе базы знаний.
Нахождение последнего элемента списка
Поиск и исключение элемента списка
Параллельное программирование
Принцип работы БД с циркулирующей информацией
Архитектуры ротационных БД
Эффективность и технические требования
Сетевые базы данных с циркулирующими запросами-предложениями
Многосерверные сетевые БД с циркулирующей информацией
Параллельное программирование
Концепция построения вычислительных комплексов на базе локальной вычислительной сети
Сложность алгоритма и проблема распараллеливания
Анализ сетевых топологий и обоснование
Звездообразная сеть IBM Token Ring, ARCnet)
Кольцевая сеть FDDI, IBM Token Ring)
Шинная организация (Ethernet, ARCnet)
Управление обменом в сети типа "шина"
Локальная сеть Ethernet
Организация параллельного решения задачи в локальной сети
Параллельное программирование
Предпосылки методов
Графический метод решения и его обобщение
Общий алгоритм перебора
Пример применения параллельной процедуры прямого перебора
Сложность алгоритма прямого перебора
Пример
Общий алгоритм
Сложность алгоритма
План параллельных вычислений
Параллельное решение задачи целочисленного линейного программирования
Параллельное программирование
Постановка задачи и планы решения
Параллельный алгоритм решения
О применении схемы Гаусса решения систем линейных уравнений в транспортной задаче
Пример
Исходные построения
Алгоритм
Пример
Параллельное выполнение алгоритма
Параллельное программирование
Параллельное решение задач НП при линейных ограничениях
Параллельное решение "плоской" задачи НП
Предпосылки метода
Принцип внешней точки
Основные предположения
Особенности применения косинуса как функции меры угла
Алгоритм. Пример
Развитие стратегии решения задачи ЛП
Оценка сложности
Параллельное программирование
Неформальная постановка задач параллельного программирования ВС
Граф-схемы параллельных алгоритмов
Временные оценки на информационных графах
Нижняя оценка минимального числа
Нижняя оценка минимального времени выполнения данного алгоритма на ВС
Решение задачи 1 распараллеливания для однородных ВС
Решение задачи 2 распараллеливания для однородных ВС
Параллельное программирование
Общая схема параллельных вычислений при обслуживании потока заявок (в АСУ)
Особенности параллельного вычислительного процесса в системе реального времени
Классификация
Централизованное диспетчирование
Децентрализованное диспетчирование в многоканальном и многоциклическом режиме
Комбинированное диспетчирование в ВС с очередью
Управление процессами в МВК семейства "Эльбрус"
Распараллеливание в МВК. Семафоры
Реализация конвейера на симметричной ВС
Технология data flow на уровне процедур и процессов в симметричной ВС
Схема организации параллельного процесса
Диспетчирование
Параллельное программирование
Частичная упорядоченность работ отсутствует
Диспетчер распределения частично упорядоченного множества работ в однородной ВС
Формальное описание алгоритма диспетчера
Информационные графы с векторными весами вершин
Диспетчер последовательного назначения для неоднородной ВС
Средства синхронизации параллельных процессов
Средства синхронизации параллельных процессов - 2
Основные понятия
Задачи синхронизации
Параллельное программирование
Оценка производительности ВС
Помехоустойчивые вычисления
Особенности обеспечения надежности ВС
Оценка надежностных характеристик ВС при испытаниях
Основные направления исследований в области Grid-технологий
Немного истории
Grid-технологии решения информационных задач
Известные проекты Grid-технологии решения вычислительных задач
Основы проектирования Центра Grid-технологий
-
Пособие по практике программирования
Пособие по практике программирования
Эта книга построена как раз на основных принципах, применимых к информационным технологиям на любом уровне. К таким взаимосвязанным принципам относятся: простота, благодаря которой программы остаются короткими и управляемыми, четкость и ясность, которые облегчают понимание программ и людям, и машинам, обобщенность, означающая, что программа способна корректно работать в широком диапазоне ситуаций и нормально адаптироваться к новым ситуациям, и автоматизация, которая позволяет передавать машине наиболее утомительные и скучные части нашей работы. Рассматривая программирование на различных языках, от алгоритмов и структур данных, через проектирование, отладку, тестирование, до улучшения производительности, мы иллюстрируем универсальные концепции, которые не зависят ни от языка, ни от операционной системы, ни от конкретного задания.
Книга родилась из нашего многолетнего опыта в написании и поддержке разнообразнейших программ, в преподавании программирования и в общении с большим количеством программистов. Мы хотим поделиться знаниями, приобретенными благодаря этому опыту, чтобы помочь программистам всех уровней работать более эффективно и профессионально.
Дополнительная литература
Имена
Комментарии должны
Макрофункции
Этот фрагмент тщательно написан, форматирован
что программисты используют длинные имена
в названиях как Q, Queue
и понятны. Последняя версия тоже
с поддержкой синтаксиса уменьшает вероятность
Прочитайте вслух следующее
в отдельный оператор, тогда цикл
Используйте естественную форму выражений. Записывайте
В следующем примере проверки високосности
только разобрав все возможные варианты
с поддержкой синтаксиса уменьшает вероятность
Стандартную форму записи цикла воспринять
Стандартную форму записи цикла воспринять
в переменную будет записано мусорное
в переменную будет записано мусорное
в памяти выделяется для элементов
в памяти выделяется для элементов
Никогда не следует употреблять gets,
Никогда не следует употреблять gets,
Условия читаются сверху вниз; по
Условия читаются сверху вниз; по
Последовательность условных операторов заставляет нас
Последовательность условных операторов заставляет нас
Мы производим проверки до тех
Мы производим проверки до тех
В данном фрагменте выравнивание выполнено
Здесь используется замысловатая последовательность перескоков
с лихвой окупается увеличением ясности.
В этом примере фигурные скобки
в этом фрагменте кода на
Вычисление квадратного корня будет производиться
в коде присутствуют числа 20,
Теперь стало гораздо понятнее, что
Мы рекомендуем использовать различные явные
таки размер массива задается лишь
Все эти комментарии надо удалить,
Эти комментарии также стоит удалить,
Иногда код действительно сложен, возможно,
В этом содержательном комментарии имеется
В отрицаниях всегда легко запутаться,
He противоречьте коду. Как правило,
что надо сделать, это переписать
и комментарий соответствуют друг другу,
идиома языка С, предназначенная для
Если нескольких слов недостаточно для
Студентам внушают, что комментировать надо
Стиль
Стилевое единство и идиомы
Стоит ли так беспокоиться?
Составьте комментарий, объясняющий принцип выбора
Перечислите все возможные варианты, которые
Перепишите выражения
Определите все проблемы, связанные
Как бы вы переписали приведенные
Выражения
Загадочные числа
Алгоритмы и структуры данных
Алгоритмы и структуры данных
Библиотеки
Быстрая сортировка на языке Java
Деревья
Динамически расширяемые массивы
Дополнительная литература
Хэш-таблицы
О большое
Если каждый раз аккуратно выбирать
Поиск
Функция поиска должна знать, сколько
в качестве параметра массив строк
Для объемистого массива вроде этого
Объединяя все это вместе, мы
Операция swap, которая меняет местами
При разделении прежде всего случайным
Мы могли бы написать эту
Для сортировки элементов массива строк
большое по абсолютному значению отрицательное
в случае qsort, функция сравнения
Это похоже на scmp, только
Данным способом можно сортировать только
sort использует cmp для сравнения
Генерация случайного номера происходит
в Java генератор случайных чисел
с объектом сравнения строк, созданным
Функция addname возвращает индекс только
Вызов memmove сдвигает массив, перемещая
Однако мы предпочитаем использовать memmove,
Есть несколько важных различий между
Функцию emalloc мы будем использовать
у него может измениться первый
Чтобы сделать addend операцией порядка
в принципе, эту оценку не
указатель на функцию, которая принимает
тогда вызывать мы ее будем
He каждую операцию над списками
Память нельзя использовать после того,
f reeall, delitem не освобождает
В качестве конкретного примера на
в каждой вершине дерева хранится
У нас есть еще пара
После того как мы научились
Эта последовательность действий используется, когда
Восходящий порядок применяется, когда операция
а массив соответствующего размера выделяется
и возможная вставка комбинируются часто.
В вычислениях символы принимаются неотрицательными
Хорошо ли она перемешивает короткие
Сортировка
Списки
Алгоритм быстрой сортировки проще всего
в Java делает несколько преобразований
Каковы входные данные для алгоритма
и реализуйте алгоритм, который будет
В приведенном выше коде функция
и addname, чтобы удаленные элементы
Реализуйте некоторые другие операции над
и итеративную версии процедуры reverse,
Напишите обобщенный тип List для
и реализуйте набор тестов для
и nrlookup. Насколько рекурсия медленнее
Используйте фланговый обход для создания
и реализуйте набор тестов, удостоверяющих,
функция замечательна для повседневного хэширования
Напишите функцию для доступа
Измените функцию lookup так, что
функцию для хранения координат точек
При выборе алгоритма нужно сделать
Проектирование и реализация
Алгоритм цепей Маркова
AWK и PERL
C++
и основанный на сбалансированных деревьях
Дополнительная литература
Генерация вывода
Java
Обработка этого текста по предлагаемому
В этом описании определяются количество
функция для префиксов, которые являются
Выполнив схожим образом модификацию алгоритма
Обратите внимание на то, что
если бы не эта проблема,
идиоматический способ удаления из массива.
Мы разделили процесс обновления состояния
Обратите внимание на алгоритм случайного
На этом разработка программы на
Второй класс, Chain, считывает ввод,
Второй класс, Chain, считывает ввод,
в нем содержится функция main
в нем содержится функция main
После того как создан экземпляр
После того как создан экземпляр
таблицы вектор суффиксов для текущего
таблицы вектор суффиксов для текущего
Обратите внимание на то, что
Обратите внимание на то, что
В нашей реализации будут три
Два конструктора Prefix создают новые
P refix имеет также два
Метод equals осуществляет поэлементное сравнение
Программа на Java гораздо меньше,
Функция build использует библиотеку lost
Строка buf будет расти по
Как вы видите, выражения выглядят
в результате именно эта версия
входной поток читается по строке
в предыдущей программе, отображение хранится
Проектирование и реализация
Производительность
Создание структуры данных в языке С
Алгоритм случайного выбора элемента из
то каждое слово окажется записанным
Удалите выражения, которые помещают сигнальные
Одно из главных преимуществ использования
в ней использовались только классы
Попробуйте преобразовать приложения на Awk
Мы видели множество версий этой
Программа markov имеет длинную историю.
несмотря на то что структуры
то уже описал эти структуры
Варианты структуры данных
Интерфейсы
Abort, Retry, Fail?
Библиотека для распространения
в двойные кавычки, могут содержать
Мы должны будем наращивать память
и недопонимание при разделении ответственности
в кавычки, может содержать символыдвойных
Дополнительная литература
Интерфейсы
Пользовательские интерфейсы
Этот формат используется для чтения
Сразу ясно, что второй способ
следующая за аббревиатурами биржевых сводок,
При выводе printf заключает поля
При выводе printf заключает поля
При таком вводе наш прототип
в себя пример формата ввода,
с данными вроде приведенных выше.
и внутренние функции вроде split
Переменные инициализируются также статически. Эти
в строке line, которая при
Функция endof line нужна для
Здесь необходима отдельная функция, поскольку
Каждая строка содержит по три
В теле цикла массив указателей
Поскольку входная строка уже разделена,
Наконец мы можем модифицировать тестирующую
С завершена. Она обрабатывает строки
Для конструктора определены параметры, принимаемые
здесь переопределяется, чтобы добавлять символ
Поскольку strcspn не работает со
в новой функции advplain, которая
getnfield настолько коротка, что воплощена
Тестовая программа представляет собой несколько
незначительно отличается от версии на
Таким образом, реализация получается абсолютно
Если потоком является stdout, то
в ней являются всего лишь
Если аргумент формата оканчивается двоеточием
Функция emalloc предоставляет аналогичные возможности
в заголовочном файле eprintf.
в любой файл, вызывающий одну
Типичный пример использования выглядит примерно
функции вполне подходящими для наших
в csvgetline, возвращать NULL вне
Обратите внимание на то, что
Имя программы, вырабатываемое функцией prog
Принципы интерфейса
Одна из наиболее известных среди
Прототип библиотеки
Реализация на C++
Управление ресурсами
При разделении полей возможно несколько
для разных полей существовали разные
В нашей реализации библиотеки мы
и реализуйте библиотеку для записи
к полям можно было обращаться
Напишите библиотеку CSV на Java,
версию кода CSV
предоставляет возможность нескольким независимым экземплярам
Значения, разделенные запятой
Отладка
Чужие ошибки
выдает неожиданный результат, то ошибка
Дополнительная литература
Хорошие подсказки, простые ошибки
Невоспроизводимые ошибки
Отладчики
Отладка
Последняя надежда
Признаком этой ошибки иногда бывают
Другой обычной ошибкой является использование
Довольно скоро nocjje опробования программы
Мы сделали так, что check
После исправления ошибки не выбрасывайте
в журнальном файле. Функции вывода
Используйте различные инструменты. Используйте возможности
Или после редактирования случайно остается
в вызове процедуры. Если проверка
Как выяснилось, поразительно трудно заметить,
К тому моменту, когда указатель,
в функции printf берет длину
что strings не читает стандартный
Входными данными служила любая строка
что требуют для демонстрации ошибки
Средства отладки
Трудные ошибки, нет зацепок
Тот же самый процесс двоичного
в которой все еще было
и free, которыми можно пользоваться
Программа strings печатает строки длиной
Что выдает vis, если во
Расширьте функциональность программы vis, чтобы
При правильном подходе отладка может
Тестирование
Автоматизация тестирования
Дополнительная литература
Кто осуществляет тестирование?
Полезные советы
Первое граничное условие
в уме первый reef, мы
Проверка граничных условий может обнаружить
Что будет делать эта функция,
в том, что программа защищена
Последствия ошибок вывода могут быть
Этот отрывок должен распечатывать символы
что эта функция будет копировать
Еще один пример копирования строк
в конце 1998 года, поэтому
в используемой вами системе? Как
Простейшая программка, но утилиты для
Сохранность данных можно также проверять
Единственный сложный случай, затянувший работу,
в идеале должен работать молча,
важная часть входных данных теста,
Каждая последующая строка является набором
Но как только главным параметром
вынуждающая memset писать вне границ
n должны быть подставлены, по
Важнейшим является способ, использованный нами
в первую очередь распечатываются результаты
Компилятор предупреждает нас, что им
Если вводимое число состоит из
В этом коде предполагается, что
и тестовые случаи нередко могут
Перед тем как распространять свой
каждого из приведенных файлов вывод
Проверка сохранности данных
Систематическое тестирование
Первый шаг, по крайней мере
Стрессовое тестирование
Тестирование
Тестирование программы markov
Тестируйте при написании кода
Тестовые оснастки
Проверьте приводимые фрагменты на граничные
f req, которая подсчитывала бы
Спроектируйте набор тестов для printf,
основываясь на описанных нами приемах,
Создайте тесты для остальных функций
Определите режим тестирования для числовых
Определите механизмы для тестирования функций
Постарайтесь создать файл, который бы
Чем лучше вы пишете код
Производительность
Дополнительная литература
Эффективное использование памяти
Настройка кода
и замена вызова функции простым
Предварительная оценка
Как можно сделать этот код
с расчетом на эффективную работу,
Существующая версия strstr работала вполне
в точности npat раз; таким
Повышение производительности достигнуто на основании
с индексы образцов, которые начинаются
Пример 7.7. Код для построения этих таблиц весьма прост
и возвращает три числа, означающих
Масштабирующий коэффициент CLOCKS_PEfi_SEC характеризует разрешение
В Java функции класса Date
Используйте профилировщик. Не считая такого
В приводимой далее таблице показан
При первом профилировании программы очень
и многие другие детали хода
На графике ясно видно, что
на самом деле вовсе не
На этой версии после компиляции
После этого изменения время уменьшилось
При этом мы избавляемся от
Обратите внимание на то, что
Напишите специальную функцию захвата памяти
в буфере, но не передаются
Существует множество способов замены кода
Если эти функции окажутся слишком
Целочисленные операции достаточно быстры, за
вывода стоят гораздо дороже шинство
и malloc, вряд ли точно
эти цифры будут разными на
Производительность
Стратегии ускорения
с него, стала основой существенного
Вне зависимости от того, есть
В первом профиле st rch
Один из способов ускорить функцию
Создайте набор тестов для оценки
Создайте модель затрат для высокоуровневых
Узкое место
Если вы выбрали верный алгоритм,
Замеры времени и профилирование
Переносимость
Дополнительная литература
Интернационализация
Изоляция
Язык
несмотря на то что пщ
С существует уже более десятка
Обмен данными
в современных компьютерах уже нет
Организация программы
Переносимость
Переносимость и внесение усовершенствований
Порядок байтов
Результат будет одинаковым для большинства
значение count может быть увеличено
с EOF его значение останется
В языке Java вообще нет
может находиться на расстоянии
с EOF. Всегда используйте sizeof
Даже из этого сравнительно простого
Защитный стиль приемлем, если он
В этом фрагменте, вообще говоря,
Даже будучи явно безопасной, условная
Если DEBUG есть ноль, то
мы предпочитаем использовать только те
При каких обстоятельствах компилятор проверяет
Для того чтобы увидеть порядок
битовом старшеконечнике на экран будет
При пересылке большого количества двух-
и считывайте их обратно побайтово,
в определенной последовательности, побайтово, без
что можно сказать про побайтовую
в большинстве систем Unix это
После передачи контрольная сумма не
в передаче или просто мы
как ваш компилятор обрабатывает код,
Напишите программу, которая бы удаляла
Заголовочные файлы и библиотеки
к которому надо стремиться, поскольку
Нотация
Дополнительная литература
Форматирование данных
Интерпретаторы, компиляторы и виртуальные машины
Использование макросов для генерации кода
Компиляция "на лету"
Нотация
Пакет второго типа может состоять
Для настоящего протокола потребовалось бы
Точно так же, как sprinth,
Функция pack использует заголовочный файл
Для распаковки мы делаем то
Так же как, например, scanf,
Перед тем как вызывать unpack_type2,
Подобный стиль описания функций довольно
в таблице разбирает пакет своего
теперь код для обработки каждого
Если регулярное выражение пусто, это
Если регулярное выражение пусто, это
за того, что регулярному выражению
за того, что регулярному выражению
при различных сбоях. Наша программа
при различных сбоях. Наша программа
Если открыть файл не удается,
Если открыть файл не удается,
с символов, соответствующих остальной части
g rep абсолютно неважно, какое
f mt для того, чтобы
Этот скрипт, как правило, производит
Для тех, кто не знаком
и отформатирует текст по своим
в главе 2, вполне] огут
Первые несколько выражений case вычисляют
Таблица указателей сопоставляет операции
Вычисление использует операции для индексирования
Обе наши версии eval применяют
Ниже приведен блок кода, генерирующий
сгенерированный код будет выглядеть
операции управляют стеком, извлекая из
в программном виде на изобретенной
Обратите внимание на то, что
Имея такой фрагмент на входе,
У такого подхода есть несколько
в дело пошли регулярные выражения.
Если мы пропустим второй тест
В языке Java комментарии, которые
в нескольких строках. Этот макрос
и другие операторы, но основная
когда мы генерируем код для
И затем, вместо того чтобы
Для того чтобы адаптировать этот
После того как generate завершит
Сами команды могут определяться макросами,
только самое начало. Если бы
Программируемые инструменты
Программы, которые пишут программы
С достаточно часто используется подобным
Регулярные выражения
напросто соответствуют сами себе, так
Какой исходный файл использует класс
и unpack так, чтобы можно
и unpack возможности обработки строк.
Вспомните таблицу указателей на функции,
Напишите версию printf для командной
классе Decimal Format, где числа
и strstr при поиске простого
Напишите версию matchhere без рекурсии
g rep несколько ключей командной
соответствует строка из одного или
В нашей реализации match специальное
в match классы символов. Класс
Напишите программу для автоматического тестирования
вам предлагалось написать программу,
надо было построить модель
компилятор сгенерирует более быстрый код,
Приложение: свод правил
Приложение: свод правил
Стиль
Интерфейсы
Отладка
Тестирование
Производительность
Переносимость
-
Программирование - вопрос/ответ
Народ, подскажите, где искать стандартные картинки — например «дискетка» — для сохранения, «крестик» — для удаления и т.д. Хочу на кнопочку поместить?
-
Программирование - с женой или без
Женщины коварны и хитры, они играют на наших инстинктах и природных потребностях. Несмотря на то, что женского населения у нас больше, чем мужского (особенно если вычеркнуть из мужской составляющей всех тунеядцев, алкоголиков и наркоманов), именно мужчины окучивают женщин, а не наоборот.
Введение
Вне виртуального мира
Уроки выживания
-
Программирование в машинных кодах или soft-ice как logger
Некоторые отладчики (такие например, как OllyDbg) имеют одну полезную фишку, которую не имеет soft-ice. А именно— возможность пошаговой анимированной трассировки с условными точками останова на каждом ходу
Легкая разминка
NuMega SoftIce Symbol Loader собственной персоной
настойка размера буфера истории
Листинг1 наш самый первый протокол
Листинг2 условная точка останова, распечатывающая имена всех открываемых файлов
Листинг3 усовершенствованный протокол с именами открываемых файлов
Листинг4 финальная точка останова
Листинг5 полная версия протокола
Листинг6 прилизанный протокол, из которого выброшено все ненужное
Более сложные фильтры
Листинг 7 точка останова, шпионящая за открытием файлов, начинающихся с буквы 'a'
Листинг 7 точка останова, шпионящая за открытием файлов, начинающихся с буквы 'a' - 2
Листинг8 ассемблирование нашей функции в soft-ice
Листинг9 фиктивная точка останова позволяет использовать ключевое слово IF
Анимэ и soft-ice
Заключение
-
Программирование графических процессоров с использованием Direct3D и HLSL
Настоящий курс лекций разработан доцентом кафедры информационных технологий факультета прикладной математики и кибернетики Тверского государственного университета, кандидатом физико-математических наук А.Б. Семеновым при финансовой поддержке Microsoft Corporation.
Целью разрабатываемого курса является изучение слушателями математических и алгоритмических основ современной двумерной и трехмерной графики, включая задачи и методы реалистической визуализации и анимации, а также основные методы и алгоритмы обработки изображений. Особое внимание в курсе уделяется основам программирования графических процессоров, поддерживающих шейдерную архитектуру и приобретению навыков при разработке программного обеспечения с помощью графической библиотеки Direct3D и языка программирования высокого уровня HLSL. Задачей проекта является разработка и исследование алгоритмов и методов компьютерной графики на базе ядра графического микропроцессора. Заложенные внутри графического процессора механизмы параллелизма позволяют использовать видеокарту как эффективный параллельный вычислитель.
Предмет, задачи и применение машинной графики
Математические основы компьютерной графики
Библиотека DirectX
Технология COM
Графическая библиотека Direct3D
Вывод простейших примитивов
Программирование графических процессоров с использованием Direct3D и HLSL
Текстурирование
Мультитекстурирование
Полупрозрачность
Цветовой ключ
Буфер трафарета
Построение отрезков
Спрайты
Вывод текста
Вывод сцены в текстуру
Программирование графических процессоров с использованием Direct3D и HLSL
Схема графического конвейера
Принципы построения трехмерной сцены
Буфер глубины
Вывод трехмерных объектов
Программирование графических процессоров с использованием Direct3D и HLSL
Освещенность и материалы
Построение стандартных объектов
Реалистичные построения
Программирование графических процессоров с использованием Direct3D и HLSL
Использование шейдеров с помощью языка HLSL
Графический процессор в задачах обработки изображений
Пример 6.1
Расчет освещенности с помощью шейдеров
Файлы эффектов
Полноэкранный режим воспроизведения
Обработка ошибок
Подсчет количества кадров в секунду
Пример 6.2
Дополнительные материалы
-
Системное программирование
Программы и программное обеспечение
Определение (ГОСТ)
Программа - это данные, предназначенные для управления конкретными компонентами системы обработки информации (СОИ) в целях реализации определенного алгоритма.
Определения даются по: ГОСТ 19781-90. Обеспечение систем обработки информации программное. Термины и определения. - М.:Изд-во стандартов, 1990.
Обратить внимание: программа - это данные. Один из основных принципов машины фон Неймана - то, что и программы, и данные хранятся в одной и той же памяти. Сохраняемая в памяти программа представляет собой некоторые коды, которые могут рассматриваться как данные. Возможно, с точки зрения программиста программа - активный компонент, она выполняет некоторые действия. Но с точки зрения процессора команды программы - это данные, которые процессор читает и интерпретирует. С другой стороны программа - это данные с точки зрения обслуживающих программ, например, с точки зрения компилятора, который на входе получает одни данные - программу на языке высокого уровня (ЯВУ), а на выходе выдает другие данные - программу в машинных кодах.
Системное программирование
Этапы подготовки программы
Тема 2 Ассемблеры
Предложения языка Ассемблера
Операнды команд
Директивы
Структуры (базы) данных Ассемблера
Алгоритмы работы Ассемблеров
Двухпроходный Ассемблер 1й проход
Некоторые структуры данных 1го прохода
О структуре таблиц Ассемблера
Двухпроходный Ассемблер 2й проход
Некоторые дополнительные директивы
Одно и многопроходный Ассемблер
Основные понятия
Сравнение макросредств и подпрограмм
Некоторые возможности Макроязыка
Заголовок макроопределения
Окончание макроопределения
Локальные переменные макроопределения
Присваивание значений переменным макроопределения
Глобальные переменные макроопределения
Уникальные метки
Оператор безусловного перехода и метки макроопределения
Оператор условного перехода
Условные блоки
Операторы повторений
Выдача сообщения
Завершение обработки
Комментарии макроопределения
Макрорасширения в листинге
Структуры данных Макропроцессора
Алгоритм работы Макропроцессора
Алгоритм выполнения 1го прохода следующий
Алгоритм выполнения 2го прохода следующий
Алгоритм работы Непосредственно Связывающего Загрузчика
Тема 5 Кросссистемы
Модель регистров
Модель оперативной памяти
Модель процессора
Время
Система прерываний
Вводвывод
Взаимодействие с человекомоператором
-
Стили и методы программирования
Программирование на языках появилось одновременно с вычислительными машинами. Конрад фон Цузе, построивший первую в мире серию программно-управляемых вычислительных машин (Германия, 1938-1944 г.), создал язык Plankalkul для записи программ. Квалифицированные сотрудники писали программы на этом языке, а техники затем вручную переводили их в машинные коды. Сейчас наиболее широко используются традиционные языки. В их число входят FORTRAN, Pascal, C/C++, Ada, Java и т. п.
Сравнение программ на разных языках
Работа программной системы над текстом программ
Стили и методы программирования
Традиционная модель
Модификации традиционной архитектуры
Нетрадиционные архитектуры
Конструкции традиционных языков
Примеры традиционных языков
Стили и методы программирования
Пример 4.5.1
Различные стороны определения языка
Синтаксис
Семантика
Прагматика
Абстрактный и конкретный синтаксис
Стили и методы программирования
Пример 5.1
Конкретизация
Структура данных
Модель вычислений и Рефал-программа
Алгоритм для сопоставления объектного выражения E с образцом P в Рефал-5.
Общие требования к отображению P на E (сопоставлению E : P)
Правила отображения
Дополнительные возможности
Стили и методы программирования
Пример 6.3.1
Общие концепции
Поле зрения, поле памяти и PROLOG-программа
Управление исполнением программы
Динамическое пополнение и порождение программы
Организация вычислений и ввода-вывода
Стили и методы программирования
Введение
Развитие языка Prolog
Развитие языка Рефал и его диалекты
Сравнение версий сентенциального программирования
Стили и методы программирования
Пример 8.4.1
Списки и функциональные выражения
Поле зрения и поле памяти
Модель вычислений LISP
Прагматические добавления и динамическое порождение программ
Объекты и LISP
Стили и методы программирования
Автоматные задачи
Основные структуры автоматного программирования
Программные представления графа состояний
Методы действий в состояниях и на переходах: анализ состояний и построение таблицы
Постановка задачи и первичный анализ
Построение графа состояний
Табличное представление графа состояний
Стили и методы программирования
Пример 10.2.1
Анализ состояния дел
Ручная трансляция таблиц переходов
Автоматизированное преобразование таблиц переходов
Обсуждение решения
Стили и методы программирования
Пример 11.2.1
Внимание!
Требования к автоматической трансляции таблиц
Постановка задачи
Пример 12.1.4
Стили и методы программирования
Пример 13.2.1
Событие, сообщение, демон
Программирование от приоритетов
Стили и методы программирования
Пример 14.4.1
Общая характеристика структурного программирования
Сети данных
Выбор
О дисциплине циклического структурного программирования
Переходы и выдаваемые значения
Стили и методы программирования
Естественный параллелизм алгоритмов
Виды параллелизма
Взаимодействие процессов и распараллеливание
Что нужно для переиспользования
Переиспользование и стили
Программирование от образцов
Почему нет универсальных методов?
Стили, их ипостаси, методологии, методики, технологии
Когда нужно использовать различные стили и как они взаимодействуют?
О сочетании стилей
-
Стохастические генераторы псевдослучайных последовательностей
Генераторы ПСП, схемы которых приведены на рис. 3.9, функционируют в режиме OFB. На рис. 3.19 показаны схемы двух вариантов формирования ПСП в режиме Counter. В состав устройства на рис. 3.19, а входят два генератора, байтовые ПСП с выхода которых поступают на входы R-блока
R-блок
Стохастические генераторы многоразрядных ПСП на регистрах сдвига – RFSR
Криптоанализ RFSR
Двухступенчатые стохастические генераторы многоразрядных ПСП
Стохастические генераторы ПСП с многораундовой функцией обратной связи
Выводы
-
Технологии Microsoft в теории и практике программирования
Современный уровень развития компьютерной индустрии и все возрастающее проникновение информационных технологий в повседневную жизнь общества предъявляют все большие требования к ИТ-специалистам – они должны обладать большим объемом фундаментальных знаний
-
Технологии программирования на базе Microsoft Solutions Framework
Отрасль разработки программного обеспечения - одна из самых молодых и перспективных отраслей человеческой деятельности. В настоящее время сложность задач, стоящих перед отраслью, непрерывно возрастает, что требует применения специальных технологий организации и проведения процесса разработки программного обеспечения. Теоретическое изучение подобных технологий, совмещенное с их практическим применением, представляет собой исключительно важную часть подготовки специалиста в области разработки программного обеспечения.
Цель данного курса состоит в изучении основных путей организации и проведения успешных проектов в области разработки программного обеспечения на базе принципов Microsoft Solutions Framework (MSF). Важная роль отводится практической составляющей курса.
Задачи изучения курса
Дисциплины, усвоение которых необходимо при изучении данного курса
Характеристика курса
Содержание курса
Затрагиваемые разделы рекомендаций Computing Curricula (Software Engineering )
Литература
Информационные ресурсы сети Интернет
Цели и задачи лабораторного практикума
Характеристика практикума
Приложение Постановки задач
Краткое описание
Анализ постановки - полное описание
Полная постановка задачи
Технологии программирования на базе Microsoft Solutions Framework
Программирование
IT-проекты
Программы и программное обеспечение (программные продукты)
Бизнес и IT-проекты Рынок ПО в России и в мире Немного статистики
О предмете
Причины неудачи IT-проектов
Технологии программирования - путь к успеху в разработке ПО
Структурное программирование
Модульное программирование
Объектно-ориентированное программирование
Компонентное программирование
Вспоминая предыдущую лекцию
Источник материала
Цели лекции
Инженеры и программные инженеры
Программная инженерия как инженерная дисциплина
Область действия программной инженерии
Цели программных инженеров
Качественный программный продукт
Создание ПО должно укладываться в бюджет
Создание ПО должно укладываться в сроки
Программные инженеры и научная среда
Процесс создания программного обеспечения
Понятие процесса
Модели процесса
Каскадная модель (Waterfall model)
Эволюционная модель (Evolutionary development)
Итерационный подход
Модель пошаговой разработки
Спиральная модель разработки
Технологии программирования на базе Microsoft Solutions Framework
Footnote1
Вспоминая предыдущую лекцию
Анализ и проектирование Некоторые частные вопросы
Алгоритмическая и объектная декомпозиции Классы и объекты
Составные части объектного подхода
Принципы объектного подхода
Пример: ООП и структуры хранения Стек
Идея повторного использования Важность повторного использования
Достоинства повторного использования Виды повторного использования
Идея визуального моделирования
История языка UML
Модели UML
Диаграммы UML
Понятия UML
Краткое описание
Актеры и варианты использования в UML
Структура системы и ее описание средствами UML
Классы
Интерфейсы
Пакеты
Подсистемы
Компоненты
Комментарии
Отношения между элементами модели
Зависимость
Ассоциация
Направление и навигация
Кратность
Частные случаи ассоциаций: агрегация и композиция
Технологии программирования на базе Microsoft Solutions Framework
Вспоминая предыдущую лекцию
Что такое методология?
Основные концепции методологии MSF
Историческая справка
Источники информации
Нововведения версии MSF 0
Два направления в MSF 0
Основные положения MSF for Agile Software Development
Инструментальная поддержка MSF 0
Источники информации
Формирование команды Модель проектной группы MSF for Agile Software Development
Основные принципы построения команды
Ролевые группы и роли
Зоны ответственности ролевых групп
Задачи ролевых групп и взаимодействие с заинтересованными лицами
Управление программой
Архитектура продукта
Разработка
Тестирование
Управление выпуском
Удовлетворение потребителя
Управление продуктом
Рекомендации по возможному объединению ролей
Учебный пример Формирование команды
Технологии программирования на базе Microsoft Solutions Framework
Вспоминая предыдущую лекцию
Управление рисками в MSF for Agile Software Development
Основные сведения о рисках
Планирование управления рисками
Процесс управления рисками
Управление рисками как составная часть жизненного цикла проекта
Учебный пример Выделение рисков
Модель процессов MSF for Agile Software Development
Взаимодействуйте с "заказчиками"
Поощряйте свободный обмен информацией в проекте
Создавайте "единое видение проекта"
Следите за качеством продукта
Проявляйте гибкость - будьте готовы к изменениям
Ставьте "вехи"
Будьте готовы к внедрению сегодня
Управление компромиссами
Треугольник компромиссов
Матрица компромиссов проекта
Схема процесса разработки
Структурные единицы схемы
Цикличность процесса разработки
Фазы и вехи процесса разработки
Технологии программирования на базе Microsoft Solutions Framework
Вспоминая предыдущую лекцию
Старт проекта Фаза выработки концепции
Основные задачи фазы
Задачи ролевых групп на фазе выработки концепции
Вехи фазы выработки концепции
Результаты фазы выработки концепции
Учебный пример Выработка концепции
Видение проекта
Концепция решения
Цели и Задачи
Предположения и Ограничения
Пользователи
Сценарии использования
Рамки
Функциональность решения
За рамками решения
Планирование проекта Фаза планирования
Основные задачи фазы
Задачи ролевых групп на фазе планирования
Вехи фазы планирования
Результаты фазы планирования
Вспоминая предыдущую лекцию
Разработка решения Фаза разработки
Основные задачи фазы
Задачи ролевых групп на фазе разработки
Вехи фазы разработки
Результаты фазы разработки
Основные задачи фазы
Задачи ролевых групп на фазе стабилизации
Вехи фазы стабилизации
Результаты фазы стабилизации
Основные задачи фазы
Задачи ролевых групп на фазе внедрения
Вехи фазы внедрения
Результаты фазы внедрения
-
Функциональное программирование
В некоторых случаях осознанное усвоение концепций даже на самом низком уровне нереально без базовых теоретических сведений. А знакомство с таким базисом, в свою очередь, стимулирует значительно более глубокий интерес к теории и способствует пониманию того, что на высшие уровни знаний и умений не подняться без овладения теорией
Пример 8.6.1
Пример 8.6.2
Лекция из курса Стили и методы программирования
-Абстракции
Списки и функциональные выражения
Поле зрения и поле памяти
Модель вычислений LISP
Прагматические добавления и динамическое порождение программ
Объекты и LISP
-
Языки программирования. Практический сравнительный анализ
Естественно начать с характеристики изучаемого предмета. Но коротко охарактеризовать, что именно будем изучать, с какой целью и как, не просто (скоро станет понятно, почему). Конечно, нас будут интересовать "языки программирования" (ЯП). На сколь точно эти слова определяют сферу наших интересов? Одни скажут, что язык машин Тьюринга или алгоритмов Маркова - это ЯП, другие не согласятся с этим категорически. Одни признают язык управления заданиями в ОС ЕС языком программирования, другие приведут доводы против.
Такая ситуация на первый взгляд неприятна - собираемся изучать неизвестно что. Сделаем вывод, что нужно определить объем понятия "язык программирования" (его экстенсионал, т.е. множество обьектов, охватываемых этим понятием, множество его частных случаев).
Чтобы создать себе первую точку опоры, пойдем по простейшему пути - явно перечислим те конкретные языки, которые нас заведомо интересуют (их мы уверенно считаем "языками программирования"). Это Фортран, Паскаль, Бейсик, Лисп, Апл, Форт, Рефал, Ада. Однако вряд ли стало намного легче. Хочется иметь возможность на основе определения предсказывать новые частные случаи, в определении не перечисленные. Такое определение должно опираться на существенные свойства выбираемых для изучения языков - оно должно быть интенсиональным. Дадим одно из возможных интенсиональных определений ЯП.
-
Объектно-ориентированное проектирование с примерами
Как программисты-профессионалы мы стремимся делать свои системы полезными и работоспособными. Как инженеры-разработчики мы должны создавать сложные системы при ограниченных компьютерных и кадровых ресурсах. За последние несколько лет объектно-ориентированная технология проникла в различные разделы компьютерных наук. К ней относятся как к средству преодоления сложности, присущей многим реальным системам. Объектная модель показала себя мощной объединяющей концепцией.
Концепции
Метод
Примеры приложений
Дополнительный материал
Сложность
Простые и сложные программные системы
Почему программному обеспечению присуща сложность?
Последствия неограниченной сложности
Примеры сложных систем
Пять признаков сложной системы
Организованная и неорганизованная сложность
Роль декомпозиции
Роль абстракции
Роль иерархии
Инженерное дело как наука и искусство
Смысл проектирования
Объектная модель
Тенденции в проектировании
Основные положения объектной модели
OOP, OOD и ООА
Парадигмы программирования
Абстрагирование
Инкапсуляция
Модульность
Иерархия
Типизация
Параллелизм
Сохраняемость
Преимущества объектной модели
Использование объектного подхода
Открытые вопросы
Классы и объекты
Что является и что не является объектом?
Состояние
Поведение
Идентичность
Типы отношений
Связи
Агрегация
Что такое класс?
Интерфейс и реализация
Жизненный цикл класса
Ассоциация
Наследование
Использование
Инстанцирование
Метаклассы
Отношения между классами и объектами
Роль классов и объектов в анализе и проектировании
Измерение качества абстракции
Как выбрать операции?
Объектно-ориентированное проектирование с примерами
Как выбирать отношения
Выбор реализации
Классификация
Классификация и объектно-ориентированное проектирование
Трудности классификации
Классический и современный подходы
Объектно-ориентированный анализ
Ключевые абстракции
Обозначения
Необходимость разных точек зрения
Модели и ракурсы
Логическая и физическая модели
Инструменты проектирования
Существенное: категории классов
Дополнительные обозначения
Спецификации
Существенное: состояния и переходы
Дополнительные понятия
Спецификации
Существенное: объекты и их отношения
Существенное: объекты и их взаимодействия
Существенное: модули и их зависимость
Процесс
Характерные черты удачных проектов
Рациональный процесс проектирования
Обзор
Выявление классов и объектов
Выяснение семантики классов и объектов
Выявление связей между классами и объектами
Реализация классов и объектов
Концептуализация
Анализ
Проектирование
Эволюция
Сопровождение
Практические вопросы
Управление риском
Планирование задач
Просмотр
Роли разработчиков
Объектно-ориентированное проектирование с примерами
Система сбора данных: метеорологическая станция
Определение границ рассматриваемой задачи
Архитектурный каркас
Механизм покадровой обработки
Планирование релизов
Механизм датчиков
Механизм вывода информации на экран
Механизм пользовательского интерфейса
Среда разработки: библиотека базовых классов
Определение границ проблемной области
Требования к библиотеке базовых классов
Модели взаимодействий
Тактические вопросы
Макроорганизация
Семейства классов
Семантика времени и памяти
Управление памятью
Итерация
Синхронизация
Проектирование интерфейса классов
Классы поддержки
Инструменты
Дополнительная литература
Архитектура клиент-сервер: складской учет
Определение границ задачи
Архитектура клиент-сервер
Сценарии работы
Модели баз данных
SQL
Анализ схем данных
Механизм транзакций
Создание клиентской части приложения
Управление релизами
Генераторы приложений
Искусственный интеллект: криптоанализ
Определение границ предметной области
Архитектура метафоры информационной доски
Архитектура информационной доски
Интеграция
Добавление источников знаний
Расширение функциональных возможностей
Изменение технических требований
Объектно-ориентированное проектирование с примерами
Управление: контроль за движением поездов
Системные и программные требования: хрупкий компромисс
Ключевые абстракции и механизмы
Механизм передачи сообщений
Планирование расписания поездов
Отображение информации
Механизм опроса датчиков
Модульная архитектура
Спецификация подсистем
Добавление новых функций
Изменение аппаратных средств
Библиография
Словарь терминов
Литературные ссылки
Объектно-ориентированные языки программирования
Происхождение
-
Объектно-ориентированные технологии проектирования прикладных программных систем
Агрегация - это зависимость между классом составных объектов и классами, представляющими компоненты этих объектов (отношение "целое"-"часть"). Агрегация обозначается ромбиком: на рисунке 2.15 приведен пример агрегации; этот пример интерпретируется следующим образом: документ состоит из нескольких (нуля, или более) абзацев
Абстрактные классы
Определение классов
Подготовка словаря данных
Определение зависимостей
Уточнение атрибутов
Организация системы классов, используя наследование
Дальнейшее исследование и усовершенствование модели
Определение объектов и классов
Организация системы классов с использованием наследования
Дальнейшее усовершенствование модели
Интерфейсы и окружения
События, состояния объектов и диаграммы состояний
Условия
Активности и действия
Одновременные события Синхронизация
Вложенные диаграммы состояний
Динамическая модель банковской сети
Диаграммы потоков данных
Описание операций
Ограничения
Функциональная модель банковской сети
Разработка алгоритмов, реализующих полученные операции
Оптимизация разработки
Реализация управления
Уточнение наследования классов
Разработка зависимостей
Реализация наследования
Преобразование классов в структуры данных
Передача параметров методам
Размещение объектов в памяти
Выбор методов для операций
Объектно-ориентированное программирование на Фортране
Чем неудобны не объектно-ориентированные системы программирования
Основные понятия объектно-ориентированного подхода
Объектно-ориентированная разработка программ
Объектно-ориентированные языки программирования
Сквозной пример
Объектно-ориентированные технологии проектирования прикладных программных систем
Первая фаза жизненного цикла
Объектная модель системы
Построение объектной модели
Пример объектной модели
Понятие подсистемы
Динамическая модель системы или подсистемы
Функциональная модель подсистемы
Заключительные замечания к разделу
Операции и методы
Зависимости между классами (объектами)
Атрибуты зависимостей
Имена ролей, квалификаторы
Агрегация
Сравнительный анализ объектно-ориентированных методологий разработки программных систем
Методология OMT
Методология SA/SD
Методология JSD
Методология OSA
Третья фаза жизненного цикла - реализация объектно-ориентированного проекта
Объектно-ориентированный стиль программирования
Объектно-ориентированные системы программирования
Реализация на языке C++
Другие объектно-ориентированные системы программирования
Не объектно-ориентированные системы программирования
Реализация зависимостей
Шаблоны в языке C++
Реализация классов
Порождение объектов
Вызов операций
-
Функциональное программирование (2)
Функции. Базовые функции
Логические функции. Управляющие структуры
Let. Циклические предложения
Рекурсия
Поиск на лиспе. Функционалы. Свойства символов
Внутреннее представление списков. Применяющие функционалы
Массивы. Макросы. Пример программы на лиспе