<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>bigpanda</title>
    <description></description>
    <link>http://bigpanda.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>中国大陆高考创意答案</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/209051" style="color:red;">http://bigpanda.javaeye.com/blog/209051</a>&nbsp;
          发表时间: 2008年06月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天在海外某个网站看到的，笑死了，和大家分享分享。<br /><br />高考完后又是中考，考题千奇百怪，答卷也五花八门。真佩服现在的学生啊，思维跳脱，天马行空，和我们那时候的循规蹈矩，差别太大了！看一组语文试卷中的填空题吧——<br /><br />1，＿＿＿＿＿，为伊消得人憔悴<br /><br />同学答：宽衣解带终不悔<br /><br />（正解为“衣带渐宽终不悔”，偶承认这个是思想有问题）<br /><br />2，问渠哪得清如许，＿＿＿＿＿<br /><br />同学答：心中自有清泉在<br /><br />（正解为“唯有源头活水来”，咱还是和水粘了点边）<br /><br />3，何当共剪西窗烛，＿＿＿＿＿<br /><br />同学答：夫妻对坐到天明<br /><br />（语文老师阅卷时笑晕，后在课堂时说此事，又晕！正解为“却话巴山夜雨时”）<br /><br />4，蚍蜉撼大树，＿＿＿＿＿<br /><br />同学答：一动也不动<br /><br />（正解为“可笑不自量”，一动也不动，赫赫，很符合事实阿）<br /><br />5，君子成人之美，＿＿＿＿＿<br /><br />同学答：小人夺人所爱<br /><br />（直接晕死）<br /><br />6，穷则独善其身，＿＿＿＿＿<br /><br />同学答：富则妻妾成群<br /><br />　（正解：达则兼济天下）<br /><br />7，＿＿＿＿＿，天下谁人不识君<br /><br />同学答：只要貌似萨达姆<br /><br />8，后宫佳丽三千人，＿＿＿＿＿<br /><br />同学答：铁棒也会磨成针<br /><br />（正解为“三千宠爱在一身”）<br /><br />9，身有彩凤双飞翼，＿＿＿＿＿<br /><br />同学答：拔毛凤凰不如鸡<br /><br />还有个同学答：夫妻双双把家还<br /><br />（正解为“心有灵犀一点通”）<br /><br />10，东边日出西边雨，＿＿＿＿＿<br /><br />同学答：床头打架床尾合<br /><br />还有个同学答：上错花轿嫁对郎<br /><br />11，＿＿＿＿＿，糟糠之妻不下堂<br /><br />同学答：结发之夫不上床<br /><br />（语文老师暴怒！）<br /><br />12，但愿人长久，＿＿＿＿＿<br /><br />同学答：一颗永流传<br /><br />（当时狂笑，现在觉得挺经典的，正解为“千里共婵娟”）<br /><br />13，西塞山前白鹭飞，＿＿＿＿＿<br /><br />同学答：东村河边爬乌龟<br /><br />（对的挺工整的）<br /><br />14，我劝天公重抖擞，＿＿＿＿＿<br /><br />同学答：天公对我吼三吼<br /><br />（正解为“不拘一格降人才”，龚自珍）<br /><br />15，天生我才必有用，＿＿＿＿＿<br /><br />同学答：关键时刻显神通<br /><br />又有同学答：老鼠儿子会打洞<br /><br />（办公室的语文老师集体毫无形象的狂笑）<br /><br />16，天若有情天亦老，＿＿＿＿＿<br /><br />同学答：人不风流枉少年！<br /><br />（正解为“月若无恨月长圆”李贺《金铜仙人辞汉歌》　）<br /><br />17，洛阳亲友如相问，＿＿＿＿＿<br /><br />同学答：请你不要告诉他<br /><br />（正解为“一片冰心在玉壶”）<br /><br />18，期末考试出对联，上联是：英雄宝刀未老<br /><br />初三同学对下联为：老娘丰韵尤存<br /><br />19，良药苦口利于病，＿＿＿＿＿<br /><br />同学答：不吃才是大傻瓜<br /><br />人生自古谁无死，＿＿＿＿＿<br /><br />同学答：只是死的有先后<br /><br />（结局：家长会后被老师留下来训话……）<br /><br />20，床前明月光，＿＿＿＿＿<br /><br />同学答：李白睡得香<br /><br />21，管中窥豹，＿＿＿＿＿<br /><br />同学答：吓我一跳<br /><br />（哈哈哈！正解为“可见一斑”）<br /><br />22，＿＿＿＿＿，飞入寻常百姓家<br /><br />同学答：康佳彩霸电视机<br /><br />23，葡萄美酒夜光杯，＿＿＿＿＿<br /><br />同学答：金钱美人一大堆<br /><br />24，＿＿＿＿＿，路上行人欲断魂<br /><br />初一学生的杰作：半夜三更鬼敲门<br /><br />25，老吾老以及人之老，＿＿＿＿＿<br /><br />同学答：妻吾妻以及人之妻<br /><br />（老师后来评卷时说那个同学特别具有奉献精神，哈哈）<br /><br />26，想当年，金戈铁马，＿＿＿＿＿<br /><br />同学答：看今朝，死缠烂打<br /><br />（正解为“气吞万里如虎”）<br /><br />27，五年级的一次考试就考到了“三个臭皮匠，＿＿＿＿＿”<br /><br />同学答：臭味都一样<br /><br />（把监考和外面的校长笑翻了）<br /><br />28，初一的学生对对子：“登城白云间揽山色入怀，＿＿＿＿＿”<br /><br />同学答：我到酒店去抱小姐上床<br /><br />（他的语文老师差点当场吐血而亡）<br /><br />29，两情若是长久时，＿＿＿＿＿<br /><br />同学答：该是两人成婚时<br /><br />30，沉舟侧畔千帆过，＿＿＿＿＿<br /><br />同学答：孔雀开屏花样多<br /><br />31，书到用时方恨少，＿＿＿＿＿<br /><br />同学答：钱到月底不够花<br /><br />32，天若有情天亦老，＿＿＿＿＿<br /><br />同学答：人若有情死得早<br /><br />（正解为“人间正道是沧桑”，毛泽东《解放军占领南京》）<br /><br />33，人生自古谁无死，＿＿＿＿＿<br /><br />同学答：有谁大便不带纸<br /><br />（没有语言了……）<br /><br />34，有次考李清照的如梦令，“知否？知否？＿＿＿＿＿＿”<br /><br />同学答：SORRY，I DON’T KNOW……<br /><br />（正解为“应是绿肥红瘦”）<br /><br />35，语文考试，填空里有一首革命诗：“为人进出的门紧锁着，＿＿＿＿＿＿＿＿，一个声音高喊着：＿＿＿＿＿＿＿＿＿我渴望自由，但人的身躯怎能从狗洞子里爬出……”<br /><br />同学答：为狗爬出的洞也锁着／他妈的，都锁着！<br /><br />36，千山万水总是情，＿＿＿＿＿＿<br /><br />同学答：多给一分行不行<br /><br />（批卷老师批阅：情是情，分是分，多给一分都不行）<br /><br />37，问君能有几多愁，＿＿＿＿＿＿<br /><br />同学答：恰似一壶二锅头
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/209051#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 29 Jun 2008 06:20:45 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/209051</link>
        <guid>http://bigpanda.javaeye.com/blog/209051</guid>
      </item>
      <item>
        <title>Re: [Windows]I/O completion ports如何实现？个人推测，寻求标准答案！</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/138658" style="color:red;">http://bigpanda.javaeye.com/blog/138658</a>&nbsp;
          发表时间: 2007年11月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这是对<a href="http://www.javaeye.com/topic/102007" target="_blank">http://www.javaeye.com/topic/102007</a>的一个回帖，颇受好评，得了五星，加了若干分，故收入博客。<br /><br />基本没什么大错误，经iunknown指正，对non-blocking IO的理解有误。等闲一点，好好翻翻书再改正吧。<br /><br />--------------------------------<br /><br />我来侃一侃我对I/O Completion Ports的理解吧。这是一个比较复杂的话题，下面的描述尽量详细，争取把来龙去脉讲清楚，勿嫌啰嗦。<br /><br />首先讨论一下I/O Completion Ports试图解决什么样的问题。<br /><br />写一个IO Intensive服务器程序，对每一个客户请求生成一个新的child process/worker thread来处理，每个process/thread使用同步IO，这是最经典古老的解法了。在这之上的改进是prefork 多个process 或者使用线程池。（使用process或thread，原理都差不多，thread的context switch花销要比process switch要小。为了论述简单，下面只讨论线程。）<br /><br />这种结构的并发性并不高，哪怕你用C++, C甚至汇编来写，效率都不会很高，究其原因，在于两点：<br /><br />一．同步IO，每个线程大多数时间在等IO request的结束。IO相对于CPU，那是极极慢的。我翻了翻手里的Computer Architecture, A Quantitative Approach第二版，1996年出的，里面对CPU Register, CPU Cache, RAM, Disk，列的access time如下：<br /><br /><pre name="code" class="java">
Registers:  2-5 nano seconds
CPU Cache: 3-10 nano seconds
RAM: 80-400 nano seconds
Disk: 5 000 000 nano seconds (5 milli seconds)
</pre><br /><br />如今CPU又按照摩尔定律发展了十年后，这个硬盘还是机械式的磁头移来移去读写，尽管如今disk controller都有cache，也在发展，但和CPU相比，差距越来越大。（谁有最新数据可以贴上来。）<br /><br />二．生成数量大大超过CPU总数的线程。这样做有两个弊端，第一是每个线程要占用内存，Windows底下每个thread自己stack的省缺大小为1M，32位程序下一个用户程序最大能利用的内存也就3G，生成3000个线程，内存就没了。当然有人说64位下面，可以随便浪费，那么，第二个弊端，就无法避免了 ─ 生成大量的线程，CPU必然会花费大量的cpu cycles在线程之间进行切换。如今市场上价格适中的服务器也就2 cpu x 4 core = 8 核而已。生成那么多的线程，CPU在切换线程上花的功夫可能比干正经事还要多。<br /><br />明白了原因，就可以寻找改进方法。首先，使用异步IO。现在所有主流OS，都提供异步IO（non-blocking IO），连Java这种跨平台的编程环境都在版本1.4里开始支持异步IO了。但是，光有异步IO，这是不够的。论坛里有人发贴子问过，“我的线程发个IO Request，异步IO，直接返回了，然后我的线程干什么？” 异步IO是操作系统提供的机制，我们还需要设计我们程序的结构，使异步IO和线程结合起来，可以充分利用异步IO带来的好处，同时必须控制同时运行线程的数量，减少thread context switch的开销。<br /><br />IO Completion Port, 是微软针对上述思想，在Windows内核级别，提供的解决方案。<br /><br />从抽象高度去理解IO Completion Port，可以把它想成一个magic port，一边有一个队列是IO驱动程序处理好的IO数据，另一边是一个小小的线程池，这个port把io数据交给线程池里的线程来处理。同时，别的线程启动了IO异步请求后通知这个port一声，“嘿，注意了，一会儿这个IO handle 会有个数据包传过来要处理。” 这个port回答，“好，我注意一下这个handle。”。<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/4395/2093ef82-a3c7-4a44-a4ec-82b42904b547.jpg" /><br /><br />下面我们具体看一下Io Completion Port这个内核对象以及使用。<br /><br />要创建IoCompletionPort，呼叫Win32函数CreateIoCompletionPort。这个函数一身两用，创建IoCompletionPort也是它，往建好的IoCompletionPort里面加device handle也是它。<br /><br /><pre name="code" class="java">
HANDLE CreateIoCompletionPort(
  HANDLE hfile,
  HANDLE hExistingCompPort,
  ULONG_PTR CompKey,
  DWORD dwNumberOfConcurrentThreads);

// 创建IoCompletionPort

HANDLE hCp;
hCp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 4);
</pre><br /><br />创建IoCompletionPort头三个参数都是NULL之类的，只有第四个参数，用来配置这个生成的IoCompletionPort所允许同时运行的最大线程数目。<br /><br />创建好的IoCompletionPort kernel object，拥有两个队列。一个是Device List，包含所有通过这个IoCompletionPort管理的异步IO请求 的Device Handle。另外一个是I/O Completion Queue (FIFO)，Device Handle对应的IO驱动程序处理好的IO数据，放在这个队列里。<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/4396/93d7105d-bcf1-4b89-965c-020228f93c41.jpg" /><br /><br />为了能在Device List这个队列里面加个entry，用户程序将再一次使用CreateIoCompletionPort 这个函数。<br /><br /><pre name="code" class="java">
CreateIoCompletionPort(myHandle, hCp, myKey, 0);
</pre><br /><br />第一个参数是个IO Handle（Windows不限制handle类型，File, Directory, Serial Port, Parallel port, Mailslot server, Mailslot client, pipe, socket等等都可以），第二个参数是以前创建的IoCompletionPort handle. 这个IO Handle将放到IoCompletionPort handle的Device List那个队列里去。第三个参数是个long整数，是用来identify程序Request Context的。因为现在程序不是一个线程来处理客户Request了，而是不同的线程来处理。在一个线程里按顺序一二三四五来实现程序逻辑的方式是不行了，因此作为程序员你要把逻辑的Context记下来，让不同的线程得到这个Context，根据当前的状态，来执行相关的代码。这个completion key，是找到相映的context的key, index, hash code，pointer, whatever.<br /><br />第二个队列，IO Completion Queue，是由OS往里面插入entry的。OS在处理好了IO异步请求之后，察看一下这个Device handle是否是放在某个Completion Port里面，如果是，OS就在Completion Port的Completion Queue里面加个Entry。这个Entry包括下列数据。<br /><br /><pre name="code" class="java">
1．Number of bytes transferred
2．Completion key
3．Pointer to I/O request’s OVERLAPPED structure
4．Error code
</pre><br /><br />下面来看看IO Completion Port是怎么管理线程的。<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/4397/23c52208-b701-45a8-aa4c-4bb091da494b.jpg" /><br /><br />前面说Completion Port有个线程池，这种说法并不是很贴切。Completion Port本身并不创建线程，而只是掌管三个thread队列：<br /><br /><pre name="code" class="java">
1．Inactive threads waits IO Completion Port
2．Active running threads
3．Threads paused by other reasons, like waiting for something else (i.e. calls WaitForSingleObject, or even stupid but valid, calls Sleep).
</pre><br /><br />线程由程序创建，然后加入第一个队列(waits on IO Completion Port)。为了加入这个队列线程要呼叫一个函数，GetQueuedCompletionStatus。<br /><br /><pre name="code" class="java">
BOOL GetQueuedCompletionStatus(
  HANDLE       hCompPort,
  PDWORD       pdwNumBytes,
  PULONG_PTR   CompKey,
  OVERLAPPED** ppOverlapped,
  DWORD        dwMilliseconds);
</pre><br /><br />第一个参数是handle to Completion Port，线程通知OS本线程要加入这个Completion Port的第一个队列。这个函数会block当前线程，使其处于inactive状态。<br /><br />现在再去看看图二的I/O Completion Queue，OS在一份IO异步请求处理好了后，会在这里插入个entry，Completion Port在收到entry后，看看线程池里面有没有空闲没事做的线程，如果有，不要忘记我们创建这个Completion Port时候规定了个最大同时运行线程数量，如果当前运行线程数量小于这个最大值，那么就把这个线程放到第二个（active running）的队列上去，让这个线程运行起来。前面不是说线程在GetQueuedCompletionStatus上面block了么，现在这个函数返回了，继续运行程序的代码。通过这个最大同时运行线程数量，保证了不会有太多的线程在运行，Viola! 本文开头分析的几个问题全解决了。即是异步IO，又把异步IO和线程池结合了起来，还控制了当前运行线程数量。It’s BEAUTIFUL!<br /><br />这个线程处理完程序逻辑后，呼叫一下GetQueuedCompletionStatus，又回到了第一个队列。有意思的是这个队列的逻辑是Last In First Out。如果又有IO数据等待线程处理，这个线程可以继续执行，不用进行Context Switch，典型的能者多劳啊，越能干的人干的越多。<br /><br />这个线程在处理程序逻辑的过程中，可能会因为别的原因而变成inactive，比如在等别的资源（WaitForSingleObject），或者变态一点，自己来了个Sleep，这时线程就给放到第三个队列去了。<br /><br />这里有个有趣的现象，假如开始我们在第一个队列里面放三个线程，而最大同时运行线程数量设为2，在两个线程跑起来之后，第三个就不跑了，如果这时运行中的某个线程因为等别的资源而变为inactive，那么第三个线程也开始跑起来，同时运行线程数量还是2，这时那个等别的资源的线程等到资源了，又开始跑了起来，这时同时运行线程数量就是3，比设定的2要大。<br /><br />推荐的最大同时运行线程数量一般为CPU的总数，但是如果运行的线程还要等别的资源，建议把这个数目稍微设大一点，这样并发率会更高。<br /><br />先写这么多吧，累死了。这个帖子讲述的是IO Completion Port的工作原理，还没有谈到它是如何实现的，也还没有扯到Windows Source Code. 如果对工作原理了解了，也未必要去深究是如何实现的。在没有ＩＯ　Ｃｏｍｐｌｅｔｉｏｎ　Ｐｏｒｔ的系统上，自己实现一个，也未必不可。当然讨论讨论是如何实现的，也是件很有趣的事情。这方面我也没有完全搞个水落石出。让我先攒攒劲，改天再写吧。<br /><br />另外搭个顺风车问个问题，我做图的水平很臭，手里就有个Ｖｉｓｉｏ还用不好。本文的图都是在Ｗｏｒｄ里面画的。请问能否推荐个好用的作图软件，免费还是花钱的都可以。要有什么画ＵＭＬ比较好的软件，也推荐推荐，Ｖｉｓｉｏ太不好用了。
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/138658#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 Nov 2007 02:03:36 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/138658</link>
        <guid>http://bigpanda.javaeye.com/blog/138658</guid>
      </item>
      <item>
        <title>Eclipse Note &amp; sed</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/68496" style="color:red;">http://bigpanda.javaeye.com/blog/68496</a>&nbsp;
          发表时间: 2007年04月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Remove obsolet workspace<br /><br />%ECLIPSE_HOME%\configuration\.settings\org.eclipse.ui.ide.prefs<br /><br />edit key RECENT_WORKSPACES, this is a comma separated list.<br /><br />--------------------------------<br /><br />How to insert a few words with new line in beginning of a text file <br /><br />1. using sed<br /><br />create a sed file:<br /><br />1i\<br />text to insert <br /><br />sed -f sedfile.sed file.txt<br /><br />2. using echo, cat <br /><br />echo text to insert | cat > file2.txt<br />cat file.txt >> file2.txt
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/68496#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 06 Apr 2007 03:41:03 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/68496</link>
        <guid>http://bigpanda.javaeye.com/blog/68496</guid>
      </item>
      <item>
        <title>关于学习操作系统编程</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/38189" style="color:red;">http://bigpanda.javaeye.com/blog/38189</a>&nbsp;
          发表时间: 2006年12月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          写这篇是因为simohayha在C++圈子里的留言：<br /><br /><div class="quote_title">simohayha 写道</div><div class="quote_div"><br />希望圈子能专门开个报道贴，置顶的。 <br />然后就是不知道老大们对linux源码了解多少？希望能就此发些文章，哈哈。<br /></div><br /><br />本来是想在留言里面回simohayha的，结果越写越多，改成博客算了，也许对别人也有帮助。没什么中心思想，大家胡乱看看。<br /><br />我在读大学的时候是努力试图学习过linux源码的，在机房里打印出厚厚一叠纸，闷在计算机旁边猛看了好几天，饭也没好好吃，那些纸的质量不太好，有股怪味，空着肚子钻研，到后来闻那股味道，差点呕吐，于是放弃，出去大吃了一顿。<img src="/images/smiles/icon_biggrin.gif"/><br /><br />这是上世纪末的事情了，那时其实水平还没到，心里好奇，完全是赖蛤蟆想吃天鹅肉。学习这个事情，还是得循序渐进的。<br /><br />要想学深入学习操作系统，推荐从这本书开始： Operatiing Systmes, Design and Implementation (by Tanenbaum, Woodhull)，里面有个用于教学的操作系统Minix。Linux的某些方面，现在还可以找到Minix的影子。<br /><br />我手里的这本书，是第二版，现在书最新版是第三版。Minix 3.0，也已经有点难度了， X Window System都有了。<a href="http://www.minix3.org/" target="_blank">http://www.minix3.org/</a><br /><br />要是觉得还是太复杂，还有个更简单的GeekOS，<a href="http://geekos.sourceforge.net/" target="_blank">http://geekos.sourceforge.net/</a><br /><br />OS的设计是受限于硬件的，尤其是CPU。当代OS的不同进程之间的内存保护，虚拟地址，都要通过硬件。所以对一个CPU的深刻了解，必不可少。对于Intel的CPU，应该读下面三本：<br /><br />1. Intel Architecture Software Developer's Manual, Volume 1: Basic Architecture <a href="http://www.intel.com/design/PentiumII/manuals/243190.htm" target="_blank">http://www.intel.com/design/PentiumII/manuals/243190.htm</a><br /><br />2. Intel Architecture Software Developer's Manual, Volume 2: Instruction Set Reference Manual <a href="http://www.intel.com/design/PentiumII/manuals/243191.htm" target="_blank">http://www.intel.com/design/PentiumII/manuals/243191.htm</a><br /><br />3. Intel Architecture Software Developer’s Manual Volume 3: System Programming <a href="http://www.intel.com/design/PentiumII/manuals/243192.htm" target="_blank">http://www.intel.com/design/PentiumII/manuals/243192.htm</a><br /><br />尤其是第三本,编OS必看，虚拟内存，内存保护的东西全在里面。<br /><br />操作系统里面代码最多的，实际是IO部分，理论不多，可事关重要。Mindshare出了一系列书，写的非常深入详细。<a href="http://www.mindshare.com/" target="_blank">http://www.mindshare.com/</a><br /><br />学汇编开始直接学CISC的指令集太费劲了，推荐先从RISC汇编开始，西方大学计算机专业走的也是这条路。可以看的一本书是Introduction to RISC Assembly Language Programming，by John Waldron。里面用的处理器MIPS，可以下载个SPIM Simulator，在PC上跑。<a href="http://www.cs.wisc.edu/~larus/spim.html" target="_blank">http://www.cs.wisc.edu/~larus/spim.html</a><br /><br />Knuth老先生在The Art of Computer Programming一书里的例子，都是汇编，现在用的虚拟机是访RISC设计的，叫做MMIX，Knuth写了本书，叫做MMIXware, A RISC Computer for the Third Millennium, 呵呵，口气好大啊。<br /><br />讲计算机架构的两本计算机学科经典书，是Patterson和Hennessy合写的两本：Computer Organization and Design: The Hardware/Software Interface 3rd edition，以及Computer Architecture, Fourth Edition: A Quantitative Approach<br /><br />学汇编要注意一点，每个汇编器，其语法都不一样。在Windows下面写汇编，微软的Macro Assembler不是很合适，里面的Macro太多，都赶上高级语言了。有个开源的Netwide Assembler, <a href="http://sourceforge.net/projects/nasm" target="_blank">http://sourceforge.net/projects/nasm</a>, 倒是挺不错，推荐使用。<br /><br />关于学习操作系统内核，如果不是非抱着Linux的话，BSD是个挺好的选择。代码的结构可能还清晰些。我有一台FreeBSD服务器，基本非常满意，有两点不足，MySQL是针对Linux优化的，在FreeBSD下性能不够好，但是根据Yahoo的人说（Yahoo用FreeBSD）,FreeBSD最新版下用MySQL threading library重新编译性能可以接受了。Java也不尽如意，Sun 现在提供Java 5的binary给FreeBSD。但我在FreeBSD如果启动Tomcat开的内存太大，启动会失败。<br /><br />想看看FreeBSD的源码，可以看看这里：<a href="http://www.leidinger.net/FreeBSD/src_docs/" target="_blank">http://www.leidinger.net/FreeBSD/src_docs/</a>，里面列的都是内核各个部分的Code Reference Manual。里面那个讲kernel的文件有23M，共2205页，可见钻研这些是件极为费时费力的事情。<br /><br /><a href="http://www.chinaunix.net/" target="_blank">http://www.chinaunix.net/</a>也有很多BSD的资料。<br /><br />现在主流操作系统，就两大家了，一边是微软的以NT为内核的Win2k/XP/2003/Vista,另一边是以UNIX为根基的Linux/BSD/Solaris等等.<br /><br />Tanenbaum说过这么一句话，操作系统是什么呢，就是操作系统定义的API。<br /><br />学习Windows下的API，容易许多，资料全，另外Jeffrey Richter的Programming Application for MS Windows那本书写的太好了,Process, Job, Thread, Fiber, Critical Section, Event, Waitable Timer, Semaphore, Mutex，Virtual Memory, IO，写的非常详尽清楚。要是Linux/BSD下面也有这么一本书，该有多好啊。Linux, BSD里面的线程，家家各有不同，把人搞得糊里糊涂。<br /><br />如果从研究操作系统是怎么实现的，那么正好反过来，Linxu/BSD/Solaris简单明了多了.除了代码公开，他们内部结构没有Windows那么复杂。Windows的源码，要是成为微软的MVP，也是可以看到的。Windows 2000的大部分源码，还泄露出来了，在网上流传了一阵子。<br /><br />我个人觉得搞应用的去学习编译器回报可能更大，首先就是对语言了解很深入，写码，读码容易。如果会了编译器前台技术，可以自己写个分析代码的程序啊，那么读别人的码不久容易很多。现在虽然有现成的源码分析器，但是想想你有个数据库，一种是只能使用别人写好的界面，一种是可以用SQL自由查找，哪个好？如果学会了编译器后台技术，恭喜你，写任何一行代码都知道在计算机里怎么执行的，这是一种多么自由自在的境界啊。 <img src="/images/smiles/icon_smile.gif"/><img src="/images/smiles/icon_razz.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/38189#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 09 Dec 2006 00:20:50 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/38189</link>
        <guid>http://bigpanda.javaeye.com/blog/38189</guid>
      </item>
      <item>
        <title>C++ 优秀图书一览</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/35977" style="color:red;">http://bigpanda.javaeye.com/blog/35977</a>&nbsp;
          发表时间: 2006年11月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1．The C++ Programming Language, by Bjarne Stroustrup, Speical 3rd edition，Addison Wesley <span style="color: blue">多谢wzgame指正，改过来了。<img src="/images/smiles/icon_redface.gif"/></span><br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1227/56eab5f9-f223-4d17-8429-80130c46eb08.jpg" /> <br /><br />这是C++创始人B教主之力作，描述C++语言之经典一书。这本书第三版是97年出的，B教主老人家给这本书开了个网页<a href="http://www.research.att.com/~bs/3rd.html" target="_blank">http://www.research.att.com/~bs/3rd.html</a>，2000年，又出了个Special 3rd edition，和97年的第三版相比，多了两个Appendix，这两章在网页上可以下载，除此之外，还改了1000多个小错误。我说B教主你老人家小错误犯的也太多了吧，为什么不像Knuth老人家学习学习，人家多严谨那。要把这本书当参考手册，还得去买2000年那个版本的。<br /><br />B教主总共写了三本书，The C++ Programming Language，The Design and Evolution of C++，The Annotated C++ Reference Manual，加上翻译本合起来卖了上百万多份那，厉害厉害。<br /><br />2. The C++ Standard, Wiley，ISBN：0-470-84674-7<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1228/c752392b-1811-4228-a178-fcdd4e437286.jpg" /><br /><br />这本书是C++语言标准，C++的语法太繁琐，所以有些吃不准的地方，还是得翻这本书。厚厚一本书，700多页，但是用的纸非常轻，拿起来不沉。就是装订的不好，书脊有点松松散散，让人担心看多了某天书会散架。<br /><br />3. C++ Templates, The Complete Guide，by Vandevoorde, Josuttis，Addison Wesley, ISBN：0-201-73484-2<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1229/d3e1b9d5-4920-4c6e-86d9-d69c90b2b3cb.jpg" /><br /><br />之所以这么重视这本书，是因为自1987年以来，C++的开发重点就不是面向对象了，而是templates, static polymorphism, generic programming, multiparadigm programming. 掌握好了，C++的template的威力是巨大的。<br /><br />这本书的文笔非常简洁易懂，书的排版也很好，读起来非常舒服。<br /><br />4. The C++ Standard Library，A Tutorial and Reference，by Josuttis，Addison Wesley，ISBN: 0-201-37926-0<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1230/4cdd8a04-915a-469c-a8fc-d28429035aa7.jpg " /><br /><br />这本书的作者，也是上本书的作者之一，写的非常易懂。可能因为作者是个德国人，英语非母语者写的英语最好懂。<br /><br />个人认为是讲STL最好的一本书，C++的标准库全是用template设计的，没多少OO的影子。任何一个学C++的，必须学习STL，学习STL，这本书最好.<br /><br />5．Modern C++ Design，Generic Programming and Design Patterns Applied, by Andrei Alexandrescu，Addison Wesley, ISBN: 0-201-70431-5<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1231/5f5b2d1e-4f1d-4b1a-a959-14a6b622c988.jpg " /><br /><br />这本书用了很多玄之又玄的技术，读起来很吃力，有不少技术在C++ Templates The Complete Guide一书中都讲过，建议还是先读C++ Templates。作者的名气是很大的，一个极为优秀的程序员，不过书写的不流畅。<br /><br />6．C++ Template Metaprogramming, by Abrahams, Gurtovoy，Addison Wesley, ISBN: 0-321-22725-5<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1232/3b66aa3e-f891-49f7-8a6d-322d159128e7.jpg " /><br /><br />我个人经历，读Modern C++ Design一书读来吃力，但至少还勉勉强强跟的上，读这本书根本就如同读天书，努力三天，身心受创，吐血而去，发誓苦练C++内功，将来回头算账。<br /><br />这里说两句别的，以上两本书都出自Addison Wesley的Indepth系列，网址在这里：<a href="http://www.awprofessional.com/series/indepth/" target="_blank">http://www.awprofessional.com/series/indepth/</a><br /><br />这个系列出的书，都是好书，如Exceptional C++, Exceptional C++ Style, More Exceptional C++, C++ Gotchas等等，因为没有读过，无法发表评论，但是这个系列的书都值得一读，甚至反复阅读。<br /><br />7．Effective C++, More Effective C++, by Scott Meyers<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1233/6de82e3a-e705-40b4-ba39-374120226461.jpg " /><br /><br />这两本书很有名很经典，历史也很悠久，Scott Meyers写书时，template编程还不流行，所以书里讲的大多涉及传统OO. Scott Meyers的文笔非常好，读起来很舒服。<br /><br />8．Inside the C++ Object Model, by Stanley B. Lippman<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1234/2e61357c-d905-4241-a78c-c409ad8cfeb0.jpg " /><br /><br />也是很有名的书了，很仔细的描述了C++程序运行时，计算机里到底发生了什么事，这本书看完，读一般的C++程序如行云流水，当然，高级template应用例外。<br /><br />9．The Design and Evolution of C++, by Bjarne Stroustrup<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1235/2ffd90db-dd8a-4509-a51f-736beba1a412.jpg " /><br /><br />B教主另一大作，描述了C++的历史，及语言特性的由来，对喜欢刨根问底想明白C++为什么是这样的人很有参考价值。<br /><br />10．C++ Primer, 4th edition, by Lippman, Lajoie, Moo.<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1236/b160e356-6398-4b2b-be92-4a4b520704f4.jpg" /><br /><br />名书，第四版封面上写着，超过450 000个程序员，通过本书前版学习C++. 好多版税啊。我刚学C++时用第二版来做参考用。如果有Java, C, C#编程经验但是没用过C++的可以用这本书做入门书。<br /><br />最后给C++语言圈子打打广告，欢迎加入C++语言圈，共同学习探讨C++语言。<br /><a href="http://cpp-circle.javaeye.com" target="_blank">http://cpp-circle.javaeye.com</a>
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/35977#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 26 Nov 2006 01:56:42 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/35977</link>
        <guid>http://bigpanda.javaeye.com/blog/35977</guid>
      </item>
      <item>
        <title>2007年的软件开发计算机科学学习计划</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/35879" style="color:red;">http://bigpanda.javaeye.com/blog/35879</a>&nbsp;
          发表时间: 2006年11月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1. lisp<br /><br />有兴趣的可以去看看这个网页，<a href="http://www.paulgraham.com/diff.html" target="_blank"> http://www.paulgraham.com/diff.html </a>  Paul Graham列出了Lisp九大密器，C 只有两项，Java有四项，python有六项。学习lisp主要是学习新的思维方式。<br /><br />2. ruby<br /><br />深入学习ruby的语法和语义，深入到解释器一层看看有些特性是怎么实现的。<br /><br />3. C++<br /><br />以前对C++及imperative语言的语义深入研究过，总结出来一个模型，用来教学，效果不错，但是C++语法太繁琐，还没搞完，对C++ Template编也太少，刚建起一个C++的圈子，正好和大家一起讨论学习。以后要写browser plugin，这是公司的一个战略方向。<a href="http://cpp-circle.javaeye.com/" target="_blank">http://cpp-circle.javaeye.com/</a><br /><br />4. 编译器/解释器<br /><br />和上面的语言结合学习，帮助深入了解语言之语义。<br /><br />5. Java 5的并发库<br /><br />第三版的Java Language Specification比第二版厚多了，特别是Thread的一章，多了很多新内容，明确提出了Memory Model，Memory Barrier，Happen-Before-Order。<br /><br />有兴趣的可以看看这个几个网页：<br /><a href="http://www.cs.umd.edu/~pugh/java/memoryModel/" target="_blank">http://www.cs.umd.edu/~pugh/java/memoryModel/</a> <br /><a href="http://en.wikipedia.org/wiki/Memory_barrier" target="_blank">http://en.wikipedia.org/wiki/Memory_barrier</a>  <br /><a href="http://www.microsoft.com/whdc/driver/kernel/MP_issues.mspx" target="_blank">http://www.microsoft.com/whdc/driver/kernel/MP_issues.mspx</a><br /><br />现在Intel四核的计算机都出来了，在可见的未来内，计算的提高在于并行计算，现在半导体的制造工艺都逼近物理极限，不可能做的再小，只能在并行上下功夫。<br /><br />64位计算也快出来了。硬件的发展实在太快了。先从java的并发库开始吧。<br /><br />并发程序是最难写的，Beck在Test Driven Development里面都说了Unit test测试不了并发，计算机科学里对如何证明并发程序的正确，根据我手里的资料，还没有研究出个头绪来。<br /><br />6. JVM<br /><br />Java的JVM终于开源了，有几个底层的问题一直搞不懂得终于可以去看看代码看看为什么了，如Boottrap classloader。<a href="https://openjdk.dev.java.net" target="_blank">https://openjdk.dev.java.net</a><br /><br />7. Spring AOP 及 AspectJ<br />个人觉得Spring 2.0和AspectJ的结合，有很多潜力，值得深入挖掘。<br /><br />8. Role-Based Access Control<br />buaawhl推荐的，<br /><a href="http://csrc.nist.gov/rbac/" target="_blank">http://csrc.nist.gov/rbac/</a>   <br /><a href="http://www.amazon.com/Role-Based-Access-Control-David-Ferraiolo/dp/1580533701/sr=1-1/qid=1161828835/ref=pd_bbs_1/002-1138304-7372032?ie=UTF8&s=books" target="_blank">http://www.amazon.com/Role-Based-Access-Control-David-Ferraiolo/dp/1580533701/sr=1-1/qid=1161828835/ref=pd_bbs_1/002-1138304-7372032?ie=UTF8&s=books</a><br /><br />下一个项目的权限管理会比较复杂，以前没学过这方面的知识。从Acegi开始吧，如果够用最好。<br /><br />决定暂时放弃的东西：<br /><br />JSF，今年春天1.2版之specification出来了, 对1.0里面的弊病，做了不少改进吧。不过还是没有足够的动力，action-based-framework可以满足我的要求，没有什么动力。再等等。<br /><br />EJB3，或许可以和Spring 1.2比比，但里边的IoC，还是不够灵活，work out of the container麻烦多多，Spring 2.0出来了，和AspectJ一结合，威力大多了。我客户现在的项目是用EJB3的，在我鼓吹下，下个项目要用Spring啦，哈哈。个人对EJB3的前途不太乐观。出来太晚了，丧失了时机。<br /><br />这些够明年搞一年了，还是得在某一方面长时间坚持下去，才能有突破。
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/35879#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 24 Nov 2006 19:44:02 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/35879</link>
        <guid>http://bigpanda.javaeye.com/blog/35879</guid>
      </item>
      <item>
        <title>对动静态语言的语义思考，再兼谈点其它的</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/35763" style="color:red;">http://bigpanda.javaeye.com/blog/35763</a>&nbsp;
          发表时间: 2006年11月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在参与这个讨论<a href="http://www.javaeye.com/topic/33971" target="_blank">http://www.javaeye.com/topic/33971</a>后，这段时间对这个话题有了一些新的思考，写下来和大家分享分享。<br /><br />重点探讨一下动静态编程语言的语义，兼带些DSL及通用语言，以及新手上手难易问题。<br /><br />编程语言的语义，在论坛里讨论不多。在这里先分析一下几门主流静态语言，C，C++，Java，C#的语义。这些语言从编程风格角度讲，都称之为”imperative programming language”，（命令式的编程语言）。究其原因，这些语言都是对计算机的核心部件，CPU及内存，施发号令的。<br /><br /><pre name="code" class="java">
int a = 4 ;
int b = 4 + a;
int c = 5.2345;
</pre><br /><br />第一句，具体语义是，在内存里分配一块内存，大小为4 bytes，在这块内存里，写入4。第二句，具体语义是，在内存里分配一块内存，大小为4 bytes，从a中取值，和4进行加法运算，结果写入b指向的4 bytes内存。第三句就是个潜在的错误，等号右边是个8 bytes的double，把8 bytes的数据写到4 bytes的内存块里去，数据会损失的。<br /><br />要把这些静态语言内存分配的经验照搬来理解动态语言，完全是搞错了方向。看看下面一段javascript代码：<br /><pre name="code" class="java">
var a = 5;
alert(a);
var a = "foobar";
alert(a);
</pre><br /><br />这是一段完全合法可以正确运行的javascript程序，然而对于只编过静态语言而且对静态语言的语义很了解的人，却很难理解。变量a，明显不是指向根据类型分配出来一块大小固定的内存块。<br /><br />如何理解这一段代码的语义？<br /><br />Revised Report on the Algorithmic Language Scheme一文里有这么一段：<br /><br /><div class="quote_title">引用</div><div class="quote_div"><br />Scheme has latent as opposed to manifest types. Types are associated with values also (also call objects) rather than with variables. (Some authors refer to languages with latent types as weakly typed or dynamically typed languages. Other languages with latent types are APL, Snobol, and other dialects of Lisp. Languages with manifest types (sometimes referred to as strongly typed or statically typed language) include Algol 60, Pascal, and C.<br /></div><br /><br />Paul Graham在其“What Made Lisp Different”一文中这么说：<br /><br /><div class="quote_title">引用</div><div class="quote_div"><br /><strong>A new concept of variables.</strong> In Lisp, all variables are effectively pointers. Values are what have types, not variables, and assigning or binding variables means copying pointers, not what they point to.<br /></div><br /><br />这两段合在一起，可以正确理解动态语言的语义。<br /><br />静态，变量实际是分配的内存块，大小固定。<br /><br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1193/00579416-18dd-45ec-97c5-49816738bb5f.jpg" /><br /><br />动态，变量实际是个指针，可指向内存任何一块。<br /><img src="http://bigpanda.javaeye.com/upload/picture/pic/1194/d5f5ae66-8f87-4872-be13-9542a7c5ab8a.jpg " /><br /><br />(当然是运行的不同时期指向不同的内存块)<br /><br />看看下面几句：<br /><br /><pre name="code" class="java">
JavaScript:   var a = 5;  
ML: val a = 5;
Scheme: (define a 5)
</pre><br /><br />这些语句应该理解为, (等号右边)表达式evaluate出来一个值，这个值绑定到变量a里面去。用来描述上述代码语义的正确的词是binding。<br /><br />看看下面ML语言解释器对ML代码的解释：<br /><pre name="code" class="java">
Moscow ML version 2.01 (January 2004)
Enter `quit();' to quit.
- a;
! Toplevel input:
! a;
! ^
! Unbound value identifier: a
- val a = 5;
> val a = 5 : int
- a;
> val it = 5 : int
- val a = "foobar";
> val a = "foobar" : string
- a;
> val it = "foobar" : string
</pre><br />注意第七行的提示。<br /><br />第十行，第十四行光打入a，也是个表达式，evaluate出来的值，绑定给省缺变量it。<br /><br />看看下面Scheme语言解释器对Scheme代码的解释：<br /><br /><pre name="code" class="java">
> a
; Unbound variable: a

> (define a 5)
; Value: a

> a
; Value: 5
</pre><br />注意第二行的提示。<br /><br />一定要分清动态语言的变量绑定和静态语言的变量赋值的区别。变量是一个数学上的概念，在静态语言中，叫变量其实不合适，还不如直接叫a memory box，更能清楚地说明其本质。<br /><br />对于静态语言，弱类型是致命伤，因为在声明变量的时候，内存块已经分配好了，往这个内存块里写一块内存块存储不下的数据，带来的伤害是致命的。对于动态语言，强弱类型未必重要。<br /><br />在C/C++/Java/C#里面，内存是可以分配到Stack里面，也可以分配到Heap里面, 程序员一定要搞清楚区别, 像在C里：<br /><br /><pre name="code" class="java">
  int a = 5;
  int b[] = { 1, 2, 3, 4}
  int* ptr = (int*)malloc(10*sizeof(int));
</pre><br /><br />a 和 b 所分配的内存都在stack里，c 指向heap里的一块，退出前不把c 给free掉，就会遗漏内存。给function传值的时候，更要小心，传a是把5这个值给传过去，传b是传b这个array第一个元素的地址。<br /><br />到了C++，更加繁琐，因为C++的 Object是可以分配在stack上的，随便写几句代码，都会用到assignment operator = , address-of operator &, copy constructor.<br /><br /><pre name="code" class="java">
const ClassFoo e1;    // default constructor, destructor later
ClassFoo e2(e1);          // copy constructor
e2 = e1;                     // assignment operator
ClassFoo *pe2 = &e2;   // address-of operator (non-const)
const ClassFoo *pe1 = &e1;   // address-of operator (const)
</pre><br /><br />C++编译器自动生成这些函数，有时不符合需要就要自己手写。<br /><br />Java里面所有的object allocation, 都是分配在Heap里的，光这一点，就大大减轻了编程的繁琐度。从Java转向C++的朋友，一定要记住这一点。C++的 Object是可以分配在stack上的。<br /><br />Java里面的primitive变量是分配在Stack上的，其实如果废除这八个primitive types，全部用Object reference，动静态语言的差别已经不那么大了。Type inference在C# 3里面，已经开始实现了：<br /><br /><pre name="code" class="java">
var str = "Hello world!";
var num = 42;
var v = new TypeWithLongName&lt;AndWithTypeParameter>();
</pre><br /><br />欧美计算机专业的第一门语言，一般是ML或Scheme。这些语言，做到了程序员不用思考内存是分配在stack上还是heap上，内存回收由GC管，因而可以集中精力，学习算法，递归等等。<br /><br />用编程来解决问题，需要三方面的技能：1. 对编程语言，语义及运行环境的掌握，2.  对解决问题的算法的掌握，3. 拥有写出结构清晰，简洁易懂的代码的能力。<br /><br />第一点和第二点经常交汇在一起，因为语言，经常是为了解决某个领域的问题而设计的，解决算法，递归之类的问题，用functional programming language，操作系统，应该用C，web领域之PHP，科学计算之Matlab，试验仪器控制之labview，关系数据库之SQL，莫不如此。<br /><br />那么什么算是通用语言，什么算是DSL？通用不通用是相对的。C是一门通用语言，但也可以说是操作系统的DSL。从某种角度来说，能够全面控制计算机的，才叫通用语言，那么只有汇编才符合这个条件，C和C++勉强算得上。<br /><br />新手上路，该学什么？应该从某个领域学起，学习解决那个领域问题需要的方法，而且学习那个领域的DSL。这样成效出的最快，而且不受干扰。<br /><br />现在学校里教学静态语言占主流，有历史原因。以前计算机不够快，用C编程是唯一的选择。现在对运行效率要求很高的领域，还得用C，C++。但是在很多领域，这已经不是个问题了。由于历史的惯性，静态语言还在继续教。学校老师学新知识的动力，可不大。这些老师教出的学生，只会静态语言，那么公司为了保证人手充足，也会倾向静态语言。这种状况，慢慢会打破。<br /><br />Reference:<br /><br />[1] Revised Report on the Algorithmic Language Scheme 可以在这里找到：<a href="http://www.schemers.org/Documents/Standards/R5RS/r5rs.pdf" target="_blank">http://www.schemers.org/Documents/Standards/R5RS/r5rs.pdf</a><br />[2] Paul Graham的文章，What Made Lisp Different，<a href="http://www.paulgraham.com/diff.html" target="_blank">http://www.paulgraham.com/diff.html</a><br /><br />[3] 一篇介绍C# 3的很好的文章 <a href="http://www.codeproject.com/useritems/csharp3-concepts.asp" target="_blank">http://www.codeproject.com/useritems/csharp3-concepts.asp</a>
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/35763#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 24 Nov 2006 03:21:54 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/35763</link>
        <guid>http://bigpanda.javaeye.com/blog/35763</guid>
      </item>
      <item>
        <title>我最烦微软的一条</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/35416" style="color:red;">http://bigpanda.javaeye.com/blog/35416</a>&nbsp;
          发表时间: 2006年11月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          至少在对.NET市场宣传上，微软的宣传可是扑天盖地呀。<br /><br />我倒觉得失败在这几个地方：<br /><br />1. 没有跨平台，Linux上跑不起来，我要开个ASP小公司，用Windows Server通过Internet向客户提供服务每月license就要3000克朗，哪里用得起。 <br />2. ASP.NET 1.0是个极为失败的framework，简直不能用，比Action based framework差远了。我都想把WebWork给port过去。2.0经过一番大补后，好多了，还没仔细看过。<br /><br />C#是一门很优秀的语言。3.0更不得了。<br /><br />我最最烦微软的一条，是你听不到任何技术上反对的声音。<br /><br />我读过很多Windows编程的书，Richter, Petzold，Box，Esposito，Prosise，Rogerson，Brockschmidt，Russinovich，Solomon，这些人写的书都读过。<br /><br />我最最反感的一点，没有一个人，敢说出一句和微软官方不同的声音。<br /><br />COM的时代，没一个人说COM哪些不好，要改进，.NET来，风向变了，于是开始写，"COM很好，但是有下列不足，微软多伟大，给了我们.NET"。<br /><br />ASP.NET 1.0，没一个人说它不好，天天吹设计如何先进，组件模型如何如何牛逼。ASP.NET 2.0出来了，开始说ASP.NET 1.0有哪些缺陷，微软多伟大，2.0多了不起。早干什么去了？<br /><br />微软这个阵营的倡导者，都不敢发出独立思考，非官方的声音，一个只有一个声音的社团，是多么的可悲。那些人生怕搞坏了关系，混不下去？<br /><br />Java社团是多么活跃呀, Hibernate击败了CMP，现在成了Java Persistent API的根基，Spring击败了EJB，现在成了主流。在这个社区里，创照力源源不断，时不时有些新点子，激起人思考，促进人提高。<br /><br />只听一种声音，人都会变苯的。
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/35416#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 22 Nov 2006 05:32:04 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/35416</link>
        <guid>http://bigpanda.javaeye.com/blog/35416</guid>
      </item>
      <item>
        <title>向Robbin，Jerry和Ouspec衷心表示感谢。</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/34615" style="color:red;">http://bigpanda.javaeye.com/blog/34615</a>&nbsp;
          发表时间: 2006年11月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          想发这个帖子，是因为这个：<a href="http://www.javaeye.com/topic/34323?page=6" target="_blank">http://www.javaeye.com/topic/34323?page=6</a><br /><br />那个帖子已锁定，所以重新写一个，后果自负。<br /><br />我在这个论坛上已泡了两年左右，前一年半基本潜水，近来才慢慢开始活跃起来，通过读很多高质量的帖子和回答问题，和人讨论，自己提高很大。2.0上线以来，功能越来越多越好用，对Robbin三年如一日读贴打垃圾贴精华贴及Robbin, Jerry和Ouspec为2.0在时间，精力和金钱上的付出衷心表示感谢。能把这个社区做的这么好，不容易。祝愿你们将来获得丰厚回报，那是应当的。<br /><br />我相信绝对大多数javaeyer的想法和我都是一样的，中国人的习惯一般是好话留在心里，但是总得有人说出来。<br /><br />偶尔有人话说的不好听，Ouspec妹妹也不要生气，为了小事来生气，回想起来又何必。他人气我我不气，气出病来无人替。希望明天上网，看到这个帖子，哈哈一笑，万事皆消。<br /><br />把我最爱的一首诗，献给Ouspec mm，莎翁的Sonnet 18,<br /><br />Shall I compare thee to a summer's day?<br />Thou art more lovely and more temperate:<br />Rough winds do shake the darling buds of May,<br />And summer's lease hath all too short a date:<br />Sometime too hot the eye of heaven shines,<br />And often is his gold complexion dimm'd;<br />And every fair from fair sometime declines,<br />By chance or nature's changing course untrimm'd;<br />But thy eternal summer shall not fade<br />Nor lose posession of that fair thou owest;<br />Nor shall Death brag thou wander'st in his shade,<br />When in eternal lines to time thou growest:<br />  So long as men can breathe or eyes can see,<br />  So long lives this and this gives life to thee.<br /><br />我最喜欢的一个中文翻译，不知放在哪台计算机里了，在这个地方找到了另外个版本的翻译：<a href="http://blog.sina.com.cn/u/54a07fa8010005fa" target="_blank">http://blog.sina.com.cn/u/54a07fa8010005fa</a><br /><br />能否把你比作夏日璀璨<br /><br />    (第十八首)<br /><br />能否把你比作夏日璀璨？<br />你却比炎夏更可爱温存；<br />狂风摧残五月花蕊娇妍，<br />夏天匆匆离去毫不停顿。<br /><br />苍天明眸(1)有时过于灼热，<br />金色脸容往往蒙上阴翳；<br />一切优美形象不免褪色，(2)<br />偶然摧折或自然地老去。(3)<br />而你如仲夏繁茂不凋谢，<br />秀雅风姿将永远翩翩；(4)<br />死神无法逼你气息奄奄，<br />你将永生于不朽诗篇。<br />只要人能呼吸眼不盲，<br />这诗和你将千秋流芳。<br /><br />孙梁译<br /><br />(1)指太阳。<br />(2)原句中第一个fair是普通名词，指具体的美的形象，第二个fair是抽象名词，指美貌、优美等。<br />(3)原句中untrimmed原意为“剥掉(美观的衣服等)”，此处隐喻“夺去(美貌等)”。<br />(4)原句的owest等于现代英语的own，意为“所有”或“拥有”。
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/34615#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 16 Nov 2006 17:21:42 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/34615</link>
        <guid>http://bigpanda.javaeye.com/blog/34615</guid>
      </item>
      <item>
        <title>Re: 静态类型语言的优势究竟是什么？</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/34276" style="color:red;">http://bigpanda.javaeye.com/blog/34276</a>&nbsp;
          发表时间: 2006年11月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这是参与论坛讨论而写的回帖，被评五星了，哈哈，<img src="/images/smiles/icon_biggrin.gif"/><img src="/images/smiles/icon_biggrin.gif"/><img src="/images/smiles/icon_biggrin.gif"/>，故收入博客。<br /><br />原来的讨论贴在此：<a href="http://www.javaeye.com/topic/33971" target="_blank">http://www.javaeye.com/topic/33971</a>，<a href="http://www.javaeye.com/topic/33890" target="_blank">http://www.javaeye.com/topic/33890</a><br /><br />原来那个讨论的帖子我也仔细读了，也参与讨论了，觉得原作者的很多观点都似是而非。基本上是用过去的眼光来看问题。<br /><br />现在的主流商业系统是由C++, java, C#这些主流语言写的，那是有历史多年形成的原因，技术本身这些语言和Smalltalk，ruby有什么优势? 用Smalltalk，ruby实现DSL容易多了。有下列原因造成了java, C#这些主流语言的成功：<br /><br />1. 这些语言容易学，它们缺少高级的语言构造而使语义简单多了，不信去翻翻operation semantics和denotation semantics的书去，用operation semantics去分析这些语言不难，用denotation semantics去分析functional language就难多了。软件行业总的来讲还是缺人的，一大堆菜鸟在这个行当里当Coder，需求又这么大，找十个菜鸟用java上百上千行敲出来，比找个高手10行搞定还是容易的。<br /><br />2. 高级语言需要高级的编译器，需要更快的计算机。比如说常规的递归，每次呼叫要生成新的Stack Frame，比iteration要慢，更耗费资源，后来出了个tail recursion, compiler/interpreter自己就可以解决这个问题了。写个factorial(x), return x==0?1:x*factorial(x-1); 一行搞定，底下让compiler自己生成goto去，比写iteration省事吧。用高级语言写，性能就会损失，我开始学C的时候那时还讲究怎么在关键地方用汇编提高效率，后来学C++还有人讨论C++的vtable太耗内存，java刚出来时的性能讨论，我就不用说了。现在随着编译器的进步，计算机速度的提高，在商业系统里都不是问题了。要用发展的眼光看问题，而不要用过去的眼光看问题。<br /><br />说什么复杂的业务逻辑，商业系统技术上复杂个屁，再复杂能复杂过NP Complete？世界上有两种问题，一种是数学上有解的，一种是数学上暂时无解的，数学上暂时无解的就别干了。<br /><br />商业系统的复杂在于组织上交流的困难，一个大公司，内部有个人能把商业流程搞得一清二楚就不错了，这个人还能把过程给软件人员讲清楚那简直是可遇不可求的事。这样用ruby反而有优势了，可以快速开发，促进交流，开发出个模型出来给商务人员看看，用用，自然交流起来就容易多了。<br /><br />现在一个开发人员的开发效率比以前高多了，主要原因是因为开发语言和编译器的进步，这个趋势，只会继续下去，不要抱着过去的教条不放，java也是在不断改进的，加了reflection, 加了assert，加了泛型，下个版本，也要加脚本支持了。 <br /><br />未来是创造出来的，Hibernate打垮了CMP，Spring打垮了EJB，软件业的无穷魅力就在于有台计算机，别的都掌握在自己手里，现在动态语言的短处，慢慢都可以克服。<br /><br />学习用新的思维去解决问题吧。
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/34276#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Nov 2006 18:29:49 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/34276</link>
        <guid>http://bigpanda.javaeye.com/blog/34276</guid>
      </item>
      <item>
        <title>介绍一下O'reilly的Safari Books Online</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/32659" style="color:red;">http://bigpanda.javaeye.com/blog/32659</a>&nbsp;
          发表时间: 2006年11月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Oreilly出版社出的书, 质量一般都是不错的. 2001年Oreilly推出了一个在线服务，Safari Books Online，（<a href="http://safari.oreilly.com/" target="_blank">http://safari.oreilly.com/</a>）会员付一点月费，每个月可以租若干本看。<br /><br />这个每个月只能看几本的限定挺讨厌的，我加入几个月后就退出来了，但是现在推出了一种新的服务，Safari Library，没有每月看几本的限制，4千多本技术书，无限制在线阅读。月费40美元，一次付年费优惠些，一年440美元。<br /><br />里面的书几乎都是主流技术的书，计算机专业教科书不多，经典几乎没有，但是可以找到<br />The Art of Computer Programming Volume 4<br /><br />图书分类分的也不太好，Computer Science主类下有个子类叫Algorithms，Software Engineering主类下又有个叫Algorithms的子类。<br /><br />私人订可能贵了点，看你的腰包厚不厚了，一个公司订一份，还是很合算的。
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/32659#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Nov 2006 20:37:54 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/32659</link>
        <guid>http://bigpanda.javaeye.com/blog/32659</guid>
      </item>
      <item>
        <title>Utf-8编码是如何工作的</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/31890" style="color:red;">http://bigpanda.javaeye.com/blog/31890</a>&nbsp;
          发表时间: 2006年10月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Utf-8编码是如何工作的讲起。<br /><br />（JVM规范第4.4.7提了一些，O'Reilly出的Java I/O里讲的比较详细,我手里的是第一版,在第14章,Mutillingual Character Sets and Unicode)<br /><br />Java用的Unicode用两个字节表示一个charater,字母A用Hex表示是00 41， B是00 42，在一个纯英文的环境里面，直接存成Unicode的文件一半都是由零组成的，浪费资源。Utf-8的主要目的是对ASCII表格头128个字母优化，牺牲的是对中文字符的存储。<br /><br />头128个字节(0到127），可以用七个bit来表示，x6 x5 x4 x3 x2 x1 x0.第八个bit永远是0<br /><br />例子，A, 用Hex表示是00 41，去掉开头的零字节是Hex 41，转成二进制是 0100 0001。XP带的计算器可以在Hex和Binary<br />之间转换，自己试试。<br /><br />第128到2047个字节，要用10个bit来表示<br /><br />[code:1]<br /> 0  0  0  0  0 x10 x9 x8<br />x7 x6 x5 x4 x3 x2 x1 x0<br />[/code:1]<br /><br />Utf-8就把这些字节编成下面这样的两个byte<br /><br />[code:1]<br />1 1  0 x10 x9 x8 x7 x6<br />1 0 x5 x4 x3 x2 x1 x0<br />[/code:1]<br /><br />第2048到65535个字节，要用16个bit来表示，Utf-8把这些字节编成下面这样的三个byte<br />[code:1]<br />1 1  1  0   x15 x14 x13 x12<br />1 0 x11 x10 x9 x8 x7 x6<br />1 0 x5 x4   x3 x2 x1 x0<br />[/code:1]<br /><br />读一个Utf-8编码的array，如果第一个byte的高位是1110，那么要连读下面两个以 10 开头的byte。如果一个byte的高位是110，那么要连读下面一个以 10 开头的byte。<br />如果一个byte的高位是0，那么这个byte就是一个字符了。<br /><br />可以做个练习，中文字"哈"的Unicode编码是Hex 54 C8,转成Utf-8是什么？<br /><br />Hex 54 C8 转成十进制是21704，转成Utf-8后要用三个byte，找张纸，画三行，每行8个格子，第一行头四个格子填上1110，第二行头两个格子填上10，第三行头两个格子填上10。剩下的自己算算。然后和这个程序的结果比较一下。<br /><br />[code:1]<br />public class Test {<br />  public static void main(String[] args) {		<br />    char c[] = { '\u54c8' };<br />    String ha = new String(c);<br />    byte b[] = null;<br />    try {<br />      b = ha.getBytes("utf-8"); <br />    } catch (Exception e) { System.exit(-1);}<br />	<br />    for(int i=0; i&lt;b.length; i++) {<br />      System.out.print(Integer.toHexString(b[i]).substring(6) + " ");<br />    }<br />    System.out.println();<br />  }<br />}<br />[/code:1]
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/31890#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 31 Oct 2006 18:30:13 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/31890</link>
        <guid>http://bigpanda.javaeye.com/blog/31890</guid>
      </item>
      <item>
        <title>软件技术,软件工程书Top 10排行榜接龙</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/30428" style="color:red;">http://bigpanda.javaeye.com/blog/30428</a>&nbsp;
          发表时间: 2006年10月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          把读过的软件技术,软件工程方面的书,自己觉得最好的,列出来,搞个排行榜.<br /><br />1) Design Patterns (by GoF)<br /><br />第一次读这本书时,完全被震撼了.那时C++已学过几年，OO编程有点基础，但是在迷茫中不知该如何设计，面对编程问题不知如何下手组织代码。那时OO的主流书只讲封装，继承和多态，面对千变万化要解决的问题，感觉就是纸上谈兵。Design Patterns, Elements of Reusable Object-Oriented Software如迷雾中指航的明灯，一时间豁然开朗，天，原来还可以这么设计。<br /><br />这本书给我带来的恍然大悟，才见洞天的那种感觉，是很少能体会到的。可能那时时候自己积累的差不多了，这本书在合适的时间，合适的地点出现了。真有茫茫人海得一良师之感。<br /><br />2) Introduction to Algorithms (by Cormen, Leiserson, Rivest, Stein)<br /><br />这本书是麻省理工院校的几个教授写的，读来其累无比。哪里是什么Introduction，比许多所谓的Inside的书还要深许多。断断续续读了四年，还有许多算法没有搞懂。现在工作一天忙到晚，也没有时间了。很希望有空把图论的算法好好温习加深一下。<br /><br />3) Operatiing Systmes, Design and Implementation (by Tanenbaum, Woodhull)<br /><br />翻过一大堆操作系统的教科书，都是纸上谈兵，泛泛而谈，理论一大堆，例子一点点，让人看完之后还是云里雾里，摸不到头脑。<br /><br />这本书不一样，Tanenbaum教授为了联系实际教学，专门写了一个小小的OS，MINIX，理论终于可以联系实际了。<br /><br />想当年，Linux Torvalds打通关MINIX后，发信给Tanenbaum希望能扩展功能。Tanenbaum教授为了教学需要，要保持系统的简单性，因而拒绝了。Linux Torvalds于是另起虎皮做大旗.....<br /><br />这本书可是Linux的祖母啊。<br /><br />4) IA-32 Intel Architecture Software Developer's Manual Vol. 3, System Programming Guide<br /><br />当年从16bit转向32bit是个大事，出了一大堆书讲保护模式，虚拟内存，如何如何。读过一堆书，没有一本能讲解透彻的。一直到读到这本手册，相见恨晚啊，呜呼，早点读到这本不知能省多少事。<br /><br />归根结底还是自己信心不足，不敢啃Reference Manual，总想着找本通俗易懂的。<br /><br />5) Programming Application for Windows (by Richter)<br /><br />不用多说,非GUI Win32编程最好的一本。用C,C++编Win32的人手一本。我现在不搞Win32编程了还时不时翻翻，读起来还是津津有味。<br /><br />6) Analysis Patterns (by Fowler)<br /><br />关于书就不多说什么了，是这本书把我引入javaeye的。<br /><br />我那时看了这本书，想利用Party,Organization Structure来设计个系统，可不知怎么下手。正好在另外一个论坛，有人发问，我回帖顺便提了下不知如何用Party来设计，某位javaeye大牛横空出世，当头棒喝，“你错了........ 去看www.javaeye.com某贴”，我才找到这里来。<br /><br />心里嘀咕，牛的人，脾气都不太好，少说多学，于是专心潜水，近来才出来透透气。<img src="/images/smiles/icon_biggrin.gif"/><br /><br />7) Data Model Patterns, Conventions of Thought (by Hay)<br /><br />Fowler在Analysis Patterns一书里提到了这本书，于是顺藤摸瓜，去买了一本来。商用数据库建模，几乎应有尽有。甚至有一些很变态的需求，都能建出来。<br /><br />8) SQL for Smarties<br /><br />在Dummies众书中反潮流，脱颖而出，别人都称是Dummy,这本偏偏叫Smarty。<br /><br />任何一个搞数据库的，都应该读读这本书。我读完了之后，感觉SQL提高了一个档次。<br /><br />9) J2EE development without EJB <br /><br />不用多说，天下谁人不识君。<br /><br />10) Methods of Programming<br /><br />这本其实不能算书，而是一个大学老师写的讲义，尽管他是当书来写的。后来这个老师去微软了，要是他继续教下去的话，总有出书的一天。<br /><br />这本书的第一句话：Abstraction. I wish that to be the first word of this book, because it stands for the single most useful idea in computing.<br /><br />最后请再传给几个“我想请你推荐十大好书（只限软件技术,软件工程）”的人<br /><br />庄表伟，Robbin，buaawhl，ddd，runes
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/30428#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Oct 2006 23:52:34 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/30428</link>
        <guid>http://bigpanda.javaeye.com/blog/30428</guid>
      </item>
      <item>
        <title>Java Stack, Frame, Operand Stack</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/25418" style="color:red;">http://bigpanda.javaeye.com/blog/25418</a>&nbsp;
          发表时间: 2006年10月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我浏览JavaEye时间挺久，不过很长时间只潜水，连个账户都是2006年春天才申请。2006年八月初发表了第一个帖子，是回答一个网友关于JVM的问题。JavaEye升级到2.0之后，别的帖子都转过来了，唯独这一篇除外。幸好当初留了个草稿。<br /><br />原来的问题，是问Inside The Java Virtual Machine一书中一段话是什么意思：<br /><br /><div class="quote_title">引用</div><div class="quote_div">The bytecode streams that represent Java methods are a series of one-byte instructions, called opcodes, each of which may be followed by one or more operands. The operands supply extra data needed by the Java Virtual Machine to execute the opcode instruction. The activity of executing bytecodes, one opcode after another, constitutes a thread of execution inside the Java Virtual Machine. Each thread is awarded its own Java Stack, which is made up of discrete frames. Each method invocation gets its own frame, a section of memory where it stores, among other things, local variables and intermediate results of computation. The part of the frame in which a method stores intermediate results is called the methodís operand stack. An opcode and its (optional) operands may refer to the data stored on the operand stack or in the local variables of the methodís frame. Thus, the virtual machine may use data on the operand stack, in the local variables, or both, in addition to any data stored as operands following an opcode when it executes the opcode.<br /><br /></div><br /><br />（这一段我是从第一版的第三章Security，章节Phase One: Internal Checks里摘下来的，在第二版里估计没有什么变动，但章节可能不一样）<br /><br />这里面有三个关键词：<br /><ul><li> Java Stack </li><li> Frame</li><li> Operand stack (注意，这个stack和第一个不是一回事，下面会提到。)</li></ul><br /><br />线程是执行一条条机器指令的，文章中The activity of executing bytecodes, one opcode after another, constitutes a thread of execution inside the Java virtual machine 是指这个意思。原网友误解成一个又一个的opcode组成了thread，这不对。一个又一个的opcode不组成thread，而是对一个又一个opcode的执行，组成了thread，<strong>（activity of executing bytecodes）</strong>。<br /><br />Java程序由调用main方法开始，这是第一个方法调用，由main调用另外个方法，这就开始了个新的调用。每一次调用，就生成一个新的frame。<br /><br />在创建thread的时候，JVM给thread独建一个属于这个thread自己的Java Stack, 然后开始调用main，调用main就建立第一个frame，放在Java Stack里。从main调用另外个方法，生成个新的frame，放在Java Stack最顶上，调用结束，这个最顶上的frame去掉。可以想象java thread在执行时，随着方法调用，Java Stack里面frame增增减减。所以说Java Stack是由一个个frame组成的。<br /><br />（可以玩玩这个Thread.currentThread().dumpStack(); 就明白了。）<br /><br />Discrete frames 这里该理解成一个个的frame, 而不是“不连续的frame”。<br /><br />那么frame里面放的是什么东西呢？翻翻任意一本讲编译器的书，都说里面有这个方法（函数）调用传的参数，返回地址，和局部变量。在jvm里，还有一个叫做operand stack的东东。<br /><br />我们现在用的计算机，都是寄存器架构的（register machine）. JVM 和 .NET Virutal Machine, 都是stack machine. 这两者有什么区别呢？计算一个简单的表达式：1+2，用opcode和operand表达就是add 1, 2   在register machine里面，先把1放在第一个寄存器里面，2放在第二个寄存器里面，运算时从那两个寄存器里取值，结果放在第三个寄存器里面。在jvm里，则是先把1 push到operand stack里，再把2 push 到 operand stack 里，运算时pop 两下把1和2取出来，结果3再push回 operand stack 里面。<br /><br />运行1+2+3+a, 除了operand stack 之外，还要取局部变量a的值，那段英文的最后一句话指的就是这个。<br /><br />最后说一句，Java Stack，frame，operand stack，都是内存里面的一块地方。
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/25418#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 01 Oct 2006 05:02:58 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/25418</link>
        <guid>http://bigpanda.javaeye.com/blog/25418</guid>
      </item>
      <item>
        <title>Re: 项目事故和安全语言</title>
        <author>bigpanda</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bigpanda.javaeye.com">bigpanda</a>&nbsp;
          链接：<a href="http://bigpanda.javaeye.com/blog/25223" style="color:red;">http://bigpanda.javaeye.com/blog/25223</a>&nbsp;
          发表时间: 2006年09月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我今天有点感冒了，头昏昏沉沉，写完这篇睡觉去。<br /><br />我也无法解释Robbin的机子为什么会出现那种情况，如果有人Linux功力够，可以架起Kernel Debugger, 一直追踪到底。当然得有时间，还得配置一样的机子。我的Linux功力实在不够，无法再探讨下去了。平时也就用用Windows,刚刚开始用FreeBSD。Windows Kernel Debugger还架设的起来，Linux内核跟踪就无能为力。<br /><br />关于操作系统释放内存的事再说两句。操作系统在创建进程的时候会给那个用户进程生成一个4G的虚拟进程专用空间，用户进程自己代码只能直接读写操作这虚拟4G内存。进程结束（不管是自己结束还是被强制结束）时，操作系统把这4G的虚拟进程收回去。所有现代主流操作系统，Windows NT/2k/XP/2003/Vista, Linux, BSD, Mac OS X都是如此。为了求证，我翻了四本书：<br /><br />The Design and Implementation of the 4.4 BSD Operating System，<br />Operating Systems concepts and design，2nd edition<br />The Logical Design of Operating Systems，2nd edition<br />Operating System Concepts, 5th edition<br /><br />里面都是这么说的，还不算我以前引的Jeffrey Richter的那本，这几本书都在我案头上，够权威态度够严谨了吧。还怀疑的话推荐学习Minix操作系统，Operating Systems: design and implementation一书非常好。<br /><br />前面有人扯到linux会对进程打开过的文件做cache，用以证明进程在退出之后，占用的内存仍然没有释放。<br />这完全是两码事。文件系统cache又不在这4G的虚拟进程专用空间里。文件系统是内核的一部分，自己对最近用的文件cache一下是为了优化。(windows的NTFS一样会cache）<br /><br />用户进程在x86上只能在Ring 3级别跑，想读写文件或访问网络只能通过System Call来做. 这些System Call(Linux里面有200来个），可都是在Ring 0级别跑的,在Ring 0里面那可是个自由的天地，什么进程，内存保护的限制都没有，代码爱干什么干什么。<br /><br />不是所有在Ring 0里跑的代码，都是Linux内核团队写的。IO的驱动程序都是在内核跑的，但不少是别人写的。这些代码要是遗漏内存，系统会崩溃。<br /><br />内存遗漏和OutOfMemory还是两码事。一段代码，成功的申请了1k的内存，然后没有释放，这段代码遗漏内存，但是内存申请成功了。一段代码，向系统申请内存，系统无法分配内存，这才是OutOfMemory。我以前用Java写过一个Web Application，在Tomcat下跑，里面file upload的码是自己写的，在内存里生成个同样大的ByteArray,没有检查文件大小，结果有个人上载300MB的文件,JVM申请那么大的内存块失败，在Jsp页上直接打出了Stack Trace.但是Tomcat还是跑的好好的，操作系统(Linux)还是跑的好好的.那个<br />JVM占用的内存高达1.7G，好好的又跑了一个月，直到系统更新。<br /><br />但是我写一个小小的程序，里面要有个函数遗漏内存，如果这个函数只呼叫一次，那么一点不影响使用。但是在VC debug下调试，退出时debugger还是会告诉你内存遗漏.<br /><br />OutOfMemory,可能是程序内存遗漏而产生的恶果,但也可能不是,就像我写的那个苯苯的程序,虽然OutOfMemory，但不遗漏内存。<br /><br />内存遗漏的代码，如果是小程序偶尔跑一次，影响不大，如果是服务器天天跑，倒最后也就会屡屡申请内存，操作系统不停的说No，别的事就耽误了，如果是跑在Ring 0里，最终会Kernel Panic。所以内存泄漏还是存在的，在不同的地方后果不一样。<br /><br /><div class="quote_title">robbin 写道</div><div class="quote_div">因为推荐我使用SuSE9 SP3 x86_64的Unix专家已经在无数大型系统，甚至一些你们想像不到的巨大负载的系统上面部署和稳定运行这个版本的kernel了。</div><br /><br />我一点不否认Linux的负载能力和稳定性，但是这不能证明那台机子上在内核里跑的代码（包括Linux内核及第三方驱动程序），全部没有错。Linux内核的代码if,else,for嵌套一大堆，没准在那台机子特定的条件下，激活的代码就有Bug。<br /><br />Linux的netfilter，可是在Ring 0里面跑的，看看这个帖子，Linux Kernel Team的人是怎么说的： <br /><br /><a href="http://www.uwsg.iu.edu/hypermail/linux/kernel/0605.1/0008.html" target="_blank">Re: [PATCH] fix mem-leak in netfilter</a><br /><br />这个源代码可以在这里找到：<a href="http://www.promethos.org/lxr/http/source/net/ipv4/netfilter/ipt_recent.c" target="_blank">http://www.promethos.org/lxr/http/source/net/ipv4/netfilter/ipt_recent.c</a><br /><br />看里面逻辑套的，得算是bad smell了吧。<br /><br /><div class="quote_title">robbin 写道</div><div class="quote_div">再说一个现象，根据我当时对memory leak的观察，用户进程使用的resident内存并没有增加很稳定，系统buffer，disk cache也没有增加很稳定，但是用户进程持续不断向kernel申请更多的内存，却从来没有向kernel回吐内存。这就好像一个人拼命喝酒，但是他的肚子就像一个无底洞那种感觉。</div><br /><br />用户进程向kernel申请更多的内存，如果申请成功了，使用的resident内存却没有很稳定增加，这是不是很矛盾啊。<br /><br />用户进程想读写文件或访问网络只能通过System Call，内核里面的代码会跑一圈，这里面要是内存遗漏外面是看不出来的。<br /><br />要想再追根问底，我看只能搭个kernel debugger追踪一下。不然就成悬案了，就像我们现在也不知道肯尼迪是谁杀的。
          <br/>
          <span style="color:red;">
            <a href="http://bigpanda.javaeye.com/blog/25223#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Sep 2006 14:30:43 +0800</pubDate>
        <link>http://bigpanda.javaeye.com/blog/25223</link>
        <guid>http://bigpanda.javaeye.com/blog/25223</guid>
      </item>
  </channel>
</rss>