免费注册 查看新帖 |

Chinaunix

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

命名难,难于上青天 [复制链接]

论坛徽章:
0
111 [报告]
发表于 2012-02-13 22:57 |只看该作者
和和,有意思

论坛徽章:
0
112 [报告]
发表于 2012-02-14 00:29 |只看该作者
回复 99# 三月廿七


    abi是应用二进制接口,就是二进制兼容。主要和调用约定,对象布局等有关(地址偏移)。

qt是开源的,其实现也大量用private来实现隐藏,但是qt大量在堆上创建对象,然后通过栈上指针来访问,我估计abi就是一个很重要的顾虑,还有就是节省有线的栈空间。但是指针来操作任然不能避免对象布局改变而破坏abi的问题。

论坛徽章:
0
113 [报告]
发表于 2012-02-14 00:32 |只看该作者
回复 104# OwnWaterloo


    太麻烦。不知道你研究过qt的折中没有,qt有什么高招在这个问题上?

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

我也觉得很麻烦。有时候浪费就浪费了,程序员的时间也很重要。

没研究qt,太庞大了。
有种说法是,当项目有一定规模之后,就一定会实现一个憋足的lisp。
qt一些地方已经脱离静态类型语言的范畴了。

论坛徽章:
0
115 [报告]
发表于 2012-02-14 01:44 |只看该作者
回复 114# OwnWaterloo


    lisp 漂亮是漂亮,可是其递归导向思维大多数人都无法接受,因为该语言需要维护太多的‘记忆栈’,导致代码更难懂。
qt还是不错的,尽管很多人批评,但是程序能写到这个分上,也不容易

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

首先,lisp本身与递归没有严格的关系。
emacs lisp与common lisp程序员/书籍等等就不怎么强调递归。common lisp连goto都有。
scheme比较强调这个,但也不是强制性的。

其实就算是clojure甚至haskell也是有方法写命令式的代码。


其次,没觉得需要什么思考栈。
有一些递归在命令式与不强调无副作用的语言中都一样:

  1. void traverse(node* node, F visit) {
  2.       if (!node) return;
  3.       visit(node);
  4.       traverse(node->left);
  5.       traverse(node->right);
  6. }

  7. (define traverse (node visit)
  8.   (unless (node-nil? node)
  9.     (visit node)
  10.     (traverse (node-left node))
  11.     (traverse (node-right node)) ) )
复制代码
语意完全相同。

对于(无论是否是因为语言强调无副作用)将循环写成递归的情况。
一开始,我是在C++中使用模板元编程时由于语言强制,确实会不习惯。
习惯之后两者其实是一回事。


最后,lisp是一门可被编程的语言。
许多语言都通过增加新的syntax/feature以增强语言的表达能力。
而lisp基本上主要使用(function arg...)这一种syntax,而通过宏来扩充其语意。
虽然这只是越来越多的syntax/feature vs 越来越多的macro, 但是syntax是不可编程的,而许多feature设计时也没考虑到可编程的问题。
以前在C++中遇到许多没法很好解决的问题,在lisp中根本就不是问题。
终于等来了C++11,可以解决一些问题了,但又要等C++11的实现支持; 而lisp早就可以自己动手做了。

只要适应了lisp的思维,好的lisp程序不会比好的C++程序员或者好的Python更难懂。

论坛徽章:
0
117 [报告]
发表于 2012-02-14 15:23 |只看该作者
回复 116# OwnWaterloo


    呵呵,如果说'习惯了',那我觉得任何工具都顺手,因为目前所有编码语言都是图灵等价的,没有什么区别。但是lisp的s表达式形式的语法我个人觉得很难被大多数人接收,再加上无穷无尽的反括号,即便有编辑器的括号匹配以及配对提示,任然很不人性化。而且lisp的后缀语法形式远远没有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
118 [报告]
发表于 2012-02-14 17:13 |只看该作者
本帖最后由 starwing83 于 2012-02-14 17:16 编辑
OwnWaterloo 发表于 2012-02-14 01:23
有种说法是,当项目有一定规模之后,就一定会实现一个憋足的lisp。


我觉得这话很扯淡。

什么是lisp?一个表,定义术语“应用”为应用表的每一项,具体为:
  - 对表,应用这个表的每一项,并在字典查找第一项应用后的结果,并传递后续的项,应用查找后的结果
  - 对其他,应用就是返回本身。

最终结果是一次深度优先遍历,所有键依序被查找对应操作,然后执行。操作可以是表(按“应用”执行),也可以是C函数。

这就是lisp。而大多数的程序都是需要表的,需要根据表的某个特征(至少是个type吧?)做点什么事的,肯定是需要switch-case的,如果这就叫“实现一个lisp”,那你怎么不说任何一个编程语言都肯定用到了if这么无聊的话呢?

lisp最关键的不是lisp这种固有结构,而是这种递归定义的固有结构导致的“自己可以操作自己”这种“递归定义”的能力,也可以认为叫做“可编程的编程语言”吧,而大多数真正实用的项目,特别地,Qt,是不允许对其自身可编程的,你甚至可以看做它提供了一堆字典里面可以被调用的函数(即可以认为他们是可以被绑定给lisp用的),但是你真没法说它实现了一个lisp。

不得不说,这种说法和“一切都是OO”一样拙劣。

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

是否习惯?编程,以及几乎所有工作,都是需要先接受一定的训练才能开始的。
工具、语言,出于可实践的目的,也会顺应一些"主流"的东西,尽量向它们靠拢,减少这个训练的过程。
但结果就是越是缺少了习惯、受训练的过程,越难体会新的东西。



是否符合思维习惯?是一个先入为主的问题。
对没学过任何编程语言的人来说,任何编程语言都是不符合思维习惯的 —— 这时候根本就没有思维。
说lisp不符合思维习惯,是因为已经有一个"习惯了"的思维先入为主,因为lisp与它相差太大,所以不习惯。

据说某些米国大学是以scheme作为教学语言.
又据说只有前2个月(8周)或者前2周,或者前2节课 —— 具体数值我不知道 —— 是讲语言本身。
有其他语言能在如此短的时间内让人学会编程么?
据说后来有些换成了python,下面会说python。



最后,关于复杂性与收获。
以前sw提到,无论某个概念多么复杂,只要它能提供相应的回报,那就值得学习。而许多语言都没做好复杂性与回报之间的平衡。

回到上面的python。
要说一张白纸学编程,我觉得scheme与python是同级的。
退一步,假设python真的比scheme容易,也不会容易太多。
但scheme那2月/周/日就可以把语言学"完",而python用相同的时间只是"入门",达到可以用来教学的目的了而已。
python,以及许多语言的特性都是"发散"的,东一个西一个。
没想过、或者语言设计者没这个水平让语言提供"收敛"的特性,让语言保持简单的同时又不丧失表达能力,比如lua。
lua >> python的嘈可以让sw来吐……

再比如C++。
描述运行时计算的是一套东西,如函数;而描述编译时计算的又是另一套完全不同的东西,模板。
constexpr试图融合一部分,但肯定不能解决所有模板可以解决的问题。
BS在D&E里提到他想引入ada那样的模板时,被问起应该如何实现。他回答说,可以用宏。事后他认为当时提出了一个正确的问题,却给了一个错误的答案。
但也许那才是正确的答案。可惜BS不会lisp,否则我认为C++会比现在更简单,至少不需要两套截然不同的机制去描述运算。

总而言之,学习lisp的复杂性满打满算也只能算是中等偏下水平。对已有编程经验的人需要将自己当作一张白纸重新去学习。
而且学会了之后会发现其实语言核心真的很小,但其表达能力是顶级的。

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

把我的话看完好吗…… "qt某些部分已经脱离静态类型语言的范畴了"。

那句话应该有一些背景,比如当时还没有这么多如lua/python一样的语言,更流行的是静态类型的、不怎么灵活的语言。
也不流行嵌入,或者说那时候根本就没有语言可以嵌入。


那么,很可能就需要动态类型检测来提供灵活性 —— 如qt那样。
这就是在模仿lisp了,因为lisp是第一门提供动态类型检测的高级语言。

很可能需要摆脱手工内存管理的繁琐 —— qt貌似也有一些这样的机制。
那这又是在模仿lisp了,因为lisp是第一门提供gc的高级语言。

很可能需嵌入的东西能够执行一些逻辑,而不仅仅是加载数据 —— 也许qt没这个能力,这我就不清楚了。
这还是在模仿lisp,因为lisp是第一门提供if then else+recursion=turing completeness的高级语言。
比lisp更早的fortran,在lisp之前只提供了类似cmp,jmp的非结构化机制。

而且都模仿得很别扭,所以那句话没有说实现了一个lisp,而是实现了一个憋足的lisp。
原话是这样:
http://en.wikipedia.org/wiki/Greenspun's_tenth_rule
Greenspun's tenth rule
Any sufficiently complicated C or Fortran program contains an ad hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.

连对其自身可编程都做不到,不正好说明它是ad hoc吗?


看见上面这么多"lisp是第一门...的高级语言"吗?lisp发明了这些东西,说其他的是模仿,借鉴有什么不对的?
而OO,如同xml一样,不过是重发明而已,能和lisp比吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP