понедельник, 8 декабря 2014 г.

[prog.flame] ФП приходит в мейнстрим и... занимает нишу COBOL?

Просматривая свежий пост про пример использования парсинга XML в Scala на eax.me, поймал себя на неожиданной мысли: где-то что-то отдаленно похожее я уже видел. Кстати говоря, пост хороший. Имхо, именно так нужно привлекать внимание людей к языкам/технологиям/подходам/парадигмам. Небольшой, но практичный пример, вполне себе самоценный и самодостаточный. Собственно, пупуляризаторам чего бы то ни было (в том числе и ФП), на заметку.

Довольно симпатично выглядят некоторые фрагменты кода в примере, скажем, вот этот:

val postsMap =
  postsXml.map{
    n => ( (n \ "thread" \ dsqid).text.toLong,
           (n \ "createdAt").text,
           (n \ "author" \ "name").text,
           (n \ "message").text,
           n
         )
  }.filter{
    case t =>
      (! (t._5 \ "isDeleted").text.toBoolean ) &&
        (! (t._5 \ "isSpam").text.toBoolean )
  }.groupBy(_._1).filter{
    case (k,v) => threadsMap.get(k).isDefined
  }.map{
    case (k,v) =>
      ( threadsMap(k),
        v.map(t => (t._2, t._3, t._4) ).toArray.sortBy(_._1)
      )
  }

Сперва подумалось, что, блин, обработка данных посредством конструкций из ФП выглядит весьма привлекательно. Хотя какая-то доля лишнего "синтаксического оверхеда" (с) таки присутствует. И что от него можно было бы избавиться. Но, если синтаксис будет сильно заточен под манипуляции над данными, то....

...то в памяти всплывают отрывочные воспоминания о такой штуке, как CODASYL. Был когда-то такой мертворожденный стандарт для работы с данными, представленными в иерархической и сетевой моделях данных. Базировавшийся на COBOL-е. А COBOL -- это же как раз язык для обработки данных.

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

      PROCEDURE DIVISION.
       CONTROL-PARA.
      *
      * CONTROL PARAGRAPH. DATABASE IS INVOKED AND PRIVACY
      * KEYS SPECIFIED. READS FIRST RECORD FROM INPUT FILE
      * AND CALLS MAIN PROCESSING ROUTINE UNTIL A DATABASE
      * ERROR OCCURS OR AN END OF FILE CONDITION IS SIGNALLED.
      * WHEN AN ERROR OCCURS THE ENTIRE TRANSACTION IS
      * ABORTED OTHERWISE IT IS SECURED.
      *
           OPEN INPUT CARINP.
      #    INVOKE DBMS.
      #    PRIVACY KEY FOR UPDATE OF ALL AREAS IS 'CAR-LOCK'.
      #    PRIVACY KEY FOR STORE OF RECORD DEPOT IS 'NEW-DEPOT'.
      #    PRIVACY KEY FOR INSERT OF SET DEPOT-CARS IS 'CAR-INPUT'.
      #    PRIVACY KEY FOR INSERT OF SET MECHANICS IS 'MECH-AMEND'.
      #    OPEN AREA CAR-AREA USAGE-MODE IS UPDATE.
      #    START TRANSACTION TRAN-ID, UPDATE.
           PERFORM DATA-INPUT.
           PERFORM PROCESS-TRANS UNTIL EOF OR DB-ERR.
           IF DB-ERR PERFORM ABORT-TRANS
           ELSE PERFORM END-TRANS.
      #    CLOSE ALL AREAS.
      #    EXIT DBMS.
           CLOSE CARINP.
           STOP RUN.

Но только в современном, модном и молодежном, ФП-шном стиле :)

PS. Ну и раз уж в кои-то веки затронул тему ФП, то чтобы два раза не вставать. Посмотрел видео доклада Сергея Зефирова (aka thesz) с недавней конференции f(by). Повеселил ответ Зефирова на вопрос про использование Haskell-я в mission critical приложениях (приблизительно на 48:00). Типа, напишу на Haskell-е генератор, который сгенерирует уже прикладной код на низкоуровневом языке приложения из Haskell-евского DSL-я. Ну, может в моделировании процессоров этот подход разумен. Однако, для какого-нибудь OZON-а или Pleer.Ru (не говоря уже про eBay и Amazon) их система онлайн-торговли есть самое что ни есть mission critical приложение. Забавно было бы посмотреть на попытку реализовать что-то подобное на Haskell-евском DSL-е, из которого бы генерировался PHP или Java, или даже C-шный код :) Понятно, что вопрос задавали про несколько другие mission critical приложения, но, AFAIK, современные системы управления сложным оборудованием, разрабатываемые с использованием стандарта DDS, это тоже очень и очень объемные задачки (например).

PPS. На счет COBOL-а, давным-давно достигшего "состояния бессмертности": #1 и #2.

Комментариев нет: