﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-hex108-随笔分类-Read the book</title><link>http://www.cppblog.com/hex108/category/14215.html</link><description>懂历史 ==&gt; 知未来
</description><language>zh-cn</language><lastBuildDate>Fri, 22 Jul 2011 17:10:22 GMT</lastBuildDate><pubDate>Fri, 22 Jul 2011 17:10:22 GMT</pubDate><ttl>60</ttl><item><title>读&lt;编程珠玑&gt;，不要忘了还有这本经典</title><link>http://www.cppblog.com/hex108/archive/2011/07/07/150403.html</link><dc:creator>hex108</dc:creator><author>hex108</author><pubDate>Thu, 07 Jul 2011 12:47:00 GMT</pubDate><guid>http://www.cppblog.com/hex108/archive/2011/07/07/150403.html</guid><wfw:comment>http://www.cppblog.com/hex108/comments/150403.html</wfw:comment><comments>http://www.cppblog.com/hex108/archive/2011/07/07/150403.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/hex108/comments/commentRss/150403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/hex108/services/trackbacks/150403.html</trackback:ping><description><![CDATA[<div>&nbsp;&nbsp;&nbsp;&nbsp; 读的过程真是一种享受。看到好的代码，好的思想，总会忍不住默记几遍。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 看到觉得有点意味的地方最好多想想来龙去脉，想想为什么，因为紧接着的会是令人惊喜的解说。 多写写书上的代码，感觉不错（写完以后感觉忘了很久的算法又重新回来了）。 每章的&#8220;原理&#8221;部分是高度性的概括，"习题"是很好的，促使你去思考，做习题是很有必要的，不想&#8220;浪费&#8221;时间去&#8220;做习题&#8221;了的结果可能是以后会用更多的时间才能想清这些问题，还有不要只想着看答案，你会很失望，因为有些题目是没有答案的 :)&nbsp; ps：有很多面试题来自其中的习题<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 对一些算法有了更好的理解，也许是看第二遍的原因，也许是从不同的角度看会有不同的效果（<span>所以</span><span style="color: red;">好书要多读，每重读一次会有新的收获</span>）。比如：在动态规划算法里，程序可以用递归算法和用表格化方法实现。递归算法的缺点是：有部分值会被重算，解决方法是用一个数组把已经计算过的值存起来，这样就不会重复计算了。表格化的算法是：没有递归算法好理解，解决办法是：在代码开头加个注释，注释就是那几条递归规则，大不了再加上说明&#8220;此代码用的是动态规划&#8221;。 ps：linux里diff的基本算法就是动态规划吧，感觉和最长公共子串类似，自己实现了一个(<a href="https://github.com/hex108/alogrithm/blob/master/diff.pl" title="diff.pl">diff.pl</a>)(更新：今天在网上看到了关于diff用动态规划实现的信息：<a title="Dynamic programming  Creative Exercises 2  Unix diff" href="http://introcs.cs.princeton.edu/java/96optimization/">Dynamic programming  Creative Exercises 2  Unix diff</a>, 其源码为<a title="diff.java" href="http://introcs.cs.princeton.edu/java/96optimization/Diff.java.html">diff.java</a> ，比我的好了N多倍，打印结果的那段代码的思想相当好！代码简洁清淅。另外，我开始觉得用表格化的方法实现动态规划更帅了。&nbsp; －－2011.7.22 )。<br /><br />&nbsp;&nbsp;&nbsp; 读这本书收获很多，列举几个吧：<br />&nbsp;&nbsp;&nbsp; 1. 书里的&#8220;<a href="http://www.cppblog.com/hex108/archive/2011/06/18/148907.html" title="程序验证">程序验证</a>&#8221; 技术很靠谱，让程序看起来清晰易懂，还能从一定程度保证正确性。<br />&nbsp;&nbsp;&nbsp; 2. &#8220;哨兵&#8221;(<a href="http://en.wikipedia.org/wiki/Sentinel_value" title="Sentinel value">Sentinel value</a> )被几次用到了，感觉还不错，代码看起来更简单了，还能带来一点小小效率。<br />&nbsp;&nbsp;&nbsp; 3. 时空折中与双赢。在原始设计的算法并非最佳方案时，通过改善算法是可以达到双赢的。<br />&nbsp;&nbsp;&nbsp; 4. 用只分配一个较大内存块的方案来替换通用内存分配，这样就消除了很多 开销较大的调用，而且也使用空间的利用更加有效。<br />&nbsp;&nbsp;&nbsp; 5. 数学模型的建立是很重要的。把数a想成用集合[a,a + 1)表示是第9章中二分查找代码调优的核心思想。数组旋转那个算法也实在是太nb了。<br />&nbsp;&nbsp;&nbsp; 6. 一个写得很好的代码，在几个地方看到过，总会忘，这次记下：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #000000; ">&nbsp; 链表里有一个哨兵元素，初始时:&nbsp;head&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;sentinel&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Node(value,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;向链表插入元素： <br />&nbsp;&nbsp;insert(v)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">head;&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p)</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">val&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;t;&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">((</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p)</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp; (</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p)</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">val&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;v&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000; ">*</span><span style="color: #000000; ">p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;node(v,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">p)<br /><br />&nbsp; 下面是我写的：<br />&nbsp;&nbsp;insert(v)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;head;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(p</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">val&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;t)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">next<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(p</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">&nbsp;val&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;v)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;node(t,p)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(p&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;head)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;q;</span></div><br />&nbsp;&nbsp;&nbsp; 另外，注意到一本书＜<a href="http://book.douban.com/subject/1968704/" title="算法设计与分析基础">算法设计与分析基础</a>＞ ，用不同的方式讲算法，把算法按其通用程度提出了4个最基本的算法思想：Brute force ， Divide &amp; conquer ， Decrease &amp; conquer，&nbsp; Transform &amp; conquer。 <br /><br />&nbsp;&nbsp;&nbsp; 最后摘录一下 第1版跋 里给的几个建议:<br />&nbsp;&nbsp;&nbsp; 1. 解决正确的问题。 首先彻底理解问题<br />&nbsp;&nbsp;&nbsp; 2. 探索所有可能的解决方案<br />&nbsp;&nbsp;&nbsp; 3. 观察数据<br />&nbsp;&nbsp;&nbsp; 4. 使用粗略估算<br />&nbsp;&nbsp;&nbsp; 5. 得用对称性 <br />&nbsp;&nbsp;&nbsp; 6. 利用组件做设计 &nbsp;<br />&nbsp;&nbsp;&nbsp; 7. 建立原型 <br />&nbsp;&nbsp;&nbsp; 8. 必要时进行权衡 &nbsp;<br />&nbsp;&nbsp;&nbsp; 9. 保持简单 &nbsp;<br />&nbsp;&nbsp;&nbsp; 10.追求优美</div><img src ="http://www.cppblog.com/hex108/aggbug/150403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hex108/" target="_blank">hex108</a> 2011-07-07 20:47 <a href="http://www.cppblog.com/hex108/archive/2011/07/07/150403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>写作《程序员修炼之道》的方式很有意思</title><link>http://www.cppblog.com/hex108/archive/2010/08/13/123369.html</link><dc:creator>hex108</dc:creator><author>hex108</author><pubDate>Fri, 13 Aug 2010 12:34:00 GMT</pubDate><guid>http://www.cppblog.com/hex108/archive/2010/08/13/123369.html</guid><wfw:comment>http://www.cppblog.com/hex108/comments/123369.html</wfw:comment><comments>http://www.cppblog.com/hex108/archive/2010/08/13/123369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/hex108/comments/commentRss/123369.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/hex108/services/trackbacks/123369.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; &nbsp;&nbsp; <a title="这里" href="http://www.infoq.com/cn/presentations/dt-pragmatic-programmer">这里</a>有作者之一Dave Thomas在敏捷2009大会上关于此书的演讲(http://www.infoq.com/cn/presentations/dt-pragmatic-programmer)<br><br>&nbsp;&nbsp; &nbsp;&nbsp; 这本书的成书方式很有意思。作者非常喜欢program，以至于将这本书的写作当成了软件工程，全书用plain text写成，以soruce code(应 该是他们自己发明的领域语言DSL~)的方式组织而成，用他们自己写成的工具build一下后就成了此书，相信他们也以某种版本管理工具对此进行了管理(方便查看版本之间的变化等)，并对书中的code进行了单元测试。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 想像一下他们怎么写书的(借用HTML的格式猜想一下):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Title</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">程序员修炼之道</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">Title</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Body</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shell游戏<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Code</span><span style="color: #000000;">&gt;/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">Dave</span><span style="color: #000000;">/</span><span style="color: #000000;">game.sh</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">Code</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">Body</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;</span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Test时会自动测试书中的程序，如：game.sh；Build之后本书便完成了（书中的code文件会自动读入）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这真是一个很成功的&#8220;项目&#8221;：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * <span style="color: red;">Automate Everything</span>.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果需要，则设计自己的小语言<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Perl有一个作解释器的包<a title="http://search.cpan.org/~dconway/Parse-RecDescent-1.965001/lib/Parse/RecDescent.pm" href="http://search.cpan.org/~dconway/Parse-RecDescent-1.965001/lib/Parse/RecDescent.pm">http://search.cpan.org/~dconway/Parse-RecDescent-1.965001/lib/Parse/RecDescent.pm</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Fix Broken Windows<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --Fix small thing,Then big thing will not happen.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * <span style="color: red;">Don't repeat yourself</span>(DRY)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- code duplication<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决方法: 做成函数，模块，类；采用code generators；采用元程序设计(The art of metaprogramming:<a title="http://www.ibm.com/developerworks/linux/library/l-metaprog1.html" href="http://www.ibm.com/developerworks/linux/library/l-metaprog1.html">http://www.ibm.com /developerworks/linux/library/l-metaprog1.html</a>)；采用设计模式(作者觉得采用模式有可能把问题弄复杂)；convertions；metaphors；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Project Duplication<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fix by producing procduts; Fix with data-driven designs.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Do one thing better.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单，低耦合。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Do Nothing Twice.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 代码之前，测试先行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 选择好的编码工具能有效地提高效率，避免编码中的小错误。<br>&nbsp;<br>     <img src ="http://www.cppblog.com/hex108/aggbug/123369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hex108/" target="_blank">hex108</a> 2010-08-13 20:34 <a href="http://www.cppblog.com/hex108/archive/2010/08/13/123369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>卓有成效的程序员</title><link>http://www.cppblog.com/hex108/archive/2010/07/10/119954.html</link><dc:creator>hex108</dc:creator><author>hex108</author><pubDate>Sat, 10 Jul 2010 04:40:00 GMT</pubDate><guid>http://www.cppblog.com/hex108/archive/2010/07/10/119954.html</guid><wfw:comment>http://www.cppblog.com/hex108/comments/119954.html</wfw:comment><comments>http://www.cppblog.com/hex108/archive/2010/07/10/119954.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/hex108/comments/commentRss/119954.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/hex108/services/trackbacks/119954.html</trackback:ping><description><![CDATA[<span style="font-weight: bold;">自动化法则</span><br><br>&nbsp;&nbsp;&nbsp; 计算机原本就该从事简单重复的工作。只要把任务指派给它们，它们就可以一遍又一遍毫不走样地重复执行，而且速度很快。但却经常看见一种奇怪的现象：人们在计算机上手工做一些简单重复的工作，计算机则在大半夜里扎堆闲聊取笑这些可怜的用户。<br><br>&nbsp;&nbsp;&nbsp; 我们应该利用作为程序员的优势，看到普通用户无法看到的东西，培养larry所说的&#8220;懒惰，急躁和傲慢&#8221;让计算机高效地为我们工作：命令行是如此地高效，脚本是如此地方便，衔接两个小工具能达到如此神奇的效果。。。<br><br><span style="font-weight: bold;">古代哲人</span><br><br>1. 亚里斯多德的&#8220;事物本质性质和附属性质&#8221;理论：致力本质复杂性，去除附属复杂性。你现在想解决问题A,在解决A的问题中遇到了问题B,接着你去解决问题B，戏剧性的是你遇到了很多接二连三的问题C,D,E，或者在很多年后，程序才出现问题C,D,E，可是你的最初问题是A，不是吗？B,C,D等等都是附属性质，当这些附属性质越来越多，越来越复杂的时候，也是开始思考另一个解决A的办法的时候了。(如果作为学习，可以试着去解决那些附属性质)<br><br>2. 笛米特法则：任何一个对象或者方法，它应该只能调用下列对象：该对象本身，作为参数传递进来的对象，在方法内创建的对象。这么做的主要目的是信息隐藏,同时使类的耦合更加松散。<br><br>3. &#8220;古老&#8221;的软件传说。了解历史才能更好地创造历史。读读那些&#8220;古老&#8221;的&#8220;宝典&#8221;（如《程序员修炼之道》《人月神话》《Smalltalk Best Practice Patterns》），会学到很多有用的东西，或许你会发出一生惊叹。&#8220;当你的老板要求你使用一个低质量的代码库时，不需要在崩溃中咬牙切齿，告诉他：你正&#8220;站在侏儒的肩膀&#8221;上的陷阱中，然后他就会明白不仅仅只有你才觉得那是个坏主意。&#8221;<br><br><span style="font-weight: bold;">拥抱多语言编程</span><br><br>&nbsp;&nbsp; &#8220;每个语言都有自己擅长的地方&#8221;（我的想法）。比如perl特别适合文本处理，用来处理网页也很好（毕竟有些从服务器上返回的数据就是用perl返回的，所以用perl也会比较合适）。<br><br>&nbsp;&nbsp;&nbsp; 计算机语言就像鲨鱼，要是保持静止就会死。<br><br>&nbsp;&nbsp;&nbsp; Java的创造都们实际上创造了两样东西：Java语言和Java平台。后者就是我们摆脱历史包袱的途径（Java语言的特性包含了一些它本该可以忽略的东西，如Java程序初始化的顺序和从0开始的数组）。读到本文我才开始理解平台的深刻意义。<br><br>&nbsp;&nbsp;&nbsp; 举两个例子（Groovy和Jaskell）说明。<br><br>&nbsp;&nbsp;&nbsp; <a title="Groovy" href="http://en.wikipedia.org/wiki/Groovy_%28programming_language%29">Groovy</a>是一种开源的编程语言，它给Java带来了动态语言的语法和功能，它会生成Java字节码，因此可以在Java平台上运行。在Java之后十多年里浮现出来的各种语言很大程序上影响着Groovy的语法：Groovy支持装饰，较松散的类型系统，&#8220;理解&#8221;迭代的集合，以及很多现代编程语言的改进特性。而且它可以编译成纯正的Java字节码。用Groovy写成的代码简洁且并不比用Java写的代码效率低多少，而且能充分借用Java平台的优势。<br><br>&nbsp;&nbsp;&nbsp; <a title="Jaskell" href="http://jaskell.codehaus.org/">Jaskell</a>是运行在Java平台上的Haskell版本。Jaskell拥有函数式程序设计语言的优势：函数不改变外界的状态，纯粹的函数式语言压根没有&#8220;变量&#8221;概念；函数式语言对多线程的支持比命令式语言要强得多，用函数式语言更容易写出强壮的线程安全的代码，对并发支持也比较好（我想这是Erlang流行的原因）。同时Jaskell也能借用Java平台的优势。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; Java平台借用这些多语言特性，一定会走得更好，走得更远。不过，在带来好处的同时，也带来了一个问题：多语言应用程序更难高度，解决这个问题最简单的办法也跟现在一样：靠严格的单元测试来避免在调试器上浪费时间。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red;"> 多语言开发风格会把我们带向领域特定语言(Domain-specific Language,DSL)。我们会以一些专门的语言为基础，创造出非常有针对性的，非常专注某一问题域的DSL。</span>抱定一种通用语言不放的年代就快结束了，我们正在进入一个专业细分的新时代。大学时代的Haskell教材还在书架顶上蒙尘吗？该给它掸掸灰了。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; ps: 我们也可以以C++为基础，来创造一种DSL，思考。<br><br><br><br><span style="font-weight: bold;">链接：</span> <a title="卓有成效的程序员" href="http://book.douban.com/subject/3558788/">卓有成效的程序员</a><br>
<h1><br></h1>
<br><br>  <img src ="http://www.cppblog.com/hex108/aggbug/119954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/hex108/" target="_blank">hex108</a> 2010-07-10 12:40 <a href="http://www.cppblog.com/hex108/archive/2010/07/10/119954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>