Описывать преимущества языка программирования задача неблагодарная и наврятли выполнимая. В свое время я написал на эту тему несколько статей. Все они были приняты общественностью очень прохладно. Те кто никогда не программировал на MUMPS ничего не поняли, мои доводы о преимуществе этого языка вызвали только недоумение. Те кто выучился на традиционных языках с трудом осваивают другие принципы. А для тех кто программировал на MUMPS мои рассуждения показались тривиальными и абсолютно очевидными. Оценить преимущества и недостатки языка невозможно основываясь только на наборе слов, какими бы правильными они не были. Любое познание это работа и не выполнив ее оценить язык нельзя. Все языки разные и как бы они не были похожи, чтобы начать на них программировать, надо погрузиться в их среду. А если языки разные то и затраты труда значительно возрастают. Доморощенные языки программирования возникают постоянно. Я себя так же отношу к их числу. И всегда на форумах авторам этих языков задают вопрос об их преимуществе перед другими языками. И не разу я не встречал вразумительного ответа на этот вопрос. Ответы обычно бывают скорее эмоциональные, чем вразумительные. Мол мне так нравится.

Но я все таки попытаюсь в очередной раз ответить на этот вопрос. Я ведь тоже себе его задаю. Изложение не будет коротким и потому прошу терпения.

Мое мнение это не истина в последней инстанции, но именно его я и попытаюсь изложить.

Далее я поведу речь о языке MUMPS хотя статья о языке MSH. MSH это логическое продолжение языка MUMPS и почти все что говорится о MUMPS в равной степени относится и к MSH. Такое изложение принято по причине того что MUMPS это реально работающая система, а MSH это еще только проект. Все что будет сказано о MUMPS легко проверить. Особенности MSH будут рассмотрены отдельно.

Чтобы что нибудь понять в настоящем, нужно заглянуть в прошлое. Появление первых трансляторов открыло новую эру в программировании. Свойства ЭВМ того времени наложили глубокий отпечаток на свойства трансляторов. Яркий представитель это Фортран. Трансляторы строились с учетом возможностей тех ЭВМ и несмотря на то что возможности изменились свойства в языках сохранились. Процесс создания языков программирования мне напоминает хаотичный процесс, когда языки создавались под конкретный проект, затем получали широкое распространение, по случайным причинам. А затем уже на их основе возникало великое множество других языков. Эти новые языки сохраняли рудименты тех первых языков программирования. Я конечно имею ввиду язык Си. А под рудиментами я подразумеваю систему типов. В ЯваСкрипте, PHP и других языках попытались ослабить систему типов, но попытка явно не доведена до своего логического конца.

Конечно к счастью все было не так однообразно. Были и языки которые разработаны на основе какой то идеи. Это такие языки как Кабол, Лисп и MUMPS. Идеи Кабола и Лиспа я не считаю перспективными и поэтому перейдем к MUMPS. Этот язык так же создавался под конкретный проект. Информационную систему и это свойство в нем заложено генетически. Я снимаю шляпу перед неизвестными мне создателями этого языка. Они полностью проигнорировали возможности современных для них ЭВМ и разработали язык исходя только из потребности создания информационных систем. Простота и надежность языка в большой степени определяется количеством сущностей, имеющихся в этом языке. Чем их меньше, тем проще и надежней язык. Но это требование вступает в противоречие с другим требованием к широкой функциональности и гибкости языка. Найти приемлемый баланс между этих ними и есть основная задача языка программирования. В MUMPS с моей точки зрения такой баланс найден идеально для разработки информационной системы. В основу языка положены данные. Это тот стержень вокруг которого построен весь язык. Данные в MUMPS представлены в виде только одной сущности. В виде Дерева. Это позволило полностью абстрагироваться от содержательной части данных. В дереве хранятся любые данные независимо от того что они из себя представляют. Да это и не важно до тех пор, пока мы не станем выполнять над ними операции. Но на этот случай разработчики придумали другое решение. Любое значение имеет три формы: строковую, числовую и логическую и в зависимости от операции операнды операции и результат приводится к необходимой форме. Структура данных в виде дерева позволяет легко моделировать на ней любые другие структуры. Структура дерева выбрана не случайно. Универсальность дерева и имеющиеся способы хранения позволяют осуществлять оптимальное обращение к данным. Разработчики пошли дальше они и внешние данные представили таком же виде. То есть все данные представлены в виде только одной сущности — дерева.

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

Управление данными в современных языках программирования является очень серьезной проблемой. Если управление данными на стеке еще можно признать удовлетворительной. То управление данными в куче уже нельзя. Попытка решить проблему с помощью сборщика мусора очень сомнительна. Запускается сборщик в случайное или заданное неизвестными алгоритмами моменты времени, с такими же случайными результатами их деятельности. В системах реального времени вообще неизвестно как их использовать. Применение сборщика никак не решает проблему фрагментации кучи и утечку памяти. В общем с моей точки зрения сборщик мусора плохое решение. Несмотря на это оно стало применяться в современных языках программирования все чаще. Я думаю от безисходности. Ручное управление данными это вообще катастрофа. Именно оно создает основную проблему во многих языках программирования. Основная масса ошибок порождена ручным управлением данными и как следствие сумасшедшим временем отладки и сопровождения. Проблема утечки памяти и фрагментации кучи представлена в этом случае во всей своей полноте. Именно из за нее мы имеем горы неотлаженных систем начиная с операционных систем. И эти системы в принципе не могут быть отлажены. Нам и в будущем предстоит жить в этом хаосе.

Только MUMPS благодаря своей организации данных не имеет этой проблемы. Данными полностью управляет язык. Никакого доступа к адресам значений программист не имеет. Более того значение может храниться в разные моменты времени в разных местах. Система не гарантирует место нахождения значения, но гарантирует надежный доступ к нему. Это фундаментальное свойство MUMPS является его главным достоинством и вытекает из организации его данных. Ни одна система ни со статической типизацией, ни с динамической этими свойствами обладать не может.

Организация данных в MUMPS имеет для самого языка фундаментальное значение. Для программирования на нем надо перестроить свое мышление. Первичны в этом языке данные и они требуют первоочередного внимания. Как будут спроектированы деревья от этого зависит все свойства будущей системы. Разговор о проектировании деревьев отдельная и очень важная тема, но для другого разговора. Если деревья спроектированы, дальше остается только написать программы их обслуживания. Работа с деревьями в языке ведется напрямую и поэтому промежуточных переменных минимум или почти нет. Проблемы типов в этом языке нет по определению. В MUMPS сообществе не подозревают о существовании проблемы типизации. Все входные данные всегда необходимо проверять, а для промежуточных данных спутать в программе число со строкой это еще надо умудриться. Хотя и это не приводит к фатальным последствиям из за наличия разных форм у значения. Для MUMPS Дерево это все. Это и структура хранения и управления данными и метод проектирования информационной системы. Перестрой ка мышления серьезная проблема, которая многим программистам закрыла дорогу в мир MUMPS. Но преодоление этой проблемы откроет дорогу в прекрасный и эффективный мир MUMPS.

Но деревья не единственное достоинство языка MUMPS. Сам язык спроектирован с учетом баланса простоты и функциональности очень удачно. При минимальном количестве сущностей язык имеет широкие функциональные возможности. По гибкости язык превосходит все известные мне языки. Здесь почти нет ограничения на применение переменной вместо константы. Конструкция языка допускает применение переменных в любых командах. Язык очень компактный, простой и предельно ясный. Его полное описание с примерами и объяснениями помещалось в тоненькой книжечке на 20 листов. И оно было исчерпывающим. Язык не имеет подводных камней и различных трактовок в зависимости от способа описания. В нем минимизировано количество недопустимых конструкций. Нет особого поведения в различных ситуациях. Достаточно разобраться с командами и можно начинать писать надежные программы.

В MUMPS уникальный набор команд. Еще в прошлом веке на заре создания первых языков в MUMPS на уровне языка была разработана лучшая до сих пор система асинхронного выполнения заданий. Очень простая и эффективная. Это команда Job, запускающая отдельное параллельное задание. Эта команда по синтаксису соответствует команде вызова подпрограмм с возможностью передавать параметры в задание обыкновенным списком параметров. Сами вызываемые задания по синтаксису ничем не отличаются от подпрограмм. Это также обычные метки в программном модуле. Эти подпрограммы могут быть вызваны как вызовом подпрограммы, так и вызовом задания. Другим средством обеспечивающим асинхронное выполнение являются команды чтения записи со временем ожидания. Команда блокировки Lock.

В MUMPS имеется распределенная система данных. Из MUMPS программы можно обращаться к дереву находящемуся на другом конце света как к своему дереву. Уникальную гибкость языку придает наличие в языке команды XECUTE и такие конструкции языка как косвенный синтаксис. Команда XECUTE позволяет выполнить любые конструкции языка MUMPS переданные команде в виде строки. Команда транслирует строку и затем исполняет ее. Подобная команда мне встретилась только в JavaScript но там она является инородным телом и навряд ли может быть использована из за свойств самого языка. Подобные попытки насколько мне известно предпринимались и в некоторых реализациях языка Паскаль. Насколько эти попытки были удачными я не знаю, готовых реализаций я не встречал. Но понятно что такая необходимость имеется. Косвенный синтаксис так же предает языку гибкость. Имя переменной следующая за знаком косвенного синтаксиса трактуется как переменная значение которой и используется в конструкции языка вместо имени переменной. Язык не имеет ссылок это ограничивает его возможности при передачи фактических параметров в программы. Эта проблема в MUMPS была успешно решена путем передачи не только значений переменных, но их имен. Среди фактических параметров может быть передано имя переменной, над которой и будут производиться манипуляции в вызванной программе. Само понятие ссылки стало не нужным. Наличие ссылок в языках программирования колосальная проблема и это один из основных факторов порождения ошибок и как следствие ненадежности языков программирования. Системы основанные на использовании ссылочных данных не могут быть надежными по определению. В MUMPS есть и менее значительные, но тем не менее приятные конструкции. В MUMPS все конструкции языка соответствуют своим командам, в нем нет отдельного выражения присвоения значения переменной. Такое выражение присутствует в команде Set. Почти на любую команду, в том числе команду Set может быть наложено условие ее выполнения и тогда она будет выполняться только при истинности такого условия. Это придает языку большую гибкость. Те кто программируют на MUMPS широко пользуются этой возможностью. Эта возможность расширяет гибкость управления ходом выполнения программы.

Про систему обработки ошибок в MUMPS можно сказать только то что она существует. Система команд простая и ясная, логически очень понятная и очевидная.

Совокупностью подобными свойствами не обладает ни один язык программирования. Все эти свойства языка делают его эффективным и надежным средством. Разработка, сопровождение и внедрение систем на MUMPS требует на порядки меньше затрат труда по сравнению с системами написанными на других языках программирования.

Теперь о грустном. Мы покидаем наш почти идеальный мир и спускаемся в нашу грустную реальность.

Языка программирования MUMPS как самостоятельной сущности не существует. Сейчас мы имеем коммерческие реализации базы данных с привязанным к ним MUMPS. Это CACHE и miniM. Широкого распространения они не получили по понятным причинам связанным с необходимостью оплачивать как лицензии на фиксированный набор ресурсов так и техническую поддержку. Существует и довольно надежная и бесплатная база данных с MUMPS. Это GTM но она локализована только в Linux. Сегодня существующее положение поставлено с ног на голову. Положение языка MUMPS аховое. Область его использования стремительно сокращается по вине разработчиков систем MUMPS.

Язык MUMPS должен быть создан как полнофункциональный язык программирования. Все необходимые свойства у него имеются. Хотя в таком виде каком он существует сейчас это навряд ли целесообразно.

Последний стандарт MUMPS был выпущен в 1995 году и он принципиально мало чем отличался от предыдущей редакции. Стандартизация это хорошая вещь она позволила долгое время сохранять приемственность программного обеспечения. Затруднила размытие принципов языка при реализации языка. Но стандартизация имеет и обратную сторону. Она замораживает развитие языка. В языке накапливаются устаревшие конструкции, новые идеи не получают поддержки и это приводит к деградации и постепенному отмиранию языка. Период эволюционного развития заканчивается и для сохранения языка необходим качественный скачек.

В состоянии застоя и находится MUMPS. Архаичность языка бросается в глаза с первым же знакомством с MUMPS. Но достоинства MUMPS никуда не делись. Необходимо только доработать синтаксис языка, доведя его до современных требований. И разработать реализацию именно языка, а не базы данных.

Такую доработку я выполнил, создав язык MSH. Потратил на это я десятилетия. В язык было добавлено объектное программирование, обработка событий, передача в подпрограммы переменного числа параметров, команды наследования и константы, команда Case и операция выбора, итераторы по обходу данных и понятие блочных команд. Доработана команда Lock, расширена ее функциональность за счет блокировки по чтению и записи. Изменен косвенный синтаксис и система локализации переменных. Изменен синтаксис связанный с применением пробелов в командах. В таком виде это вполне современный язык. Осталось только реализовать его. Работу по реализации этого проекта я уже начал. Работоспособность языка уже проверил.

Более детально с изменениями языка MSH по сравнению с языком MUMPS можно познакомиться в статье на Хабре или тут.

Комментарии (56)


  1. RealPeha
    11.01.2022 15:14
    +1

    Вы видимо забыли текст проверить перед публикацией


    1. Boomburum
      11.01.2022 15:27

      Проблемка с катом была, поправил :)


  1. zvszvs
    11.01.2022 15:20
    +8

    А под рудиментами я подразумеваю систему типов. В ЯваСкрипте, PHP и других языках попытались ослабить систему типов, но попытка явно не доведена до своего логического конца.

    Скоро недостатком станет не только строгая типизация, но и вообще "компилятор от меня что-то хочет".
    Меня, как "олдскула" это просто убивает...


    1. amarao
      11.01.2022 15:46
      +3

      Процессор почти не накладывает ограничений на программиста. Хочешь, выполняй следующую инструкцию со смещением в самой инструкции. Хочешь - делай return без call. Хочешь - хоть бесконечный переполняющийся стек.

      Ассемблер - самый мягкий не типизированный язык из возможных.


      1. zvszvs
        11.01.2022 16:11
        +1

        И что? Правил дорожного движения тоже когда-то не существовало. Лучше было?

        Я лишь хочу отметить, что колличество программистов растет, их профессиональный уровень падает (интеллект поколений приблизительно одинаков, но людей-то нужно больше), а языки становятся все более "интеллектуальными".

        Посмотрим, к чему все приведет, но как бы не кончилось skynet'ом...


        1. amarao
          11.01.2022 19:05

          Если бы ваши предположения были верными, мы бы имели сейчас код того же качества, как был в 1949. Он не такой. Даже близко не такой.


          1. z0ic
            12.01.2022 03:45

            Хуже ?


            1. amarao
              12.01.2022 13:54

              До Маргарет Гамильтон программирование считалось особой дисциплиной хардварщиков и было в аховом состоянии.

              На всякий случай, goto considered harmful вышло в 1968.

              Представьте себе качество кода до этого.


        1. misha_shar53 Автор
          13.01.2022 07:26

          Правила это необходимо, только они не должны превращаться во вредные ограничения. В свое время некоторые ограничения были вызваны либо возможностями железа, либо возможностями мозгов. Ограничения давно прошли, а правила остались.


      1. misha_shar53 Автор
        11.01.2022 16:32

        Безусловно Ассемблер самый гибкий из всех языков программирования.


        1. forthuser
          11.01.2022 16:48
          +1

          А, в чём гибкость ассемблера, к примеру, в сравнении с Лисп и/или Форт?

          Проще, может быть, но гибкость это не синоним простоты.


  1. forthuser
    11.01.2022 15:36
    +1

    Осталось, к примеру, только сравнить решения на MSH с каким то количеством решений на других языках с ресурса roettacode.org.
    а лучше, на таком замечательном языке как MSH сделать Вау проект и на нём продемонстрировать все его сильные стороны! ????

    P.S. На том же MUMMS 109 решений разных задач с rosettacode.org


    1. misha_shar53 Автор
      11.01.2022 16:40

      Согласен. Осталось только разработать язык MSH, а потом можно и сравнивать.


      1. AntoxaM
        11.01.2022 16:44
        +1

        Такую доработку я выполнил, создав язык MSH.

        Гм, а это что значит?


  1. amarao
    11.01.2022 15:48

    Посмотрел. Язык пахнет 80ыми (или даже 70ыми). Много КАПСОМ КЛЮЧЕВЫХ СЛОВ, слишком подробно тривиальные вопросы прописываются.


  1. AntoxaM
    11.01.2022 16:32
    +5

    в очередной раз статья про ЯП без примеров. Пришлось идти в вики и смотреть на достаточно спорный синтаксис MUMPS.

    Разработка, сопровождение и внедрение систем на MUMPS требует на порядки меньше затрат труда по сравнению с системами написанными на других языках программирования.

    Это заявление как-то голословно звучит. Как вы сравнивали, с чем сравнивали, на каких системах?


    1. forthuser
      11.01.2022 16:41

      У джентельменов принято верить на слово! ????


      1. misha_shar53 Автор
        11.01.2022 16:53
        -7

        Вот именно.


    1. misha_shar53 Автор
      11.01.2022 16:46
      -7

      Заявление основано на многолетнем опыте разработки, внедрении и сопровождении информационных систем. Это мой личный опыт. Так что это утверждение проверено.


      1. zvszvs
        11.01.2022 16:52
        +2

        Это мой личный опыт. Так что это утверждение проверено.

        Это называется - субъективняая оценка. Чтобы что-то "проверить", нужны объективные критерии проверки. Они имеются?


      1. AntoxaM
        11.01.2022 17:25
        +1

        Возможно на ваших задачах, это проверено, но вот как понять будет ли это так на моих? Стоит ли мне выкинуть условные kotlin, C#, js, C++, и т.д. и срочно перейти на MUMPS ?

        Из тех преимуществ, что вы перечислили, мне кажется, почти всё есть практически в каждом современном языке, либо в библиотеке для него.


        1. misha_shar53 Автор
          11.01.2022 17:47
          -3

          У меня такое впечатление, что статью никто не прочитал дальше анотации. MUMPS существует только в виде языка базы данных. У этого языка есть потенциал языка программирования но подходящей реализации нет. MSH это вообще проект а не реализация языка. Речь идет только о потенциале этого типа языков.

          В современных языках отсутствует управление данными используемое в MUMPS, что обеспечивает этому языку простоту и надежность и в конечном счете снижает затраты на разработку и сопровождение. Современные языки программирования многозадачность поддерживают на уровне библиотек операционной системы. То есть в языках отсутствует какая либо поддержка многозадачности. В MUMPS многозадачность реализована на уровне языка. В MSH предпринята попытка реализовать события в самом языке. В Delphi как и в других языках программирования обработка событий реализована в виде главного цикла. Попасть внутрь которого еще та задачка.


          1. forthuser
            11.01.2022 18:27
            +1

            У меня такое впечатление, что статью никто не прочитал дальше анотации.

            В статье нет посрамления используемых языков в майнстрим по сравнению с дизайном языка MSH.
            т.е. некоторой даже интрижки и поэтому слова об «всемогуществе» представленного в задумках языка MSH плохо воспринимаются.


  1. AntoxaM
    11.01.2022 18:22
    +1

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

    Про MSH у вас написано:

    Такую доработку я выполнил, создав язык MSH. Потратил на это я десятилетия.

    Спустя десятилетия, я ожидал что-то более внятное, а теперь оказывается это рассказ про шкуру не убитого медведя.

    Про многозадачность, то как вы описали её - очень похожее есть в куче языков. Хотелось бы сравнения с корутинами, горутинами, async/await - чем они хуже MSH?

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


    1. misha_shar53 Автор
      11.01.2022 22:13

      На уровне операционной системы можно все. На асемблере можно все. Но разбираться с вызовами ОС задача не для слабонервных.


      1. berez
        11.01.2022 22:59
        +2

        При чем тут ОС и ассемблер? Многозадачность уже давно встроена в некоторые языки, причем безо всяких библиотек.


      1. AntoxaM
        12.01.2022 02:12

        Звучит дико. Что вы такое делаете, что вам нужен ассемблер, тонкости ос в 2022???Современные языки могут в многопоточность и/или асинхронность без всяких ассемблеров. Почитайте уже про современные языки, не ограничивайтесь языками прошлого века.


  1. unsignedchar
    12.01.2022 00:22
    +6

    Статья о языке программирования без единой строки кода. Красивое.


  1. michael_v89
    12.01.2022 13:02

    Но я все таки попытаюсь в очередной раз ответить на этот вопрос.
    Разработка, сопровождение и внедрение систем на MUMPS требует на порядки меньше затрат труда по сравнению с системами написанными на других языках программирования.
    Оценить преимущества и недостатки языка невозможно основываясь только на наборе слов, какими бы правильными они не были. Любое познание это работа и не выполнив ее оценить язык нельзя.

    Так давайте проверим. Приводите любую программу на MUMPS длиннее 10 строк, которая делает какую-то полезную работу, и которую, как вам кажется, будет более трудозатратно написать на другом языке программирования, а я напишу, и мы сравним.


    1. forthuser
      12.01.2022 13:30

      Вряд ли это заинтересует автора поста.
      т.к. к примеру, есть сайт rosettacode.org с решением пополняемых задач на разных языках программирования на нём эти решения и можно сравнить и в рамках языка MUMPS.

      P.S. Но, у автора же, конечно нет ещё реализации его улучшенного MUMPS, языка MSH, то, вероятно придётся запасаться попкорном для появления каких то результатов такого гипотетического сравнения.


    1. misha_shar53 Автор
      12.01.2022 13:39

      Улучшенного MUMPS еще нет, придется ограничиться стандартным.

      Prog Set ^A[1,2,3]="Привет Мир"


      1. michael_v89
        12.01.2022 14:49

        Она не длиннее 10 строк и не делает полезную работу. Не очень понятно, как вы хотите сравнивать трудозатраты на программе длиной в 1 строку.


        Но на PHP код будет такой:


        $a[1][2][3] = "Привет Мир";

        На MUMPS 31 символ, на PHP 27. На PHP и меньше длина кода в символах и меньше логических конструкций, при том что я добавил пробелы для улучшения читаемости. На приведенном вами примере PHP оказался лучше MUMPS по тем критериям, которые можно измерить для такого объема кода. Делаем вывод, что ваше утверждение "требует на порядки меньше затрат труда" неверно?


        1. misha_shar53 Автор
          12.01.2022 14:56

          Ничего общего. У меня приведен не код строки , а программа. И даже строки кода не имеют между собой ничего общего. Они выполняют разные задачи. Приведите программу выполняющую ту же работу.


          1. michael_v89
            12.01.2022 15:07

            И у меня, представьте себе, тоже программа. Ее можно запустить вот так:


            php -r '$a[1][2][3] = "Привет Мир";'

            Ничего общего.

            В таком случае опишите отличия.


            Приведите программу выполняющую ту же работу.

            А почему вы от меня требуете формального соблюдения ваших критериев, если сами не соблюдаете мои? Давайте уж тогда начнем с того, что я попросил вас привести программу длиной более 10 строк, которая выполняет какую-то полезную работу, а не является абстрактным Hello World. Вы ведь сетуете на то, что программистам неинтересен MUMPS, говорите про "разработку, сопровождение и внедрение систем", вот и покажите пример из тех, для которых обычно требуется разработка, сопровождение и внедрение, то есть делающий полезную работу.


          1. unsignedchar
            12.01.2022 15:28

            Приведите программу выполняющую ту же работу.

            А какую работу выполняет ваша программа? Я просто не смог ее запустить — можно ли считать, что она не выполняет никакой работы? ;)


            1. misha_shar53 Автор
              12.01.2022 16:33

              Я от вас ничего не требую. Приведенная команда одна из самых примитивных в MUMPS. Прежде чем сравнивать скорость и количество байт, надо хотя бы сравнить функционал. Попытайтесь разобраться с функционалом MUMPS, может быть после этого можно будет вести предметное обсуждение его возможностей.


              1. forthuser
                12.01.2022 16:45

                Бейсик круче любого MUMPS и MSH!
                Попробуйте доказать, что это не так. ????

                P.S. Кстати встретился какой то язык M ответвление MUMPS?
                в этом посте блога Join the M revolution—Get your tools
                (08 Mar 2012)

                Здесь, если кому надо, учебный материал The Mumps Programming Language


                1. forthuser
                  12.01.2022 19:37

                  A Homepage for MSM-Workstation

                  What is MSM-Workstation?

                  In brief, it's an implementation of ANSI Standard M that runs on Microsoft Windows 95, Windows 98, Windows NT 4.0 and Windows 2000. As well as implementing most of X11.1-1995 (the M language) it also implements the M Windowing API (MWAPI), integrating with the GUI facilities of its host environment. Developed by Micronetics Design Corporation, version 2.0.0 was released to the world shortly before the MSM product line was acquired by InterSystems Corporation.


              1. michael_v89
                12.01.2022 16:49

                Я от вас ничего не требую.

                Вы перепутали, кому отвечаете, второй комментарий не мой, его автор не говорил, что вы что-то требуете.
                И нет, выражение "Приведите программу" в соответствии со словарем русского языка это именно требование.


                И всегда на форумах авторам этих языков задают вопрос об их преимуществе перед другими языками. И не разу я не встречал вразумительного ответа на этот вопрос. Ответы обычно бывают скорее эмоциональные, чем вразумительные. Мол мне так нравится.
                Но я все таки попытаюсь в очередной раз ответить на этот вопрос.
                Попытайтесь разобраться с функционалом MUMPS

                Какая-то плохая у вас попытка. "Я попытаюсь ответить, в чем преимущество перед другими языками: попытайтесь разобраться сами". Скорее эмоциональная, чем вразумительная.


                Так вы ответите, в чем отличие моей программы от вашей, или вопрос о преимуществах так и останется без ответа?
                Я, собственно, догадываюсь, что вы имеете в виду, и это повод для дальнейшего обсуждения преимуществ, но додумывать за вас не хочу.


              1. michael_v89
                12.01.2022 21:22
                +1

                Ладно, порассуждаю сам. Вы видимо имеете в виду, что это значение автоматически записывается на диск в специальный файл. И тут мы приходим к критерию "полезная", который я написал в первом сообщении. С какой целью нам надо записывать на диск значение по ключу, тем более какие-то промежуточные вычисления?


                Я могу записать в одной транзакции что-то типа такого?


                ^A["account","234","sum"]-=100
                ^A["order","123","status"]="paid"

                То есть так, чтобы записались либо оба значения, либо ни одного, если вдруг после выполнения первой строки произойдет сбой, и сервер выключится? Я думаю, нет.


                Или допустим у нас сайт с посещаемостью 1 млн пользователей в сутки, и один сервер не справляется с нагрузкой. Я могу сделать так, чтобы это записанное значение реплицировалось на другой сервер, и чтобы процессы, которые хотят его просто прочитать без записи, читали его оттуда, чтобы разгрузить основной сервер? Я думаю, тоже нет.


                И еще есть вопрос, что будет с нашей системой, если для каждого запроса из 1 млн мы будем значения промежуточных переменных записывать в файл? Тем более в один и тот же файл на SSD. Она и работать будет в десятки раз медленнее, то есть максимально возможная посещаемость будет уже не миллион, и SSD-диски будут заметно быстрее изнашиваться.


                Какая тогда практическая польза от такой записи в файл? Для этих целей лучше хранить значения в оперативной памяти. А эта возможность есть в любых языках программирования.
                Видите, сколько ситуаций можно придумать, в которых эта возможность создает проблемы, и использовать ее не надо. Поэтому я и предложил взять в качестве примера полезную программу, для которой не надо будет додумывать ситуации использования.


                А я могу записать значение


                ^A["order","123","created_at"]="2022...";
                ^A["order","123","status"]="paid";

                а потом прочитать его по ключу ^A["order","123"] в виде ["created_at": "2022...", "status": "paid"], чтобы отправить его например в виде JSON в качестве ответа Web API? Насколько я понял из документации, тоже нет. Ну и зачем мне тогда такие ассоциативные массивы, если каждое свойство объекта надо доставать по отдельности?


                И если это все-таки зачем-то понадобится, на PHP (да и в любом языке программирования общего назначения), можно написать пару функций, которые будут делать то же самое. Их надо написать 1 раз, и они будет работать для всего остального кода независимо от его размера. Можно написать не на PHP, а на C в виде расширения PHP, и тогда в исходном коде программы их не будет. Всего-то 60 строк, и получаем возможность, которая есть в MUMPS, и даже больше, так как можно использовать составные значения, а не только строки с числами.


                w(['A',1,2,3],'Привет Мир');
                w(['A','orders','123','created_at'],'2022-01-10 12:34:00');
                w(['A','orders','123','status'],'paid');
                
                $tmp = r(['A',1,2,3]);
                var_dump($tmp);
                $tmp = r(['A','orders','123']);
                var_dump($tmp);
                
                /*
                string(19) "Привет Мир"
                array(2) {
                  'created_at' => string(19) "2022-01-10 12:34:00"
                  'status' => string(4) "paid"
                }
                */

                Скрытый текст
                function w(array $key, $value)
                {
                    $file = 'db.txt';
                    $fp = fopen($file, 'c+');
                    if (flock($fp, LOCK_EX)) {
                        $contents = fread($fp, 1024*1024);
                        $data = json_decode($contents, true) ?: [];
                
                        $storage = &$data;
                        $lastElement = array_pop($key);
                        foreach ($key as $element) {
                            if (!array_key_exists($element, $storage)) {
                                $storage[$element] = [];
                            }
                            $storage = &$storage[$element];
                        }
                
                        $storage[$lastElement] = $value;
                        unset($storage);
                
                        fseek($fp, 0, SEEK_SET);
                        $contents = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
                
                        fwrite($fp, $contents);
                
                        fflush($fp);
                        flock($fp, LOCK_UN);
                    } else {
                        throw new RuntimeException('Cannot get lock');
                    }
                
                    fclose($fp);
                }
                
                function r(array $key)
                {
                    $file = 'db.txt';
                    $fp = fopen($file, 'c+');
                    $value = null;
                
                    if (flock($fp, LOCK_EX)) {
                        $contents = fread($fp, 1024*1024);
                        $data = json_decode($contents, true) ?: [];
                
                        $value = $data;
                        foreach ($key as $element) {
                            if (!array_key_exists($element, $value)) {
                                $value = null;
                                break;
                            }
                            $value = $value[$element];
                        }
                
                        flock($fp, LOCK_UN);
                
                    } else {
                        throw new RuntimeException('Cannot get lock');
                    }
                
                    fclose($fp);
                
                    return $value;
                }


                1. unsignedchar
                  12.01.2022 23:41

                  Я правильно понял, это как basic но со встроенной базой данных?


                  1. michael_v89
                    13.01.2022 00:04

                    Примерно так, да. Наверно даже получше, чем basic, для 70-х было довольно прогрессивно.


                1. misha_shar53 Автор
                  13.01.2022 03:05
                  -1

                  Да очень убедительно. Замена одной строки программы, чуть ли не целой программной системой. Убедили.


                1. misha_shar53 Автор
                  13.01.2022 04:10

                  из приведенного примера очевидно, что адекватного примера на замену одной строки MUMPS у вас нет, поэтому пытаетесь подменить вопрос о функционале, вопросом о полезности. Это разные темы. Есть прекрасная украинская пословица: В огороде бузина, а в Киеве дядька.


                  1. unsignedchar
                    13.01.2022 08:08

                    Так расскажите о функционале вашей сакральной строки. Что в этом хелловорде особенного.


                  1. michael_v89
                    13.01.2022 08:10
                    +2

                    Да очень убедительно.
                    адекватного примера на замену одной строки MUMPS у вас нет

                    Я вам еще раз напомню, что вы проигнорировали мой изначальный критерий адекватного примера о размере и полезности программы. Это уже само по себе неубедительно с вашей стороны в разговоре о возможностях языка. Я лишь продолжил разговор с неубедительным примером, который вы сами предложили.


                    Также напомню, что это вы хотели тут кого-то убедить, для чего и написали эту статью. Причем не одну. А как только разговор зашел о практическом применении, почему-то начали уходить от темы в стиле "зато смотрите как он умеет". Ну умеет, и что, зачем кому-то его использовать?


                    Замена одной строки программы, чуть ли не целой программной системой.

                    У меня и чтение и запись по произвольному ключу занимают одну строку, как и в вашей программе.


                    А MUMPS это разве не программная система? Там тоже кто-то взял и написал код для сохранения в файл, и занимает он гораздо больше 1 строки.


                    И почему кстати критерием должна быть только запись в файл? В PHP есть функция json_encode(), которая переводит объекты сложной структуры в JSON-представление. Это тоже делается одной строкой. Сколько строк вам понадобится для реализации этого в MUMPS? Раз у вас критерий "в язык это не встроили", значит он проигрывает по этому критерию.


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


                    подменить вопрос о функционале, вопросом о полезности

                    1. Вы сами указали критерий "разработка, сопровождение и внедрение систем". Бесполезные системы никто не сопровождает и не внедряет.
                    2. Я ничего не подменял, мой код имеет тот же функционал, что и ваш.


                    1. misha_shar53 Автор
                      13.01.2022 09:19
                      -1

                      Полезность программного обеспечения отдельная и очень серьезная тема, требующая как минимум отдельной статьи. Будет вдохновение обязательно напишу отдельную статью на эту тему. К свойствам языка она имеет косвенное отношение. Прояснить эту тему в пределах комментариев не представляется возможным. Сомнений в том что на MUMPS можно писать полезные программы у меня нет. Создано большое количество информационных систем которые функционируют до сих пор по всему миру. И у меня имеется опыт создания таких информационных систем на MUMPS.


                      1. michael_v89
                        13.01.2022 09:51

                        Полезность программного обеспечения отдельная и очень серьезная тема, требующая как минимум отдельной статьи.

                        Нет, в контексте сравнения возможностей 2 языков она не требует отдельной статьи. Она требует только пару десятков строк кода. И в пределах комментариев их вполне можно написать.


                        К свойствам языка она имеет косвенное отношение.

                        Хороший язык, на котором нельзя написать полезную программу? Это какой-то нонсенс. Зачем кому-то использовать такой язык?


                        Сомнений в том что на MUMPS можно писать полезные программы у меня нет.

                        То есть вы предлагаете всем использовать этот язык, потому что лично у вас нет сомнений? Извините, но вы не настолько известны в области программирования, чтобы верить вам на слово. Да и никому не надо верить на слово в этих вопросах. Код лучшее доказательство. Есть код, показывайте. Нет, значит вразумительного ответа на вопрос из статьи вы не дали.


                      1. misha_shar53 Автор
                        13.01.2022 11:33

                        Я разработал сервер системы бухучета, по функционалу примерно как 1С мы втроем ее внедряем и сопровождаем. Работает годами даже без нашего сопровождения. Хотите попробовать могу выслать можете сравнить.


                      1. michael_v89
                        13.01.2022 11:48

                        Сервер это слишком много кода для анализа и переписывания на другом языке. Как я и сказал, лучше выбрать участок кода, который, как вам кажется, будет более трудозатратно написать на другом языке программирования. Для определенности можем взять длину 100-200 строк.


                      1. forthuser
                        13.01.2022 13:56

                        У меня был опыт написания части бухгалтерской системы сделанной на Турбо Бейсик с «реляционной СУБД» в рамках этой же реализации под ДОС.
                        И о чём это говорит?
                        Да, ни о чём, кроме полученного какого то субъективного опыта.

                        Вы считаете свой опыт абсолютным критерием истины в конкуретной среде других существующих решений как той же 1С?

                        P.S. В плане одного из элементов дизайна языка M интересно выглядит возможность сокращения в написании слов языка, но думаю IDE всё же должна предоставлять возможность по отображению программы в полном варианте слов, если есть такой запрос к ней.


                      1. unsignedchar
                        13.01.2022 09:59
                        +2

                        Сомнений в том что на MUMPS можно писать полезные программы у меня нет.

                        Так никто и не сомневался, что полезные программы можно писать на чем угодно, хоть и на brainfuck. Вопрос в целесообразности. Вы так и не ответили на простой вопрос: что легко и просто делается на MUMPS и нелегко и непросто на любой другом современном языке?


            1. misha_shar53 Автор
              12.01.2022 19:56
              -1

              Это рабочая программа. Она выполняется в любой MUMPS системе.Как она может не запускаться у вас ума не приложу. Приметивнее программу трудно придумать. Вы что то не разобрались. На какой MUMPS системе вы ее запускали? Дает она именно тот результат который определяется приведенной в программе командой. Кому интересно может обратиться к документации по MUMPS.


              1. unsignedchar
                12.01.2022 20:30

                Ну вот, обычного линукса уже недостаточно ;)
                Ок, где взять MUMPS систему?


                1. AntoxaM
                  12.01.2022 21:04

                  Отвечу за автора. Я вот такое нашёл https://github.com/programarivm/mumps-examples с примерами и инструкцией как запустить. Посмотрел примеры, для себя всё понял, запускать не стал.

                  Возможно, как скриптовый язык для систем с которыми он идёт, он не плох(хоть я и сильно сомневаюсь), но всерьёз mumps сравнивать с нормальными языками - просто бессмысленно.


  1. valis
    12.01.2022 16:56
    +3

    О боже - я это дочитал до конца! И ничерта не понял. Потом открыл Вики и как понял.

    Судя по профилю автор целиком и полностью застрял даже не в 70-х где тоже были серьезные ЯП, а скорее в каком-то вакууме конкретных прикладных задач если считает идеи LISP которые живут в современном и популярном языке Clojure безперспективными.

    Просто попробуй изучить тот же Golang - не просто выучить синтаксис, а углубится в философию, прочитать про внутренности и как они работают. Может тогда откинешь часть своих идей, которые никак не дружат с информатикой