一句话概括 — 使用 Red 语言编写原生跨平台桌面 GUI。

尝试在 Windows 上使用 PyInstaller 将“可执行”的 ducktape 封装在 Python 脚本之后,我发现应该学习的编程语言类应该具有以下属性:

静态二进制编译(产生一个二进制,不是运行时的字节码,例如 Java、Python)

快速

跨平台(Windows,Mac,Linux,* BSD 和/或 Haiku (Bonus))

为了达到这个目的,在三年前我学会了 Go(开始使用 Go 开发一个应用程序),我可以确定 Go 的二进制文件可以通过交叉编译在多个平台上运行。其他语言如 Crystal 和 Rust 也支持类似机制,但当时都不稳定。今天,我正在探索原生跨平台GUIs1的可选方案。

基于 Electron 构建的“现代桌面应用”已经有很多了。它允许程序员用 HTML、CSS 和 JavaScript 来构建桌面应用程序。听起来真棒吧?好吧…

虽然 Electron 比较容易,快速面世并且对程序员而言成本效益更高,Electron 以二进制大小和内存使用量庞大2而臭名昭着。你可能遇到过唱衰使用它的帖子,基本上到了这种程度:如果任何应用程序敢于使用它,几乎可以保证它会在在线技术论坛上遭受抨击。

令你失望的是,这不是其中抨击帖子之一。Qt 和 GTK+ 是有趣的选择,我甚至打算自己使用它们。但是,两者都不如 Electron 那样快速发展。我们可以兼用二者吗?一个原生的可快速开发的跨平台GUI?不妨看看 Red。

Red

“Red 是受到 Rebol 强烈影响的下一代编程语言。”

Red 的诞生很大程度是受 Rebol 的影响,它是专有的封闭源码软件(直到2012年,Rebol 3才成为开源软件)。这两种语言都有一个很好的图形用户界面系统(下面我们将介绍),Red 的不同之处在于它可以用于系统编程,使用名为 Red/System 的小于2MB DSL 编译器。你可以在这里找到Red,并下载。

GUI

这有一个使用 Red GUI 系统的 “Hello World”。

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

编译结果是一个单独的二进制文件,运行它会在 GUI 中显示“Hello World”。目前在 Linux 下还不支持 GUI(还在实验阶段),但是在 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 语言,在这里我们将得到一个随机的图像,这里是代码:

Red [

title: "Simple Image Viewer"

author: "Wesley Hill"

version: 0.1

needs: 'View

]

rand_img: http://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函数来调用Red的 VID dialect 和 View Engine,我们把标题和布局设置在窗口的中心。我们的图像大小为310×200,使用了 pair 数据类型,并且将我们的按钮 random_btn 和文本设置为相互响应的。 最后,一旦我们点击“随机”按钮,我们会使用加载函数从源检索数据。 源需要提供一个路径,可以是文件,字符串,二进制或url数据类型。

在这种情况下,我们使用rand_img中的url数据类型,并通过将 pictures/image: 的值设置为新的图像存放地址 new_image 以使用图片。因为我们只希望显示图像,所以我们将图像中的文本设置为空。

我们可以通过内置的 type? 功能检查数据类型。请注意,Red有超过50多种类型。

>> print type? rand_img

url

>> print type? message

string

>>

一旦我们运行上面的代码,我们将得到简单的图像浏览器

…它也能运行于 Windows 上

Red 可用于更高级的应用程序,这里有几个例子:

自动照片复印机

对于使用 Red 的更高级的应用程序,我给我父亲编写了一个程序来处理数百张照片。下面是程序的 GUI,我使用了一组随机照片来演示程序

这些演示照片很小(平均约 5KB),我父亲的照片,其大小通常在 14MB 左右,数量上千。

解析数据

输入的数据实际上是一封电子邮件,其中包含客户选择的照片列表。

Selected the following images:

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: charset [#"A" - #"Z"]

digit: charset "0123456789"

解析规则中包含了选择字母的原因是要捕获有时出现在电子邮件中的 ABC 1234A 可选的边框。 以下是介绍解析器如何看到这个规则:

使用 Red 解释器,我们可以测试解析规则是否正在工作。对于成功的匹配返回 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

它的大小甚至不到 2MB。

Lines 克隆

为了演示 Red 的网络和序列化功能,我重新创建了一个名为 Lines 的应用程序,它是一个简单的伦敦地铁状态应用程序。不幸的是,它在 App Store 上已经无法访问了,但我仍旧在旧的 iPhone 上安装过。下面的图片显示了它的样子。

下面是用 Red 实现的相同的应用程序。 点击“Lines”将弹出打开关于特定路线的信息。

目前 Red 没有内置的 JSON 解析器。我发现一个在这个示例中已经足够用的 JSON 解析器。构建这个应用程序需要大约 3 天的空闲时间,大小约为 897 KB。

最后的想法

除了可以用 Linux 实现(一个可在 Red 工作的 GTK3 后端)的 GUI 系统之外,请注意,Red 目前可编译 32 位二进制文件。使用“Automated Photo Copier”应用程序时,我使用 Red 复制大图片时遇到了问题,而且程序经常突然崩溃。我切换到使用 cp 复制照片(因为我知道我的爸爸只使用 Mac)通过在 cp 命令上调用 call/console。这样,它就能完美地复制图像。如果他用 Windows,这将是一个不同的故事。

Red 是 Electron 的一个很好的替代吗?如果你正在构建一个小型的内部工具,需要一个快速的图形用户界面或需要一个开发难度较低的跨平台的 GUI,那么答案是 yes。虽然现在 Red 还没有达到产品级,但从其路线图来看,Red 在未来有很大的潜力。我不得不承认,如果你不熟悉 Rebol(下面有对应的资源和链接),学习曲线会略微适中。另一个我还没有尝试的替代方案是 Lazarus(也许在未来的博客会介绍),但是用 Red 开发 GUI 的速度是非常有前途的。

Lines clone 代码已在 GitHub 上开源。

如果你有兴趣了解关于 Red 的更多信息,请查看以下链接:

我已经使用了久经考验的 Python、Ruby、Java、C/++/# 和 JS,但是我想尝试新的东西。就用 Go 编写 GUI 而言,shiny 是实验性的,这还有 therecipe/qt,以及我个人的最爱,andlabs/ui。

也有一些高性能的 Electron 程序(Visual Studio Code),但这只是例外的,而不是常规的。

linux gui编程语言,使用 Red 语言编写 GUI 应用程序相关推荐

  1. 在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积;再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积。

    在Linux环境下用C语言编写一个乘法程序mult,从命令行接收两个数字,然后输出其乘积:再用C语言编写一个exec1程序,在程序中使用execvp调用mult程序计算5与10的乘积. 1.mult. ...

  2. c语言字符串dna,转录流程(c语言编写DNA转录程序)

    c语言编写DNA转录程序 AT,CG 进行互换就可以了 #include #include main() { char input[50];/*Defined to store the DNA cod ...

  3. 使用C语言编写测速程序

    可以使用 C 语言编写测速程序.要实现这个功能,你可以使用 C 语言中的时间函数来计算程序运行的时间. 具体来说,可以使用 clock() 函数来计算程序运行的时间.这个函数返回从程序开始运行到调用 ...

  4. 编写程序C语言 用递归法求n,用C语言编写一个递归程序用来计算:1*2+2*3+3*4+.+(n-1)*n...

    用C语言编写一个递归程序用来计算:1*2+2*3+3*4+.+(n-1)*n以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧 ...

  5. 用C语言编写低耦合程序

    用C语言编写低耦合程序 耦合的定义 低耦合的优点 实现例子 普通的实现方式 低耦合的实现方式 耦合的定义   耦合,是对模块间关联程度的度量. 模块间的耦合度是指模块之间的依赖关系,其耦合性越强,同时 ...

  6. 使用Scala语言编写Spark应用程序实现数据去重

    使用Scala语言编写Spark应用程序实现数据去重 一.题目需求 二.建立目录结构 (一)创建 sparkapp4 文件夹并切换 (二)创建 data 文件夹(存放A.txt B.txt) (三)创 ...

  7. linux内核是用什么语言编写的?

    严格来说,绝大部分代码是用 C 语言编写的,但在某些关键地方使用了汇编代码,其中主要是在 Linux 的启动部分.由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够 ...

  8. linux运行go程序命令行,宝塔面板Linux环境-安装Golang:Go语言环境安装以及程序如何运行...

    有的人可能对Go语言很感兴趣,这也是近几年很火的一门编程语言,我们可以在宝塔面板Linux环境下安装Go语言环境. 安装环境:CentOS Linux 7.6.宝塔面板6.9.3.golang:go1 ...

  9. C语言编写一个赋值程序,实验2 用C语言编写简单程序——2.1 基本数据处理.doc

    实验2 用C语言编写简单程序--2.1 基本数据处理 实验2 用C语言编写简单程序 2.1 基本数据处理 [实验目的] (1)掌握算术表达式和赋值表达式的使用. (2)掌握基本输出函数的使用. (3) ...

最新文章

  1. Vue性能优化:如何实现延迟加载和代码拆分?
  2. ASP.NET URL重写实现IHttpHandler接口
  3. 【DIY】arduino播放音乐方案——TMRpcm
  4. SpringBoot+thymeleaf实现文件下载(已实践,全流程)
  5. u盘数据恢复的原理_日臻薄技 | 电脑回收站数据恢复的三个方法
  6. Android Studio下JUnit单元测试
  7. centos6.9安装MySql可视化管理工具
  8. linux下载安装自我见解
  9. MySQL源码调试入门
  10. IDEA java 调用 webservice接口
  11. java代理模式租房案例
  12. landesk 卸载_LANDesk软件分发在项目中的深入探索(续2)—客户端已安装应用程序的远程卸载...
  13. arduino继电器控制风扇_Arduino基础入门篇24—继电器控制
  14. 用Q-learning算法实现自动走迷宫机器人
  15. 订阅内容解码失败(非base64码)_【每日礼包】超杀默示录 密文解码礼包大全
  16. c语言 交通处罚单管理程序 typedef struct,交通罚单.doc
  17. python 基于xgboost预测波士顿房价
  18. 各种int的取值范围
  19. android XML文件加注释
  20. ffmpeg 音频解码二

热门文章

  1. JavaFX自定义控件– Nest Thermostat第1部分
  2. Java:本地最小语言
  3. MongoDB身份验证
  4. 5分钟内Google App Engine上的Vaadin App
  5. 使用Spring和Java泛型简化数据访问层
  6. Spring依赖注入技术的发展
  7. Spring和AspectJ的领域驱动设计
  8. 开源相册系统Java_基于JAVA的B/S网络相册管理系统
  9. SVN更新数据和提交数据的几个疑问
  10. JVM 内存示意图(内存结构图/内存解析图)