Основные концепции языков программирования

5-е издание
Роберт В Себеста

Concepts of Programming Languages, 5th Edition
Sebesta, Robert W
книга Основные концепции языков программирования, 5-е издание

Тираж данной книги закончился.
Оглавление
Введение

Книга, ставшая бестселлером в США, посвящена всестороннему обсуждению основных концепций языков программирования. Автор описывает фундаментальные понятия программирования на примере вопросов разработки различных языковых конструкций, подвергая критическому анализу их реализацию в широком спектре языков программирования, таких как FORTRAN, PASCAL, PL/1, C, C++, Ada, Java, Smalltalk, Eiffel и LISP. Материал книги охватывает все парадигмы программирования, начиная с функциональной и заканчивая объектно-ориентированной, и, несомненно, представляет интерес и как учебник по современным методологиям.

672 стр., с ил.; ISBN 5-8459-0192-8, 0-201-75295-6; формат 70x100/16; 2001, 3 кв.; Вильямс.



Понравилась книга? Порекомендуйте её друзьям и коллегам:







Книги, рекомендуемые вместе с этой книгой:

Раздел каталога:



Оглавление книги "Основные концепции языков программирования"

Предисловие 18
Глава 1. Вводные замечания 23
Глава 2. Обзор основных языков программирования 57
Глава 3. Описание синтаксиса и семантики 123
Глава 4. Имена, связывание, проверка типов и области видимости 173
Глава 5. Типы данных 213
Глава 6. Выражения и операторы присваивания 275
Глава 7. Структуры управления на уровне операторов 303
Глава 8. Подпрограммы 345
Глава 9. Реализация подпрограмм 393
Глава 10. Абстрактные типы данных 429
Глава 11. Поддержка объектно-ориентированного программирования 451
Глава 12. Параллельность 503
Глава 13. Обработка исключительных ситуаций 545
Глава 14. Функциональные языки программирования 579
Глава 15. Языки логического программирования 615
ЛИТЕРАТУРА 649
Предметный указатель 661


Предисловие

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

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

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

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

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

Ниже приводится краткое содержание глав пятого издания книги.

Глава 1 начинается с объяснения, зачем нужно изучать языки программирования. Затем обсуждаются критерии их оценки. Мы отдаем себе отчет в том, что вводить такие критерии рискованно, но, тем не менее, принципы оценки необходимы в любом серьезном исследовании проблем разработки языков программирования. Кроме того, в этой главе рассматриваются основные факторы, влияющие на разработку языков программирования, общепринятые соглашения, используемые при их разработке, а также основные подходы к реализации.

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

В главе 3 рассматриваются основные методы формального описания синтаксиса языков программирования: форма EBNF (Extended Backus-Naur Form - расширенная форма Бэкуса-Наура) и синтаксические графы. Затем следует описание атрибутной грамматики, играющей очень важную роль при разработке компилятора. Далее анализируется трудная задача описания семантики, даются основы трех наиболее распространенных методов описания: операционной, аксиоматической и денотационной семантики.

В главах 4-13 использован вертикальный подход для подробного описания разработки основных конструкций императивных языков программирования. В каждом случае представлено и оценено несколько альтернативных проектных решений. В частности, в главе 4 рассмотрены многие свойства переменных, а в главе 5 - более сложные типы данных; глава 6 посвящена выражениям и операторам присваивания; управляющие операторы описаны в главе 7; подпрограммы и их реализация разобраны в главах 8 и 9; способы абстракции данных изучаются в главе 10; особенности языков, поддерживающих объектно-ориентированное программирование (наследование и динамическое связывание), - в главе 11; параллельно выполняемые программные модули описываются в главе 12; и, наконец, обработка исключительных ситуаций описывается в главе 13. Мы решили использовать вертикальный подход, поскольку при горизонтальном подходе приходится описывать и оценивать детали некоторой конкретной конструкции в разных частях книги одновременно, что создает определенное неудобство. Например, обсуждение в одной и той же главе различных методов обеспечения параллельности позволяет нам точно сравнить и оценить эти методы.

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

В частности, глава 14 начинается с обсуждения простых математических функций, функциональных форм и языков функционального программирования. Затем представлено введение в язык Scheme с описанием некоторых его основных функций, специальных форм, функциональных форм и приведено несколько примеров простых функций, написанных на этом языке. Для иллюстрации разновидностей языков функционального программирования кратко описаны языки COMMON LISP, ML и Haskell. Завершается глава сравнением функциональных и императивных языков программирования.

Темой главы 15 является логическое программирование и языки логического программирования. Глава начинается с введения в исчисление предикатов и объяснения их использования для доказательства теорем. Затем следует обзор логического программирования. Основная часть главы посвящена языку Prolog, в частности, резолюции и унификации, а также содержит несколько примеров программ с подробными описаниями их работы.

Изменения, внесенные в пятое издание

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

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

Две основные причины, обусловившие выбор этого нового подхода, заключаются в следующем: во-первых, в настоящее время появилось огромное количество объектно-ориентированного программного обеспечения, создаваемого на языках, подобных императивным языкам последних четырех десятилетий. Выражения, операторы присваивания, структура данных и управляющие структуры этих языков очень похожи на соответствующие структуры языков C и Pascal. Следовательно, нет причин отдельно обсуждать указанные свойства этих языков. Согласно нашему определению императивного языка языки C++, Ada 95 и Java являются императивными. Мы рассматриваем поддержку объектно-ориентированного программирования данными языками как начало следующей стадии развития императивных языков программирования. В то время как парадигма развития объектно-ориентированного программного обеспечения значительно отличается от процедурной парадигмы, различия между языками, относящимися к данным двум подходам, не столь значительны. В то же время различия между такими языками, поддерживающими информационно-ориентированное программирование, как Ada 83, и языками, поддерживающими объектно-ориентированное программирование, менее заметны. Второй причиной изменения подхода к обсуждению объектно-ориентированных языков программирования является то, что эта парадигма уже не такая новая и экспериментальная, какой была несколько лет назад. В современных разработках программного обеспечения этот подход доминирует, и используемые для этой цели языки программирования являются самыми распространенными на данный момент языками. Следовательно, в книге не стоит обсуждать объектно-ориентированные языковые функции в одной главе, к тому же расположенной в конце книги, - подход, до сих пор используемый по отношению к языкам логического программирования. Эту информацию легко можно подать в большинстве глав книги, что и было сделано в пятом издании.

Кроме указанных, были внесены еще некоторые изменения. Появление языка Java и быстрый рост его популярности потребовал дополнительного увеличения материала книги за счет описания некоторых его интересных свойств. В частности, обсуждение поддержки объектно-ориентированного программирования в языке Java было добавлено в главу 11, возможность параллельного функционирования - в главу 12, а обработка исключительных ситуаций - в главу 13. Кроме того, в начальные главы книги добавилось обсуждение еще нескольких его функций.

Поскольку язык Miranda запатентован, в то время как язык Haskell общедоступен, обсуждение языка Miranda было удалено из главы 14 и оставлено только описание языка Haskell.

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

Из-за введения в книгу описания новых языков и новых свойств старых языков обсуждение старых языков было сокращено. Например, был удален материал о сопрограммах языка Modula-2 и его поддержке абстрактных типов данных.

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

Указания преподавателю

При преподавании языков программирования на младших курсах университета штата Колорадо в Колорадо-Спрингс (University of Colorado at Colorado Springs) данная книга используется следующим образом: главы 1 и 3, как правило, рассматриваются подробно. На главу 2, не содержащую трудной для восприятия технической информации, отводится совсем немного лекционного времени. Тем не менее, студенты находят эту главу интересной и полезной. Как указывалось ранее, глава 2 может быть просто пропущена, поскольку она не содержит материала, необходимого для понимания последующих глав.

Главы 4-8 и глава 10 должны относительно легко восприниматься студентами, имеющими большой опыт работы с языками Pascal, C, C++ или Ada. Главы 9, 11, 12 и 13 более сложны и требуют обстоятельных лекций.

Главы 14 и 15 являются совершенно новыми для большинства студентов младших курсов. При объяснении этих глав идеальным было бы наличие языковых процессоров для языков Scheme и Prolog. Кроме того, в эти главы включено достаточно материала для того, чтобы студенты могли повозиться с простыми программами.

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

Приложения

В книгу включены два важных и полезных приложения. Электронный учебник с решениями упражнений можно получить у торгового представителя издательства "Addison-Wesley Publishing". Также доступен набор диапозитивов к лекциям (по одному на каждую из первых 13 глав), имеющий формат файлов источника программы Microsoft Powerpoint. Автор создал их за последние несколько лет чтения курса лекций по предлагаемой книге. Файлы в формате программы Powerpoint можно получить с помощью анонимного ftp-доступа на узле ftp.aw.com в каталоге /cseng/authors/sebasta/concepts4e. Подробнее об этом и других приложениях вы можете узнать из файлов README или .message, находящихся в указанном каталоге.

Доступность языкового процессора

Процессоры для работы с некоторыми из обсуждаемых языков программирования и информацию об этих языках вы можете найти на следующих Web-узлах:

  • язык Java - узел http://java.sun.com
  • язык Haskell - узел http://haskel.org
  • язык Scheme - узел http://www-swiss.ai.mit/ftpdir/scheme-7.4/

Обновленные версии можно найти на домашней странице данной книги: http://www.aw1.com/cseng/titles/0-201-38596-1/

Благодарности

Качество этой книги было значительно улучшено благодаря большому количеству предложений, уточнений и комментариев ее рецензентов. Рецензентами первых трех изданий книги были Вики Алан (Vicki Allan), Генри Бауэр (Henry Bauer), Питер Брауэр (Peter Brouwer), Паошенг Чанг (Paosheng Chang), Джон Креншоу (John Crenshaw), Барбара Энн Грим (Barbara Ann Griem), Мери Лоу Хааг (Mary Lou Haag), Джон Мауни (Jon Mauney), Роберт Мак-Коард (Robert McCoard), Майкл Дж. Мерфи (Michel G. Murphy), Эндрю Олдройд (Andrew Oldroyd), Джеффри Попяк (Jeffery Popyack), Стивен Рапкин (Steven Rapkin), Гамильтон Ричард (Hamilton Richard), Том Сейджер (Tom Sager), Джозеф Шелл (Joseph Schell) и Мэри Луиза Соффа (Mary Louise Soffa).

Пятое издание рецензировали:

  • Мэри Лоу Хааг (Mary Lou Haag), университет штата Колорадо в Колорадо-Спрингс (University of Colorado at Colorado Springs);
  • Хайкью Ко (Hikyoo Koh), университет Lamar University;
  • Брюс Максим (Bruce Maxim), университет штата Мичиган в Дебоне (University of Michigan at Dearborn);
  • Л. Эндрю Олдройд (L. Andrew Oldroyd), Вашингтонский университет (Washington University);
  • Ребекка Парсонс (Rebecca Parsons), университет Центральной Флориды (University of Central Florida);
  • Дон Багерт (Don Bagert), Технический университет штата Техас (Texas Technical University).
  • Мейт Суарез-Ривас (Maite Suarez-Rivas), редактор, Молли Тейлор (Molly Taylor), помощник редактора, и Пат Юнабан (Pat Unubun), производственный редактор, заслужили мою признательность за их усилия, направленные на быстрый выход пятого издания книги, а также за помощь в улучшении этого издания по сравнению с предыдущим.

В заключение автор благодарит своих детей - Джейка (Jake) и Дарси (Darcie) за их терпеливое отношение к отсутствию отца, проводившего бесконечные часы в работе над пятым изданием данной книги.

Об авторе

Роберт Себеста (Robert Sebesta) является ассоциированным профессором и деканом факультета компьютерных наук университета штата Колорадо в Колорадо-Спрингс. Профессор Себеста получил степень бакалавра по прикладной математике в университете штата Колорадо в Болдере (University of Colorado in Boulder), а степени магистра компьютерных наук и доктора философии - в Государственном университете штата Пенсильвания (Pennsylvania State University). Теорию вычислительных систем он преподает уже свыше 25 лет. К области его профессиональных интересов относятся проектирование и оценка языков программирования, разработка компиляторов, а также методы и инструменты тестирования программного обеспечения. Автор является членом Ассоциации по вычислительной технике (ACM - Association for Computing Machinery) и Компьютерного общества Института инженеров по электротехнике и электронике (IEEE - Institute of Electrical and Electronics Engineers Computer Society).

Оглавление

ПРЕДИСЛОВИЕ10
Изменения, внесенные в пятом издании11
Указания преподавателю12
Приложения12
Доступность языкового процессора12
Благодарности12
Об авторе13
1. ВВОДНЫЕ ЗАМЕЧАНИЯ13
1.1. Для чего нужно изучать концепции языков программирования16
1.2. Области применения программирования18
1.2.1. Научные приложения18
1.2.2. Коммерческие приложения18
1.2.3. Искусственный интеллект18
1.2.4. Системное программирование19
1.2.5. Языки подготовки сценариев19
1.2.6. Специализированные языки программирования20
1.3. Критерии оценки языков программирования20
1.3.1. Читабельность21
1.3.2. Легкость создания программ25
1.3.3. Надежность27
1.3.4. Стоимость28
1.4. Факторы, влияющие на разработку языка29
1.4.1. Архитектура компьютера29
1.4.2. Методологии программирования31
1.5. Категории языков32
1.6. Компромиссы при разработке языка32
1.7. Методы реализации33
1.7.1. Компиляция34
1.7.2. Чистая интерпретация37
1.7.3. Смешанные системы реализации38
1.8. Среды программирования39
2. ОБЗОР ОСНОВНЫХ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ42
2.5. Первый шаг к совершенствованию: язык ALGOL 60 42
2.1. Язык Plankalkül Конрада Цузе44
2.1.1. Исторические предпосылки44
2.1.2. Обзор языка45
2.2. Минимальное программирование на аппаратном уровне: псевдокоды46
2.2.1. Язык Short Code46
2.2.2. Система Speedcoding47
2.2.3. Система "компиляции" UNIVAC47
2.2.4. Смежная работа47
2.3. Компьютер IBM 704 и язык FORTRAN47
2.3.1. Историческая ретроспектива48
2.3.2. Процесс разработки48
2.3.3. Обзор языка FORTRAN I49
2.3.4. Обзор языка FORTRAN II50
2.3.5. Языки FORTRAN IV, FORTRAN 77 и FORTRAN 9050
2.3.6. Оценка51
2.4. Функциональное программирование: язык LISP52
2.4.1. Истоки работ в области искусственного интеллекта и обработка списков52
2.4.2. Процесс разработки языка LISP52
2.4.3. Обзор языка53
2.4.4. Оценка54
2.4.5. Два потомка языка LISP55
2.4.6. Родственные языки55
2.5. Первый шаг к совершенствованию: язык ALGOL 6056
2.5.1. Историческая ретроспектива56
2.5.2. Начальная стадия разработки56
2.5.3. Обзор языка ALGOL 5857
2.5.4. Принятие отчета о языке ALGOL 5857
2.5.5. Процесс разработки языка ALGOL 6058
2.5.6. Обзор языка ALGOL 6058
2.5.7. Оценка языка ALGOL 6059
2.6. Компьютеризация коммерческих записей: язык COBOL60
2.6.1. Исторические предпосылки60
2.6.2. Язык FLOW-MATIC60
2.6.3. Процесс разработки языка COBOL61
2.6.4. Оценка61
2.7. Начало разделения времени: язык BASIC63
2.7.1. Процесс разработки63
2.7.2. Обзор языка64
2.7.3. Оценка64
2.8. Все для всех: язык PL/I65
2.8.1. Исторические предпосылки65
2.8.2. Процесс разработки66
2.8.3. Обзор языка66
2.8.4. Оценка67
2.9. Два ранних динамических языка: APL и SNOBOL68
2.9.1. Истоки и характеристики языка APL68
2.9.2. Происхождение и характеристики языка SNOBOL68
2.10. Возникновение абстракции данных: язык SIMULA 6769
2.10.1. Процесс разработки69
2.10.2. Обзор языка69
2.11. Ортогональная структура: язык ALGOL 6870
2.11.1. Процесс разработки70
2.11.2. Обзор языка70
2.11.3. Оценка70
2.12. Несколько важных наследников семейства языков ALGOL71
2.12.1. Преднамеренная простота: язык Pascal71
2.12.2. Машинно-независимый язык: С73
2.12.3. Другие потомки языка ALGOL75
2.13. Программирование, основанное на логике: язык Prolog76
2.13.1. Процесс разработки76
2.13.2. Обзор языка76
2.13.3. Оценка77
2.14. Величайший проект в истории: язык Ada77
2.14.1. Историческая ретроспектива77
2.14.2. Процесс разработки77
2.14.3. Обзор языка78
2.14.4. Оценка79
2.14.5. Язык Ada 9580
2.15. Объектно-ориентированное программирование: язык Smalltalk80
2.15.1. Процесс разработки81
2.15.2. Обзор языка81
2.15.3. Оценка82
2.16. Объединение императивных и объектно-ориентированных свойств: язык C++83
2.16.1. Процесс разработки83
2.16.2. Обзор языка84
2.16.3. Оценка84
2.16.4. Родственный язык: Eiffel84
2.17. Программирование в World Wide Web: язык Java85
2.17.1. Процесс разработки85
2.17.2. Обзор языка85
2.17.3. Оценка86
3. ОПИСАНИЕ СИНТАКСИСА И СЕМАНТИКИ90
3.1. Предисловие91
3.2. Общая задача описания синтаксиса91
3.2.1. Устройства распознавания языков92
3.2.2. Генераторы языков92
3.3. Формальные методы описания синтаксиса93
3.3.1. Форма Бэкуса-Наура и контекстно-свободные грамматики93
3.3.2. Расширенная форма БНФ101
3.3.3. Синтаксические графы102
3.3.4. Грамматики и устройства распознавания языков103
3.4. Рекурсивный нисходящий синтаксический анализ103
3.5. Атрибутивные грамматики105
3.5.1. Статическая семантика105
3.5.2. Основные понятия105
3.5.3. Определение атрибутивных грамматик105
3.5.4. Внутренние атрибуты106
3.5.5. Примеры атрибутивных грамматик106
3.5.6. Вычисление значений атрибутов108
3.5.7. Оценка109
3.6. Описание смысла программ: динамическая семантика109
3.6.1. Операционная семантика109
3.6.2. Аксиоматическая семантика111
3.6.3. Денотационная семантика118
4. ИМЕНА, СВЯЗЫВАНИЕ, ПРОВЕРКА ТИПОВ И ОБЛАСТИ ВИДИМОСТИ125
4.1. Предисловие127
4.2. Имена127
4.2.1. Вопросы структуры127
4.2.2. Виды имен127
4.2.3. Специальные слова128
4.3. Переменные129
4.3.1. Имя129
4.3.2. Адрес129
4.3.3. Тип130
4.3.4. Значение130
4.4. Концепция связывания131
4.4.1. Связывание атрибутов с переменными131
4.4.2. Связывание типов131
4.4.3. Связывание переменных с ячейками памяти и время их жизни134
4.5. Проверка типов136
4.6. Строгая типизация137
4.7. Совместимость типов138
4.8. Область видимости140
4.8.1. Статическая область видимости140
4.8.2. Блоки141
4.8.3. Оценка статического обзора данных142
4.8.4. Динамические области видимости144
4.8.5. Оценка динамического обзора данных145
4.9. Область видимости переменных и время их жизни146
4.10. Среды ссылок146
4.11. Именованные константы148
4.12. Инициализация переменных149
5. ТИПЫ ДАННЫХ155
5.1. Введение156
5.2. Элементарные типы данных158
5.2.1. Числовые типы158
5.2.2. Булевские типы159
5.2.3. Символьные типы160
5.3. Символьные строки160
5.3.1. Вопросы разработки160
5.3.2. Строки и действия над ними160
5.3.3. Варианты длины строк162
5.3.4. Оценка162
5.3.5. Реализация символьных строк163
5.4. Порядковые типы, определяемые пользователем163
5.4.1. Перечислимые типы164
5.4.2. Ограниченные типы165
5.4.3. Реализация порядковых типов, определяемых пользователем166
5.5. Массивы166
5.5.1. Вопросы разработки167
5.5.2. Массивы и индексы167
5.5.3. Связывания индексов и категории массивов168
5.5.4. Количество индексов массива170
5.5.5. Инициализация массива170
5.5.6. Операции над массивами171
5.5.7. Сечения172
5.5.8. Оценка173
5.5.9. Реализация типов массивов173
5.6. Ассоциативные массивы176
5.6.1. Структура и операции176
5.6.2. Реализация ассоциативных массивов177
5.7. Записи177
5.7.1. Описания записей178
5.7.2. Ссылки на поля записи178
5.7.3. Операции над записями179
5.7.4. Оценка180
5.7.5. Реализация записей180
5.8. Объединения181
5.8.1. Вопросы разработки181
5.8.2. Свободные объединения181
5.8.3. Размеченные объединения языка ALGOL 68181
5.8.4. Типы объединения в языке Pascal182
5.8.5. Объединения в языке Ada184
5.8.6. Оценка185
5.8.7. Реализация объединений185
5.9. Множества185
5.9.1. Множества в языках Pascal и Modula-2186
5.9.2. Оценка187
5.9.3. Реализация множественных типов данных187
5.10. Указатели187
5.10.1. Вопросы разработки188
5.10.2. Операции над указателями188
5.10.3. Проблемы, возникающие при использовании указателей189
5.10.4. Указатели в языке Pascal190
5.10.5. Указатели в языке Ada190
5.10.6. Указатели в языках C и C++191
5.10.7. Указатели в языке FORTRAN 90192
5.10.8. Ссылки192
5.10.9. Оценка193
5.10.10. Реализация ссылок и указателей194
6. ВЫРАЖЕНИЯ И ОПЕРАТОРЫ ПРИСВАИВАНИЯ202
6.1. Вступление204
6.2. Арифметические выражения204
6.2.1. Порядок вычисления операторов205
6.2.2. Порядок вычисления операндов208
6.3. Перегруженные операторы210
6.4. Преобразования типов211
6.4.1. Приведение типов в выражениях212
6.4.2. Явное преобразование типов213
6.4.3. Ошибки в выражениях213
6.5. Выражения отношений и булевские выражения213
6.5.1. Выражения отношения214
6.5.2. Булевские выражения214
6.6. Сокращенное вычисление215
6.7. Операторы присваивания216
6.7.1. Простые присваивания216
6.7.2. Множественные целевые объекты217
6.7.3. Условные целевые объекты217
6.7.4. Составные операторы присваивания217
6.7.5. Унарные операторы присваивания218
6.7.6. Присваивание как выражение218
6.8. Смешанные присваивания219
7. СТРУКТУРЫ УПРАВЛЕНИЯ НА УРОВНЕ ОПЕРАТОРОВ223
7.1. Введение225
7.2. Составные операторы225
7.3. Операторы ветвления226
7.3.1. Двухвариантные операторы ветвления226
7.3.2. Конструкции многовариантного ветвления230
7.4. Операторы цикла234
7.4.1. Циклы со счетчиком235
7.4.2. Логически управляемые циклы240
7.4.3. Циклы с механизмами управления, размещенными пользователем242
7.4.4. Циклы, основанные на структурах данных243
7.5. Безусловный переход244
7.5.1. Проблемы безусловного перехода244
7.5.2. Виды меток245
7.5.3. Ограничения переходов245
7.6. Защищенные команды246
7.7. Выводы249
8. ПОДПРОГРАММЫ253
8.1. Введение254
8.2. Основы подпрограмм255
8.2.1. Общие свойства подпрограмм255
8.2.2. Основные определения255
8.2.3. Параметры256
8.2.4. Процедуры и функции258
8.3. Вопросы разработки подпрограмм258
8.4. Среды локальных ссылок259
8.5. Методы передачи параметров260
8.5.1. Семантические модели передачи параметров260
8.5.2. Модели реализации передачи параметров261
8.5.3. Методы передачи параметров в основных языках программирования265
8.5.4. Проверка типов параметров266
8.5.5. Методы реализации передачи параметров267
8.5.6. Многомерные массивы в качестве параметров269
8.5.7. Вопросы разработки271
8.5.8. Примеры передачи параметров271
8.6. Параметры, являющиеся именами подпрограмм274
8.7. Перегруженные подпрограммы276
8.8. Настраиваемые подпрограммы277
8.8.1. Настраиваемые подпрограммы в языке Ada277
8.8.2. Настраиваемые подпрограммы в языке C++278
8.9. Раздельная и независимая компиляция280
8.10. Вопросы разработки функций281
8.10.1. Побочные эффекты функций281
8.10.2. Типы возвращаемых значений281
8.11. Доступ к нелокальным средам281
8.11.1. Блоки COMMON языка FORTRAN282
8.11.2. Внешние объявления и модули283
8.12. Перегруженные операторы, определяемые пользователем284
8.13. Сопрограммы284
9. РЕАЛИЗАЦИЯ ПОДПРОГРАММ289
9.1. Общая семантика вызовов и возвратов290
9.2. Реализация подпрограмм на языке FORTRAN 77290
9.3. Реализация подпрограмм на языках, подобных языку ALGOL292
9.3.1. Более сложные записи активации293
9.3.2. Пример без рекурсии и нелокальных ссылок294
9.3.3. Рекурсия296
9.3.4. Механизмы реализации нелокальных ссылок299
9.4. Блоки307
9.5. Реализация методов динамического обзора данных308
9.5.1. Глубокий доступ309
9.5.2. Теневой доступ310
9.6. Реализация параметров, являющихся именами подпрограмм311
9.6.1. Статические цепочки311
9.6.2. Индикаторы312
9.6.3. Ошибочное повторное обращение к среде ссылок312
10. АБСТРАКТНЫЕ ТИПЫ ДАННЫХ317
10.1. Понятие абстракции318
10.2. Инкапсуляция319
10.3. Введение в абстракцию данных319
10.3.1. Число с плавающей точкой как абстрактный тип данных320
10.3.2. Абстрактные типы данных, определяемые пользователем320
10.3.3. Пример321
10.4. Вопросы разработки типов321
10.5. Примеры абстракции данных в разных языках322
10.5.1. Классы в языке SIMULA 67322
10.5.2. Абстрактные типы данных в языке Ada323
10.5.3. Абстрактные типы данных в языке C++326
10.6. Параметризованные абстрактные типы данных329
10.6.1. Язык Ada330
10.6.2. Язык C++330
11. ПОДДЕРЖКА ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ334
11.1. Введение335
11.2. Объектно-ориентированное программирование336
11.2.1. Введение336
11.2.2. Наследование336
11.2.3. Полиморфизм и динамическое связывание338
11.2.4. Вычисления в объектно-ориентированных языках339
11.3. Вопросы разработки объектно-ориентированных языков339
11.3.1. Исключительность объектов339
11.3.2. Являются ли подклассы подтипами?339
11.3.3. Реализация и наследование интерфейса340
11.3.4. Проверка типов и полиморфизм340
11.3.5. Одиночное и множественное наследование341
11.3.6. Размещение в памяти и удаление из памяти объектов342
11.3.7. Динамическое и статическое связывание342
11.4. Обзор языка Smalltalk342
11.4.1. Общие характеристики342
11.4.2. Среда языка Smalltalk343
11.5. Введение в язык Smalltalk343
11.5.1. Выражения343
11.5.2. Методы345
11.5.3. Операторы присваивания346
11.5.4. Блоки и управляющие структуры347
11.5.5. Классы349
11.5.6. Дополнительные сведения о методах350
11.6. Примеры программ на языке Smalltalk351
11.6.1. Простой обработчик таблиц351
11.6.2. Графика в LOGO353
11.7. Главные особенности языка Smalltalk356
11.7.1. Проверка типов и полиморфизм356
11.7.2. Наследование356
11.8. Оценка языка Smalltalk357
11.9. Поддержка объектно-ориентированного программирования в языке C++357
11.9.1. Общие свойства357
11.9.2. Наследование358
11.9.3. Динамическое связывание361
11.9.4. Оценка362
11.10. Поддержка объектно-ориентированного программирования в языке Java363
11.10.1. Общие свойства363
11.10.2. Наследование363
11.10.3. Динамическое связывание364
11.10.4. Инкапсуляция364
11.10.5. Оценка365
11.11. Поддержка объектно-ориентированного программирования в языке Ada 95365
11.11.1. Общие свойства365
11.11.2. Наследование365
11.11.3. Динамическое связывание366
11.11.4. Оценка367
11.12. Поддержка объектно-ориентированного программирования в языке Eiffel367
11.12.1. Общие свойства368
11.12.2. Наследование368
11.12.3. Динамическое связывание369
11.12.4. Оценка369
11.13. Реализация объектно-ориентированных конструкций369
11.13.1. Хранение данных экземпляра370
11.13.2. Динамическое связывание сообщений с методами370
12. ПАРАЛЛЕЛЬНОСТЬ374
12.1. Введение376
12.1.1. Многопроцессорные архитектуры376
12.1.2. Разновидности параллельности377
12.1.3. Почему нужно изучать параллельность377
12.2. Введение в параллельность на уровне подпрограмм378
12.2.1. Основные понятия378
12.2.2. Разработка языков для поддержки параллельности380
12.2.3. Вопросы разработки языков программирования380
12.3. Семафоры381
12.3.1. Введение381
12.3.2. Синхронизация взаимодействия381
12.3.3. Синхронизация конкуренции383
12.3.4. Оценка384
12.4. Мониторы384
12.4.1. Введение384
12.4.2. Синхронизация взаимодействия385
12.4.3. Синхронизация конкуренции385
12.4.4. Оценка387
12.5. Передача сообщений387
12.5.1. Введение388
12.5.2. Концепция синхронной передачи сообщений388
12.5.3. Модель передачи сообщения в языке Ada 95388
12.5.4. Синхронизация взаимодействия392
12.5.5. Синхронизация крнкуренции392
12.5.6. Завершение задачи394
12.5.7. Приоритеты394
12.5.8. Бинарные семафоры394
12.5.9. Оценка395
12.6. Параллельность в языке Ada 95395
12.6.1. Защищенные объекты395
12.6.2. Асинхронные сообщения396
12.7. Потоки языка Java397
12.7.1. Класс Thread397
12.7.2. Приоритеты398
12.7.3. Синхронизация взаимодействия398
12.7.4. Синхронизация конкуренции399
12.7.5. Оценка401
12.8. Параллельность на уровне операторов401
12.8.1. Язык High-Performance FORTRAN401
13. ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ405
13.1. Введение в обработку исключительных ситуаций406
13.1.1. Основные понятия407
13.1.2. Вопросы разработки408
13.1.3. Исторический обзор410
13.2. Обработка исключительных ситуаций в языке PL/1410
13.2.1. Обработчики исключительных ситуаций410
13.2.2. Связывание исключительных ситуаций с обработчиками411
13.2.3. Продолжение411
13.2.4. Другие проектные решения411
13.2.5. Пример412
13.2.6. Оценка413
13.3. Обработка исключительных ситуаций в языке Ada414
13.3.1. Обработчики исключительных ситуаций414
13.3.2. Связывание исключительных ситуаций с обработчиками414
13.3.3. Продолжение415
13.3.4. Другие проектные решения416
13.3.5. Пример417
13.3.6. Оценка418
13.4. Обработка исключительных ситуаций в языке C++418
13.4.1. Обработчики исключительных ситуаций418
13.4.2. Связывание исключительных ситуаций с обработчиками419
13.4.3. Продолжение выполнения программы419
13.4.4. Другие проектные решения420
13.4.5. Пример420
13.4.6. Оценка421
13.5. Обработка исключительных ситуаций в языке Java421
13.5.1. Классы исключительных ситуаций421
13.5.2. Обработчики исключительных ситуаций422
13.4.3. Связывание исключительных ситуаций с обработчиками422
13.4.4. Продолжение выполнения программы423
13.4.5. Другие проектные решения423
13.4.6. Пример424
13.4.7. Оператор finally425
13.4.8. Оценка426
14. ФУНКЦИОНАЛЬНЫЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ430
14.1. Введение432
14.2. Математические функции432
14.2.1. Простые функции433
14.2.2. Функциональные формы433
14.3. Основы функциональных языков программирования434
14.4. Первый язык функционального программирования - LISP434
14.4.1. Типы и структуры данных435
14.4.2. Первый интерпретатор языка LISP436
14.5. Введение в язык Scheme437
14.5.1. Происхождение языка Scheme437
14.5.2. Элементарные функции437
14.5.3. Функции для построения функций440
14.5.4. Поток управления442
14.5.5. Пример функции на языке Scheme443
14.5.6. Функциональные формы446
14.5.7. Функции для создания кода446
14.5.8. Императивные свойства языка Scheme447
14.6. Язык COMMON LISP448
14.7. Язык ML449
14.8. Язык Haskell450
14.9. Применение функциональных языков453
14.10. Сравнение функциональных и императивных языков453
15. ЯЗЫКИ ЛОГИЧЕСКОГО ПРОГРАММИРОВАНИЯ457
15.1. Введение458
15.2. Краткое введение в исчисление предикатов459
15.2.1. Высказывания459
15.2.2. Дизъюнктивные формы460
15.3. Исчисление предикатов и доказательство теорем461
15.4. Обзор логического программирования463
15.5. Происхождение языка Prolog464
15.6. Основные элементы языка Prolog464
15.6.1. Термы464
15.6.2. Факты465
15.6.3. Правила465
15.6.4. Цель466
15.6.5. Процесс логического вывода в языке Prolog466
15.6.6. Простая арифметика468
15.6.7. Списковые структуры471
15.7. Недостатки языка Prolog474
15.7.1. Управление порядком выполнения резолюции474
15.7.2. Предположение о закрытом мире476
15.7.3. Проблема логического отрицания476
15.7.4. Внутренние ограничения478
15.8. Применение логического программирования478
15.8.1. Системы управления реляционными базами данных478
15.8.2. Экспертные системы479
15.8.3. Системы обработки естественных языков479
15.8.4. Образование480
15.9. Выводы480
ПРЕДМЕТНЫЙ УКАЗАТЕЛЬ491

Copyright © 1992-2019 Издательская группа "Диалектика-Вильямс"

Rambler  Top100