将Django的模板引擎移植到C语言
我最近为我的C++应用程序(QT)写了一个简单的小型嵌入式HTTP服务器,并且玩了一下Ry's http-parser,我非常喜欢这个库。这个家伙真是太厉害了。
于是我心想:“嘿!为什么不把Django的模板引擎移植到C语言呢?”这听起来太棒了!我知道,这绝对不是一件简单的事(一点也不简单,我知道),但我真的很想实现这个想法。所以我来这里寻求灵感、想法和意见……
我非常希望能得到一些关于这个主题的建议,想法,已经有哪些工作已经完成,可能会遇到哪些主要问题(以及如何解决它们)——怎么避免重复造轮子……总之,你们明白我的意思了 :)
非常感谢大家!
附言:简单的代码片段,以及工具和库的链接都是非常欢迎的!
再附言:我已经知道grantlee,我看过它的源代码。嗯……那是C++,而且是特定于Qt的。
5 个回答
作为参考,onion 有一个和 Django 相关的模板系统。
这个系统会把模板编译成 C 语言代码,甚至还可以进行一些 gdb 调试。
生成的代码主要是针对 onion 的,但经过一些努力,它也可以变得更通用。
嗯,我觉得在Django模板代码中没有什么东西在C语言中实现起来会很难。模板的语法看起来有点像Python,但其实并不是Python;他们自己做了一个解析器。所以你可以先看看Django在Python中的模板实现。其实代码不多,而且相对容易理解。
当然,用C语言写的话会显得比较啰嗦。你写的其实就是一个编译器:它读取一些代码(Django模板),然后输出另一种语言的代码(HTML)。所以你能找到的关于用C语言写编译器的所有文档(比如词法分析器、语法分析器和代码生成器)都是有用的。
首先,你可能想生成一个语法树。Django模板的语法非常规则……每个{% whatever %}
块都有一个对应的{% endwhatever %}
块,所以你的解析器其实可以在不知道所有whatever
关键字是什么的情况下生成这棵树。
接下来,你就可以遍历这棵树,为每个块进行“代码生成”阶段。例如,你可以通过检查if参数的值来生成{% if %}
的代码,根据if条件是对还是错来决定是输出内容还是不输出。其他的像while循环、过滤器、块等等也是这样处理。
不过,要知道,这些工作量可不小……你有没有考虑过直接在你的C程序中嵌入一个Python解释器?(真的!这并不难,因为Python解释器是开源的。)