写点什么

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

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

关注

评论

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

在小公司混水摸鱼3年,被面试官直接开怼:能力太差了,还不如应届生哇

android 程序员 移动开发

基于-Kotlin-+-Netty-实现一个简单的-TCP-自定义协议

android 程序员 移动开发

反向编译了子弹短信的 APK,核心功能为整合网易云信 SDK

android 程序员 移动开发

叫板-Android-开发!跨平台应用开发神器-Flutter-又添开源插件!-&nbs

android 程序员 移动开发

北漂7年,安全着陆,一位大龄Android程序员的自述

android 程序员 移动开发

大厂面试官:跳出舒适圈的程序员3年月薪还没到2万,干脆考虑转行?

android 程序员 移动开发

大家都说程序员是吃青春饭的、Android研发没前景,那等Android研发年纪大了又该怎么办?

android 程序员 移动开发

初探 Android 组件化,四个步骤把握组件化核心要领

android 程序员 移动开发

动态加载 so 注意事项&案例

android 程序员 移动开发

加快APK构建速度,如何一步步把编译时间从130秒降到17秒以内

android 程序员 移动开发

勤勤恳恳做到30岁,3名百度 ,京东,腾讯的高级Android工程师被辞退了

android 程序员 移动开发

历时30天的腾讯Android研发岗面试血泪史!最终拿到offer25K+16薪

android 程序员 移动开发

分享十次Android面试经验总结,已收字节,阿里,小米等offer

android 程序员 移动开发

前端开发:JS中 indexOf() 方法的使用

android 程序员 移动开发

使用jMeter构造大量并发HTTP请求进行微服务性能测试

汪子熙

Jmeter HTTP java; 11月日更

图片加载框架-Picasso最详细的使用指南

android 程序员 移动开发

同事逆袭面进阿里P7-年薪60W+,临别留下一张Android开发重点技术路线图---

android 程序员 移动开发

无代码Web UI自动化工具Automa初体验

FunTester

chrome 自动化 插件 FunTester Automa

十年老Android:构建Android-MVVM应用程序只需这几步?

android 程序员 移动开发

可能是目前最全的《Android面试题大全》(中高级)

android 程序员 移动开发

史上最详细!那些你不知道的WorkManager流程分析和源码解析

android 程序员 移动开发

各种风格的Android面试题,进来了解一下?

android 程序员 移动开发

Chrome开发者工具中Elements(元素)断点的用途

汪子熙

JavaScript chrome Chrome开发者工具 11月日更

Jerry眼中的SAP客户数据模型

汪子熙

CRM SAP abap 11月日更

凭借这938页Android面试题合集,拿下了滴滴、美团、携程

android 程序员 移动开发

副本 Kubernetes之POD、容器之间的网络通信

android 程序员 移动开发

在这个问题上,能看出 Android 工程师的真实水平

android 程序员 移动开发

分分钟带你读懂-ButterKnife-的源码

android 程序员 移动开发

原创_Android Jetpack Compose 最全上手指南

android 程序员 移动开发

四张图让你玩转Tomcat系统架构!!!

android 程序员 移动开发

【高并发】深入解析Callable接口

冰河

Java 并发编程 多线程 高并发 异步编程

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