Рассвет и закат мобильного программирования
Представьте, что вы сидите на скучнейшем уроке литературы: кто-то спит, кто-то рисует в тетради, кто-то чатится в ICQ, кто-то проходит очередной уровень Gravity Defied, а вы люто набираете на своём Sony Ericsson программу на Бейсике, которая случайным образом выводит имя одного из одноклассников и какой-нибудь слегка обидный неправдивый факт о нём. Наконец, последние строчки дописаны, вы запускаете программу и показываете её соседу по парте, потом телефон уходит на другой ряд и… к концу урока добрая половина класса уже потирает ладони, чтобы хорошенько отвесить вам подзатыльников за такие приколы. Но последствия не так важны, как эйфория от того, что путь мобильной разработки для вас только-только начинается.
Это был 2006 год. У многих из нас ещё не было ПК, зато были мобильные телефоны с небольшими экранами, ограниченный доступ в Интернет и много свободного времени, которое хотелось потратить на реализацию какой-нибудь идеи.
Mobile Basic
Отцом мобильной разработки можно считать Дэвида Фёрта — создателя Mobile Basic. Даже если это было не первое в мире приложение, которое позволяло программировать на мобильном телефоне, зато оно явно было широко распространено. Mobile Basic имел большой набор команд: арифметические и строковые операции, работа с датой и временем, чтение/запись из RMS (внутренняя память приложения), пользовательский ввод (как строки, так и нажатые клавиши), вывод форм, а также рисование в Canvas. Не всегда это работало как следует: формы иногда приводили сони эриксоны 5 поколения в ребут, а канвас мигал у всех.
Ввод программ был своим на основе канваса, то есть никакого T9 и буфера обмена, из-за чего было проще набирать текст в другом редакторе, сохранять в .lis и открывать уже в Mobile Basic. А если что-то не работало, то снова возвращались в другое приложение, исправляли ошибки и повторяли процедуру, потому что в мобильных телефонах тогда нельзя было сворачивать приложения в фон и открывать другое. Тем не менее из-за отсутствия альтернатив и всё-таки богатого набора функций, Mobile Basic получил всеобщую любовь.
Был у Mobile Basic ещё один недостаток:
Автор давал пользоваться приложением лишь 30 раз и за снятие ограничений требовал £20 (~$26), хотя потом снизил до £5, но возможности это оплатить у нас не было.
Конечно, ограничения легко обходились простой переустановкой программы, но это были излишние неудобства. Тогда народные умельцы (Bloodmage) нашли обход и прямо в переводе указали данные для успешной регистрации, добавив ко всему прочему ещё и ввод кириллицей.
На тот момент последней официальной версией был Mobile Basic 1.8. Сообщество пользователей мобильного бейсика росло, появлялись темы по нему на известных форумах. Иногда даже одной темы было мало и приходилось создавать отдельные: Вопросы по Mobile Basic, Игры и программы на Mobile Basic, и т.п. Также появился сайт MBTeam, собравший нескромную по тем меркам фанбазу. Проходили конкурсы по программированию и геймдеву, где игры на мобильном бейсике нередко утирали нос играм, созданным с помощью ПК на MIDlet Pascal или Java ME. Кто помнит шедевры от Keitaro и Vapigor — подтвердят.
А затем пришёл Mumey, декомпилировал Mobile Basic, сумел добиться компилируемости полученных исходных файлов и начал улучшать программу. Ввод на канвасе был переделан на формы, добавлено нормальное стартовое меню, работа с файловой системой, возможность добавить ресурсы в собираемую программу и многое другое.
Оставалась ещё проблема с ребутом на SE 5 поколения, которая заключалась в каком-то баге производителя с синхронизацией wait/notify в формах. Вот этот код, если вызывался при показе формы, приводил к ребуту:
synchronized(someObject) {
someObject.notify();
}
Тут уже помогал я, правда не с исходников, а редактируя байткод.
Так Mobile Basic дорос до версии 1.8.6.2 и на долгое время на ней и остался.
MobilePascal
MobilePascal от CPU можно назвать первым мобильным языком программирования от разработчика с СНГ. Не стоит путать с MIDlet Pascal, то была программа для ПК. MP, как и MB, имел функции для работы с арифметикой, формами, графикой, имел даже системные функции и умел совершать звонки и отправлять SMS. К сожалению, критическим недостатком этой программы была его большая заточенность под API телефонов Siemens, вследствие чего приложение не запускалось на других телефонах даже после попыток его портировать. Тем не менее сименсы были у многих и аудитория у языка программирования тоже была. Я видел несколько хороших полезных программ, написанных на Mobile Pascal.
ClassEditor
Помимо программирования на телефоне мы ещё занимались и ковырянием байткода в class-файлах. По сути изучали Java совершенно не с той стороны, с которой её принято учить. ClassEditor от dzanis — HEX-редактор с упором на редактирование классов. Помимо стандартных для HEX-редакторов преобразования систем счисления и поиска по байтам/строкам
в ClassEditor был дизассемблер:
В большинстве случаев мы просто занимались переводом программ, изменяя строки в константном пуле. Иногда правили игры, добавляя туда бесконечные жизни или сразу открытые уровни. А ещё исправляли коды клавиш джойстика, чтобы игра, адаптированная для одной марки телефонов, нормально работала на другой. Дизассемблер очень помогал проверить всё ли правильно сделано, экономя время. Иначе пришлось бы с телефона закидывать отредактированный class в архив, переустанавливать программу и видеть ошибку приложения.
dzanis не только был автором этой программы, но также охотно делился с нами знанием по байткоду, давал примеры и задания.
LM
Также были попытки сделать собственный язык программирования. Пожалуй, первым таким был LM (Language for Mobile phones) от В.Е. А.
Автор начинал разработку ещё тогда, когда Mobile Basic не имел ввода кириллицей, поэтому его язык программирования призван был исправить ситуацию. Но потом MB стал развиваться очень быстро и тогда В.Е. А. решил перепрофилировать LM в первый язык программирования для мобил с командами на русском языке.
Пример кода на LM (взято из документации от самого автора):
{
цвет 100,100,255
стиль жирный
надпись "Привед медвед!",%1,%2
нарисовать
}
TextCompiler
Были у нас и транспайлеры. TextCompiler от Counter является уникальным проектом, так как позволял преобразовать код в стиле улучшенного бейсика (несуществующей версии 1.8.7) в код для мобильного бейсика 1.8.6. При этом программа была написана на… Mobile Basic 1.8.6.
В TextCompiler не было обязательной нумерации команд, зато были метки, блоки с локальными метками, можно было подключать множество исходников, сохранять всё это во временный файл при помощи директив (эдакий ещё и препроцессор).
@inp:
INPUT "X=?",X%
IF X%<0 THEN GOTO @less
IF X%>0 THEN GOTO @greater
PRINT "X=0":END
@less:
IF X%=-100 THEN GOTO 100
PRINT "X<0, X<>-100"
END
100 PRINT "X=-100":END
@greater:
IF X%=100 THEN GOTO 100
PRINT "X>0, X<>100"
END
100 PRINT "X=100":END
Скорость работы программы была не очень высокой, к тому же при обращении к файловой системе приходилось подтверждать доступ к файлам, поэтому Counter добавил для удобства ещё и воспроизведение звука перед каждым таким запросом (это настраивалось).
Jasmin Java Assembler
Несмотря на популярность Mobile Basic, Бейсик считался плохим языком для начинающих, потому что не давал мыслить в ООП, а, привыкнув к GOTO, было тяжело потом переходить к современным языкам. Поэтому часть сообщества стремилась к Java.
Так Mumey портировал Jasmin и преверификатор из ProGuard и мы начали плотнее изучать байткод Java и пытались писать программы прямо на нём.
Пример
.class public Hello
.super javax/microedition/midlet/MIDlet
; конструктор основного класса
.method public ()V
.limit stack 1
.limit locals 1
aload_0
invokespecial javax/microedition/midlet/MIDlet/()V
return
.end method
; точка входа в программу - метод startApp
.method public startApp()V
; сюда добавляем код, с которого и начинается программа
.limit stack 2
.limit locals 1
; Java-код: System.out.print("Hello, World!") на JASM займет три строчки
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Hello, World!"
invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
return
.end method
; метод "паузы"
.method public pauseApp()V
.limit stack 0
.limit locals 1
return
.end method
; метод "выхода"
.method public destroyApp(Z)V
.limit stack 0
.limit locals 2
return
.end method
Конечно, писали не с нуля, а брали готовые примеры или дизассемблеровали готовые class-файлы, благо Mumey почти сразу сделал и дизассемблер.
Online Java Compiler
Counter запомнился не только как автор TextCompiler, но ещё и как автор php веб-сервиса для компиляции и преверификации исходников — java2class. Можно было загрузить свои исходники с браузера, подождать 2–5 минут и получить скомпилированные и преверифицированные классы. А если скомпилировать не удавалось — увидеть список ошибок компилятора.
Для тех времён это был очень хороший и качественный сервис, не уступающий, пожалуй, даже сервису для создания Java-комбайнов.
К сожалению, сервис очень часто переезжал на другие домены, а вскоре пропал и сам Counter, после чего последний известный инстанс тоже протух, не оставив следа даже в веб-архиве.
Janino
Mumey не остановился на Jasmin и вскоре портировал компилятор Janino. Невозможное оказалось возможным. Это был прорыв, так как теперь у нас было всё для того, чтобы на мобильниках программировать на Java ME.
Jcc
Jcc — язык программирования и виртуальная машина от J.Peter. Имел три версии: первые две больше похожие на C, а третья — на Java. Парсер был сгенерирован в JavaCC и адаптирован для Java ME. Редактор кода здесь был свой (и намного удобнее, в отличие от MB) с подсветкой синтаксиса — J.Peter развивал редактор Jane как отдельную программу, а сюда просто встроил наработки.
К третьей версии Jcc3 приобрёл хороший тулинг в виде генератора метаклассов (API для jcc) и отдельный рантайм, куда закидывался байткод программы и получалось собственное приложение.
Несмотря на титанические ресурсы, которые приложил автор, большую базу фанатов язык не набрал. Но всё же Jcc можно было использовать как программу, в которой легко набросать какой-нибудь алгоритм и проверить его работу в рантайме, а потом перенести код в Java и скомпилировать уже в Janino.
J2ME SDK Mobile
Прогресс не стоял на месте, мобильные телефоны тоже становились мощнее, росли запросы пользователей, но то, что Mumey сделает IDE мы уж точно никак не ожидали. Тем не менее автор соединил редактор с подсветкой синтаксиса, компилятор, преверификатор и сборщик jar в одну программу и, чёрт возьми, это всё работало на мобильных телефонах с ОЗУ в ~1Мб и памятью ~32Мб!
Очень крутой фишкой приложения было использование MIDP 2.0 API автозапуска. Сначала ты открываешь файлы, редактируешь исходники, а когда нажимаешь Compile — программа сохраняет все параметры для компиляции, ставит сама себя на автозапуск на следующую минуту (для этого требовалось разрешение пользователя) и закрывается. Затем запускается по таймеру и начинается компиляция. Оперативная память при этом уже не занята редактором. После компиляции процесс повторяется: снова таймер, закрытие, автозапуск в режиме преверификации. Наконец, снова для сборки jar.
MobPascal
MIDlet Pascal на ПК к тому моменту уже приобрёл большую базу фанатов, библиотек и примеров, так что P@bloid попытался создать мобильный аналог, который повторял бы синтаксис и был бы совместим с библиотеками большого брата. Так появился MobPascal.
В нём был редактор из Jcc с подсветкой синтаксиса, компиляция в единый class файл, который затем следовало прогнать через Preverifier от Mumey. Успеху проекта помешали серьёзные баги с компиляцией: что-то сложнее небольшой демки могло скомпилироваться неправильно и либо преверификатор, либо уже сам телефон отказались бы работать со скомпилированной программой.
Вскоре P@bloid забросил разработку, выложил исходники и модификацию продолжили Vasiliy_LiGHT и vl@volk, добавив поддержку библиотек и исправив лишь незначительные баги.
Mobile Basic 1.9
Пока одни покоряли вершины Java ME с мобильного телефона, другие продолжали развивать Mobile Basic.
Дэвид Фёрт выпустил версию 1.9, добавил туда только одну функцию. При этом все проблемы программы, которые были в версии 1.8, остались. Но зато Фёрт открыл исходный код и тогда kiriman на основе этих исходников и декомпилированной версии 1.8.6.2 (Mumey не открывал исходный код своих версий) начал делать модификации. Позже к нему подключился и dzanis (да-да, тот самый). Вместе они оптимизировали скорость работы интерпретатора, убрали программную эмуляцию чисел с плавающей запятой (в спецификации CLDC1.1 float/double уже давно были) и переделали отрисовку, в результате чего исправили самую древнюю проблему бейсика — мерцание в играх.
Затем модификацию подхватили vl@volk и garfild63, добавив ещё больше команд и исправлений.
Mobile Eclipse JDT
Разработчик из Филиппин под ником Assembler портировал компилятор из Eclipse JDT на Java ME. Внешне программа напоминала Janino, только весила более 800 кб и была не оптимизирована, в результате чего, ею можно было пользоваться только на мощных устройствах или компилировать совсем простые исходники. Так как всё русскоязычное сообщество привыкло к Janino и J2ME SDK Mobile, то эту программу использовали только для тестов или на крайний случай, вдруг скомпилирует то, что не смог Janino.
Примочки к Mobile Basic
Стоит отметить ещё несколько проектов, которые повлияли на прогресс мобильного программирования.
RMSBackup от grafmoto
До версии 1.8.3 в Mobile Basic не было сохранения в файловую систему телефона. Тогда придумали обходной путь: закидывали в jar нужной программы специальный класс, прописывали его как второй мидлет и при запуске можно было бэкапить сохранения из внутренней памяти приложения (RMS) в файл, затем, при необходимости, восстанавливать. Это была универсальная утилита и она широко применялась продвинутыми пользователями как в играх, так и в приложениях для бэкапа сохранений.
Hidden text
Скриншот страницы проекта из веб-архива
MB Refactor от kiriman
К версии MB 1.9.1 уже досконально изучили структуру бинарных BAS файлов Бейсика, так что эта небольшая утилита напрашивалась сама собой. Она умела переименовывать переменные, увеличивать шаги строк, форматировать исходник, а также обфусцировать. Последнее нужно было, чтобы банально не воровали исходники.
MB Compiler Online от HoldFast и vl@volk
Онлайн конвертер bas в lis и обратно, обфускатор и сборщик jar файлов, в том числе с добавлением ресурсов. Поддерживал версии 1.8.х и 1.9.1. Пользовались им не только с ПК, но ещё и со слабых телефонов, когда ОЗУ не хватало собрать игру с изображениями.
MB IDE
Вряд ли это уже относится к мобильному программированию на мобильниках, однако этот проект стоит упомянуть. MB IDE существовал в трёх редакциях:
MB IDE .NET. Самая первая версия от JGDger
MB IDE. Версия на Java SE от HoldFast. Подсвечивала синтаксис и строки с ошибкой, умела работать с версиями 1.8.х и 1.9.1, поддерживала сборку программ в jar и запуск в эмуляторе MicroEmulator. А позже была добавлена ещё и сборка под эмулятор Java ME на Android —J2ME Loader.
Online MB IDE на php от HoldFast. Умела всё то же, что и Java SE версия, только без запусков в эмуляторах.
Особые благодарности
На самом деле не только авторы вышеуказанных приложений развивали мобильное программирование. Взять, например, архиватор. Без него невозможно было бы упаковать игру на Mobile Basic или добавить в неё картинки, нельзя было бы извлечь необходимые файлы из программ/игр для последующей модификации, а после добавить обратно. Благодарность:
kys за MiniCommander — файловый менеджер с отличным архиватором, который прекрасно работал на Nokia, Motorola, Samsung и прочих марках.
Malcolm за PowerGrasp — zip/gzip/tar архиватор. В основном им пользовались на Sony Ericsson. Да и вообще Malcolm был звездой форума Sony Ericsson клуба, помогал новичкам в программирования, в том числе и мне, за что ему личная благодарность.
Salat-Cx65. Он предложил вынести темы, посвященные программам для программирования, в отдельный раздел Java ME разработки на форуме клуба телефонов Siemens. Также он был модератором этого раздела, закидывал идеи и связывал нас в единую тусовку. А ещё был бета-тестером Janino.
Всем завсегдатаям вышеуказанных форумов, кто предлагал реализовать интересные фичи, писал мануалы, делился исходниками примеров и помогал с вопросами.
MierivaL за скриншоты с реального мробильного телефона.
После заката
После заката наступают сумерки, в небе появляются первые звёзды. Затем наступает и ночь, озаряя небо мириадами таких звёзд. Хочется верить, что какая-то часть этих звёзд сияет даже сейчас. Хочется верить, что какая-то часть людей, изучавших программирование вот так с мобильного телефона, достигли своей цели и являются программистами даже сейчас.