程序设计百花齐放,可能有成千上万中程序设计语言,TOIBE有排名,列举了排名靠前的100种。凭什么GUI描述只能使用html/xml呢?
当然,使用html/xml有好处,有大量使用htmljs的网页设计师。但是,xml的缺点是显而易见的 --- 虽然看上去不复杂,用起来不难,但是给程序员和计算机带来的计算浪费、费的电恐怕要以亿万来记。
想一想,浏览器一天要解析多少次html?如果表达能力和html相当,但是程序解析更容易,哪怕每个网页节省1ms,给这个世界带来的电费的节省,恐怕都是难以计量的。
我所谓的节省,并不是程序设计水平高,写的程序更好,所以节省时间,而是因为html/xml规则本身的问题。
linus很久之前就对xml的批评,下面是我找到的一些翻译:
“XML 可能是设计的最糟糕的格式,作为一种文件格式,它真的没有扩展能力,它通常是一个完全的灾难。“
“XML 是胡扯。??解析 XML 对人类来说是??讨厌的,甚至对计算机来说也是一场灾难。没有理由让这个可怕垃圾存在。
“2014年3月6日
好了,现在谈谈我的GUI设计方法。如果吹嘘我的这种方法世界第一,不现实。但是对本人来说,确实最便于解析的。其实,我希望人们都设计并实现自己的GUI描述方案,甚至使用非html/xml浏览器。毕竟,这种费电的垃圾不应该继续存在。人们不得以使用,也只是因为没有更好的选择。
下文谈到的GUI库,起初只是想使用C/C++编写GUI程序时更容易、更加符合正常人的思维,而并非要取代html/xml。但是,我写这些时,一堆人劝我html好 xml好啊,是业界标准啊等一堆废话,我不得不批评一下这些业界垃圾。我批评没是什么说服力,于是找了linus的一段话。
与其在网上找一些开源的xml解析库,上万行代码,确实不如自己自创更加容易解析格式。这是我的观点,比如我的下文@gui格式,是专门为gui描述设计的,我用c++解析,300行代码,完成了最多1000行。程序代码规模缩小了10倍以上。程序解析效率,暂时还没比较,快10倍不敢保证,快2、3倍不在话下。
我相信,一个脑子正常、认真思考的人,都能设计出比xml/html更加便于解析而表达能力相当的语法。我的方案,也许是其中最差的一个;但是,即使我这个最差的设计,也要比html/xml好上10倍。
xml号称通用的格式,所谓的通用,意思是这也不行,那也不行 --- 人们对此要有认识。
如果说html格式解析困难,是垃圾。那么js垃圾不垃圾?node.js垃圾不垃圾?世界上这么多使用js的node的程序员是不是都是垃圾?
互联网五花八门,其中很多大公司既得利益者,其中并不少缺少一群走狗。他们习惯了一项技术,并从中受益,当然会为这些垄断技术背书。他们的无耻无知之处,在于他们对这种罪恶一无所知。假如它们幸运的看了我这段话,也许会醍醐灌顶,醒悟过来。
我想,多数都是勤恳工作学习的普通人,但是必须承认,html和js并非完美的。人们不能因使用的人多、大公司支持等等各种原因而拒绝改变,拒绝创新。而应该像陶渊明一样,不为五斗米而折腰。
最后,我还要批评html和xml所谓的“开放”格式 -- html真的是开放的吗?确实,人人都能使用。但是,说到底,他不过是一群垄断公司,出人出钱商量出来的玩意。与其说是开放,不如说是垄断。
大公司不在乎用户费电,准确来说,他们也许希望用户费电,希望用户换CPU,他们好扩大生产,更新换代。所以,如果微软、google以及各个浏览器厂支持html/xml恰恰证明了,这是错误的选择。毕竟,没有人相信,他们真的会为用户的利益着想。
; 变量定义
@var
a=12 b="helo world" c=12.5 d=true
; 图形界面描述
@gui
1 <WINDOW> name="first" click=firstclick title="测试" top=100 left=100 width=100 height=100 image="D:est 1.bmp"
2 <DIV>
3 <TEXT> name="t1" caption="My..."
2 <WINDOW>
3 <TEXT> caption=b
3 <DIV>
4 <TEXT> captiion="Hello world"
; 初始化函数
@init
; 调用C++/Python等各种程序设计语言的函数,返回值可以存进变量。
a=cpp_fun1(12,"hello") $first.title=a
; 控件的键盘、鼠标处理函数
@firstclick
$first.title="Changed Titile"
以上文件,包括4个部分:
一、变量定义 @var
这部分定义一些变量,变量在下文中可以直接使用,并赋值。下文中的Text的caption的值为"hello world":
3 <TEXT> caption=b
二、图形界面描述。 @gui
这部分描述你的图形界面,上文是一个简单的描述。实际中,你的程序可能需要很多窗口。大致是这样的:
1 <WINDOW> name="first" click=firstclick title="测试" top=100 left=100 width=100 height=100 image="D:est 1.bmp"
2 <DIV>
3 <TEXT> name="t1" caption="My..."
2 <WINDOW>
3 <TEXT> caption=b
3 <DIV>
4 <TEXT> captiion="Hello world"
1 <WINDOW> name="option"
2 <panel>
3 <checkbox>
3 <TEXT> name="t1" caption="My..."
注意:以行为单位。也就是说:
3 <TEXT> name="t1" caption="My..."
不能分几行来写。这么做的目的是为了方便程序员解析。
每一行开头的数字表示该控件的层次,1意为顶层窗口,n+1层表示绘制与N层中。不同的层次控件用空格缩进,这么做是为了美观,你能一眼就知道第二层在第一层控件里面绘制。
我们注意到上文中有两个1层窗口,我们的库默认只创建第一个窗口,其余的窗口可能在后文中的函数中创建并显示。
top left width height是分辨率单位,但是,一个良好的gui,应该指定百分比而不是分辨率。因为指定了百分比,只要精度可以,我们不需要知道屏幕的分辨率大小。
1 <WINDOW> name="first" click=firstclick title="测试" top=10% left=10% width=90% height=80% image="D:est 1.bmp"
三、@init函数
这是创建窗口后的初始化函数,在这里,你可以调用C++/Python等语言的函数,可以把返回值赋给变量,以便后面继续使用。
$first.title=a将更改name为"first"的控件的标题。
四、鼠标、键盘处理函数如下:
click:单击
dblclick:双击
mousedown:鼠标按下
mouseup:鼠标抬起
mouseover:鼠标悬浮
mouseout:鼠标离开
mousemove:鼠标移动
mouseenter:鼠标进入
mouseleave:鼠标离开
keydown:按键按下
keyup:按键抬起
keypress:按键按下抬起
以上是JavaScript的键盘鼠标处理函数。子控件的键盘鼠标处理函数将会覆盖父控件的处理函数。
用户应当在标签页属性中指定上述中的若干个事件处理函数,然后编写你的处理函数,比如@firstclick,就是name=“first”的<window>的单击事件处理函数。
在函数体中,你可以调用C++ Python等语言的函数。
总结:
到这里,一个简洁、优美的GUI编写方法就完成了。笔者毫不怀疑,这种编写GUI的设计方法超过目前所有的GUI库,特别是各种乌七八糟的面向对象库。但是,具体到具体的实现,我想也许我们可能避免不了使用一些OO GUI库。
如果你想在Python里实现这种,你可能要使用Python tkiner或者wxpython,总之一种OO GUI可能是少不了的。也许,这些GUI库,不够用,你可能要使用功能更加丰富的GTK,但是也许会使用Windows API或者xlib。
理论上,该方法不受操作系统、程序设计语言的限制。实际上,使用这种方法编写GUI程序的人,可能只有我一个。假如有同学觉得这种方法好,而且编程功利扎实,不但能实现上述文本分析,而且能编写各种控件....
你所需要做的只有两件事:
一、编写程序能解析这种GUI描述。这不是一项多么困难的工作,但是也不轻松。特别是@gui部分。你需要小心处理你的树形结构。增加节点,删除节点,遍历节点。我相信,多数程序设计者做过类似的工作。大致结构如下:
struct MyControl{
struct MyControl *parent; //父控件
struct MyControl *child; //子控件
struct MyControl *bbrother; //兄弟控件,同一层次
}
以上,省略了每个节点具体的信息,简单给出了必须的父子兄弟指针,最终,我们得到一颗树颗结构。
二、小心编写你的控件代码。也就是各种控件标签的实现<window> <text> <div> <panel>....
这部分有点复杂,形形色色的控件,需要设计不同的属性。这部分可以参考html标签和各种GUI库控件。
最后,贴上我写的程序:
https://github.com/zhangyun00...
再重申一下逻辑:
html/xml复杂难以解析 -- 费CPU费电(也费人脑) -- 大公司希望用户费CPU,特别是Intel等CPU厂商,费电了人们就不用了?不是而是更新换代。
也就说说,大公司会故意把东西做的难用,难以解析,然后出升级版让用户掏钱。
小公司也是,程序员把某些东西写死,用户提需求,然后改一下,大笔的钞票到手了。
多数人认为chrome、firefox、ie...等等是竞争对手,实际上,它们也许是狼狈为奸。
实际上,C++也是垃圾,很可惜,上了贼船。