Skip to main content

Написание графических приложений с использованием языка программирования Red

TL; DR - Написание собственных кросс-платформенных графических интерфейсов рабочего стола с использованием Red.

После попытки (и неудачи) обернуть «исполняемый» ducktape вокруг скрипта Python с помощью PyInstaller в Windows, класс языков программирования, который теперь обычно вызывает мой интерес, имеет следующие атрибуты:

  • Статическая бинарная компиляция (создание двоичного кода, а не запуск байт-кода, т.е. Java, Python)
  • Быстро.
  • Кросс платформа  (Windows, Mac, Linux, * BSD и / или Haiku (бонус))

Подняв Go Go три года назад для этой цели (начал разрабатывать приложение с ним), я могу гарантировать, что двойные файлы Go работают на нескольких платформах посредством кросс-компиляции. Другие языки, такие как Crystal и Rust,также отмечают поля выше, но оба они были нестабильными в то время. Сегодня я изучаю варианты для встроенных графических интерфейсов Cross Platform [1].

Было много «современных настольных приложений», которые были построены с помощью Electron. Это позволяет программистам создавать настольные приложения с HTML, CSS и JavaScript. Звучит здорово? Что ж…

В то время как Electron легче, быстрее рынка и экономически эффективным для программистов, Electron печально для огромного количества наворотов он несет в двоичном размере и в использовании ОЗУ [2] . Возможно, вы столкнулись с сообщениями, жалующимися на его использование, до такой степени, что избиение Electron почти гарантировано в онлайн-техническом форуме, если какое-либо приложение осмеливается его использовать.

К вашему разочарованию, это не одно из этих сообщений. Qt и GTK + - интересные альтернативы, я даже планирую использовать их самостоятельно. Тем не менее, обе они не так быстро развиваются, как Electron. Можем ли мы оба? Графический интерфейс с родной кросс-платформой, который также быстрее развивается? Обратитесь к Red.

Red

«Red - это язык программирования следующего поколения, сильно вдохновленный Реболом».

Red был сделан в основном потому, что Rebol был запатентованным, закрытым исходным программным обеспечением (то есть до 2012 года Rebol 3 был создан с открытым исходным кодом) . Оба языка имеют отличную систему графического интерфейса (в которую мы войдем), разница в Red делает то, что она может использоваться для систем, программирующих с помощью DSL, называемой Red / System, и компилятор удивительно меньше 2 МБ . Вы можете узнать больше о Red здесь , и вы можете скачать его здесь .

Графический интерфейс пользователя

Вот «Hello World», используя систему GUI Red.

Red поставляется с интерпретатором, поэтому вы можете пойти дальше и запустить код ниже, набрав red hello_world_gui.red

Red []
view [ text "Hello World" ]

Red интерпретирует этот код и запускает его без компиляции в двоичный файл. Если вы хотите создать двоичный код, измените код на следующее:

Red [ needs: 'View ]
view [ text "Hello World" ]

и запустить:

red -r -c hello_world_gui.red

Результатом этой компиляции является один бинарный файл, который отображает слова «Hello World» в графическом интерфейсе. Поддержка GUI в настоящее время недоступна в Linux (это экспериментально), но компиляция этого работает на Windows и Mac. Red поддерживает кросс-компиляцию, поэтому вы можете скомпилировать двоичные файлы для другой платформы. Мы можем получить список доступных целей кросс-компиляции, которые может компилировать Red.

hako ~ red -h
...
Cross-compilation targets:

    MSDOS        : Windows, x86, console (+ GUI) applications
    Windows      : Windows, x86, GUI applications
    WindowsXP    : Windows, x86, GUI applications, no touch API
    Linux        : GNU/Linux, x86
    Linux-ARM    : GNU/Linux, ARMv5, armel (soft-float)
    RPi          : GNU/Linux, ARMv5, armhf (hard-float)
    Darwin       : macOS Intel, console or GUI applications
    macOS        : macOS Intel, GUI-only, applications bundles
    Syllable     : Syllable OS, x86
    FreeBSD      : FreeBSD, x86
    Android      : Android, ARMv5
    Android-x86  : Android, x86

«Hello World» не так полезен, но давайте продолжим с помощью простого средства просмотра изображений, где мы получаем случайное изображение, вот код:

Red [
	title: "Simple Image Viewer"
	author: "Wesley Hill"
	version: 0.1
	needs: 'View
]

rand_img: https://source.unsplash.com/random/310x200
message: "Press Random for a random image!"

view/options [title "Simple Image Viewer"
	 below center
	 pictures: image 310x200 message
	 across
	 random_btn: button "Random" [
		new_image: load rand_img
		pictures/image: new_image
		pictures/text: ""
	]
	 text "A Simple Image Viewer in Red"
][]

Эти две переменные rand_imgи messageсозданы выше, и мы используем эту viewфункцию для вызова диалекта VID Red и View Engine, мы установили, что наш заголовок и макет находятся в центре окна. Наши изображения будут иметь размер, 310x200используя pair тип данных, и мы устанавливаем нашу кнопку random_btn и text переходим друг от друга. Наконец, как только мы нажимаем кнопку «Случайный», мы используем эту load функцию для извлечения данных из источника. Источник должен быть путь, который может представлять собой file, string, binary или url тип данных.

В этом случае мы используем url тип данных, rand_img и мы устанавливаем наш образ с pictures/image:нашим новым изображением new_image. Мы хотим, чтобы наш образ отображался, поэтому мы устанавливаем текст на изображении пустым.

Мы можем проверить тип данных с помощью встроенной функции type. Обратите внимание, что Red имеет более 50 типов.

>> print type? rand_img
url
>> print type? message
string
>> 

Как только мы запустим код выше, мы получим наш простой просмотрщик изображений!

... и он также работает в Windows

Red может использоваться для более сложных приложений, вот несколько:

Автоматический фотопленок

Для более продвинутого приложения, использующего Red, я написал программу для моего папы, чтобы иметь дело с перемещением сотен фотографий. Ниже приведен графический интерфейс программы в действии. Я использую коллекцию случайных фотографий для демонстрации программы.

Эти демо-фотографии крошечные (~ 5 КБ в среднем), а фотографии, с которыми работает мой папа, обычно составляют около 14 МБ на фотографию в море тысяч фотографий.

Разбор данных

Входные данные - это фактически электронное письмо, содержащее список фотографий, выбранных клиентом.

Выбор изображений:

BIRTHDAY PARTY > ABC 7453
TIF_FILE_ID: 0123456789

BIRTHDAY PARTY > ABC 7454
TIF_FILE_ID: 0123456790

...

BIRTHDAY PARTY > ABC 8217
TIF_FILE_ID: 0123456899

Имя выбранных фотографий имеет вид ABC_1234.jpg. Поэтому было бы разумно использовать регулярные выражения для этой проблемы. Вместо этого у Red есть собственный анализатор соответствия шаблону, первоначально изобретенный Rebol под названием PARSE .

Следующее регулярное выражение ниже ...

[A-Z]{3,}\s\d\S{3,}

... аналогично следующему правилу PARSE:

[some letter space 4 digit opt letter]

Учитывая следующие правила letterи digit:

letter: charset [#"A" - #"Z"]
digit:  charset "0123456789"

Причина, по которой opt letterвключена в правиле синтаксического анализа, заключается в том, чтобы поймать ABC 1234Aнеобязательную edgecase, которая иногда появляется в письме. Ниже показано, как синтаксический анализатор видит это правило:

Используя Red interpreter, мы можем проверить, работает ли правило анализа. Для успешных совпадений возвращается PARSE trueи в falseпротивном случае.

>> parse "ABC 1234" [some letter space 4 digit]
== true
>> parse "ABC 1234A" [some letter space 4 digit opt letter]
== true
>> parse "ABC 1234AB" [some letter space 4 digit opt letter]
== false

PARSE является альтернативой Rebol / Red, альтернативной теперь универсальному синтаксису регулярных выражений, с которым знакомы большинство, если не все опытные программисты. Мне потребовалось некоторое время, чтобы изучить синтаксис, и я ценю тот факт, что правила находятся на простом читаемом английском языке, в отличие от регулярного выражения.

Написание этого приложения заняло у меня выходные после прототипирования и тестирования на Python, это <220 строк кода. Мой папа использует Mac, поэтому создание двоичного файла так же просто, как компиляция источника в режиме выпуска для macOS.

red -r -o "APC" -t macOS apc.red --red-only -v 4

и это даже не 2 МБ, а это. просто. работает. ™

Линия клонов

Чтобы продемонстрировать возможности сети и возможности сериализации Red, я снова создал приложение, которое у меня было на моем телефоне под названием Lines, которое является простым заявлением о статусе трубки в Лондоне. К сожалению, он больше не доступен в App Store, но у меня все еще есть его на моем старом iPhone. Изображение справа показывает, как оно выглядит.

 

Ниже приведено одно и то же приложение, реализованное в Red. Нажатие на «Линии» откроет информацию о конкретной линии трубки.

 

В настоящее время у Red нет встроенного анализатора JSON. Я обнаружил, что парсер JSON плавает вокруг, что было достаточно хорошим для этой демонстрации. Построение этого приложения заняло около 3 дней бесплатного времени и составляет около 897 КБ.

Заключительные мысли

Помимо системы GUI, которая может работать с реализацией Linux (бэкенд GTK3 работает для Red), имейте в виду, что Red в настоящее время компилирует двоичные файлы в 32 бит . С помощью приложения Automated Photo Copier у меня были проблемы, когда я копировал большие фотографии с помощью Red, и часто программа просто разбилась внезапно. Я переключился на использование, cpчтобы скопировать фотографии (так как я знал, что мой папа использовал только Mac), позвонив call/consoleв cpкоманду. В этот момент он копирует изображения безупречно. Это будет другая история, если бы он использовал Windows.

Является ли Red хорошей альтернативой Electron? Если вы создаете небольшой внутренний инструмент, для которого требуется быстрый графический интерфейс или нужен графический интерфейс с кросс-платформой с меньшими головными болями в развитии, тогда да . Это еще не готово к производству, но у Red есть огромный потенциал в будущем, глядя на их дорожную карту . Я должен признать, что кривая обучения немного умеренная, если вы не знакомы с Rebol (ресурсы и ссылки ниже). Альтернативой, которую мне еще предстоит испытать, является Lazarus (возможно, в будущем blogpost!), Но скорость разработки графического интерфейса в Red очень многообещающая.

Код клонирования Lines является открытым исходным кодом на GitHub.

Если вам интересно узнать больше о Red, ознакомьтесь с этими ссылками:

  1. Я использовал проверенные и проверенные, вы знаете: Python, Ruby, Java, C / ++ / # и JS, но хотели попробовать что-то новое. С точки зрения GUI для Go, блестящий экспериментальный, есть therecipe / qt и мой личный фаворит, andlabs / ui .

  2. Существуют некоторые приложения Electron (Visual Studio Code), но это исключение, а не правило.