Новинки компьютерных книг ->> Основные концепции языков программирования
Основные концепции языков программирования5-е изданиеРоберт В Себеста
ПредисловиеЦели, общая структура и подход к изложению материала в пятом издании "Концепций языков программирования" остались теми же, что и в четырех предыдущих изданиях. Основная цель книги - предоставить читателю инструменты, необходимые для критической оценки существующих и будущих языков и конструкций программирования. Дополнительной целью является подготовка читателя к изучению методов разработки и создания компиляторов. Книга должна также дать ответы на бесчисленные вопросы, которые могут возникнуть у читателя, знакомого исключительно с языками программирования высокого уровня. Например, почему существует так много языков программирования? Как и для чего они создавались? Насколько они похожи? Чем отличаются? Появления каких языков можно ожидать в будущем? И почему мы просто не можем продолжать использовать языки, которые уже есть? Существует два подхода к организации структуры книги, посвященной концепциям языков программирования: вертикальный и горизонтальный. При горизонтальном подходе каждый выбранный язык анализируется на определенном уровне. Если используется вертикальный подход, то общие концепции и конструкции языков программирования описываются в определенной последовательности. Для каждой конструкции рассматриваются вопросы ее реализации, разбираются примеры программ, написанных на различных языках. Оба подхода имеют свои достоинства. Для того чтобы точно описать индивидуальные концепции каждого языка, нужно сосредоточить на них внимание и рассмотреть их влияние на программирование и эволюцию языков программирования. Однако хронологический анализ развития языков неизбежно влечет за собой изучение специфики языков, а также их происхождения и развития. Более того, на реализацию определенной функции в отдельном языке всегда оказывают влияние другие характеристики этого языка. В связи с этим в книге было решено при изложении бо В этой книге описаны основные концепции языков программирования, вопросы, связанные с разработкой разнообразных языковых конструкций, а также проанализированы различные подходы к реализации этих конструкций в наиболее распространенных языках программирования. Указанный подход требует изучения набора тесно связанных между собой тем. Для обсуждения языков и языковых конструкций жизненно необходимы описательные инструменты. Нами подробно рассмотрены самые эффективные и широко распространенные методы синтаксического описания, а также введены наиболее общие методы описания семантики языков программирования. Для того чтобы понять причины выбора конкретных проектных решений в существующих языках программирования, следует изучать исторический контекст и конкретные нужды, обусловившие этот выбор. Поскольку сложность реализации языка зачастую значительно влияет на его разработку в целом, в книге обсуждаются различные методы и проблемы реализации языков программирования. Ниже приводится краткое содержание глав пятого издания книги.Глава 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-узлах:
Обновленные версии можно найти на домашней странице данной книги: 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). Пятое издание рецензировали:
В заключение автор благодарит своих детей - Джейка (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 |
Отписаться
Убрать рекламу |
В избранное | ||