<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3.2" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>Cheng Meng's Small Talk</title>
	<link>http://cmsir.scinese.com</link>
	<description>上海自来水来自海上</description>
	<pubDate>Wed, 05 Mar 2008 10:43:03 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.2</generator>
	<language>en</language>
			<item>
		<title>Time-Energy Uncertainty Principle</title>
		<link>http://cmsir.scinese.com/2008/03/05/time-energy-uncertainty-principle/</link>
		<comments>http://cmsir.scinese.com/2008/03/05/time-energy-uncertainty-principle/#comments</comments>
		<pubDate>Wed, 05 Mar 2008 02:59:46 +0000</pubDate>
		<dc:creator>Cheng Meng</dc:creator>
		
		<category><![CDATA[Default]]></category>

		<category><![CDATA[Physics]]></category>

		<guid isPermaLink="false">http://cmsir.scinese.com/2008/03/05/time-energy-uncertainty-principle/</guid>
		<description><![CDATA[
这个式子解释起来破费周折，因为t不是一个物理量（至少在Quantum Mechanics的框架内），不能表示为一个Hermitian算符（Pauli定理），只是一个参数。以前对这个问题没有深究，最近读Nature上一篇关于量子计算物理极限的文章，才又想到这个老问题。
文章的想法很有意思。所有量子计算机，都必须用两个可以区分的态和来表示二进制的0和1，而Bool运算，例如NOT，必定需要在两个态之间进行跃迁，而这个跃迁是需要时间的。事实上前面的Time-Energy Uncertainty Principle就给出了一个两个态间跃迁的最小时间，反过来这也是这一关系的一个物理解释。
原文中用了一种比较直观的说明：考虑一个两能级系统，两个能量本征态为和，。令，，，则随时间的演化为
。
其处于态上的概率就是

所以一次跃迁需要的时间为。这个结论还可以推广到任意两个正交的量子态（只要不是能量本征态）之间。
还可以从另外一个角度看。假设和就是和。为了实现跃迁，必须有一个非对角的外场项。
阅读(313 次)]]></description>
			<content:encoded><![CDATA[<p><img src='http://tex.scinese.com/latex.php?latex=%5Cdisplaystyle%5CDelta+E%5CDelta+t%5Cgeq+%5Cfrac%7Bh%7D%7B2%7D' title='\displaystyle\Delta E\Delta t\geq \frac{h}{2}' alt='\displaystyle\Delta E\Delta t\geq \frac{h}{2}' class='latex' /></p>
<p>这个式子解释起来破费周折，因为t不是一个物理量（至少在Quantum Mechanics的框架内），不能表示为一个Hermitian算符（Pauli定理），只是一个参数。以前对这个问题没有深究，最近读Nature上一篇关于量子计算物理极限的文章，才又想到这个老问题。</p>
<p>文章的想法很有意思。所有量子计算机，都必须用两个可以区分的态<img src='http://tex.scinese.com/latex.php?latex=%7C0%5Crangle' title='|0\rangle' alt='|0\rangle' class='latex' />和<img src='http://tex.scinese.com/latex.php?latex=%7C1%5Crangle' title='|1\rangle' alt='|1\rangle' class='latex' />来表示二进制的0和1，而Bool运算，例如NOT，必定需要在两个态之间进行跃迁，而这个跃迁是需要时间的。事实上前面的Time-Energy Uncertainty Principle就给出了一个两个态间跃迁的最小时间，反过来这也是这一关系的一个物理解释。</p>
<p>原文中用了一种比较直观的说明：考虑一个两能级系统，两个能量本征态为<img src='http://tex.scinese.com/latex.php?latex=%7CE_1%5Crangle' title='|E_1\rangle' alt='|E_1\rangle' class='latex' />和<img src='http://tex.scinese.com/latex.php?latex=%7CE_2%5Crangle' title='|E_2\rangle' alt='|E_2\rangle' class='latex' />，<img src='http://tex.scinese.com/latex.php?latex=E_1%26lt%3BE_2' title='E_1&amp;lt;E_2' alt='E_1&amp;lt;E_2' class='latex' />。令<img src='http://tex.scinese.com/latex.php?latex=%7C0%5Crangle%3D%7CE_1%5Crangle%2B%7CE_2%5Crangle' title='|0\rangle=|E_1\rangle+|E_2\rangle' alt='|0\rangle=|E_1\rangle+|E_2\rangle' class='latex' />，<img src='http://tex.scinese.com/latex.php?latex=%7C1%5Crangle%3D%7CE_1%5Crangle-%7CE_2%5Crangle' title='|1\rangle=|E_1\rangle-|E_2\rangle' alt='|1\rangle=|E_1\rangle-|E_2\rangle' class='latex' />，<img src='http://tex.scinese.com/latex.php?latex=%5CDelta+E%3DE_2-E_1' title='\Delta E=E_2-E_1' alt='\Delta E=E_2-E_1' class='latex' />，则<img src='http://tex.scinese.com/latex.php?latex=%7C0%5Crangle' title='|0\rangle' alt='|0\rangle' class='latex' />随时间的演化为</p>
<p><img src='http://tex.scinese.com/latex.php?latex=%7C0%28t%29%5Crangle%3De%5E%7B-iE_1t%7D%7CE_1%5Crangle%2Be%5E%7B-iE_2t%7D%7CE_2%5Crangle' title='|0(t)\rangle=e^{-iE_1t}|E_1\rangle+e^{-iE_2t}|E_2\rangle' alt='|0(t)\rangle=e^{-iE_1t}|E_1\rangle+e^{-iE_2t}|E_2\rangle' class='latex' />。</p>
<p>其处于<img src='http://tex.scinese.com/latex.php?latex=%7C1%5Crangle' title='|1\rangle' alt='|1\rangle' class='latex' />态上的概率就是</p>
<p><img src='http://tex.scinese.com/latex.php?latex=%5Cdisplaystyle%7C%5Clangle+1%7C0%28t%29%5Crangle%7C%5E2%3D%5Cfrac%7B1-%5Ccos+%5CDelta+E+t%7D%7B2%7D' title='\displaystyle|\langle 1|0(t)\rangle|^2=\frac{1-\cos \Delta E t}{2}' alt='\displaystyle|\langle 1|0(t)\rangle|^2=\frac{1-\cos \Delta E t}{2}' class='latex' /></p>
<p>所以一次跃迁需要的时间为<img src='http://tex.scinese.com/latex.php?latex=%5Cfrac%7B%5Cpi+%5Chbar%7D%7B%5CDelta+E%7D' title='\frac{\pi \hbar}{\Delta E}' alt='\frac{\pi \hbar}{\Delta E}' class='latex' />。这个结论还可以推广到任意两个正交的量子态（只要不是能量本征态）之间。</p>
<p>还可以从另外一个角度看。假设<img src='http://tex.scinese.com/latex.php?latex=%7C0%5Crangle' title='|0\rangle' alt='|0\rangle' class='latex' />和<img src='http://tex.scinese.com/latex.php?latex=%7C1%5Crangle' title='|1\rangle' alt='|1\rangle' class='latex' />就是<img src='http://tex.scinese.com/latex.php?latex=%7CE_1%5Crangle' title='|E_1\rangle' alt='|E_1\rangle' class='latex' />和<img src='http://tex.scinese.com/latex.php?latex=%7CE_2%5Crangle' title='|E_2\rangle' alt='|E_2\rangle' class='latex' />。为了实现跃迁，必须有一个非对角的外场<img src='http://tex.scinese.com/latex.php?latex=H_%7B12%7D' title='H_{12}' alt='H_{12}' class='latex' />项。</p>
<p class="postviews_count">阅读(313 次)</p>]]></content:encoded>
			<wfw:commentRss>http://cmsir.scinese.com/2008/03/05/time-energy-uncertainty-principle/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Using LAPACK in C</title>
		<link>http://cmsir.scinese.com/2008/02/22/using-lapack-in-c/</link>
		<comments>http://cmsir.scinese.com/2008/02/22/using-lapack-in-c/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 05:00:22 +0000</pubDate>
		<dc:creator>Cheng Meng</dc:creator>
		
		<category><![CDATA[Default]]></category>

		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://cmsir.scinese.com/2008/02/22/using-lapack-in-c/</guid>
		<description><![CDATA[简单的说就是如何在C程序中调用Fortran子程序。我不想再学一门语言，所以直接调用库函数是最好的办法。google了一下，在VS2005里调试成功。简单来说你只需要：
编译好的LAPACK库
相应的头文件
知道Fortran数组内存布局的特点
知道如何在C程序中调用DLL
就没问题。dll和头文件可以在这里下载。建议动手前查看一下头文件中的f2c.h，里面定义了一些常用的数据类型，混个眼熟。
怎么在C程序中链接外部DLL库，这个和编译器有关，就不在这儿罗嗦了。
主要的问题是怎样在C的数据类型和Fortran中的类型间进行转换。基本的类型，比如REAL, DOUBLEREAL之类的定义，都在f2c.h里写好了。最要紧的一点：Fortran中二维数组是按列存储的，而C是按行存储。当然，我个人的意见是干脆不要用C提供的多维数组，直接用一维数组，元素按Fortran惯例存放就行了，顺便定义一套宏什么的，用起来省事，看起来顺眼。此外，Fortran中函数传参是call by reference，和C的call by value截然相反，所以所有参数都必须是指针。记住这两条就差不多了。
我要用LAPACK对角化Hamiltonian，感觉应该用zheev, compute all eigenvalues and, optionally, eigenvectors of a complex Hermitian matrix
附精美范例一则，在VS 2005下编译通过：

#include &#60;stdio.h&#62;
#include &#34;f2c.h&#34;
#include &#34;zgeev.h&#34;

#define SIZE 3

int main(int argc, char *argv[]) {
  doublecomplex A[SIZE][SIZE], b[SIZE];
  doublecomplex DUMMY[1][1],WORK[2*SIZE];
  doublecomplex AT[SIZE*SIZE];
  int i, j, ok, c1, c2, c3;
  char c4;

  /* initializing A */

  [...]]]></description>
			<content:encoded><![CDATA[<p>简单的说就是如何在C程序中调用Fortran子程序。我不想再学一门语言，所以直接调用库函数是最好的办法。google了一下，在VS2005里调试成功。简单来说你只需要：</p>
<li>编译好的LAPACK库</li>
<li>相应的头文件</li>
<li>知道Fortran数组内存布局的特点</li>
<li>知道如何在C程序中调用DLL</li>
<p>就没问题。dll和头文件可以在<a href="http://www.fi.muni.cz/~xsvobod2/misc/lapack/">这里</a>下载。建议动手前查看一下头文件中的f2c.h，里面定义了一些常用的数据类型，混个眼熟。</p>
<p>怎么在C程序中链接外部DLL库，这个和编译器有关，就不在这儿罗嗦了。</p>
<p>主要的问题是怎样在C的数据类型和Fortran中的类型间进行转换。基本的类型，比如REAL, DOUBLEREAL之类的定义，都在f2c.h里写好了。最要紧的一点：Fortran中二维数组是按列存储的，而C是按行存储。当然，我个人的意见是干脆不要用C提供的多维数组，直接用一维数组，元素按Fortran惯例存放就行了，顺便定义一套宏什么的，用起来省事，看起来顺眼。此外，Fortran中函数传参是call by reference，和C的call by value截然相反，所以所有参数都必须是指针。记住这两条就差不多了。</p>
<p>我要用LAPACK对角化Hamiltonian，感觉应该用zheev, compute all eigenvalues and, optionally, eigenvectors of a complex Hermitian matrix</p>
<p>附精美范例一则，在VS 2005下编译通过：</p>
<pre class="code">
<font color="#a020f0">#include </font><font color="#ff00ff">&lt;stdio.h&gt;</font>
<font color="#a020f0">#include </font><font color="#ff00ff">&quot;f2c.h&quot;</font>
<font color="#a020f0">#include </font><font color="#ff00ff">&quot;zgeev.h&quot;</font>

<font color="#a020f0">#define SIZE </font><font color="#ff00ff">3</font>

<font color="#2e8b57"><b>int</b></font> main(<font color="#2e8b57"><b>int</b></font> argc, <font color="#2e8b57"><b>char</b></font> *argv[]) {
  doublecomplex A[SIZE][SIZE], b[SIZE];
  doublecomplex DUMMY[<font color="#ff00ff">1</font>][<font color="#ff00ff">1</font>],WORK[<font color="#ff00ff">2</font>*SIZE];
  doublecomplex AT[SIZE*SIZE];
  <font color="#2e8b57"><b>int</b></font> i, j, ok, c1, c2, c3;
  <font color="#2e8b57"><b>char</b></font> c4;

  <font color="#0000ff">/*</font><font color="#0000ff"> initializing A </font><font color="#0000ff">*/</font>

  <font color="#804040"><b>for</b></font> (i = <font color="#ff00ff">0</font>; i &lt; SIZE; i++) {
    <font color="#804040"><b>for</b></font> (j = <font color="#ff00ff">0</font>; j &lt; SIZE; j++) {
      AT[j + SIZE*i].r = A[j][i].r;
      AT[j + SIZE*i].i = A[j][i].i;
    }
  }

  c1 = SIZE;
  c2 = <font color="#ff00ff">2</font>*SIZE;
  c3 = <font color="#ff00ff">1</font>;
  c4 = <font color="#ff00ff">&#8216;N&#8217;</font>;

  zgeev_(&amp;c4, &amp;c4, &amp;c1, AT, &amp;c1, b,
        DUMMY, &amp;c3, DUMMY, &amp;c3, WORK, &amp;c2, WORK, &amp;ok);

  <font color="#804040"><b>if</b></font> (ok == <font color="#ff00ff">0</font>)
    <font color="#804040"><b>for</b></font> (i = <font color="#ff00ff">0</font>; i &lt; SIZE; i++)
      printf(<font color="#ff00ff">&quot;</font><font color="#6a5acd">%f</font><font color="#ff00ff"> + </font><font color="#6a5acd">%f</font><font color="#ff00ff">i</font><font color="#6a5acd">\n</font><font color="#ff00ff">&quot;</font>, b[i].r, b[i].i);
  <font color="#804040"><b>else</b></font>
    printf(<font color="#ff00ff">&quot;An error occured&quot;</font>);

  <font color="#804040"><b>return</b></font> <font color="#ff00ff">0</font>;
}
</pre>
<p>并非原创，来自<a href="http://www.physics.oregonstate.edu/~rubin/nacphy/lapack/cprog.html">Using LAPACK Routines in C Programs</a>，略微做了些调整。</p>
<p class="postviews_count">阅读(352 次)</p>]]></content:encoded>
			<wfw:commentRss>http://cmsir.scinese.com/2008/02/22/using-lapack-in-c/feed/</wfw:commentRss>
		</item>
		<item>
		<title>暴力求解24点</title>
		<link>http://cmsir.scinese.com/2008/02/15/%e6%9a%b4%e5%8a%9b%e6%b1%82%e8%a7%a324%e7%82%b9/</link>
		<comments>http://cmsir.scinese.com/2008/02/15/%e6%9a%b4%e5%8a%9b%e6%b1%82%e8%a7%a324%e7%82%b9/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 14:44:43 +0000</pubDate>
		<dc:creator>Cheng Meng</dc:creator>
		
		<category><![CDATA[Default]]></category>

		<category><![CDATA[Technology]]></category>

		<category><![CDATA[algorithm]]></category>

		<guid isPermaLink="false">http://cmsir.scinese.com/2008/02/15/%e6%9a%b4%e5%8a%9b%e6%b1%82%e8%a7%a324%e7%82%b9/</guid>
		<description><![CDATA[是真正的暴力求解……穷举法。不过这个问题似乎也没有更好的方法了，各种算法除了暴力的程度，似乎也没有其他本质的区别。
好久没写程序，今天写得这个75%是从网上参考过来的。那个产生所有可能的后缀表达式的算法很漂亮，产生所有排列的函数也很简洁。唯一的缺点是，这个方法会搜索大量重复的表达式，总的搜索空间是全排列数乘上Catalan数，比指数增长还要彪悍。但是对一般4个数的24点，这个低效率还体现不出来。此外，输出的表达式是后缀的，看起来不怎么顺眼。但是后缀转中缀又很麻烦，我就懒得再折腾了。

import sys

def add(a,b):
  return a + b
def sub(a,b):
  return a - b
def mul(a,b):
  return a*b
def div(a,b):
  return float(a)/b

ops = {add:&#8217;+&#8216;, sub:&#8217;-&#8216;, mul:&#8217;*&#8216;, div:&#8217;/&#8216;}

def permute(seq):
  seqn = [[seq.pop()]]
  while seq:
    newseq = []
    new = seq.pop()
    for i in range(len(seqn)):
  [...]]]></description>
			<content:encoded><![CDATA[<p>是真正的暴力求解……穷举法。不过这个问题似乎也没有更好的方法了，各种算法除了暴力的程度，似乎也没有其他本质的区别。</p>
<p>好久没写程序，今天写得这个75%是从网上参考过来的。那个产生所有可能的后缀表达式的算法很漂亮，产生所有排列的函数也很简洁。唯一的缺点是，这个方法会搜索大量重复的表达式，总的搜索空间是全排列数乘上Catalan数，比指数增长还要彪悍。但是对一般4个数的24点，这个低效率还体现不出来。此外，输出的表达式是后缀的，看起来不怎么顺眼。但是后缀转中缀又很麻烦，我就懒得再折腾了。</p>
<pre class="code">
<font color="#a020f0">import</font> sys

<font color="#804040"><b>def</b></font> <font color="#008080">add</font>(a,b):
  <font color="#804040"><b>return</b></font> a + b
<font color="#804040"><b>def</b></font> <font color="#008080">sub</font>(a,b):
  <font color="#804040"><b>return</b></font> a - b
<font color="#804040"><b>def</b></font> <font color="#008080">mul</font>(a,b):
  <font color="#804040"><b>return</b></font> a*b
<font color="#804040"><b>def</b></font> <font color="#008080">div</font>(a,b):
  <font color="#804040"><b>return</b></font> float(a)/b

ops = {add:&#8217;<font color="#ff00ff">+</font>&#8216;, sub:&#8217;<font color="#ff00ff">-</font>&#8216;, mul:&#8217;<font color="#ff00ff">*</font>&#8216;, div:&#8217;<font color="#ff00ff">/</font>&#8216;}

<font color="#804040"><b>def</b></font> <font color="#008080">permute</font>(seq):
  seqn = [[seq.pop()]]
  <font color="#804040"><b>while</b></font> seq:
    newseq = []
    new = seq.pop()
    <font color="#804040"><b>for</b></font> i <font color="#804040"><b>in</b></font> range(len(seqn)):
      item = seqn[i]
      <font color="#804040"><b>for</b></font> j <font color="#804040"><b>in</b></font> range(len(item) + 1):
        newseq.append(item[:j] + [new] + item[j:])
    seqn = newseq
  <font color="#804040"><b>return</b></font> seqn

<font color="#804040"><b>def</b></font> <font color="#008080">_exprs</font>(expr, stk_depth, vals, ops):
  <font color="#804040"><b>if</b></font> <font color="#804040"><b>not</b></font> vals <font color="#804040"><b>and</b></font> stk_depth == 1:
    <font color="#804040"><b>yield</b></font> expr
  <font color="#804040"><b>if</b></font> stk_depth &gt; 1:
    <font color="#804040"><b>for</b></font> op <font color="#804040"><b>in</b></font> ops:
      <font color="#804040"><b>for</b></font> e <font color="#804040"><b>in</b></font> _exprs(expr + [op], stk_depth - 1, vals, ops):
        <font color="#804040"><b>yield</b></font> e
  <font color="#804040"><b>if</b></font> vals:
    <font color="#804040"><b>for</b></font> e <font color="#804040"><b>in</b></font> _exprs(expr + [vals[0]], stk_depth + 1, vals[1:], ops):
      <font color="#804040"><b>yield</b></font> e

<font color="#804040"><b>def</b></font> <font color="#008080">exprs</font>(vals, ops):
  <font color="#804040"><b>return</b></font> _exprs([], 0, vals, ops)

<font color="#804040"><b>def</b></font> <font color="#008080">eval</font>(expr):
  stack = []
  <font color="#804040"><b>for</b></font> e <font color="#804040"><b>in</b></font> expr:
    <font color="#804040"><b>if</b></font> callable(e):
      b = stack.pop()
      a = stack.pop()
      <font color="#804040"><b>try</b></font>:
        stack.append(e(a, b))
      <font color="#804040"><b>except</b></font> ArithmeticError:
        <font color="#804040"><b>return</b></font> None
    <font color="#804040"><b>else</b></font>:
      stack.append(e)
  <font color="#804040"><b>return</b></font> stack[0]

<font color="#804040"><b>def</b></font> <font color="#008080">tostr</font>(expr):
  ret = []
  <font color="#804040"><b>for</b></font> e <font color="#804040"><b>in</b></font> expr:
    <font color="#804040"><b>if</b></font> callable(e):
      ret.append(ops[e])
    <font color="#804040"><b>else</b></font>:
      ret.append(str(e))
    ret.append(&#8217;<font color="#ff00ff"> </font>&#8216;)
  <font color="#804040"><b>return</b></font> &#8221;.join(ret)

<font color="#804040"><b>if</b></font> __name__ == &quot;<font color="#ff00ff">__main__</font>&quot;:
  vals = [int(x) <font color="#804040"><b>for</b></font> x <font color="#804040"><b>in</b></font> sys.argv[1]]
  goal = int(sys.argv[2])
  <font color="#804040"><b>for</b></font> p <font color="#804040"><b>in</b></font> permute(vals):
    <font color="#804040"><b>for</b></font> e <font color="#804040"><b>in</b></font> exprs(p, ops.keys()):
      <font color="#804040"><b>if</b></font> eval(e) == goal:
        <font color="#804040"><b>print</b></font> tostr(e)
</pre>
<p class="postviews_count">阅读(359 次)</p>]]></content:encoded>
			<wfw:commentRss>http://cmsir.scinese.com/2008/02/15/%e6%9a%b4%e5%8a%9b%e6%b1%82%e8%a7%a324%e7%82%b9/feed/</wfw:commentRss>
		</item>
		<item>
		<title>新年好</title>
		<link>http://cmsir.scinese.com/2008/02/06/%e6%96%b0%e5%b9%b4%e5%a5%bd/</link>
		<comments>http://cmsir.scinese.com/2008/02/06/%e6%96%b0%e5%b9%b4%e5%a5%bd/#comments</comments>
		<pubDate>Wed, 06 Feb 2008 04:41:08 +0000</pubDate>
		<dc:creator>Cheng Meng</dc:creator>
		
		<category><![CDATA[Default]]></category>

		<guid isPermaLink="false">http://cmsir.scinese.com/2008/02/06/%e6%96%b0%e5%b9%b4%e5%a5%bd/</guid>
		<description><![CDATA[居然年三十了，同志们新年快乐。
转载ws短信一条：工资翻个十倍，爱情出点小轨（这个免了），理想早日放飞，卧佛快点到来，百合多多灌水，BN再战三百回。
我来继续ws：多收offer（此条送本宿舍申请团），多看动画（此条送所有宅男），多泡mm（此条特送Bcui和Bhui)，多写禁书（此条送Bluo)，等等等等。
阅读(505 次)]]></description>
			<content:encoded><![CDATA[<p>居然年三十了，同志们新年快乐。<br />
转载ws短信一条：工资翻个十倍，爱情出点小轨（这个免了），理想早日放飞，卧佛快点到来，百合多多灌水，BN再战三百回。<br />
我来继续ws：多收offer（此条送本宿舍申请团），多看动画（此条送所有宅男），多泡mm（此条特送Bcui和Bhui)，多写禁书（此条送Bluo)，等等等等。</p>
<p class="postviews_count">阅读(505 次)</p>]]></content:encoded>
			<wfw:commentRss>http://cmsir.scinese.com/2008/02/06/%e6%96%b0%e5%b9%b4%e5%a5%bd/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mathematics in Physics</title>
		<link>http://cmsir.scinese.com/2008/02/06/mathematics-in-physics/</link>
		<comments>http://cmsir.scinese.com/2008/02/06/mathematics-in-physics/#comments</comments>
		<pubDate>Wed, 06 Feb 2008 04:21:31 +0000</pubDate>
		<dc:creator>Cheng Meng</dc:creator>
		
		<category><![CDATA[Default]]></category>

		<category><![CDATA[Physics]]></category>

		<guid isPermaLink="false">http://cmsir.scinese.com/2008/02/06/mathematics-in-physics/</guid>
		<description><![CDATA[我向来认为学数学的都是一等一的聪明人；学物理的就要稍微差一些。但是物理学家有个硕大的优势，就是他的研究对象有时远比研究者聪明。大自然往往出人意料，所以物理学影响数学的名例数不胜数，反过来的就逊色很多。以前高中时看杨振宁的演讲，谈到规范场和纤维丛的对应关系，真是漂亮的结果。二十世纪的数学肯定是几何和数学的天下，荣耀几乎都归于几何学家和拓扑学家。这个风气估计也影响到了物理学界，大家都喜欢把自己的结果拔高到topological的高度，这样才能吸引到足够的眼球和引用率。
作为一个物理系学生，我自己对数学和物理之间关系的认识这几年也有很大变化，很大程度上受到了南大物理系氛围的影响，毕竟南大物理主攻凝聚态，和玄之又玄的超弦比起来，能量在几个eV的电子无疑是再实在不过的东西。以前刚进物理系的时候，满怀着对理论物理的热情，对场论和数学物理无比向往。数学与物理学结合最密切的分支，无疑是场论（包括弦论在内）。弦论对数学的要求更是到了令人发指的程度，我想我一辈子都不会搞明白代数几何到底在说些什么。当然，弄那么多复杂的数学结构，到底是好是坏，不是我一个外行人能判断的。不过从目前看来，弦论对数学的影响似乎还要在物理学之上，想想教皇E. Witten是Fields奖得主就明白了。
还是回头谈谈我熟悉的凝聚态物理。其实在低能范围也能出现很多足够吓死人的数学结构，最具威慑力的估计还是geometric phase，都用不着量子场论，在所谓elementary的量子力学里都能出现non-Abelian gauge field和monopole，理所当然的有connection, curvature, fibre buddle。当然，我觉得玩那么玄的必要性是值得推敲的，它有如此清晰的物理意义，这些微分几何的数学解释更像是锦上添花。我比较感兴趣的Quantum Hall Effect，整数情形Hall电导可以用第一陈类表示。第一陈类是个什么东西？说实在我不懂，我更愿意把它看作Berry&#8217;s Phase，这已经足够了。第一陈类或许可以解释Hall电导的量子化和平台，除此之外似乎并不能给我们更多东西。FQHE的的水更深，场论的描述就是Chern-Simons Theory，很遗憾，是所谓的Topological Field Theory，下面可以做深的一脚下去就出不来的文章。
经常能看到很多讨论学物理的需要掌握多少数学之类的文章。目前看来，除非要去挤场论这块高地，需要学很深的拓扑和几何，微积分，复分析和线性代数，加上一点点群论已经足够对付了。过于抽象和形式化，未必是好事。不过学点几何和拓扑也很有好处，有时候还是用得着的，所以我很想谁来教教我微分几何。
话说前几天看到一篇剖析装逼艺术的网文，提到一个小tip：就是提到外国人名时能用原文就用原文。我自信提到欧美人时大部分能写原文，日文就比较麻烦，但是可以用罗马音混一下。我觉得更装的技术是提到美籍华人都是用让人看了牙疼的英文拼写，比如T. D. Lee, C. N. Yang, X. G. Wen，等等。
阅读(334 次)]]></description>
			<content:encoded><![CDATA[<p>我向来认为学数学的都是一等一的聪明人；学物理的就要稍微差一些。但是物理学家有个硕大的优势，就是他的研究对象有时远比研究者聪明。大自然往往出人意料，所以物理学影响数学的名例数不胜数，反过来的就逊色很多。以前高中时看杨振宁的演讲，谈到规范场和纤维丛的对应关系，真是漂亮的结果。二十世纪的数学肯定是几何和数学的天下，荣耀几乎都归于几何学家和拓扑学家。这个风气估计也影响到了物理学界，大家都喜欢把自己的结果拔高到topological的高度，这样才能吸引到足够的眼球和引用率。</p>
<p>作为一个物理系学生，我自己对数学和物理之间关系的认识这几年也有很大变化，很大程度上受到了南大物理系氛围的影响，毕竟南大物理主攻凝聚态，和玄之又玄的超弦比起来，能量在几个eV的电子无疑是再实在不过的东西。以前刚进物理系的时候，满怀着对理论物理的热情，对场论和数学物理无比向往。数学与物理学结合最密切的分支，无疑是场论（包括弦论在内）。弦论对数学的要求更是到了令人发指的程度，我想我一辈子都不会搞明白代数几何到底在说些什么。当然，弄那么多复杂的数学结构，到底是好是坏，不是我一个外行人能判断的。不过从目前看来，弦论对数学的影响似乎还要在物理学之上，想想教皇E. Witten是Fields奖得主就明白了。</p>
<p>还是回头谈谈我熟悉的凝聚态物理。其实在低能范围也能出现很多足够吓死人的数学结构，最具威慑力的估计还是geometric phase，都用不着量子场论，在所谓elementary的量子力学里都能出现non-Abelian gauge field和monopole，理所当然的有connection, curvature, fibre buddle。当然，我觉得玩那么玄的必要性是值得推敲的，它有如此清晰的物理意义，这些微分几何的数学解释更像是锦上添花。我比较感兴趣的Quantum Hall Effect，整数情形Hall电导可以用第一陈类表示。第一陈类是个什么东西？说实在我不懂，我更愿意把它看作Berry&#8217;s Phase，这已经足够了。第一陈类或许可以解释Hall电导的量子化和平台，除此之外似乎并不能给我们更多东西。FQHE的的水更深，场论的描述就是Chern-Simons Theory，很遗憾，是所谓的Topological Field Theory，下面可以做深的一脚下去就出不来的文章。</p>
<p>经常能看到很多讨论学物理的需要掌握多少数学之类的文章。目前看来，除非要去挤场论这块高地，需要学很深的拓扑和几何，微积分，复分析和线性代数，加上一点点群论已经足够对付了。过于抽象和形式化，未必是好事。不过学点几何和拓扑也很有好处，有时候还是用得着的，所以我很想谁来教教我微分几何。</p>
<p>话说前几天看到一篇剖析装逼艺术的网文，提到一个小tip：就是提到外国人名时能用原文就用原文。我自信提到欧美人时大部分能写原文，日文就比较麻烦，但是可以用罗马音混一下。我觉得更装的技术是提到美籍华人都是用让人看了牙疼的英文拼写，比如T. D. Lee, C. N. Yang, X. G. Wen，等等。</p>
<p class="postviews_count">阅读(334 次)</p>]]></content:encoded>
			<wfw:commentRss>http://cmsir.scinese.com/2008/02/06/mathematics-in-physics/feed/</wfw:commentRss>
		</item>
		<item>
		<title>杂博</title>
		<link>http://cmsir.scinese.com/2008/02/05/%e6%9d%82%e5%8d%9a/</link>
		<comments>http://cmsir.scinese.com/2008/02/05/%e6%9d%82%e5%8d%9a/#comments</comments>
		<pubDate>Tue, 05 Feb 2008 10:39:26 +0000</pubDate>
		<dc:creator>Cheng Meng</dc:creator>
		
		<category><![CDATA[Default]]></category>

		<guid isPermaLink="false">http://cmsir.scinese.com/2008/02/05/%e6%9d%82%e5%8d%9a/</guid>
		<description><![CDATA[今天早上起来，习惯性的开邮箱……看到一封Admission 2008……激动莫名。Boston College虽然物理排名不怎么样，但好歹是个offer，终于摆脱了三无状态。
随后又有一条坏消息。UMich发面试通知；2月29日在上海。但是我没收到，难道这个学校就这样黄了？
在家里实在无聊，银魂补完计划进度喜人，已经扫荡了50集。开始几天几乎是除了吃饭睡觉都在看，现在每天睡觉前看三集。所谓物极必反，我终于想起来还带了一堆paper回来看。但是做了一阵，数值模拟的结果总是不对，也很让人郁闷。
阅读(443 次)]]></description>
			<content:encoded><![CDATA[<p>今天早上起来，习惯性的开邮箱……看到一封Admission 2008……激动莫名。Boston College虽然物理排名不怎么样，但好歹是个offer，终于摆脱了三无状态。</p>
<p>随后又有一条坏消息。UMich发面试通知；2月29日在上海。但是我没收到，难道这个学校就这样黄了？</p>
<p>在家里实在无聊，银魂补完计划进度喜人，已经扫荡了50集。开始几天几乎是除了吃饭睡觉都在看，现在每天睡觉前看三集。所谓物极必反，我终于想起来还带了一堆paper回来看。但是做了一阵，数值模拟的结果总是不对，也很让人郁闷。</p>
<p class="postviews_count">阅读(443 次)</p>]]></content:encoded>
			<wfw:commentRss>http://cmsir.scinese.com/2008/02/05/%e6%9d%82%e5%8d%9a/feed/</wfw:commentRss>
		</item>
		<item>
		<title>龙书第二版下载</title>
		<link>http://cmsir.scinese.com/2008/01/24/%e9%be%99%e4%b9%a6%e7%ac%ac%e4%b8%89%e7%89%88%e4%b8%8b%e8%bd%bd/</link>
		<comments>http://cmsir.scinese.com/2008/01/24/%e9%be%99%e4%b9%a6%e7%ac%ac%e4%b8%89%e7%89%88%e4%b8%8b%e8%bd%bd/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 09:17:38 +0000</pubDate>
		<dc:creator>Cheng Meng</dc:creator>
		
		<category><![CDATA[Default]]></category>

		<category><![CDATA[Technology]]></category>

		<category><![CDATA[compiler]]></category>

		<guid isPermaLink="false">http://cmsir.scinese.com/2008/01/24/%e9%be%99%e4%b9%a6%e7%ac%ac%e4%b8%89%e7%89%88%e4%b8%8b%e8%bd%bd/</guid>
		<description><![CDATA[compiler-aho.pdf
今天终于把龙书第二版的电子书传上去了。不知道链接什么时候会失效。
失误，一开始写成第三版了
阅读(723 次)]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.namipan.com/d/compiler-aho.pdf/c8c9bc6e6a6a577cbd78adad887417077d65a9265dcf0303">compiler-aho.pdf</a><br />
今天终于把龙书第二版的电子书传上去了。不知道链接什么时候会失效。<br />
失误，一开始写成第三版了</p>
<p class="postviews_count">阅读(723 次)</p>]]></content:encoded>
			<wfw:commentRss>http://cmsir.scinese.com/2008/01/24/%e9%be%99%e4%b9%a6%e7%ac%ac%e4%b8%89%e7%89%88%e4%b8%8b%e8%bd%bd/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Evil of Memory Leak</title>
		<link>http://cmsir.scinese.com/2007/11/19/evil-of-memory-leak/</link>
		<comments>http://cmsir.scinese.com/2007/11/19/evil-of-memory-leak/#comments</comments>
		<pubDate>Mon, 19 Nov 2007 05:44:38 +0000</pubDate>
		<dc:creator>Cheng Meng</dc:creator>
		
		<category><![CDATA[Technology]]></category>

		<category><![CDATA[gc]]></category>

		<guid isPermaLink="false">http://cmsir.scinese.com/2007/11/19/evil-of-memory-leak/</guid>
		<description><![CDATA[本篇含技术内容，不喜者勿入。
这是一个关于内存泄漏的凄惨故事。内存泄漏，乃是C/C++ Programmer最恐惧的Bug之一；来不知其来，去往往也不知其去，潜伏在层层花括号深处，当你发现它的时候，往往已经是程序崩溃之时。我几天前还被一个诡异的memory bug困扰了一晚，此bug举止异于常bug，在调试时单步执行没有任何问题，但一运行就出一些稀奇古怪的结果。以至于我都无法定位bug的位置，最后不得不借助于石器时代的printf调试大法，在可能出错的位置加上一摞一摞的printf才找到bug的可能位置。就算我已经定位到某一行代码，在我盯着屏幕看了半天，看得眼前快要出现幻觉，还是想不通bug从何而来。果然，从哪里来，到哪里去，是个终极关怀级别的问题。这一块代码和内存分配有关，无奈之下只好重写一遍，用了个稍微不同的逻辑。然后bug消失，程序再次和谐。
我个人喜欢用C写东西，尽管已经有无数与memory leak搏斗的经验，每次仍然免不了犯这类错误，经验虽然不停增长，错误好像未见减少。所以有时候觉得Java, C#这样的带Garbage Collection的语言也不错，但昨天看了一篇文章，讲述了一个C#中的内存泄漏怎样导致200万美金旁落的悲惨故事。涉及到这么大的支票，我们的兴趣总会提高一些。
文章作者是Princeton大学电子工程系的学生，他（当然还有一堆牛人）参加了一项汽车自动驾驶比赛，奖金是2个million。他们控制汽车的程序是用C#写的，有1万行代码。在比赛的最后关头，汽车老是开一会就失去响应，然后要么一头撞到障碍物（例如灌木丛），或者就茫然地在大地上行走直到没油。分析起来，问题出在代码的障碍物探测模块，它负责寻找汽车前进道路上的障碍。当然，如果车已经开过去了，那么刚才路上的障碍信息就没用了，所以会被垃圾回收器处理掉。最后的Bug是，这些对象，理应被丢弃掉的废物，根本没有被回收。一开始只见内存占用像滚雪球一样越来越大，开了一会汽车就歇了。可想而知，2百万肯定是黄了，最郁闷的是都这样了还不知道为什么垃圾回收器就是不干活，正宗的死不瞑目。
比赛完了，牛人们坐下来开会总结经验教训。其中某牛从网上下了个ANTS Profier，分析了他们代码的内存使用，终于看到了问题所在。前面说过这是一个C#式的内存泄漏，并不是说垃圾回收器出了问题，没有处理该回收的内存。虽然微软很不招人喜欢，但要相信它还不至于犯这种错误。垃圾回收器判断一个对象是否该被回收，是根据它能否被当前代码所引用。如果代码里已经不能访问到这个对象，那么它自然是垃圾。出问题的程序里，虽然程序员已经清除了到这些废物对象的引用，但这些对象作为事件的订阅者(subscriber，基本上是C#程序员的黑话)，还在被其他活跃对象默默地引用。最后的结果自然是内存耗尽。所以那篇回顾文章的作者在标题里就痛心疾首地喊：&#8221;If Only We’d Used ANTS Profiler Earlier&#8230;&#8221;，言下之意，还在为那几乎到手的200万美金心疼。
这个故事告诉我们一个道理：垃圾回收机制虽然很方便，但它实际上是把一个问题变成了另外一个问题（手动释放内存到去掉所有引用）。相对来说，发生错误的可能性减少了，“去掉所有引用”这句话是我在这里说说的，听起来有些别扭，实际上在代码中是一件比较自然的事，不需要特别操心。但是一旦出错，也更加难以察觉——因为我们几乎不可能跟踪垃圾收集器的动作。所谓一饮一啄，天下没有免费的午餐。
阅读(642 次)]]></description>
			<content:encoded><![CDATA[<p>本篇含技术内容，不喜者勿入。</p>
<p>这是一个关于内存泄漏的凄惨故事。内存泄漏，乃是C/C++ Programmer最恐惧的Bug之一；来不知其来，去往往也不知其去，潜伏在层层花括号深处，当你发现它的时候，往往已经是程序崩溃之时。我几天前还被一个诡异的memory bug困扰了一晚，此bug举止异于常bug，在调试时单步执行没有任何问题，但一运行就出一些稀奇古怪的结果。以至于我都无法定位bug的位置，最后不得不借助于石器时代的printf调试大法，在可能出错的位置加上一摞一摞的printf才找到bug的可能位置。就算我已经定位到某一行代码，在我盯着屏幕看了半天，看得眼前快要出现幻觉，还是想不通bug从何而来。果然，从哪里来，到哪里去，是个终极关怀级别的问题。这一块代码和内存分配有关，无奈之下只好重写一遍，用了个稍微不同的逻辑。然后bug消失，程序再次和谐。</p>
<p>我个人喜欢用C写东西，尽管已经有无数与memory leak搏斗的经验，每次仍然免不了犯这类错误，经验虽然不停增长，错误好像未见减少。所以有时候觉得Java, C#这样的带Garbage Collection的语言也不错，但昨天看了一篇<a href="http://www.codeproject.com/showcase/IfOnlyWedUsedANTSProfiler.asp">文章</a>，讲述了一个C#中的内存泄漏怎样导致200万美金旁落的悲惨故事。涉及到这么大的支票，我们的兴趣总会提高一些。</p>
<p>文章作者是Princeton大学电子工程系的学生，他（当然还有一堆牛人）参加了一项汽车自动驾驶比赛，奖金是2个million。他们控制汽车的程序是用C#写的，有1万行代码。在比赛的最后关头，汽车老是开一会就失去响应，然后要么一头撞到障碍物（例如灌木丛），或者就茫然地在大地上行走直到没油。分析起来，问题出在代码的障碍物探测模块，它负责寻找汽车前进道路上的障碍。当然，如果车已经开过去了，那么刚才路上的障碍信息就没用了，所以会被垃圾回收器处理掉。最后的Bug是，这些对象，理应被丢弃掉的废物，根本没有被回收。一开始只见内存占用像滚雪球一样越来越大，开了一会汽车就歇了。可想而知，2百万肯定是黄了，最郁闷的是都这样了还不知道为什么垃圾回收器就是不干活，正宗的死不瞑目。</p>
<p>比赛完了，牛人们坐下来开会总结经验教训。其中某牛从网上下了个ANTS Profier，分析了他们代码的内存使用，终于看到了问题所在。前面说过这是一个C#式的内存泄漏，并不是说垃圾回收器出了问题，没有处理该回收的内存。虽然微软很不招人喜欢，但要相信它还不至于犯这种错误。垃圾回收器判断一个对象是否该被回收，是根据它能否被当前代码所引用。如果代码里已经不能访问到这个对象，那么它自然是垃圾。出问题的程序里，虽然程序员已经清除了到这些废物对象的引用，但这些对象作为事件的订阅者(subscriber，基本上是C#程序员的黑话)，还在被其他活跃对象默默地引用。最后的结果自然是内存耗尽。所以那篇回顾文章的作者在标题里就痛心疾首地喊：&#8221;If Only We’d Used ANTS Profiler Earlier&#8230;&#8221;，言下之意，还在为那几乎到手的200万美金心疼。</p>
<p>这个故事告诉我们一个道理：垃圾回收机制虽然很方便，但它实际上是把一个问题变成了另外一个问题（手动释放内存到去掉所有引用）。相对来说，发生错误的可能性减少了，“去掉所有引用”这句话是我在这里说说的，听起来有些别扭，实际上在代码中是一件比较自然的事，不需要特别操心。但是一旦出错，也更加难以察觉——因为我们几乎不可能跟踪垃圾收集器的动作。所谓一饮一啄，天下没有免费的午餐。</p>
<p class="postviews_count">阅读(642 次)</p>]]></content:encoded>
			<wfw:commentRss>http://cmsir.scinese.com/2007/11/19/evil-of-memory-leak/feed/</wfw:commentRss>
		</item>
		<item>
		<title>推荐一篇博文</title>
		<link>http://cmsir.scinese.com/2007/11/15/%e6%8e%a8%e8%8d%90%e4%b8%80%e7%af%87%e5%8d%9a%e6%96%87/</link>
		<comments>http://cmsir.scinese.com/2007/11/15/%e6%8e%a8%e8%8d%90%e4%b8%80%e7%af%87%e5%8d%9a%e6%96%87/#comments</comments>
		<pubDate>Wed, 14 Nov 2007 16:26:12 +0000</pubDate>
		<dc:creator>Cheng Meng</dc:creator>
		
		<category><![CDATA[Default]]></category>

		<guid isPermaLink="false">http://cmsir.scinese.com/2007/11/15/%e6%8e%a8%e8%8d%90%e4%b8%80%e7%af%87%e5%8d%9a%e6%96%87/</guid>
		<description><![CDATA[因为我老是在blog写一些半桶水的技术文，大家的感觉可能是这个家伙无趣得很。今天决定推荐一篇博文，顺便给maoz同学拉拉票（虽然我这儿的访问量实在趋近于零）。maoz同学参加了Feedsky主办的博客大赛，有点像环法，每天都要写一篇命题作文（或者应该叫话题作文），坚持不懈一个月，你就完成比赛了。至于能不能拿到那台作为奖品的手提，鉴于有像和菜头那样的巨无霸参赛，我对maoz同学不表乐观。说实话看到这篇文章还是通过和菜头的blog。写了半天，不见庐山真面目，赶紧给一个链接：
关于父亲
下面是投票链接：投票点此
插播广告完毕。
对于这篇文章，我不知道该做些什么评论。也许就用鲁迅的话，直面惨淡的人生。maoz同学，据我所知（如果我没弄错的话），是属于产量极少的高智商人类，而且，强调一下，是个非常有趣好玩的人。说到这儿插几句，其实以前就看过maoz的blog，但没想到这个挺有意思的blog的主人居然是我的旧识，虽然也有许多年未见了（这句话可能不准确），我对maoz同学的印象也基本停留在N年以前，但想来现在应该也差不太远（希望如此）。但这篇文章，确实不像出自一个比我还小一岁的女孩子之手。
最近似乎几个国产Web 2.0网站都挺热闹，feedsky在办博客大赛，豆瓣的注册用户忽然就到了1000000个。中国的网络，真的是在夹缝里生存，从一开始就营养不良，到现在都不知营养良为何物了，但看到这些成绩，还是值得高兴一下。
阅读(792 次)]]></description>
			<content:encoded><![CDATA[<p>因为我老是在blog写一些半桶水的技术文，大家的感觉可能是这个家伙无趣得很。今天决定推荐一篇博文，顺便给maoz同学拉拉票（虽然我这儿的访问量实在趋近于零）。<a href="http://maozzz.com">maoz</a>同学参加了Feedsky主办的博客大赛，有点像环法，每天都要写一篇命题作文（或者应该叫话题作文），坚持不懈一个月，你就完成比赛了。至于能不能拿到那台作为奖品的手提，鉴于有像和菜头那样的巨无霸参赛，我对<a href="http://maozzz.com">maoz</a>同学不表乐观。说实话看到这篇文章还是通过和菜头的blog。写了半天，不见庐山真面目，赶紧给一个链接：</p>
<p><a href="http://maozzz.com/blog/2007/about-father/">关于父亲</a></p>
<p>下面是投票链接：<a href="http://www.feedsky.com/challenge/user.html?u=3dfc87fb">投票点此</a></p>
<p>插播广告完毕。</p>
<p>对于这篇文章，我不知道该做些什么评论。也许就用鲁迅的话，直面惨淡的人生。<a href="http://maozzz.com">maoz</a>同学，据我所知（如果我没弄错的话），是属于产量极少的高智商人类，而且，强调一下，是个非常有趣好玩的人。说到这儿插几句，其实以前就看过maoz的blog，但没想到这个挺有意思的blog的主人居然是我的旧识，虽然也有许多年未见了（这句话可能不准确），我对<a href="http://maozzz.com">maoz</a>同学的印象也基本停留在N年以前，但想来现在应该也差不太远（希望如此）。但这篇文章，确实不像出自一个比我还小一岁的女孩子之手。</p>
<p>最近似乎几个国产Web 2.0网站都挺热闹，feedsky在办博客大赛，豆瓣的注册用户忽然就到了1000000个。中国的网络，真的是在夹缝里生存，从一开始就营养不良，到现在都不知营养良为何物了，但看到这些成绩，还是值得高兴一下。</p>
<p class="postviews_count">阅读(792 次)</p>]]></content:encoded>
			<wfw:commentRss>http://cmsir.scinese.com/2007/11/15/%e6%8e%a8%e8%8d%90%e4%b8%80%e7%af%87%e5%8d%9a%e6%96%87/feed/</wfw:commentRss>
		</item>
		<item>
		<title>龙书第二版</title>
		<link>http://cmsir.scinese.com/2007/11/12/%e9%be%99%e4%b9%a6%e7%ac%ac%e4%ba%8c%e7%89%88/</link>
		<comments>http://cmsir.scinese.com/2007/11/12/%e9%be%99%e4%b9%a6%e7%ac%ac%e4%ba%8c%e7%89%88/#comments</comments>
		<pubDate>Mon, 12 Nov 2007 14:31:37 +0000</pubDate>
		<dc:creator>Cheng Meng</dc:creator>
		
		<category><![CDATA[Default]]></category>

		<category><![CDATA[Technology]]></category>

		<category><![CDATA[compiler]]></category>

		<guid isPermaLink="false">http://cmsir.scinese.com/2007/11/12/%e9%be%99%e4%b9%a6%e7%ac%ac%e4%ba%8c%e7%89%88/</guid>
		<description><![CDATA[说到龙书(Dragon Book)，喜欢玩编译器和程序语言的老大们肯定是人手一册，在编译器技术这一块的教科书中地位几乎有如圣经。说到这儿又要鄙视一下国产的什么编译原理教材，简直是不知所云，抄都抄得这么潦草。
计算机领域的经典著作，常常会有些“小名”或俗名，如无人不知的TAOCP，C语言圣经K&#38;R，算法入门宝典CLR。TAOCP是书名的缩写，此书堪称最有名的算法书籍，我估计也是被完整阅读次数最少的计算机书籍，之一都省掉了。K&#38;R和CLR都是作者名字的开头第一个字母。龙书算是比较有个性的，这个外号来自其封面。1977年，Alfred V. Aho和Jeffrey D. Ullman写了一本Principles of Compiler Design，封面是一位骑士枪挑一头绿色恐龙，因此得名龙书。到了1986年，此书升级换代，书名变成了Compilers: Principles, Techniques and Tools，沿用至今，作者增加了Ravi Sethi。封面依然是一位骑士和一头恐龙，只不过恐龙变成了红色，骑士则坐在了电脑前。仔细看的话，发现龙身上纹身“Complexity of Compiler Design&#8221;，骑士全副武装，盔甲上书“Data Flow Analysis”，夹着一把写着”LALR Parser Generator&#8221;的宝剑，盾牌上则写着&#8221;Syntax Directed Translation&#8221;。
一晃过了20年，龙书终于出了新版。封面当然是骑士斗恶龙。作者又加了一位，篇幅猛增了200多页，变化十分巨大。除了一些古典内容如词法分析，语法分析，语法制导翻译，中间代码生成没怎么动，后面的运行环境，代码优化部分可谓焕然一新。从Run-time Environment这一部分就可以看出程序语言这些年来的变化：Java，.NET，Python，Ruby&#8230;自动内存管理已经不是什么新鲜事，所以龙书里开了近半章的篇幅给垃圾收集。内存管理是个大题目，完全铺开来一本书都不够，从目录上看，龙书已经包括了现在主流的一些技术，估计作者安排这一块内容时也死了不少脑细胞。变化最大的当属代码优化，原来只有一章，现在一下子撑成了四章，洋洋洒洒近400页，可以单独成一本书了，较之第一版，作者似乎不满足于做一本入门教材，要一揽子把从入门到高级全包了。
其他内容上的变化，暂时只能从目录上看一下。Flow Analysis增加了一些较新的算法，比如Region-Based Analysis。优化部分花了不少力气讲Parallel Machine，现在看来也是大势所趋。
书肯定是不可能仔细看了；也不知道什么时候会有中文版；这么一本1000页的大砖头翻成中文后也不知道厚成什么样。我个人的一点观察，最近几年动态语言与函数式语言开始逐渐成为主流，用马克思的话，一个函数式编程的幽灵开始在C++/C#/Java中徘徊。现在的编译技术，似乎应该包括Dynamic Typing, JIT等等，特别是种种针对动态语言的优化（比如方法缓存）。作为一本教材，不可能面面俱到，更不能跟风，编者总有自己的原则和取舍，大概龙书的四位作者认为这些东西还不值得进入大学的编译技术课程。但我觉得现在正是一个计算环境变革的前夜；或者说变革已经在进行时了。这样的话，也许下一个版本，不用再让我们等20年。
说到这儿，又要损一下中国这帮写教科书的人。为了避免打击面过广，不失一般性，限定于计算机行业。老外写书，一版二版三版，真是与时俱进。当年Dirichlet写了一本数论讲义，每次重版他的学生Dedekind都会在后面添个附录反映一下最新的研究进展，到最后附录比正文还厚得多。在我国，就少见这种延续性。人家真是把教材当作一项事业来做的。中国最有名的计算机书估计是谭老师的C语言，去年貌似也出了个新版，除了换个封面，里面新瓶装旧酒，继续误人子弟。对谭老师C语言书的声讨网上已经进行多年，我也没有重复的必要。只是想到这些状况，不能不有点觉得外国月亮有点圆。
本来想把电子版放上来，但尺寸实在吓人（近50M)，我估计赛族上对这个感兴趣的人也不会太多，如果想要电子版的话，私人联系吧。当然直接google也可以。
下面是三版龙书封面展览：


阅读(1172 次)]]></description>
			<content:encoded><![CDATA[<p>说到龙书(Dragon Book)，喜欢玩编译器和程序语言的老大们肯定是人手一册，在编译器技术这一块的教科书中地位几乎有如圣经。说到这儿又要鄙视一下国产的什么编译原理教材，简直是不知所云，抄都抄得这么潦草。</p>
<p>计算机领域的经典著作，常常会有些“小名”或俗名，如无人不知的TAOCP，C语言圣经K&amp;R，算法入门宝典CLR。TAOCP是书名的缩写，此书堪称最有名的算法书籍，我估计也是被完整阅读次数最少的计算机书籍，之一都省掉了。K&amp;R和CLR都是作者名字的开头第一个字母。龙书算是比较有个性的，这个外号来自其封面。1977年，Alfred V. Aho和Jeffrey D. Ullman写了一本Principles of Compiler Design，封面是一位骑士枪挑一头绿色恐龙，因此得名龙书。到了1986年，此书升级换代，书名变成了Compilers: Principles, Techniques and Tools，沿用至今，作者增加了Ravi Sethi。封面依然是一位骑士和一头恐龙，只不过恐龙变成了红色，骑士则坐在了电脑前。仔细看的话，发现龙身上纹身“Complexity of Compiler Design&#8221;，骑士全副武装，盔甲上书“Data Flow Analysis”，夹着一把写着”LALR Parser Generator&#8221;的宝剑，盾牌上则写着&#8221;Syntax Directed Translation&#8221;。</p>
<p>一晃过了20年，龙书终于出了新版。封面当然是骑士斗恶龙。作者又加了一位，篇幅猛增了200多页，变化十分巨大。除了一些古典内容如词法分析，语法分析，语法制导翻译，中间代码生成没怎么动，后面的运行环境，代码优化部分可谓焕然一新。从Run-time Environment这一部分就可以看出程序语言这些年来的变化：Java，.NET，Python，Ruby&#8230;自动内存管理已经不是什么新鲜事，所以龙书里开了近半章的篇幅给垃圾收集。内存管理是个大题目，完全铺开来一本书都不够，从目录上看，龙书已经包括了现在主流的一些技术，估计作者安排这一块内容时也死了不少脑细胞。变化最大的当属代码优化，原来只有一章，现在一下子撑成了四章，洋洋洒洒近400页，可以单独成一本书了，较之第一版，作者似乎不满足于做一本入门教材，要一揽子把从入门到高级全包了。</p>
<p>其他内容上的变化，暂时只能从目录上看一下。Flow Analysis增加了一些较新的算法，比如Region-Based Analysis。优化部分花了不少力气讲Parallel Machine，现在看来也是大势所趋。</p>
<p>书肯定是不可能仔细看了；也不知道什么时候会有中文版；这么一本1000页的大砖头翻成中文后也不知道厚成什么样。我个人的一点观察，最近几年动态语言与函数式语言开始逐渐成为主流，用马克思的话，一个函数式编程的幽灵开始在C++/C#/Java中徘徊。现在的编译技术，似乎应该包括Dynamic Typing, JIT等等，特别是种种针对动态语言的优化（比如方法缓存）。作为一本教材，不可能面面俱到，更不能跟风，编者总有自己的原则和取舍，大概龙书的四位作者认为这些东西还不值得进入大学的编译技术课程。但我觉得现在正是一个计算环境变革的前夜；或者说变革已经在进行时了。这样的话，也许下一个版本，不用再让我们等20年。</p>
<p>说到这儿，又要损一下中国这帮写教科书的人。为了避免打击面过广，不失一般性，限定于计算机行业。老外写书，一版二版三版，真是与时俱进。当年Dirichlet写了一本数论讲义，每次重版他的学生Dedekind都会在后面添个附录反映一下最新的研究进展，到最后附录比正文还厚得多。在我国，就少见这种延续性。人家真是把教材当作一项事业来做的。中国最有名的计算机书估计是谭老师的C语言，去年貌似也出了个新版，除了换个封面，里面新瓶装旧酒，继续误人子弟。对谭老师C语言书的声讨网上已经进行多年，我也没有重复的必要。只是想到这些状况，不能不有点觉得外国月亮有点圆。</p>
<p>本来想把电子版放上来，但尺寸实在吓人（近50M)，我估计赛族上对这个感兴趣的人也不会太多，如果想要电子版的话，私人联系吧。当然直接google也可以。</p>
<p>下面是三版龙书封面展览：<br />
<a href='http://cmsir.scinese.com/files/2007/11/db_2.jpg' title='db_2.jpg'><img src='http://cmsir.scinese.com/files/2007/11/db_2.jpg' alt='db_2.jpg' /></a><a href='http://cmsir.scinese.com/files/2007/11/db_3.jpg' title='db_3.jpg'><img src='http://cmsir.scinese.com/files/2007/11/db_3.jpg' alt='db_3.jpg' /></a></p>
<p><a href='http://cmsir.scinese.com/files/2007/11/db_1.jpg' title='db_1.jpg'><img src='http://cmsir.scinese.com/files/2007/11/db_1.jpg' alt='db_1.jpg' /></a></p>
<p class="postviews_count">阅读(1172 次)</p>]]></content:encoded>
			<wfw:commentRss>http://cmsir.scinese.com/2007/11/12/%e9%be%99%e4%b9%a6%e7%ac%ac%e4%ba%8c%e7%89%88/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
