摩拳擦掌 --- CNScript 成長(zhǎng)日記(1)
Posted on 2008-08-05 08:46 陳坤 閱讀(2011) 評(píng)論(5) 編輯 收藏 引用 所屬分類: Things about wchar_t*我早就想寫一個(gè)腳本引擎了,真的。
事情可以追溯到大一的時(shí)候,很想做游戲(雖然后來發(fā)現(xiàn)美工成了最大的問題),于是自己寫了一套GUI,用起來還挺爽,但是就是一直覺得缺了個(gè)腳本引擎。
于是,奉天承運(yùn),我開始著手腳本引擎的計(jì)劃了。
話說起碼得先跟字符串培養(yǎng)培養(yǎng)感情,而且也是為了以后寫腳本引擎時(shí)能省些苦力,還有很多其他因素影響,我決定先寫一個(gè)正則表達(dá)式引擎。為了方便,我又得封一個(gè)性格良好,功能頑強(qiáng)的String類,要真的實(shí)現(xiàn)功能頑強(qiáng),又得搞好Encoding方面的事情,要方便調(diào)試程序,又得把Console和IO方面的東西封好。于是我干脆就跟他拼了,封了一個(gè)類.Net的小類庫出來。為了好看,名字空間搞得跟.Net的一模一樣,用起來也挺順溜的。
不要問我為什么字符串前面不加L,也不要問我為什么沒有delete那個(gè)m,我的庫會(huì)干這些事情的。表達(dá)式中那個(gè)\z是匹配中文字的意思
運(yùn)行結(jié)果:

做這么個(gè)正則表達(dá)式,還輸?shù)袅宋乙徊蚿izza。當(dāng)時(shí)跟vczh同學(xué)打賭,他說我寫完肯定有bug,我說我肯定沒bug。結(jié)果不出意料地有bug,于是一餐華麗的pizza被送進(jìn)了我們肚子。重要經(jīng)驗(yàn):是個(gè)程序必然有bug,恩恩。
這個(gè)正則表達(dá)式引擎剛寫出來時(shí)性能奇差無比,主要時(shí)間耗在了內(nèi)存分配上。經(jīng)過一系列優(yōu)化,vczh也跟著我一起優(yōu)化了他那個(gè)正則表達(dá)式引擎,到最后某次性能測(cè)試時(shí),我的花了13秒,vczh同學(xué)的花了12秒,也有時(shí)候是我的更快,視表達(dá)式寫法不同而略有差別,基本上平均下來是一樣的。(boost和greta花了40+N秒)
有了正則表達(dá)式引擎,也有了跟字符串幾個(gè)月的感情,現(xiàn)在終于開始計(jì)劃腳本引擎了。由于還是第一次,總有點(diǎn)畏首畏尾的,我決定先寫一個(gè)非常菜的版本。強(qiáng)類型,無閉包,面向過程,支持?jǐn)?shù)組,不支持自定義結(jié)構(gòu)。這是我計(jì)劃的CNScript的第一版本,也稱CaiNiaoScript。
其實(shí)我真的想實(shí)現(xiàn)的是CNScript的第二個(gè)版本,ChinaScript。這會(huì)是一個(gè)類自然語言寫法的中文腳本引擎。寫起來變量和函數(shù)命名絕對(duì)會(huì)很不習(xí)慣,但是寫完之后卻會(huì)像一篇文章一樣流利。
例如:現(xiàn)在用C++,模擬一個(gè)人使用某個(gè)交通工具去某個(gè)地方的行為。
Class TrafficTool;
Class Car : public TrafficTool;
Class Man
{
void TravelTo(Point destination, TrafficTool* trafficTool);
};
用起來就是
Man Peter;
TrafficTool* BMW = new Car();
Point beijing;
Peter.TravelTo(beijing, BMW);
雖然程序員一看就能理解個(gè)大概,但是非程序員很難使用或維護(hù)它。在將來的CNScript中,也許會(huì)是這樣(估計(jì)最后不會(huì)這么羅嗦):
有一種東西叫交通工具,汽車就是一種交通工具。
有一種東西叫人。 //我承認(rèn)這句話有點(diǎn)怪,語法細(xì)節(jié)問題需要仔細(xì)琢磨,誰有好的建議可以留言給我喔,感激萬分
有一種東西叫做目的地。
有一種行為:一個(gè)人乘坐一個(gè)交通工具去往一個(gè)目的地。
//以上是聲明,以下是使用這幾個(gè)類的代碼
有一個(gè)人叫Peter。
有一個(gè)汽車叫寶馬。
有一個(gè)目的地叫北京。
Peter乘坐寶馬去往北京。
這樣的代碼,雖然在函數(shù)和變量命名時(shí)要仔細(xì)考慮,但是寫出來的代碼即使是不懂程序的人也能看明白,為的是兼顧游戲開發(fā)的各個(gè)環(huán)節(jié)的人員。
好了,想法到此為止,今晚開始動(dòng)工CNScript的第一版,CaiNiaoScript! 我會(huì)把我每個(gè)階段的工作和工作原理都寫在這篇日記中,有興趣的朋友可以跟著一起玩玩喔!
事情可以追溯到大一的時(shí)候,很想做游戲(雖然后來發(fā)現(xiàn)美工成了最大的問題),于是自己寫了一套GUI,用起來還挺爽,但是就是一直覺得缺了個(gè)腳本引擎。
于是,奉天承運(yùn),我開始著手腳本引擎的計(jì)劃了。
話說起碼得先跟字符串培養(yǎng)培養(yǎng)感情,而且也是為了以后寫腳本引擎時(shí)能省些苦力,還有很多其他因素影響,我決定先寫一個(gè)正則表達(dá)式引擎。為了方便,我又得封一個(gè)性格良好,功能頑強(qiáng)的String類,要真的實(shí)現(xiàn)功能頑強(qiáng),又得搞好Encoding方面的事情,要方便調(diào)試程序,又得把Console和IO方面的東西封好。于是我干脆就跟他拼了,封了一個(gè)類.Net的小類庫出來。為了好看,名字空間搞得跟.Net的一模一樣,用起來也挺順溜的。
1 #include "System.h"
2
3 using namespace System;
4 using namespace System::Text::RegularExpressions;
5 using namespace System::Windows::Forms;
6
7 int Program(const String& arg)
8 {
9 Application::RunConsoleApplication();
10
11 Regex exampleExp("(+\\w+):(+\\z+)");
12 String exampleString = "hello:哈嘍!!!";
13
14 Int64 startTime = GetTickCount();
15 Match* m = exampleExp.Match(exampleString);
16 Int64 endTime = GetTickCount();
17
18 Console::WriteLine("---------KSystem Example Program---------");
19 Console::WriteLine("Example Regex:\t" + exampleExp.Pattern());
20 Console::WriteLine("Example String:\t" + exampleString);
21 Console::WriteLine("Matched Value:\t" + m->Value());
22 Console::WriteLine(m->Captures[0] + ":" + m->Captures[1]);
23 Console::WriteLine("Time Cost:\t" + String::ToString(endTime - startTime) + " ms");
24 Console::WriteLine("-----------------------------------------");
25
26 return 0;
27 }
2
3 using namespace System;
4 using namespace System::Text::RegularExpressions;
5 using namespace System::Windows::Forms;
6
7 int Program(const String& arg)
8 {
9 Application::RunConsoleApplication();
10
11 Regex exampleExp("(+\\w+):(+\\z+)");
12 String exampleString = "hello:哈嘍!!!";
13
14 Int64 startTime = GetTickCount();
15 Match* m = exampleExp.Match(exampleString);
16 Int64 endTime = GetTickCount();
17
18 Console::WriteLine("---------KSystem Example Program---------");
19 Console::WriteLine("Example Regex:\t" + exampleExp.Pattern());
20 Console::WriteLine("Example String:\t" + exampleString);
21 Console::WriteLine("Matched Value:\t" + m->Value());
22 Console::WriteLine(m->Captures[0] + ":" + m->Captures[1]);
23 Console::WriteLine("Time Cost:\t" + String::ToString(endTime - startTime) + " ms");
24 Console::WriteLine("-----------------------------------------");
25
26 return 0;
27 }
不要問我為什么字符串前面不加L,也不要問我為什么沒有delete那個(gè)m,我的庫會(huì)干這些事情的。表達(dá)式中那個(gè)\z是匹配中文字的意思
運(yùn)行結(jié)果:
做這么個(gè)正則表達(dá)式,還輸?shù)袅宋乙徊蚿izza。當(dāng)時(shí)跟vczh同學(xué)打賭,他說我寫完肯定有bug,我說我肯定沒bug。結(jié)果不出意料地有bug,于是一餐華麗的pizza被送進(jìn)了我們肚子。重要經(jīng)驗(yàn):是個(gè)程序必然有bug,恩恩。
這個(gè)正則表達(dá)式引擎剛寫出來時(shí)性能奇差無比,主要時(shí)間耗在了內(nèi)存分配上。經(jīng)過一系列優(yōu)化,vczh也跟著我一起優(yōu)化了他那個(gè)正則表達(dá)式引擎,到最后某次性能測(cè)試時(shí),我的花了13秒,vczh同學(xué)的花了12秒,也有時(shí)候是我的更快,視表達(dá)式寫法不同而略有差別,基本上平均下來是一樣的。(boost和greta花了40+N秒)
有了正則表達(dá)式引擎,也有了跟字符串幾個(gè)月的感情,現(xiàn)在終于開始計(jì)劃腳本引擎了。由于還是第一次,總有點(diǎn)畏首畏尾的,我決定先寫一個(gè)非常菜的版本。強(qiáng)類型,無閉包,面向過程,支持?jǐn)?shù)組,不支持自定義結(jié)構(gòu)。這是我計(jì)劃的CNScript的第一版本,也稱CaiNiaoScript。
其實(shí)我真的想實(shí)現(xiàn)的是CNScript的第二個(gè)版本,ChinaScript。這會(huì)是一個(gè)類自然語言寫法的中文腳本引擎。寫起來變量和函數(shù)命名絕對(duì)會(huì)很不習(xí)慣,但是寫完之后卻會(huì)像一篇文章一樣流利。
例如:現(xiàn)在用C++,模擬一個(gè)人使用某個(gè)交通工具去某個(gè)地方的行為。
Class TrafficTool;
Class Car : public TrafficTool;
Class Man
{
void TravelTo(Point destination, TrafficTool* trafficTool);
};
用起來就是
Man Peter;
TrafficTool* BMW = new Car();
Point beijing;
Peter.TravelTo(beijing, BMW);
雖然程序員一看就能理解個(gè)大概,但是非程序員很難使用或維護(hù)它。在將來的CNScript中,也許會(huì)是這樣(估計(jì)最后不會(huì)這么羅嗦):
有一種東西叫交通工具,汽車就是一種交通工具。
有一種東西叫人。 //我承認(rèn)這句話有點(diǎn)怪,語法細(xì)節(jié)問題需要仔細(xì)琢磨,誰有好的建議可以留言給我喔,感激萬分
有一種東西叫做目的地。
有一種行為:一個(gè)人乘坐一個(gè)交通工具去往一個(gè)目的地。
//以上是聲明,以下是使用這幾個(gè)類的代碼
有一個(gè)人叫Peter。
有一個(gè)汽車叫寶馬。
有一個(gè)目的地叫北京。
Peter乘坐寶馬去往北京。
這樣的代碼,雖然在函數(shù)和變量命名時(shí)要仔細(xì)考慮,但是寫出來的代碼即使是不懂程序的人也能看明白,為的是兼顧游戲開發(fā)的各個(gè)環(huán)節(jié)的人員。
好了,想法到此為止,今晚開始動(dòng)工CNScript的第一版,CaiNiaoScript! 我會(huì)把我每個(gè)階段的工作和工作原理都寫在這篇日記中,有興趣的朋友可以跟著一起玩玩喔!