`
庄表伟
  • 浏览: 1145724 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

有关语言设计的一些联想

阅读更多

引发我这些思考的,是最近一篇InfoQ的文章:《语言约束和责任感,我们应该信赖谁?》,还有就是前两天我浅尝即止的scala语言。还有一些长久以来的思考片段。

 

1、以前我说过一句话:“语言是强框架,而框架是弱语言”。当时我提出这个思路的时候,其实还存在这一个误区,也就是认为很多框架级的设计,是可以引入语言层面的。这也就是我在设计DJ这个语言的时候,将许多TDD、DBC、AOP的思想引入语言层面的原因。当时我还举了java的exception的例子,证明将原本的开发中的常见问题,变成一种强制的语法限制,是一种明显的进步。

 

2、但是,现在的我,不再这么极端的赞同语言约束了,原因是我变成了越来越坚定的ruby程序员。在开发的过程中,我有时候不得不使用java的类库,但是,我完全不喜欢用java来调用它们,而是宁可使用jruby来做开发,很重要的一个原因,就是因为ruby不会强制要求我catch exception。

 

3、引申一下,当年我说的话,还是对的,但是要进一步深化:词法的限制、语法的限制、类库的限制、框架的限制、编码约定、编程习惯。是多个不同层次的约束。一层比一层更加弱化。而解决各种不同的问题,需要在不同的层次,来设计约束。如果强行提高约束的“强度”,就会设计出很傲慢的语言或者框架来。

 

4、打个比方,代码缩进是一个很好的编程习惯,但是像python那样,将缩进要求变成语法强制规定,就是过了。

 

5、再打个比方,处理exception是一个良好的编程习惯,但是并非所有的exception都需要处理,java规定, 不处理异常,就不能通过编译,就是过了。

 

6、再说说语法设施的问题,像lisp那样的语言,属于极简主义,几乎全部的语法设施,就是左右圆括号和逗号。而像我们现在习惯的方括号、花括号、冒号、=>、->、::等等则一概没有。这样就会造成lisp的程序阅读非常吃力,满屏的圆括号,让人迅速的就晕掉了。另一方面,我最近在看的scala,则定义了太多的语法设施。在看起来的时候,也很容易眼晕。在这方面,我觉得ruby做到了很好的折中。

 

7、今天看到云风的一篇blog《捣糨糊》,谈的是一个过度设计的问题,C++的程序员,很容易将那些先进的东西,用到简单的事情上,当然,java程序员也是一样。而在我看来,有很多种需求的情况,有些情况非常适合用过程式思维来解决,有些非常适合以OO的方式来思考,有些非常适合以函数式的方式来思考,还有些问题,只要精通正则表达式,就是几行代码的事情。而一个好的语言,就是妥善的,不别扭的支持各种不同的编程思维模式。当然,ruby在这方面,我觉得的确做得很棒。

 

8、前两天gigix发了一篇blog《对象健身操:拒绝else》,还有在InfoQ的几篇文章,似乎还要向if、for宣战。我的看法是:反对if行动: http://tr.im/syd1 反对for行动: http://tr.im/syd7 拒绝else: http://tr.im/sydk //面向对象之“三反五反”?关键字都是基础设置,如何用在程序员自己!好的语言,要支持各种编程思维模式,而好的程序员,则要会善用各种不同的编程思维模式来解决不同领域的问题,面对任何问题,都只会挥舞一把榔头,毕竟是欠缺火候的。

 

9、每一种语言,都有其特殊与特长,好的程序员,耍刀像刀,耍剑像剑。当然,不是说所有的语言都是一样好的,我毕竟还是更喜欢ruby一些。可以拿来像刀一样耍,也可以像剑一样耍,这个感觉很棒。

3
0
分享到:
评论
4 楼 liujunsong 2009-08-12  
语言这东西搞的越来越复杂了.
仔细想来,其实一个语言的复杂程度,和它本身的开发模式是有很大关系的,不要忘了,语言本身也是开发的产物.
如果一门语言是由一个人,或者一个很小很紧密的团队开发的,例如ruby,那么你可以想一想,一个人的大脑里面能放多少东西进去,这样开发出来的东西,几乎必然是足够精简的;
反之,一门语言是由一个大型团队开发的,例如java,里面有无数的架构师,程序员,项目经理,每个人都极力往里面塞点自己的创造进去,最后得到的,几乎必然是一个充斥着文档,根本无法让一个人来理解接受的庞然大物.
3 楼 zozoh 2009-08-03  
不同意第5点:

对于 Java ,语言核心给我们提供了 RuntimeException, 所以只有不好的函数接口设计,但是和 Java 语言本身无关。

对于强制抛出的,如果你设计的一个函数打算返回一个值,对于函数的调用者,这个值通常有两种用法:

  • 作为后续计算的输入
  • 作为后续控制结构的输入(if...else... 等)


但是,还有一种可能,就是即提供后续计算的输入,也提供后续结构的输入。

当然,为了答到这个目的,我们可以声明一个结构,在这个结构里,一个属性用来后续计算,剩下的几个属性可以用来后续的 if....else 输入。 但是 Java 的语言设计者,提供了更通用更优美的方式--Exception

所以在第三种情况下,声明返回值,以及声明抛出的 Exception 难道不是最优美的做法吗?

在这里,我并不是说 java.* 核心类库的类设计的都是那么合理,事实上,说不定很多类和接口函数设计的有点脑残,但是 Java 这门语言本身的 Exception,如果使用得当,还是能让你的程序更加简洁优美滴~~~
2 楼 pipilu 2009-08-02  
第8点很赞同。
看着,感觉不学ruby都是很大的遗憾了。
1 楼 机器人 2009-08-02  
你就是想说ruby用得让你好爽呗。

相关推荐

    基于nlp自然语言识别词云联想.zip

    【标题】:“基于nlp自然语言识别词云联想”是一个大学生课程设计项目,它利用了自然语言处理(NLP)技术来实现词云联想。词云是一种数据可视化方式,通过以不同大小的词语来表示文本数据中的关键词频率,而联想功能...

    联想官网源码java,难得哦

    【压缩包子文件的文件名称列表】中,"java联想(中文).chm" 可能是一个包含Java编程语言与联想官网源码相关教程或文档的Microsoft帮助文件。CHM格式是HTML帮助的压缩版,通常用于存储技术文档。用户可以从中查找API...

    安卓藏文联想输入法

    安卓藏文联想输入法是专为安卓设备设计的一款输入法应用,旨在提供高效、便捷的藏文字输入体验。这款输入法结合了先进的联想技术,能够根据用户输入的前几个字符,预测并显示可能的完整词汇,极大地提高了输入速度和...

    神经网络 联想记忆

    2. 信息检索:在信息检索系统中,BAM可以通过双向联想帮助用户快速找到相关的信息。 3. 自然语言处理:在理解和生成自然语言时,BAM可以捕捉词汇和短语之间的语义关系。 4. 控制系统:BAM可用于设计自适应控制系统,...

    成熟的仿百度和goole的搜索联想提示功能

    6. **多语言支持**:对于全球化的搜索引擎,需要支持多种语言的搜索联想,这就需要处理不同语言的分词规则和语法特性。 7. **性能优化**:由于搜索联想功能需要在短时间内处理大量数据,所以性能优化至关重要。这...

    联想7215打印驱动

    联想7215打印驱动是针对联想品牌的一款打印机型号——联想LJ7215所设计的专用驱动程序。在计算机与打印机之间建立有效通信的过程中,驱动程序扮演着至关重要的角色。它允许操作系统识别和控制硬件设备,确保硬件能够...

    联想输入法

    总的来说,联想输入法的实现涉及了C#语言、WPF框架和动态链接库技术,通过这些技术的综合运用,实现了高效的中文输入体验。开发者需要理解C#的编程基础,熟悉WPF的UI设计,以及掌握如何使用和创建DLL库,才能有效地...

    Lenovo模仿联想官网html+css.zip

    在本项目中,“Lenovo模仿联想官网html+css.zip”是一个包含HTML和CSS文件的压缩包,用于重现联想官方网站的布局和设计。HTML(HyperText Markup Language)是用于创建网页的标准标记语言,而CSS(Cascading Style ...

    联想功能插件

    开发者需要熟练掌握编程语言,如JavaScript、Java或Python,以及相关框架和库,来构建这样的功能。 总的来说,"联想功能插件"涉及的技术包括但不限于数据处理、算法设计、用户行为分析和前端交互设计。通过分析和...

    lenovo联想KS-9271键盘驱动

    联想KS-9271键盘驱动则是专门为这款键盘设计的软件组件,它确保Windows操作系统能够正确地识别和配置键盘,提供完整的按键功能,包括多媒体快捷键等特殊功能。 描述中提到的“支持win10/7”意味着这款驱动程序兼容...

    联想官方蓝色水晶鼠标指针

    本文将深入探讨联想官方蓝色水晶鼠标指针这一主题,旨在提供关于鼠标指针设计、使用和优化的相关知识。 首先,我们来理解鼠标的指针。在计算机操作系统中,鼠标指针是一种图形用户界面元素,它代表了用户的交互焦点...

    联想移动保险箱

    【联想移动保险箱】是一款专为联想移动U盘设计的管理工具,旨在提供安全、便捷的文件存储和管理服务。这款软件集成了多种实用功能,旨在优化用户在U盘上的数据操作体验,确保数据的安全性。 一、核心功能 1. 文件...

    css+html+js联想查询

    这个函数可能涉及到字符串匹配算法,如Trie树、动态规划等,用于快速找出与输入关键词相关的联想词汇。同时,JavaScript还可以用`innerHTML`或`textContent`属性来修改HTML元素的内容,从而实现实时显示查询结果。 ...

    联想服务器SR650(7X06)全套驱动

    联想服务器SR650,型号7X06,是一款专为高效能、高密度计算和存储优化设计的双插槽机架式服务器。它在企业数据中心、云服务提供商以及大型企业环境中都有着广泛的应用。这款服务器的强大性能和可靠性,离不开一套...

    苹果电脑上联想打印机驱动 支持 M7455DNF

    这些驱动程序是设备驱动软件,它们翻译了计算机发送的打印指令,并将它们转化为打印机可以理解的语言,使得打印过程能够正常进行。 2. **M7455DNF打印机**: 联想M7455DNF是一款多功能激光打印机,具备打印、扫描...

    联想品牌手册_大厂VI品牌视觉标准设计规范_企业品牌手册.rar

    除此之外,手册还会涵盖联想的品牌语言和口号的使用规范,以及如何在特定场合下进行品牌延伸设计,如赞助活动、展览展示等。这些都体现了联想对品牌管理和传播的专业性和严谨性。 总的来说,《联想品牌手册》是企业...

    联想笔记本电脑调研报告.doc

    在本次调研活动中,消费者对联想笔记本电脑外观设计比较满意,但有部分顾客对联想 笔记本的外观设计提出了有些的看法,比如在设计和色彩方面提出力求更新,突出其个 性的建议等。 消费者主要是通过商业广告及他人...

    联想扫描仪驱动

    【联想扫描仪驱动】是专为联想7600B扫描仪设计的一款驱动程序,它在早期的计算机环境中被广泛使用。驱动程序是连接硬件设备和操作系统之间的重要桥梁,负责解释和执行硬件设备的指令,使得操作系统能够识别并有效地...

    联想m7400驱动64位

    2. brtwddan.dl_:这个文件名可能与打印机的无线功能有关,"ddan"可能是“driver for Danish”(丹麦语驱动)的缩写,表明这是一个支持多语言的驱动组件。 3. LESM7450F_0804.DSI:DSI(Device Specific Information...

    旧版本智慧联想浏览器5.0.zip

    【智慧联想浏览器5.0】是一款专为联想用户设计的早期浏览器版本,相较于其后续的6.0版本,它保留了一些独特的特性和功能。这款浏览器以其便捷性、易用性和定制化服务在用户中获得了良好的口碑。以下是关于这款浏览器...

Global site tag (gtag.js) - Google Analytics