写点什么

解密 C#-SQLite 是如何移植的

  • 2009-08-20
  • 本文字数:2112 字

    阅读完需:约 7 分钟

两周前 InfoQ 报道了 SQLite 移植到了.NET 的消息。由于社区对这一项目的异常关注,为了弄清 SQLite 是如何移植到 C#的,我们采访了此项目的开发者 Noah Hart

你为什么要做这个项目?

我本来的目的是在程序中使用嵌入式数据库,同时不依赖于额外的 dlls。我搜索后发现了 SQLite,并决定尝试在我写的免费程序 Punjabi Kosh 中使用部分 SQLite 数据库引擎代码。最初我是用 VB 进行移植的,但后来发现并不很合适。当时我还希望能够同时重写 Kosh,并学习一下 C#。

你是如何移植的,使用工具还是手工完成?

1:创建一个新的 C#项目,其中只包含空的 main 函数,然后将所有 SQLite 源文件和头文件添加进来。当然这会产生很多的错误信息。 2:注释掉所有 C 代码。我的想法是逐步移植,所以首先需要编译通过。

3:由于当时我对 C#并不熟悉,因此下一步是确定这两种语言之间的不同。不出所料,这两种语言之间的语法差异微乎其微。我可以用 Visual Studio 的宏来做自动替换。下表列出了大概的方式:

C C# -> . & ref assert Debug.Assert ==0 ==null #ifdef #if #ifndef #if !4:将所有 C 代码包装在一个 sqlite 类中。在 C 语言中,代码分布在很多文件中,并依次编译。而在 C#中,每个源文件相互独立。为了能够访问不同文件中的代码,我将每个(C 语言)文件做成 partial 类的一部分。

5:C 支持内联宏,而 C#不支持。我需要将绝大多数的#DEFINE 转换成方法或常量。
5a:确保项目仍然可以通过编译。

6:真正困难的部分才开始。我需要将所有的 struct 转换成含有公共成员的对象。
6a:确保项目仍然可以通过编译。

7: 开始清除方法上的注释。从这一步开始,工作变得有趣了。我体会到(两种语言的之间)非常多的不同,例如类定义与空指针是如何处理的、C#中没有 union、值类型和引用类型、switch case 的不同行为、byte 数组和字符串寻址。此外,我还需要一些“工具”函数,如 atoi、printf、memcpy、strcmp 等等。大多数情 况下,我只是简单的模拟它们,而不是重写代码。这是为了能节省转换的时间,确保程序可以正常工作,然后才开始用 C#的方式重写。
7a:确保项目仍然可以通过编译。

然后就是

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

Hart 认为 C#-SQLite 是用 C#模拟 C,而不是移植:

C#是面向对象的,而 C 不是。因此将我的工作当成移植其实是误解,它更多的使用 C#来模拟 C。大多数代码仍然使用 C 的风格,我只用了非常非常少的对象技术和 C#特性。

整个移植过程花费了两年多一点的时间,所有的工作都是在闲暇时间里作为爱好完成的。Hart 从 106,700 行 C 代码开始,最后产生了 117,329 行 C#代码,但是

这并非是一个公平的比较,因为在很多地方我保留了 C 代码作为注释以供参考。

你觉得整个移植过程是痛苦的还是快乐的?

这是一次学习的体验,我的目的也是学习 SQLite 的工作方式,我喜欢探索程序的内部结构。

对于从 C 移植到 C#,你有什么愿意分享的么?

决定哪些部分是不需要移植的。
谨记你的目标是什么。
尽量自动化。
你的流程应该可以让你逐步移植。
看好你的指针。
提问,并真正理解问题的答案。

C#-SQLite 已经通过了超过 30,000 个测试,在这些 SQLite 的标准测试或你自己创建的测试中,有没有专门针对这个项目的?

sqlite.org 提供了标准测试,在 http://sqlite.org/faq.html 中写道:> (17)SQLite 使用全面覆盖的测试来保证质量,而不是依靠编译器警告或静态代码分析工具。换句话说,我们验证的是 SQLite 是否能产生正确的结 果,而不仅仅是满足某些代码风格。SQLite 代码中有超过三分之二是纯粹用于测试的。SQLite 测试套件有几千个独立的测试用例,其中很多测试用例还 是参数化的,因此每次发布前,都有几十万个测试调用几百万行 SQL 语句来评估(SQLite 的)正确性。

不过,所有的测试都需要 TCL 来运行,因此我还需要将 TCL 移植到 C#。我找到了一个移植到 Java 的 TCL 版本,然后我将这个版本移植到了 C#。
边注,这可是很大的工作量!

还有多少测试是没有通过的?要让它们通过还需要做多少工作?

这取决于测试是否在 C#中是必须的。例如,某些测试是与 big-endian vs. little-endian 相关的,这些测试在 C#中是不需要的。

相比于 SQLite wrapper/adapter for .NET,C#-SQLite 最大的优势是什么?

很多 SQLite wrappers/adapters for .NET 都很不错,我没有将 C#-SQLite 当成是它们的替代品。

什么样的项目可以从 C#-SQLite 中获得最大的好处?你会将它用在什么地方?

将 SQLite 引擎嵌入在程序中,而不需要额外的 dlls,可以在中等信任级别中使用完全的托管代码。

你未来的计划是什么(当然是和 C#-SQLite 相关的)?

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

你会继续移植 SQLite 的后续版本么?

是的,3.6.17 已经完成了。

你计划今后如何为此项目提供支持(针对 bug 和增强)?

我建立了网站 http://code.google.com/p/csharp-sqlite/ 和一个讨论组 http://groups.google.com/group/csharp-sqlite

你需要社区的帮助么?

是的。怎么看我也不是一个 C#高手。我认为其它开发人员可以帮助提升 C#-SQLite 的性能并让它更 C#化。

Noah Hart 是一个开发人员,他的兴趣是英语到 Punjabi 语的机器翻译。

查看英文原文: Disclosing How C#-SQLite Was Ported to .NET

2009-08-20 22:193660
用户头像

发布了 63 篇内容, 共 25.6 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

网易易盾流量多发反外挂落地实践

网易云信

安全 反外挂

Python从0到1丨带你认识图像平滑的三种线性滤波

华为云开发者联盟

Python 人工智能 华为云 华为云开发者联盟 企业号 5 月 PK 榜

华为云应用运维管理平台获评中国信通院可观测性评估先进级

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

科技引领,亮出高质量发展新引擎!

Openlab_cosmoplat

工业互联网 开源社区

《苏丹的复仇》携手华为HMS生态,实现用户、收入双增长

HarmonyOS SDK

HMS Core

mac上好友的git客户端:SourceTree 最新中文版

真大的脸盆

Mac Mac 软件 Git客户端

预搜优化,页面TTI时长缩减50%!去哪儿网酒店预订体验优化经验分享~

Qunar技术沙龙

前端 去哪儿网

最新报告:腾讯云获得多个单项冠军

科技热闻

MobTech ShareSDK|口令分享

MobTech袤博科技

清华开源图文对话大模型!表情包解读有一手,奇怪的benchmark增加了

Openlab_cosmoplat

开源项目 开源社区 ChatGPT

中国物流集团携手用友启动ERP暨财务共享建设项目

用友BIP

财务共享

支撑企业未来10年高增长,用友资金管理平台助力新零售企业逆境破局

用友BIP

新零售 资金管理

【ITCP联盟高管访谈】近一步,更进一步,去哪儿技术品牌建设之路——张宇专访

Qunar技术沙龙

访谈 去哪儿网

用友助力中核集团建设财务共享中心新华发电分中心,实现业财融合

用友BIP

财务共享

网易易盾流量多发反外挂落地实践

网易智企

安全 反外挂

黑客入门指南,学习黑客必须掌握的技术

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

基于超级App构建视角,探索不同的软件应用架构模式

FinFish

小程序容器 超级app 小程序技术 软件应用架构

常听人说并发量高达多少多少,这个值是怎么测的?

为自己带盐

Jmeter 压力测试

【ITCP联盟高管访谈】近一步,更进一步,去哪儿与ITCP联盟的此呼彼应——孙斌专访

Qunar技术沙龙

访谈 去哪儿网

ChatGPT与低代码开发:危机四伏、技术暴走!

加入高科技仿生人

人工智能 低代码 AI技术 ChatGPT

PostgreSQL技术内幕(八)源码分析 ——投影算子和表达式计算

酷克数据HashData

RocketMQ 在小米的多场景灾备实践案例

阿里巴巴云原生

阿里云 RocketMQ 云原生

深圳智慧公厕推进智慧城市建设

光明源智慧厕所

智慧城市

云计算遇上电动车,跑出新模式的数智化转型

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

皖投集团:财务共享,迈出“智慧企业”第一步

用友BIP

财务共享

什么是Scrum?Scrum的理论基石

顿顿顿

Scrum 敏捷 敏捷开发 敏捷开发管理 敏捷开发管理工具

2023年北京.NET线下技术沙龙圆满落幕!

MASA技术团队

.net DDD MASA

直播预告 | 博睿学院:无监督知识图谱与故障根因分析

博睿数据

智能运维 博睿数据 博睿学院

2022年中国标准创新贡献奖获奖名单公示,海尔再添两项标准创新奖

Openlab_cosmoplat

开源社区 海尔

以财务共享中心建设,打造数字化创新引擎

用友BIP

财务共享

解密C#-SQLite是如何移植的_.NET_Abel Avram_InfoQ精选文章