前一段时间, 我写了一篇短文, 大概就是说nim语言的jester 网站开发框架像坨屎, 原因我也写了一点. 最近我自己想用nim语言写个像django那样的框架, 有了一些想法和思考, 这里记录一下.
1. nim语言的web框架, 目前就是jester, 号称是最好的, 说是仿照ruby on rails的. 但是nim本身就不是很好用, jester 更是不怎么受我喜欢, 用过python的django之后, 或者flask, 或者tornado, 都觉得nim语言的jester真的不够优雅和简洁.
2. 想法:
1. 能不能实现异步响应?
2. 能不能很好的调用数据库, 或者说有没有一个ORM(定义几个model, 映射到数据库)
3. 有没有一个template框架, 类似django, 或者jinja2的?
4. 内存占用的问题.
nim应该可以实现异步, 不过我编程的时候, 最开始的想法就是先实现一个同步的web框架, 这个我水平不够, 以后再说.
实际上不用ORM, 也可以使用sql语言来访问数据库, 可能还会更快. 或许是python那边有一切皆对象, 有大量的面向对象的代码, 而且面向对象很符合人类解决问题的思路, 所以, 有时候从python转过来, 就想有个ORM可以用. 可能nim语言的原生开发者, 就是喜欢sql语句加nim代码吧. 我在网上找到了一个orm, 很简单, 技巧用的很多, macros我研究了几个月, 有几个还没搞懂, 可能至上有限, 或者macros实在是太难搞了.
nim的难点就是, 你只要想开发一个功能稍强的软件, 你就会深入研究macros, templates, AST改写等等已经接近底层的代码技术了, 你想开发一个功能复杂点的软件, 或者你想法太深, 你就必须先做一个nim语言资深专家, 或者你要懂编译原理, 并开始自己写一个编译器.
orm问题, 不是那么容易解决, nim语言最近一直在更新升级, orm代码换个nim版本就不能用了.
最近碰到的问题就是, sql取出的数据, 你如何赋值给你的model的各个field?
在深入研究透 macros的写法, 用proc还是用macro, 还是用template, 你想清楚了再写, 或者先复制粘贴, 慢慢调试慢慢理解.
NimNode是啥? 研究透了再写macro, 再采用AST语法树改写技巧吧.
最近把大佬5年前的orm改写到适合nim-1.0的版本, 修复了一些bug, 有些macro和pragma很难理解, 而且死活报错不能编译通过, 没办法, 只能采用土办法, 笨办法, 实在是理解不了大佬的奇技淫巧, 代码行数是增加了, 智商要求降低了. 注释数量也增加了, 不看注释, 马上就看不懂为什么要这样写macro.
nim-orm https://github.com/nanoant/nim-orm/
大佬已失踪, 不更新, 我只能当他可能已经挂了.
也许在我心中, 我的orm, 能够在nim的世界里摩擦, 但是我后来又发现了一个制约我的大难题. 就是从数据库中获取的数据, 赋值给一个一个model之后, 不能像python那样在内存中以kwargs之类的形式传递给模板渲染器, 原因是:
3.1 python中的list是允许混杂的, 比如[1, "aaa", 3.22, (4,3)], 但是nim是静态语言, 不能这样搞, 每个list都是纯种数据类型. 完全没法不同数据类型.
3.2 python的dict, 每个key, 对应的value都可以是不同的数据类型, 但是nim的table就不行, key, value的类型早早的就定义好了.
也就是说, 问题在这里, nim的table, 不能有不同的value类型.
解决的办法就是采用json传递数据, json的JsonNode, 有个nodekind, 可以容纳不同的数据类型.
先把model转为json, 再传递给模板template render.
问题就是, model如果有method来处理, 也无法传递给template渲染了, 在模板中不能获取那些函数, 或者我觉得数据在进入template渲染的时候, 都被阉割了, 数据类型都变了, 都是JsonNode, 然后方法都丢了, 比如model.get_absolute_url()这个在django中最熟悉的方法都无法正常传递个模板渲染器. 可能我还没学会给函数传递另外一个函数.
ORM的model变json, 也是一个问题, json的%操作符, 要对各种数据类型进行编码, 现在无法给DateTime进行编码, 还是报错. 需要花大量的时间来进行调试.
我在nim-0.19版本的时候, 实现了一个粗糙的框架, 有各个handler, urls, settings, get和post分配, 最后, 我发现一个我很难解决的问题就是内存占用, 一直随着http请求数不断的增加, 就是说handler处理完之后, 有些内存没有释放. 虽然我的内存, 有8G, 但是也不敢说够用. 可能linux系统是不是会好点?
以上问题,, 我觉得是问题2和3制约了nim写出类似于django那样框架.
但是问题都是可以在日后逐步解决的, 随着nim的不断完善、稳定和libs的增加, 这些问题都能解决.
到时候, 我可能会关注异步和解决内存占用的问题.