КОБОЛ
ID DIVISION.
PROGRAM-ID. BLOAT.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 THE-TEST-STRINGS.
05 FILLER OCCURS 11584 TIMES.
10 TEST-STRING PIC X(11584).
LOCAL-STORAGE SECTION.
01 FIRST-TIME-FLAG PIC X VALUE "Y".
01 DISP-BEFORE-STRING COMP PIC 9(8).
01 LOOP-COUNTER COMP PIC 9(8).
01 START-STRING.
05 FILLER OCCURS 0 TO 11584 TIMES
DEPENDING ON DISP-BEFORE-STRING.
10 FILLER PIC X.
05 THE-SUBSTRING PIC X(12).
01 INITIAL-STRING PIC X(12)
VALUE "HELLO WORLD!".
LINKAGE SECTION.
01 STRING-PARAMETER PIC X(11584).
01 THE-RESULT PIC X.
PROCEDURE DIVISION USING
STRING-PARAMETER
THE-RESULT
.
IF FIRST-TIME-FLAG = "Y"
PERFORM SET-UP-STRINGS
END-IF
PERFORM
VARYING LOOP-COUNTER
FROM 1
BY 1
UNTIL LOOP-COUNTER
GREATER THAN 11584
OR STRING-PARAMETER
EQUAL TO TEST-STRING
( LOOP-COUNTER )
END-PERFORM
IF STRING-PARAMETER
EQUAL TO TEST-STRING ( LOOP-COUNTER )
MOVE "Y" TO THE-RESULT
ELSE
MOVE "N" TO THE-RESULT
END-IF
GOBACK
.
SET-UP-STRINGS.
PERFORM
VARYING LOOP-COUNTER
FROM 0
BY 1
UNTIL LOOP-COUNTER
EQUAL TO 11584
MOVE 11584 TO DISP-BEFORE-STRING
MOVE SPACE TO START-STRING
MOVE LOOP-COUNTER TO DISP-BEFORE-STRING
MOVE INITIAL-STRING TO THE-SUBSTRING
MOVE START-STRING TO TEST-STRING
( LOOP-COUNTER + 1 )
END-PERFORM
MOVE "N" TO FIRST-TIME-FLAG
.
Трохи знань може бути небезпечною справою.
Можна швидше зробити одне велике порівняння, ніж безліч малих порівнянь; IBM COBOL Enterprise (до версії 4.2) може мати максимальну РОБОТУ-ЗБЕРІГАННЯ 128 МБ (версія 5.0 може мати 2 ГБ); LOCAL-STORAGE пропонує ще 128 Мб, якщо вам потрібно більше місця.
Завдання полягає в тому, щоб підтвердити, що 11584-байтний накопичувач має значення "ПРАВО МИР! десь, а решта - простір.
Вигаданий програміст вирішує написати для цього підпрограму (на випадок, якщо це потрібно в іншому місці) та включити їх високопродуктивну техніку (бонус).
Програміст обчислює, що 11584 * 11584 - 128 Мб, тому використовує WORKING-STORAGE для величезної таблиці, а LOCAL-STORAGE - для всього іншого, що потрібно.
Програміст кодує це і свідомо посміхається собі, коли компіляція чиста. Вони мали рацію щодо 128 Мб.
Тестує код. Це працює. Можливо, трохи повільно, але на машину сильне навантаження. Знову посміхається, думаючи, як повільно це було б, якщо закодувати без їх рівня знань експерта.
РОБОТА-ЗБЕРІГАННЯ поставляється в 134,189,056 байт, а також є кілька непоганих байтів інших речей. Повинна бути досить великою.
Реальність така, що робити довге порівняння замість короткого порівняння, як це реалізовано тут, це дуже повільний спосіб зробити це.
Ще повільніше LOCAL-STORAGE, який ініціалізується підпрограми під час виконання кожного разу, коли викликається підпрограма, спричиняє встановлення всього 128MB для кожного CALL.
Програміст просто помилявся щодо розміру столу, є достатньо місця, не використовуючи LOCAL-STORAGE. Довгі порівняння можуть перемогти короткі порівняння, але лише тоді, коли фактична кількість порівнянь зменшена.
Я розглядав можливість заміни МІСЬКОГО МАГАЗИНУ та РОБОТИ-ЗБЕРІГАННЯ, просто набагато менше ймовірності, що хтось зашифрує це так, тому я цього не зробив. Якщо поставити на стіл значення "ПРОСТІРНІ ПРОСТІРИ" (якби воно було в "МІСЦЕ-ЗБЕРІГАННЯ"), було б вимкнено таблицю двічі під час кожного CALL, тому ще повільніше.
Не можна видалити Bloat, не переписавши програму. Більшість кодів погані, хоча є одна корисна техніка.
Це не приклад із реального життя, але я можу уявити, що хтось це робить, якщо той хтось досить розумний :-)
Складання - це зовсім не проблема. Запускати його з усіма можливостями швидко виявляється, що не варто намагатися.
Звичайно, є і звичайний старий Буг. Дуже поширений у пошуку «завдань».