Некоторым языкам программирования десятки лет — и они ещё в ходу. 5 старых, но актуальных ЯП

от автора

Не так давно мы писали про язык COBOL, которому уже больше 60 лет. Он до сих пор актуален, поскольку на нём держится немало систем финансовых и банковских организаций. Но есть и другие старые ЯП, всё ещё применяемые в некоторых отраслях. О них сегодня и говорим, не обойдя и COBOL, который не собирается уходить с рынка. Подробности — под катом.

Fortran

В начале 2024 года этот язык оказался на 12 месте в списке TIOBE. И ведь ему 67 лет, вдумайтесь. В прошлом году он находился на 27 позиции и всего за год вышел почти что в первую десятку. Позади неожиданно оказались Rust, Ruby и Kotlin.

Конечно, не стоит думать, что он до сих пор такой же, каким был в момент своего появления (первую версию выпустила IBM в 1957 году). В 2023 г., например, появился новый стандарт. Вот достоинства языка:

  • высокая производительность

  • статическая и сильная типизация

  • относительная простота для изучения и использования

  • универсальность

  • встроенный параллелизм

  • комплексные числа как встроенный тип данных — это крайне важно для расчётов в области радиофизики

  • большое количество библиотек для различных расчётов, например NAG

Пример кода на этом языке:
! Print matrix A to screen subroutine print_matrix(n,m,A)   implicit none   integer, intent(in) :: n   integer, intent(in) :: m   real, intent(in) :: A(n, m)     integer :: i     do i = 1, n print *, A(i, 1:m)   end do   end subroutine print_matrix

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

На нём написаны программы моделирования погоды и климата, если брать последний пример. Это модели Межправительственной группы экспертов по изменению климата (IPCC). Также язык применяется для выполнения вычислений, которые связаны с химическими и физическими свойствами молекул. Кроме того, он используется для создания пакетов моделирования в химии и биоинформатике. Пример — GROMACS для молекулярной динамики.

ADA

Этот язык разработан в конце 1970-х, причём не просто так, а по заказу Министерства обороны США. Ведомству он понадобился для создания различного ПО, предназначенного для военных и аэрокосмических систем. Также он применялся для написания медицинских приложений, да и всего, где требовались надёжность и безопасность.

Его достоинство в поддержке как объектно-ориентированного, так и не объектно-ориентированного программирования. Он подходит как для использования в комплексных системах, так и для низкоуровневой разработки. Язык позволяет обнаруживать ошибки ещё во время компиляции, а не уже непосредственного выполнения программы. Кроме того, в Ada преимущественно используются слова, а не символы. В целом это снижает риск ошибок при кодинге.

Пример кода на ADA:
h Interfaces; use Interfaces; with System.Machine_Code; use System.Machine_Code; with Ada.Text_IO;   procedure Asm_Test is Left, Right : Unsigned_32; begin Left := 1; Right := 2;   Asm("addl %1, %2",     Inputs => (Unsigned_32'Asm_Input ("a", Left),                        Unsigned_32'Asm_Input ("b", Right)),     Outputs => Unsigned_32'Asm_Output ("=b", Right));   Ada.Text_IO.Put_Line (Unsigned_32'Image (Right)); end Asm_Test;

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

К слову, современная версия языка (в отличие от первоначальной) фактически является объектно-ориентированной. Как и предтеча, она надёжна и отличается простым синтаксисом.

COBOL

Языку программирования COBOL более 60 лет. Несмотря на это, он до сих пор активно используется. Конечно, в подавляющем большинстве сфер его заменили современные языки программирования. Но дело в том, что в ряде стран до сих пор работают аппаратные системы с ПО на базе этого ЯП. Особенно много их в США.

В августе 2023 года язык вышел на 15 место по популярности среди ЯП. Год назад он находился на 31 позиции. Впечатляющий рост.

Пример кода на COBOL:
5738CB1 V2R1M0  910524 AS/400 COBOL Source  SGAFP/CBLLBL  RCHASA12  10/24/91 10:18:16  Page  3 STMT SEQNBR -A 1 B..+....2....+....3....+....4....+....5....+....6....+....7.. IDENTFCN  S  COPYNAME                                                        CHG DATE   42  002300 88  END-OF-FILE              VALUE "1".             10/23/91   002400                                                                 10/23/91   43  002500 PROCEDURE DIVISION.                                             10/23/91   002600 MAIN-PARA.                                                      10/23/91   44  002700 OPEN INPUT VENDOR-FILE                                      10/23/91   002800      OUTPUT PRINTER-FILE.                               10/23/91   45  002900 PERFORM PRINT-LABELS UNTIL END-OF-FILE.                     10/23/91   46  003000 CLOSE VENDOR-FILE, PRINTER-FILE.                            10/23/91   003100     GOBACK.                                                     10/23/91   003200                                                                 10/23/91   47  003300 PRINT-LABELS.                                                   10/23/91   48  003400 READ VENDOR-FILE                                            10/23/91   49  003500     AT END SET END-OF-FILE TO TRUE.                         10/23/91   50  003600 IF NOT-END-OF-FILE                                          10/23/91   51  003700     MOVE CORRESPONDING VNDMSTR TO LABEL-O                   10/23/91         *   ** CORRESPONDING items for statement 51:         *   **     NAME         *   **     ADDR1         *   **     CITY         *   **     STATE         *   **     ZIPCD         *   ** End of CORRESPONDING items for statement 51   52  003800     WRITE PRINT-REC FORMAT IS "LABEL".                  10/23/91 * * * * *   E N D   O F   S O U R C E   * * * * *

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

Благодаря стараниям IBM и других компаний количество строк кода, написанных на COBOL, в 2022 году составило уже 800 млрд. Правда, вполне возможно, что в 2017 году просто посчитали не всё, но факт остаётся фактом — количество строк кода, написанных на COBOL, огромно.

Вероятно, через некоторое время системы всё же перепишут на современных языках программирования, но пока что COBOL остаётся на плаву.

APL

Это аббревиатура от A Programming Language. Язык создан в 60-х годах для работы с массивами, а также для обработки больших блоков чисел. Он хорошо подходил под решение математических, статистических и логических задач, а код APL достаточно короткий.

Вот пример:
L←(Lι':')↓L←,L   ⍝ drop To:  L←LJUST VTOM',',L⍝ mat with one entry per row  S←¯1++/∧\L≠'('   ⍝ length of address  X←0⌈⌈/S  L←S⌽(−(⍴L)+0,X)↑L⍝ align the (names)  A←((1↑⍴L),X)↑L   ⍝ address  N←0 1↓DLTB(0,X)↓L⍝ names)  N←,'⍺',N  N[(N='_')/ι⍴N]←' '   ⍝ change _ to blank  N←0 ¯1↓RJUST VTOM N  ⍝ names  S←+/∧\' '≠⌽N     ⍝ length of last word in name

У языка весьма обширный набор встроенных функций для воздействия на скаляры, векторы, множества, многомерные объекты и их комбинации.

Вот что говорил о языке его автор: «Изначально я создавал APL как инструмент для написания и обучения. И хотя ЯП главным образом эксплуатировался в коммерческом программировании, я всё так же считаю, что его самое важное использование определяется как простая, точная и выполнимая запись (нотация) для изучения широкого спектра предметов».

У APL достаточно высокий порог входа, в частности потому, что он использует свой собственный набор символов. Для него даже создавалась специализированная клавиатура.

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

В целом, актуального софта на APL, который кто-то использует, становится всё меньше, но всё же он есть. Кстати, проводятся и конференции в рамках Association for Computer Machinery.

PL/I

Ещё один очень старый язык программирования, представленный корпорацией IBM в 1960-х годах. Он был создан как универсальный ЯП, который объединил Fortran и Comtran (последний применялся в бизнесе). Получился весьма специфический язык с большим количеством дополнительных функций.

Пример кода на PL/I:
*********************************************************************** *                                                                     * *  PL/I EXAMPLE                                                   * *  OBJECT IS TEMPORARY                                        * *                                                                     * *                                                                     * *                                                                     * ***********************************************************************  CRTPLN3: PROCEDURE OPTIONS (MAIN);                                 CSR00010                                                                         CSR00020  DCL                                                                    CSR00030   (                                                                     CSR00040   K INIT(1024),                    /* ONE KILO-BYTE          */ CSR00050   PAGESIZE INIT(4096),             /* 4K PAGE BOUNDARY       */ CSR00060   OFFSET INIT(0),                  /* WINDOWS STARTS         */ CSR00070   WINDOW_SIZE INIT(20),            /* WINDOW SIZE IN PAGES   */ CSR00080   NUM_WIN_ELEM INIT (20480),       /* NUM OF 4-BYTE ELEMENTS */ CSR00090   OBJECT_SIZE INIT (60))           /* CHOSEN OBJECT SIZE IN PGS  */ CSR00100   FIXED BIN(31);                                                        CSR00110                                                                         CSR00120  DCL                                                                    CSR00130  /* 32767 IS UPPER LIMIT FOR ARRAY BOUND.                        */ CSR00140   S(32767) BIN(31) FIXED BASED(SP); /* DEFINE WORD ALIGNED SPACE */ CSR00150                                                                         CSR00160  DCL SP PTR;                                                            CSR00170                                                                         CSR00180  DCL                                                                    CSR00190   (                                                                     CSR00200   ORIG,                            /* START ADDRESS OF WINDOW*/ CSR00210   AD, I,                           /* TEMPORARY VARIABLES    */ CSR00220   HIGH_OFFSET,                     /* SIZE OF OBJECT IN PAGES*/ CSR00230   NEW_HI_OFFSET,                   /* NEW MAX SIZE OF THE OBJECT */ CSR00240   RETURN_CODE,                     /* RETURN CODE            */ CSR00250   REASON_CODE) FIXED BIN(31);      /* REASON CODE            */ CSR00260                                                                         CSR00270  DCL                                                                    CSR00280   OBJECT_ID CHAR(8);               /* IDENTIFYING TOKEN      */ CSR00290                                                                         CSR00300  /********************************************************************/ CSR00310                                                                         CSR00320  DCL CSRIDAC ENTRY(CHAR(5),        /* OP_TYPE                */ CSR00330                CHAR(9),        /* OBJECT_TYPE            */ CSR00340                CHAR(44),       /* OBJECT_NAME            */ CSR00350                CHAR(3),        /* SCROLL_AREA            */ CSR00360                CHAR(3),        /* OBJECT_STATE           */ CSR00370                CHAR(6),        /* ACCESS_MODE            */ CSR00380                FIXED BIN(31),  /* OBJECT_SIZE            */ CSR00390                CHAR(8),        /* OBJECT_ID              */ CSR00400                FIXED BIN(31),  /* HIGH_OFFSET            */ CSR00410                FIXED BIN(31),  /* RETURN_CODE            */ CSR00420                FIXED BIN(31) ) /* REASON_CODE            */ CSR00430                OPTIONS(ASSEMBLER);                              CSR00440                                                                         CSR00450                                                                         CSR00460  DCL CSRVIEW ENTRY(CHAR(5),        /* OP_TYPE                */ CSR00470                CHAR(8),        /* OBJECT_ID              */ CSR00480                FIXED BIN(31),  /* OFFSET                 */ CSR00490                FIXED BIN(31),  /* WINDOW_SIZE            */ CSR00500                FIXED BIN(31),  /* WINDOW_NAME            */ CSR00510                CHAR(6),        /* USAGE                  */ CSR00520                CHAR(7),        /* DISPOSITION            */ CSR00530                FIXED BIN(31),  /* RETURN_CODE            */ CSR00540                FIXED BIN(31) ) /* REASON_CODE            */ CSR00550                OPTIONS(ASSEMBLER);                              CSR00560                                                                         CSR00570                                                                         CSR00580  DCL CSRSCOT ENTRY(CHAR(8),        /* OBJECT_ID              */ CSR00590                FIXED BIN(31),  /* OFFSET                 */ CSR00600                FIXED BIN(31),  /* SPAN                   */ CSR00610                FIXED BIN(31),  /* RETURN_CODE            */ CSR00620                FIXED BIN(31) ) /* REASON_CODE            */ CSR00630                OPTIONS(ASSEMBLER);                              CSR00640                                                                         CSR00650                                                                         CSR00660  DCL CSRSAVE ENTRY(CHAR(8),        /* OBJECT_ID              */ CSR00670                FIXED BIN(31),  /* OFFSET                 */ CSR00680                FIXED BIN(31),  /* SPAN                   */ CSR00690                FIXED BIN(31),  /* NEW_HI_OFFSET          */ CSR00700                FIXED BIN(31),  /* RETURN_CODE            */ CSR00710                FIXED BIN(31) ) /* REASON_CODE            */ CSR00720                OPTIONS(ASSEMBLER);                              CSR00730                                                                         CSR00740                                                                         CSR00750  DCL CSRREFR ENTRY(CHAR(8),        /* OBJECT_ID              */ CSR00760                FIXED BIN(31),  /* OFFSET                 */ CSR00770                FIXED BIN(31),  /* SPAN                   */ CSR00780                FIXED BIN(31),  /* RETURN_CODE            */ CSR00790                FIXED BIN(31) ) /* REASON_CODE            */ CSR00800                OPTIONS(ASSEMBLER);                              CSR00810                                                                         CSR00820  /********************************************************************/ CSR00830                                                                         CSR00840                                                                         CSR00850   PUT SKIP LIST                                                         CSR00860       ('<< BEGIN DATA WINDOWING SERVICES INTERFACE VALIDATION >>'); CSR00870   PUT SKIP LIST (' ');                                                  CSR00880                                                                         CSR00890   CALL                                                                  CSR00900   CSRIDAC ('BEGIN',                /* SET UP ACCESS TO A HIPER-  */ CSR00910        'TEMPSPACE',            /* SPACE OBJECT           */ CSR00920        'MY FIRST HIPERSPACE',                                   CSR00930        'YES',                                                       CSR00940        'NEW',                                                       CSR00950        'UPDATE',                                                    CSR00960        OBJECT_SIZE,                                                 CSR00970        OBJECT_ID,                                                   CSR00980        HIGH_OFFSET,                                                 CSR00990        RETURN_CODE,                                                 CSR01000        REASON_CODE);                                                CSR01010                                                                         CSR01020   ALLOC S;                         /* ALLOCATE SPACE         */ CSR01030   AD = UNSPEC(SP);                 /* GET ADDRESS OF SPACE   */ CSR01040   ORIG = MOD(AD,PAGESIZE);         /* SEE WHERE SPACE IS IN PAGE */ CSR01050   IF ORIG ¬= 0 THEN                /* IF NOT ON PAGE BOUNDARY*/ CSR01060 ORIG = (PAGESIZE-ORIG) / 4;    /* THEN LOCATE PAGE BOUNDARY  */ CSR01070   ORIG = ORIG + 1;                                                      CSR01080                                                                         CSR01090   DO  I = 1 TO NUM_WIN_ELEM;       /* PUT SOME DATA INTO WINDOW  */ CSR01100 S(I+ORIG-1) = 99;              /* AREA                   */ CSR01110   END;                                                                  CSR01120                                                                         CSR01130   CALL                                                                  CSR01140   CSRVIEW ('BEGIN',                /* NOW VIEW DATA IN FIRST */ CSR01150        OBJECT_ID,              /* WINDOW                 */ CSR01160        OFFSET,                                                      CSR01170        WINDOW_SIZE,                                                 CSR01180        S(ORIG),                                                     CSR01190        'RANDOM',                                                    CSR01200        'REPLACE',                                                   CSR01210        RETURN_CODE,                                                 CSR01220        REASON_CODE);                                                CSR01230                                                                         CSR01240   DO  I = 1 TO NUM_WIN_ELEM;       /* CALCULATE VALUE IN 1ST */ CSR01250 S(I+ORIG-1) = I+1;             /* WINDOW                 */ CSR01260   END;                                                                  CSR01270                                                                         CSR01280   CALL                                                                  CSR01290   CSRSCOT( OBJECT_ID,              /* CAPTURE THE VIEW IN 1ST   */  CSR01300        OFFSET,                 /* WINDOW                */  CSR01310        WINDOW_SIZE,                                                 CSR01320        RETURN_CODE,                                                 CSR01330        REASON_CODE);                                                CSR01340                                                                         CSR01350   CALL                                                                  CSR01360   CSRVIEW ('END ',                 /* END THE VIEW IN 1ST WINDOW */ CSR01370        OBJECT_ID,                                                   CSR01380        OFFSET,                                                      CSR01390        WINDOW_SIZE,                                                 CSR01400        S(ORIG),                                                     CSR01410        'RANDOM',                                                    CSR01420        'RETAIN ',                                                   CSR01430        RETURN_CODE,                                                 CSR01440        REASON_CODE);                                                CSR01450                                                                         CSR01460   CALL                                                                  CSR01470   CSRVIEW ('BEGIN',                /* NOW VIEW OTHER DATA IN */ CSR01480        OBJECT_ID,              /* 2ND WINDOW             */ CSR01490        OFFSET+WINDOW_SIZE,                                          CSR01500        WINDOW_SIZE,                                                 CSR01510        S(ORIG),                                                     CSR01520        'RANDOM',                                                    CSR01530        'REPLACE',                                                   CSR01540        RETURN_CODE,                                                 CSR01550        REASON_CODE);                                                CSR01560                                                                         CSR01570   DO  I = 1 TO NUM_WIN_ELEM;       /* CALCULATE NEW VALUE IN */ CSR01580 S(I+ORIG-1) = I-101;           /* WINDOW                 */ CSR01590   END;                                                                  CSR01600                                                                         CSR01610   CALL                                                                  CSR01620   CSRSCOT (OBJECT_ID,                                                   CSR01630        OFFSET+WINDOW_SIZE,                                          CSR01640        WINDOW_SIZE,                                                 CSR01650        RETURN_CODE,                                                 CSR01670        REASON_CODE);                                                CSR01680                                                                         CSR01690   CALL                                                                  CSR01700   CSRVIEW ('END ',                 /* END THE CURRENT VIEW IN*/ CSR01710        OBJECT_ID,              /* WINDOW                 */ CSR01720        OFFSET+WINDOW_SIZE,                                          CSR01730        WINDOW_SIZE,                                                 CSR01740        S(ORIG),                                                     CSR01750        'RANDOM',                                                    CSR01760        'RETAIN ',                                                   CSR01770        RETURN_CODE,                                                 CSR01780        REASON_CODE);                                                CSR01790                                                                         CSR01800   CALL                                                                  CSR01810   CSRVIEW ('BEGIN',                /* NOW GO BACK TO THE VIEW IN */ CSR01820        OBJECT_ID,              /* THE 1ST WINDOW         */ CSR01830        OFFSET,                                                      CSR01840        WINDOW_SIZE,                                                 CSR01850        S(ORIG),                                                     CSR01860        'RANDOM',                                                    CSR01870        'REPLACE',                                                   CSR01880        RETURN_CODE,                                                 CSR01890        REASON_CODE);                                                CSR01900                                                                         CSR01910   CALL                                                                  CSR01920   CSRREFR (OBJECT_ID,              /* REFRESH THE DATA IN 1ST   */  CSR01930        OFFSET,                 /* WINDOW                */  CSR01940        WINDOW_SIZE,                                                 CSR01950        RETURN_CODE,                                                 CSR01960        REASON_CODE);                                                CSR01970                                                                         CSR01980   CALL                                                                  CSR01990   CSRVIEW ('END ',                 /* END THE VIEW IN 1ST WINDOW */ CSR02000        OBJECT_ID,                                                   CSR02010        OFFSET,                                                      CSR02020        WINDOW_SIZE,                                                 CSR02030        S(ORIG),                                                     CSR02040        'RANDOM',                                                    CSR02050        'RETAIN ',                                                   CSR02060        RETURN_CODE,                                                 CSR02070        REASON_CODE);                                                CSR02080                                                                         CSR02090   CALL                                                                  CSR02100   CSRIDAC ('END  ',                /* TERMINATE ACCESS TO THE*/ CSR02110        'TEMPSPACE',            /* HIPERSPACE OBJECT      */ CSR02120        'MY FIRST HIPERSPACE ENDS HERE ',                        CSR02130        'YES',                                                       CSR02140        'NEW',                                                       CSR02150        'UPDATE',                                                    CSR02160        WINDOW_SIZE,                                                 CSR02170        OBJECT_ID,                                                   CSR02180        HIGH_OFFSET,                                                 CSR02190        RETURN_CODE,                                                 CSR02200        REASON_CODE);                                                CSR02210                                                                         CSR02220   FREE S;                                                               CSR02230  END CRTPLN3;                                                           CSR02260 *********************************************************************** *                                                                     * *                                                                     * *  JCL TO COMPILE AND LINKEDIT PL/I PROGRAM.                  * *                                                                     * *                                                                     * *                                                                     * *********************************************************************** //PLIJOB   JOB                                                          00010007 //*                                                                     00041001 //*  PL/I Compile and Linkedit                                          00042001 //*                                                                     00043001 //*  Change all CRTPLNx to CRTPLNy                                  00044001 //*                                                                     00045001 //GO   EXEC PLIXCL                                                  00050000 //PLI.SYSIN DD DSN=WINDOW.XAMPLE.LIB(CRTPLN3),DISP=SHR              00060008 //LKED.SYSLMOD DD DSN=WINDOW.USER.LOAD,UNIT=3380,VOL=SER=VM2TSO,    00070000 // DISP=SHR                                                             00080000 //LKED.SYSIN DD *                                                       00090000   LIBRARY  IN(CSRSCOT,CSRSAVE,CSRREFR,CSRSAVE,CSRVIEW,CSRIDAC)      00100001   NAME CRTPLN3(R)                                                       00110008 /*                                                                      00120000 //*                                                                     00121001 //* SYS1.CSSLIB is source of CSR stubs                          00130001 //*                                                                     00190000 //LKED.IN DD DSN=SYS1.CSSLIB,DISP=SHR                           00200000 *********************************************************************** *                                                                     * *                                                                     * *  JCL TO EXECUTE.                                                * *                                                                     * *                                                                     * *                                                                     * *********************************************************************** //PLIRUN   JOB MSGLEVEL=(1,1)                                           00010000 //*                                                                     00011001 //*   EXECUTE A PL/I TESTCASE                                           00012001 //*                                                                     00013001 //GO   EXEC PGM=CRTPLN3                                             00020000 //STEPLIB  DD  DSN=WINDOW.USER.LOAD,DISP=SHR,                       00030000 // UNIT=3380,VOL=SER=VM2TSO                                             00040000 //SYSLIB   DD  DSN=CEE.SCEERUN,DISP=SHR                             00050000 //SYSABEND DD SYSOUT=*                                                  00070000 //SYSLOUT  DD  SYSOUT=*                                                 00080000 //SYSPRINT DD  SYSOUT=*                                                 00090000

На базе этого языка до сих пор работают системы из отрасли финансов, банкинга, страхования. Его также применяют и некоторые правительственные организации.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Сталкивались ли вы с одним из этих ЯП за последние пять лет?

3.64% Да, причём с одним из них я работаю до сих пор.22
19.67% Да, приходилось.119
76.69% Нет, вообще никогда, наверное, и не столкнусь уже.464

Проголосовали 605 пользователей. Воздержались 57 пользователей.

ссылка на оригинал статьи https://habr.com/ru/articles/794300/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *