Введение
Проявил себя – закрепи…
От Фоменко
Профессия программиста удивительна и уникальна. Давно уже настало время настоящего философского осмысления этой сферы человеческой деятельности, действительно обладающей какими-то особенными, для людей непосвященных чуть ли не магическими, свойствами. Если не брать в рассмотрение коммерческую сторону, то можно сказать, что чужих людей в этой области профессиональной деятельности нет. В чем же ее особенность? Наиболее точно по этому поводу высказался Фредерик Брукс в главе "Пятьдесят лет удивления, восхищения и радости" своей книги "Мифический человеко-месяц, или как создаются программные системы":
"Немногим Бог дает право зарабатывать на жизнь тем, чем они с радостью занимались бы по собственной воле, по увлечению. Я благодарен судьбе". И далее: "Область связанных с компьютерами знаний претерпела взрыв, как и соответствующая технология. Будучи аспирантом в середине 50-х, я мог прочесть все журналы и труды конференций. Я мог оставаться на современном уровне во всей научной дисциплине. Сегодня мне в моей интеллектуальной жизни приходится с сожалением расставаться с интересами то в одной, то в другой подобласти, поскольку количество документов превысило всякую возможность справиться с ними. Масса интересов, масса замечательных возможностей для учебы, исследований и размышлений. Чудесное затруднение! Не только конца не видно, но и шаг не замедляется. В будущем нас ожидают многие радости".
Что еще к этому добавить?
Структура книги
Эту книгу можно рассматривать как своеобразную форму программного продукта. Даже беглое ее пролистывание показывает, как много в ней программного кода. Более того, так как ассемблерный код неэкономичен с точки зрения использования поверхности листа бумаги для его записи, то в тексте книги приведены лишь значимые для каждого конкретного контекста изложения фрагменты программ. Полные тексты этих программ содержатся на дискете. Некоторые наиболее объемные по размеру исходного текста программы целиком вынесены на дискету без приведения их фрагментов в тексте книги.
Для эффективной работы с ними читателю следует внимательно следить за ссылками на них и соответствующими пояснениями. Насколько это возможно, программы были проверены, но было бы опрометчиво утверждать, что вероятность появления ошибок в них равна нулю. Любому программисту, даже имеющему очень скромный опыт практической работы, известно, что вероятность последней ошибки есть всегда. В связи с этим просьба к читателям сообщать о найденных ошибках по указанным ниже адресам электронной почты. Книга состоит из 10 разных по объему глав. Ниже приведены краткие сведения о цели и характере содержимого каждой из этих глав.
Глава 1 "Программирование целочисленных арифметических операций".
В этой главе приводятся исчерпывающие сведения об алгоритмах реализации четырех основных арифметических операций над числами различной разрядности. На практике нередко возникают ситуации, когда численные значения данных выходят за пределы максимально представимых диапазонов чисел в компьютере. В этом случае нужно использовать алгоритмы для производства вычислении над многобайтными (с разрядностью от 1 до оо) числами. В этой главе приведена реализация этих алгоритмов для двоичных и двоично-десятичных (BCD) чисел. Кроме этого, глава содержит описание алгоритмов генерации псевдослучайных последовательностей, проблема организации которых также возникает достаточно часто.
Глава 2 "Сложные структуры данных".
Содержимое этой главы значительно дополняет и расширяет содержимое одноименного урока 12 учебника. Достаточно перечислить номенклатуру рассмотренных структур данных, названных "сложными", – это множества, массивы, структуры, таблицы. одно- и двусвязные списки, деревья. Для демонстрации работы с этими "сложными структурами данных" подобраны интересные и востребованные на практике алгоритмы. Так, работа с массивами показана на примерах популярных алгоритмов сортировки и поиска, работы с матрицами. Работа со структурами иллюстрируется на примерах организации массивов структур – таблиц. При этом наряду с обычными таблицами рассматривается специальный класс таблиц – таблиц с вычисляемыми входами, или хэш-таблиц. Интересные примеры иллюстрируют выполнение основных операций над элементами одно- и двусвязных списков. Работа с сетью показана на примере организации в программе такой структуры, как конечный автомат. Заканчивается глава рассмотрением элементов компиляции программ. Это логичное и оправданное с практической точки зрения завершение главы о сложных структурах данных. Наверняка каждому из вас приходилось организовывать элементарный языковой интерфейс с пользователем и обрабатывать его ввод. О существующих подходах к практической реализации формальных механизмов распознавания ввода пользователя вы узнаете из главы 2.
Глава 3 "Процедуры в программах ассемблера".
Также достаточно интересная глава, которая является существенным дополнением урока 14 "Модульное программирование" учебника. Большое внимание уделено в ней реализации рекурсивных процедур в программах на ассемблере. Реализация рекурсии в любом языке – предмет дискуссии, причем от полного неприятия до слепого поклонения. Мы не стали принимать участие в этой дискуссии, а просто показали технологию разработки рекурсивных программ на ассемблере. Попутно обсуждению подвергаются проблемы передачи параметров и сохранения локальных параметров процедуры. В несколько более скромном объеме приведены сведения об организации вложенных процедур. В этой главе также содержится очень важный материал для программирующих под Windows – о разработке и об организации работы с DLL-библиотеками в программах на ассемблере.