日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
解密C#-SQLite是如何移植的

兩周前InfoQ報(bào)道了SQLite移植到了.NET的消息。由于社區(qū)對(duì)這一項(xiàng)目的異常關(guān)注,為了弄清C#-SQLite移植,我們采訪了此項(xiàng)目的開發(fā)者Noah Hart。

創(chuàng)新互聯(lián)基于分布式IDC數(shù)據(jù)中心構(gòu)建的平臺(tái)為眾多戶提供成都移動(dòng)云計(jì)算中心 四川大帶寬租用 成都機(jī)柜租用 成都服務(wù)器租用。

你為什么要做這個(gè)項(xiàng)目?

我本來(lái)的目的是在程序中使用嵌入式數(shù)據(jù)庫(kù),同時(shí)不依賴于額外的dlls。我搜索后發(fā)現(xiàn)了SQLite,并決定嘗試在我寫的免費(fèi)程序Punjabi Kosh中使用部分SQLite數(shù)據(jù)庫(kù)引擎代碼。最初我是用VB進(jìn)行移植的,但后來(lái)發(fā)現(xiàn)并不很合適。當(dāng)時(shí)我還希望能夠同時(shí)重寫Kosh,并學(xué)習(xí)一下C#-SQLite移植,你是如何移植的,使用工具還是手工完成?

1:創(chuàng)建一個(gè)新的C#項(xiàng)目,其中只包含空的main函數(shù),然后將所有SQLite源文件和頭文件添加進(jìn)來(lái)。當(dāng)然這會(huì)產(chǎn)生很多的錯(cuò)誤信息。

2:注釋掉所有C代碼。我的想法是逐步移植,所以首先需要編譯通過(guò)。

3:由于當(dāng)時(shí)我對(duì)C#并不熟悉,因此下一步是確定這兩種語(yǔ)言之間的不同。不出所料,這兩種語(yǔ)言之間的語(yǔ)法差異微乎其微。我可以用Visual Studio的宏來(lái)做自動(dòng)替換。 :

4:將所有C代碼包裝在一個(gè)sqlite類中。在C語(yǔ)言中,代碼分布在很多文件中,并依次編譯。而在C#中,每個(gè)源文件相互獨(dú)立。為了能夠訪問(wèn)不同文件中的代碼,我將每個(gè)(C語(yǔ)言)文件做成partial類的一部分。

5:C支持內(nèi)聯(lián)宏,而C#不支持。我需要將絕大多數(shù)的#DEFINE轉(zhuǎn)換成方法或常量。

5a:確保項(xiàng)目仍然可以通過(guò)編譯。

6:真正困難的部分才開始。我需要將所有的struct轉(zhuǎn)換成含有公共成員的對(duì)象。

6a:確保項(xiàng)目仍然可以通過(guò)編譯。

7: 開始清除方法上的注釋。從這一步開始,工作變得有趣了。我體會(huì)到(兩種語(yǔ)言的之間)非常多的不同,例如類定義與空指針是如何處理的、C#中沒(méi)有 union、值類型和引用類型、switch case的不同行為、byte數(shù)組和字符串尋址。此外,我還需要一些“工具”函數(shù),如atoi、printf、memcpy、strcmp等等。大多數(shù)情 況下,我只是簡(jiǎn)單的模擬它們,而不是重寫代碼。這是為了能節(jié)省轉(zhuǎn)換的時(shí)間,確保程序可以正常工作,然后才開始用C#的方式重寫。

7a:確保項(xiàng)目仍然可以通過(guò)編譯。

然后就是

8:while(not_done) {7; 7a;}

Hart認(rèn)為C#-SQLite是用C#模擬C,而不是移植:

C#是面向?qū)ο蟮模鳦不是。因此將我的工作當(dāng)成移植其實(shí)是誤解,它更多的使用C#來(lái)模擬C。大多數(shù)代碼仍然使用C的風(fēng)格,我只用了非常非常少的對(duì)象技術(shù)和C#特性。

整個(gè)移植過(guò)程花費(fèi)了兩年多一點(diǎn)的時(shí)間,所有的工作都是在閑暇時(shí)間里作為愛(ài)好完成的。Hart從106,700行C代碼開始,***產(chǎn)生了117,329行C#代碼,但是這并非是一個(gè)公平的比較,因?yàn)樵诤芏嗟胤轿冶A袅薈代碼作為注釋以供參考。

你覺(jué)得整個(gè)移植過(guò)程是痛苦的還是快樂(lè)的?

這是一次學(xué)習(xí)的體驗(yàn),我的目的也是學(xué)習(xí)SQLite的工作方式,我喜歡探索程序的內(nèi)部結(jié)構(gòu)。

對(duì)于從C移植到C#,你有什么愿意分享的么?

決定哪些部分是不需要移植的。

謹(jǐn)記你的目標(biāo)是什么。

盡量自動(dòng)化。

你的流程應(yīng)該可以讓你逐步移植。

看好你的指針。

提問(wèn),并真正理解問(wèn)題的答案。

C#-SQLite已經(jīng)通過(guò)了超過(guò)30,000個(gè)測(cè)試,在這些SQLite的標(biāo)準(zhǔn)測(cè)試或你自己創(chuàng)建的測(cè)試中,有沒(méi)有專門針對(duì)這個(gè)項(xiàng)目的?

sqlite.org提供了標(biāo)準(zhǔn)測(cè)試,在http://sqlite.org/faq.html中寫道:

(17)SQLite使用全面覆蓋的測(cè)試來(lái)保證質(zhì)量,而不是依靠編譯器警告或靜態(tài)代碼分析工具。換句話說(shuō),我們驗(yàn)證的是SQLite是否能產(chǎn)生正確的結(jié) 果,而不僅僅是滿足某些代碼風(fēng)格。SQLite代碼中有超過(guò)三分之二是純粹用于測(cè)試的。SQLite測(cè)試套件有幾千個(gè)獨(dú)立的測(cè)試用例,其中很多測(cè)試用例還 是參數(shù)化的,因此每次發(fā)布前,都有幾十萬(wàn)個(gè)測(cè)試調(diào)用幾百萬(wàn)行SQL語(yǔ)句來(lái)評(píng)估(SQLite的)正確性。

不過(guò),所有的測(cè)試都需要TCL來(lái)運(yùn)行,因此我還需要將TCL移植到C#。我找到了一個(gè)移植到Java的TCL版本,然后我將這個(gè)版本移植到了C#。

邊注,這可是很大的工作量!

還有多少測(cè)試是沒(méi)有通過(guò)的?要讓它們通過(guò)還需要做多少工作?

這取決于測(cè)試是否在C#中是必須的。例如,某些測(cè)試是與big-endian vs. little-endian相關(guān)的,這些測(cè)試在C#中是不需要的。

相比于SQLite wrapper/adapter for .NET,C#-SQLite***的優(yōu)勢(shì)是什么?

很多SQLite wrappers/adapters for .NET都很不錯(cuò),我沒(méi)有將C#-SQLite當(dāng)成是它們的替代品。

什么樣的項(xiàng)目可以從C#-SQLite中獲得***的好處?你會(huì)將它用在什么地方?

將SQLite引擎嵌入在程序中,而不需要額外的dlls,可以在中等信任級(jí)別中使用完全的托管代碼。

你未來(lái)的計(jì)劃是什么(當(dāng)然是和C#-SQLite相關(guān)的)?

去掉剩下的P/Invoke并讓它可以在Silverlight中使用。

你會(huì)繼續(xù)移植SQLite的后續(xù)版本么?

是的,3.6.17已經(jīng)完成了。

你計(jì)劃今后如何為此項(xiàng)目提供支持(針對(duì)bug和增強(qiáng))?

我建立了網(wǎng)站http://code.google.com/p/csharp-sqlite/和一個(gè)討論組http://groups.google.com/group/csharp-sqlite。

你需要社區(qū)的幫助么?

是的。怎么看我也不是一個(gè)C#高手。我認(rèn)為其它開發(fā)人員可以幫助提升C#-SQLite的性能并讓它更C#化。

注:Noah Hart是一個(gè)開發(fā)人員,他的興趣是英語(yǔ)到Punjabi語(yǔ)的機(jī)器翻譯。

C#-SQLite移植的相關(guān)采訪內(nèi)容就到這里,希望大家喜歡。

【編輯推薦】

  1. 學(xué)習(xí)C#消息:循序漸進(jìn)
  2. 解惑答疑:C#委托和事件
  3. 學(xué)習(xí)C#實(shí)現(xiàn)HTTP協(xié)議:多線程文件傳輸
  4. 進(jìn)一步接觸C#委托與事件
  5. 淺析四種C#轉(zhuǎn)換的區(qū)別

網(wǎng)站欄目:解密C#-SQLite是如何移植的
文章位置:http://www.dlmjj.cn/article/cdsjoog.html