工劳快讯:汕尾美团骑手罢工取得阶段性胜利

记者调查泉州欣佳酒店倒塌曝惊人“案中案”:曾是卖淫场所,50名老板、官员卷入其中

退出中国市场的著名外企名单

去泰国看了一场“成人秀”,画面尴尬到让人窒息.....

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

你真的知道什么是“脚本”吗?!

Jacen He aardio 2022-05-31

脚本(Script)有2个最基本的特征:


1、脚本主要是以文本的形式直接发布,即使以加密或打包的方式隐藏文本源代码,但实际运行时仍然需要释出源代码才能执行,或者虽然支持编译为字节码,但该语言大多数的应用程序都是以文本的方式发布。


2、脚本语言主要是由宿主程序(Host)在运行时调用,脚本语言不能独立编写应用,不能编写与宿主程序类型不同的应用。脚本语言调用的功能主要由宿主程序提供,脚本不能独立编写应用程序。


有一些搞中文编程的,经常跑过来批评aardio是脚本语言,其实我看了一下他们的标准支持库都是封装的VC++写的代码,自己都不能实现自己的标准支持库。其实这种机制本质上才是脚本的思想,自己不能做饭给自己吃,大多时候都要靠VC++之类其他的第三方编程语言封装出宿主形式的功能函数,然后寄生在宿主身上。说简单一点,要知道一个语言是不是脚本语言,关键不是看他“怎么做”!而是看他能“做什么”?!


这个意思也并不是非常极端的要自己从零开始实现一切,很多新手总是觉得搞个语言一定要自己能实现自己,包括操作系统的接口函数都不能用,一定要自己从零开始写操作系统才牛逼。如果把编程语言比作一个人,如果你不需要父母能自己把自己生出来,并不就能证明你有多牛逼。但是你被生出来了,长大了,你还不能自己做饭给自己吃,这就是个问题了。所以关键不是你怎么被生出来,而是你被生出来以后你能干什么,能不能自己做饭给自己吃。


很多人把“解释语言”、或者有虚拟机的语言理解为脚本语言,这是完全错误的,例如Java、C#是解释语言,但是他们都可以独立编写应用程序,并且主要的发布方式不是发布文本源代码,而是编译为字节码,或者独立的执行程序。所以他们并不是脚本语言。


再例如C语言、C++虽然是原生编译语言,他是也可以作为脚本语言使用,典型的例如我们常用的TCC,就是使用C语言作为脚本语言来使用,可见“脚本”并不是一种语言分类,而是一种发布形式。我们一般说某某语言是一种脚本语言,更多时候是在说他的编写、发布方式主要是脚本形式。虽然每种语言理论上都可以作为“脚本”来发布,但是注意我前面多次提到的“主要”这个词,例如C语言主要的发布形式不是“脚本”,所以不会把C语言叫“脚本语言”。


脚本语言只能受制于宿主应用程序的类型,例如你写PHP,那么你不可能用PHP写出一个php_cgi.exe, 而只能让你的脚本运行于php_cgi.exe这样的宿主应用环境下,你能看到的大多数PHP应用程序都是以文本源代码的方式发布。 虽然aardio也像PHP一样可以用来写网站,但是我们可以用 aardio 开发一个 php_cgi.exe, 我们不仅仅可以用aardio来写网站,我们还可以用 aardio 写HTTP服务器,写FastCGI 服务端,写各种各样类型的桌面应用程序,包括开发各种宿主应用程序( 拿其他编程语言来当脚本玩耍 )。


一些人把Python叫脚本语言,也有一些人在网上争论“Python到底是不是脚本”这个东西。Python虽然也可以编译为字节码,他主要的发布形式也是发布文本格式的py源代码,并且依赖外部安装的Python.exe来运行Python代码,但是Python可以独立写出各种类型的应用,甚至是OpenStack这样大型的系统程序。所以虽然Python通常是以脚本的形式发布应用程序,但是他在语言特性上来说如果你硬要把他称为“脚本”,那也是非常强大的一种“脚本”。


脚本语言并不能编写EXE文件这样的独立应用程序,并且他在运行时需要一个外部的宿主EXE文件来执行脚本,有些脚本软件的打包程序可以把EXE文件以及脚本代码打包并捆绑为一个独立的EXE文件,但是他在运行时仍然会释放出脚本的文本形式的源代码来运行,另外脚本中调用的主要功能函数都是由宿主EXE提供的,脚本通常不能独立的调用系统接口,独立的“创造”更多扩展功能的函数。Javascript一般被认为是一种典型的脚本语言,他最初依附于浏览器,而JS脚本最初更多的是被用来调用宿主程序的各种接口,并且他开发的应用类型局限于网页脚本,但现在有了Node.Js 这样的东西,越搞越像Python了,而且还有Electron这样的方案可以用来写桌面软件,但实际上这种桌面软件最后都要依附于Electron.exe以及里面的浏览器运行环境,而且他发布打包的asar格式,实际上还是以文本格式发布Javascript源代码(虽然是打了一个包),所以他仍然更像一个浏览器壳子下运行的脚本打包器,即使是很简单的一些需求,如果Electron这个宿主里没有提供接口,那只能干巴巴的等着Electron升级,而不能直接去调用操作系统的接口,这是脚本语言的一大限制。


aardio程序都是发布为EXE文件这样的独立执行程序,aardio是一个桌面软件开发工具,几乎没有人用之写脚本( 前面说过,理论上任何编程语言都可以用来写脚本,你当然可以用 aardio写脚本,但几乎没有人用aardio来写脚本)。


aardio代码被发布时就会编译为字节码,编译后的程序源代码将不复存在,所以不能还原源代码,aardio程序由运行时自带的虚拟机执行编译后的字节码,当然aardio也会生成CPU直接执行的代码以获得与静态语言接口交互的能力。aardio虽然是一个动态语言,但并不是单纯意义上的动态语言, 动态语言的特性只是aardio的一部分,aardio还具有静态类型编程能力,因此可以与静态语言的直接交互。普通的动态语言是不能让你操作指针、甚至是函数指针,可以如此方便的与静态语言交互。


虽然aardio的胶水能力极强,可以轻松的调用一堆的第三方编程语言、或者开源组件,但这并不等于我们只是在调用别人的东西,实际上即使是aardio的运行时也只会提供很少的一些语言级别的基础内核函数,例如字符串操作、数组操作等等,aardio的运行时非常小( 比其他大多数编程语言的运行时都要小 ),aardio的几乎全部功能由开源的aardio标准库提供,并且我们的标准库基本是由纯aardio源代码实现。 


我举一个例子,aardio有一些模拟自动化的库,例如winex,key,mouse这些库,其实这在aardio的标准库中只是极少的一部分,用 aardio 开发的应用程序,这类模拟自动化的程序并不是很多,包括我们论坛上这类的开源代码也只是极少的一部分。但是有一些模拟脚本工具,看到我们也提供了这些库,就过来自称为同类工具、并且去做一些比较或者发动一些口水争论等等。其实我觉得他们有一个相当大的误解,他们这些模拟脚本软件里面用到的关键的模拟功能函数 - 大多数是使用C++这些语言在宿主应用程序里编写的,他们的脚本更多是寄生性质。而我们 aardio 中这些模拟自动化的库,所有的功能函数都是由百分百的纯 aardio 代码实现的。aardio的运行时只提供语言级别的基础支持。


包括我们最常用的 win.ui 界面库,也是纯 aardio 代码编写,我们自己要用的各方面的库,我们用 aardio 代码自己实现,并且我们可能还做的不错,例如一些人使用Python还嫌弃他们Python的界面库不好用而是调用aardio来为Python写界面,即使是Python的界面库也都是C++写的,实际上能自己从底层SDK实现GUI界面库,并且还能弄的好用的编程语言是非常少的,GUI界面库一直是编程的一大难题。包括你在 aardio 引入的其他界面组件,你可能也觉得挺好用,但你别忘了,你是因为在 aardio 中才觉得好用,是因为基于 win.ui 这个核心的基础界面库你才觉得好用,换个语言或界面库 - 你可能就觉得不那么好用了。


如果把编写软件比成“做饭”,那么 aardio是自己做饭给自己吃的编程语言,相比其他一些编程语言,他们通常需要巨大的外部运行库(而且还不是用他自己写的,而是用其他语言写的),并且很多语言他的标准支持库、或者平时用到的组件、控件需要大量的使用第三方语言,一个例子是VB或者与VB类似的开发工具,写一个VB程序你用到的大堆的控件几乎98%以上是用VC++写的。

aardio就不一样了,我们编写aardio程序,我们用到的98%的库,都可以是纯aardio代码自己编写的( 而且不意外的话,基本都是我一个人写的 )。相比其他的很多编程语言,aardio的运行时极小,所以说我们 aardio 是自己做饭给自己吃的编程语言。

当然aardio调用其他语言的组件也很方便,我们也有调用其他语言的组件,例如浏览器组件这种东西,你用任何编程语言都不会自己去写这种组件,你肯定找开源组件、或者系统控件来用,这种我们不会自己造轮子,我们大量的、友好的、方便的支持开源组件。我们自己做饭给自己吃,并不等于说我们自己生产化肥、收割机、然后自己生产大米,但是我们自己做饭。

文章有问题?点此查看未经处理的缓存