nim语言为什么弄不出来django那样的web框架

前一段时间, 我写了一篇短文, 大概就是说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. 内存占用的问题.

想法1. 异步的问题.

nim应该可以实现异步, 不过我编程的时候, 最开始的想法就是先实现一个同步的web框架, 这个我水平不够, 以后再说.

想法2. ORM的问题

实际上不用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/ 

大佬已失踪, 不更新, 我只能当他可能已经挂了.

想法3. template的问题

也许在我心中, 我的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进行编码, 还是报错. 需要花大量的时间来进行调试.

想法4. 内存占用的问题.

我在nim-0.19版本的时候, 实现了一个粗糙的框架, 有各个handler, urls, settings, get和post分配, 最后, 我发现一个我很难解决的问题就是内存占用, 一直随着http请求数不断的增加, 就是说handler处理完之后, 有些内存没有释放. 虽然我的内存, 有8G, 但是也不敢说够用. 可能linux系统是不是会好点?

 

以上问题,, 我觉得是问题2和3制约了nim写出类似于django那样框架.

但是问题都是可以在日后逐步解决的, 随着nim的不断完善、稳定和libs的增加, 这些问题都能解决. 

到时候, 我可能会关注异步和解决内存占用的问题.

你可能感兴趣的:(nim,Nim语言学习)