QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

解密 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:193626
用户头像

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

关注

评论

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

圆桌会议:如何避免踩到移动研发中,效能提升那些坑

王字 Wannz

移动开发 迭代

开源商业模式促进金融业科技生态的发展

王字 Wannz

小程序 开源 IT 金融

Linux之at命令

入门小站

Linux

新版上线|能力中心打造全新视角

钉钉开发者

钉钉能力中心 钉钉开放平台能力中心 钉钉开放平台 能力中心

恒源云(GPUSHARE)_替代MLM的预训练任务,真的超简单吗?

恒源云

人工智能 自然语言处理 深度学习

FinClip 与 uniapp:轻应用平台与前端开发框架

王字 Wannz

小程序 uniapp 移动开发 finclip

IT人的笔记本——全面了解 Jupyter

dongge

jupyterlab

Java如何实现消费数据隔离?

CRMEB

2021盘点 | 云主机年度榜单出炉,Top5花落谁家?

博睿数据

OCR技术用于在线身份认证的运营效果分析

OCR

“热搜”中的分布式数据库

OceanBase 数据库

oceanbase 客户案例 四川农信

远程办公团队如何沟通?

王字 Wannz

远程办公 wrh 居家办公 线下办公 soho

架构实战营:模块七作业

Geek_93ffb0

「架构实战营」

【网络安全】一款针对Flutter的逆向工程分析工具

H

网络安全 逆向分析

FinClip 与 mPaaS:轻应用平台与移动应用开发平台

王字 Wannz

小程序 移动开发 mPaaS finclip 小程序容器

小程序框架与平台编译对比

王字 Wannz

小程序 百度智能小程序 头条小程序 finclip 小程序框架

FinClip 的 2021 与 2022

王字 Wannz

finclip 小程序容器 小程序开发 小程序管理平台

有奖调查| 2022 Apache Pulsar 怎么过,你们说了算

Apache Pulsar

开源 云原生 中间件 Apache Pulsar Apache Pulsar 社区

大模型应用新范式:统一特征表示优化(UFO)

百度开发者中心

【连接平台」企业告警信息通过机器人同步至钉钉群

钉钉开发者

连接器 钉钉应用开发 钉群

我与音视频的故事 | 社区征文

Changing Lin

音视频

利用鸿蒙JavaUI 框架的 WebView 加载本地冰墩墩网页

宇宙之一粟

鸿蒙开发 2月月更

低代码OR零代码,企业如何选择自身所需的软件开发平台?

BeeWorks

在线YAML转Properties工具

入门小站

工具

分享你的见解与经验|RocketMQ Summit 2022 议题征集中!

阿里巴巴云原生

阿里云 RocketMQ 云原生 活动

当元宇宙遇上梵高

脑极体

云效应用交付平台 AppStack,10分钟完成代码提交到上线

阿里云云效

阿里云 DevOps 运维 云原生 应用交付

《Sysdig 2022云原生安全和使用报告》发现:超过75%的运行容器存在严重漏洞

York

容器 云原生 安全

2022年低代码的变化与趋势

BeeWorks

网络安全kali渗透学习 web渗透入门 使用WireShark对常用协议抓包

学神来啦

告警运维中心|构建高效精准的告警协同处理体系

阿里巴巴云原生

阿里云 云原生 监控 Arms 告警运维中心

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