Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Стили и методы программирования

Покупка
Новинка
Артикул: 062013.04.99
Доступ онлайн
1 000 ₽
В корзину
Данный курс предполагает начальные умения структурного программирования на традиционном языке и не исключает начальных умений на одном из языков других стилей. Базовые умения для других стилей программирования могут быть получены по ходу изучения курса, для чего в него включены необходимые сведения и упражнения. Этот курс для тех, кто хочет программировать осмысленно. Впервые в практике учебных материалов систематически излагаются сведения о стилях программирования и их методах. Он предлагает ориентиры для понимания сочетаемости и несовместимости разных методов, показывает, что универсальность программных средств есть не что иное, как плохо определенные границы их применимости. Освоив предлагаемый материал, учащемуся откроются те аспекты программистской деятельности, которым обычно не уделяют должного внимания авторы учебников, монографий, руководств, хотя именно они больше, чем что-либо определяют уровень квалификации разработчика. Курс будет полезен как для начинающих, так и для опытных программистов.
Непейвода, Н. Н. Стили и методы программирования : краткий курс / Н. Н. Непейвода. - Москва : ИНТУИТ, 2016. - 214 с. - ISBN 5-9556-0023-X. - Текст : электронный. - URL: https://znanium.ru/catalog/product/2160965 (дата обращения: 21.11.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов

                                    
Стили и методы программирования

2-е издание, исправленное

Непейвода Н.Н.

Национальный Открытый Университет “ИНТУИТ”
2016

2

УДК 004.43(075.8)
ББК 18
Н-53
Стили и методы программирования / Непейвода Н.Н. - M.: Национальный Открытый Университет
“ИНТУИТ”, 2016 (Основы информационных технологий)
ISBN 5-9556-0023-X

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

(c) ООО “ИНТУИТ.РУ”, 2005-2016
(c) Непейвода Н.Н., 2005-2016

3

Вводная лекция

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

Введение

Программирование на языках появилось одновременно с вычислительными машинами.
Конрад фон Цузе, построивший первую в мире серию программно-управляемых
вычислительных машин (Германия, 1938-1944 г.), создал язык Plankalkul для записи
программ. Квалифицированные сотрудники писали программы на этом языке, а
техники затем вручную переводили их в машинные коды.

Сейчас наиболее широко используются традиционные языки. В их число входят
FORTRAN, Pascal, C/C++, Ada, Java и т. п.

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

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

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

Задание 0. Перепишите написанную Вами ранее программу размером от 100 до 200
строк на неизвестный Вам традиционный язык (выбрать первый доступный из списка
неизвестных: Ada, Modula-2, Алгол 68, Simula, FORTRAN). При этом запрещается
детально изучать язык. Просмотрите описание и примеры, пользуйтесь прежде всего
системой помощи транслятора.

Сравнение программ на разных языках

Начнем с рассмотрения примера. Всем данным текстам программ при исполнении
соответствует действие, состоящее в распечатке строки “Прювет Волку!”.

/*Язык C.*/
#include <stdio.h>
int main(void)
    {printf("Прювет Волку!");
     return 0;}

Пример 1.1.

4

//Java
public class HelloWorld {
    public static void main (
     String[] args) {
        System.out.println(
         "Прювет Волку!");
}}

Пример 1.2.

(*Паскаль*)
program First (Output);
begin
    writeln('Прювет Волку!')
end.

Пример 1.3.

comment Algol 68 comment
begin
    println('Прювет Волку!')
end
коммент Русский Алгол 68 коммент
начало
    печатать('Прювет Волку!')
конец
comment Еще два представления comment
(println('Прювет Волку!'))
(печатать('Прювет Волку!'))

Пример 1.4.

Лисп (режим исполнения файла программы):
( Print "Прювет Волку!" )

Пример 1.5.

Лисп (диалоговый режим):
[1]> (progn (setq x "Прювет Волку!" ) x)

Пример 1.6.

Рефал
$ENTRY GO{=<Prout 'Прювет Волку!'>;}

Пример 1.7.

Prolog
:-Print('Прювет Волку!').

Пример 1.8.

5

Сравним все эти программы. Что в них общего?

1. Все они представлены в виде текстов: последовательностей символов,

размещенных на нескольких строчках.

2. В каждом языке имеется понятие строки (последовательности символов

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

3. Каждая из этих программ имеет конструкцию, выполнение которой приводит к

распечатке строки.

4. Все они при их выполнении делают одно и то же: печатают строку “Прювет

Волку!”.

В чем же их отличия? В записи, а также в правилах построения. Таким образом,
напрашивается вывод, что, освоив один язык программирования, можно понимать
тексты программ на большинстве других языков практически так же легко, как
образованный русский человек может читать украинский либо польский (это чуть
труднее) текст 1).

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

Работа программной системы над текстом программ

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

Пояснение к программе 1.1.

/* Язык C:*/
#include <stdio.h>
int main(void)
  {printf("Прювет Волку!");
   return 0;}

Строка

#include <stdio.h>

отражает то, что написанный текст программы должен быть расширен путем вставки
вместо этой строки текста, именуемого stdio.h, и уже такой расширенный текст
подается транслятору (одно из правил формирования текстов программ на языке С).
Таким образом, stdio.h является библиотекой периода трансляции. Фактически

stdio.h содержит все то, что нужно для организации ввода и вывода данных, описывая
компоненты библиотеки периода исполнения.

6

Текст после #include <stdio.h> - это описание функции без параметров, которая
возвращает целое (ее заголовок - int main (void) ), и печатает строку:

printf ("Прювет Волку!");.

После обработки этого текста транслятором, в частности, подключается библиотечная
функция периода исполнения printf, описание которой взято из stdio.h.

Пояснение к программе 1.2.

//  Java:
public class HelloWorld {
  public static void main (
   String[] args) {
    System.out.println(
     "Прювет Волку!");
             }}

Строка

public class HelloWorld

Текст на языке Java указывает на то, что программа является публичным (доступным
всем) классом, который именуется HelloWorld. К этому классу можно будет
обращаться для исполнения содержащихся в нем действий. Внутри класса HelloWorld
определяется функция static void main, с которой начинаются вычисления. А внутри
нее происходит обращение к системным средствам вывода строк, содержащимся в
классе System.out:

System.out.println("Прювет Волку!");

Это обращение делается из объявляемой функции main.

Пояснение к программе 1.3.

(*  Pascal:*)
program First (Output);
begin
writeln('Прювет Волку!')
end.
(*PASCAL*)
PROGRAM FIRST (OUTPUT);
BEGIN
WRITELN('Прювет Волку!')
END.

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

7

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

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

Пояснение к программе 1.4.

Алгол 68: 
begin
println(`Прювет Волку!')
end
comment  Русский Алгол 68 comment
начало
    печатать(`Прювет Волку!')
конец
comment  Еще два представления comment
(println(`Прювет Волку!'))
(печатать(`Прювет Волку!'))

Алгол 68 демонстрирует четыре текста одной и той же программы. В языке
предусмотрены и варианты нотации для национальных алфавитов (сравните первый и
второй тексты), и возможности скорописи (сравните первый и третий тексты).

Для этого языка постулируется существование стандартного вступления и заключения,
которые окружают написанный текст. Считается, что исходным текстом для
трансляции является то, что получится в результате соединения текста вступления,
текста, написанного программистом, и текста заключения. Здесь прослеживается
аналогия с #include языка С, но название файла, который должен расширять
написанный текст, явно не задается.

Пояснение к программе 1.5.

( PRINT "Прювет Волку!")

Программа на языке Lisp представляет собой функцию PRINT с аргументом “Прювет

Волку!”. Вычисление этой функции - так называемое S-выражение, представляющее
аргумент самой функции. В данном случае это “Прювет Волку!”. При вычислении

PRINT возникает побочный эффект, действие, которое сопровождает получение
значения. В данном случае это печать аргумента функции, т. е. требуемое действие.
Приведенная программа распечатает строку дважды: первый раз, когда выполняется
указанный побочный эффект, второй - из-за следующей причины. Лисп- программа
всегда завершает свои вычисления распечаткой значения функции, полученного в
качестве результата. S-выражение “Прювет Волку!” и есть тот самый результат.

Пояснение к программе 1.7.

$ENTRY GO{=<Prout 'Прювет Волку!'>};

8

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

Пояснение к программе 1.8.

:-Print('Прювет Волку!');

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

На этом примере можно заметить общие черты языков Prolog и Рефал. Оба они имеют
дело сразу со сложными данными и не связаны напрямую с физическим строением
машинной памяти.

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

Существенные различия моделей вычислений возникают в случае разного устройства
данных, с которыми работают программы (сравните, например, C и Рефал). Но стоит
помнить, что одна и та же модель вычислений на разных вычислительных машинах и в
разных операционных средах реализуется по-разному. Могут быть различны
разрядные сетки, способы представления чисел и способы вызова процедур. Пожалуй,
учет операционной среды для переносимости программного обеспечения осуществлен
лишь в языке Ada, который является стандартом для Министерства обороны США.

1)   Конечно же, и здесь могут быть исключения, но это верно практически для всех так
называемых языков высокого уровня 
2)   В литературе и в обыденной речи программистов все время допускается
двусмысленность. Программа - с одной стороны, то, что исполняется машиной, но
практически никогда не читаемое и не исправляемое человеком (просматривать и
корректировать файл program.exe будут лишь законченный хакер либо человек, у
которого не остается другого выхода); с другой стороны, структура, которая понятна и
человеку, и машине ( program.cpp ). В данной книге программа понимается лишь во

9

втором смысле, файл program.exe называется исполняемый код либо машинная
программа.
3)   Мы специально не воспользовались здесь расширениями, предлагаемыми,
например, Delphi, чтобы четко представить разницу между эталонным, или
стандартным, языком и его диалектами. Диалекты существуют лишь в контексте
данной машины и транслятора .

10

Доступ онлайн
1 000 ₽
В корзину