免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: __BlueGuy__
打印 上一主题 下一主题

[C] Lua 造成的代码冗余太严重了, 这个现状怎么改善? [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
41 [报告]
发表于 2012-11-18 15:36 |只看该作者
starwing83 发表于 2012-11-18 09:45
回复 34# OwnWaterloo

我想说说我的观点。BASIC里面有goto,确切地说,1980年的GW-BASIC里面**只有**goto,所以产生了不少面条代码。所以你说goto是坏的,goto是恶魔。到了2012年的今天,有人听到了“goto是恶魔”这句话,于是就说“C语言里面goto是恶魔”,愚昧不?

C里面指针乱指导致内存泄露,于是人们说“Haskell内存不安全,指针乱指容易泄露”,傻逼不?

为什么一门语言的缺陷,就必须是所有语言的缺陷呢?

C模块容易造成安全性的私有模块的问题,仅仅在C模块——因为那在Lua能力范围之外。所以,你有选择是否导出的权利——确切地说,你只有明确地导出才能用。这避免了你喝醉了酒误加了一个参数然后把某个模块公开了——这不可能。你至少得写一打代码做导出。

而Lua模块。为什么我最开始说Lua导出的只有函数?是因为Lua的函数不危险。它们没有上下文。或者说,他们的上下文是死的,是文件里面写死的。Lua的模块机制是“平”的。即使你写a.b.c.d.e.f,到了module.loaded里面也是平的。平的模块机制是无法解决隐藏模块的问题的,也不需要解决隐藏模块问题。Lua无意隐藏任何模块。因为你只要拿出来的模块,就可以公开,出问题了是谁的问题呢?前面说了,社区啥啥啥的。语言为什么要强制某些东西呢?特别的,在Lua这种连参数数目都不强制,连变量声明都不强制的语言里面,你去强制不允许载入某些模块,你不觉得很可笑么?


谁在说不让用户加载是为了安全性了?
私有/公有界面的重要性,还需要我多说? 那为什么要将私有/公有的划分仅限制在函数/域级别? 而不将它扩展到库的组织上?

首先,我没有说要强制。 其次,lua不支持的需求就是可笑的? 如果你要为lua辩护到这种程度, 也没什么好说的了。
我觉得lua作者的解释比你来得更诚恳:
http://www.lua.org/pil/16.4.html

The main design for objects in Lua, which we have shown previously, does not offer privacy mechanisms. Partly, this is a consequence of our use of a general structure (tables) to represent objects. But this also reflects some basic design decisions behind Lua. Lua is not intended for building huge programs, where many programmers are involved for long periods. Quite the opposite, Lua aims at small to medium programs, usually part of a larger system, typically developed by one or a few programmers, or even by non programmers. Therefore, Lua avoids too much redundancy and artificial restrictions. If you do not want to access something inside an object, just do not do it.


lua的作者都知道要尊重私有/公有的区分,不觉得这有什么可笑的。只是在lua里,因为各种原因语言不提供这种区分,程序员自己商量。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
42 [报告]
发表于 2012-11-18 15:37 |只看该作者
回复 37# OwnWaterloo


    又不是不要你用dofile,只是这货用来做require的活儿始终觉得不正统——对,我就是希望写出来的代码越正统越好。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
43 [报告]
发表于 2012-11-18 15:38 |只看该作者
回复 40# starwing83

所以我看到18楼的debug就觉得不靠谱。 看来也没有靠谱的方式。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
44 [报告]
发表于 2012-11-18 15:41 |只看该作者
starwing83 发表于 2012-11-18 15:37
又不是不要你用dofile,只是这货用来做require的活儿始终觉得不正统——对,我就是希望写出来的代码越正统越好。


哦,我恰好没有这样的追求。 有正统的方式完成我的需求,那最好。
没有,但又被我找到合理的方案了,我才不会理会正统不正统什么的。
我说过我怎么用C++的吧?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
45 [报告]
发表于 2012-11-18 15:43 |只看该作者
回复 41# OwnWaterloo


    你喝醉酒了?你看清楚条件行不行?我还刚刚好给高亮过了你还没看见?不是说支持私有模块可笑,也不是说对载入私有模块给错误可笑。是说在一门“连参数数量和变量声明初始值都不会做报错处理”的语言中,“让载入私有模块报错是很可笑的事情,麻烦你看清楚前提,好吗?

顺便回上一个帖子没提到的部分,dofile依然没有解决报错的问题。dofile你自己可以do,但是你依然不会妨碍到别人天真地require,除非你改个扩展名,叫stm/atomic.private好了,你不觉得这样解决问题很自欺欺人么?但是,如果你不改后缀名,人家照样可以require 'stm.atomic',就算你自己dofile了也是这样!

再回一下,对Lua来说repl就不是官方考虑的内容!很多人都考虑过repl,甚至有过好多个实现(我知道的就有四五个)。但这不代表这就必须是官方考虑的内容了。说实话,我根本就没看懂你说的reload是什么含义。但是,不管如何,你到底是在使用Lua,还是站在clojure的制高点上嘲笑Lua?——哦,其实你根本就没用也没打算用Lua,对不对?这和站在路边嘲笑给乞丐扔钱的人有啥区别?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
46 [报告]
发表于 2012-11-18 15:46 |只看该作者
本帖最后由 starwing83 于 2012-11-18 15:52 编辑

回复 43# OwnWaterloo


    除非强制要求debug信息必须存在——就像Python那样——否则你是做不到的。

Python也不是一直存在,Python的spec一直很暧昧,现在都没一个标准化的描述出现。所以说不准哪天你就boom了,很正常的,Python不兼容前面的实现也不是一次两次了——这不是说不兼容不好,是说dofile载入相对路径文件本身对语言来说就是很无理的要求。——你自己的文件结构,凭什么要语言帮你管?如果说编译器让你管,这个我赞同,问题是这货是运行时的啊!

编辑一下,Python本身有个import ..xxxx这样的语法,不知道是怎么实现的,也不知道如果我在buffer里面载入(类似Py_DoBuffer)的话这个执行会怎样,报错还是什么。所以我也不好说什么。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
47 [报告]
发表于 2012-11-18 15:47 |只看该作者
回复 44# OwnWaterloo


    可是我有这样的需求,不好意思。你尊重我的需求么?你的态度和上次我说你的需求无理取闹有何区别?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
48 [报告]
发表于 2012-11-18 15:48 |只看该作者
回复 38# OwnWaterloo


    那些程序本身就跟Lua无关。

想要wildcard?自己用lfs去,Lua本身的确与wildcard无关,这就是事实。

dofile也不支持wildcard的,Lua没有任何一个部分支持wildcard,除非你自己写,这就是事实。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
49 [报告]
发表于 2012-11-18 15:50 |只看该作者
回复 39# OwnWaterloo


    顺便说一下,我完全不知道你这个回帖想说明什么,或者在说明什么。我从来没有见到过你说的这种工作流——在repl里面一点一点敲代码,然后dump到文件里面去?实在没见过。所以更别说你说的reload是什么意思了。完全不理解。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
50 [报告]
发表于 2012-11-18 15:50 |只看该作者
回复 35# starwing83

>>   其实自己设计一套载入机制也没什么太大问题,但这是一种很危险的信号:你在将其他语言的经验放入Lua。为什么不按照Lua的思路来,显式地、平面地去载入模块,不要去载入自己不知道的模块呢?如果你知道某个模块,你载入了他,下个版本他消失了,你难道不能从旧版本拷贝一个,放回来么?谁阻止你这么做了呢?

会有名字冲突吗? 同一个函数做完全不同的事?  是只需要拷贝"一个"吗? 这一个又依赖了哪些? 是不是该全都拷贝过来? 又会产生哪些冲突?
你真觉得从旧版本里拷贝一个是靠谱的方案?


至于前面的各种哲学。。。  各种语言、软件、社区哲学, 都是想表明一点: Oh, this is sad, but it's NOT my fault.
就像大部分java程序员都不会觉得没有first class function是什么损失。 在java的哲学里, closure只是贫穷人的objects。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP