{{ $root.errMsg }}
一個給IT開發員的平台

暫時沒有數據

想發表短片,用Youtube 還是 Vimeo

喜歡在網上看短片的朋友對標題中的兩大影片分享平台一定不陌生了,今天就來跟大家討論兩者的分別是什麼?而哪一個較適合想發佈影片的你呢? 開始前,先來個簡單的背景調查: Youtube 開創於2005年, 網站一上線便以驚人的速度成長,在短短六個月的時間之後,已經達到每日65,000個新視頻和一億個觀看次數的紀錄。直到三年前 (2010),Youtube 調查顯示每日新視頻和觀看次數的紀錄已經達到分別20億和30億,比美國三大電視台黃金時間加起來的觀看率還要強。隨著近年來的頁面更新和更完善的媒體合作計劃,Youtube 的發展到目前為止都還沒有達到飽和的跡象。 Vimeo 在亞洲區是一個較新的名字,但它的創立卻比Youtube 還要早半年(2004年底)。Vimeo 創立之後並沒有立刻取得標青的成績,直到約2011年底,Vimeo 才開始後起直追,成功吸引六千五百萬名瀏覽者,而它成功的主要原因,跟我們今天討論的標題有莫大的關係。 接下來再進一步分析Youtube 和 Vimeo 的差別: 市場定位這一點是兩者間較明顯的區別,也可說是Vimeo到後期能夠後來居上的因素之一。Youtube 一開...

youtube  

寫於 {{ '2017-08-14T10:26:18.197Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 1140 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】七、優化器(Optimizer)﹣還可以更好

大家好,又見到西杰了。我們之前已經做好了一個簡單的編譯器,可以把 Wescript 編譯成 Wemachine 讀得到的 Wemachine code,理論上編譯器教程也可以算完成了,但世事並不是這麼簡單的,我們雖然已經編譯到一個可以運行的程式,但在這個時間就是金錢的世界中,我們必須爭取每一分每一秒,把程式縮到最精簡,這就是我們這一章要做的工作了。   要做優化,我們可以從兩個層面著手,即代碼層面及指令碼層面。例如,我們可以移除一些沒有用過的變數,以減少記憶體的使用,這就屬於代碼層面的優化。又或者我們可以研究程式使用過的 register 並把沒有用的都移除或減少使用,以減少程式的代碼量及加快運行速度。 在實際應用環境中,有數之不盡那麼多種不同的優化技巧,所以在這章教學中,我們會挑選兩種來討論,第一種是移除沒有用過的變數,第二種是 Loop inversion。現在就由第一種開始吧! 移除沒用的變數首先我們要改寫一下我們的 Analyser,我們要記下哪些變數曾經被使用,那麼我們才可以在生成代碼時避免生成那些未曾使用的變數。 function Analyser(){ ...

compiler  

寫於 {{ '2017-08-14T10:03:56.654Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 164 | shortNumber: 0 }}

什麼是好的Teamwork

許多事情是無法一個人完成的,尤其當你的產品或公司已經達到了一定的規模,你一定需要更多資源來滿足業務需求。團隊合作的重要性,與能否達成更大的目標有著直接的關聯。但實踐“合作”經常被人所低估,許多人認為只要每個團員都有自己的工作,定時交差,就已達成合作的目的。但是真正的Teamwork,比這還更多。 你的團隊都知道大家在為什麼而奮鬥嗎?首先,沒有汽油的車是開不動的。在問你的團員之前,先問自己,加入這個項目的目的是什麼?只是打一份工,交交差?如果每個人都這樣想的話,你還能希望大家能有多投入呢?反過來,如果你在項目開始的第一天,就告訴大家你希望完成項目之後,為公司增加X%的客戶群,帶領產品進階到更高層次。這就有力量多了。 千萬別低估團隊目標的重要性,因為你必須明白,你的團員並不是看著電視翹著腿替你工作的。每一個項目的執行都需要腦力和體力,中間遇到挫折是兵家常事。如果團隊遇到挫折時缺乏一個目標把大家撐起來的話,他們的士氣肯定一瞬間就滑下山坡。 我完成了A,該先讓誰審核?接下來該做B1還是B2?誰該決定什麼事情、誰負責完成哪項細節、誰應該知道每個小進度,你的團隊,都清楚該...

teamwork  

寫於 {{ '2017-08-14T10:14:47.413Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 159 | shortNumber: 0 }}

三門問題〈蒙提霍爾問題〉

      相信大部份程序員也會對數學問題有興趣。       以下是一條的違反直覺問題又叫蒙提霍爾悖論,問題來自美國電視節目Let’s Make a Deal。問題如下:   遊戲有三扇門,其中一扇門後有汽車,另外兩扇門後是一隻山羊。         參賽者當然是希望要汽車吧。遊戲的流程是先讓參賽者選一扇門。然後,主持人會把其中一扇有山羊的門打開(不是參賽者選中的那扇門)。此時,參賽者可以選擇保持現狀或是選另一扇門。 問:如果你是參賽者的話,你會怎樣做? 答:那當然是維持現狀啊,原本選中汽車的機會是1/3,現在其中一個選項被取消了。機會率就是1/2。這跟本就是小學級數的題目。除非你是迷信之類才會選另一扇門吧。         可是瑪麗蓮·沃斯·莎凡特(Marilyn vos Savant),健力士記錄中智商最高者卻在她的專欄中(Ask Marilyn)指出應該選另一扇門,並...

maths   monty hall problem  

寫於 {{ '2017-07-28T09:45:18.365Z' | calendarTime }}

{{ 1 | shortNumber: 0 }}
{{ 120 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】二、掃描器(Scanner)﹣詞法分析(Lexical analysis)(上)

      寫 Compiler 第一步通常都是先寫 Scanner,什麼是 Scanner 呢?這裏只給你初步概念,詳細解釋在維基看吧。試想像有一句英文句子(例子:”The quick brown fox jumps over the lazy dog” is an English-language pangram.),人類看英文的方法就是逐個逐個詞語地看,電腦怎樣才能知道要跳過 ” 雙引號才能讀取第一個詞語呢?那就是要靠 Scanner 來分析了,Scanner 會逐個逐個字元讀進來並且在“適當時候”把字元合成一組詞語供後邊的 Parser 做其他處理工作。   單字元的 Token       先來處理比較簡單的單字元 Token吧,在這裏要先界定一下什麼是單字元 Token(這只是西杰的定義),單字元 Token 的意思是這個 Token 只有一個字元而且不會因後面的字元而有任何歧義,例如 “:” 或者 “;&...

compiler   scanner   lexical analysis  

寫於 {{ '2017-07-28T08:04:25.325Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 115 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】三、語法分析器(Parser)﹣語法分析(Syntactic analysis)(下)

      在上一節中,我們處理了 “var” “if” “while”,大家應該學會了如何處理 expression block了,這一節我們將會學習如何處理運算符。處理運算符有兩個基本概念要掌握,第一是運算符的運算次序,第二是運算表達式的表示法。   運算次序(Order or operations)       在數學算式裏,我們有個法則叫做“先乘除,後加減”,意思就是乘除的運算次序比加減高,同樣地在程式語言中,我們也需要定義一下運算符的運算次序。在 Wescript 中,我們會用常用的運算符次序,即如下圖所示: <Retrieved from Wikipedia.com> 西杰不會處理這裏所列的所有運算符,只會處理第一章所列的運算符,其他就留給讀者們當練習吧。   表示法      西杰相信大部份人都會使用 infix notation(可能...

compiler   parser  

寫於 {{ '2017-07-28T09:10:47.151Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 112 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】三、語法分析器(Parser)﹣語法分析(Syntactic analysis)(上)

      現在我們有了 Scanner 幫我們把字元合併成 Token了,那下一步要做什麼呢?就是要把 Token 組合成有意思的“句子”了,這一步我們稱為語法分析(Syntactic analysis),而負責做這項工作的程式我們稱之為語法分析器(Parser)。   Parse tree Parser 要做的工作就是,讀取 Scanner 分析出來的 Token,然後建立並返回一棵 Parse tree 給後面做語意分析(下一章再談談)。什麼是 Parse tree 呢?維基上的解釋是: An ordered, rooted tree that represents the syntactic structure of a string according to some formal grammar. 意思就是一棵可以形容到你寫的句子的樹了,例如你的句子是 if a then b else c,那你的樹就可能會是這樣了:   問:為什麼不用一些現成的工具來自動生成 Parser 呢? 答:其實市...

compiler   scanner   expressionnode   parser   syntactic analysis  

寫於 {{ '2017-07-28T08:33:58.826Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 108 | shortNumber: 0 }}

如何讓人愛上你的 App?

      移動程式已經是一個成熟的行業,打開 App store,新的程式、新的遊戲琳琅滿目。作為移動程式開發員的你,如何能夠寫出一個脫穎而出的 App?這裡,筆者透過寫 App、玩 App、構想 App 的經驗,和大家分享如何能夠讓你的 App 看起來更專業,讓它第一時間就可以捉住用家的心。 1. 介面設計一體化      作為使用者,大家也應該知道,使用介面就是 App 帶給我們的第一印象,它甚至是 app store 裏面決定你的 App 能否吸引人下載的重要元素(screen shots)。很多人都願意花心思在每個版面上加上很多新鮮的設計。筆者認為先不要想怎麼樣的顏色排列最能夠突出你的介面,一體性才是你首先應該達成的目標。很多時候會看見一些 App 的介面犯這樣尷尬的錯:單看一個按鈕或背景會覺得設計不錯,兩個加起來卻形成了奇怪的組合。       或者是第一頁用一種顏色主題,下一頁卻換了另外一種顏色;又或者是同樣的功能,卻用不同設計的按鈕等等…&hell...

mobile application   app   app development  

寫於 {{ '2017-07-28T09:41:59.463Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 102 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】三、語法分析器(Parser)﹣語法分析(Syntactic analysis)(中)

      上回提到,我們要寫一個 Recursive descent parser,從 Scanner 一直讀 Token 進來,並建立一棵 Parse tree。在建立途中,我們還用了 lookahead 的技巧,就是偷看下一個 Token 但是不會佔用它,原因是我們需要用它來判斷下一步怎麼走,但是我們又不能用掉它,否則到下一步時我們就用不到了。現在我們就來完成餘下的部份吧!       上回我們只處理了 print 和數字,現在我們來處理一下 var 吧。var 主要有兩種寫法,第一種是純粹定義一個變數,即: var a:bool;       第二種是除了定義變數之外,還會 initialise 一下那個變數,即: var a:int = 1;       那我們先來定義一個新的 Node 吧。 function VariableNode(varName, type, initExpressionNode){ t...

compiler   token   parser  

寫於 {{ '2017-07-28T08:53:46.036Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 96 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】二、掃描器(Scanner)﹣詞法分析(Lexical analysis)(下)

      繼續上一節未完成的 Scanner 吧,上一節我們寫好了一個 Reader,可以逐個逐個字元讀取,有需要時又可以退回 n 個字元之後再讀(本節將會使用這個功能)。另外,上一節亦寫好了一個簡單的 Scanner,可以讀取七款單字元 Token,並忽略其他字元。本節將會教大家如何建立多字元 Token,過程將會利用 FSM 來分析字元,忘記了什麼是 FSM 的朋友請到上一節回顧一下嚕。   多字元的 Token 首先我們要讀取含有英文字的 Token,含有英文字的 Token 如下: - var VAR_TOKEN - int TYPE_TOKEN - bool TYPE_TOKEN - true, false, TRUE, FALSE BOOLLITERAL_TOKEN - if IF_TOKEN - else ELSE_TOKEN - while WHILE_TOKEN - print PRINT_TOKEN - 其他英文字 IDENTIFIER_TOKEN 在程式中先定義一下這些 Token 吧,承接著之前的 Token ...

compiler   scanner   lexical analysis   fsm   token  

寫於 {{ '2017-07-28T08:17:24.269Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 67 | shortNumber: 0 }}

如何從管理中提升軟件開發的質素

早前,一個從事軟件開發公司的朋友向我傾訴,他正研究應如何提升他公司開發軟件的質素。原因是他發現公司的主要收入是靠新客戶維持,舊客戶很少回頭。在他詢問客戶時,聽到的多是投訴他公司開發的軟件經常有 bugs。每當聽到這些投訴,他便心如刀割。他認為若不提升公司開發軟件的質素,舊客戶便會持續流失,嚴重影響公司的盈利能力。   他問我要招聘多少個測試員,如何測試才可以提升他公司的開發質素。   我相信很多軟件開發部門的管理者均會同樣的問題:   要招聘甚麼資歷的測試員?數目是多少?怎樣測試才能提升軟件開發的質素?   我認為,這問題其實是本末倒置。為甚麼?因為,以我多年的軟件開發經驗,我深信:   測試員只能確認,而不能提升軟件開發的質素。   要提升質素,必要從開發的過程入手。   這裡,我會不討論在開發過程中應用什麼工具、開發方法或編碼技術來提高開發的質素,這最好交給你的首席開發員去決定。我想討論的,是如何從管理中,提升開發中的質素。以下幾項是我相信在管理中,能提升軟件開發質素的要點:   1)開發團隊貴精不貴多...

management   software development  

寫於 {{ '2017-07-19T08:59:34.248Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 62 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】一、簡介

      相信每個 programmer 都跟西杰一樣想過設計一種自己的編程語言,最近西杰就有機會要寫一個編譯器了。雖然在大學時已經讀過如何編寫一個編譯器,但要認真寫起上來還真的不容易,而且網上教寫編譯器的教材不多(尤其中文的),所以就把這次經驗記下來,疏理一下自己在開發過程中所學到的東西,也同時為互聯網增加一些有關編譯器這方面的中文資源吧。   西杰在開發過程中經常參考 Actionscript 編譯器的 source code(用Java 寫的),大家有興趣可以看看這裏(在 /trunk/modules/asc 裏), 是 open source 的        在這個教程中,西杰將會使用 Javascript 來開發,原因有二。第一,JS 是我最喜愛的編程語言之一,語法簡潔易明,亦較多人認識。第二,可以讓大家在瀏覽器直接運行 Demo,大家不用浪費時間下載本文所舉的例子再執行。       整個教程將會分為七個主要單元,除了這篇簡介外,還包括以下六個單元...

compiler   webscript  

寫於 {{ '2017-07-28T07:29:51.121Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 62 | shortNumber: 0 }}

菜鳥學飛之觀-內存泄漏(memory leak)

      菜鳥?哈哈,也許有些讀者未必知道是甚麼東西,這裡我先解釋一下,其實菜鳥泛指對某個領域缺乏基本知識的人。這個term最初不是來源於網路,但是它因為網路而變得非常流行。「菜鳥」是網民自稱最常用的用語之一,正式的叫法是「新手」、「初學者」,英文對應詞可以是newbie。       而我就剛剛恰當用上這個詞語啊, 對於I.T.,新手的我,猶如菜鳥學飛,雖然菜鳥剛學飛,但是不代表它不能展翅高飛。我相信經驗一點點的積累,最終還是有成果的。而且我認為一個成功的開發人員不是以技術含量去判定的,是創新能力,創造出新穎,有趣的程式出來。技術含量只是給你一個很好的基礎去想像你熟練能做出來的東西。不熟練沒關係,上網找資料,查查class 的用法,多試幾次,還是能做出來的,所以不要因為是菜鳥就感到自卑,自貶,因為菜鳥還是能飛翔的。       最近我剛完成了我人身中第一個app,雖然比較簡單,也不是甚麼了不起的應用程式,過程中我得到一點小心得。我是用ios 4去做的, 而沒用最新的ios 5, 在ios 4是...

memoryleak  

寫於 {{ '2017-07-28T07:23:39.967Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 57 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】六、編譯器(Compiler)﹣生成代碼(Code Generation)(下)

上回提要:我們開始著手編寫編譯部份,從那棵 Parse tree 生成代碼,做法跟之前的 Analyser 差不多,都是用 mutual recursion 來遍歷 Parse tree。上回我們已經寫好了大部份的編譯,只剩下兩款 expression 未寫好,即 if 和 while,本節就是要把這兩款 expression 都寫出來。   還記得我們 Wemachine 是如何做 label 的嗎?我們的 Wemachine 只能跳到程式上面已經定義好的 label,如果要跳轉到的 label 之前還未被定義的話就會當是 runtime error,但問題是,我們要做 if-else 時,如果條件式不成立的話就要跳到 else block,那可能是十丈遠,不可以跟之前做 相等比較 一樣先執行一次所有程式碼再判斷,因此,我們必須要有一個支援跳到在後面定義的 label 的 Wemachine,所以第一步我們就要改寫 Wemachine 了。 西杰將會新增一個指令,叫做 vlabel,定義方法跟 label 一樣,只是跳轉的時候,我們要在 label 前面加上 “...

compiler  

寫於 {{ '2017-08-14T09:52:27.854Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 55 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】六、編譯器(Compiler)﹣生成代碼(Code Generation)(上)

終於來到最重要一步了,我們要把之前建立好的 parse tree 變成可以被 Wemachine 運行的代碼,有了編譯器才是真正的 compiler!在這一步,我們還是要用那個老技巧,即 mutual recursion,來遍歷我們的 parse tree,並輸出相應的代碼。事不宜遲,現在就開始了。   首先,Copy and paste 一下,把 Analyser 的 method 複製一次,並且把所有屬於 Analyser 做的工作都移除,只留下 evaluate* 的語句,以保留 mutual recursion 來遍歷我們的 parse tree。然後我們需要建立一個安排 register 的機制,由於我們的 Wemachine 有無限個 register 可以用,所以我們只需要一直取新的 register 來用就可以,而不用重用已被使用的 register(實際的情況當然不會有無限的 register,這需要利用一些技巧才可以)。 function Compiler(){ this.lineBreak = "\n"; this.register = ...

compiler  

寫於 {{ '2017-08-14T09:45:13.438Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 52 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】四、語意分析(Semantic analysis)

      大家好,又見到西杰了~       在上兩章我們探討了如何編寫 Scanner 和 Parser,能夠把一份程式文件轉變成一棵 Parse tree,如果文件有 syntax error 的話亦能夠被偵測出來並且告訴開發人員,現在要進行最後一步的分析了。今天要說的是語意分析,即 Semantic analysis,這是什麼來的?Semantic analysis 要做的工作就是分析語意啦!哈哈~       同學們或許你們會問,當我們建立了一棵 Parse tree 之後,不就可以 compile 了嗎?其實不然,你現在有的只是 N 句句子,但這還不是一個完整故事,還要分析一下上文下理電腦才知道你說的是什麼故事,Semantic analysis 就是做這樣的工作了。給你一個例子: var a:bool = 1 + true;        一個數字跟一個布林值相加是一個怎樣的概念?別說電腦看不懂,連西杰也看不明白,Seman...

compiler   semantic analysis  

寫於 {{ '2017-07-28T09:25:55.866Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 46 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】五、虛擬機(Virtual Machine)(上)

為什麼我們需要虛擬機呢?因為我們要運行我們編譯好的程式。那為什麼我們不直接編譯到 native binary code 呢?這是因為真正的電腦資源十分有限,我們編寫起上來會比用虛擬機的做法難很多,那就嚴重超出了本教程的範圍了(其實是因為西杰還不太認識這個課題,要偷懶一下 )。當然,虛擬機的做法和 native code 的也有幾分相似,這裏就給讀者們一個初步的概念,大家真的想再接觸多一點底層的東西就要自己摸索一下了…… 接著下來,我們就稱我們的虛擬機為 Wemachine 吧。   遊戲開始之前,我們當然要先定義一下遊戲規則﹣ Instruction set architecture(ISA),Wemachine 會支持以下的 Instruction set: 而且西杰將會假設我們的虛擬機有無限個 register,以便我們開發。 開始寫程式了,第一步我們要做的是讓 Wemachine 學會讀那堆指令,為了方便讀取,我們要限定指令的格式,格式如下: opcode1 operand1, operand2, operand3; opcode...

compiler  

寫於 {{ '2017-08-14T07:01:59.183Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 42 | shortNumber: 0 }}

怎樣才算是好的 programmer?

這陣子西杰在想,到底怎樣才算是一個好的 programmer?這個問題相信大家都有思考過吧,這裏我就提出一些想法給大家參考,看看大家認不認同。在開始討論之前,要先定義一下題目的界限,不然下面的討論會太廣泛。這裏的“好”只是指能力上好,其他的“好”都不討論,原因是我覺得這方面比較直接地反映一個 programmer 的好與壞。 以下五項指標可以說是按程度來排列,亦可以說是沒有排列,因為某些 programmer 可以做到第五項指標,但卻做不到第四項指標,大概是因為每一項指標之中亦可以再細分不同程度吧,但總體方向還是順序的。 一、有能力 Google 這個應該是最基本的要求了,要學會編程,必先學會 Google,在這個資訊爆炸的世代,我們沒有可能把所有東西都學一遍,但我們一定要確保當我們想學某一種東西時我們知道在哪以及如何可以找到資訊,Google 就是一個好幫手了。 西杰記得之前曾經想找一種編程思想來學習,當時我心中其實已經對這個思想有一個大概的印象,就是要用 Linux pipe 的模式來寫程式,然後西杰試了不少關鍵字的組合也找不到有關的...

programmer  

寫於 {{ '2017-08-15T01:59:00.087Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 39 | shortNumber: 0 }}

10 個 iOS 開發人員的經典程式庫

1. MBProgressHUD  按這裡下載       MBProgressHUD 在 iOS 上廣受開發者和用家的歡迎,原因其一是招牌的黑色半透明顯示效果加上白色文字正是 iOS 慣用介面,不過這個 API 並不公開,因此使用的話會被蘋果拉下架,MBProgressHUD 提供的正是一個替代方案。       其二,MBProgressHUD 除了這個常見的旋轉等待提示之外,還提供實際進度指示針和完成提示等附加功能,開發者只需自行更新由 0 到 1 的進度,便可即是更改進度指示針,極之方便。   2. ASIHTTPRequest  按這裡下載       如果你希望你的 iOS 應用程式可以與網頁伺服器溝通,你需要使用 iOS 原生的 CFNetwork 去做網絡編程。不過作為開發者的你,只需要專注簡單的 HTTP 任務,ASIHTTPRequest 正是一個優雅而強大的解決方案。   3. GMGridView   按這裡下載 ...

ios  

寫於 {{ '2017-07-31T08:44:47.151Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 38 | shortNumber: 0 }}

【深入淺出教你寫編譯器(Compiler)】五、虛擬機(Virtual Machine)(下)

現在開始要編寫執行功能,執行功能很簡單,只是把每一句指令都執行一次就可以了。 emachine.prototype.run = function (){ for (var i = 0, l = this.instructions.length; i < l; i++){ var instruction = this.instructions[i]; this[instruction.opcode].apply(this, instruction.operands); } } 最後就是要編寫指令的實際功能了,lwi 要做的就是直接把一個數值寫到 register 中,所以我們只需 call 一下 setRegisterContent 就可以了,而 print 要做的就是把一個 register 中的數值寫到 output 去,所以就有以下的代碼了: Wemachine.prototype.lwi = function (operand1, operand2){ this.setRegisterContent(operand1,...

compiler  

寫於 {{ '2017-08-14T09:16:38.290Z' | calendarTime }}

{{ 0 | shortNumber: 0 }}
{{ 34 | shortNumber: 0 }}
{{ $root.errMsg }}