Как стать автором
Обновить

Транслятор из Delphi в javascript

Время на прочтение2 мин
Количество просмотров9.5K
Совсем недавно я участвовал в одном любопытном проекте. Так как компания, финансирующая этот проект, «открыла карты» и даже сделала сайт, посвященный его результатам, я решил рассказать о нем вам, уважаемые хабраюзеры.

При создании интерактивных приложений очень часто приходится делать выбор между двумя альтернативами: desktop приложение под Windows или веб-приложение, работающее в браузере. Основной девиз проекта p2js — «Один исходный код — две платформы».

Итак, если в «двух словах» то, p2js это транслятор программ, написанных на Delphi, в javascript. На сайте проекта очень много написано, про то, каким образом это происходит. Повторяться не буду. Лично для себя сделал пару открытий:
  • Удивительная гибкость javascript вместе с замыканиями позволяют творить чудеса. Ну вот, например, как сделать передачу аргументов по ссылке. Аргумент, через который передается abc заменяется на объект {get:function(){return abc;},set:function(v){abc=v;}}. Внутри самой функции присваивание аргумента заменяется на вызов метода set. Ну разве не удивительно?
  • Рефакторинг кода при трансляции модальных диалогов. Модальные диалоги частенько используют в desktop приложениях, а в веб это считается дурным тоном. Производители браузеров очень неохотно поддерживают эту возможность. А некоторые их них(Opera, Chrome) и не собираются это делать ни при каких обстоятельствах. Если честно, не очень верилось, что существует возможность так перестроить программный код, чтобы создать его полный «немодальный» эквивалент. Тем не менее, все же это удалось сделать. Для себя сделал вывод, что всегда можно провести рефакторинг исходного кода так, чтобы отказаться от модальности (имеется ввиду истинной модальности, т.е. диалога с собственным отдельным циклом обработки сообщений).
  • Основные силы команды были потрачены на создание аналога VCL (это библиотека компонентов в Delphi и C++ Builder’e кто не знает). За основу была взята известная библиотека Ext JS. Для себя отметил следующее. Практически все компоненты VCL (и их аналоги типа MFC и др.) направлены на изменение своих свойств в runtime. В таких библиотеках как Ext JS, jQuery и др. все должно происходить «до рендеринга». Любое дальнейшее изменение вида или поведения компонента вызывает сложности. Для того чтобы убедится в этом «интегрально» достаточно подсчитать количество сеттеров, например в Ext JS. Ну пару тройку найдете...
  • IE – …! Этот браузер многие ругают. В основном за нарушение стандартов css и html, или отставание от других браузеров. Добавлю свою ложку дёгтя в бочку дёгтя. Тот, кто попробует поработать в этом браузере со скриптами, получит массу незабываемых впечатлений (в особенности от инструментов разработчика).

Теперь ответ на вопрос, который все равно зададут – зачем? У компании, которой это нужно, есть продукт в котором ~1 млн. строк исходного кода. В основном продукт написан на Delphi. Их клиентам хочется, чтобы продукт работал на двух платформах. Конечно, можно было нанять еще столько же программистов и тестировщиков, которые за 3-5 лет повторят творение. А можно транслировать и иметь решение на обеих платформах.
Теги:
Хабы:
+20
Комментарии57

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн