JOVIAL — высокоуровневый язык программирования, похожий на ALGOL, специализированный на разработке встраиваемых систем.
JOVIAL был разработан в 1959 году как новый «высококачественный» язык программирования командой корпорации System Development Corporation (SDC) во главе с Жюлем Шварцем[англ.] для создания программного обеспечения для электроники военных самолётов[1]. Название JOVIAL является аббревиатурой «Jules' Own Version of the International Algebraic Language». По словам Шварца, язык изначально назывался OVIAL, но это название по разным причинам отвергалось. Тогда было предложено название «JOVIAL», без какого-либо значения буквы «J» (на англ. , фр. , исп. и т.д. jovial «весёлый; жизнерадостный»). В шутку было высказано предположение, что язык назван в честь Шварца, поскольку он председательствовал на собрании, и это неофициальное название окончательно закрепилось.[2]
В 1960-е годы JOVIAL был частью серии военных проектов США, в частности 465L[англ.] (проект SACCS[англ.]) из-за отсутствия доступных языков обработки в режиме реального времени. Около 95 % программного обеспечения проекта SACCS было написано на JOVIAL.[3]
В конце 1970-х и начале 1980-х годов ВВС США приняли стандартизованный процессор MIL-STD-1750A, и программы на JOVIAL создавались для этого процессора. Для таких процессоров несколько коммерческих компаний разработали компиляторы и связанные с ними инструменты для разработки на JOVIAL (Advanced Computer Techniques[англ.], TLD Systems[англ.], Proprietary Software Systems и другие).[4][5]
JOVIAL был стандартизован в 1973 году как MIL-STD-1589; развитие языка было зафиксировано в 1984 году в MIL-STD-1589C. Язык по-прежнему широко используется для обновления и обслуживания программного обеспечения на старых военных транспортных средствах и самолётах. Существует три диалекта: J3, J3B-2 и J73.
По состоянию на 2010 год JOVIAL больше не поддерживается и не распространяется Управлением программ JOVIAL USAF (JPO). Программное обеспечение, ранее распространенное JPO, по-прежнему доступно через коммерческие ресурсы Software Engineering Associates, Inc. (SEA), а также другие хост-процессоры, включая Microsoft Windows, Linux, Mac OS X на PowerPC, SPARC, VAX, 1750A, PowerPC , TI-9989, Zilog Z800x, Motorola 680x0 и IBM System 360 / System 370 / System z. Кроме того, DDC-I[англ.], который приобрёл части Advanced Computer Techniques[англ.], по-прежнему отображает компиляторы JOVIAL и связанные с ними инструменты.[6]
Большинство программ, реализованных на JOVIAL, имеют критически важное значение, и их обслуживание становится всё более сложным. В декабре 2014 года было сообщено, что программное обеспечение, использующее JOVIAL, выпущенное в 1960-х годах, было связано с крупным провалом инфраструктуры управления воздушным движением Соединённого Королевства и что использующее его агентство должно было обучать своих IT-специалистов программированию на JOVIAL, чтобы они могли работать с этим программным обеспечением, которое не планируется заменять до 2016 года.[7] Поэтому преобразование кода JOVIAL на новые платформы становится всё более распространённым явлением. Конверция JOVIAL на другие языки в настоящее время выполняются Semantic Designs, инструмент DMS Software Reengineering Toolkit[англ.] использовался для преобразования некоторых программ JOVIAL для бомбардировщика B-2 на язык C.[8]
По словам Шварца, JOVIAL испытал влияние таких языков программирования, как CORAL[англ.], SYMPL[англ.], Space Programming Language (SPL) и, в некоторой степени, CMS-2[англ.].[9] Интерактивное подмножество JOVIAL под названием TINT, похожее на JOSS, было разработано в 1960-х годах.[2]
JOVIAL включает функции, не найденные в стандартном ALGOL, такие как записи, массивы записей и встроенный язык ассемблера.[10]
Следующий пример взят из «Руководства по программированию на языке JOVIAL (J73)».[11]
PROC RETRIEVE(CODE:VALUE); BEGIN ITEM CODE U; ITEM VALUE F; VALUE = -99999.; FOR I:0 BY 1 WHILE I<1000; IF CODE = TABCODE(I); BEGIN VALUE = TABVALUE(I); EXIT; END END
В этом примере определяется процедура с именем RETRIEVE
, которая принимает аргумент CODE
с целым беззнаковым числом и аргумент вывода с плавающей запятой VALUE
. Он ищет в 1000-элементном массиве TABCODE
запись, которая соответствует CODE
, а затем устанавливает переменную VALUE
с плавающей запятой в элемент массива TABVALUE
, имеющий тот же самый соответствующий индекс массива. Если соответствующий элемент не найден, значение VALUE
равно -99999.0.