|
Программирование >> Полиморфизм без виртуальных функций в с++
полиморфизм без виртуальных-функций С++ проектировался с целью обеспечить средства организации программ, присущие языку Simula, а также необходимую для системного программирования эффективность и гибкость, свойственные С. Предполагалось, что от замысла до его первой реализации пройдет примерно полгода. Так оно и вышло. Тогда - в середине 1979 г. - я еще не осознавал, насколько эта цель была скромной и в то же время абсурдной. Скромной - потому что не предполагалось вводить какие бы то ни было новшества, абсурдной - из-за слишком жестких временных рамок и драконовских требований к эффективности и гибкости языка. Новшества со временем все же появились, но в вопросах эффективности и гибкости ни на какие компромиссы я не пошел. С годами цели С++ уточнялись, видоизменялись и формулировались более четко, но и сегодня язык в точности отражает первоначально поставленные цели. Назначение книги, которую вы держите в руках, - документировать эти цели, проследить их эволюцию и представить на суд читателей тот С++, который появился в результате. Я старался уделять равное внимание историческим фактам (именам, местам и событиям) и техническим вопросам дизайна, реализации и применения языка. Я стремился фиксировать не каждое событие, а лишь ключевые идеи и направления развития, которые уже повлияли на определение С++ и, возможно, еще скажутся на его дальнейшей эволюции и практике применения. Если я упоминаю некоторое событие, то стараюсь не выдавать желаемое за действительное. Там, где это уместно, приводятся цитаты из различных статей, иллюстрирующие, как разные цели, принципы или свойства языка представлялись в то время. Я не пытаюсь давать оценку прошлому с позиций сегодняшнего дня. Воспоминания о событиях и замечания по поводу последствий принятых тогда решений отделены от основного текста и помечены. Я вообще питаю отвращение к историческому ревизионизму и стараюсь этого избегать. Приведу в пример свое старое высказывание: Я пришел к выводу, что система типов в языке Pascal не просто бесполезна- это смирительная рубашка, которая создает проблем больше, чем решает, заставляя меня жертвовать чистотой дизайна ради удовлетворения причуд компилятора . Так я думал в то время, и данное мнение существенно повлияло на эволюцию С++. Было ли это резкое осуждение Pascal справедливым и стал бы я сегодня (по прошествии более десяти лет) судить точно так же, не имеет значения. Я не могу притвориться, что этого не было (чтобы пощадить чувства приверженцев Pascal или избавить себя от чувства неловкости и лишних споров) или как-то пригладить свое высказывание (приведя более полную и сбалансированную точку зрения), не исказив при этом историю С++. Когда я говорю о людях, которые внесли вклад в дизайн и эволюцию С++, то по возможности уточняю, в чем именно их заслуга и когда это происходило. Но тут есть опасность. Поскольку память моя несовершенна, я вполне мог что-то забыть. Приношу свои извинения. Я называю имена тех, кто способствовал принятию того или иного решения относительно С++. Увы, не всегда это именно тот человек, который впервые столкнулся с определенной проблемой или задумался о ее решении. Досадно, однако вообще отказаться от упоминания имен было бы еще хуже. Не стесняйтесь сообщать мне обо всем, что могло бы внести ясность в этот вопрос. Когда описываешь исторические события, всегда заду.мываешься об объективности. Неизбежную предвзятость я старался компенсировать получением информации о событиях, в которых сам не принимал участия, и беседами с другими участниками событий. Еще я попросил нескольких человек, имеющих отношение к эволюции С++, прочесть эту книгу. Их имена приведены в конце предисловия. Ну и, кроме того, статья, представленная на второй конференции по истории языков программирования [Stroustrup, 1993] и содержащая основные исторические факты, упоминаемые в этой книге, была тщательно переработана и освобождена от излишней предвзятости. Как читать эту книгу в части I описывается дизайн, эволюция, практика применения и процесс стандартизации С++ в относительной хронологической последовательности. Такая схема выбрана потому, что решения, принимавшиеся в ранние годы, выстраиваются в четкую, логичную временную цепочку. В главах 1,2 и 3 описываются истоки С++ и его эволюция от С with Classes к версии 1.0. В главе 4 излагаются правила, по которым С++ развивался в течение этого периода и позже. Главы 5, 6 посвящены соответственно хронологии разработки после выхода версии 1.0 и процессу стандартизации С++ под эгидой ANSI/ISO. О перспективе развития языка говорится в 7 и 8 главах, где анализируются приложения, инструментальные средства и библиотеки. И, наконец, в главе 9 представлены ретроспективный взгляд и некоторые общие мысли о перспективах развития С++. В части П описывается разработка С++ после выхода версии 1.0. Язык развивался в тех направлениях, которые были определены уже ко времени выпуска версии 1.0: добавление желательных свойств (к примеру, шаблонов и обработки исключений) и принципов их дизайна. После появления версии 1.0 хронологический порядок событий был уже не так важен для разработки С++. Определение языка в основных чертах осталось бы таким же, как сейчас, даже если бы последовательность реализации расширений была бы иной. То, в каком порядке решались задачи и как к языку добавлялись новые свойства, представляет лишь исторический интерес. Строго хронологическое изложение помешало бы логически естественному представлению идей, поэтому в основу построения части II положено описание важнейших свойств языка. Отдельные главы части II не зависят друг от друга, так что читать их можно в любом порядке. Глава 10 посвящена управлению памятью, 11 - перегрузке, 12 - множественному наследованию, 13 - уточнениям концепции класса, 14 - приведению типов, 15 - шаблонам, 16 - обработке исключений, 17 - пространствам имен, 18 - препроцессору С. Люди ждут от книги по дизайну и эволюции языка программирования разного. Не найдется двух человек, имеющих одинаковое мнение о степени детализации, необходимой при обсуждении некоторой темы. Так, все рецензии на варианты статьи, представленной на конференции HOPL-2, строились по одинаковому шаблону: Статья слишком длинная... пожалуйста, уделите больше внимания темам X, у и z . И пока одни рецензенты говорили: Исключите философскую дребедень, пусть будет побольше технических деталей , другие требовали: Избавьте от этих утомительных деталей, мне интересна философия проектирования . Чтобы выйти из этого положения, я написал книгу внутри книги. Если вас не интересуют детали, то для начала пропустите все подразделы, имеющие номера x.y.z, где X - номер главы, а у - номер раздела. А из оставшегося читайте то, что вам интереснее. Впрочем, читать можно и последовательно, от первой до последней страницы. Правда при этом вы рискуете увязнуть в деталях. Я вовсе не хочу сказать, что они несущественны. Напротив, никакой язык программирования нельзя понять, рассматривая только его общие принципы. Без конкретных примеров никак не обойтись. Но, если изучать только детали и не представлять общей картины, можно окончательно запутаться. Стремясь облегчить участь читателя, я поместил в часть II обсуждение почти всех новых свойств языка, которые принято считать продвинутыми . Поэтому о базовых конструкциях говорится в I части. Почти вся информация о нетехнических аспектах эволюции С++ сосредоточена здесь же. Те, кто не любит философских материй , могут пропустить главы с 4 по 9 и сразу перейти к техническим деталям, описанным в части II. Я предвижу, что кое-кто захочет использовать эту книгу как справочный материал, а многие прочтут лишь отдельные главы, не обращая внимания на то, что им предшествует. Такой подход тоже возможен, поскольку я постарался сделать главы по возможности замкнутыми и, как опытный программист на С++, не поскупился на перекрестные ссылки и составил подробный предметный указатель. Пожалуйста, имейте в виду, что в книге я не пытаюсь строго определить возможности языка С++. Здесь излагаются лишь подробности, необходимые для описания того, как появилось на свет то или иное средство. Я не ставлю себе целью научить программированию или проектированию с использованием С++. Тех, кому это интересно, отсылаю к работе [2nd]. Хронология С++ Приведенная ниже хронологическая таблица поможет вам лзше представить то, о чем говорится дальше.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |