Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция.docx
Скачиваний:
38
Добавлен:
28.03.2016
Размер:
2.79 Mб
Скачать
  1. Языки высокого уровня и системы программирования

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

Скоро стало ясно, что человека можно освободить от записи программы в виде двоичных последовательностей. Вместо двоичных кодов можно использовать другую, символическую систему обозначений команд и данных, а перевод в машинные коды осуществить с помощью специальной программы, выполняемой компьютером. Так появились языки ассемблерного типа или ассемблеры (от англ. to assemble – собирать).

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

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

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

Первый язык высокого уровня появился в конце 1950-х годов и назывался Фортран (Fortran – это сокращение от англ. formula translation, т. е. перевод формул).

Вместе с языками разрабатывались программы перевода «высокоуровневых» программ в машинные – трансляторы или компиляторы.

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

Как создается программа? Сначала заказчик рассказывает программисту, что он хочет получить (часто не понимая, что именно). Программист (возможно не один) пытается уяснить, что хочет заказчик. Для этого ему приходится анализировать и уточнять постановку задачи. В результате создается спецификация задач, т.е. точное и однозначное ее описание. Иногда она соответствует тому, что хотел заказчик.

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

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

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

Написание программы (или ее частей) принято называть кодированием или разработкой. Чаще всего программа пишется на каком-либо языке высокого уровня (иногда отдельные ее части на разных языках) и транслируется на машинный язык.

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

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

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

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

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

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

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

Рис. 3.1. Создание исходного файла

Затем запускается транслятор, который читает с диска исходный файл и строит его машинный эквивалент – объектный код. Процесс выполнения программы-транслятора называется трансляцией исходного текста.

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

Рис. 3.2. Создание выполнимой машинной программы

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

Рис. 3.3. Интерпретация высокоуровневой программы

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

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

Описанные средства (текстовый редактор, транслятор и/или интерпретатор, компоновщик, загрузчик и отладчик) обычно собираются вместе и образуют систему программирования или интегрированную среду разработки (Integrated Design Environment - IDE). Кроме них, в ее состав входит библиотека стандартных подпрограмм.

Лекция № 2. Введение в язык С++

  1. История языка С++

Язык С++ развился из С, который в свою очередь был создан на основе двух предшествующих языков — BCPL и В. Язык BCPL был создан в 1967 году Мартином Ричардом как язык для написания компиляторов и программного обеспечения операционных систем. Кен Томпсон предусмотрел много возможностей в своем языке В – дубликате BCPL и использовал В для создания ранних версий операционной системы UNIX в Bell Laboratories в 1970 году на компьютере DEC PDP-7. И BCPL, и В были «нетипичными» языками — каждый элемент данных занимал одно «слово» в памяти и бремя обработки элемента данных, например, как целого или действительного числа падало на плечи программиста.

Язык C был развит из В Деннисом Ритчи в Bell Laboratories и первоначально реализован на компьютере DEC PDP-11 в 1972 году. С использует многие важные концепции BCPL и В, а также добавляет типы данных и другие свойства. Первоначально С приобрел широкую известность как язык разработки операционной системы UNIX. Сегодня фактически все новые операционные системы написаны на С или на С++. В течение двух последних десятилетий С стал доступным для большинства компьютеров. С независим от аппаратных средств. При тщательной разработке на С можно написать мобильные программы, переносимые на большинство компьютеров.

В конце 70-х годов С развился в то, что теперь относят к «традиционному С», «классическому С» или «С Кернигана и Ритчи». Публикация издательством Prentice-Hall книги Кернигана и Ритчи «Язык программирования С» привлекла широкое внимание к этому языку. Эта публикация стала одной из наиболее удачных книг по вычислительной технике за все время.

Широкое распространение С на различных типах компьютеров (иногда называемых аппаратными платформами) привело, к сожалению, ко многим вариациям языка. Они были похожи, но несовместимы друг с другом. Это было серьезной проблемой для разработчиков программ, нуждавшихся в написании совместимых программ, которые можно было бы выполнять на нескольких платформах. Стало ясно, что необходима стандартная версия С. В 1983 году при Американском Национальном Комитете Стандартов в области вычислительной техники и обработки информации был создан технический комитет Х3J11, чтобы «обеспечить недвусмысленное и машинно-независимое определение языка». В 1989 году стандарт был утвержден. ANSI скооперировался с Международной Организацией Стандартов (International Standards Organizations — ISO), чтобы стандартизировать С в мировом масштабе; совместный стандарт был опубликован в 1990 году и назван ANSI/ISO 9899: 1990. Копии этого документа можно заказать в ANSI. Второе издание книги Кернигана и Ритчи, вышедшее в 1988 году, отражает эту версию, называемую ANSI С; эта версия языка используется теперь повсеместно.

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

С++ - расширение С был разработан Бьерном Строустропом в начале 80-х годов в Bell Laboratories. С++ обеспечивает ряд свойств, которые «приводят в порядок» язык С, но, что более важно, он обеспечивает возможность объектно-ориентированного программирования. Это явилось революционной идеей в мире программного обеспечения. Быстрое, корректное и экономное создание программного обеспечения остается иллюзорной мечтой и это в то время, когда требуется проектирование нового и все более мощного программного обеспечения. Объекты – это эффективные повторно используемые компоненты программного обеспечения, моделирующие элементы реального мира. Разработчики программного обеспечения обнаруживают, что использование достижений модульного, объектно-ориентированного проектирования может значительно повысить продуктивность групп разработки по сравнению с предшествующей популярной технологией программирования, такой, как структурное программирование. Объектно-ориентированные программы легче понимать, корректировать и модифицировать.

Было разработано много других объектно-ориентированных языков, включая наиболее заметный из них Smalltalk, разработанный в Центре Исследований Palo Alto компании Xerox (Palo Alto Research Centre – PARC). Smalltalk – чистый объектно-ориентированный язык – в нем буквально все является объектом. С++ - это гибридный язык, он предоставляет возможность программировать и в стиле С, и в объектно-ориентированном стиле, и в обоих стилях сразу. Существует глубокая уверенность в том, что с середины 90-х годов С++ станет доминирующим системно-образующим языком.