Mar 17, 2009 17:33
Чтобы понять, чем SOP/SymADE отличается от MPS или IP надо вначале разобраться, что у них общего.
Прежде всего, все эти средства разработки программ предполагают переход от представления программы в виде текста к представлению (редактированию и хранению) в виде дерева. В таком подходе нет ничего нового, именно эту идею использует Lisp, что в конечном итоге позволяет ему быть столь мощным средством мета-программирования. Например, возьмём такой простой кусочек кода как выражение 2 * (a + 1). В Lisp-е он будет записан как (* 2 (+ a 1)) - согласно простым правилам: каждый элемент кода кроме простейших атомом отделяется скобками, первым элементов в скобках является "символ" операции, и затем аргументы той операции. В данном случае у нас есть операция умножения (символ *), с аргументами 2 и (+ a 1), то есть второй элемент это операция сложения (символ +) над аргументами a и 1. Это выражение разбирается Lisp-ом и хранится внутри него в виде дерева. Такой синтаксис, конечно, менее удобен, чем привычная нам со школьной скамьи запись. Но он позволяет одну важную вещь - в любом месте программы мы можем использовать любой код (значение которого определяется символом, первым элементом в списке). Что в свою очередь является фундаментом (синтаксическим) для мета-программирования.
Одна из идей лежащих в основе SymADE/MPS/IP - это хранение и манипуляция кодом программы так-же как в Lisp-е, в виде дерева. Но при этом мы можем определять удобный для нас "синтаксис", только в данном случае - это просто способ отображения кода на экране. Тот-же код, который в Lisp-е мы вынуждены хранить и редактировать как (* 2 (+ a 1)), то есть списки/дерево структурированне лишь скобками, в SymADE/MPS/IP может быть отображён привычным нам образом, как 2 * (a + 1). При этом внутри программы мы всё так-же имеем дерево, но за счёт специально задаваемых правил отображения, мы можем показать это дерево в том виде, который нам удобен.
Зачем это нужно? Для этого есть несколько причин. Первая - мы можем отображать нашу программу так, как нам удобно, не ограничивая себя проблемами однозначности синтаксиса, да и сам парсер для разбора текста (для преобразования его во внутреннее представление компилятора) нам не нужен. Второе, это возможность отображатьодин и тот-же код по разному для разных программистов, в зависимости от их предпочтений - начиная с правил оформления кода (отступы, пробелы, переносы строк), и кончая возможностью задать совершенно другой "синтаксис" отображения (одни предпочитают С-подобный синтаксис, другие Pascal-евидный и так далее). Третье, это возможность отображать программу с разным уровнем детализации. Скажем, адепты функционального программирования очень гордятся автоматическим выводом типов функций и переменных, что позволяет им зачастую не указывать эти типы, за счёт чего программа получается намного более компактной и удобной для чтения. Но автоматический вывод типов - ничто, по сравнению с возможностью произвольно задавать уровень детализации отображения программы. Вместо автоматического вывода типов мы можем просто задать нашему IDE не отображать типы - и получить более компактное отображение кода. Мы даже можем задать совершенно "высокоуровневое" отображение кода, чтоб он выглядел как UML диаграммы. При этом мы не меняем сам код, и не генерируем из UML код на другом языке программирования - мы просто таким способом отображаем нашу программу. Четвёртая причина - это полноценная интеграция вновь определённых понятий в IDE. То есть при редактировании кода мы получаем авто-дополнение кода при редактировании, быстрый переход в место определения символов или нахождение всех мест где они используются, мы можем задавать рефакторинг (преобразование узлов дерева одного типа в узлы другого типа) и так далее.
Но есть и ещё одна, на мой взгляд, самая главная причина, по которой имеет смысл отказаться от текстового (Lisp-подобного) представления в пользу кода хранимого в виде дерева с произвольным отображением. Ведь в чём главная сила Lisp-а, ради чего он жертвует выразительностью синтаксиса? Ради возможностей предоставяемых мета-программированием! Возможности писать код который будет генерировать код для вашей программы, проверять правильность кода вашей программы и так далее. Так вот, мета-программирование становится особенно нужным, когда размер кода проекта становится настолько большим, что его уже невозможно поддерживать и развивать используя ограниченный набор понятий языка общего назначения. Использование мета-программирования позволило-бы уменьшить код таких больших проектов в десятки раз, вновь сделав его достаточно простым и понятным, для дальнейшего развития. Но увы, Lisp предоставляет возможности мета-программирования только для программ написанных на Lisp-е. Если ваш проект был написан на С, С++, C#, Pascal, Java и пр. - ничем вам мета-программирование Lisp-а не поможет. Так вот, IDE подобное SymADE/MPS/IP - может вам помочь в этом случае. Для этого необходимо определить в этой среде набор понятий подобный набору понятий в C, C++, C#, Pascal, Java и пр., а затем экспортировать старый проект в данную среду. После этого программист будет видеть код в привычном ему виде, и может продолжать редактировать его как если-бы это был код на его старом языке программирования, но плюс к этому - он получает возможность определять и использовать новые понятия, специфические для его проекта.
Возможность интеграции в IDE вновь созданных языков программирования или расширения существующих языков программирования, а так-же возможность плавного перехода к использованию мета-программирования - это столь важные преимущества SymADE/MPS/IP-подобных IDE, которые позволят в самом ближайшем времени (в течении нескольких лет) стать им одними из доминирующих средств разработки программ. Особенно в областях, где важно применение DSL (Domain-specific language), и при разработке крупных программных проектов.
Но эти преимущества - это только начало. Точнее, MPS от JetBrains и IP от Intentional Software только приближаются к реализации этих возможностей, и это практически все идеи, заложенные в них. Но в SOP заложено намного больше. Несмотря на технологически подобную реализацию (внутреннее представление программы в виде дерева, хранение его в виде дерева, и произвольное отображение этого дерева, изначальная интеграция новых понятий и языков в IDE), фундамент у SOP намного глубже, и в перспективе позволит пойти намного дальше, чем MPS и IP.
В следующем посте я наконец дойду до различий между SOP/SymADE и MPS, IP.
ip,
symade,
sop,
mps