免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: send_linux

《ruby元编程》有奖试读中!(获奖名单已公布) [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2012-03-01 11:08 |显示全部楼层
回复 59# starwing83

我第一次用C++编译出的exe搞不好也有2-3M。
我现在会,至少在Windows下,弄出一个1k上下、除了kernel32.dll外无任何依赖的hello world —— 用与几年前一样的实现,比如VC6。
而且随便什么C实现, 只要有较为详细的手册, 一样可以弄出这样大小的hello world。
因为我知道了crt是做什么的,知道了它是如何通过OS实现的,知道了PE格式与OS的加载器如何交互的 —— 这可不是语言会教的事情。

你用cl才几天啊? 即使实现提供了尽量去掉依赖的功能,你就一定能发现?
发布程序里带有完整功能是lisp,至少是cl社区的文化: http://www.cliki.net/Creating%20Executables
你不喜欢(其实我也不喜欢), 我不是还推荐你去看看ecl么……  我发的那些邮件都进你的垃圾列表了么……

论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2012-03-01 11:11 |显示全部楼层
回复 57# OwnWaterloo


    还有两点:

1. 你一直在说优化到addl,我明确告诉你在lua是不可能的。lua就是一动态语言,是没有办法直接诶优化到addl的,那么lua是怎么做的呢?

1) 首先,lua有些固定功能是写死的,比如+,因此可以编译成OP_ADD,OP_ADD可能操作十分复杂:它要先查看类型,然后决定是native 函数还是调用元表等等,但是至少我能限定这肯定是OP_ADD而不是OP_SUB神码的,这是第一步。
2) 然后,程序执行,执行的时候一个trace compiler会监视程序的执行,如果发现程序在反复执行一段代码,而且这段代码中涉及变量的类型啥的是不变的,于是trace compiler就会提取出OP_ADD的实现,并作出优化,然后用这段native的实现重新链接出一段新的机器码,然后以后如果再执行这段代码,就直接跑这段机器码,这就是JIT技术!

lua是不会静态编译的,静态编译的效率也不见得比JIT高。

2. 请问您从哪儿得出“lisp的code trasformation最强”这个观点的?难道自己是ast那么ct能力就最强么?我说过很多很多遍了,lua的宏已经有了,ast也已经有了,metalua,你自己不愿意去用。实际上metalua很像一个lisp的方言了,但是它具有两个lisp没有的特点:1.限制,2.语法。metalua的ct能力已经非常强了,而且我觉得比lisp强。lisp只是说可以原生操作程序结构,metalua也可以,而且metalua有一些高级功能,能编程的模式匹配器,甚至是递归式的模式匹配过滤器。lisp有么?lisp只能很辛苦地(if (eq (cons func) 'lambda) ...,lisp可以:
xmatch ast do
| `Lambda args body -> args[2] = "b"
end
可以这么简单么?lisp除了可以原生修改程序,除了程序结构和ast结构一致这两点非常非常初级的特性以外,还有什么呢?这两点其实都是初学者友好的, 对训练有素者根本就是无关紧要的。我的脑海里只要一写int *p;我就知道这是指针,一看&&我就知道是and,可是我学的时候我背了好久!为什么以后我不会一看到Lambda我就知道这是function(args..)body end呢?这种映射根本就不难,lua的语法结构两只手就能数清楚!而且最讽刺性的是,lisp这种“对初学者友好的ct”,恰恰因为lisp本身对初学者不友好,而十分尴尬!

metalua就没有这个问题,一方面,lisp做得到的它都做得到。另一方面,它对初学者真正的友好。它的原则是“让困难的事情简单,让不可能的事情可能”,而不是“让所有的东西都是一样的,让做事情看起来简单实际上麻烦”,它提供了工具,比如xmatch,这是lisp没有的,请问,在这个前提下,你凭什么说lisp就是ct最好的?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2012-03-01 11:14 |显示全部楼层
回复 59# starwing83

+的问题以前不知道说过多少回了。   就是lisp固定得少,lua固定得多。
退一万步, 设计一个lisp将+固定了又如何? 这不影响前面提到的lisp的精髓。 —— 这是以前说过的原话。

如何固定+,前面funcall与let将+局部化的例子也举了……
优化到机器加法也说了……

论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2012-03-01 11:20 |显示全部楼层
回复 60# OwnWaterloo


    我必须要重申一点:我没纠结lisp的实现,我的意思是,lisp的灵活性,导致实现一个好的lisp会很困难!这就是我的意思。我像让lisp限制一点,对开发者对实现者都友好,lisp的确概念很优美,但是这种优美导致了任何对其的修改都会导致它不优美,而不做修改就一定会导致1.体积庞大或2.效率底下。我没说现在的lisp不好实现lisp的人都是傻瓜,我是说lisp的优美和完美本身就是导致lisp很难实现的原因。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2012-03-01 11:21 |显示全部楼层
回复 62# starwing83

>> 你自己不愿意去用。
不只是我不愿意用, 你自己愿意用么?


>> lisp可以:
>> xmatch ast do
>> | `Lambda args body -> args[2] = "b"
>> end
>> 可以这么简单么?
你自己说,lisp是否可以……  我都不好意思回答你……


>> 为什么以后我不会一看到Lambda我就知道这是function(args..)body end呢?这种映射根本就不难,lua的语法结构两只手就能数清楚!
难不难你自己清楚,反正我是没用过,而且已经觉得lisp不难。


>> 而且最讽刺性的是,lisp这种“对初学者友好的ct”,恰恰因为lisp本身对初学者不友好,而十分尴尬!
lisp只是对被拉低了层次的初学者不友好。

论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2012-03-01 11:23 |显示全部楼层
回复 63# OwnWaterloo


    谁先说起来+的来着?我忘了= =

限制+的问题说完了。那接下来的问题讨论下?lisp的ast和语法一致只是一个“初级友好”的特性,事实上做大脑映射是很简单的。大家都熟悉C看到&&就知道是and就是一个好例子。ast即语法除了对初学者友好以外就没有其他的什么好处了。也并不能怎么简化ct什么的。这个观点你觉得如何?

但是前提是,就算是ast不是语法,也必须是轻语法的,像ruby这种重语法语言就根本别想了,也别提所谓元编程了。

论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2012-03-01 11:30 |显示全部楼层
回复 65# OwnWaterloo


    我目前没发现有需要元编程的需求……真的。所以普通的lua够用了。而且我告诉你一个例子。很早以前前公司要提取程序里面所有的中文,做国际化,我直接把源代码交给metalua编译,然后做成ast,然后用xmatch遍历ast,提取所有字符串,判断是不是中文,然后输出。一个上午两个小时完全搞完了,服务器那边搞了一星期。请问这是不是metalua的实用例子?只要我在用lua,那么我想用metalua随时可以用,他们本来就是兼容的!

第二个问题:lisp可以,但是不一定会这么简单,而且我没发现有lisp对表的模式匹配库,请问有么?比如:

(list-match '(if \1 \2 \3) '(if a b c)) --> a b c

有这样的工具么?

有遍历源代码的工具么?metalua有walk。

lisp是可以,可是lisp有高级支持么?这种高级支持,跟lisp “ast即语法”有关系么?我告诉你,没有半毛钱关系!是跟lisp“ast即内建数据结构”有关系!而metalua是一样的!ast即内建数据结构!

第三个问题同上,我是用过的,而且我说过,这种机会真的不多,只有特殊情形下才会遇到。

第四个问题:我没说lisp对初学者不友好咋样咋样,我是说lisp既然已经决定拒绝sb程序员了,那为什么ct要采取这么亲民的态度呢?明明就算用映射,这些用lisp的天才程序员也都记得住么?有人会记不住if和If的联系么?用Java那群sb可是常常挂在嘴边啊,这证明metalua式的映射根本就不是“对初学者不友好”,那么请回答我的问题:lisp还有什么优势呢?

论坛徽章:
4
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:11
发表于 2012-03-01 11:33 |显示全部楼层
回复 65# OwnWaterloo


    哦,对,还有一个优势:就是一切皆表达式,语法的灵活性,这的确是另外一个优势,不过metalua做起来也简单,没这么做的原因是怕和lua不兼容,如果想要这个优势,有moonscript,虽然我本人不是很喜欢这个东西……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2012-03-01 11:39 |显示全部楼层
回复 64# starwing83

我也说过很多次了……  你想要的修改就是默认关闭,显式开启。

1. 默认静态类型,动态类型仅在编译时操作ast使用
当确实需要运行时动态类型时明确告知, 并带上runtime。

2. 默认静态语言
只在有需要时在有限点上开放动态功能,并带上相应的runtime。

3. debug信息, 有很明显的编译参数去掉
云风为了lua debug不知道纠结多少次了。

4. image-based execution, eval这种核弹级功能必须默认关闭

需要某种灵活性就必须付出相应代价,任何语言,任何实现都是如此。
lisp的优美在于当需要这种灵活性时,操作方式是一致的。

而没有良好划分出各种runtime功能,也许是lisp社区的文化。
lisp从一开始就是低效的代名词, 直到编译技术的提高, 直到硬件的发展。
因为lisp从一开始就不是走的fortran路线, 从一开始就没打算压榨机器性能。
随后开始考虑了, 但空间已经很廉价了。

也有为embedded考虑的lisp,你又不去看……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2012-03-01 11:50 |显示全部楼层
回复 66# starwing83

>>  谁先说起来+的来着?我忘了= =
应该是某次你在qq上说的,或者是CU的C++板…… 说它影响优化。

>> 但是前提是,就算是ast不是语法,也必须是轻语法的,像ruby这种重语法语言就根本别想了,也别提所谓元编程了。
lisp根本就不区分轻语法与重语法……
你看……  其实你自己也清楚……  重语法会影响text->ast的人肉转换。
而最轻的、轻到极致的,不就是lisp么……

09年的时候我还在纠结类python的语法(主要就是缩进敏感)。
你看我现在还会提它或者语法相关的考虑么……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP