Программирование на COBOL'е калечит разум.
Его преподавание, следовательно, должно рассматриваться
как преступное действие. Эдсгар Дейкстра
The Tao gave birth to machine language. Machine language gave birth to the assembler. The assembler gave birth to the compiler. Now there are ten thousand languages. Each language has its purpose, however humble. Each language expresses the Yin and Yang of software. Each language has its place within the Tao.
But do not program in COBOL, if you can avoid it.
Geoffrey James, “The Tao of Programming”
Главу о COBOL’е хочется начать словами Дональда Кнута:
«Двадцать пять лет назад я читал лекцию «Программирование как искусство», в которой пытался объяснить, каким образом можно писать благородные, действительно красивые программы. Во время лекции кто-то задал мне вопрос: «Окей, Дон» - сказал он, - «как бы ты поступил, если бы ты работал в банке и тебе пришлось писать программы на COBOL’е?» У меня заняло почти полчаса, прежде чем я смог как-то ответить на этот вопрос, но, в принципе, я верю, что можно найти красоту даже в программировании на COBOL’е».
COBOL знаменит напыщенностью своих выражений и языковым излишеством. По замыслу разработчиков программы на COBOL’е должны были быть понятны даже менеджерам отделов. В принципе, они должны были читать эти программы вместо утренних газет или держать распечатки на прикроватных тумбочках вместо книг.
История, однако, умалчивает о менеджерах, увлеченно читавших кобольные программы. Идея так и осталась в теории, а на практике существуют 500 зарезервированных слов, которые используются в COBOL’е, причем часть из них «шумовые», то есть необязательные для компилятора. Они вносятся в программу только для увеселения гипотетических менеджеров.
В каком еще языке вы найдете столь подробное описание процесса умножения ? -
MULTIPLY 2 BY 2 GIVING Result.
Как и полагается добротному многотомному эпическому произведению, программа на COBOL’е делится на следующие модули: Division, Section, Paragraph, Sentence и Statement, вот так:
Программа на COBOL’е состоит из четырех Divisions:
-Identification Division: содержит информацию о программе, большая часть которой пропускается компилятором.
-Environment Division: описывает среду, в которой будет выполняться программа. Призвана изолировать в одном месте те участки программы, которые зависят от конкретного компилятора или компьютера. Хорошее начинание для тех лет[1].
-Data Division: содержит описание данных программы. В свою очередь состоит из File Section (описывает данные, которые будут читаться или записываться на диск), Working-Storage Section (описывает переменные программы), Linkage Section (служит для связывания подпрограмм) and Report Section (используется при написании отчетов).
-Procedure Division: содержит действия, которые будут выполнены над данными программы, другими словами – алгоритм.
Глава о COBOL’е будет, конечно, неполной без примера законченной программы. Приведенная ниже программа представляет собой простейший калькулятор, производящий действия сложения и умножения, и в комментариях не нуждается:
$ SET SOURCEFORMAT"FREE"
IDENTIFICATION DIVISION.
PROGRAM-ID. Iteration-If.
AUTHOR. John Smith.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Num1 PIC 9 VALUE ZEROS.
01 Num2 PIC 9 VALUE ZEROS.
01 Result PIC 99 VALUE ZEROS.
01 Operator PIC X VALUE SPACE.
PROCEDURE DIVISION.
Calculator.
PERFORM 3 TIMES
DISPLAY "Enter First Number : " WITH NO ADVANCING
ACCEPT Num1
DISPLAY "Enter Second Number : " WITH NO ADVANCING
ACCEPT Num2
DISPLAY "Enter operator (+ or *) : " WITH NO ADVANCING
ACCEPT Operator
IF Operator = "+" THEN
ADD Num1, Num2 GIVING Result
END-IF
IF Operator = "*" THEN
MULTIPLY Num1 BY Num2 GIVING Result
END-IF
DISPLAY "Result is = ", Result
END-PERFORM.
STOP RUN.
В качестве домашнего задания читателю предлагается ответить на вопрос, заданный Дональду Кнуту: можно ли найти красоту в программировании на COBOL’е ?
[1] В С и С++ такую задачу обычно выполняют с помощью препроцессора, позволяющего компилировать только ту часть программы, которая подходит для данной конфигурации (компилятор+платформа).