Интерпретатор MSH
Интерпретатор языка MSH
Предлагаю вашему вниманию свое видение идеального языка. В предыдущих своих статьях я уже излагал свое представление об идеальном языке От MUMPS к MSH Особенности и отличия языка программирования MSH от MUMPS.
Отзывы были в основном негативные. После их прочтения отзывов я с удивлением обнаружил, что в мире языков программирования все уже очень идеально. Но меня грызут смутные подозрения, что все не так хорошо в этом мире. Языков конечно уже очень много, но многообразия концепций языков не наблюдается.
Если отбросить мелкие украшательства языков, то таких концепций несколько.
- Объектное программирование.
- Управление данными, типизация.
- Передача переменного числа параметров в процедуры и функции.
- Управление процессом выполнения.
Из решения этих проблем и складываются свойства того или иного языка программирования.
Объектное программирование
По моему это важная концепция и она обязательно должна присутствовать в языке. Конечно даже если в языке нет классов и объектов, то ни что не мешает мыслить и писать программы в объектном стиле, но все таки наличие таких механизмов позволяет упростить эту задачу.
Управление данными, типизация
Я считаю этот раздел самым важным в концепции языка. Я встречал много обсуждений на эту тему на Хабре. В основном спорили сторонники статической и динамической типизации. У динамической типизации преимуществом называлось гибкость языка, но недостатком якобы является ненадежность языка и плохая адаптируемость к средам разработки. У статической типизации все с точностью до наоборот. Я считаю доводы о лучшей надежности языков со статической типизацией абсурдными, возможно что статическая типизация помогает в разработке средств программирования, но не более того. Я не являюсь сторонником ни того, ни другого подхода. Я считаю типизацию как таковую основным злом современных языков программирования. Хотя она присутствует в абсолютном большинстве языков программирования. Язык должен полностью брать на себя все управление данными, в том числе разбираться с их типами. Что вполне реально. А программист должен заниматься логикой программы. Если надо проверять данные, то типизация в этом ничем не поможет. Их надо просто проверять на содержание. Наличие типизация я могу объяснить только традицией и косностью мышления.
Передача переменного числа параметров в процедуры и функции
Это мелкая проблема, но она с трудом решается большинством языков. Хотя прекрасный пример существует в Ассемблере. Передача параметров через стек. Надо просто отказаться от списка формальных параметров, а передавать параметры через какой либо список. Возвращать переменное число значений функции мне не совсем понятно для чего и как этим можно воспользоваться. Возвращать в любом случае надо какую то одну сущность.
Управление процессом выполнения
Этот раздел я то же считаю определяющим для концепции языка. Управляющие конструкции языков почти одинаковы. Небольшие нюансы возникают с использованием команды goto. Мне не понятно почему с таким остервенением борются с этой командой. Очень удобная команда, особенно если аргумент этой команды можно вычислять. В реализации параллельных вычислений вариантов варианта в основном 2. Либо они реализуются средствами библиотек, либо могут быть включены в сам язык. Я сторонник второго способа.
В языках отсутствует обработка событий. Хотя она широко применяется. Для построения GUI, для реализации обработки событий запускается главный цикл. Такое решение не блещет элегантностью. Залезть внутрь такого цикла еще та проблема. Нормальный язык должен иметь средства обработки событий.
Мои представления конечно субъективны, и возможно даже неверны. Но они основаны на моем личном опыте. Современная ОС это куча не отлаженного хлама, который не будет отлажен никогда. Нагромождение API, различных библиотек из которых сыпятся ошибки. Количество языков программирования превысило все возможные пределы. Причем принципиально они мало отличаются друг от друга. А о количестве фреймворков вообще промолчу. Любая даже средняя система это многослойный пирог из различных, возможно плохо совместимых подсистем, полная отладка которых не будет выполнена никогда. Отладка простейшей программы на Си может занять месяца. И все это по моему мнению порождено типизацией в языках программирования.
На данный момент языка отвечающего моим представлениям о правильном языке программирования нет. Наиболее близок к нему по моему язык программирования MUMPS, но реализации такого языка как языка программирования не существует. Есть реализации баз данных в которых в качестве языка используется этот язык. Ограниченность такого подхода очевидна, что и заставило меня разработать новый язык MSH и написать его реализацию в виде интерпретатора. На данный момент в нем реализовано не все то что я собираюсь сделать. В частности нет среды разработки, но представление о языке получить можно.
Реализация выполнена для ОС Linux x64.
Кого заинтересовала моя работа пишите на почту, вышлю дистрибутив.
PS.
MSH не только безтиповой язык, он бездекларативный. В нем в принципе нет никаких описаний переменных. В общем случае переменная имеет не только тип, но и структуру. Массивы, списки, HASH, стеки и для описания каждой из структур требуется декларация. В MUMPS подобных языках деклараций нет в принципе, любая переменная является деревом. Никакое место под такое дерево не резервируется. Узел дерева создается в момент записи в него данных и только такие узлы существуют, в которые производилась запись. Ограничения на тип индекса отсутствуют. Поэтому сравнение MUMPS с PHP, Java Script и другими языками некорректно. MUMPS это отдельный мир, со своими проблемами и достоинствами. Чтобы его понять надо перестроить мышление. Понять MUMPS прочитав ругательные отзывы невозможно. Надо погрузиться в него. Прочитать документацию. Установить MUMPS систему. Поработать на нем. То что здесь меня не понимают это вполне закономерно. Мы говорим о разных мирах. В мире MUMPS не бывает обсуждений которые мы здесь ведем, о типах, структурах. Мало кого из MUMPSистов интересует как вообще и где хранятся их данные. Любые данные в MUMPS всегда имеют два представления это число и строка. И в зависимости от операции берется то или иное представление. Я всегда точно знаю результат в зависимости от операции которую я применил. MUMPS заставляет программиста работать в терминах дерева. Деревья могут находиться как на внешних носителях: глобали(аналог баз данных), так и в памяти: локали (аналог переменных в программах). В основном при проектировании информационной системы, я напрямую работаю с данными на диске промежуточных локальных данных у меня минимум и они не создают мне каких бы то ни было проблем. Поэтому на MUMPS форумах вы не встретите обсуждений о типах переменных их локализаций. Типичный способ проектирования это проектируешь входные деревья, выходные. А затем по мере необходимости пишешь программы по формированию входных и выходных деревьев. Данные в MUMPS первичны, а программы вторичны. Своими статьями я преследую цель познакомить как можно больший круг программистов с этим другим миром MUMPS. Я считаю этот мир более правильным. Я восхищаюсь эти простым, мощным и элегантным языком. Мне доставляет наслаждение писать на нем. К моему глубокому сожалению мне мало приходится это делать. Я хочу создать язык на котором можно будет все написать, не выходя за пределы этого языка. Написать сервер, написать Desktop клиента, добавить язык в браузеры.