Б. Страуструп - Язык программирования С++ (1119446), страница 9
Текст из файла (страница 9)
Если даже эти довольно эффективные операции становятсяслишком дорогими, то вызов функции может быть заменен подстановкой ее тела, причем сохраняетсяудобная функциональная запись безо всяких расходов на вызов функции.Первоначально язык С задумывался как конкурент ассемблера, способный вытеснить его из основных инаиболее требовательных к ресурсам задач системного программирования. В проекте С++ былиприняты меры, чтобы успехи С в этой области не оказались под угрозой. Различие между двумяязыками прежде все состоит в степени внимания, уделяемого типам и структурам.
Язык С выразителени в то же время снисходителен по отношению к типам. Язык С++ еще более выразителен, но такойвыразительности можно достичь лишь тогда, когда типам уделяют большое внимание. Когда типыобъектов известны, транслятор правильно распознает такие выражения, в которых иначе программиступришлось бы записывать операции с утомительными подробностями. Кроме того, знание типовпозволяет транслятору обнаруживать такие ошибки, которые в противном случае были бы выявленытолько при тестировании. Отметим, что само по себе использование строгой типизации языка дляконтроля параметров функции, защиты данных от незаконного доступа, определения новых типов иопераций не влечет дополнительных расходов памяти и увеличения времени выполнения программы.16Бьерн Страуструп.Язык программирования С++В проекте С++ особое внимание уделяется структурированию программы.
Это вызвано увеличениемразмеров программ со времени появления С. Небольшую программу (скажем, не более 1000 строк)можно заставить из упрямства работать, нарушая все правила хорошего стиля программирования.Однако, действуя так, человек уже не сможет справиться с большой программой.
Если у вашейпрограммы в 10 000 строк плохая структура, то вы обнаружите, что новые ошибки появляются в ней также быстро, как удаляются старые. С++ создавался с целью, чтобы большую программу можно былоструктурировать таким образом, чтобы одному человеку не пришлось работать с текстом в 25000 строк.В настоящее время можно считать, что эта цель полностью достигнута.Существуют, конечно, программы еще большего размера. Однако те из них, которые действительноиспользуются, обычно можно разбить на несколько практически независимых частей, каждая из которыхимеет значительно меньший упомянутого размер. Естественно, трудность написания и сопровожденияпрограммы определяется не только числом строк текста, но и сложностью предметной области.
Так чтоприведенные здесь числа, которыми обосновывались наши соображения, не надо восприниматьслишком серьезно.К сожалению, не всякую часть программы можно хорошо структурировать, сделать независимой отаппаратуры, достаточно понятной и т.д. В С++ есть средства, непосредственно и эффективнопредставляющие аппаратные возможности. Их использование позволяет избавиться от беспокойства онадежности и простоте понимания программы. Такие части программы можно скрывать, предоставляянадежный и простой интерфейс с ними.Естественно, если С++ используется для большой программы, то это означает, что язык используютгруппы программистов. Полезную роль здесь сыграют свойственные языку модульность, гибкость истрого типизированныеинтерфейсы.
В С++ есть такой же хороший набор средств для создания большихпрограмм, как во многих языках. Но когда программа становится еще больше, проблемы по еесозданию и сопровождению перемещаются из области языка в более глобальную область программныхсредств и управления проектом. Этим вопросам посвящены главы 11 и 12.В этой книге основное внимание уделяется методам создания универсальных средств, полезных типов,библиотек и т.д.
Эти методы можно успешно применять как для маленьких, так и для большихпрограмм. Более того, поскольку все нетривиальные программы состоят из нескольких в значительнойстепени независимых друг от друга частей, методы программирования отдельных частей пригодятсякак системным, так и прикладным программистам.Может возникнуть подозрение, что запись программы с использованием подробной системы типов,увеличит размер текста. Для программы на С++ это не так: программа на С++, в которой описаны типыформальных параметров функций, определены классы и т.п., обычно бывает даже короче своегоэквивалента на С, где эти средства не используются. Когда в программе на С++ используютсябиблиотеки, она также оказывается короче своего эквивалента на С, если, конечно, он существует.Философские замечанияЯзык программирования решает две взаимосвязанные задачи: позволяет программисту записатьподлежащие выполнению действия и формирует понятия, которыми программист оперирует,размышляя о своей задаче.
Первой цели идеально отвечает язык, который очень "близок машине".Тогда со всеми ее основными "сущностями" можно просто и эффективно работать на этом языке,причем делая это очевидным для программиста способом. Именно это имели в виду создатели С.Второй цели идеально отвечает язык, который настолько "близок к поставленной задаче", что на немнепосредственно и точно выражаются понятия, используемые в решении задачи. Именно это имелось ввиду, когда первоначально определялись средства, добавляемые к С.Связь между языком, на котором мы думаем и программируем, а также между задачами и ихрешениями, которые можно представить в своем воображении, довольно близка.
По этой причинеограничивать возможности языка только поиском ошибок программиста - в лучшем случае опасно. Каки в случае естественных языков, очень полезно обладать, по крайней мере, двуязычием. Языкпредоставляет программисту некоторые понятия в виде языковых инструментов; если они не подходятдля задачи, их просто игнорируют. Например, если существенно ограничить понятие указателя, топрограммист будет вынужден для создания структур, указателей и т.п. использовать вектора иоперации с целыми. Хороший проект программы и отсутствие в ней ошибок нельзя гарантироватьтолько наличием или отсутствием определенных возможностей в языке.17Бьерн Страуструп.Язык программирования С++Типизация языка должна быть особенно полезна для нетривиальных задач.
Действительно, понятиекласса в С++ проявило себя как мощное концептуальное средство.Замечания о программировании на языке С++Предполагается, что в идеальном случае разработка программы делится на три этапа: вначаленеобходимо добиться ясного понимания задачи, затем определить ключевые понятия, используемыедля ее решения, и, наконец, полученное решение выразить в виде программы. Однако, детали решенияи точные понятия, которые будут использоваться в нем, часто проясняются только после того, как ихпопытаются выразить в программе. Именно в этом случае большое значение приобретает выбор языкапрограммирования.Во многих задачах используются понятия, которые трудно представить в программе в виде одного изосновных типов или в виде функции без связанных с ней статических данных.
Такое понятие можетпредставлять в программе класс. Класс - это тип; он определяет поведение связанных с ним объектов:их создание, обработку и уничтожение. Кроме этого, класс определяет реализацию объектов в языке,но на начальных стадиях разработки программы это не является и не должно являться главнойзаботой. Для написания хорошей программы надо составить такой набор классов, в котором каждыйкласс четко представляет одно понятие. Обычно это означает, что программист долженсосредоточиться на вопросах: Как создаются объекты данного класса? Могут ли они копироваться и(или) уничтожаться? Какие операции можно определить над этими объектами? Если на эти вопросыудовлетворительных ответов не находится, то, скорее всего, это означает, что понятие не былодостаточно ясно сформулировано.
Тогда, возможно, стоит еще поразмышлять над задачей ипредлагаемым решением, а не немедленно приступать к программированию, надеясь в процессе негонайти ответы.Проще всего работать с понятиями, которые имеют традиционную математическую формупредставления: всевозможные числа, множества, геометрические фигуры и т.д. Для таких понятийполезно было бы иметь стандартные библиотеки классов, но к моменту написания книги их еще небыло. В программном мире накоплено удивительное богатство из таких библиотек, но нет ниформального, ни фактического стандарта на них. Язык С++ еще достаточно молод, и его библиотеки неразвились в такой степени, как сам язык.Понятие не существует в вакууме, вокруг него всегда группируются связанные с ним понятия.Определить в программе взаимоотношения классов, иными словами, установить точные связи междуиспользуемыми в задаче понятиями, бывает труднее, чем определить каждый из классов сам по себе.