Gox语言是以Go语言(Golang)为基础的解释型/脚本语言,它除了具有一般脚本语言所具有的编写快捷、语言简洁、易于理解等特点外,还支持其他语言所不具备的跨平台原生图形界面(GUI)开发,并且代码写起来非常舒畅。


Gox语言的主要特点包括:

  • 跨平台,目前支持Windows、Mac和Linux等主流平台;
  • 完全免费和开源,使用MIT授权协议;
  • 代码基于Go语言(Golang),但做了一些优化,因此Go语言、C语言、C++、C#、Java及类似语言的开发者编写起来几乎没有任何压力,稍加了解就可以开始编写代码;
  • 相较于Go语言严格的语法书写要求和静态数据类型限制,Gox语言实现了动态类型,并做了许多更接近主流高级语言的改进,使得代码书写上方便了很多;
  • 基本支持所有Go语言主要的标准库,并加以扩充,并且理论上可以支持任意多的第三方扩展库,依托Go语言社区已有的海量代码库,Gox语言具备成为全栈语言的潜力;
  • 具备嵌套执行脚本的能力,支持模块化编程,支持比Go语言更方便的面向对象编程;
  • 与一般的解释性/脚本语言不同,Gox语言自带代码加密功能,支持对发布的代码进行加密,以及对加密代码的解密执行功能,可以有效地保护开发人员的工作;
  • 语法基于Qlang这种与Go语言能够紧密互操作的语言,天然继承了很多Go语言的优秀特性,例如goroutine和chan等;
  • 多脚本之间可以共享全局数据;
  • 支持跨平台的原生图形界面(GUI)的开发,并且界面布局代码书写简单易懂;
  • 绿色,无安装文件或安装包,无需安装和任何环境配置过程,没有任何依赖,只需下载一个可执行文件,即可实现所有Gox代码开发和程序执行的任务;
  • 更为神奇的是,这一个主程序文件竟然能够同时支持命令行模式的开发和图形界面(GUI)的开发,并且还自带交互式编程环境(REPL),甚至还内置了一个图形化的、支持代码高亮和语法检查的代码编辑器!


下面用一个例子来介绍一下用Gox编写代码的方便程度,这是一个实现了简易计算器功能的代码:

expression = getInput("Please enter the expression: ")result = eval(expression)println("result:", result)

仅仅4行代码而已,实现的效果如下:

可以看到,4行语言就实现了一个命令行版本的简易表达式计算器。


如果用GUI图形界面来实现怎么样呢?同样的,只需要相对很简单的代码就能实现:

text1 = new(string)onButton1Click = func() {// evaluate the expression in the text inputrs = eval(*text1)println(rs)// set the result back into the text inputsetValue(text1, rs)
}// close the window, also terminate the application
onButton2Click = func() {os.Exit(1)
}// main window loop
loop = func() {// set the layout of GUIlayoutT := []gui.Widget{gui.Label("Enter an expression."),gui.InputText("", 0, text1),// widgets in line layout is aligned left to rightgui.Line(gui.Button("Calculate", onButton1Click),gui.Button("Close", onButton2Click)),}gui.SingleWindow("Calculator", layoutT)
}// text1 used to hold the string value of the text input
// notice: text1 is a pointer
// setup the title, size (width and height, 400*200), style and font-loading function of main window,
mainWindow := gui.NewMasterWindow("Calculator", 400, 200, gui.MasterWindowFlagsNotResizable, nil)// show the window and start the message loop
gui.LoopWindow(mainWindow, loop)

除去注释,有效代码不超过20行,就能够实现一个界面相当不错的图形化计算器了,而且可以实现跨平台!实际效果如下图所示:


那么,更为令人叹为观止地,一个支持中文、跨平台、功能齐全而又简洁的代码编辑器也不需要多少Gox代码就可以实现,运行效果如下图所示,有效代码仅需不到200行(请参见本文末尾所附代码)。

由于仅是示例,篇幅所限,没有实现代码高亮和自动完成功能,但除此以外,一个代码编辑器所需的所有主要功能都已经实现了,甚至还包括代码加密、解密和运行功能。


下面看看Gox语言的主要使用方式。

  • 首先,直接去Gox语言官网(gox.topget.org)或其Github/Gitee的release页面(topxeq/gox)下载Gox语言的单一可执行文件,将其放在一个目录下(如果是下载的zip压缩包,需要进行解压缩);该目录最好在操作系统可找到的目录下(即加入PATH环境变量中),以便执行;

  • 直接在命令行模式下(例如Windows的命令提示符)运行gox命令即可进入交互式编程环境,如下图所示:

  • 使用类似 gox -edit basic.gox 的命令可以启动Gox的内置编辑器编辑名为basic.gox的Gox代码文件,而如果直接用 gox -edit 不带文件名,则将打开一个新文件进行编辑;

  • 也可以在Gox交互式编程环境中直接用edit函数来启动图形化代码编辑器:

  • 运行Gox代码,只需要执行类似 gox basic.gox 的命令即可,也可以直接执行JavaScript代码文件,例如 gox test.js。

  • 使用类似 gox -encrypt=mycode basic.gox 的命令来对源代码进行加密(mycode是密码,将会生成一个名为basic.goxe的加密代码文件),然后可以使用类似 gox -decrypt=mycode basic.goxe 的命令来对代码进行解密,或者直接用 gox -decrun=mycode basic.goxe 命令来解密执行源代码,也可以直接 gox basic.goxe 执行源代码,此时将会要求先输入密码后才能执行;

  • 除使用内置的代码编辑器外,也可以使用功能更为丰富的其他编辑器,例如Visual Studio Code就是一个很好的选择,将.gox类型文件的文件的代码高亮方案设置成与Go语言相同即可;

  • 更多的说明和代码示例可以参考Github上Gox语言的代码库,github.com/topxeq/gox。


当然,Gox语言目前也存在不足,我们要心里有数,以便在使用Gox语言时清楚它更适合做什么和不太适合做什么。

目前,Gox语言最主要的不足就是:作为解释型/脚本语言,Gox也具有这类语言的通病,就是执行代码的速度相对比较慢,比一些具有多年优化积累的解释型语言如Python、Java等也要更慢。

另外,Gox语言虽然只有一个主程序,但相对来说比较大(有几十M之多)。但这也比较好理解,毕竟还需要支持图形化编程并自带代码编辑器。考虑到这一点,Gox语言也提供一个去除了图形化编程功能的纯命令行版本,文件大小会小一些,效率也会高一点。另外还有一个Gox Tiny版本,保留了图形界面编程的能力,但去掉了一些不常用的功能。

第三,Gox语言如果要支持更多的第三方类库,需要手动编译源码,但这点对于程序员来说应该不是大问题。


总的来说,Gox语言虽然具备开发各种各种应用场景的全栈开发语言的潜力,但至少目前仍不太适合开发高密度计算类型和需要极高速相应的程序和系统;但它非常适合作为“胶水语言”来作为大型系统之间的粘合剂,也非常适合快速开发一些无需太高速度要求的功能系统(例如可以取代shell脚本的开发、进行各种复杂的文本处理、实现各种网络编程、编写一些图形化操控界面)以及做一些快速原型演示等。


附——全功能简易代码编辑器源码:

argsG = os.ArgseditFileNameG = ""
editFileCleanFlagG = ""
editSecureCodeG = new(string)fcT = ""aryT = tk.GetAllParameters(argsG)
lenT = len(aryT)if lenT < 3 {editFileNameG = ""editFileCleanFlagG = "*"
} else {editFileNameG = aryT[2]fcT = tk.LoadStringFromFile(editFileNameG)if tk.IsErrorString(fcT) {gui.SimpleError("错误提示", tk.Spr("载入文件时发生错误:%v", tk.GetErrorString(fcT)))return}editFileCleanFlagG = ""}// hold the text in main edit control
text1 = new(string)setValue(text1, fcT)onEditChange = func() {editFileCleanFlagG = "*"
}onButtonLoad = func() {if editFileCleanFlagG != "" {rs = gui.GetConfirm("请确认", "文件已被修改,确认要打开另一个文件吗?")if rs == false {return}}fileNameNewT = gui.SelectFile("请选择要打开的文件", "所有文件", "*")if tk.IsErrorString(fileNameNewT) {if tk.EndsWith(fileNameNewT, "Cancelled") {gui.MessageBox("信息", tk.Spr("操作被用户取消"))return}gui.MessageBox("错误提示", tk.Spr("选择文件失败:%v", tk.GetErrorString(fileNameNewT)))return}fcT = tk.LoadStringFromFile(fileNameNewT)if tk.IsErrorString(fcT) {gui.MessageBox("错误提示", tk.Spr("载入文件内容失败:%v", tk.GetErrorString(fileNameNewT)))return}editFileNameG = fileNameNewTsetValue(text1, fcT)editFileCleanFlagG = ""}onButtonRunClick = func() {rs = runScript(*text1, "")gui.MessageBox("运行结果", tk.Spr("%v", rs))
}editorSaveAs = func() {fileNameNewT = gui.SelectSaveFile("请选择要保存的文件", "所有文件", "*")if tk.IsErrorString(fileNameNewT) {if tk.EndsWith(fileNameNewT, "Cancelled") {gui.MessageBox("信息", tk.Spr("操作被用户取消"))return}gui.MessageBox("错误提示", tk.Spr("选择文件失败:%v", tk.GetErrorString(fileNameNewT)))return}editFileNameG = fileNameNewTrs1 = tk.SaveStringToFile(*text1, editFileNameG)if rs1 != "" {gui.MessageBox("错误提示", tk.Spr("保存文件失败:%v", rs))return}gui.MessageBox("信息", tk.Spr("文件已被保存至:%v", editFileNameG))editFileCleanFlagG = ""}editorSave = func() {if editFileNameG == "" {editorSaveAs()return}rs = falseif tk.IfFileExists(editFileNameG) {rs = gui.GetConfirm("请确认", "文件已存在,是否要覆盖?")}if rs == true {rs1 = tk.SaveStringToFile(*text1, editFileNameG)if rs1 != "" {gui.MessageBox("错误提示", tk.Spr("保存文件失败:%v", rs))return}gui.MessageBox("信息", tk.Spr("文件已被保存至:%v", editFileNameG))editFileCleanFlagG = ""}}editEncrypt = func() {gui.CloseCurrentPopup()sourceT = *text1encStrT = tk.EncryptStringByTXDEF(sourceT, *editSecureCodeG)if tk.IsErrorString(encStrT) {gui.SimpleError("错误提示", tk.Spr("加密失败:%v", tk.GetErrorString(encStrT)))return}setValue(text1, "//TXDEF#" + encStrT)editFileCleanFlagG = "*"setValue(editSecureCodeG, "")
}editEncryptClick = func() {gui.OpenPopup("请输入密码##EncryptInputSecureCode")
}editDecrypt = func() {gui.CloseCurrentPopup()sourceT = tk.Trim(*text1)encStrT = tk.DecryptStringByTXDEF(sourceT, *editSecureCodeG)if tk.IsErrorString(encStrT) {gui.SimpleError("错误提示", tk.Spr("解密失败:%v", tk.GetErrorString(encStrT)))return}setValue(text1, encStrT)editFileCleanFlagG = "*"setValue(editSecureCodeG, "")}editDecryptClick = func() {gui.OpenPopup("请输入密码##DecryptInputSecureCode")
}onButtonCloseClick = func() {exit()
}loop = func() {layoutT = make(gui.Layout)layoutT = append(layoutT, gui.Label(editFileNameG + editFileCleanFlagG))layoutT = append(layoutT, gui.InputTextMultiline("InputTextMultiline001", text1, -1, -30, 0, nil, onEditChange))layoutT = append(layoutT, gui.Line(gui.Button("打开", onButtonLoad), gui.Button("保存", editorSave), gui.Button("另存为", editorSaveAs), gui.Button("加密", editEncryptClick), gui.Button("解密", editDecryptClick), gui.Button("运行", onButtonRunClick), gui.Button("关闭", onButtonCloseClick)))layoutT = append(layoutT, gui.PopupModal("请输入密码##EncryptInputSecureCode", []gui.Widget{gui.Line(gui.Label("密码"), gui.InputTextV("", 40, editSecureCodeG, gui.InputTextFlagsPassword, nil, nil)),gui.Line(gui.Button("确定", editEncrypt), gui.Button("取消", func() { gui.CloseCurrentPopup() })),}))layoutT = append(layoutT, gui.PopupModal("请输入密码##DecryptInputSecureCode", []gui.Widget{gui.Line(gui.Label("密码"),gui.InputTextV("", 40, editSecureCodeG, gui.InputTextFlagsPassword, nil, nil)),gui.Line(gui.Button("确定", editDecrypt),gui.Button("取消", func() { gui.CloseCurrentPopup() })),}))// add this to the layout if you would use gui.MessageBox function laterlayoutT = append(layoutT, gui.PrepareMessageBox())gui.SingleWindow("Gox编辑器", layoutT)
}osNameT = tk.GetOSName()if tk.Contains(osNameT, "darwin") {setVar("Font", "/Library/Fonts/Microsoft/SimHei.ttf")
} else {setVar("Font", "c:/Windows/Fonts/simsun.ttc")
}setVar("FontRange", "COMMON")
setVar("FontSize", "15")mainWindow = gui.NewMasterWindow("Gox编辑器", 800, 600, 0, gui.LoadFont)gui.LoopWindow(mainWindow, loop)

Gox语言——支持跨平台原生GUI开发的轻量级全功能脚本语言 - GX1相关推荐

  1. java开发 五大基于jvm的脚本语言_Java基础:五大基于JVM的脚本语言介绍

    [IT168 技术]JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实 ...

  2. 团队开发神器Git全功能介绍

    Git 历史和现状 Git 是 Linux 作者 Linus 的另一个作品.2002 年他还在使用 Bitkeeper 作为 Linux 内核的版本管理,但因为它是 Copyright 有版权的软件备 ...

  3. c语言常用的关键词,【必读】超全的C语言基础知识大全

    我们用一个简单的c程序例子,介绍c语言的基本构成.格式.以及良好的书写风格,加深小伙伴们对C语言的认识. 例1:计算两个整数之和的c程序: #include main() { int a, ...

  4. 微软宣布 .NET 5 计划,支持跨平台、移动开发

    今天,我们宣布 .NET Core 3.0 之后的下一个版本将是 .NET 5 .这将是 .NET 系列的下一个重要版本. 将来只会有一个 .NET ,您将能够使用它来开发 Windows,Linux ...

  5. 【云原生 | 36】Docker快速部署主流脚本语言JavaScript

  6. android应用程序开发_Kotlin与Flutter:Android跨平台应用程序开发,到底选择哪个?...

    移动互联时代--应用为王 移动互联网时代,很难想象没有应用程序的生活.从我们睁眼醒来的那一刻到我们真正睡觉的那一刻,无数的应用程序围绕着我们.根据统计,国人平均在移动设备上花费4个小时以上! 而这其中 ...

  7. fceux源码解析_FCEUX金手指加强版 - 使用Lua脚本语言编写FC/NES金手指脚本

    一直觉得大部分的FC/NES模拟器的作弊码金手指不是那么方便使用, 比如魂斗罗1代, 玩家的武器可以通过修改0xAA的值来改变: 0x11为M弹(重机枪),0x12为F弹(圈圈),0x13为S弹(散弹 ...

  8. Rust GUI 编程漫谈:超越 Web 与原生 GUI

    自打我有了一个写 Uncode IDE 的小目标之后,我开始寻找一些适用于 Rust 语言的 GUI 框架.对于未来而言,基于 Rust 语言写 GUI 提供了大量的优点. 浏览器环境.在进程分离的架 ...

  9. Java SE 6 新特性: 对脚本语言的支持 [VERY GOOD]

    Java SE 6 新特性: 对脚本语言的支持 [VERY GOOD] Java SE 6 新特性: 对脚本语言的支持 Java SE 6 新特性: 对脚本语言的支持 邱 小侠 (qiuxiaox@c ...

最新文章

  1. [luogu 3773][CTSC 2017]吉夫特
  2. html+css常用小笔记(持续更新)
  3. 4万字长文ClickHouse应用实战-物化视图在微信的实践
  4. 将redis当做使用LRU算法的缓存来使用
  5. boost::hana::is_empty用法的测试程序
  6. css响应式布局_Web前端新手怎么入门 如何用CSS做响应式布局
  7. 关于NOMINMAX这个预处理宏
  8. Integer源码解析
  9. 七步从AngularJS菜鸟到专家(7):Routing
  10. 统计单词数(信息学奥赛一本通-T1400)
  11. python 读取xml表结构数据_Python从XML-fi读取数据
  12. 解决左下角没有显示桌面图标
  13. 定义与声明c语言,c语言定义与声明.ppt
  14. Leetcode每日一题:136.single-number(只出现一次的数字)
  15. 7教程统计意义_学渣的医学统计学自救笔记(一)
  16. A2DP和AVRCP蓝牙音频传输协议
  17. 开源的仿真软件HOPSAN
  18. Android3dtouch xposed,乐2 MIUI10 8.10.26增强版 主题和谐 黑域 3Dtouch 分屏 Gay设置-刷机之家...
  19. python在直方图上画折线图_在python中,在柱状图上绘制一个折线图
  20. iOS- 利用UIImageView自己整了个不会说话的汤姆猫

热门文章

  1. 1、SSD算法源码解读-如何进行数据增强
  2. 数一独有:多元函数积分学中的基本公式及其应用
  3. 书籍推荐《未来简史》
  4. Qt5.14_MinGW/MSVC下实现VS2019面板自由拖拽组合功能
  5. Blob 下载类型 type 大全
  6. vue 前端ui框架_vue前端框架
  7. 2022年智能住宅行业发展前景
  8. 最短作业优先(SJF)调度算法
  9. 归因跟踪,精细化运营的利器!
  10. Oracle APEX 系列文章2:在阿里云上打造属于你自己的APEX完整开发环境 (准备工作)... 1