Re[4]: Программирование, от монолога к диалогу с компьютером
От: mkizub Литва http://symade.tigris.org
Дата: 19.02.09 10:39
Оценка: 6 (3)
Здравствуйте, tid, Вы писали:

tid>Я имею ввиду не документацию, а небольшое описание деталей.


tid>То есть почему ты создал свой язык, чем он отличается (хотя бы в основном) от java, какие новшества.


Язык я свой создал по причине того, что я люблю делать языки программирования.
Желание улучшить свой текущий язык программирования я пытался неоднократно (лет 15 назад пытался сделать макросы для С/С++ вроде тех, что сделаны в Nemerle).
Лет 10 назад написал таки расширенную java. Понадобавлял туда кучу всего, и в результате пришёл к тому, что это это не выход. С ростом количества фич в языке они начинают конфликтовать друг с другом, всё сложнее поддерживать целостность языка. И самое обидное — всех необходимых фич в язык не добавишь. Каждый новый проект, который я пытался делать на своём языке — требовал новых возможностей, или изменения поведения старых. В результате я пришёл к выводу, что не имеет смысла развивать язык добавляя к нему новые возможности, а нужно сделать нормальные возможности для мета-программирования.
Вариант с макросами я рассматривать не стал (был опыт попытки их реализации, и все ограничения и проблемы этого подхода были мне знакомы).
Пару лет я просто ничего не делал, поскольку не знал что именно делать.
Потом мне пришла в голову идея, которая рано или поздно приходит в голову всем разработчикам языков и IDE — использовать дерево (внутреннее представление) вместо текста.
Я сделал прототип, поплясав от самой печки, то есть имея в распоряжении только понятия "символ", "пространство" (контейнер), попробовал реализовать через них всё остальное. Ну, чтоб уж совсем мета-программирование получилось. В результате я понял, что теория это хорошо, но это уж слишком высокий уровень абстракции, надо что-то более приземлённое взять в качестве основы, а то так оно в теории работать и останется.
Я взял свой компилятор, и переписал его в соответствии со сформировавшимися к тому времени представлениями о SOP (семантическом программировании).
Все (почти все) расширения, которые я добавлял (и которые появились в результате развития java), я сделал не hardcoded, а в виде плагинов. Сделал удобную работу с семантическими понятиями (узлами дерева программы), добавил упрощённое мета-программирование (когда дерево не вручную модицицируется, а макросами, которые реализованы просто в виде ещё одного плагина).
Ну и стал делать IDE к этому компилятору. Вот этот процесс длится уже несколько лет (с перерывами на рождение ребёнка), в свободное от основной работы время.

В язык понадобавлено много чего (ещё когда он был просто расширением к яве, а не своеобразной библиотекой для мета-программирования).
Multimethods, closures, mixins, forwarding (наследование агрегированием, делегированием), properties (доступ к полу через getter/setter), user-defined operators & operator overloading, assert/trace/work-by-contract, встроенный движок логического программирования (поиск решений с бэктрекингом, что-то вроде интегрированного пролога), switch по типам, goto, битовые поля (упакованные битовые поля), части из pizza (был такой проект у Мартина Одерски, который перерос в явовские параметризованные типы и scala), параметризованные типы без erasure (параметры доступны в рантайме), расширения для работы с деревьями, для генерации специальной мета-информации для SymADE, view (что-то вроде existential types) и так далее.

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

tid>В двух словах как устроена среда и общее видение дальнейшего процесса.


Весь код доступен среде в виде семантических узлов. Работает с ними она через мета-информацию сгенерированную компилятором.
Есть язык для задания отображения для конкретных узлов, это отображение рисуется на Canvas, или (если присутствуют только текстовые элементы) может быть использовано для экспорта в текстовое представление.
Редактор — структурный. Можно посмотреть на документ с картинками (на сайте есть, в документации). Собственно, идея практически та-же, что и в MPS (поскольку задача одна и та-же — редактирование непосредственно дерева программы). Вообще, нынешнее состояние очень похоже на MPS, только менее доделанное.
Разница в том, что у меня в дереве хранятся семантические узлы, а у MPS синтаксические.

Что дальше.
Главная задача для развития среды — это наконец реализовать IDE для редактирования кода на моём языке программирования.
Тут надо решить ещё много задач. Главная задача — доделать projections семантического дерева в синтаксические деревья.
Вторая задача — это редактирование синтаксических деревьев. Что до редактирования декларативной части — оно было удобно и раньше, с ним почти никаких проблем.
А вот редактирование списков токенов надо доделывать. Теоретически до такого уровня, чтоб его редактирование было максимально похоже на редактирование текста Word и прочих WYSIWYG редакторах. Сам GUI написан на Java, и почти вся эта работа может делаться в Java.
Есть ещё работа по собственно IDE — фоновая компиляция, удобное выведение ошибок и прочее.
Есть задачи по работе с деревьями как таковыми. Например, сейчас они дампятся в XML. Это и долго (для экспорта и импорта), и приводит к необходимости линковки (резолвинга) символов после загрузки дерева из дампа. Хотелось-бы написать экспорт в binary формат, который просто можно было-бы сохранить и загрузить как snapshot дерева. Это было-бы значительно быстрее и решило ещё несколько мелких проблем. Ну, и экспорт/импорт этого бинарного формата в текст (вроде XML или json и пр). Эту часть работы можно легко сделать на обычной Java.
Далее, необходимо что-то делать с версионностью семантических понятий. Они имеют тенденцию меняться со временем, и надо сделать с одной стороны, поддержку указания версий, и с другой стороны, конвертацию из старой версии в новую. Попутно это приведёт к созданию специального языка описания трансформации дерева, возможности декларативно задавать простые projections дерева и пр. Эту часть работы можно почти полностью делать в SymADE (как IDE), без глубокого залазанья в потроха компилятора.

Безнес-часть проекта заключается в доработке IDE до состояния беты, и выхода на бизнес-ниши где технология вроде SymADE/MPS может быть использована (с большим эффектом) уже сейчас, при минимальной адаптации. Соответственно, если инвесторы дадут денег (от 0.5 до 1 лимона баксов), то приоритеты изменятся, комманда будет заниматься не столько доведением SymADE до состояния возможности редактировать код для моего компилятора, сколько доведением его до состояния возможности редактировать код для программ из этих ниш на IT рынке.

Есть ещё задачи, которые могут стать приоритетными при изменении условий — сделать плагин для Eclipse (GUI умеет работать как со Swing, так и с SWT), перейти на .NET платформу (написать backend, заменить прямую работу с базовыми объектами вроде string, hashtable на работу с концепциями строк, хэш-таблиц, для которых будет генерироваться разный код для JVM и .NET) и так далее.

Когда будет нормально работать IDE, к этому времени уже, наверное окончательно, установится API компилятора и внешний вид GUI, и можно будет писать документацию и систему тестирования. То есть когда будет бета — надо будет делать релиз
SOP & SymADE: http://symade.tigris.org , блог http://mkizub.livejournal.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.