Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Новинки компьютерных книг ->> Основные концепции языков программирования


Служба Рассылок Subscribe.Ru

Visit Williams Visit Dialektika

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

5-е издание

Роберт В Себеста

 
Библиография

Цена на diamail - 42.95 грн.

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

Предисловие

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

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

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

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

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

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

Глава 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 являются императивными. Мы рассматриваем поддержку объектно-ориентированного программирования данными языками как начало следующей стадии развития императивных языков программирования. В то время как парадигма развития объектно-ориентированного программного обеспечения значительно отличается от процедурной парадигмы, различия между языками, относящимися к данным двум подходам, не столь значительны. В то же время различия между такими я

Кроме указанных, были внесены еще некоторые изменения. Появление языка 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 Code 46
2.2.2. Система Speedcoding 47
2.2.3. Система "компиляции" UNIVAC 47
2.2.4. Смежная работа 47
2.3. Компьютер IBM 704 и язык FORTRAN 47
2.3.1. Историческая ретроспектива 48
2.3.2. Процесс разработки 48
2.3.3. Обзор языка FORTRAN I 49
2.3.4. Обзор языка FORTRAN II 50
2.3.5. Языки FORTRAN IV, FORTRAN 77 и FORTRAN 90 50
2.3.6. Оценка 51
2.4. Функциональное программирование: язык LISP 52
2.4.1. Истоки работ в области искусственного интеллекта и обработка списков 52
2.4.2. Процесс разработки языка LISP 52
2.4.3. Обзор языка 53
2.4.4. Оценка 54
2.4.5. Два потомка языка LISP 55
2.4.6. Родственные языки 55
2.5. Первый шаг к совершенствованию: язык ALGOL 60 56
2.5.1. Историческая ретроспектива 56
2.5.2. Начальная стадия разработки 56
2.5.3. Обзор языка ALGOL 58 57
2.5.4. Принятие отчета о языке ALGOL 58 57
2.5.5. Процесс разработки языка ALGOL 60 58
2.5.6. Обзор языка ALGOL 60 58
2.5.7. Оценка языка ALGOL 60 59
2.6. Компьютеризация коммерческих записей: язык COBOL 60
2.6.1. Исторические предпосылки 60
2.6.2. Язык FLOW-MATIC 60
2.6.3. Процесс разработки языка COBOL 61
2.6.4. Оценка 61
2.7. Начало разделения времени: язык BASIC 63
2.7.1. Процесс разработки 63
2.7.2. Обзор языка 64
2.7.3. Оценка 64
2.8. Все для всех: язык PL/I 65
2.8.1. Исторические предпосылки 65
2.8.2. Процесс разработки 66
2.8.3. Обзор языка 66
2.8.4. Оценка 67
2.9. Два ранних динамических языка: APL и SNOBOL 68
2.9.1. Истоки и характеристики языка APL 68
2.9.2. Происхождение и характеристики языка SNOBOL 68
2.10. Возникновение абстракции данных: язык SIMULA 67 69
2.10.1. Процесс разработки 69
2.10.2. Обзор языка 69
2.11. Ортогональная структура: язык ALGOL 68 70
2.11.1. Процесс разработки 70
2.11.2. Обзор языка 70
2.11.3. Оценка 70
2.12. Несколько важных наследников семейства языков ALGOL 71
2.12.1. Преднамеренная простота: язык Pascal 71
2.12.2. Машинно-независимый язык: С 73
2.12.3. Другие потомки языка ALGOL 75
2.13. Программирование, основанное на логике: язык Prolog 76
2.13.1. Процесс разработки 76
2.13.2. Обзор языка 76
2.13.3. Оценка 77
2.14. Величайший проект в истории: язык Ada 77
2.14.1. Историческая ретроспектива 77
2.14.2. Процесс разработки 77
2.14.3. Обзор языка 78
2.14.4. Оценка 79
2.14.5. Язык Ada 95 80
2.15. Объектно-ориентированное программирование: язык Smalltalk 80
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. Родственный язык: Eiffel 84
2.17. Программирование в World Wide Web: язык Java 85
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 68 181
5.8.4. Типы объединения в языке Pascal 182
5.8.5. Объединения в языке Ada 184
5.8.6. Оценка 185
5.8.7. Реализация объединений 185
5.9. Множества 185
5.9.1. Множества в языках Pascal и Modula-2 186
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. Указатели в языке Pascal 190
5.10.5. Указатели в языке Ada 190
5.10.6. Указатели в языках C и C++ 191
5.10.7. Указатели в языке FORTRAN 90 192
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. Настраиваемые подпрограммы в языке Ada 277
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 языка FORTRAN 282
8.11.2. Внешние объявления и модули 283
8.12. Перегруженные операторы, определяемые пользователем 284
8.13. Сопрограммы 284
9. РЕАЛИЗАЦИЯ ПОДПРОГРАММ 289
9.1. Общая семантика вызовов и возвратов 290
9.2. Реализация подпрограмм на языке FORTRAN 77 290
9.3. Реализация подпрограмм на языках, подобных языку ALGOL 292
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 67 322
10.5.2. Абстрактные типы данных в языке Ada 323
10.5.3. Абстрактные типы данных в языке C++ 326
10.6. Параметризованные абстрактные типы данных 329
10.6.1. Язык Ada 330
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. Обзор языка Smalltalk 342
11.4.1. Общие характеристики 342
11.4.2. Среда языка Smalltalk 343
11.5. Введение в язык Smalltalk 343
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. Примеры программ на языке Smalltalk 351
11.6.1. Простой обработчик таблиц 351
11.6.2. Графика в LOGO 353
11.7. Главные особенности языка Smalltalk 356
11.7.1. Проверка типов и полиморфизм 356
11.7.2. Наследование 356
11.8. Оценка языка Smalltalk 357
11.9. Поддержка объектно-ориентированного программирования в языке C++ 357
11.9.1. Общие свойства 357
11.9.2. Наследование 358
11.9.3. Динамическое связывание 361
11.9.4. Оценка 362
11.10. Поддержка объектно-ориентированного программирования в языке Java 363
11.10.1. Общие свойства 363
11.10.2. Наследование 363
11.10.3. Динамическое связывание 364
11.10.4. Инкапсуляция 364
11.10.5. Оценка 365
11.11. Поддержка объектно-ориентированного программирования в языке Ada 95 365
11.11.1. Общие свойства 365
11.11.2. Наследование 365
11.11.3. Динамическое связывание 366
11.11.4. Оценка 367
11.12. Поддержка объектно-ориентированного программирования в языке Eiffel 367
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 95 388
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 95 395
12.6.1. Защищенные объекты 395
12.6.2. Асинхронные сообщения 396
12.7. Потоки языка Java 397
12.7.1. Класс Thread 397
12.7.2. Приоритеты 398
12.7.3. Синхронизация взаимодействия 398
12.7.4. Синхронизация конкуренции 399
12.7.5. Оценка 401
12.8. Параллельность на уровне операторов 401
12.8.1. Язык High-Performance FORTRAN 401
13. ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ 405
13.1. Введение в обработку исключительных ситуаций 406
13.1.1. Основные понятия 407
13.1.2. Вопросы разработки 408
13.1.3. Исторический обзор 410
13.2. Обработка исключительных ситуаций в языке PL/1 410
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. Обработка исключительных ситуаций в языке Ada 414
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. Обработка исключительных ситуаций в языке Java 421
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. Оператор finally 425
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. Первый язык функционального программирования - LISP 434
14.4.1. Типы и структуры данных 435
14.4.2. Первый интерпретатор языка LISP 436
14.5. Введение в язык Scheme 437
14.5.1. Происхождение языка Scheme 437
14.5.2. Элементарные функции 437
14.5.3. Функции для построения функций 440
14.5.4. Поток управления 442
14.5.5. Пример функции на языке Scheme 443
14.5.6. Функциональные формы 446
14.5.7. Функции для создания кода 446
14.5.8. Императивные свойства языка Scheme 447
14.6. Язык COMMON LISP 448
14.7. Язык ML 449
14.8. Язык Haskell 450
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. Происхождение языка Prolog 464
15.6. Основные элементы языка Prolog 464
15.6.1. Термы 464
15.6.2. Факты 465
15.6.3. Правила 465
15.6.4. Цель 466
15.6.5. Процесс логического вывода в языке Prolog 466
15.6.6. Простая арифметика 468
15.6.7. Списковые структуры 471
15.7. Недостатки языка Prolog 474
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

Вернуться к начальной странице



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное