COBOL ( / ˈ k oʊ b ɒ l , - b ɔː l / ; аббревиатура от «общий бизнес-ориентированный язык») — это компилируемый английский язык программирования, предназначенный для использования в бизнесе. Это императивный , процедурный и, с 2002 года, объектно-ориентированный язык. COBOL в основном используется в бизнесе, финансах и административных системах компаний и правительств. COBOL по-прежнему широко используется в приложениях, развернутых на мейнфреймах , таких как крупномасштабные задания пакетной обработки и обработки транзакций . Многие крупные финансовые учреждения разрабатывали новые системы на этом языке еще в 2006 году [10] , но сегодня большая часть программирования на COBOL предназначена исключительно для поддержки существующих приложений. Программы переносятся на новые платформы, переписываются на современные языки или заменяются другим программным обеспечением. [11]
COBOL был разработан в 1959 году компанией CODASYL и частично основывался на языке программирования FLOW-MATIC , разработанном Грейс Хоппер . Он был создан в рамках усилий Министерства обороны США по созданию портативного языка программирования для обработки данных. Первоначально это рассматривалось как временное решение, но Министерство обороны сразу же потребовало от производителей компьютеров предоставить его, что привело к его широкому распространению. [12] Он был стандартизирован в 1968 году и пересматривался пять раз. Расширения включают поддержку структурированного и объектно-ориентированного программирования . Действующим стандартом является ISO / IEC 1989:2023. [13]
Операторы COBOL имеют прозаический синтаксис, такой как , который был разработан как самодокументируемый и легко читаемый. Однако он многословен и использует более 300 зарезервированных слов . Это контрастирует с кратким и математически вдохновленным синтаксисом других языков (в данном случае ).MOVE x TO y
y = x;
Код COBOL разделен на четыре части (идентификация, среда, данные и процедуры), содержащие жесткую иерархию разделов, абзацев и предложений. Из-за отсутствия большой стандартной библиотеки стандарт определяет 43 оператора, 87 функций и только один класс.
Академические ученые-компьютерщики, как правило, не интересовались бизнес-приложениями, когда был создан COBOL, и не участвовали в его разработке; он был (фактически) разработан с нуля как компьютерный язык для бизнеса с упором на ввод и вывод, единственными типами данных которого были числа и текстовые строки. [14]
COBOL подвергался критике за многословие, процесс проектирования и плохую поддержку структурированного программирования . Эти недостатки приводят к созданию монолитных программ, которые трудно понять в целом, несмотря на их локальную читабельность.
В течение многих лет COBOL считался языком программирования для бизнес-операций на мэйнфреймах [15] , хотя в последние годы многие операции COBOL были перенесены в облачные вычисления . [16]
В конце 1950-х годов пользователи компьютеров и производители стали обеспокоены ростом стоимости программирования. Исследование 1959 года показало, что в любой установке по обработке данных программирование обходится в среднем в 800 000 долларов США, а перевод программ для работы на новом оборудовании обойдется в 600 000 долларов США. В то время, когда распространялись новые языки программирования , то же исследование показало, что если бы использовался общий бизнес-ориентированный язык, преобразование было бы намного дешевле и быстрее. [17]
8 апреля 1959 года Мэри К. Хоуз , ученый-компьютерщик из корпорации Burroughs , созвала встречу представителей академических кругов, пользователей компьютеров и производителей в Пенсильванском университете , чтобы организовать официальную встречу по общим деловым языкам. [18] Среди представителей были Грейс Хоппер (изобретатель английского языка обработки данных FLOW-MATIC ), Джин Саммет и Сол Горн . [19] [20]
На апрельской встрече группа обратилась к Министерству обороны (DoD) с просьбой спонсировать усилия по созданию общего делового языка. Делегация произвела впечатление на Чарльза А. Филлипса, директора исследовательского отдела систем данных Министерства обороны, [21] который считал, что они «полностью понимают» проблемы Министерства обороны. Министерство обороны эксплуатировало 225 компьютеров, еще 175 было заказано и потратило более 200 миллионов долларов на реализацию программ для их работы. Портативные программы сэкономят время, снизят затраты и облегчат модернизацию. [22]
Чарльз Филлипс согласился спонсировать встречу и поручил делегации подготовить повестку дня. [23]
28 и 29 мая 1959 года (ровно через год после цюрихской встречи ALGOL 58 ) в Пентагоне прошла встреча, на которой обсуждалось создание общего языка программирования для бизнеса. В нем принял участие 41 человек, председательствовал Филлипс. [24] Министерство обороны было обеспокоено тем, можно ли запускать одни и те же программы обработки данных на разных компьютерах. FORTRAN , единственный распространенный язык того времени, не имел функций, необходимых для написания таких программ. [25]
Представители с энтузиазмом описали язык, который может работать в самых разных средах: от банковского дела и страхования до коммунальных услуг и управления запасами. Они единогласно согласились, что больше людей должны уметь программировать и что новый язык не должен ограничиваться ограничениями современных технологий. Большинство согласилось, что язык должен максимально использовать английский, быть способным к изменению, быть машинонезависимым и простым в использовании, даже за счет мощности. [26]
Результатом встречи стало создание руководящего комитета , а также комитетов краткосрочного, промежуточного и долгосрочного характера. Комитету по краткосрочным вопросам было дано до сентября (три месяца) разработать спецификации для временной формулировки, которые затем будут улучшены другими комитетами. [27] [28] Их официальная миссия, однако, заключалась в выявлении сильных и слабых сторон существующих языков программирования; он не давал им явного указания на создание нового языка. [25]
Крайний срок был встречен комитетом ближнего действия с недоверием. [29] Одна из участниц, Бетти Холбертон , назвала трехмесячный срок «чрезвычайным оптимизмом» и выразила сомнение в том, что эта формулировка действительно станет временным решением. [30]
Руководящий комитет собрался 4 июня и согласился назвать всю деятельность Комитетом по языкам систем данных , или CODASYL , и сформировать исполнительный комитет. [31]
Члены комитета ближнего радиуса действия представляли шесть производителей компьютеров и три правительственных учреждения. Производителями компьютеров были Burroughs Corporation , IBM , Minneapolis-Honeywell (Honeywell Labs), RCA , Sperry Rand и Sylvania Electric Products . Правительственными агентствами были ВВС США , Модельный бассейн Дэвида Тейлора ВМФ и Национальное бюро стандартов (ныне Национальный институт стандартов и технологий). [32] Комитет возглавил Джозеф Вегштейн из Национального бюро стандартов США. Работа началась с изучения описаний данных, операторов, существующих приложений и пользовательского опыта. [33]
Комитет в основном рассматривал языки программирования FLOW-MATIC , AIMACO и COMTRAN . [25] [34] Язык FLOW-MATIC оказал особенное влияние, потому что он был реализован и потому что AIMACO был его производным с незначительными изменениями. [35] [36] Изобретатель FLOW-MATIC Грейс Хоппер также была техническим консультантом комитета. [29] Основным вкладом FLOW-MATIC в COBOL стали длинные имена переменных, английские слова для команд и разделение описаний данных и инструкций. [37]
Хоппер иногда называют «матерью COBOL» или «бабушкой COBOL», [38] [39] [40] , хотя Джин Саммет , ведущий дизайнер COBOL, сказала, что Хоппер «не был матерью, создателем или разработчиком Cobol». ." [41] [1]
Язык COMTRAN компании IBM, изобретенный Бобом Бемером , рассматривался комитетом ближнего радиуса действия, состоящим из коллег Грейс Хоппер, как конкурент FLOW-MATIC [42] [43] . [44] Некоторые из его функций не были включены в COBOL, чтобы не выглядело так, будто IBM доминировала в процессе проектирования, [27] а Жан Саммет сказал в 1981 году, что в каком-то комитете существовала «сильная предвзятость против IBM». участники (включая ее самого). [45] В одном случае, после того как Рой Голдфингер, автор руководства COMTRAN и член комитета среднего уровня, присутствовал на заседании подкомитета, чтобы поддержать его язык и поощрять использование алгебраических выражений, Грейс Хоппер отправила записку комитету ближнего действия. повторяя усилия Сперри Рэнда по созданию языка на основе английского. [46]
В 1980 году Грейс Хоппер отметила, что «COBOL 60 на 95% состоит из FLOW-MATIC» и что COMTRAN оказал «крайне небольшое» влияние. Более того, она сказала, что будет утверждать, что на работу повлияли как FLOW-MATIC, так и COMTRAN только для того, чтобы «сделать других людей счастливыми, [чтобы они] не пытались нас выбить из строя». [47]
Функции COMTRAN, включенные в COBOL, включали формулы, [48] предложение PICTURE, [49] улучшенный IF
оператор, который устранил необходимость в GO TO , и более надежную систему управления файлами. [42]
Полезность работы комитета стала предметом больших дискуссий. Хотя некоторые члены считали, что в этом языке слишком много компромиссов и что он является результатом разработки комитета , другие считали, что он лучше, чем три рассмотренных языка. Некоторые считали, что язык слишком сложен; другие слишком простые. [50]
К спорным функциям относились те, которые некоторые считали бесполезными или слишком продвинутыми для пользователей, занимающихся обработкой данных. К таким функциям относятся логические выражения , формулы и индексы таблиц . [51] [52] Еще один спорный вопрос заключался в том, следует ли делать ключевые слова контекстно-зависимыми и как это повлияет на читабельность. [51] Хотя контекстно-зависимые ключевые слова были отвергнуты, этот подход позже использовался в PL/I и частично в COBOL с 2002 года. [53] Мало внимания уделялось интерактивности , взаимодействию с операционными системами (в то время существовало мало) и функциям. (считается чисто математическим и бесполезным при обработке данных). [54] [55]
Спецификации были представлены исполкому 4 сентября. Они не оправдали ожиданий: Джозеф Вегштейн отметил, что «он содержит шероховатости и требует некоторых дополнений», а Боб Бемер позже назвал их «мешаниной». Подкомиссии дали время до декабря на ее доработку. [29]
На заседании в середине сентября комитет обсудил название нового языка. Предложения включали «BUSY» (бизнес-система), «INFOSYL» (язык информационных систем) и «COCOSYL» (общий язык компьютерных систем). [56] Неясно, кто придумал название «КОБОЛ», [57] [58] , хотя Боб Бемер позже утверждал, что это было его предложение. [59] [60] [61]
В октябре комитет промежуточного уровня получил копии спецификации языка FACT , созданной Роем Наттом . Его особенности настолько впечатлили комитет, что они приняли решение основать на нем COBOL. [62]
Это стало ударом по комитету по ближнему радиусу действия, который добился хорошего прогресса в разработке спецификации. Несмотря на свое техническое превосходство, FACT не создавался с учетом портативности или консенсуса производителей и пользователей. У него также не было наглядной реализации, [29] что позволяло сторонникам COBOL на основе FLOW-MATIC отменить резолюцию. Представитель RCA Говард Бромберг также заблокировал FACT, чтобы работа RCA над внедрением COBOL не пропала даром. [63]
Вскоре стало очевидно, что комитет слишком велик, чтобы можно было быстро добиться дальнейшего прогресса. Разочарованный Говард Бромберг купил надгробие за 15 долларов с выгравированной на нем надписью «COBOL» и отправил его Чарльзу Филлипсу, чтобы продемонстрировать свое недовольство. [б] [65] [66]
Для анализа существующих языков был сформирован подкомитет из шести человек: [25] [67]
Подкомитет проделал большую часть работы по созданию спецификации, оставив комитету ближнего действия рассмотреть и изменить свою работу перед выпуском готовой спецификации. [25]
Спецификации были одобрены исполнительным комитетом 8 января 1960 года и отправлены в правительственную типографию, которая напечатала их как COBOL 60 . Заявленные цели языка заключались в том, чтобы позволить легко писать эффективные переносимые программы, позволить пользователям переходить на новые системы с минимальными усилиями и затратами, а также быть подходящим для неопытных программистов. [68]
Позже исполнительный комитет CODASYL создал комитет по обслуживанию COBOL, чтобы отвечать на вопросы пользователей и поставщиков, а также улучшать и расширять спецификации. [69]
В 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. [70]
Тем временем RCA и Сперри Рэнд работали над созданием компиляторов COBOL. Первая программа COBOL была запущена 17 августа на RCA 501. [71] 6 и 7 декабря одна и та же программа COBOL (хотя и с небольшими изменениями) была запущена на компьютере RCA и компьютере Remington-Rand Univac , продемонстрировав, что совместимость может быть обеспечена. достигнуто. [72]
Относительное влияние используемых языков сохраняется и по сей день в рекомендуемых рекомендациях, напечатанных во всех справочных руководствах COBOL:
COBOL является отраслевым языком и не является собственностью какой-либо компании или группы компаний, а также какой-либо организации или группы организаций.
Никакие гарантии, явные или подразумеваемые, не предоставляются кем-либо из участников или комитетом CODASYL COBOL в отношении точности и функционирования системы программирования и языка. Более того, ни один участник или комитет не несут никакой ответственности в связи с этим. Авторами и правообладателями используемых здесь материалов, защищенных авторским правом, являются:
FLOW-MATIC (торговая марка Unisys Corporation ), Программирование для UNIVAC (R) I и II, Системы автоматизации данных, авторские права принадлежат Unisys Corporation в 1958, 1959 годах; Форма коммерческого переводчика IBM № F28-8013, авторские права принадлежат IBM в 1959 году; ФАКТ: DSI 27A5260-2760, авторские права принадлежат Minneapolis-Honeywell в 1960 году.
Они специально разрешили использование этого материала, полностью или частично, в спецификациях COBOL. Такое разрешение распространяется на воспроизведение и использование спецификаций COBOL в руководствах по программированию или аналогичных публикациях. [73]
Маловероятно, что Cobol появится к концу десятилетия.
Аноним, июнь 1960 г. [74]
В COBOL 60 было обнаружено множество логических ошибок , из-за чего Чарльз Кац из General Electric предупредил, что его нельзя интерпретировать однозначно. Неохотно краткосрочный комитет провел полную очистку, и к марту 1963 года было сообщено, что синтаксис COBOL так же поддается определению, как и синтаксис ALGOL , хотя семантическая неопределенность осталась. [70]
COBOL — сложный язык для написания компилятора из-за большого синтаксиса и множества дополнительных элементов в синтаксических конструкциях, а также из-за необходимости генерировать эффективный код для языка со многими возможными представлениями данных, неявными преобразованиями типов и необходимыми наборами значений. ИБП для операций ввода-вывода. [75] Ранние компиляторы COBOL были примитивными и медленными. Оценка ВМС США в 1962 году показала скорость компиляции 3–11 операторов в минуту. К середине 1964 года они увеличились до 11–1000 заявлений в минуту. Было замечено, что увеличение памяти резко увеличивает скорость, а затраты на компиляцию сильно различаются: затраты на оператор составляли от 0,23 до 18,91 доллара. [76]
В конце 1962 года IBM объявила, что COBOL станет их основным языком разработки и что разработка COMTRAN прекратится. [76]
Спецификация COBOL пересматривалась трижды за пять лет после ее публикации. COBOL-60 был заменен в 1961 году на COBOL-61. Затем в 1963 году на смену им пришли расширенные спецификации COBOL-61, в которых были представлены возможности сортировки и создания отчетов. [77] Добавленные возможности исправили недостатки, выявленные Honeywell в конце 1959 года в письме комитету по ближнему диапазону. [71] В выпуске COBOL 1965 года были внесены дополнительные разъяснения в спецификации и введены средства для работы с файлами и таблицами запоминающих устройств . [78]
Начались попытки стандартизировать COBOL, чтобы преодолеть несовместимость между версиями. В конце 1962 года ИСО и Институт стандартов США (ныне ANSI ) сформировали группы для создания стандартов. В августе 1968 года ANSI выпустил стандарт США COBOL X3.23 , который стал краеугольным камнем для более поздних версий. [79] Эта версия была известна как Американский национальный стандарт (ANS) COBOL и была принята ISO в 1972 году. [80]
К 1970 году COBOL стал наиболее широко используемым языком программирования в мире. [81]
Независимо от комитета ANSI, комитет по языкам программирования CODASYL работал над улучшением языка. Они описали новые версии 1968, 1969, 1970 и 1973 годов, включая такие изменения, как новые возможности межпрограммного взаимодействия, отладки и объединения файлов, а также улучшенные функции обработки строк и включения библиотек . [82]
Хотя CODASYL был независим от комитета ANSI, журнал развития CODASYL использовался ANSI для определения функций, которые были достаточно популярны, чтобы гарантировать их внедрение. [83] Комитет по языкам программирования также поддерживал связь с ECMA и японским комитетом по стандарту COBOL. [82]
Однако Комитет по языкам программирования не был широко известен. Вице-президент Уильям Ринехулс пожаловался, что две трети сообщества COBOL не знают о существовании комитета. У него также не было средств для бесплатного доступа к публичным документам, таким как протоколы заседаний и предложения по изменениям. [84]
В 1974 году ANSI опубликовал пересмотренную версию (ANS) COBOL, содержащую новые функции, такие как организация файлов, оператор DELETE
[ 85] и модуль сегментации . [86] Удаленные функции включали NOTE
оператор, EXAMINE
оператор (который был заменен на INSPECT
) и определяемый разработчиком модуль произвольного доступа (который был заменен новыми модулями последовательного и относительного ввода-вывода). Это составило 44 изменения, которые сделали существующие положения несовместимыми с новым стандартом. [87] Автора отчета планировалось исключить из COBOL, но он был восстановлен в должности до публикации стандарта. [88] [89] Позже, в 1978 году, ISO приняла обновленный стандарт. [80]
В июне 1978 года начались работы по пересмотру COBOL-74. Предлагаемый стандарт (обычно называемый COBOL-80) существенно отличался от предыдущего, вызывая опасения по поводу несовместимости и затрат на преобразование. В январе 1981 года Джозеф Т. Брофи, старший вице-президент Travelers Insurance, пригрозил подать в суд на комитет по стандартизации, поскольку он не был совместим с COBOL-74 снизу вверх. Г-н Брофи назвал предыдущие преобразования их 40-миллионной кодовой базы «непродуктивными» и «полной тратой наших программных ресурсов». [90] Позже в том же году Ассоциация управления обработкой данных (DPMA) заявила, что она «категорически против» нового стандарта, сославшись на «непомерно высокие» затраты на преобразование и улучшения, которые «навязывались пользователю». [91] [92]
В течение первого периода общественного рассмотрения комитет получил 2200 ответов, из которых 1700 были письмами отрицательной формы. [93] Другие ответы представляли собой подробный анализ влияния COBOL-80 на их системы; Предполагалось, что затраты на преобразование составят не менее 50 центов за строку кода. Менее дюжины ответов высказались в пользу предложенного стандарта. [94]
ISO TC97-SC5 установлен в 1979 году международной группой экспертов COBOL по инициативе Вима Эббинхейсена . В состав группы входили эксперты COBOL из многих стран, включая США. Его целью было достижение взаимопонимания и уважения между ANSI и остальным миром в отношении необходимости новых функций COBOL. Спустя три года ISO изменила статус группы на официальную рабочую группу: WG 4 COBOL . Группа взяла на себя основную ответственность за разработку стандарта COBOL, по которому ANSI сделал большую часть предложений.
В 1983 году DPMA отозвало свое несогласие со стандартом, сославшись на реакцию комитета на обеспокоенность общественности. В том же году исследование Национального бюро стандартов пришло к выводу, что предлагаемый стандарт не создаст особых проблем. [92] [95] Годом позже DEC выпустила VAX/VMS COBOL-80 и отметила, что преобразование программ COBOL-74 создает мало проблем. Новый EVALUATE
оператор и встроенный код PERFORM
были особенно хорошо приняты и повысили производительность благодаря упрощенному потоку управления и отладке . [96]
Вторая публичная проверка получила еще 1000 (в основном отрицательных) откликов, тогда как последняя получила всего 25, и к этому времени многие опасения были решены. [92]
В 1985 году рабочая группа ISO 4 приняла тогдашнюю версию предложенного стандарта ANSI, внесла несколько изменений и установила ее в качестве нового стандарта ISO COBOL 85. Он был опубликован в конце 1985 года.
Шестьдесят функций были изменены или устарели и добавлены 115 [97] , например: [98] [99]
END-IF
, END-PERFORM
, END-READ
и т. д.)CONTINUE
, оператор отсутствия операцииEVALUATE
, оператор переключенияINITIALIZE
, оператор, который может устанавливать для групп данных значения по умолчанию.PERFORM
тела циклов — раньше тела циклов нужно было указывать в отдельной процедуре.Новый стандарт был принят всеми национальными органами по стандартизации, включая ANSI. [80]
Две поправки последовали в 1989 и 1993 годах. Первая поправка вводила внутренние функции, а вторая вносила исправления. [80]
В 1997 году Gartner Group подсчитала, что существует в общей сложности 200 миллиардов строк COBOL, на которых выполняется 80% всех бизнес-программ. [с] [100]
В начале 1990-х годов началась работа по добавлению объектно-ориентированного подхода в следующую полную версию COBOL. Объектно-ориентированные возможности были взяты из C++ и Smalltalk . [3] [4]
По первоначальной оценке, эта редакция должна была быть завершена к 1997 году, а проект комитета ISO (CD) был доступен к 1997 году. Некоторые поставщики (включая Micro Focus , Fujitsu и IBM ) представили объектно-ориентированный синтаксис на основе черновиков полной версии. Окончательно утвержденный стандарт ISO был одобрен и опубликован в конце 2002 года. [101]
Fujitsu/GTSoftware, [102] Micro Focus представила объектно-ориентированные компиляторы COBOL, ориентированные на .NET Framework .
Было много других новых функций, многие из которых были в CODASYL COBOL Journal of Development с 1978 года и упустили возможность быть включенными в COBOL-85. [103] Среди других функций: [104] [105]
SCREEN SECTION
интерфейсовVALIDATE
К стандарту было опубликовано три исправления : два в 2006 г. и одно в 2009 г. [106]
В период с 2003 по 2009 год было выпущено три технических отчета, описывающих финализацию объектов , обработку XML и классы сбора для COBOL. [106]
COBOL 2002 страдал от плохой поддержки: ни один компилятор полностью не поддерживал стандарт. Micro Focus обнаружила, что это произошло из-за отсутствия спроса пользователей на новые функции и отмены набора тестов NIST , который использовался для проверки соответствия компилятора. Процесс стандартизации также оказался медленным и недостаточно обеспеченным ресурсами. [107]
COBOL 2014 включает следующие изменения: [108]
VALIDATE
Основные функции, такие как средство, средство создания отчетов и средство обработки экрана, стали необязательными.В стандарт COBOL 2023 добавлено несколько новых функций:
SEND
и [110]RECEIVE
COMMIT
и ROLLBACK
[110]XOR
логический оператор [110]CONTINUE
может быть расширен, чтобы приостановить программу на указанную продолжительность [111].DELETE FILE
]LINE SEQUENTIAL
файловая организация [112]PERFORM UNTIL EXIT
[111]SUBSTITUTE
внутренняя функция, позволяющая заменять подстроки разной длины [111]CONVERT
функция для преобразования базы [111]Полная реализация этого стандарта пока неизвестна. [ нужна ссылка ]
Программы COBOL используются во всем мире в правительстве и на предприятиях и работают в различных операционных системах, таких как z/OS , z/VSE , VME , Unix , NonStop OS, OpenVMS и Windows . В 1997 году группа Gartner сообщила, что 80% мирового бизнеса работает на COBOL, при этом ежегодно пишется более 200 миллиардов строк кода [c] и еще 5 миллиардов строк. [114]
Ближе к концу 20-го века проблема 2000 года (Y2K) была в центре внимания значительных усилий по программированию на COBOL, иногда со стороны тех же программистов, которые проектировали системы десятилетия назад. Особый уровень усилий, необходимый для исправления кода COBOL, объясняется большим количеством бизнес-ориентированного COBOL, поскольку бизнес-приложения активно используют даты, а также поля данных фиксированной длины. [115] Некоторые исследования приписывают Cobol «24% затрат на ремонт программного обеспечения 2000 года». [116] После очистки этих программ от Y2K исследование 2003 года показало, что многие из них остались в использовании. [117] Авторы заявили, что данные опроса предполагают «постепенное снижение важности COBOL в разработке приложений в течение [последующих] 10 лет, если только… интеграция с другими языками и технологиями не может быть принята». [118]
В 2006 и 2012 годах опросы Computerworld (352 читателей) показали, что более 60% организаций используют COBOL (больше, чем C++ и Visual Basic .NET ), и что половина из них использует COBOL для большей части своего внутреннего программного обеспечения. [10] [119] 36% менеджеров заявили, что планируют перейти с COBOL, а 25% заявили, что сделали бы это, если бы не затраты на переписывание устаревшего кода. Альтернативно, некоторые компании перенесли свои программы COBOL с мэйнфреймов на более дешевое и быстрое оборудование. [10]
Показания перед Палатой представителей в 2016 году показали, что COBOL до сих пор используется многими федеральными агентствами. [120] В 2017 году агентство Reuters сообщило, что 43% банковских систем по-прежнему используют COBOL, при этом используется более 220 миллиардов строк кода COBOL. [121]
К 2019 году число программистов COBOL быстро сокращалось из-за выхода на пенсию, что привело к надвигающемуся дефициту навыков в деловых и государственных организациях, которые до сих пор используют мэйнфреймы для обработки больших объемов транзакций. Попытки переписать системы на новые языки оказались дорогостоящими и проблематичными, как и аутсорсинг обслуживания кода, поэтому приветствуются предложения по обучению большего количества людей COBOL. [122]
Во время пандемии COVID-19 и последовавшего за ней роста безработицы несколько штатов США сообщили о нехватке квалифицированных программистов COBOL для поддержки устаревших систем, используемых для управления пособиями по безработице. Многие из этих систем до пандемии находились в процессе перевода на более современные языки программирования, но этот процесс был приостановлен. [123] Аналогичным образом, Налоговая служба США поспешила обновить свой индивидуальный мастер-файл на основе COBOL , чтобы выплатить десятки миллионов платежей, предусмотренных Законом о помощи, чрезвычайной помощи и экономической безопасности в связи с коронавирусом . [124]
COBOL имеет синтаксис, похожий на английский, который используется для описания практически всего в программе. Например, условие может быть выражено как или более кратко как или . Более сложные условия можно сократить, удалив повторяющиеся условия и переменные. Например, можно сократить до . Для поддержки этого синтаксиса в COBOL имеется более 300 ключевых слов . [125] [d] Некоторые ключевые слова представляют собой простые альтернативные или множественные варианты написания одного и того же слова, что обеспечивает более грамматически подходящие утверждения и предложения; например, ключевые слова и могут использоваться взаимозаменяемо, как и и , и и .x IS GREATER THAN y
x GREATER y
x > y
a > b AND a > c OR a = d
a > b AND c OR = d
IN
OF
TIME
TIMES
VALUE
VALUES
Каждая программа COBOL состоит из четырех основных лексических элементов : слов, литералов, строк символов-изображений (см. раздел § PICTURE) и разделителей. Слова включают зарезервированные слова и определяемые пользователем идентификаторы. Они имеют длину до 31 символа и могут включать буквы, цифры, дефисы и символы подчеркивания. Литералы включают цифры (например 12
, ) и строки (например, 'Hello!'
). [127] В качестве разделителей используются пробелы, запятые и точки с запятой, за которыми следует пробел. [128]
Программа COBOL разделена на четыре части: часть идентификации, часть среды, часть данных и часть процедур. Раздел идентификации определяет имя и тип исходного элемента, а также определяет классы и интерфейсы. Раздел среды определяет любые функции программы, которые зависят от системы, на которой она работает, например файлы и наборы символов . Разделение данных используется для объявления переменных и параметров . Раздел процедур содержит операторы программы . Каждый раздел подразделяется на разделы, состоящие из параграфов.
Синтаксис COBOL обычно описывается уникальным метаязыком с использованием фигурных скобок, скобок, черт и подчеркивания. Метаязык был разработан для исходных спецификаций COBOL. Хотя форма Бэкуса-Наура в то время существовала, комитет о ней не слышал. [129]
В качестве примера рассмотрим следующее описание утверждения ADD
:
Данное описание допускает следующие варианты:
ДОБАВИТЬ 1 К x ДОБАВИТЬ 1 , a , b К x ОКРУГЛЕННО , y , z ОКРУГЛЕННО ДОБАВИТЬ a , b В c НА ОТОБРАЖЕНИИ ОШИБКИ РАЗМЕРА « Ошибка » КОНЕЦ-ДОБАВИТЬ ДОБАВИТЬ a К b ОТОБРАЖЕНИЕ ОШИБКИ НЕ РАЗМЕРА «Нет ошибок» НА ОТОБРАЖЕНИИ ОШИБКИ РАЗМЕРА « Ошибка»
Пик популярности COBOL совпал с эпохой перфомашин и перфокарт . Сама программа записывалась на перфокарты, затем считывалась и компилировалась, а данные, вводимые в программу, иногда также находились на картах. [130]
COBOL может быть написан в двух форматах: фиксированном (по умолчанию) и свободном. В фиксированном формате код должен быть выровнен, чтобы соответствовать определенным областям (пережиток использования перфокарт). До COBOL 2002 это были:
В COBOL 2002 области A и B были объединены, чтобы сформировать область текста программы, которая теперь заканчивается столбцом, определенным разработчиком. [131]
COBOL 2002 также представил код свободного формата. Код свободного формата можно разместить в любом столбце файла, как в новых языках программирования. Комментарии указываются с помощью *>
, который можно разместить где угодно, а также использовать в исходном коде фиксированного формата. Линий продолжения нет, и >>PAGE
директива заменяет /
индикатор. [131]
Раздел идентификации идентифицирует следующий объект кода и содержит определение класса или интерфейса.
Классы и интерфейсы используются в COBOL с 2002 года. Классы имеют фабричные объекты, содержащие методы и переменные класса, и объекты экземпляра, содержащие методы и переменные экземпляра. [132] Наследование и интерфейсы обеспечивают полиморфизм . Поддержка общего программирования обеспечивается посредством параметризованных классов, экземпляры которых можно создать для использования любого класса или интерфейса. Объекты хранятся как ссылки, которые могут быть ограничены определенным типом. Существует два способа вызова метода: INVOKE
оператор, который действует аналогично CALL
, или вызов встроенного метода, аналогичный использованию функций. [133]
*> Они эквивалентны. ВЫЗОВ my-class "foo" ВОЗВРАЩЕНИЕ var MOVE my-class :: "foo" TO var *> Вызов встроенного метода
COBOL не предоставляет возможности скрыть методы. Однако данные класса можно скрыть, объявив их без PROPERTY
предложения, в результате чего внешний код не сможет получить к ним доступ. [134] Перегрузка методов была добавлена в COBOL 2014. [135]
Раздел среды содержит раздел конфигурации и раздел ввода-вывода. Раздел конфигурации используется для указания переменных функций, таких как знаки валюты, локали и наборы символов. Раздел ввода-вывода содержит информацию, связанную с файлом.
COBOL поддерживает три формата файлов или организации : последовательный, индексированный и относительный. В последовательных файлах записи являются смежными и должны проходить последовательно , аналогично связанному списку . Индексированные файлы имеют один или несколько индексов, которые позволяют осуществлять произвольный доступ к записям и сортировать их. Каждая запись должна иметь уникальный ключ , но другие альтернативные ключи записей не обязательно должны быть уникальными. Реализации индексированных файлов различаются у разных поставщиков, хотя общие реализации, такие как C-ISAM и VSAM , основаны на IBM ISAM . Другими реализациями являются службы управления записями на OpenVMS и Enscribe на HPE NonStop (Tandem). Относительные файлы, как и индексированные файлы, имеют уникальный ключ записи, но не имеют альтернативных ключей. Ключом относительной записи является ее порядковый номер; например, 10-я запись имеет ключ 10. Это означает, что создание записи с ключом 5 может потребовать создания (пустых) предыдущих записей. Относительные файлы также допускают как последовательный, так и произвольный доступ. [136]
Распространенным нестандартным расширением является построчная организация, используемая для обработки текстовых файлов. Записи в файле завершаются новой строкой и могут иметь разную длину. [137]
Раздел данных разделен на шесть разделов, в которых объявляются различные элементы: раздел файла для записей файлов; раздел рабочей памяти для статических переменных ; раздел локального хранилища для автоматических переменных ; раздел связи для параметров и возвращаемого значения; раздел отчета и раздел экрана для текстовых пользовательских интерфейсов .
Элементы данных в COBOL объявляются иерархически с использованием номеров уровней, которые указывают, является ли элемент данных частью другого. Предмет с более высоким номером уровня подчиняется предмету с более низким уровнем. Элементы данных верхнего уровня с номером уровня 1 называются записями . Элементы, имеющие подчиненные совокупные данные, называются элементами группы ; те, которые этого не делают, называются элементарными элементами . Номера уровней, используемые для описания стандартных элементов данных, находятся в диапазоне от 1 до 49. [138] [139]
01 какая-то запись . *> Элемент групповой записи 05 номер PIC 9(10) . *> Элементарный пункт 05 -дата . *> Совокупная (под)групповая запись 10 -го года PIC 9(4) . *> Элементарный пункт 10 -месячный ПОС 99 . *> Элементарный пункт 10 -дневного ПОС 99 . *> Элементарный элемент
В приведенном выше примере элементарный элемент num
и элемент группы the-date
подчинены записи some-record
, а элементарные элементы the-year
, the-month
и the-day
являются частью элемента группы the-date
.
Подчиненные элементы можно устранить с помощью ключевого слова IN
(или OF
). Например, рассмотрите приведенный выше пример кода вместе со следующим примером:
01 дата продажи . 05- го года ПОС 9(4) . 05 -месяц ПИК 99 . 05 -й день ПОС 99 .
Имена the-year
, the-month
и the-day
сами по себе неоднозначны, поскольку с этими именами определено более одного элемента данных. Чтобы указать конкретный элемент данных, например один из элементов, содержащихся в sale-date
группе, программист должен использовать the-year IN sale-date
(или его эквивалент the-year OF sale-date
). Этот синтаксис похож на «точечную запись», поддерживаемую большинством современных языков.
Номер уровня 66 используется для объявления перегруппировки ранее определенных элементов, независимо от того, как эти элементы структурированы. Этот уровень данных, также упоминаемый в соответствующем RENAMES
пункте , используется редко [140] и примерно с 1988 года обычно встречался в старых программах. Его способность игнорировать данные иерархической и логической структуры означала, что его использование не рекомендовалось, и многие установки запрещали его использование. [141]
01 запись клиента . 05 индивидуальный ключ PIC X(10) . 05 индивидуальное имя . 10 заказное имя PIC X(30) . 10 кастомная фамилия PIC X(30) . 05 заказ PIC 9(8) . 05 балансовый PIC 9(7)V99 . 66 cust-personal-details ПЕРЕИМЕНОВАЕТ cust-name ЧЕРЕЗ cust-dob . 66 cust-all-details ПЕРЕИМЕНОВАЕТ cust-name ЧЕРЕЗ cust-balance .
Номер уровня 77 указывает, что элемент является автономным, и в таких ситуациях эквивалентен номеру уровня 01. Например, следующий код объявляет два элемента данных уровня 77 property-name
и sales-region
, которые не являются элементами данных уровня, которые не входят в группу. независимы (не подчинены) любым другим элементам данных:
77 имя-свойства PIC X(80) . 77 регион продаж PIC 9(5) .
Номер уровня 88 объявляет имя условия (так называемый уровень 88), которое истинно, когда его родительский элемент данных содержит одно из значений, указанных в его VALUE
предложении. [142] Например, следующий код определяет два 88-уровневых элемента имени условия, которые являются истинными или ложными в зависимости от текущего символьного значения данных wage-type
элемента данных. Когда элемент данных содержит значение 'H'
, имя-условия wage-is-hourly
истинно, тогда как когда он содержит значение 'S'
или 'Y'
, имя-условия wage-is-yearly
истинно. Если элемент данных содержит какое-либо другое значение, оба имени условия являются ложными.
01 вид оплаты PIC X . 88 заработная плата - почасовая ЗНАЧЕНИЕ "H" . 88 заработная плата равна годовой ЗНАЧЕНИЕ "S" , "Y" .
Стандарт COBOL предоставляет следующие типы данных: [143]
Типовая безопасность в COBOL является переменной. Числовые данные преобразуются между различными представлениями и размерами автоматически, а буквенно-цифровые данные могут быть помещены в любой элемент данных, который может храниться в виде строки, включая числовые и групповые данные. [144] Напротив, ссылки на объекты и указатели могут быть назначены только из элементов одного и того же типа, а их значения могут быть ограничены определенным типом. [145]
Предложение PICTURE
(или PIC
) представляет собой строку символов, каждый из которых представляет часть элемента данных и то, что он может содержать. Некоторые графические символы указывают тип элемента и количество символов или цифр, которые он занимает в памяти. Например, a 9
указывает десятичную цифру, а a S
указывает на то, что элемент подписан . Другие символы изображения (называемые символами вставки и редактирования ) определяют, как должен быть отформатирован элемент. Например, серия +
символов определяет позиции символов, а также то, как должен располагаться ведущий знак в конечных данных символа; самый правый нечисловой символ будет содержать знак элемента, а другие позиции символов, соответствующие букве +
a слева от этой позиции, будут содержать пробел. Повторяющиеся символы можно указать более кратко, указав число в круглых скобках после символа изображения; например, 9(7)
эквивалентно 9999999
. Спецификации изображений, содержащие только цифры ( 9
) и знаки ( S
), определяют чисто числовые элементы данных, тогда как спецификации изображений, содержащие буквенные ( A
) или буквенно-цифровые ( X
) символы, определяют буквенно-цифровые элементы данных. Наличие других символов форматирования определяет редактируемые числовые или редактируемые буквенно-цифровые элементы данных. [146]
В этом USAGE
предложении объявляется формат, в котором хранятся данные. В зависимости от типа данных он может либо дополнять предложение, либо использоваться вместо него PICTURE
. Хотя его можно использовать для объявления указателей и ссылок на объекты, он в основном ориентирован на указание числовых типов. Эти числовые форматы: [147]
PICTURE
предложении, либо в USAGE
таком предложении, какBINARY-LONG
USAGE COMPUTATIONAL
, где данные могут храниться в любом формате, предоставляемом реализацией; часто эквивалентно USAGE BINARY
USAGE DISPLAY
, формат по умолчанию, где данные хранятся в виде строкиUSAGE NATIONAL
, где данные хранятся в виде строки с использованием расширенного набора символов.USAGE PACKED-DECIMAL
, где данные хранятся в наименьшем возможном десятичном формате (обычно упакованном в двоично-десятичном формате ).Средство записи отчетов — это декларативное средство для создания отчетов. Программисту нужно только указать макет отчета и данные, необходимые для его создания, освобождая его от необходимости писать код для обработки таких вещей, как разрывы страниц, форматирование данных, а также заголовки и подвалы. [148]
Отчеты связаны с файлами отчетов, которые могут быть записаны только с помощью операторов средства создания отчетов.
Отчет по ФД ОТЧЕТ по продажам .
Каждый отчет определяется в разделе отчетов раздела данных. Отчет разделен на группы отчетов, которые определяют заголовки, подножки и детали отчета. Отчеты обходят иерархические нарушения контроля . Нарушение управления происходит, когда ключевая переменная меняет свое значение; например, при создании отчета с подробным описанием заказов клиентов может произойти нарушение контроля, когда программа достигнет заказов другого клиента. Ниже приведен пример описания отчета, который показывает продажи продавца и предупреждает о любых недопустимых записях:
Отчет о продажах RD ОГРАНИЧЕНИЕ СТРАНИЦЫ 60 СТРОК ПЕРВАЯ ДЕТАЛИ 3 УПРАВЛЕНИЯ имя продавца . 01 ТИП ЗАГОЛОВОК СТРАНИЦЫ . 03 ЗНАЧЕНИЕ COL 1 «Отчет о продажах» . 03 COL 74 ЗНАЧЕНИЕ «Страница» . 03 COL 79 PIC Z9 ИСТОЧНИК СЧЕТЧИКА СТРАНИЦ . 01 продажа на день ТИП ДЕТАЛЬ , СТРОКА + 1 . 03 COL 3 ЗНАЧЕНИЕ «Продажи продолжаются» . 03 COL 12 PIC 99/99/9999 ИСТОЧНИК -дата продажи . 03 COL 21 ЗНАЧЕНИЕ «были» . 03 COL 26 PIC $$$$9,99 ИСТОЧНИК объем продаж . 01 недействительные продажи ТИП ДЕТАЛИ , СТРОКА + 1 . 03 ЗНАЧЕНИЕ COL 3 «НЕДЕЙСТВИТЕЛЬНАЯ ЗАПИСЬ:» . 03 COL 19 PIC X(34) ИСТОЧНИК записи продаж . 01 ТИП УПРАВЛЯЮЩЕГО ЗАГОЛОВКА имя продавца , LINE + 2 . 03 ЗНАЧЕНИЕ КОЛОДЦА 1 «Продавец:» . 03 COL 9 PIC X(30) ИСТОЧНИК имя продавца .
Приведенное выше описание отчета описывает следующий макет:
Отчет о продажах, стр. 1Продавец: Говард Бромберг Продажи на 12.10.2008 составили 1000,00 долларов США. Продажи на 12.12.2008 составили 0,00 доллара США. Продажи 12.13.2008 г. составили 31,47 доллара США. НЕДЕЙСТВИТЕЛЬНАЯ ЗАПИСЬ: Говард Бромберг XXXXYYПродавец: Howard Discount...Отчет о продажах, стр. 12 Продажи на 05.08.2014 составили $543,98. НЕДЕЙСТВИТЕЛЬНАЯ ЗАПИСЬ: Уильям Селден 12O52014FOFOO Продажи на 30.05.2014 составили 0,00$.
Четыре оператора управляют составителем отчета: INITIATE
, который подготавливает составитель отчета к печати; GENERATE
, который печатает группу отчетов; SUPPRESS
, который подавляет печать группы отчетов; и TERMINATE
, что завершает обработку отчета. В приведенном выше примере отчета о продажах разделение процедур может выглядеть следующим образом:
ОТКРЫТЬ ВВОД продаж , ВЫВОД отчета НАЧАТЬ отчет о продажах ВЫПОЛНИТЬ ДО 1 <> 1 ПРОЧИТАТЬ продажи В КОНЦЕ ВЫХОД ВЫПОЛНИТЬ КОНЕЦ - ЧИТАТЬ ПРОВЕРИТЬ запись о продажах ЕСЛИ действительная запись СОЗДАТЬ продажи за день ELSE Сгенерировать недействительные продажи END-IF END - ВЫПОЛНИТЬ ПРЕКРАТИТЬ продажи-отчет ЗАКРЫТЬ продажи , отчет .
Использование средства Report Writer может значительно различаться; некоторые организации используют его широко, а некоторые не используют вообще. [149] Кроме того, реализации Report Writer различались по качеству: те, что находились на более низком уровне, иногда использовали чрезмерные объемы памяти во время выполнения. [149]
Разделы и параграфы в разделе процедур (совместно называемые процедурами) могут использоваться как метки и как простые подпрограммы . В отличие от других разделов, абзацы не обязательно должны находиться в разделах. [150]
Выполнение выполняется через процедуры программы до тех пор, пока оно не будет прекращено. [151]
Для использования процедур в качестве подпрограмм PERFORM
используется глагол.
Оператор PERFORM
чем-то напоминает вызов процедуры в новых языках в том смысле, что выполнение возвращается к коду, следующему за PERFORM
оператором в конце вызываемого кода; однако он не предоставляет механизма передачи параметров или возврата значения результата. Если подпрограмма вызывается с помощью простого оператора, такого как , то управление возвращается в конце вызванной процедуры. Однако его необычность заключается в том, что его можно использовать для вызова диапазона, охватывающего последовательность нескольких смежных процедур. Это делается с помощью конструкции:PERFORM subroutine
PERFORM
PERFORM sub-1 THRU sub-n
ПРОЦЕДУРА такая-то . ВЫПОЛНИТЬ АЛЬФА ВЫПОЛНИТЬ АЛЬФА ЧЕРЕЗ ГАММУ СТОП БЕГ . АЛЬФА . ДИСПЛЕЙ «А» . БЕТА . ДИСПЛЕЙ «В» . ГАММА . ДИСПЛЕЙ «C» .
Результатом этой программы будет: «AAB C».
PERFORM
также отличается от обычных вызовов процедур тем, что здесь, по крайней мере традиционно, отсутствует понятие стека вызовов. Как следствие, возможны вложенные вызовы (последовательность обрабатываемого кода PERFORM
может сама выполнить PERFORM
оператор), но требуют особой осторожности, если части одного и того же кода выполняются обоими вызовами. Проблема возникает, когда код внутреннего вызова достигает точки выхода внешнего вызова. Более формально, если управление проходит через точку выхода вызова PERFORM
, который был вызван ранее, но еще не завершился, стандарт COBOL 2002 предусматривает, что поведение не определено .
Причина в том, что COBOL вместо «обратного адреса» оперирует так называемым адресом продолжения. Когда поток управления достигает конца любой процедуры, ищется адрес продолжения и управление передается на этот адрес. Перед запуском программы адрес продолжения для каждой процедуры инициализируется начальным адресом процедуры, которая идет следующей в тексте программы, так что, если никаких PERFORM
операторов не происходит, управление передается по программе сверху вниз. Но когда PERFORM
инструкция выполняется, она изменяет адрес продолжения вызываемой процедуры (или последней процедуры вызываемого диапазона, если PERFORM THRU
она использовалась), так что в конце управление возвращается к месту вызова. Исходное значение сохраняется и впоследствии восстанавливается, но позиция хранения только одна. Если два вложенных вызова работают с перекрывающимся кодом, они могут мешать друг другу управлять адресом продолжения несколькими способами. [152] [153]
Следующий пример (взятый из Veerman & Verhoeven 2006) иллюстрирует проблему:
ЭТИКЕТКА1 . ОТОБРАЖАЙТЕ '1' ВЫПОЛНИТЬ ОТ МЕТКИ 2 ДО МЕТКИ 3 СТОП ПУСК . ЭТИКЕТКА2 . ОТОБРАЖЕНИЕ '2' ВЫПОЛНИТЬ ОТ ОТ ОТ МЕТКИ 3 ПО ОТ МЕТКИ 4 . ЭТИКЕТКА3 . ДИСПЛЕЙ «3» . ЭТИКЕТКА4 . ДИСПЛЕЙ «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». Поэтому поведение в таких случаях не только (возможно) удивительно, но и непереносимо. [153]
Особым следствием этого ограничения является то, что его PERFORM
нельзя использовать для написания рекурсивного кода. Еще один простой пример, иллюстрирующий это (немного упрощенный из Veerman & Verhoeven 2006):
ПЕРЕХОД 1 К ВЫПОЛНЕНИЮ ЭТИКЕТКА СТОП БЕГ . ЭТИКЕТКА . ПОКАЗАТЬ A, ЕСЛИ A < 3, ДОБАВИТЬ 1 К ЭТИКЕТКЕ ВЫПОЛНЕНИЯ END - IF DISPLAY ' END ' .
Можно было бы ожидать, что на выходе будет «1 2 3 END END END», и на самом деле именно это выдают некоторые компиляторы COBOL. Но другие компиляторы, такие как IBM COBOL, будут создавать код, который печатает «1 2 3 END END END END ...» и так далее, печатая «END» снова и снова в бесконечном цикле. Поскольку пространство для хранения адресов продолжения резервного копирования ограничено, резервные копии перезаписываются в ходе рекурсивных вызовов, и все, что можно восстановить, — это вернуться к DISPLAY 'END'
. [153]
В COBOL 2014 имеется 47 операторов (также называемых глаголами ), [154] которые можно сгруппировать в следующие широкие категории: поток управления, ввод-вывод, манипулирование данными и средство создания отчетов. Заявления составителя отчета представлены в разделе, посвященном составителю отчета.
Условными операторами COBOL являются IF
и EVALUATE
. EVALUATE
представляет собой оператор, похожий на переключатель, с дополнительной возможностью оценки нескольких значений и условий. Это можно использовать для реализации таблиц решений . Например, для управления токарным станком с ЧПУ можно использовать следующее :
ОЦЕНИТЬ ВЕРНО ТАКЖЕ желаемая скорость ТАКЖЕ текущая скорость ПРИ закрытой крышке ТАКЖЕ мин. скорость ЧЕРЕЗ макс. скорость ТАКЖЕ МЕНЬШЕ, ЧЕМ желаемая скорость ВЫПОЛНИТЬ ускорение машины ПРИ закрытой крышке ТАКЖЕ мин. скорость ЧЕРЕЗ макс. скорость ТАКЖЕ БОЛЬШЕ , ЧЕМ желаемая -скорость ВЫПОЛНИТЬ замедление машины КОГДА крышка открыта ТАКЖЕ ЛЮБОЙ ТАКЖЕ НЕ НОЛЬ ВЫПОЛНИТЬ аварийную остановку КОГДА ДРУГИЕ ПРОДОЛЖИТЬ КОНЕЦ-ОЦЕНИТЬ
Этот PERFORM
оператор используется для определения циклов, которые выполняются до тех пор, пока условие не станет истинным (а не пока истинно, что более распространено в других языках). Он также используется для вызова процедур или диапазонов процедур (более подробную информацию см. в разделе «Процедуры»). CALL
и INVOKE
вызывать подпрограммы и методы соответственно. Имя подпрограммы/метода содержится в строке, которая может быть литералом или элементом данных. [155] Параметры могут передаваться по ссылке , по содержимому (когда копия передается по ссылке) или по значению (но только при наличии прототипа ). [156]CANCEL
выгружает подпрограммы из памяти. GO TO
заставляет программу перейти к указанной процедуре.
Этот GOBACK
оператор является оператором возврата и STOP
останавливает программу. Оператор EXIT
имеет шесть различных форматов: его можно использовать как оператор возврата, оператор прерывания , оператор продолжения , маркер конца или для выхода из процедуры. [157]
Исключения вызываются оператором RAISE
и перехватываются с помощью обработчика или декларативного метода , определенного в DECLARATIVES
части разделения процедур. Декларативы — это разделы, начинающиеся с USE
оператора, в котором указываются ошибки, которые необходимо обрабатывать. Исключениями могут быть имена или объекты. RESUME
используется в декларативной форме для перехода к оператору после того, который вызвал исключение, или к процедуре вне DECLARATIVES
. В отличие от других языков, неперехваченные исключения не могут завершить работу программы, и программа может продолжать работать без изменений.
Файловый ввод-вывод обрабатывается самоописывающими операторами OPEN
, CLOSE
, READ
и WRITE
и еще тремя: REWRITE
, которые обновляют запись; START
, который выбирает последующие записи для доступа, находя запись с определенным ключом; и UNLOCK
, который снимает блокировку с последней доступной записи.
Взаимодействие с пользователем осуществляется с помощью ACCEPT
и DISPLAY
.
Следующие глаголы манипулируют данными:
INITIALIZE
, который устанавливает для элементов данных значения по умолчанию.MOVE
, который присваивает значения элементам данных; MOVE CORRESPONDING назначает соответствующие поля с одинаковыми именами .SET
, который имеет 15 форматов: он может изменять индексы, назначать ссылки на объекты и изменять емкость таблиц, а также выполнять другие функции. [158]ADD
, SUBTRACT
, MULTIPLY
, DIVIDE
и COMPUTE
, которые выполняют арифметические операции (с COMPUTE
присвоением результата формулы переменной).ALLOCATE
и FREE
, которые обрабатывают динамическую память .VALIDATE
, который проверяет и распределяет данные, как указано в описании элемента в разделе данных.STRING
и UNSTRING
, которые объединяют и разделяют строки соответственно.INSPECT
, который подсчитывает или заменяет экземпляры указанных подстрок внутри строки.SEARCH
, который ищет в таблице первую запись, удовлетворяющую условию.Файлы и таблицы сортируются с помощью SORT
глагола, MERGE
который объединяет и сортирует файлы. Глагол RELEASE
предоставляет записи для сортировки и RETURN
извлекает отсортированные записи по порядку.
Некоторые операторы, такие как IF
и READ
, могут сами содержать операторы. Такие операторы могут быть завершены двумя способами: точкой ( неявное завершение ), которая завершает все содержащиеся незавершенные операторы, или признаком конца области, который завершает ближайший соответствующий открытый оператор.
*> Период терминатора («неявное завершение») IF недействительная запись IF no-more-records СЛЕДУЮЩЕЕ ПРЕДЛОЖЕНИЕ ELSE READ файл-записи AT END SET no-more-records TO TRUE . *> Ограничители области («явное завершение») IF недействительная запись IF no-more-records CONTINUE ELSE READ Record-file AT END SET no-more-records TO TRUE END-READ END-IF END-IF
Вложенные операторы, завершающиеся точкой, являются частым источником ошибок. [159] [160] Например, изучите следующий код:
ЕСЛИ x ДИСПЛЕЙ y . ДИСПЛЕЙ z .
Здесь цель состоит в том, чтобы отобразить y
, истинно z
ли условие . x
Однако z
будет отображаться независимо от значения, x
поскольку IF
оператор завершается ошибочной точкой после .DISPLAY y
Другая ошибка является результатом висячей проблемы else , когда два IF
оператора могут ассоциироваться с файлом ELSE
.
IF x IF y ПОКАЗАТЬ a ELSE ПОКАЗАТЬ b .
В приведенном выше фрагменте вместо оператора ELSE
используется ассоциация с оператором , что приводит к ошибке. До введения явных ограничителей области видимости для предотвращения этого требовалось размещать после внутреннего . [160]IF y
IF x
ELSE NEXT SENTENCE
IF
Первоначальная спецификация COBOL (1959 г.) поддерживала печально известное утверждение, для которого многие компиляторы создавали самомодифицирующийся код . и являются метками процедуры, а вместо этого означает единственный оператор в процедуре , выполняемый после такого оператора . Многие компиляторы до сих пор поддерживают его, [161] но он был признан устаревшим в стандарте COBOL 1985 года и удален в 2002 году. [162]ALTER X TO PROCEED TO Y
X
Y
GO TO
X
ALTER
GO TO Y
Это ALTER
заявление было плохо воспринято, поскольку оно подрывало «локальность контекста» и затрудняло понимание общей логики программы. [163] Как писал в 1976 году автор учебника Дэниел Д. Маккракен , «тот, кто никогда раньше не видел программу, должен ознакомиться с ней как можно быстрее, иногда в условиях критического дефицита времени, потому что программа не удалась… вид оператор GO TO в отдельном абзаце, сигнализирующий о существовании неизвестного количества операторов ALTER в неизвестных местах по всей программе, вселяет страх в сердце самого смелого программиста». [163]
« Привет, мир!» программа на КОБОЛе:
ОТДЕЛ ИДЕНТИФИКАЦИИ . ПРОГРАММА-ID . Привет, мир . ПРОЦЕДУРНОЕ РАЗДЕЛЕНИЕ . ДИСПЛЕЙ «Привет, мир!» .
Когда теперь знаменитый «Hello, World!» Пример программы на языке программирования C был впервые опубликован в 1978 году. Аналогичный пример программы COBOL для мэйнфреймов был бы отправлен через JCL , скорее всего, с использованием устройства чтения перфокарт и перфокарт на 80 столбцов. Листинг ниже с пустым полем DATA DIVISION был протестирован с использованием Linux и эмулятора System/370 Hercules под управлением MVS 3.8J. JCL, написанный в июле 2015 года, основан на учебных пособиях и примерах Hercules, размещенных Джеем Мозли. [164] В соответствии с программированием на языке 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 * ПРОВЕРКА БАЗОВОГО КОБОЛА INSTALL 00050000 01000 ИДЕНТИФИКАЦИОННОЕ ОТДЕЛЕНИЕ . 00060000 01100 ИДЕНТ. ПРОГРАММЫ . 'ПРИВЕТ' . 00070000 02000 ОТДЕЛ ЭКОЛОГИЧЕСКОЙ СРЕДЫ . 00080000 02100 РАЗДЕЛ КОНФИГУРАЦИИ . 00090000 02110 ИСТОЧНИК-КОМПЬЮТЕР . ГНУЛИНУКС . 00100000 02120 ОБЪЕКТ-КОМПЬЮТЕР . ГЕРКУЛЕС . 00110000 02200 СПЕЦИАЛЬНЫЕ НАЗВАНИЯ . 00120000 02210 КОНСОЛЬ КОНСОЛЬ . 00130000 03000 ОТДЕЛЕНИЕ ДАННЫХ . 00140000 04000 ПРОЦЕДУРНОЕ ОТДЕЛЕНИЕ . 00150000 04100 00 - ГЛАВНЫЙ . 00160000 04110 ОТОБРАЖЕНИЕ «HELLO, WORLD» НА CONSL . 00170000 04900 СТОП ПУСК . 00180000 // ЛКЭД . SYSLIB DD DSNAME = SYS1 . COBLIB , DISP = SHR 00190000 // DD DSNAME = SYS1 . LINKLIB , DISP = SHR 00200000 // ВПЕРЕД . SYSPRINT DD SYSOUT = A 00210000 // 00220000
После отправки JCL консоль MVS отобразила:
19.52.48 ЗАДАНИЕ 3 $HASP100 COBUCLG НА READER1 БАЗОВЫЙ ТЕСТ COBOL 19.52.48 ЗАДАНИЕ 3 IEF677I ВЫДАНО ПРЕДУПРЕЖДАЮЩЕЕ СООБЩЕНИЕ ДЛЯ ЗАДАНИЯ COBUCLG 19.52.48 JOB 3 $HASP373 COBUCLG НАЧАЛСЯ – INIT 1 – CLASS A – SYS BSP1 19.52.48 ЗАДАНИЕ 3 IEC130I SYSPUNCH DD ЗАЯВЛЕНИЕ ОТСУТСТВУЕТ 19.52.48 ЗАДАНИЕ 3 IEC130I SYSLIB DD ЗАЯВЛЕНИЕ ОТСУТСТВУЕТ 19.52.48 ЗАДАНИЕ 3 IEC130I SYSPUNCH DD ЗАЯВЛЕНИЕ ОТСУТСТВУЕТ 19.52.48 JOB 3 IEFACTRT — Имя шага Реткод программы Procstep 19.52.48 JOB 3 COBUCLG BASETEST COB IKFCBL00 RC= 0000 19.52.48 ЗАДАНИЕ 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 ЗАДАНИЕ 3 $HASP395 COBUCLG ЗАВЕРШЕНО
Строка 10 приведенного выше листинга консоли выделена для эффекта, выделение не является частью фактического вывода на консоль .
Соответствующий листинг компилятора генерирует более четырех страниц технических подробностей и информации о выполнении заданий для одной строки вывода из 14 строк COBOL.
В 1970-х годах принятие парадигмы структурированного программирования становилось все более распространенным. Эдсгер Дейкстра , выдающийся ученый-компьютерщик, написал письмо редактору журнала Communications of ACM , опубликованного в 1975 году, под названием «Как мы говорим правду, которая может причинить вред?», в котором он критиковал COBOL и несколько других современных языков; отметив, что «использование COBOL калечит разум». [165]
В опубликованном несогласии с замечаниями Дейкстры учёный-компьютерщик Говард Э. Томпкинс заявил, что неструктурированный COBOL, как правило, «пишется программистами, которые никогда не имели возможности хорошо преподавать структурированный COBOL», утверждая, что проблема заключалась в первую очередь в обучении. [166]
Одной из причин спагетти-кода было GO TO
заявление. Однако попытки удалить GO TO
s из кода COBOL привели к усложнению программ и снижению качества кода. [167] GO TO
были в значительной степени заменены операторами PERFORM
и процедурами, которые способствовали развитию модульного программирования [167] и давали легкий доступ к мощным средствам циклирования. Однако его PERFORM
можно было использовать только с процедурами, поэтому тела циклов не располагались там, где они использовались, что затрудняло понимание программ. [168]
Программы COBOL были печально известны своей монолитностью и отсутствием модульности. [169] Код COBOL мог быть модульным только с помощью процедур, которые оказались неадекватными для больших систем. Было невозможно ограничить доступ к данным, то есть процедура могла получить доступ к любому элементу данных и изменить его. Более того, не было возможности передать параметры в процедуру, и это упущение Жан Самме считал самой большой ошибкой комитета. [170]
Еще одна сложность связана с возможностью выполнения PERFORM THRU
определенной последовательности процедур. Это означало, что управление могло перейти к любой процедуре и вернуться из нее, создавая запутанный поток управления и позволяя программисту нарушить правило «один вход — один выход» . [171]
Ситуация улучшилась по мере того, как в COBOL появилось больше функций. В COBOL-74 добавлены подпрограммы, дающие программистам возможность контролировать данные, к которым может получить доступ каждая часть программы. Затем в COBOL-85 были добавлены вложенные подпрограммы, что позволило программистам скрывать подпрограммы. [172] Дальнейший контроль над данными и кодом появился в 2002 году, когда были включены объектно-ориентированное программирование, пользовательские функции и определяемые пользователем типы данных.
Тем не менее, многие важные устаревшие программы COBOL используют неструктурированный код, который стал практически неподдерживаемым. Модифицировать даже простой участок кода может быть слишком рискованно и затратно, поскольку он может быть использован неизвестным образом из неизвестных мест. [173]
COBOL задумывался как легко переносимый, «общий» язык. Однако к 2001 году было создано около 300 диалектов. [174] Одним из источников диалектов был сам стандарт: стандарт 1974 года состоял из одного обязательного ядра и одиннадцати функциональных модулей, каждый из которых содержал два или три уровня поддержки. Это допускало 104 976 возможных вариантов. [175]
COBOL-85 не был полностью совместим с более ранними версиями, и его разработка вызвала споры. Джозеф Т. Брофи, ИТ-директор компании Travelers Insurance , возглавил попытку информировать пользователей COBOL о больших затратах на перепрограммирование, связанных с внедрением нового стандарта. [176] В результате комитет ANSI COBOL получил более 2200 писем от общественности, в основном отрицательных, с требованием внести изменения. С другой стороны, считалось, что переход на COBOL-85 повысит производительность в последующие годы, тем самым оправдывая затраты на переход. [177]
Слабый, многословный и дряблый язык, используемый программистами для выполнения скучных бессмысленных действий на мэйнфреймах динозавров. [...] Само его название редко произносится без ритуального выражения отвращения или ужаса.
Файл жаргона 4.4.8. [178]
Синтаксис COBOL часто критикуют за его многословие. Сторонники говорят, что это было сделано для того, чтобы сделать код самодокументируемым , упрощая обслуживание программы. [179] COBOL также был задуман как простой для изучения и использования программистами, [180] но при этом его можно было читать нетехническому персоналу, например, менеджерам. [181] [182] [183] [184]
Стремление к читабельности привело к использованию похожего на английский синтаксиса и структурных элементов, таких как существительные, глаголы, предложения, разделы и подразделения. Тем не менее, к 1984 году сопровождающие программ COBOL с трудом справлялись с «непонятным» кодом [183], и основные изменения в COBOL-85 были призваны облегчить обслуживание. [93]
Жан Саммет, член комитета ближайшего окружения, отметила, что «не было предпринято особых попыток угодить профессиональным программистам, на самом деле люди, чей основной интерес — программирование, как правило, очень недовольны COBOL», что она объяснила многословным синтаксисом COBOL. [185]
Сообщество COBOL всегда было изолировано от сообщества компьютерных наук. Ни один ученый-компьютерщик не участвовал в разработке COBOL: все члены комитета были представителями торговли или правительства. Ученые-компьютерщики в то время больше интересовались такими областями, как численный анализ, физика и системное программирование, чем проблемами коммерческой обработки файлов, которые решала разработка COBOL. [186] Жан Саммет объяснил непопулярность COBOL первоначальной «снобской реакцией» из-за его неэлегантности, отсутствия влиятельных ученых-компьютерщиков, участвующих в процессе проектирования, и презрения к обработке бизнес-данных. [187] Спецификация COBOL использовала уникальную «нотацию» или метаязык для определения синтаксиса, а не новую форму Бэкуса-Наура , о которой комитет не знал. Это вызвало «жесткую» критику. [188] [189] [70]
Академический мир склонен считать COBOL многословным, неуклюжим и неэлегантным и пытается его игнорировать, хотя в мире, вероятно, больше программ COBOL и программистов, чем для FORTRAN, ALGOL и PL/I вместе взятых. По большей части только школы с непосредственной профессиональной целью проводят обучение COBOL.
Ричард Конвей и Дэвид Грис , 1973 г. [190]
Позже COBOL страдал от нехватки материалов, освещающих его; вводные книги появились только в 1963 году (в 1966 году Ричард Д. Ирвин опубликовал учебник по COBOL для колледжа). [191] К 1985 году в Библиотеке Конгресса было в два раза больше книг по FORTRAN и в четыре раза больше по BASIC, чем по COBOL . [129] Профессора университетов преподавали более современные, современные языки и методы вместо COBOL, который, как говорили, имел характер «профессиональной школы». [192] Дональд Нельсон, председатель комитета CODASYL COBOL, сказал в 1984 году, что «ученые ... ненавидят COBOL» и что выпускникам компьютерных наук «внушают ненависть к COBOL». [193]
К середине 1980-х годов в бизнес-сообществе также наблюдалась значительная снисходительность к COBOL со стороны пользователей других языков, например FORTRAN или ассемблера , подразумевая, что COBOL можно использовать только для решения несложных задач. [194]
В 2003 году COBOL использовался в 80% учебных программ по информационным системам в США, столько же, сколько C++ и Java . [195] Десять лет спустя опрос, проведенный Micro Focus, показал, что 20% университетских преподавателей считали COBOL устаревшим или мертвым, а 55% полагали, что их студенты считали COBOL устаревшим или мертвым. Тот же опрос также показал, что только 25% преподавателей включили программирование на COBOL в свою учебную программу, хотя 60% считали, что им следует его преподавать. [196]
Были высказаны сомнения относительно компетентности комитета по стандартам. Временно действующий член комитета Говард Бромберг заявил, что процесс разработки «незначительно контролируется» и что он «страдает от неоднородности кадров и… отсутствия талантов». [81] Жан Саммет и Джером Гарфанкель также отметили, что изменения, внесенные в одну редакцию стандарта, будут отменены в следующей, как из-за изменений в составе комитета по стандартизации, так и из-за объективных доказательств. [197]
Стандарты COBOL неоднократно страдали от задержек: COBOL-85 появился на пять лет позже, чем ожидалось, [198] COBOL 2002 опоздал на пять лет, [3] и COBOL 2014 опоздал на шесть лет. [101] [199] Чтобы бороться с задержками, комитет по стандартизации разрешил создание дополнительных дополнений, которые добавляли функции быстрее, чем при ожидании следующей версии стандарта. Однако некоторые члены комитета выразили обеспокоенность по поводу несовместимости реализаций и частых модификаций стандарта. [200]
Структуры данных COBOL повлияли на последующие языки программирования. Его структура записей и файлов повлияла на PL/I и Pascal , и это REDEFINES
предложение было предшественником вариантов записей Pascal. Явные определения файловой структуры предшествовали развитию систем управления базами данных , а агрегированные данные были значительным шагом вперед по сравнению с массивами Фортрана. [129]
PICTURE
объявления данных были включены в PL/I с небольшими изменениями.
Возможности COBOL COPY
, хотя и считались «примитивными», [201] повлияли на разработку директив include . [129]
Акцент на переносимости и стандартизации означал, что программы, написанные на COBOL, могли быть переносимыми и способствовали распространению языка на широкий спектр аппаратных платформ и операционных систем. [202] Кроме того, четко определенная структура подразделений ограничивает определение внешних ссылок на Отдел окружающей среды, что, в частности, упрощает изменение платформы. [203]
Комитет ближнего действия усердно работал с июня 1959 года, но возникли большие трудности с тем, чтобы довольно большой комитет попытался создать язык программирования. В ноябре председатель комитета по малой дальности назначил шесть человек для разработки спецификаций на рассмотрение: Уильяма Селдена и Гертруду Тирни (IBM), Говарда Бромберга и Нормана Дисконта (RCA), а также Вернона Ривза и Джин Э. Саммет (Sylvania Electric Products). Мы работали в течение двух полных недель (включая несколько круглосуточных заседаний) в ноябре 1959 года и отправили предложенные спецификации в полный состав Комитета ближнего действия, который принял почти все из них. После некоторого редактирования (тем же шестью людьми) мы в декабре сдали спецификации в качестве окончательного отчета в Исполнительный комитет, который принял их в январе 1960 года. После некоторого дальнейшего редактирования Государственная типография выпустила Кобол 60. [.. .] [Грейс Хоппер] не участвовала в его работе, за исключением общего руководства, которое она давала своим сотрудникам, которые были непосредственными членами комитета. Таким образом, хотя ее косвенное влияние было очень важным, к сожалению, часто повторяющиеся утверждения о том, что «Грейс Хоппер разработала Кобол», или «Грейс Хоппер была соразработчиком Кобола», или «Грейс Хоппер — мать Кобола», просто неверны.
Стиль объектно-ориентированного языка COBOL отражает влияние Smalltalk и C++.
... преобразование в альтернативный, расширенный COBOL или в ANSI COBOL очень сложно, если вообще возможно.
(Грейс Хоппер) Код по прозвищу «Бабушка Кобол» был основан на некоторых из ее ранних работ. Она сказала, что, услышав слухи, один из ее сотрудников пошел и купил гранитное надгробие. «Он вырезал на нем слово COBOL. Затем он отправил его экспресс-почтой мистеру Филлипсу в Пентагон». По ее словам, розыгрыш над Чарльзом Филлипсом, руководителем проекта в министерстве обороны, привлек внимание сильных мира сего и стал поворотным моментом. COBOL впоследствии стал наиболее широко используемым и долговечным компьютерным языком в истории.
Таким образом, основной проблемой Y2K является проблема неверных результатов при проведении математических расчетов дат.
Несколько агентств, таких как Министерство сельского хозяйства (USDA), DHS, HHS, Министерство юстиции, Казначейство и VA, сообщили об использовании Common Business Oriented Language (COBOL) — языка программирования, разработанного в конце 1950-х и начале 1960-х годов — для программирования своего наследия. системы. Широко известно, что агентствам необходимо переходить на более современные и удобные в сопровождении языки, если это целесообразно и осуществимо.
ALTER
можно увидеть ниже:Самая ранняя дата разработки и утверждения нового стандарта COBOL — 1980 год [...].
пересмотренная версия стандарта COBOL от июня 2008 г.
Micro Focus Visual COBOL обеспечивает разработку и развертывание COBOL следующего поколения для Linux x86-64, Linux для System z, AIX, HP/UX, Solaris и Windows.
{{cite book}}
: CS1 maint: numeric names: authors list (link){{cite book}}
: CS1 maint: numeric names: authors list (link)