“易語言”十分鐘入門教程 易語言” 第 第 第 第 第 第 第 第 第 第 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”,但并未同時公開類庫接口。故可以認為目前沒有可 供使用的類庫。根據我個人理解,這次發布測試版主要目的是測試基本語法和編 譯器,而不是類庫。
有話要說...