Замечания по проекту языка




Введение

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

Процесс программирования связан с построением алгоритмов. Поэтому программирование – это создание алгоритма решения задачи и его представление в виде программы.

Начальные понятия: задача, алгоритм, программа, вычислительная машина.

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

Объектами бывают числа (целые, дробные, вещественные, комплексные). В этом случае говорят о вычислении задачи. Объекты могут быть текстовыми и логическими. Совокупностью всех перечисленных объектов характеризуются задачи обработки ведомостей, банковских счетов, задачи анализа различных текстов.

Понятия алгоритма относится к числу первичных неопределяемых.

Алгоритм- это строгая и четкая конечная система правил, которая определяет последовательность действий над некоторыми объектами и после конечного числа шагов приводит к решению задачи.

Поясним понятие действия. Под действием понимают нечто, что имеет конечную продолжительность и приводит к желаемому результату.

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

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

Исполнителем действий согласно заданным инструкциям является процессор. Это определение кто является исполнителем- человек или вычислительная машина.

В вычислительной машине выделяют два компонента:

· Запоминающее устройство

· Процессор

Работа вычислительной машины управляется программой. Американский математик Джон фон Нейман предложил вводить программу и объекты в память машины, таким образом, в памяти в закодированном виде содержатся программа и объекты, над которыми по программе вычислительная машина выполняет операции. Такой принцип был назван принципом хранимой программы. В результате программу можно рассмотреть как объект воздействия. Программа теперь может перерабатывать себя и изменяться по мере необходимости в зависимости от результата вычисления. Процессор объединяет арифметические и логические устройства. Во время работы данные читаются из памяти, а результаты заносятся в память. Вычислительная машина выступает в роли исполнителя программы. Вычислительная машина – это автомат, который выполняет вычислительную работу по точно предписанным правилам (инструкции). Кроме того, вычислительная машина может за короткое время выполнять длинные последовательности команд, содержащие многообразные комбинации элементарных действий.

 

Этапы программирования.

Процесс подготовки задачи к решению на вычислительной машине условно включают в себя этапы:

1. Материальная формулировка задачи

2. Выбор метода решения задач

3. Разработка алгоритма

4. Описание алгоритма на алгоритмическом языке (полученная программа)

5. Тестирование программы

6. Проведение расчетов, анализ результатов

Некоторые из этапов могут быть исключены самой постановкой задачи.

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

«Материальная модель- приближенное описание какого-либо класса явлений внешнего мира, выраженную с помощью материальной символики».(А.И.Тихонов)

Таким образом, на этапе материальной формулировки задания описываются в виде некоторой материальной конструкции.

Второй этап состоит в решении поставленных материальных заданий. Материальная модель уже можно изучать чисто математическими методами, не вдаваясь в физическую природу объекта. Другими словами, необходимо выбрать метод решения задачи, с помощью которого разработать алгоритм решения.(третий этап)

Далее следует представить алгоритм в таком виде, чтобы вычислительная машина могла его выполнить(4 этап).Для этого нужно разбить алгоритм на элементарные операции, которые умеет выполнять машина, и записать каждую такую операцию на языке, понятном этой машине, т.е. представить алгоритм в виде программы.

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

Как следует из анализа приведенных этапов, основная работа выполняется человеком без использования вычислительной машины. Фундаментальные идеи, лежащие в основании конструирующихся алгоритмов(в конечном итоге программ), можно объяснить и понять, не упоминая при этом вычислительную машину. Перечисленные этапы определяют процесс программирования. Программирование –дисциплина многоплановая, оно соединяет множество нетривиальных проблем, требующих теоретического фундамента и систематического подхода. Интересные исследования и слабые проблемы возникают тогда, когда программы достигают определенной сложности и больших размеров.

 

Виды программирования.

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

С увеличением размеров программ стали выделять их обособленные части и оформлять их как подпрограммы. Часть таких подпрограмм объединялась в библиотеки, из которых подпрограммы можно было включать в рабочие программы и затем вызывать из рабочих программ. Это положило начало процедурному программированию - большая программа представлялась совокупностью процедур-подпрограмм. Одна из подпрограмм являлась главной и с нее начиналось выполнение программы.

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

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

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

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

 

 

Языки программирования.

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

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

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

- Построением языка программирования, содержащего как можно больше типов данных, и выбором для каждого класса задач некоторого подмножества этого языка. Такой язык иногда называют языком-оболочкой. На роль языка-оболочки претендовал язык ПЛ/1, оказавшийся настолько сложным, что так и не удалось построить его формализованное описание. Отсутствие формализованного описания, однако, не помешало широкому применению ПЛ/1 как в Западной Европе, так и в СССР.

- Построением расширяемого языка, содержащего небольшое ядро и допускающего расширение, дополняющее язык типами данных и операторами, отражающими концептуальную сущность конкретного класса задач. Такой язык называют языком-ядром. Как язык-ядро были разработаны языки Симула и Алгол-68, не получившие широкого распространения, но оказавшие большое влияние на разработку других языков программирования.

Дальнейшим развитием второго пути явился объектно-ориентированный подход к программированию.

 

 

Понятие алгоритма.

Понятие алгоритма является основным при решении задачи с использование вычислительной машины. Подробный анализ этого понятия дается Д.Кнутом в его книге «Искусство программирования для ЭВМ», том 1. Отметим, что слово «алгоритм»(algorithm) определяло правило выполнения арифметических действий с использованием арабских цифр(1747 код).

К 1950 году под словом «алгоритм» подразумевали изложенный в «элементах» Евклида алгоритм Евклида- процесс нахождения наибольшего общего делителя двух чисел.

Современное значение «алгоритма» сравнимо по смыслу со значением слова: рецепт, процесс, метод, способ, процедура программа. Однако, в слове «алгоритм» имеется свой дополнительный оттенок. Помимо того, что алгоритм –это описание процесса решения некоторой задачи, он имеет следующие важные особенности (св-ва):

· Дискретность, т.е. процесс решения, протекает в виде последовательности отдельных действий, следующие друг за другом.

· Элементарность действий, т.е. каждое действие является настолько простым, что не вызывает сомнений и возможности неоднозначного толкования.

· Детерминированность (определенность), т.е. каждое действие однозначно определено и после выполнения каждогодействия однозначно определяется, какое действие надо выполнить следующим.

· Конечность, т.е. алгоритм заканчивается после конечного числа действий (шагов).

· Результативность, т.е. в момент прекращения работы алгоритма известно, что считать его результатом.

· Массовость, т.е. алгоритм описывает некоторое множество процессов, применимых при различных входных данных.

Элементарность действий является относительным свойством алгоритма. Один и тот же метод может допускать различные алгоритмы. Проиллюстрируем введенное понятие в примерах:

 

Задание№1: Найти наибольший общий делитель d чисел a и b.

Входные данные: а и b – принадлежат к классу N (натуральные числа).

Выходные данные: d –принадлежит классу N

Метод решения: Приведем несколько методов решения этой задачи:

(1) Метод разложения каждого числа на степени простых множителей.

(2) Метод, который имеет название «Алгоритм Евклида»

(3) Метод, основанный на вычитании чисел, т.е. реализация алгоритма Евклида с использованием операций вычисления.

Для каждого из этих методов опишем в виде последовательности пронумерованных действий.

Алгоритм№1:

П1: Для каждого числа а найти показатели k1,k2,k3…k n, простые множители 2,3,5 …,pn в его разложении, т.е.

a=2k1. 1.3k2.5k3…p m Kn

П2:Для числа b найти j1,j2,j3,…j m простых множителей 2,3,5, …p m в его разложении, т.е.

b = 2j1 . 3 j2 . 5 j3…p mjm

П3:Найти q=max(n, m)

П4:Если n>q, то все показатели, включая kq,положить равными 0.

П5: Если m<q,то все показатели, включая j q,положить равными 0.

П6: Для каждого простого множителя найти

t= min(k1, j1),…,tq = min (kq, jq)

П7: Положить

D= 2t1 . 3t2 . 5t3 . pqtq

П8: Прекратить работу.

Алгоритм№2.

П1: Задать число а и b.

П2: Выбрать из этих чисел большее, назовем его x, меньшее у.

П3: Пока у≠0 выполнить.

Найти остаток z от деления х на у заменить х на у; и у на z (z<y<x)

П5: Прекратить работу

Алгоритм №3

П1: Задать числа а и b.

П2:Положть х=а, у=b

П3:Пока х≠y выполнить

Если х>у то положить х=х-у, иначе положить у = у- х

П4: Положить d=x

П5: Прекратить работу.

Задание №2 :Вычислить при заданном значении х значение многочлена

y=а0n+a1. хn-1+…а n-1 . х- а n

Входные данные:n- показатель степени многочлена (класс N),а01,…

n-1, аn,-коэффициент многочлена (класс R-вещественные числа), х- значение, при котором требуется вычитание.(класс R)

(1)Вычисление многочлена по формуле:

n

y=∑ a1. хi

i=0

(2) Вычисление значения многочлена на схеме Горнера

у=(…((а0 . х+ а1) . х+ а2). x+…+ аn-1). x+ аn

Алгоритм №1:

П1: Заданные входящие данные

П2: Положить у= а0, i=1

П3: Пока i≤ n выполняется: заменить у на у.х+ аi, увеличивается i на 1.

П4: у –результат

П5: Прекращение работы

Сравнивая эти алгоритмы, можно заметить, что первый алгоритм сложнее и не вполне заслуживает названия «алгоритм», т.к. его действия нельзя назвать элементарными. Действие «Найти показатели …простых множителей» (пункты П1 и П2) являются отдельной задачей, состоящей из многих простых действий. То же самое можно сказать и о действиях в пунктах П6 и П7.

Самым простым и изящным был Алгоритм №3.

Часто для решения одной и той же задачи имеется несколько алгоритмов и нужно решить, какой из них лучше. Это приводит к системе, первостепенное значение области анализа алгоритмов: по заданному алгоритму найти его рабочие характеристики.

Для улучшения алгоритма желательно сократить количество действий и, по возможности, упростить действия. При этом алгоритме должен оставаться эквивалент исходному.

Будем называть 2 алгоритмических эквивалента:

1. Множество дополнительных входных данных одного из них является множеством допустимых входных данных и для других; из применимости одного алгоритма к этим входным данным.

2. Применение этих алгоритмов к одним и тем же входным дает одинаковые результаты.

Эквивалентом являются алгоритмы для вычисления значения многочлена в заданной точке Х по формулам (1) и (2). Но алгоритм, заданный формулой (2), требует меньше арифметических операций, т.к. не требуется выполнения операции возведения в степень х i для всех I є [ 1; n]

Сформировался критерий качества алгоритма:

· правильность (алгоритм решения простой задачи)

· прозрачность (простота, удобочитательный алгоритм)

· эффект (быстродействие, краткость)

С описанием алгоритма связаны два момента: описание алгоритма, выполнение алгоритма.

 

3.2 С++

"Язык образует среду мышления и формирует представление о том, о чем мы думаем". (Б.Л.Уорф) С++ - язык общего назначения и задуман для того, чтобы настоящие программисты получили удовольствие от самого процесса программирования. За исключением второстепенных деталей он содержит язык С как подмножество.Язык С расширяется введением гибких и эффективных средств, предназначенных для построения новых типов. Программист структурирует свою задачу, определив новые типы, которые точно соответствуют понятиям предметной области задачи. Такой метод построения программы обычно называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. С такими объектами можно работать надежно и просто даже в тех случаях, когда их тип нельзя установить на стадии трансляции. Программирование с использованием таких объектов обычно называют объектно-ориентированным. Если этот метод применяется правильно, то программы становятся короче и понятнее, а сопровождение их упрощается.Ключевым понятием С++ является класс. Класс - это определяемый пользователем тип. Классы обеспечивают закодирование данных, их инициализацию, неявное преобразование пользовательских типов, динамическое задание типов, контролируемое пользователем управление памятью и средства для перегрузки операций. В языке С++ концепции контроля типов и модульного построения программ реализованы более полно, чем в С. Кроме того, С++ содержит усовершенствования, прямо с классами не связанные: символические константы, функции-подстановки, стандартные значения параметров функций, перегрузка имен функций, операции управления свободной памятью и ссылочный тип. В С++ сохранены все возможности С эффективной работы с основными объектами, отражающими аппаратную "реальность" (разряды, байты, слова, адреса и т.д.). Это позволяет достаточно эффективно реализовывать пользовательские типы.Как язык, так и стандартные библиотеки С++ проектировались в расчете на переносимость. Имеющиеся реализации языка будут работать в большинстве систем, поддерживающих С. В программах на С++ можно использовать библиотеки С. Большинство служебных программ рассчитанных на С, можно использовать и в С++.

Замечания по проекту языка

При разработке языка С++ одним из важнейших критериев выбора былапростота. Когда возникал вопрос, что упростить: руководство по языку идругую документацию или транслятор, то выбор делали в пользу первого.Огромное значение придавалось совместимости с языком С, что помешалоудалить его синтаксис. В С++ нет типов данных и элементарных операций высокого уровня. Например, не существует типа матрица с операцией обращения или типа строка с операцией конкатенации. Если пользователю понадобятся подобные типы, он может определить их в самом языке. Программирование на С++ по сути сводится к определению универсальных или зависящих от области приложения типов. Хорошо продуманный пользовательский тип отличается от встроенного типа только способом определения, но не способом применения. Из языка исключались возможности, которые могут привести к накладным расходам памяти или времени выполнения, даже если они непосредственно не используются в программе. Например, было отвергнуто предложение хранить в каждом объекте некоторую служебную информацию. Если пользователь описал структуру, содержащую две величины, занимающие по 16 разрядов, то гарантируется, что она поместится в 32-х разрядный регистр. Язык С++ проектировался для использования в довольно традиционнойсреде, а именно: в системе программирования С операционной системы UNIX. Но есть вполне обоснованные доводы в пользу использования С++ в более богатой программной среде. Такие возможности, как динамическая загрузка, развитые системы трансляции и базы данных для хранения определений типов, можно успешно использовать без ущерба для языка.Типы С++ и механизмы закодирования данных рассчитаны на определенный синтаксический анализ, проводимый транслятором для обнаружения случайной порчи данных. Они не обеспечивают секретности данных, и защиты от умышленного нарушения правил доступа к ним. Однако эти средства можно свободно использовать, не боясь накладных расходов памяти и времени выполнения программы. Учтено, что конструкция языка активно используется тогда, когда она не только изящно записывается на нем, но и вполне по средствам обычным программам.

Историческая справка

Безусловно С++ многим обязан языку С, который сохраняется как егоподмножество. Сохранены и все свойственные С средства низкого уровня,предназначенные для решения самых насущных задач системного программирования. С, в свою очередь, многим обязан своему предшественнику языку BCPL. Комментарий языка BCPL был восстановлен в С++. Если вы знакомы с языком BCPL, то можете заметить, что в С++ по-прежнему нет блока VALOF. Еще одним источником вдохновения был язык SIMULA-67; именно из него была заимствована концепция классов (вместе cпроизводными классами и виртуальными функциями). Оператор inspect изSIMULA-67 намеренно не был включен в С++. Причина – желание способствовать модульности за счет использования виртуальных функций.Возможность в С++ перегрузки операций и свобода размещения описаний всюду, где может встречаться оператор, напоминают язык Алгол-68.Также до сих пор происходят существенные изменения в языке С++. В основном это касается разрешения неоднозначности при перегрузке, связывании и управлении памятью. Были также введены некоторые обобщения и существенные расширения, как то: множественное наследование, функции-члены со спецификациями static и const, защищенные члены (protected), шаблоны типаи обработка особых ситуаций. Все эти расширения и доработки были нацелены на то, чтобы С++ стал языком, на котором можно создавать и использовать библиотеки. Шаблоны типов появились частично из-за желания формализовать макросредства, а частично были инспирированы описанием генетических объектов в языке Ада (с учетом их достоинств и недостатков) и параметризированными модулями языка CLU. Механизм обработки особых ситуаций появился отчасти под влиянием языков Ада и CLU, а отчасти под влиянием ML. Другие расширения, введенные за период между 1985 и 1991 г.г. (такие как множественное наследование, статические функции-члены и чистые виртуальные функции), скорее появились в результате обобщения опыта программирования на С++, чем были почерпнуты из других языков.Более ранние версии языка, получившие название "С с классами", использовались, начиная с 1980 г. Этот язык возник потому, что автору потребовалось написать программы моделирования, управляемые прерываниями. Язык SIMULA-67 идеально подходит для этого, если не учитывать эффективность. Язык "С с классами" использовался для больших задач моделирования. Строгой проверке подверглись тогда возможности написания на нем программ, для которых критичны ресурсы времени и памяти. В этом языке недоставало перегрузки операций, ссылок, виртуальных функций и многих других возможностей. Впервые С++ вышел за пределы исследовательской группы, в которой работал автор, в июле 1983 г., однако тогда многие возможности С++ еще не были разработаны.Название С++ (си плюс плюс), было придумано Риком Маскитти летом 1983 г. Это название отражает эволюционный характер изменений языка С. Обозначение ++ относится к операции наращивания С. Чуть более короткое имя С+ является синтаксической ошибкой. Кроме того, оно уже было использовано как название совсем другого языка. Знатоки семантики С находят, что С++ хуже, чем ++С. Язык не получил названия D, поскольку он является расширением С, и в нем не делается попыток решить какие-либо проблемы за счет отказа от возможностей С. Изначально С++ был задуман для того, чтобы автору и его друзьям ненадо было программировать на ассемблере, С или других современных языках высокого уровня. Основное его предназначение - упростить и сделать более приятным процесс программирования для отдельного программиста. До недавнего времени не было плана разработки С++ на бумаге. Проектирование, реализация и документирование шли параллельно. Никогда не существовало "проекта С++" или "Комитета по разработке С++". Поэтому язык развивался и продолжает развиваться так, чтобы преодолеть все проблемы, с которыми столкнулись пользователи. Толчками к развитию служат также и обсуждения автором всех проблем с его друзьями и коллегами. В связи с лавинообразным процессом увеличения числа пользователей С++, пришлось сделать следующие изменения. Примерно в 1987 г. стало очевидно, что работа по стандартизации С++ неизбежна и что следует незамедлительно приступить к созданию основы для нее. В результате были предприняты целенаправленные действия, чтобы установить контакт между разработчиками С++ и большинством пользователей. Применялась обычная и электронная почта, а также было непосредственное общение на конференциях по С++ и других встречах. Фирма AT&T Bell Laboratories внесла основной вклад в эту работу, предоставив автору право изучать версии справочного руководства по языкувместе с упоминавшимися разработчиками и пользователями. Не следует недооценивать этот вклад, т.к. многие из них работают в компаниях, которыеможно считать конкурентами фирмы AT&T. Менее просвещенная компания могла бы просто ничего не делать, и в результате появилось бы несколько несогласованных версий языка. Около ста представителей из порядка 20 организаций изучали и комментировали то, что стало современной версией справочного руководства и исходными материалами для ANSI по стандартизации С++. Наконец, по инициативе фирмы Hewlett-Packard в декабре 1989 г. в составе ANSI был образован комитет X3J16. Ожидается, что работы по стандартизации С++ в ANSI (американский стандарт) станут составной частью работ по стандартизации силами ISO (Международной организации по стандартизации).

3.2.3 Сравнение языков С++ и С

Выбор С в качестве базового языка для С++ объясняется следующими егодостоинствами: (1) универсальность, краткость и относительно низкий уровень;(2) адекватность большинству задач системного программирования;(3) он идет в любой системе и на любой машине;(4) полностью подходит для программной среды UNIX. В С существуют свои проблемы, но в языке, разрабатываемом "с нуля" онипоявились бы тоже, а проблемы С, по крайней мере, хорошо известны. Болееважно то, что ориентация на С позволила использовать язык "С с классами" как полезный (хотя и не очень удобный) инструмент в течение первых месяцев раздумий о введении в С классов в стиле Симулы. С++ стал использоваться шире, но по мере роста его возможностей, выходящих за пределы С, вновь и вновь возникала проблема совместимости. Ясно, что отказавшись от части наследства С, можно избежать некоторых проблем. Это не было сделано по следующим причинам: (1) существуют миллионы строк программ на С, которые можно улучшить с помощью С++, но при условии, что полной переписи их на язык С++ не потребуется; (2) существуют миллионы строк библиотечных функций и служебных программ на С, которые можно было бы использовать в С++ при условиях совместимости обоих языков на стадии связывания и их большого синтаксического сходства; (3) существуют сотни тысяч программистов, знающих С; им достаточно овладеть только новыми средствами С++ и не надо изучать основ языка; (4) поскольку С и С++ будут использоваться одними и теми же людьми на одних и тех же системах многие годы, различия между языками должны бытьлибо минимальными, либо максимальными, чтобы свести к минимуму количество ошибок и недоразумений. Описание С++ было переработано так, чтобы гарантировать, что любая допустимая в обоих языках конструкция означала в них одно и то же. Для изучения С++ не обязательно знать С. Программирование на С способствует усвоению приемов и даже трюков, которые при программировании на С++ становятся просто ненужными. Например, явное преобразование типа (приведение), в С++ нужно гораздо реже, чем в С. Тем не менее, хорошие программы на языке С по сути являются программами на С++. Например, все программы из классического описания С являются программами на С++. В процессе изучения С++ будет полезен опыт работы с любым языком со статическими типами

 

3.2.4 Замечания о программировании на языке С++

Предполагается, что в идеальном случае разработка программы делится натри этапа: вначале необходимо добиться ясного понимания задачи, затем определить ключевые понятия, используемые для ее решения, и, наконец, полученное решение выразить в виде программы. Однако, детали решения и точные понятия, которые будут использоваться в нем, часто проясняются только после того, как их попытаются выразить в программе. Именно в этом случае большое значение приобретает выбор языка программирования.Во многих задачах используются понятия, которые трудно представить в программе в виде одного из основных типов или в виде функции без связанных с ней статических данных. Такое понятие может представлять в программе класс. Класс - это тип; он определяет поведение связанных с ним объектов: их создание, обработку и уничтожение. Кроме этого, класс определяет реализацию объектов в языке, но на начальных стадиях разработки программы это не является и не должно являться главной заботой. Для написания хорошей программы надо составить такой набор классов, в котором каждый класс четко представляет одно понятие. Обычно это означает, что программист должен сосредоточиться на вопросах: Как создаются объекты данного класса? Могут ли они копироваться и (или) уничтожаться? Какие операции можно определить над этими объектами? Если на эти вопросы удовлетворительных ответов не находится, то, скорее всего, это означает, что понятие не было достаточно ясно сформулировано. Тогда, возможно, стоит еще поразмышлять над задачей и предлагаемым решением, а не немедленно приступать к программированию, надеясь в процессе него найти ответы. Проще всего работать с понятиями, которые имеют традиционную математическую форму представления: всевозможные числа, множества, геометрические фигуры и т.д. В программном мире накоплено удивительное богатство из таких библиотек, но нет ни формального, ни фактического стандарта на них. Язык С++ еще достаточно молод, и его библиотеки не развились в такой степени, как сам язык.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: