“易语言”十分钟入门教程 易语言” 第 第 第 第 第 第 第 第 第 第 1 分钟:序曲 2 分钟:“易语言”初相识 3 分钟:第一个程序 4 分钟:第一个类库 5 分钟:猜数字游戏 6 分钟:基本语法 7 分钟:面向对象 8 分钟:特色语法 9 分钟:答题时间 10 分钟:收工喽 亲爱的朋友, 您愿意花十分钟的时间, 来了解一门全新的编程语言 “易语言” 吗? 分钟: 第 1 分钟:序曲只有十分钟,时间紧迫,让我们立刻开始,不多说一句废话(这一句话本身算不 算废话?哈哈)。 其实用不着那么紧张, 以人均每分钟阅读 300 字计算, 分钟足以读完 3000 字。 10 况且我也不打算写那么长,因为还要给亲爱的读者留足思考时间。 本文作为十分钟入门教程,无法面面俱到,只能重点介绍初学者着重关注、关心 或感兴趣的部分。本文的主要目的是:让读者在很短的时间内对“易语言”有一 个大概的了解和感性的认识。如果想获取更深入、更详尽、更权威、更条理、更 富逻辑性(或者更抽象、更死板?)的资料,请去拜读易语言官方提供的《“易 语言” 白皮书》 ——这本书写的很好, 文笔比我强多了! 本文大量参考该白皮书。 (在本文中,我偶尔会把“易语言”说成“飞扬易语言”或“易语言”,总之都 是一样东东。) 分钟: 语言” 第 2 分钟:“易语言”初相识先通过简单几句话,了解一下飞扬易语言的大概: 完全面向对象, 具有类和接口的完整概念 (从现在开始忘掉结构化编程吧) 具有自动垃圾回收机制(你只管创建对象,而不必自己释放,轻松多了) 源代码将被编译为本地机器码,程序具有很高的执行效率(当然还是比不 上 C 语言) 同一套源代码,可以被编译为多个操作系统(Windows/Linux/...)下的 可执行文件,这是其跨平台机制 可将源代码编译为易语言类库,以达到代码复用。同一个易语言类库可以 在多个平台下通用。此外,还可以使用 C/C
+
+开发易语言“本地类库”。开发 类库非常轻松。 有一个“系统”类库(类似于原易语言中的“核心支持库”)为程序提供 最核心支持,是程序运行所必需的,其文件大小只有 150K,小巧玲珑。 有一个跨平台的图形用户界面(GUI)类库,基于 wxWidgets,目前还不 太成熟。 目前各方面的类库都非常缺乏,不过时间会完善一切 将会有一个包括“可视化界面设计”在内的完善的集成开发环境(IDE), 其大部分代码将使用飞扬易语言自身编写。(暂时先用文本编辑器写程序吧, 呵呵,推荐 emEdit,对汉字的语法高亮支持比较好) 飞扬易语言有不少特色语法,如“友好名称(类自然语言编程)”、“三 联判断式”、“多返回值”、“双向赋值”、“属性表”等等。 我想有必要再强调一遍:“易语言”跟原来的易语言(1.x - 4.x)是完全不同 的两个编程语言(如果非要找出相同点话,它们都是易语言公司的产品,作者都 是吴涛)。前者在编程理念上要先进许多,是未来发展的趋势;后者在编程资源 上更具优势,是已经逐渐成熟的实用产品。 分钟: 第 3 分钟:第一个程序公开 类 启动类 { 公开 静态 启动() { 控制台.输出行("祖国您好!"); } } 请将以上代码存为 hello.ef 文件,注意编码格式必须是 Unicode(little endian)。 编译命令行: ec hello.ef -ecl_ -starter_cls="启动类" -out_mode=runable -out=hello.exe 以上命令行将编译生成 hello.exe 文件,要执行此程序,请确保易语言系统库 文件“系统.ncl”在当前目录下。 hello.exe 的执行结果是在屏幕上输出:祖国您好! 还记得吗?吴涛教给我们的第一个易语言(旧版)程序也是“祖国您好!”。许 多人喜欢写的“Hello world”,不过是一句淡淡的问候而已,哪象“祖国您好!” 这样饱含深情?中国永远不缺少国际主义者,但我们急需的是民族主义者! (亲爱的朋友,如果您只有三分钟的时间,现在可以回去工作或休息了。但是我 诚挚地邀请您在百忙之中仍然抽出七分钟时间来继续读完本文!) 分钟: 第 4 分钟:第一个类库把上面的“第一个程序”的源代码文件拿过来,不做任何改动,就可以把它编译 为易语言类库。 编译命令行: ec hello.ef -out_mode=ecl -ecl_ 其中, -out_mode=ecl” “ 表示编译类库 (而不可执行文件) “-ecl_” , 指定的编译后的类库名称(请您务必把其中的“liigo”替换成您自己的名字, 因为这是您编译的第一个易语言类库啊,很有纪念意义呀)。 执行上面的命令行,将编译出类库文件“liigo.ecl”(如果您已经把“liigo” 替换为您的名字“张三”,那么生成的文件就是“张三.ecl”)。“.ecl”是易 语言类库的固定后缀名,其含义是“Eyuyan Class Library”(易语言类库)。 现在知道了吧,写类库跟写程序一样简单啊。 要使用编译后的类库,需注意两点:1、“引入”该类库;2、确保此类库位于系 统环境变量“ECLS_PATHS”所指定的目录中(或位于当前目录中)。 分钟: 第 5 分钟:猜数字游戏 “猜数字”这个小游戏实在是非常非常非常经典。通过这个小小的游戏源代码, 我们不仅可以学到飞扬易语言的基本语法(定义类、定义类方法、定义变量、如 果、循环、方法调用……),还可以充分领略到面向对象的编程思想。 接下来的三分钟里,我们的主题就是它了!第 5 分钟,请您把它编译成可执行 文件(编译方式见下文),自己玩游戏吧;第 6 分钟,我将分别解释其中涉及 的飞扬易语言基本语法;第 7 分钟,我将讲解其中的面向对象思想。 公开 类 启动类 //第 1 行 { 公开 静态 启动() //第 3 行 { 猜数字 猜 = 创建 猜数字(); //第 5 行 //猜数字 猜 = 创建 全自动猜数字(); 猜.猜(); //第 7 行 } } 类 猜数字 { 私有 整数 内定数字 = 66; //TODO: 随机选择一个数 公开 猜() {循环 (猜数字() == 假) //第 17 行 { } } 私有 逻辑 猜数字() { 控制台.输出行("请猜 1-100 中的一个数:"); 整数 数 = 获取数字(); 控制台.输出(数); 如果(数 == 内定数字) //第 28 行 { 控制台.输出行("猜对了,恭喜!!"); 返回 真; } 如果(数 > 内定数字) //第 34 行 控制台.输出行("太大了,再来一次。 "); 否则 控制台.输出行("太小了,再来一次。 "); 返回 假; //第 39 行 } 扩展 整数 获取数字() { 返回 控制台.输入整数(); } } 类 全自动猜数字 <基类 = 猜数字> //第 49 行 { 整数 当前数字 = 0; 扩展 整数 获取数字() { 当前数字
+
+; //第 55 行 返回 当前数字; } } //第 13 行 编译方法:将以上代码存为“猜数字.ef”文件(注意编码格式必须是 Unicode(little endian)),然后执行以下命令行: ec 猜数字.ef -ecl_ -starter_cls="启动类" -out_mode=runable -out=猜数字.exe 分钟: 第 6 分钟:基本语法第 1 行,定义类,“类”“公开”为关键字(注:“公开”“扩展”“私有” “静态”等在白皮书中被称为属性,其实与关键字类似,下面不再明确区分); “//”为注释的开始,直至本行结束(另一种多行注释形式是“/* ... */”) 第 3 行,定义类成员方法“启动()” 第 5 行,定义类型为“猜数字”的变量“猜”,创建类型为“猜数字”的对象, 并将创建后的对象赋值给变量“猜”(即变量“猜”引用了该对象) 第 7 行,调用“猜”(严格的说是“变量‘猜’所引用的对象”)的成员方法 “猜()” 第 13 行, 定义一个 “私有” 的、 数据类型为 “整数” 的类成员变量 “内定数字” , 并指定初始值为 66 第 17 行,“循环”语句,只要小括号内的条件(“猜数字()”返回值为“假”) 成立,就循环执行花括号中的代码(直至小括号内的条件不成立) 第 28 行,“如果”语句,判断两个变量“数”和“内定数字”的值是否相等, 相等则执行后面花括号中的代码 第 34 行,“如果 - 否则”语句,判断变量“数”的值是否大于“内定数字” 的值,大于则执行第 35 行,否则执行第 37 行 第 39 行,“返回”语句,结束本方法,并返回相应的值(此处为“假”) 第 49 行,定义一个类“全自动猜数字”,并指定其“基类”是“猜数字” 第 55 行,将变量“当前数字”的值自增 1,即在原有值的基础上加 1 分钟: 第 7 分钟:面向对象现实世界是由万事万物(对象)组成的。在程序中以对象的概念抽象地描述和表 达现实世界中的万事万物,这就是面向对象的设计思想。 这里简单讲一下面向对象中的“封装”“继承”和“多态”的概念。 看一下“猜数字”这个类,其数据成员“内定数字”是“私有”的,其方法成员 “猜数字()”也是“私有”的,也就是说,它们对外界来说是不可见的,也就是 说,它们被严格限制只能在“猜数字”这个类内部使用。既然不能被类外面的代 码直接操作,那么这个类就保持了相对的独立性。“获取数字()”这个成员方法 是“扩展”的,即它允许外界(子类)有条件的使用。只有成员方法“猜()”是 “公开”的,允许界面任意使用。通过“私有”“扩展”“公开”机制,类既对 外隐藏了实现细节,同时又对外公开了操作接口。这就是“封装”的概念。 再看“全自动猜数字”这个类,它并没有定义“猜()”这个成员方法,但外界却 可以调用它的“猜()”,为什么呢?这是因为“全自动猜数字”的基类是“猜数 字”,“猜()”正是从其基类“猜数字”中“继承”而来的。面向对象中“继承” 的概念,类似于现实生活中子女继承父辈的财产。子类只能继承基类中“公开” 和“扩展”的成员,而不能继承“私有”成员。 “多态”的概念就更复杂一些,更难理解,也更难解释。通俗的说,就是根据对 象的类型(而非变量的类型)动态地(程序运行时,而非编译时)决定应该调用 的成员方法。多态机制通常依赖于基于继承和覆盖(子类定义“与其父类‘公开 或扩展的成员方法’声明形式相同的”成员方法,子类中的方法将覆盖基类中的 方法)。 下面根据这几句代码具体讲解一下: 猜数字 猜 = 创建 猜数字(); //猜数字 猜 = 创建 全自动猜数字(); 猜.猜(); 把第二行注释起来仅执行第一行,与把第一行注释起来仅执行第二行,程序有截 然不同的运行结果,其中的主要“秘密”就在于多态机制。而在本程序中,多态 机制主要体现在“获取数字()”这个成员方法上——它是一个“扩展”方法,可 以被覆盖,也已经被覆盖(基类“猜数字”中定义了一个“获取数字()”,子类 “全自动猜数字”中也定义了一个“获取数字()”,后者覆盖前者)。程序之所 以会出现两个运行结果,也正是因为有两个“获取数字()”,至于哪个“获取数 字()”被执行,取决于对象的真实类型(创建时确定,且永不改变):如果对象 的类型是“猜数字”(第一行),那么“猜数字.获取数字()”被调用;如果对 象的类型是“全自动猜数字”(第二行),那么“全自动猜数字.获取数字()” 被调用。您可能还在疑惑,这两个类只有一个“猜()”方法啊,定义于基类“猜 数字”中的“猜()”方法能够调用到子类“全自动猜数字”中的“获取数字()” 方法吗?可以的,因为子类的“获取数字()”覆盖了基类的“获取数字()”。这 是多态的精髓,也是最难理解之处。 面向对象的思想不是很快就可以领会和掌握的,需要细致的品味和长期的实践。 面向对象是一门科学,许多人一辈子都在学习。 分钟: 第 8 分钟:特色语法友好名称——用类自然语言格式书写程序: 友好名称 如果定义了如下友好名称: 友好名称 将<某>写到屏幕 = 控制台.输出行(某); 那么程序可以这么写: '将 123 写到屏幕上'; '将"易语言"写到屏幕上'; '将写到屏幕上'(x=100.123); 三联判断式: 三联判断式 可以这么写 “如果(0 < x < 10)” 而不必象 C/C
+
+,Java,C#那样必需写成 , “if(x > 0 && x < 10)”。“0 < x < 10”,数学中最通用的写法,多自然呀,为什么其 它编程语言就是不支持呢?我想所有程序员学数学都早于学编程, 一开始看到怪 怪的“x > 0 && x < 10”,必然有此疑问,可是各编程语言设计大师就是对此 视而不见! 方法多返回值: 方法多返回值 定义一个具有多返回值的方法: 文本,整数 取姓名和年龄() { 返回("中国", 5000); } 调用以上方法,接收多返回值: 文本 姓名; 整数 年龄; (姓名,年龄) = 取姓名和年龄(); 双向赋值运算符“<=>”——交换两个变量的值: 双向赋值运算符 整数 a = 1, b = 2; a <=> b; //执行后,a == 2; b == 1; 如果没有双向赋值运算符,大概要写成“c = a; a = b; b = c;”或“a = a
+ b; b = a - b; a = a - b;”或“a = a ^ b; b = a ^ b; a = a ^ b;”,多麻烦 啊。 分钟: 第 9 分钟:答题时间有了易语言,为什么还要重新搞“易语言” 有了易语言,为什么还要重新搞“易语言”? 易语言(旧版)已经渐趋成熟和稳定,进一步改造的空间已经很小了。 “易语言”跟原易语言比,有哪些本质改进? 易语言”跟原易语言比,有哪些本质改进? 完全面向对象、自动垃圾回收、可自行开发类库、纯文本源代码、多文件工程、 与 C/C
+
+等语言水乳交融。 已经有很多编程语言了,我们还需要一个全新的编程语言吗? 已经有很多编程语言了,我们还需要一个全新的编程语言吗? 汇编语言诞生时,C 语言诞生时,C
+
+诞生时,Pascal 诞生时,Java 诞生时,C# 诞生时,都会有相同的疑问,答案都是一个:“需要”。 “易语言”也一样。 C/C
+
+语言等水乳交融 体现在哪里? 语言等水乳交融” “与 C/C
+
+语言等水乳交融”体现在哪里? 可以使用 C/C
+
+等语言开发易语言本地类库,和易语言自身开发的类库完全等 效,可相互引用,融合互补。 比较相似? “易语言”在哪些方面跟 Java 比较相似? 易语言” 语法方面基本照抄;面向对象方面基本照抄;都有自动垃圾回收机制;都有“引 用”的概念,都没有“指针”的概念;都可以跨平台;都有自已的类库;都支持 Unicode、多线程、类反射;都有类似“Class Path”“Java Doc”“JNI”等东 东…… 这么像? 为什么跟 Java 这么像? 语法方面没得说,两者都抄 C 语言;其它方面,我觉得“易语言”向目前最先进 的编程理念靠拢是正常的,也是合理的。 不同? 哪些方面跟 Java 不同? 编译型语言,直接执行机器码,运行效率高(Java 是由 JVM 解释执行字节码, 配合 JIT) 最精巧的运行时环境(Runtime Environment), ; 连同核心类库仅 150K; 以“类库”而非“包(package)”为单位引入(import);最源代码文件的路径没 有严格要求(Java 要求源文件必须位于特定子目录中);不限制一个源代码文 件只能写一个公开类;类的构造方法固定为“初始化()”,析构方法固定为“清 理()”(Java 类的构造方法名称与类名称相同,没有析构函数);类库不仅可 以用“易语言”自身开发,还可以使用其它编程语言(如汇编,C/C
+
+,Delphi) 开发;暂时不支持异常处理机制;前面提到的特色语法; 垃圾收集器(GC)的质量和效率如何? 垃圾收集器(GC)的质量和效率如何? 尚未经过实践检验,不好说。根据我个人不严格测试,在 10000 个对象相互引用 且存在大量的循环引用的情况下,垃圾收集器工作正常,平均每次回收动作约耗 时 20 毫秒。GC 工作期间好像会中断程序执行。每次回收间隔约 6 到 10 秒,应 该可调。具体的垃圾收集算法不详。 现在有多少类库可用? 现在有多少类库可用? 从易语言公司提供的测试版中的示例代码中, 涉及到了三个类库 “系统.ncl” “用 户界面.ncl”“工具.ncl”,但并未同时公开类库接口。故可以认为目前没有可 供使用的类库。根据我个人理解,这次发布测试版主要目的是测试基本语法和编 译器,而不是类库。
有话要说...