JOVIAL este un limbaj de programare de nivel înalt similar cu ALGOL , specializat în dezvoltarea de sisteme embedded .
JOVIAL a fost dezvoltat în 1959 ca un nou limbaj de programare „de înaltă calitate” de către echipa System Development Corporation (SDC) condusă de Jules Schwartz pentru a crea software pentru electronica aeronavelor militare [1] . Numele JOVIAL este un acronim pentru versiunea proprie a limbii a lgebrice internaționale a lui Jules . Potrivit lui Schwartz, limba a fost inițial numită OVIAL, dar acel nume a fost respins din diferite motive. Apoi a fost propus denumirea „JOVIAL”, fără nicio semnificație a literei „J” (în engleză. , fr. , spaniolă etc. jovial „vesel; bine dispus"). S-a sugerat în glumă că limba poartă numele lui Schwartz, în timp ce el a prezidat întâlnirea, iar acest nume informal a luat stăpânire în cele din urmă. [2]
În anii 1960, JOVIAL a făcut parte dintr-o serie de proiecte militare americane, în special 465L (proiectul SACCS ) din cauza lipsei de limbaje de procesare în timp real disponibile. Aproximativ 95% din software-ul SACCS a fost scris în JOVIAL. [3]
La sfârșitul anilor 1970 și începutul anilor 1980, US Air Force a adoptat procesorul standardizat MIL-STD-1750A , iar programele au fost scrise în JOVIAL pentru acest procesor. Pentru astfel de procesoare, mai multe companii comerciale au dezvoltat compilatoare și instrumente de dezvoltare JOVIAL aferente ( Advanced Computer Techniques , TLD Systems , Proprietary Software Systems și altele). [4] [5]
JOVIAL a fost standardizat în 1973 ca MIL-STD- 1589 ; dezvoltarea limbajului a fost documentată în 1984 în MIL-STD-1589C . Limbajul este încă utilizat pe scară largă pentru actualizarea și întreținerea software-ului pe vehicule și aeronave militare mai vechi. Există trei dialecte: J3, J3B-2 și J73.
Din 2010, JOVIAL nu mai este susținut sau distribuit de către USAF JOVIAL Program Office (JPO). Software-ul distribuit anterior de JPO este încă disponibil prin resursele comerciale ale Software Engineering Associates, Inc. (SEA), precum și alte procesoare gazdă, inclusiv Microsoft Windows , Linux , Mac OS X pe PowerPC , SPARC , VAX , 1750A , PowerPC , TI- 9989 , Zilog Z800x , Motorola 680x0 și IBM System 360 / System 370 / System z . De asemenea, DDC-I , care a achiziționat părți din Advanced Computer Techniques , afișează în continuare compilatoarele JOVIAL și instrumentele aferente. [6]
Majoritatea programelor implementate pe JOVIAL sunt esențiale pentru misiune și devin din ce în ce mai greu de întreținut. În decembrie 2014, s-a raportat că software-ul care folosea JOVIAL, lansat în anii 1960, era legat de o defecțiune majoră a infrastructurii de control al traficului aerian din Regatul Unit și că agenția care îl folosea a trebuit să-și instruiască personalul IT în programarea JOVIAL, astfel încât ar putea funcționa cu acest software, care nu este planificat să fie înlocuit până în 2016. [7] Prin urmare, conversia codului JOVIAL pe noi platforme devine din ce în ce mai comună. Conversia JOVIAL în alte limbi se face în prezent de către Semantic Designs , DMS Software Reengineering Toolkit a fost folosit pentru a converti unele programe JOVIAL pentru bombardierul B -2 în C. [opt]
Potrivit lui Schwartz, JOVIAL a fost influențat de limbaje de programare precum CORAL , SYMPL , Space Programming Language (SPL) și, într-o oarecare măsură, CMS-2 . [9] Un subset interactiv al JOVIAL numit TINT , similar cu JOSS , a fost dezvoltat în anii 1960. [2]
JOVIAL include caracteristici care nu se găsesc în ALGOL standard, cum ar fi înregistrări, matrice de înregistrări și limbaj de asamblare inline. [zece]
Următorul exemplu este preluat din Ghidul de programare JOVIAL (J73). [unsprezece]
PROC RETRIEVE(COD:VALOARE); ÎNCEPE COD ARTICOL U; VALOAREA ARTICOLULUI F; VALOARE = -99999.; PENTRU I:0 PENTRU 1 TIMP I<1000; IF CODE = TABCODE(I); ÎNCEPE VALOARE = TABVALUE(I); IEȘIRE; Sfârşit SfârşitAcest exemplu definește o procedură numită RETRIEVEcare ia CODEun argument întreg fără semn și un argument de ieșire în virgulă mobilă VALUE . Acesta caută în matricea de 1000 de elemente TABCODEo intrare care se potrivește CODEși apoi setează VALUEvariabila în virgulă mobilă la elementul matricei TABVALUEcare are același index de matrice corespondent. Dacă nu se găsește niciun element care se potrivește, valoarea VALUEeste -99999.0.