`
庄表伟
  • 浏览: 1136549 次
  • 性别: 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自然语言识别词云联想.zip 大学生课程设计 基于python的课程设计 自己大二写的课程设计

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

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

    java联想(中文)

    写在前面的话 引言 1. 前提 2. Java的学习 3. 目标 4. 联机文档 5. 章节 6. 练习 7. 多媒体CD-ROM 8. 源代码 ...13. 封面设计 ...1.12 分析和设计 ...7.8 通过继承进行设计 ...附录E 关于垃圾收集的一些话 附录F 推荐读物

    管理信息系统的系统设计.doc

    计算机处理过程设计 输出设计、输入设计、处理流程图设计及编写程序设计说明书 1.3 系统设计的原则 系统性 系统的代码要统一,设计规范要标准,传递语言要尽可能一致,对系统的数据采集要 做到数出一处、全局共享,...

    计算机专业毕业设计答辩PPT模板.pptx

    系统环境的配置 系统运行平台:Tomcat5.0 + JDK1.6 + Windows XP 开发语言:JSP 数据库:SQL 2000(server pack 3) 开发环境: Eclipse 其他软件: DreamweaverMX2004,PhotoShop7.0 2023/5/24 计算机专业毕业设计答辩...

    adl:adl,又名体系结构描述语言,是一种轻量级体系结构,如代码语言。架构描述语言

    架构描述语言去做: 常见的架构模式 在svg中 adl工作流程设计 协作风格 核心驱动风格 物理设计 联想模式 代码中的设计模式 ADL可视化 网页执照@ 2021该代码在MIT许可下分发。 请参阅此目录中的LICENSE 。

    毕设&课设&项目&竞赛-基于STM32与HAL库的移植性很高的LoRa驱动。用的是安信可官方的demo改的。非联想驱动。.zip

    软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...

    曹建芳C程序数字资源分类汇总-陈立潮-C语言程序设计教程.zip

    【曹建芳】C程序数字资源分类汇总-陈立潮-C语言程序设计教程.zip C 语言包含的数据类型如下图所示: 一、数据类型与“模子” short、int、long、char、float、double 这六个关键字代表C 语言里的六种基本数据类型。 ...

    VR场景设计:动画场景的功能.docx

    目前场景设计表现手法越来越丰富生动,除满足角色表演的需要外,更强调现代视觉审美和镜头语言的处理。 一、交代时空关系 动画场景设计在塑造客观空间的同时承载着表现社会空间、心理空间的任务。它与动画角色之间是...

    关于人工智能的一些介绍与看法.docx

    它研究和应用的领域包括模式识别、自然语言理解与生成、专家系统、自动程序设计、定理证明、联想与思维的机理、数据智能检索等。除了计算机科学以外, 人工智能还涉及信息论、控制论、自动化、仿生学、生物学、心理学...

    Effective JavaScript

    由于其语法让人联想到Java,并且具有许多脚本语言的共同特性(如函数、数组、字典和正则表达式),因此,具有少量编程经验的人也能够快速学习JavaScript。新手程序员几乎不需要培训就可以开始编写程序,这要归功于...

    重构-改善既有代码的设计 中文版

    1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 2.2 为何重构 2.3 何时重构 2.4 怎么对经理说 2.5 重构的难题 2.6 重构与设计 2.7 重构与性能 2.8 重构起源何处 第3章 代码的坏味道 ...

    论文研究-维吾尔文智能输入法词库结构的研究与应用.pdf

    设计了一个高效的维吾尔语智能输入法的词库模型,这种词库模型的构建方法不但解决了维吾尔单词词库中锯齿形数据的高效压缩存储,而且有利于维吾尔语智能输入法语言模型的建立,实现了维吾尔语智能词组联想功能,...

    浅谈谷歌全新设计理念Materialdesign

    在今年的谷歌I/O开发者大会上,谷歌设计部门副总裁马提亚斯·杜亚特向世界各地的开发者们展示了其全新的设计语言MaterialDesign。这个设计在Android5.0中首次亮相。率先搭载Lollipop的设备分别是Nexus6智能手机和...

    Verilog时序篇(源程序+学习文档)

    再也不是:了解Verilog HDL 语言相关的语法如何使用?如何使用Verilog HDL 语言建 立一个模块?等这些Verilog HDL 语言“外观的单纯工作”,而是“深入分析”模块执 行时的“内部细节”。关于模块一切的一切过程,...

    最佳跨平台在线评委在线评委内核虚拟评委适配器竞赛收集命令行界面Telnet服务器/clinetFTP服务器/客户端

    最佳跨平台在线评委,在线评委内核,虚拟评委适配器,竞赛收集,...Online Judge Kernel支持命令行管理,命令行特性支持命令联想、自动补全等功能,极大方便了系统的管理。(这是我们的特色)Online Judge Kernel支持

    Visual C++ 数据库系统开发完全手册.part2

    第2章 C++语言基础 2.1 C++概述 2.1.1 C++主要特点 2.1.2 利用Visual C++编制C++程序 2.2 C++程序的组成 2.2.1 标识符 2.2.2 关键字 2.2.3 常量与变量 2.2.4 基本运算符 2.3 C++数据类型 2.3.1 基本数据类型 2.3.2 ...

    Visual C++ 数据库系统开发完全手册.part1

    第2章 C++语言基础 2.1 C++概述 2.1.1 C++主要特点 2.1.2 利用Visual C++编制C++程序 2.2 C++程序的组成 2.2.1 标识符 2.2.2 关键字 2.2.3 常量与变量 2.2.4 基本运算符 2.3 C++数据类型 2.3.1 基本数据类型 2.3.2 ...

    挖掘在线评论文本以探索品牌定位:情感和心理品牌联想-研究论文

    设计/方法/方法-从化妆品的在线零售商那里收集了62496条在线评论,这些评论属于“腮红”产品类别的44个品牌。 基于词典的工具语言查询和字数统计(LIWC)用于进行文本挖掘分析。 总共选择了26个文本变量作为品牌...

Global site tag (gtag.js) - Google Analytics