КОБОЛ -COBOL

КОБОЛ
Отчет COBOL Apr60.djvu
Отчет COBOL 60 для CODASYL (апрель 1960 г.)
Парадигма Процедурный , императивный , объектно-ориентированный , универсальный
Разработано Ховард Бромберг , Норман Дисконт , Вернон Ривз , Джин Э. Саммет , Уильям Селден , Гертруда Тирни , с косвенным влиянием Грейс Хоппер
Разработчики КОДАСИЛ , АНСИ , ИСО / МЭК
Впервые появился 1959 ; 64 года назад ( 1959 )
Стабильный выпуск
ИСО/МЭК 1989:2023/2023
Дисциплина набора текста Слабый , статичный
Расширения файлов .cbl, .cob,.cpy
Основные реализации
GnuCOBOL , IBM COBOL , Micro Focus Visual COBOL
Диалекты
COBOL/2, DEC COBOL-10, DEC PDP-11 COBOL, DEC PDP-11 COBOL-85, DEC VAX COBOL, DOSVS COBOL, Envyr ICOBOL, Fujitsu COBOL, Hitachi COBOL2002, HP3000 COBOL/II, IBM COBOL SAA, IBM COBOL /400, IBM COBOL/II, IBM Enterprise COBOL, IBM ILE COBOL, IBM OS/VS COBOL, ICL COBOL (VME), Micro Focus ACUCOBOL-GT, Micro Focus COBOL-IT, Micro Focus RM/COBOL, Micro Focus Visual COBOL , Microsoft COBOL, Raincode COBOL, Realia COBOL, Ryan McFarland RM/COBOL, Ryan McFarland RM/COBOL-85, Tandem (NonStop) COBOL, Tandem (NonStop) SCOBOL, UNIVAC COBOL, Unisys MCP COBOL74, Unisys MCP COBOL85, Unix COBOL X /Open, Veryant isCOBOL, Wang VS COBOL
Под влиянием
Инициал: AIMACO , COMTRAN , FACT , FLOW-MATIC
COBOL 2002: C++ , Eiffel , Smalltalk
Под влиянием
CobolScript , EGL , PL/I , PL/B

COBOL ( / ˈ k b ɒ l , - b ɔː l / ; аббревиатура от «общий бизнес-ориентированный язык») представляет собой скомпилированный английский язык компьютерного программирования , разработанный для использования в бизнесе. Это императивный , процедурный и с 2002 года объектно-ориентированный язык. COBOL в основном используется в бизнесе, финансах и административных системах для компаний и правительств. COBOL по-прежнему широко используется в приложениях, развернутых на мэйнфреймах , таких как крупномасштабные задания пакетной обработки и обработки транзакций . Однако из-за снижения популярности и выхода на пенсию опытных программистов COBOL программы переносятся на новые платформы, переписываются на современные языки или заменяются программными пакетами. Большая часть программирования на COBOL теперь предназначена исключительно для поддержки существующих приложений; однако многие крупные финансовые учреждения еще в 2006 году разрабатывали новые системы на языке COBOL.

COBOL был разработан в 1959 году компанией CODASYL и частично основан на языке программирования FLOW-MATIC, разработанном Грейс Хоппер . Он был создан в рамках усилий Министерства обороны США по созданию переносимого языка программирования для обработки данных. Первоначально он рассматривался как временная мера, но Министерство обороны немедленно заставило производителей компьютеров предоставить его, что привело к его широкому распространению. Он был стандартизирован в 1968 году и с тех пор пересматривался четыре раза. Расширения включают поддержку структурированного и объектно-ориентированного программирования . Текущий стандарт — ISO / IEC 1989:2014 .

Операторы COBOL имеют синтаксис, похожий на английский, который был разработан, чтобы быть самодокументируемым и легко читаемым. Однако он многословен и использует более 300 зарезервированных слов . В отличие от современного лаконичного синтаксиса, такого как , COBOL имеет синтаксис, более похожий на английский (в данном случае ). y = x;MOVE x TO y

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

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

COBOL на протяжении всей своей жизни подвергался критике за многословие, процесс проектирования и плохую поддержку структурного программирования . Эти недостатки приводят к монолитным, многословным (предполагаемым английским) программам, которые нелегко понять.

В течение многих лет COBOL считался языком программирования для бизнес-операций на мейнфреймах, хотя в последние годы возрос интерес к переносу операций COBOL в облачные вычисления .

История и спецификация

Фон

В конце 1950-х годов пользователи компьютеров и производители начали беспокоиться о растущей стоимости программирования. Опрос 1959 года показал, что в любой установке обработки данных программирование стоит в среднем 800 000 долларов США, а перевод программ для работы на новом оборудовании будет стоить 600 000 долларов. В то время, когда новые языки программирования распространялись с постоянно растущей скоростью, тот же обзор показал, что если бы использовался общий язык, ориентированный на бизнес, преобразование было бы намного дешевле и быстрее.

8 апреля 1959 года Мэри К. Хоуз , ученый-компьютерщик из Burroughs Corporation , созвала собрание представителей научных кругов, пользователей компьютеров и производителей в Университете Пенсильвании , чтобы организовать официальную встречу по общим деловым языкам. Среди представителей были Грейс Хоппер (изобретатель английского языка обработки данных FLOW-MATIC ), Джин Саммет и Сол Горн .

На апрельской встрече группа обратилась к Министерству обороны (DoD) с просьбой спонсировать усилия по созданию общего делового языка. Делегация произвела впечатление на Чарльза А. Филлипса, директора отдела исследований систем данных в Министерстве обороны, который считал, что они «полностью понимают» проблемы Министерства обороны. Министерство обороны эксплуатировало 225 компьютеров, заказало еще 175 и потратило более 200 миллионов долларов на реализацию программ для их работы. Портативные программы сэкономят время, сократят затраты и облегчат модернизацию.

Чарльз Филлипс согласился спонсировать встречу и поручил делегации составить повестку дня.

КОБОЛ 60

28 и 29 мая 1959 года (ровно через год после Цюрихской встречи ALGOL 58 ) в Пентагоне состоялась встреча, на которой обсуждалось создание общего языка программирования для бизнеса. На нем присутствовал 41 человек под председательством Филлипса. Министерство обороны беспокоило, могут ли одни и те же программы обработки данных работать на разных компьютерах. ФОРТРАН , единственный в то время основной язык, не обладал функциями, необходимыми для написания таких программ.

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

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

Крайний срок был встречен комитетом ближнего боя с недоверием. Одна участница, Бетти Холбертон , назвала трехмесячный крайний срок «чрезмерным оптимизмом» и сомневалась, что язык действительно будет временной мерой.

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

Члены комитета ближнего действия представляли шесть производителей компьютеров и три правительственных учреждения. Производителями компьютеров были Burroughs Corporation , IBM , Minneapolis-Honeywell (Honeywell Labs), RCA , Sperry Rand и Sylvania Electric Products . Правительственными агентствами были ВВС США , Модельный бассейн ВМС Дэвида Тейлора и Национальное бюро стандартов (ныне Национальный институт стандартов и технологий). Комитет возглавил Джозеф Вегштейн из Национального бюро стандартов США. Работа началась с изучения описания данных, заявлений, существующих приложений и пользовательского опыта.

Комитет в основном изучал языки программирования FLOW-MATIC , AIMACO и COMTRAN . Язык FLOW-MATIC имел особое влияние, потому что он был реализован и потому что AIMACO был производным от него с небольшими изменениями. Изобретатель FLOW-MATIC Грейс Хоппер также работала техническим консультантом комитета. Основным вкладом FLOW-MATIC в COBOL были длинные имена переменных, английские слова для команд и разделение описаний данных и инструкций.

Хоппер иногда называют «матерью COBOL» или «бабушкой COBOL», хотя Джин Саммет , ведущий дизайнер COBOL, заявил, что Хоппер «не была матерью, создателем или разработчиком Cobol».

Язык COMTRAN компании IBM, изобретенный Бобом Бемером , рассматривался комитетом ближнего действия, состоящим из коллег Грейс Хоппер, как конкурент FLOW-MATIC. Некоторые из его функций не были включены в COBOL, чтобы не выглядело так, будто IBM доминировала в процессе проектирования, и Джин Саммет сказала в 1981 году, что некоторые члены комитета (включая ее саму) проявляли «сильную предвзятость против IBM». В одном случае, после того как Рой Голдфингер, автор руководства COMTRAN и член комитета среднего уровня, посетил собрание подкомитета, чтобы поддержать его язык и поощрить использование алгебраических выражений, Грейс Хоппер отправила комитету краткосрочного обслуживания служебную записку, повторяющую слова Сперри Рэнда. усилия по созданию языка на основе английского.

В 1980 году Грейс Хоппер заметила, что «COBOL 60 на 95% состоит из FLOW-MATIC» и что COMTRAN оказал «чрезвычайно небольшое» влияние. Кроме того, она сказала, что будет утверждать, что на ее работу повлияли как FLOW-MATIC, так и COMTRAN только для того, чтобы «сделать других людей счастливыми [чтобы они] не пытались нас нокаутировать».

Функции COMTRAN, включенные в COBOL, включали формулы, PICTUREпредложение , улучшенный IFоператор, который устранял необходимость в GO TO , и более надежную систему управления файлами.

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

Спорные функции включали те, которые некоторые считали бесполезными или слишком сложными для пользователей, занимающихся обработкой данных. К таким функциям относились логические выражения , формулы и индексы таблиц . Еще один спорный момент заключался в том, следует ли делать ключевые слова контекстно-зависимыми и как это повлияет на читабельность. Хотя контекстно-зависимые ключевые слова были отклонены, этот подход позже использовался в PL/I и частично в COBOL с 2002 года. Мало внимания уделялось интерактивности , взаимодействию с операционными системами (в то время их было немного) и функциям (считавшимся чисто математическими). и бесполезны при обработке данных).

Спецификации были представлены исполкому 4 сентября. Они не оправдали ожиданий: Джозеф Вегштейн отметил, что «он содержит огрехи и требует некоторых дополнений», а Боб Бемер позже назвал их «солянкой». Подкомитету дали время до декабря на его доработку.

На встрече в середине сентября комитет обсудил название нового языка. Предложения включали «BUSY» (бизнес-система), «INFOSYL» (язык информационной системы) и «COCOSYL» (общий язык компьютерных систем). Неясно, кто придумал название «КОБОЛ», хотя Боб Бемер позже утверждал, что это было его предложение.

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

Это был удар по комитету ближнего действия, который добился хорошего прогресса в спецификации. Несмотря на техническое превосходство, FACT не создавался с учетом портативности или согласия производителя и пользователя. У него также не было наглядной реализации, что позволяло сторонникам COBOL на основе FLOW-MATIC отменить решение. Представитель RCA Говард Бромберг также заблокировал FACT, чтобы работа RCA над реализацией COBOL не пропала даром.

Вскоре стало очевидно, что комитет слишком велик, чтобы можно было быстро добиться дальнейшего прогресса. Разочарованный Говард Бромберг купил надгробие за 15 долларов с выгравированным на нем «COBOL» и отправил его Чарльзу Филлипсу, чтобы продемонстрировать свое неудовольствие.

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

  • Уильям Селден и Гертруда Тирни из IBM,
  • Ховард Бромберг и Ховард Дисконт из RCA,
  • Вернон Ривз и Джин Э. Саммет из Sylvania Electric Products.

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

Спецификации были одобрены исполнительным комитетом 8 января 1960 года и отправлены в государственную типографию, которая напечатала их как COBOL 60 . Заявленные цели языка заключались в том, чтобы позволить легко писать эффективные переносимые программы, позволить пользователям переходить на новые системы с минимальными усилиями и затратами и быть подходящим для неопытных программистов.

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

В течение 1960 года список производителей, планирующих создавать компиляторы COBOL, расширился. К сентябрю к CODASYL присоединились еще пять производителей ( Bendix , Control Data Corporation , General Electric (GE), National Cash Register и Philco ), и все представленные производители анонсировали компиляторы COBOL. GE и IBM планировали интегрировать COBOL в свои собственные языки GECOM и COMTRAN соответственно. Напротив, компания International Computers and Tabulators планировала заменить свой язык CODEL на COBOL.

Тем временем RCA и Sperry Rand работали над созданием компиляторов COBOL. Первая программа COBOL была запущена 17 августа на RCA 501. 6 и 7 декабря та же программа COBOL (хотя и с небольшими изменениями) была запущена на компьютере RCA и компьютере Remington-Rand Univac, продемонстрировав, что совместимость может быть достигнута .

Относительное влияние используемых языков сохраняется и по сей день в рекомендуемых рекомендациях, напечатанных во всех справочных руководствах COBOL:

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

Никакие гарантии, явные или подразумеваемые, не даются ни одним из участников или комитетом CODASYL COBOL в отношении точности и функционирования системы программирования и языка. Кроме того, ни один из участников или комитет не несут никакой ответственности в связи с этим. Авторами и правообладателями защищенных авторским правом материалов, используемых здесь, являются:

FLOW-MATIC (торговая марка Unisys Corporation ), Programming for UNIVAC (R) I and II, Data Automation Systems, авторские права 1958, 1959 принадлежат Unisys Corporation; Форма коммерческого переводчика IBM № F28-8013, авторское право принадлежит IBM в 1959 году; ФАКТ, DSI 27A5260-2760, авторское право 1960 г. принадлежит Minneapolis-Honeywell.

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

COBOL-61 в COBOL-65

Маловероятно, что Cobol появится к концу десятилетия.

Аноним, июнь 1960 г.

В COBOL 60 было обнаружено много логических ошибок , что побудило Чарльза Каца из General Electric предупредить, что его нельзя интерпретировать однозначно. Неохотный краткосрочный комитет провел полную очистку, и к марту 1963 года сообщалось, что синтаксис COBOL так же поддается определению, как и ALGOL , хотя семантическая неоднозначность осталась.

COBOL — сложный язык для написания компилятора из-за большого синтаксиса и большого количества необязательных элементов в синтаксических конструкциях, а также из-за необходимости генерировать эффективный код для языка со многими возможными представлениями данных, неявными преобразованиями типов и необходимыми установками. ИБП для операций ввода-вывода. Ранние компиляторы COBOL были примитивными и медленными. Оценка ВМС США 1962 года показала, что скорость компиляции составляет 3–11 операторов в минуту. К середине 1964 года они увеличились до 11–1000 операторов в минуту. Было замечено, что увеличение памяти резко увеличивает скорость, а затраты на компиляцию сильно различаются: затраты на оператор составляли от 0,23 до 18,91 доллара.

В конце 1962 года IBM объявила, что COBOL будет их основным языком разработки и что разработка COMTRAN будет прекращена.

Спецификация COBOL трижды пересматривалась за пять лет после публикации. COBOL-60 был заменен в 1961 году на COBOL-61. Затем в 1963 году он был заменен расширенными спецификациями COBOL-61, которые представили средства сортировки и создания отчетов. Добавленные средства исправили недостатки, указанные Honeywell в конце 1959 года в письме комитету ближнего действия. COBOL Edition 1965 внес дополнительные уточнения в спецификации и представил средства для работы с файлами и таблицами для хранения данных .

КОБОЛ-68

Начались попытки стандартизировать COBOL, чтобы преодолеть несовместимость между версиями. В конце 1962 года ИСО и Институт стандартов Соединенных Штатов Америки (ныне ANSI ) сформировали группы для разработки стандартов. ANSI выпустил стандарт США COBOL X3.23 в августе 1968 года, который стал краеугольным камнем для более поздних версий. Эта версия была известна как Американский национальный стандарт (ANS) COBOL и была принята ISO в 1972 году.

КОБОЛ-74

К 1970 году COBOL стал самым широко используемым языком программирования в мире.

Независимо от комитета ANSI комитет по языку программирования CODASYL работал над улучшением языка. Они описали новые версии 1968, 1969, 1970 и 1973 годов, включая такие изменения, как новые средства межпрограммного взаимодействия, отладки и объединения файлов, а также улучшенные функции обработки строк и включения библиотек .

Хотя CODASYL не зависел от комитета ANSI, ANSI использовал CODASYL Journal of Development для определения функций, которые были достаточно популярны, чтобы гарантировать их реализацию. Комитет по языку программирования также поддерживал связь с ECMA и японским комитетом по стандартам COBOL.

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

В 1974 году ANSI опубликовал пересмотренную версию (ANS) COBOL, содержащую новые функции, такие как организация файлов , DELETEоператор и модуль сегментации . Удаленные функции включали NOTEоператор, EXAMINEоператор (который был заменен на INSPECT) и определяемый разработчиком модуль произвольного доступа (который был заменен новыми модулями последовательного и относительного ввода-вывода). Они составили 44 изменения, которые сделали существующие заявления несовместимыми с новым стандартом. Составитель отчетов должен был быть удален из COBOL, но был восстановлен до публикации стандарта. Позже ISO приняла обновленный стандарт в 1978 году.

КОБОЛ-85

В июне 1978 года начались работы по доработке COBOL-74. Предложенный стандарт (обычно называемый COBOL-80) значительно отличался от предыдущего, вызывая опасения по поводу несовместимости и затрат на преобразование. В январе 1981 года Джозеф Т. Брофи, старший вице-президент по страхованию путешественников, пригрозил подать в суд на комитет по стандартам, поскольку он не был совместим с COBOL-74 снизу вверх. Г-н Брофи охарактеризовал предыдущие преобразования их кодовой базы из 40 миллионов строк как «непродуктивные» и «полную трату ресурсов наших программистов». Позже в том же году Ассоциация управления обработкой данных (DPMA) заявила, что она «категорически против» нового стандарта, сославшись на «запредельные» затраты на преобразование и улучшения, которые «навязывались пользователю».

В течение первого периода публичного рассмотрения комитет получил 2 200 ответов, из которых 1 700 были отрицательными письмами. Другими ответами были подробные анализы влияния COBOL-80 на их системы; прогнозировалось, что затраты на преобразование составят не менее 50 центов за строку кода. Менее дюжины ответов были в пользу предложенного стандарта.

ISO TC97-SC5 был установлен в 1979 году международной группой экспертов COBOL по инициативе Вима Эббинхуйсена . В состав группы входили специалисты COBOL из многих стран, в том числе из США. Его целью было достижение взаимопонимания и уважения между ANSI и остальным миром в отношении необходимости новых функций COBOL. Через три года ISO изменила статус группы на официальную рабочую группу: WG 4 COBOL . Группа взяла на себя основную ответственность за разработку стандарта COBOL, в котором ANSI внес большинство предложений.

В 1983 году DPMA сняло свое возражение против стандарта, сославшись на реакцию комитета на общественные опасения. В том же году исследование Национального бюро стандартов пришло к выводу, что предлагаемый стандарт не вызовет особых проблем. Год спустя DEC выпустила VAX/VMS COBOL-80 и отметила, что преобразование программ COBOL-74 не вызывает особых проблем. Новый EVALUATEоператор и встроенный код PERFORMбыли особенно хорошо приняты и повысили производительность благодаря упрощенному потоку управления и отладке .

Второй публичный обзор получил еще 1000 (в основном отрицательных) ответов, а последний — всего 25, и к тому времени многие проблемы были решены.

В 1985 году рабочая группа ISO 4 приняла тогдашнюю версию предложенного стандарта ANSI, внесла несколько изменений и установила его в качестве нового стандарта ISO COBOL 85. Он был опубликован в конце 1985 года.

Шестьдесят функций были изменены или объявлены устаревшими, а 115 добавлены, например:

  • Ограничители области действия ( END-IF, END-PERFORM, END-READ, и т.д.)
  • Вложенные подпрограммы
  • CONTINUE, оператор без операции
  • EVALUATE, оператор переключения
  • INITIALIZE, оператор, который может устанавливать для групп данных значения по умолчанию.
  • Встроенные PERFORMтела циклов — ранее тела циклов нужно было указывать в отдельной процедуре.
  • Ссылочная модификация, которая разрешает доступ к подстрокам
  • Коды состояния ввода/вывода.

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

В 1989 и 1993 годах последовали две поправки, первая из которых вводила внутренние функции, а другая вносила исправления.

COBOL 2002 и объектно-ориентированный COBOL

В 1997 году Gartner Group подсчитала, что существует в общей сложности 200 миллиардов строк COBOL, которые запускают 80% всех бизнес-программ.

В начале 1990-х началась работа по добавлению объектной ориентации в следующую полную версию COBOL. Объектно-ориентированные функции были взяты из C++ и Smalltalk .

Первоначальная оценка должна была завершить эту версию к 1997 году, а проект комитета ISO (CD) был доступен к 1997 году. Некоторые поставщики (включая Micro Focus , Fujitsu и IBM ) представили объектно-ориентированный синтаксис на основе черновиков полной версии. Окончательный утвержденный стандарт ISO был утвержден и опубликован в конце 2002 года.

Fujitsu/GTSoftware, Micro Focus и RainCode представили объектно-ориентированные компиляторы COBOL, ориентированные на .NET Framework .

Было много других новых функций, многие из которых были в CODASYL COBOL Journal of Development с 1978 года и упустили возможность быть включенными в COBOL-85. Эти другие функции включали:

К стандарту было опубликовано три исправления : два в 2006 г. и одно в 2009 г.

КОБОЛ 2014

В период с 2003 по 2009 год было выпущено три технических отчета, описывающих финализацию объектов , обработку XML и классы сбора для COBOL.

COBOL 2002 страдал от плохой поддержки: ни один компилятор полностью не поддерживал стандарт. Micro Focus обнаружила, что это произошло из-за отсутствия спроса со стороны пользователей на новые функции и из-за отмены набора тестов NIST , который использовался для проверки соответствия компилятора. Процесс стандартизации также оказался медленным и недостаточно обеспеченным ресурсами.

COBOL 2014 включает следующие изменения:

  • Переносимые арифметические результаты заменены типами данных IEEE 754.
  • Основные функции стали необязательными, например VALIDATEсредство, средство создания отчетов и средство обработки экрана.
  • Перегрузка метода
  • Таблицы динамической емкости (функция исключена из проекта COBOL 2002)

Наследие

Программы COBOL используются по всему миру в государственных учреждениях и компаниях и работают в различных операционных системах, таких как z/OS , z/VSE , VME , Unix , NonStop OS, OpenVMS и Windows . В 1997 году Gartner Group сообщила, что 80% мирового бизнеса работает на COBOL, при этом ежегодно пишется более 200 миллиардов строк кода и еще 5 миллиардов строк.

Ближе к концу 20-го века проблема 2000 года (Y2K) была в центре внимания значительных усилий по программированию на COBOL, иногда теми же программистами, которые разрабатывали системы десятилетия назад. Особый уровень усилий, необходимых для исправления кода COBOL, объясняется большим количеством бизнес-ориентированного COBOL, поскольку бизнес-приложения интенсивно используют даты и поля данных фиксированной длины. Некоторые исследования приписывают Cobol «24% затрат на ремонт программного обеспечения 2000 года». После усилий по очистке этих программ от 2000 года опрос 2003 года показал, что многие из них по-прежнему используются. Авторы заявили, что данные опроса предполагают «постепенное снижение важности COBOL в разработке приложений в течение [последующих] 10 лет, если ... не будет принята интеграция с другими языками и технологиями».

В 2006 и 2012 годах опросы Computerworld (352 читателя) показали, что более 60% организаций использовали COBOL (больше, чем C++ и Visual Basic .NET ), и что половина из них использовала COBOL для большей части своего внутреннего программного обеспечения. 36% менеджеров заявили, что планируют перейти с COBOL, а 25% заявили, что хотели бы сделать это, если бы это было дешевле. Вместо этого некоторые предприятия перенесли свои системы с дорогих мэйнфреймов на более дешевые и современные системы, сохранив при этом свои программы на языке COBOL.

Свидетельские показания перед Палатой представителей в 2016 году показали, что COBOL все еще используется многими федеральными агентствами. В 2017 году агентство Reuters сообщило, что 43% банковских систем по-прежнему используют COBOL с использованием более 220 миллиардов строк кода COBOL.

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

Во время пандемии COVID-19 и последовавшего за ней всплеска безработицы несколько штатов США сообщили о нехватке квалифицированных программистов на языке COBOL для поддержки устаревших систем, используемых для управления пособиями по безработице. Многие из этих систем находились в процессе перехода на более современные языки программирования до пандемии, но этот процесс был приостановлен. Точно так же Налоговая служба США поспешила исправить свой индивидуальный мастер-файл на основе COBOL , чтобы выплатить десятки миллионов платежей, предусмотренных Законом о помощи, помощи и экономической безопасности в связи с коронавирусом .

Функции

Синтаксис

COBOL имеет синтаксис, похожий на английский, который используется для описания почти всего в программе. Например, условие может быть выражено как   или более кратко как     или   . Более сложные условия можно «сокращать», удаляя повторяющиеся условия и переменные. Например,     можно сократить до . Для поддержки этого похожего на английский синтаксиса в COBOL предусмотрено более 300 ключевых слов . Некоторые ключевые слова представляют собой простые альтернативные варианты написания одного и того же слова во множественном числе, что обеспечивает более похожие на английский язык утверждения и предложения; например, ключевые слова и могут использоваться взаимозаменяемо, как и и , и и . x IS GREATER THAN yx GREATER yx > ya > b AND a > c OR a = da > b AND c OR = dINOFTIMETIMESVALUEVALUES

Каждая программа на языке COBOL состоит из четырех основных лексических элементов : слов, литералов, строк изображений (см. § PICTURE ) и разделителей. Слова включают зарезервированные слова и определяемые пользователем идентификаторы. Они имеют длину до 31 символа и могут включать буквы, цифры, дефисы и символы подчеркивания. Литералы включают числа (например, 12) и строки (например, 'Hello!'). Разделители включают пробел, запятые и точки с запятой, за которыми следует пробел.

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

Метаязык

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

Элементы метаязыка COBOL
Элемент Появление Функция
Все столицы ПРИМЕР Зарезервированное слово
Подчеркивание ПРИМЕР Зарезервированное слово обязательно
Брекеты { } Можно выбрать только один вариант
Кронштейны [] Можно выбрать ноль или один вариант
Многоточие ... Предыдущий элемент может повторяться
Бары {| |} Можно выбрать один или несколько вариантов. Любой вариант можно выбрать только один раз.
[| |] Можно выбрать ноль или более вариантов. Любой вариант можно выбрать только один раз.

В качестве примера рассмотрим следующее описание оператора ADD:

Это описание допускает следующие варианты:

ADD 1 TO x
ADD 1, a, b TO x ROUNDED, y, z ROUNDED

ADD a, b TO c
    ON SIZE ERROR
        DISPLAY "Error"
END-ADD

ADD a TO b
    NOT SIZE ERROR
        DISPLAY "No error"
    ON SIZE ERROR
        DISPLAY "Error"

Формат кода

Программная колода перфокарт COBOL, 1970-е годы.

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

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

Имя Колонка(и) Применение
Область порядкового номера 1–6 Первоначально использовавшаяся для номеров карт/строк (упрощающая механическую сортировку перфокарт для обеспечения заданной последовательности программного кода после ручного редактирования/обработки), эта область игнорируется компилятором.
Область индикатора 7 Здесь разрешены следующие символы:
  • *- Строка комментария
  • /– Строка комментария, которая будет напечатана на новой странице исходного списка.
  • -– Строка продолжения, в которой продолжаются слова или литералы из предыдущей строки.
  • D– Строка включена в режиме отладки, иначе она игнорируется.
Зона А 8–11 Он содержит: DIVISIONи SECTIONзаголовки процедур; Номера уровней 01 и 77 и дескрипторы файлов/отчетов
Зона Б 12–72 Любой другой код, не разрешенный в Зоне A
Область имени программы 73– Исторически до столбца 80 для перфокарт он используется для идентификации программы или последовательности, к которой принадлежит карта.

В COBOL 2002 области A и B были объединены, чтобы сформировать область текста программы, которая теперь заканчивается столбцом, определенным разработчиком.

COBOL 2002 также представил код свободного формата. Код произвольного формата можно поместить в любой столбец файла, как и в более новых языках программирования. Комментарии задаются с помощью *>, которые можно размещать где угодно, а также использовать в исходном коде фиксированного формата. Линии продолжения отсутствуют, а >>PAGEдиректива заменяет /индикатор.

Идентификационное подразделение

Раздел идентификации идентифицирует следующую кодовую единицу и содержит определение класса или интерфейса.

Объектно-ориентированного программирования

Классы и интерфейсы были в COBOL с 2002 года. Классы имеют фабричные объекты, содержащие методы и переменные класса, и объекты-экземпляры, содержащие методы и переменные экземпляра. Наследование и интерфейсы обеспечивают полиморфизм . Поддержка универсального программирования обеспечивается через параметризованные классы, которые могут быть созданы для использования любого класса или интерфейса. Объекты хранятся в виде ссылок, которые могут быть ограничены определенным типом. Существует два способа вызова метода: INVOKEоператор, который действует аналогично CALL, или вызов встроенного метода, аналогичный использованию функций.

*> These are equivalent.
INVOKE my-class "foo" RETURNING var
MOVE my-class::"foo" TO var *> Inline method invocation

COBOL не позволяет скрыть методы . Однако данные класса можно скрыть, объявив их без предложения PROPERTY, в результате чего пользователь не сможет получить к ним доступ. Перегрузка методов была добавлена ​​в COBOL 2014.

Отдел окружающей среды

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

Файлы

COBOL поддерживает три формата файлов или организаций : последовательный, индексированный и относительный. В последовательных файлах записи являются смежными и должны проходиться последовательно , подобно связному списку . Индексированные файлы имеют один или несколько индексов, обеспечивающих произвольный доступ к записям и сортировку по ним. Каждая запись должна иметь уникальный ключ , но другие альтернативные ключи записи не обязательно должны быть уникальными. Реализации индексированных файлов различаются у разных поставщиков, хотя общие реализации, такие как C-ISAM и VSAM , основаны на ISAM от IBM . другими реализациями являются службы управления записями на OpenVMS и Enscribe на HPE NonStop (Tandem). Относительные файлы, такие как проиндексированные файлы, имеют уникальный ключ записи, но не имеют альтернативных ключей. Ключ относительной записи — это ее порядковый номер; например, 10-я запись имеет ключ 10. Это означает, что создание записи с ключом 5 может потребовать создания (пустых) предшествующих записей. Относительные файлы также допускают как последовательный, так и произвольный доступ.

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

Раздел данных

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

Совокупные данные

Элементы данных в COBOL объявляются иерархически с помощью номеров уровней, которые указывают, является ли элемент данных частью другого. Элемент с более высоким номером уровня подчиняется элементу с более низким. Элементы данных верхнего уровня с номером уровня 1 называются записями . Элементы, которые имеют подчиненные совокупные данные, называются групповыми элементами ; те, которые не называются элементарными элементами . Номера уровней, используемые для описания стандартных элементов данных, находятся в диапазоне от 1 до 49.

       01  some-record.                   *> Aggregate group record item
           05  num            PIC 9(10).  *> Elementary item
           05  the-date.                  *> Aggregate (sub)group record item
               10  the-year   PIC 9(4).   *> Elementary item
               10  the-month  PIC 99.     *> Elementary item
               10  the-day    PIC 99.     *> Elementary item

В приведенном выше примере элементарный элемент numи групповой элемент the-dateподчинены записи some-record, а элементарные элементы the-year, the-monthи the-dayвходят в состав группового элемента the-date.

Подчиненные элементы могут быть устранены с помощью ключевого слова IN(или OF). Например, рассмотрим приведенный выше пример кода вместе со следующим примером:

       01  sale-date.
           05  the-year       PIC 9(4).
           05  the-month      PIC 99.
           05  the-day        PIC 99.

Имена the-year, the-monthи the-dayнеоднозначны сами по себе, поскольку с этими именами определено более одного элемента данных. Чтобы указать конкретный элемент данных, например один из элементов, содержащихся в sale-dateгруппе, программист должен использовать the-year IN sale-date(или эквивалент the-year OF sale-date). Этот синтаксис похож на «точечную нотацию», поддерживаемую большинством современных языков.

Другие уровни данных

Номер уровня 66 используется для объявления перегруппировки ранее определенных элементов, независимо от того, как эти элементы структурированы. Этот уровень данных, также упоминаемый в соответствующем RENAMESпредложении , используется редко и примерно в 1988 году обычно встречался в старых программах. Его способность игнорировать данные иерархической и логической структуры означала, что его использование не рекомендовалось, и многие установки запрещали его использование.

       01  customer-record.
           05  cust-key            PIC X(10).
           05  cust-name.
               10  cust-first-name PIC X(30).
               10  cust-last-name  PIC X(30).
           05  cust-dob            PIC 9(8).
           05  cust-balance        PIC 9(7)V99.
           
       66  cust-personal-details   RENAMES cust-name THRU cust-dob.
       66  cust-all-details        RENAMES cust-name THRU cust-balance.

Номер уровня 77 указывает, что элемент является автономным, и в таких ситуациях эквивалентен номеру уровня 01. Например, следующий код объявляет два элемента данных уровня 77, property-nameи sales-region, которые не являются групповыми элементами данных, которые не зависят (не подчиняются) каким-либо другим элементам данных:

       77  property-name      PIC X(80).
       77  sales-region       PIC 9(5).

Номер уровня 88 объявляет имя условия (так называемый уровень 88), которое истинно, когда его родительский элемент данных содержит одно из значений, указанных в его VALUEпредложении. Например, следующий код определяет два 88-уровневых элемента имени условия, которые являются истинными или ложными в зависимости от текущего символьного значения данных элемента данных wage-type. Когда элемент данных содержит значение 'H', имя-условия wage-is-hourlyистинно, а когда оно содержит значение 'S'или 'Y', имя-условия wage-is-yearlyистинно. Если элемент данных содержит какое-либо другое значение, оба имени условия являются ложными.

       01  wage-type          PIC X.
           88  wage-is-hourly VALUE "H".
           88  wage-is-yearly VALUE "S", "Y".

Типы данных

Стандартный COBOL предоставляет следующие типы данных:

Тип данных Образец декларации Примечания
Алфавитный PIC A(30) Может содержать только буквы или пробелы.
буквенно-цифровой PIC X(30) Может содержать любые символы.
логический PIC 1 USAGE BIT Данные хранятся в виде 0 и 1 в виде двоичного числа.
Индекс USAGE INDEX Используется для ссылки на элементы таблицы.
Национальный PIC N(30) Аналогично буквенно-цифровому, но с использованием расширенного набора символов, например UTF-8 .
Числовой PIC 9(5)V9(2) Содержит ровно 7 цифр (7=5+2). 'V' находит неявный десятичный знак в числе с фиксированной точкой.
Объект USAGE OBJECT REFERENCE Может ссылаться либо на объект, либо на NULL.
Указатель USAGE POINTER

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

ИЗОБРАЖЕНИЕ

Предложение PICTURE(или PIC) — это строка символов, каждый из которых представляет часть элемента данных и то, что он может содержать. Некоторые символы изображения определяют тип элемента и количество символов или цифр, которые он занимает в памяти. Например, 9обозначает десятичную цифру, а Sуказывает, что элемент подписан . Другие символы изображения (называемые символами вставки и редактирования ) указывают, как следует форматировать элемент. Например, последовательность +символов определяет позиции символов, а также то, как начальный символ знака должен быть расположен в окончательных данных символа; самый правый нечисловой символ будет содержать знак элемента, в то время как другие позиции символов, соответствующие а +слева от этой позиции, будут содержать пробел. Повторяющиеся символы можно указать более кратко, указав число в скобках после символа изображения; например, 9(7)эквивалентен 9999999. Спецификации изображения, содержащие только символы цифры ( 9) и знака ( S), определяют чисто числовые элементы данных, в то время как спецификации изображения, содержащие буквенные ( A) или буквенно-цифровые ( X) символы, определяют буквенно-цифровые элементы данных. Наличие других символов форматирования определяет редактируемые числовые или редактируемые буквенно-цифровые элементы данных.

Примеры
PICTUREпункт Значение в Ценность вне
PIC 9(5) 100 00100
"Hello" "Hello"(это допустимо, но приводит к неопределенному поведению )
PIC +++++ -10 "  -10"(обратите внимание на начальные пробелы)
PIC 99/99/9(4) 30042003 "30/04/2003"
PIC *(4)9.99 100.50 "**100.50"
0 "****0.00"
PIC X(3)BX(3)BX(3) "ABCDEFGHI" "ABC DEF GHI"
ИСПОЛЬЗОВАНИЕ

Предложение USAGEобъявляет формат, в котором хранятся данные. В зависимости от типа данных он может либо дополнять, либо использоваться вместо PICTUREпредложения. Хотя его можно использовать для объявления указателей и ссылок на объекты, в основном он ориентирован на указание числовых типов. Эти числовые форматы:

  • Двоичный, где минимальный размер указан либо в предложении, PICTUREлибо в USAGEпредложении, таком какBINARY-LONG
  • USAGE COMPUTATIONAL, где данные могут храниться в любом формате, предоставляемом реализацией; часто эквивалентно  USAGE BINARY
  • USAGE DISPLAY, формат по умолчанию, где данные хранятся в виде строки
  • С плавающей запятой в формате, зависящем от реализации, или в соответствии со стандартом IEEE 754.
  • USAGE NATIONAL, где данные хранятся в виде строки с использованием расширенного набора символов
  • USAGE PACKED-DECIMAL, где данные хранятся в наименьшем возможном десятичном формате (обычно упакованном двоично-десятичном формате )

Автор отчетов

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

Отчеты связаны с файлами отчетов, которые являются файлами, в которые можно записывать только через операторы генератора отчетов.

       FD  report-out REPORT sales-report.

Каждый отчет определяется в разделе отчета отдела данных. Отчет разделен на группы отчетов, которые определяют заголовки, основания и детали отчета. Отчеты обходят иерархические разрывы элементов управления . Перерывы управления происходят, когда ключевая переменная изменяет свое значение; например, при создании отчета с подробным описанием заказов клиентов может произойти сбой управления, когда программа достигает заказов другого клиента. Вот пример описания отчета, в котором представлены данные о продажах продавца и содержится предупреждение о любых недопустимых записях:

       RD  sales-report
           PAGE LIMITS 60 LINES
           FIRST DETAIL 3
           CONTROLS seller-name.

       01  TYPE PAGE HEADING.
           03  COL 1                    VALUE "Sales Report".
           03  COL 74                   VALUE "Page".
           03  COL 79                   PIC Z9 SOURCE PAGE-COUNTER.

       01  sales-on-day TYPE DETAIL, LINE + 1.
           03  COL 3                    VALUE "Sales on".
           03  COL 12                   PIC 99/99/9999 SOURCE sales-date.
           03  COL 21                   VALUE "were".
           03  COL 26                   PIC $$$$9.99 SOURCE sales-amount.

       01  invalid-sales TYPE DETAIL, LINE + 1.
           03  COL 3                    VALUE "INVALID RECORD:".
           03  COL 19                   PIC X(34) SOURCE sales-record.

       01  TYPE CONTROL HEADING seller-name, LINE + 2.
           03  COL 1                    VALUE "Seller:".
           03  COL 9                    PIC X(30) SOURCE seller-name.

Приведенное выше описание отчета описывает следующий макет:

Sales Report                                                             Page  1

Seller: Howard Bromberg
  Sales on 10/12/2008 were $1000.00
  Sales on 12/12/2008 were    $0.00
  Sales on 13/12/2008 were   $31.47
  INVALID RECORD: Howard Bromberg             XXXXYY

Seller: Howard Discount
...
Sales Report                                                            Page 12

  Sales on 08/05/2014 were  $543.98
  INVALID RECORD: William Selden      12O52014FOOFOO
  Sales on 30/05/2014 were    $0.00

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

           OPEN INPUT sales, OUTPUT report-out
           INITIATE sales-report
 
           PERFORM UNTIL 1 <> 1
               READ sales
                   AT END
                       EXIT PERFORM
               END-READ
 
               VALIDATE sales-record
               IF valid-record
                   GENERATE sales-on-day
               ELSE
                   GENERATE invalid-sales
               END-IF
           END-PERFORM
 
           TERMINATE sales-report
           CLOSE sales, report-out
           .

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

Процедурный отдел

Процедуры

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

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

Оператор PERFORMчем-то напоминает вызов процедуры в новых языках в том смысле, что выполнение возвращается к коду, следующему за оператором PERFORMв конце вызываемого кода; однако он не предоставляет механизма для передачи параметров или возврата значения результата. Если подпрограмма вызывается с помощью простого оператора, такого как , то управление возвращается в конце вызванной процедуры. Однако необычен тем, что его можно использовать для вызова диапазона, охватывающего последовательность нескольких смежных процедур. Делается это с помощью конструкции: PERFORM subroutinePERFORMPERFORM sub-1 THRU sub-n

PROCEDURE so-and-so.
    PERFORM ALPHA
    PERFORM ALPHA THRU GAMMA
    STOP RUN.
ALPHA.
    DISPLAY 'A'.
BETA.
    DISPLAY 'B'.
GAMMA.
    DISPLAY 'C'.

Вывод этой программы будет: "AAB C".

PERFORMтакже отличается от обычных вызовов процедур тем, что, по крайней мере, традиционно, отсутствует понятие стека вызовов. Как следствие, возможны вложенные вызовы (последовательность PERFORM'ed кода может выполнить PERFORMсам оператор), но требуется особая осторожность, если части одного и того же кода выполняются обоими вызовами. Проблема возникает, когда код внутреннего вызова достигает точки выхода внешнего вызова. Более формально, если управление проходит через точку выхода вызова PERFORM, который был вызван ранее, но еще не завершен, стандарт COBOL 2002 предусматривает, что поведение не определено .

Причина в том, что COBOL, а не «обратный адрес», работает с тем, что можно назвать адресом продолжения. Когда поток управления достигает конца какой-либо процедуры, ищется адрес продолжения, и управление передается на этот адрес. Перед запуском программы адрес продолжения для каждой процедуры инициализируется начальным адресом процедуры, следующей в тексте программы, так что, если PERFORMоператоры не выполняются, управление передается сверху вниз по программе. Но когда PERFORMоператор выполняется, он изменяет адрес продолжения вызываемой процедуры (или последней процедуры вызываемого диапазона, если она PERFORM THRUиспользовалась), так что управление возвращается к месту вызова в конце. Исходное значение сохраняется и впоследствии восстанавливается, но имеется только одна позиция хранения. Если два вложенных вызова работают с перекрывающимся кодом, они могут мешать друг другу управлять адресом продолжения несколькими способами.

Следующий пример (взято из Veerman & Verhoeven 2006 ) иллюстрирует проблему:

LABEL1.
    DISPLAY '1'
    PERFORM LABEL2 THRU LABEL3
    STOP RUN.
LABEL2.
    DISPLAY '2'
    PERFORM LABEL3 THRU LABEL4.
LABEL3.
    DISPLAY '3'.
LABEL4.
    DISPLAY '4'.

Можно было бы ожидать, что вывод этой программы будет «1 2 3 4 3»: после отображения «2» второй вызывает PERFORMотображение «3» и «4», а затем первый вызов продолжается с «3». . В традиционных реализациях COBOL это не так. Вместо этого первый PERFORMоператор устанавливает адрес продолжения в конце LABEL3так, чтобы он возвращался к месту вызова внутри LABEL1. Второй PERFORMоператор устанавливает возврат в конце, LABEL4но не изменяет адрес продолжения LABEL3, ожидая, что это будет продолжение по умолчанию. Таким образом, когда внутренний вызов достигает конца LABEL3, он возвращается к внешнему PERFORMоператору, и программа прекращает вывод только «1 2 3». С другой стороны, в некоторых реализациях COBOL, таких как компилятор TinyCOBOL с открытым исходным кодом, два PERFORMоператора не мешают друг другу, и на выходе действительно «1 2 3 4 3». Поэтому поведение в таких случаях не только (возможно) удивительно, оно еще и не переносимо.

Особым следствием этого ограничения является то, что его PERFORMнельзя использовать для написания рекурсивного кода. Еще один простой пример, иллюстрирующий это (слегка упрощенный из Veerman & Verhoeven 2006 ):

    MOVE 1 TO A
    PERFORM LABEL
    STOP RUN.
LABEL.
    DISPLAY A
    IF A < 3
        ADD 1 TO A
        PERFORM LABEL
    END-IF
    DISPLAY 'END'.

Можно было бы ожидать, что на выходе будет "1 2 3 END END END", и на самом деле это то, что выдают некоторые компиляторы COBOL. Но другие компиляторы, такие как IBM COBOL, будут создавать код, который печатает «1 2 3 END END END END ..." и так далее, печатая «END» снова и снова в бесконечном цикле. Поскольку место для хранения адресов продолжения резервных копий ограничено, резервные копии перезаписываются в ходе рекурсивных вызовов, и все, что можно восстановить, — это вернуться к DISPLAY 'END'.

Заявления

COBOL 2014 имеет 47 операторов (также называемых глаголами ), которые можно сгруппировать в следующие широкие категории: поток управления, ввод-вывод, обработка данных и создание отчетов. Операторы составителя отчетов рассматриваются в разделе составителя отчетов .

Поток управления

Условными операторами COBOL являются IFи EVALUATE. EVALUATEпредставляет собой оператор, похожий на переключатель , с дополнительной возможностью оценки нескольких значений и условий. Это можно использовать для реализации таблиц решений . Например, для управления токарным станком с ЧПУ можно использовать следующее :

EVALUATE TRUE ALSO desired-speed ALSO current-speed
    WHEN lid-closed ALSO min-speed THRU max-speed ALSO LESS THAN desired-speed
        PERFORM speed-up-machine
    WHEN lid-closed ALSO min-speed THRU max-speed ALSO GREATER THAN desired-speed
        PERFORM slow-down-machine
    WHEN lid-open ALSO ANY ALSO NOT ZERO
        PERFORM emergency-stop
    WHEN OTHER
        CONTINUE
END-EVALUATE

Оператор PERFORMиспользуется для определения циклов, которые выполняются до тех пор, пока условие не станет истинным (но не пока оно истинно, что более распространено в других языках). Он также используется для вызова процедур или диапазонов процедур ( подробности см. в разделе процедур ). CALLи INVOKEвызывать подпрограммы и методы соответственно. Имя подпрограммы/метода содержится в строке, которая может быть литералом или элементом данных. Параметры могут передаваться по ссылке , по содержимому (где копия передается по ссылке) или по значению (но только при наличии прототипа ). CANCELвыгружает подпрограммы из памяти. GO TOзаставляет программу перейти к указанной процедуре.

Оператор GOBACKявляется оператором возврата , и STOPоператор останавливает программу. Оператор EXITимеет шесть различных форматов: его можно использовать как оператор return, оператор break , оператор continue , маркер конца или выход из процедуры.

Исключения вызываются оператором RAISEи перехватываются с помощью обработчика, или декларативного , определенного в DECLARATIVESчасти разделения процедуры. Декларативы — это разделы, начинающиеся с USEоператора, в котором указываются ошибки, которые необходимо обрабатывать. Исключениями могут быть имена или объекты. RESUMEиспользуется в декларативе для перехода к оператору после оператора, вызвавшего исключение, или к процедуре вне DECLARATIVES. В отличие от других языков, неперехваченные исключения могут не завершать работу программы, и программа может продолжить работу без изменений.

ввод/вывод

Файловый ввод-вывод обрабатывается операторами с самоописанием OPEN, CLOSE, READи , WRITEа также тремя дополнительными: REWRITE, которые обновляют запись; START, который выбирает последующие записи для доступа, находя запись с определенным ключом; и UNLOCK, который освобождает блокировку последней доступной записи.

Взаимодействие с пользователем осуществляется с помощью ACCEPTи DISPLAY.

Манипуляция данными

Следующие глаголы манипулируют данными:

  • INITIALIZE, который устанавливает для элементов данных значения по умолчанию.
  • MOVE, который присваивает значения элементам данных; MOVE CORRESPONDING назначает соответствующие одноименные поля .
  • SET, который имеет 15 форматов: среди прочих функций он может изменять индексы, назначать ссылки на объекты и изменять емкости таблиц.
  • ADD, SUBTRACT, MULTIPLY, DIVIDEи COMPUTE, которые обрабатывают арифметические операции (с COMPUTEприсвоением результата формулы переменной).
  • ALLOCATEи FREE, которые обрабатывают динамическую память .
  • VALIDATE, который проверяет и распространяет данные, как указано в описании элемента в разделе данных.
  • STRINGи UNSTRING, которые объединяют и разбивают строки соответственно.
  • INSPECT, который подсчитывает или заменяет экземпляры указанных подстрок в строке.
  • SEARCH, который ищет в таблице первую запись, удовлетворяющую условию.

Файлы и таблицы сортируются с помощью SORTи MERGEглагол объединяет и сортирует файлы. Глагол RELEASEпредоставляет записи для сортировки и RETURNизвлекает отсортированные записи по порядку.

Прекращение действия

Некоторые операторы, такие как IFи READ, могут сами содержать операторы. Такие операторы могут быть завершены двумя способами: точкой ( неявное завершение ), которая завершает все содержащиеся незавершенные операторы, или терминатором области действия, который завершает ближайший соответствующий открытый оператор.

*> Terminator period ("implicit termination")
IF invalid-record
    IF no-more-records
        NEXT SENTENCE
    ELSE
        READ record-file
            AT END SET no-more-records TO TRUE.

*> Scope terminators ("explicit termination")
IF invalid-record
    IF no-more-records
        CONTINUE
    ELSE
        READ record-file
            AT END SET no-more-records TO TRUE
        END-READ
    END-IF
END-IF

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

IF x
    DISPLAY y.
    DISPLAY z.

Здесь цель состоит в том, чтобы отобразить yи zесли условие xистинно. Тем не менее, zбудет отображаться независимо от значения, xпотому что IFоператор завершается ошибочной точкой после . DISPLAY y

Еще одна ошибка возникает из-за проблемы с висячим else , когда два IFоператора могут ассоциироваться с ELSE.

IF x
    IF y
        DISPLAY a
ELSE
    DISPLAY b.

В приведенном выше фрагменте ELSEассоциирование с оператором,     а не с     оператором, вызывает ошибку. До введения явных ограничителей области действия для предотвращения их необходимо было     размещать после внутреннего . IF yIF xELSE NEXT SENTENCEIF

Самомодифицирующийся код

Первоначальная (1959 г.) спецификация COBOL поддерживала печально известный     оператор, для которого многие компиляторы генерировали самомодифицирующийся код . и являются метками процедур, а единственный     оператор в процедуре, выполняемый после такого оператора, означает     вместо этого. Многие компиляторы все еще поддерживают его, но в стандарте COBOL 1985 года он был признан устаревшим и удален в 2002 году.ALTER X TO PROCEED TO YXYGO TOXALTERGO TO Y

Это ALTERутверждение было плохо воспринято, потому что оно подрывало «локальность контекста» и затрудняло понимание общей логики программы. Как писал автор учебника Дэниел Д. Маккракен в 1976 году, когда «кто-то, кто никогда раньше не видел программу, должен ознакомиться с ней как можно быстрее, иногда в условиях критического дефицита времени, потому что программа не удалась... оператор в абзаце сам по себе сигнализирует о существовании неизвестного количества операторов ALTER в неизвестных местах по всей программе, вселяет страх в сердце самого смелого программиста».

Привет, мир

Программа " Hello, world " на языке COBOL:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. hello-world.
       PROCEDURE DIVISION.
           DISPLAY "Hello, world!"
           .

Когда - теперь уже известное - «Привет, мир!» Пример программы на языке программирования C был впервые опубликован в 1978 году. Аналогичный образец программы COBOL для мэйнфреймов должен был быть представлен через JCL , весьма вероятно, с использованием устройства чтения перфокарт и перфокарт с 80 столбцами. Приведенный ниже листинг с пустым DATA DIVISION был протестирован с использованием Linux и эмулятора System/370 Hercules под управлением MVS 3.8J. JCL, написанный в июле 2015 года, основан на учебных пособиях и примерах Hercules, размещенных Джеем Мозли. В соответствии с программированием COBOL той эпохи, HELLO, WORLD отображается заглавными буквами.

//COBUCLG  JOB (001),'COBOL BASE TEST',                                 00010000
//             CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1)                        00020000
//BASETEST EXEC COBUCLG                                                 00030000
//COB.SYSIN DD *                                                        00040000
 00000* VALIDATION OF BASE COBOL INSTALL                                00050000
 01000 IDENTIFICATION DIVISION.                                         00060000
 01100 PROGRAM-ID. 'HELLO'.                                             00070000
 02000 ENVIRONMENT DIVISION.                                            00080000
 02100 CONFIGURATION SECTION.                                           00090000
 02110 SOURCE-COMPUTER.  GNULINUX.                                      00100000
 02120 OBJECT-COMPUTER.  HERCULES.                                      00110000
 02200 SPECIAL-NAMES.                                                   00120000
 02210     CONSOLE IS CONSL.                                            00130000
 03000 DATA DIVISION.                                                   00140000
 04000 PROCEDURE DIVISION.                                              00150000
 04100 00-MAIN.                                                         00160000
 04110     DISPLAY 'HELLO, WORLD' UPON CONSL.                           00170000
 04900     STOP RUN.                                                    00180000
//LKED.SYSLIB DD DSNAME=SYS1.COBLIB,DISP=SHR                            00190000
//            DD DSNAME=SYS1.LINKLIB,DISP=SHR                           00200000
//GO.SYSPRINT DD SYSOUT=A                                               00210000
//                                                                      00220000

После отправки JCL консоль MVS отобразила:

    19.52.48 JOB    3  $HASP100 COBUCLG  ON READER1     COBOL BASE TEST
    19.52.48 JOB    3  IEF677I WARNING MESSAGE(S) FOR JOB COBUCLG  ISSUED
    19.52.48 JOB    3  $HASP373 COBUCLG  STARTED - INIT 1 - CLASS A - SYS BSP1
    19.52.48 JOB    3  IEC130I SYSPUNCH DD STATEMENT MISSING
    19.52.48 JOB    3  IEC130I SYSLIB   DD STATEMENT MISSING
    19.52.48 JOB    3  IEC130I SYSPUNCH DD STATEMENT MISSING
    19.52.48 JOB    3  IEFACTRT - Stepname  Procstep  Program   Retcode
    19.52.48 JOB    3  COBUCLG    BASETEST  COB       IKFCBL00  RC= 0000
    19.52.48 JOB    3  COBUCLG    BASETEST  LKED      IEWL      RC= 0000
    19.52.48 JOB    3  +HELLO, WORLD
    19.52.48 JOB    3  COBUCLG    BASETEST  GO        PGM=*.DD  RC= 0000
    19.52.48 JOB    3  $HASP395 COBUCLG  ENDED

Строка 10 приведенного выше списка консоли выделена для эффекта, выделение не является частью фактического вывода консоли .

Соответствующий список компилятора содержит более четырех страниц технических деталей и информации о выполнении задания для одной строки вывода из 14 строк COBOL.

Прием

Отсутствие структуры

В 1970-х годах принятие парадигмы структурного программирования становилось все более распространенным явлением. Эдсгер Дейкстра , выдающийся ученый-компьютерщик, написал письмо редактору Communications of the ACM , опубликованное в 1975 году под названием «Как мы говорим правду, которая может навредить?», В котором он критиковал COBOL и несколько других современных языков; отметив, что «использование COBOL калечит разум».

В опубликованном несогласии с замечаниями Дейкстры ученый-компьютерщик Ховард Э. Томпкинс заявил, что неструктурированный COBOL, как правило, «пишется программистами, которые никогда не пользовались преимуществами хорошо обученного структурированного COBOL», утверждая, что проблема заключалась в первую очередь в обучении.

Одной из причин спагетти-кода был GO TOоператор. Однако попытки удалить GO TOs из кода COBOL привели к запутанности программ и снижению качества кода. GO TOs были в значительной степени заменены операторами PERFORMи процедурами, которые продвигали модульное программирование и давали легкий доступ к мощным средствам циклов. Однако PERFORMего можно было использовать только с процедурами, поэтому тела циклов не располагались там, где они использовались, что затрудняло понимание программ.

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

Еще одна сложность связана с возможностью выполнения PERFORM THRUзаданной последовательности процедур. Это означало, что управление могло переходить к любой процедуре и возвращаться из нее, создавая запутанный поток управления и позволяя программисту нарушить правило « один вход — один выход» .

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

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

Проблемы совместимости

COBOL задумывался как переносимый, «общий» язык. Однако к 2001 году было создано около 300 диалектов. Одним из источников диалектов был сам стандарт: стандарт 1974 года состоял из одного обязательного ядра и одиннадцати функциональных модулей, каждый из которых содержал два или три уровня поддержки. Это позволило 104 976 возможных вариантов.

COBOL-85 не был полностью совместим с более ранними версиями, и его разработка вызывала споры. Джозеф Т. Брофи, ИТ-директор Travelers Insurance , возглавил работу по информированию пользователей COBOL о больших затратах на перепрограммирование при внедрении нового стандарта. В результате комитет ANSI COBOL получил более 2200 писем от общественности, в основном негативных, с требованием внести изменения. С другой стороны, считалось, что переход на COBOL-85 повысит производительность в последующие годы, что оправдывает затраты на переход.

Подробный синтаксис

КОБОЛ: /кобол/, сущ.

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

Файл жаргона 4.4.8.

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

Стремление к удобочитаемости привело к использованию английского синтаксиса и структурных элементов, таких как существительные, глаголы, пункты, предложения, разделы и подразделения. Тем не менее, к 1984 году сопровождающие программы COBOL изо всех сил пытались справиться с «непонятным» кодом, и основные изменения в COBOL-85 были призваны упростить обслуживание.

Джин Саммет, член комитета ближнего действия, отметила, что «было предпринято мало попыток угодить профессиональным программистам, на самом деле люди, чей основной интерес - программирование, как правило, очень недовольны COBOL», что она объяснила многословным синтаксисом COBOL.

Изоляция от компьютерного сообщества

Сообщество COBOL всегда было изолировано от компьютерного сообщества. Никто из ученых-компьютерщиков не участвовал в разработке COBOL: все члены комитета были представителями торговли или правительства. Ученых-компьютерщиков в то время больше интересовали такие области, как численный анализ, физика и системное программирование, чем коммерческие проблемы обработки файлов, которые решала разработка COBOL. Жан Саммет объяснил непопулярность COBOL первоначальной «снобской реакцией» из-за его неэлегантности, отсутствия влиятельных ученых-компьютерщиков, участвующих в процессе проектирования, и пренебрежения к обработке бизнес-данных. Спецификация COBOL использовала уникальную «нотацию» или метаязык для определения своего синтаксиса, а не новую форму Бэкуса-Наура , о которой комитет не знал. Это вызвало «резкую» критику.

Академический мир склонен рассматривать COBOL как многословный, неуклюжий и неэлегантный и пытается игнорировать его, хотя в мире, вероятно, больше программ и программистов на COBOL, чем для FORTRAN, ALGOL и PL/I вместе взятых. По большей части только школы с непосредственными профессиональными целями проводят обучение на COBOL.

Ричард Конвей и Дэвид Грайс , 1973 год.

Позже COBOL страдал от нехватки материалов для его покрытия; только в 1963 году появились вводные книги (Ричард Д. Ирвин опубликовал учебник для колледжа по COBOL в 1966 году). К 1985 году в Библиотеке Конгресса было в два раза больше книг по FORTRAN и в четыре раза больше по BASIC, чем по COBOL . Профессора университетов преподавали более современные, передовые языки и методы вместо COBOL, который, как говорили, носил характер «профессиональной школы». Дональд Нельсон, председатель комитета CODASYL COBOL, сказал в 1984 году, что «ученые ... ненавидят COBOL» и что выпускникам компьютерных наук «в них внушили« ненависть к COBOL »».

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

В 2003 году COBOL был включен в 80% учебных программ по информационным системам в Соединенных Штатах, столько же, сколько C++ и Java . Десять лет спустя опрос, проведенный Micro Focus, показал, что 20% университетских ученых считают, что COBOL устарел или мертв, а 55% считают, что их студенты считают COBOL устаревшим или мертвым. Тот же опрос также показал, что только 25% ученых включали программирование на COBOL в свою учебную программу, хотя 60% считали, что они должны преподавать его.

Опасения по поводу процесса проектирования

Были высказаны сомнения в компетентности комитета по стандартам. Член краткосрочного комитета Говард Бромберг сказал, что процесс разработки «недостаточно контролировался» и что он «страдал от непостоянства персонала и ... нехватки талантов». Джин Саммет и Джером Гарфанкель также отметили, что изменения, внесенные в одну редакцию стандарта, будут отменены в следующей, как из-за изменений в составе комитета по стандартизации, так и из-за объективных доказательств.

Стандарты COBOL неоднократно страдали от задержек: COBOL-85 появился на пять лет позже, чем ожидалось, COBOL 2002 опоздал на пять лет, а COBOL 2014 опоздал на шесть лет. Для борьбы с задержками комитет по стандартам разрешил создание дополнительных дополнений, которые добавляли бы функции быстрее, чем ожидание следующей версии стандарта. Однако некоторые члены комитета выразили обеспокоенность по поводу несовместимости между реализациями и частых модификаций стандарта.

Влияния на другие языки

Структуры данных COBOL повлияли на последующие языки программирования. Его структура записей и файлов повлияла на PL/I и Pascal , а это REDEFINESпредложение было предшественником записей вариантов Pascal. Явные определения файловой структуры предшествовали разработке систем управления базами данных , а агрегированные данные были значительным шагом вперед по сравнению с массивами Fortran.

PICTUREдекларации данных были включены в PL/I с небольшими изменениями.

Средство COBOL COPY, хотя и считается «примитивным», повлияло на разработку директив включения .

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

Смотрите также

Примечания

Рекомендации

Цитаты

Источники

Внешние ссылки