Описание проекта: MC2 - это
табличный процессор для платформы J2ME. Предыдущая версия программы
называлась MicroCalc.
При разработке MicroCalc выяснилось что спектр возможностей J2ME
устройств чрезвычайно широк (например размер хипа сильно
варируется), наблюдается сильное различие в реализации
пользовательских интерфейсов (UI), телефоны могут поддерживать
специфические API (например Siemens File System API, или JSR-75) - в
результате требуется адаптация программ для конкретных моделей
телефонов, чтобы соответствовать UI платформы, и использовать
дополнительные возможности устройств.
Стало очевидно что с архитектурной точки зрения необходим некий
механизм конфигурирования программы под конкретную модель телефона,
как с точки зрения пользовательского интерфейса (UI) так в плане
поведения программы. Традиционно для этих целей в системах
используются скриптовые языки. Чтобы не придумывать новый птичий
язык - было решено использовать Lisp. Этот язык прекрасно себя
зарекомендовал в EMACS (текстовый процессор), и продолжить эту
традицию - само по себе достойное занятие. Тем более что скриптовый
язык востребован в табличных процессорах даже больше чем в текстовых
(сравним как часто VBA код используется MS Excel vs MS Word). Есть и
сугубо технические предпосылки:
- в качестве скриптового языка рассматривалась также java. Но
компиляция и исполнение java кода не возможно на телефоне. Поэтому
нужен интерпритирующий язык - это позволит исполнять макросы прямо
на телефоне.
- Для Lisp существуют и компиляторы в JVM байт-код:
http://www.robert-tolksdorf.de/vmlanguages.html. То есть
критические участки Lisp кода можно "предкомпилировать" в JVM для
ускорения.
- Lisp имеет простую грамматику - BNF существенно проще чем
например java. Простой парсер - существенный момент для объема
J2ME кода
- Lisp может быть использован как для представления поведения
(кода) так и для представления данных. В традиционных ЯВУ это как
правило различные формы.
- Следствие - Lisp может быть использован для работы с
метаинформацией - например программа может генерировать код (можно
заметить аналогию с популярной технологией XML/XSL).
Факт - в MC2 нашли применение все перечисленные свойства. Даже
последнее (5) - когда MC2 передает данные на сервер, они передаются
в виде Lisp кода. Lisp код генерируется на клиенте (телефон) и
исполняется на сервере. Таже это сильно упрощает реализацию
макрогенератора, и операций undo/redo.
Итак - решено было реализовать ядро исполняющее Lisp код, не
привязанное к табличному процессору. Табличный процессор - это
обвязка к ядру Lisp, Для работы с предметной областью (таблицами)
предоставлены дополнительные функции (функторы Lisp). Реализация
этих функций выполнена на java, в виде модулей. java в этом смысле -
"нативный" код для MС2.
Таким образом MC2 может поставляться с различным числом модулей,
при конфигурировании под возможности платформы (например на
ограничение jar). Модули в этом случае - class файлы. Они расширяют
возможности среды, добавляя новые функторы которыми могут
использовать макросы на Lisp. Кроме "нативных" модулей которые могут
быть разработаны 3rd разработчиками на основе .jar/javadocs -
основное преимущество MC2 - это работа с кодом на Lisp. То есть в
состав MC2 могут входить текстовые файлы с кодом на Lisp. Они могут
быть размещены как в .jar (в этом случае немодифицируемые) так и в
RecordStore (создаются пользователем). Выше было отмечено что Lisp
удобен для работы с метаинформацией - и мы можем сохранять в RS как
данные (таблица) так и код - это не имеет значения.
Как и Lisp, диалект MC2 Lisp позволяет определять новые функторы
(имена), непосредственно в Lisp коде. Эти функторы могут быть
использованы как функции на листе, так и имена ячеек и тп. Так можно
определить новые функции рабочего листа нужные пользователю -
статистические, математические, новые константы, макросы и тп. И все
это может быть сохранено как данные, например на сервере, и может
стать доступным прочим пользователям.
Как было отмечено - в основе MC2 - lisp ядро. Все операции
предметной области представлены функторами, и все они доступны в
пользовательском коде Lisp. В настоящий момент времени в словаре MC2
Lisp более 100 функторов. Число функторов зависит от набора модулей
в поставке Lisp. Например есть модуль для работе MC2 на десктопе,
есть модуль для работе на сервере (без UI который там не нужен).
Типы данных MC2 Lisp (атомы):
- short
- long
- boolean
- date/time
- string
- float
- reference (range)
- cell
- sheet
Эти типы данных могут быть использованы как в
MC2 Lisp коде так и функциях рабочего листа.
Таким образом достигается большая гибкость конфигурирования MC2
(это характерно было и для EMACS). В частности, конфигурирование
всего UI MC2 выполнено исключительно в Lisp коде: univer.mc2. MC2
использует оригинальную схему для маппинга элементов UI в Lisp код.
На любое внешнее воздествие может быть назначен lisp - код. Пункты
меню, нажатия клавиш, etc - им в соотвествие ставится lisp код.
Пользователь может переопределить текущие назначения, или добавить
новые. Может изменить существующее меню и реакцию на клавиши.
Предполагается что разработчики смогут расширять функцинальность
MC2 - для этого они могут разместить свой Lisp код в текстовом файле
в непосредственно в .jar мидлета (это может быть версия MC2
адаптированная под конкретную задачу), или файлы могут быть быть
загружены пользователем из интернета. Текущее назначения UI
представлены в файле univer.mc2. Это "рабочий" файл - при сборке MC2
в ant скрипте данный файл компилируется в java class. Это
существенно ускоряет загрузку MC2.
таким образом МС2 конфигурируется для работы в различном
окружении. По адресу http://mixaz.eatj.com/mc2/mc2emulator.html
вы можете попробовать как работает MC2 в аплете. Есть и десктоп
вариант для PC c JRE. То есть пользователь может обменваться данными
между программой в телефоне, сервером, и десктопом. Данные можно
редактировать в браузере (в аплете).
В состав проекта входит также серверная часть. Когда клиентская
часть общается с сервером - ответная серверная часть - это тоже ядро
MC2 которому кроме операций с таблицами также доступны операции с
пользовательскими файлами на сервере. Клиентские данные приходят на
сервер как lisp код (lisp код и данные используют одну форму
представления в лиспе), и исполняются на сервере. Это немного похоже
на RPC.
Таким образом для MC2 данные расположенные на сервере становятся
"прозрачными". Клиент также может выполнить lisp код на сервере и
получить результат опять же в виде lisp кода (данных). Существует
также модуль для работы MC2 на дектопе под J2SE. Серверная часть
реализована под Tomcat.
К проекту приатачены бинарные файлы - мидлет mc2lite - вы можете
также скачать его с сайта http://mixaz.eatj.com/mc2 - там
же вы найдете версии для других телефонов и десктоп PC
Также приатачены исходные файлы, для ознакомления - см.
readme.txt в архиве. Исходные файлы не предназначались для public
domain, предоставляются "as is". Планируется релиз MC2 opensource.
В проекте использованы библиотеки и инструменты:
На скриншоте - MC2 работающий в MicroEmulator на desktop PC под
Sun JRE. В бакграунде виден лог, в том числе MC2 Lisp код
исполняемый при нажатии на клавиши UI (все элементы UI мапятся в
Lisp код - это позволяет легко конфигурировать интерфейс MC2)