<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Chen Yufei's blog &#187; programming</title>
	<atom:link href="http://chenyufei.info/blog/tag/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://chenyufei.info/blog</link>
	<description>Keep your head about you while all those are losing theirs</description>
	<lastBuildDate>Wed, 21 Jul 2010 05:30:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Ch &#8212; 一个 C/C++ 解释器</title>
		<link>http://chenyufei.info/blog/2009-11-05/ch-a-c-and-cplusplus-interprete/</link>
		<comments>http://chenyufei.info/blog/2009-11-05/ch-a-c-and-cplusplus-interprete/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 17:14:08 +0000</pubDate>
		<dc:creator>chenyufei</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[compiler]]></category>

		<guid isPermaLink="false">http://chenyufei.info/blog/?p=258</guid>
		<description><![CDATA[动态语言很重要的一个功能就是支持交互式的开发，用惯了 Python 有时候非常希望 C 也能有一个解释器来用，尤其是忘了 C 的某些语法想写个简单的例子来测试的时候。 很久以前就搜过 C 的解释器，搜到过 Ch，不记得当时为什么没有试用过。今天下了个免费版本的用了下，很不错，支持 C90 和 C99 的主要功能，C++ 支持不完全（不过 C++ 我基本不关心）。 以前想要测试 C 的某个语法功能时会写个文件，int main 什么的搞一堆，然后用 tcc (Tiny C Compiler) 来测试。tcc 可以把 C 代码的编译和执行放在一步完成，执行 tcc -run foo.c 就可以看到效果了，还算方便。 用 Ch 就更方便了。ch 命令出来个交互式的 shell，输入 C 代码马上执行，调 printf 直接看到效果，输入变量就可以看到它的值（struct 的话可以看到每个成员的值），做点小的测试就不需要写 int main 之类的了。另外 ch 还有函数名补全。]]></description>
			<content:encoded><![CDATA[<p>动态语言很重要的一个功能就是支持交互式的开发，用惯了 Python 有时候非常希望 C 也能有一个解释器来用，尤其是忘了 C 的某些语法想写个简单的例子来测试的时候。</p>
<p>很久以前就搜过 C 的解释器，搜到过 <a href="http://www.softintegration.com/">Ch</a>，不记得当时为什么没有试用过。今天下了个免费版本的用了下，很不错，支持 C90 和 C99 的主要功能，C++ 支持不完全（不过 C++ 我基本不关心）。</p>
<p>以前想要测试 C 的某个语法功能时会写个文件，int main 什么的搞一堆，然后用 <a href="http://bellard.org/tcc/">tcc (Tiny C Compiler)</a> 来测试。tcc 可以把 C 代码的编译和执行放在一步完成，执行 <code>tcc -run foo.c</code> 就可以看到效果了，还算方便。</p>
<p>用 Ch 就更方便了。ch 命令出来个交互式的 shell，输入 C 代码马上执行，调 printf 直接看到效果，输入变量就可以看到它的值（struct 的话可以看到每个成员的值），做点小的测试就不需要写 int main 之类的了。另外 ch 还有函数名补全。</p>
]]></content:encoded>
			<wfw:commentRss>http://chenyufei.info/blog/2009-11-05/ch-a-c-and-cplusplus-interprete/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>对 Python 和 Ruby 的一点看法</title>
		<link>http://chenyufei.info/blog/2008-02-27/%e5%af%b9-python-%e5%92%8c-ruby-%e7%9a%84%e4%b8%80%e7%82%b9%e7%9c%8b%e6%b3%95/</link>
		<comments>http://chenyufei.info/blog/2008-02-27/%e5%af%b9-python-%e5%92%8c-ruby-%e7%9a%84%e4%b8%80%e7%82%b9%e7%9c%8b%e6%b3%95/#comments</comments>
		<pubDate>Wed, 27 Feb 2008 08:27:40 +0000</pubDate>
		<dc:creator>chenyufei</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://chenyufei.info/blog/2008-02-27/%e5%af%b9-python-%e5%92%8c-ruby-%e7%9a%84%e4%b8%80%e7%82%b9%e7%9c%8b%e6%b3%95/</guid>
		<description><![CDATA[还是从我在 Ruby 和 Python 上的经历说起吧。 大二暑假的时候学了 Ruby，但是到现在为止只用 Ruby 做过文本处理，还有一次做 Linux 网络编程作业的时候用 Ruby 实现了一个服务器的原型，还稍微尝试过一下 RoR，不过因为我对 Web 开发没什么兴趣，所以是浅尝辄止而已。平时自己机器上能够用到的 Ruby 程序也只有 deplate 而已。 今年寒假的时候开始考虑毕设的事情，考虑实现语言的时候也曾考虑过 Ruby。但是我要用的 dazuko 的 Ruby 绑定可能存在内存泄漏的问题，引起内存泄漏的原因应该在 Ruby 的实现上。考虑到 Python 的实现更成熟，对于要求稳定的系统程序来说可能更为合适而开始考虑 Python。于是开始看 Dive Into Python，被这本书吸引而继续学下去。我之前的介绍过这本书，很欣赏它。 最经开始更多的实际使用 Python 了，很自然的会想把它跟 Ruby 做些比较。因为我对 Ruby 和 Python 的语法和特性的了解只是一般而已，所以对语法的比较我说不出太多的东西。在我看来语法上来看它们相似的地方多于不同的地方，在它们中进行切换是很方便的。我很喜欢 Ruby 的 block 语法，但 Python 有 list comprehension 和 generator，很多 block 的用法都可以用它们来完成，所以我并不会在使用 [...]]]></description>
			<content:encoded><![CDATA[<p>还是从我在 Ruby 和 Python 上的经历说起吧。</p>
<p>大二暑假的时候学了 Ruby，但是到现在为止只用 Ruby 做过文本处理，还有一次做 Linux 网络编程作业的时候用 Ruby 实现了一个服务器的原型，还稍微尝试过一下 RoR，不过因为我对 Web 开发没什么兴趣，所以是浅尝辄止而已。平时自己机器上能够用到的 Ruby 程序也只有 deplate 而已。</p>
<p>今年寒假的时候开始考虑毕设的事情，考虑实现语言的时候也曾考虑过 Ruby。但是我要用的 dazuko 的 Ruby 绑定可能存在内存泄漏的问题，引起内存泄漏的原因应该在 Ruby 的实现上。考虑到 Python 的实现更成熟，对于要求稳定的系统程序来说可能更为合适而开始考虑 Python。于是开始看 Dive Into Python，被这本书吸引而继续学下去。我之前的介绍过这本书，很欣赏它。</p>
<p>最经开始更多的实际使用 Python 了，很自然的会想把它跟 Ruby 做些比较。因为我对 Ruby 和 Python 的语法和特性的了解只是一般而已，所以对语法的比较我说不出太多的东西。在我看来语法上来看它们相似的地方多于不同的地方，在它们中进行切换是很方便的。我很喜欢 Ruby 的 block 语法，但 Python 有 list comprehension 和 generator，很多 block 的用法都可以用它们来完成，所以我并不会在使用 Python 的时候非常的渴望 Python 也有 block 语法（仅有的时候是文件打开完成任务以后自动关闭这种地方，Python 里还没有很好的解决）。就语言本身来说我更喜欢 Ruby，个人觉得用 Ruby 写程序更为舒服，而且通常完成同样任务的 Ruby 程序也比 Python 更短。但是 Python 的优秀的社区使我选择 Python 而不是 Ruby。</p>
<p>在 Python 和 Ruby 中我只想选一个，用它来完成一些 quick and dirty 的任务，我希望一切越简单越好，最好就是别人已经帮我完成了，直接拿来用就可以。随着越来越多的使用 Python，看到 Python 社区所完成的工作，我觉得 Python 才是这一任务更好的选择。Guido 在一次访谈中说：</p>
<blockquote><p>
对于杀手锏应用（killer application），我个人并不十分迷信。如果你太看重杀手锏应用的话，实际上你可能会把焦点放错地方，或者你可能太专注于某一个方面。
</p></blockquote>
<p>以前对这话觉得不屑，觉得是酸葡萄心里而已，现在越来越觉得 Guido 是对的。Python 现在已经进入很多领域，在科研领域，已经出现像 NumPy, SciPy 这样优秀的软件。我也看到生物信息学研究者写的用 Python 编程来处理生物信息学问题的文章。在图形处理方面也有了优秀的软件，如 PIL。而 NASA, Google 等组织也在大量使用 Python。而在 Web 开发框架上，Python 有不止一个，另外还有像 twisted 这样高层的互联网应用程序开发框架。实现上 CPython 比 CRuby 也要成熟，两者都有许多实现，以前很看好 Rubinius，但现在我知道了 PyPy，如果 Rubinius 能够使得 Ruby 在性能上有很大的提升，那 PyPy 肯定也能，事实上 PyPy 现在应该比 Rubinius 更成熟。而我现在自己常用的 VCS 工具 Mercurial 就是用 Python 实现的。</p>
<p>从使用的广泛程度来说 Python 目前远超过 Ruby，记得 2008 年 1 月的程序设计语言使用广泛度统计中 Python 排名首次超过 Perl，而 Ruby 的排名反而下降了。不知道是因为 Python 有大量优秀的软件导致大量的使用，还是因为大量的使用导致有如此多优秀的软件，但现在的社区已经使得这两个方面可以互相促进，形成一个良性循环了。如果 Python 社区的注意力都集中在 Web 开发上，或许它可以出一个类似 RoR 的 killer application，但它就不会产生如此之多不同领域的优秀软件，也会使得 Python 的使用达不到如此广泛的程度。在我看来这是得不偿失的。</p>
<p>即使我不喜欢 Python 中一些 Guido 强加给我的限制，但是只要它能够让我把那些 quick and dirty work 以最快的速度最小的精力做完，我就不在乎，而那些限制在构建大型软件上可能反而能够带来好处。如果哪天 Ruby 能够像 Python 社区这样成熟，提供更多的优秀的软件，那我在解决个人的 quick and dirty work 时就会选择使用 Ruby。但是现在，我选 Python。</p>
<p>我仍然会花时间去学 Common Lisp，但 CL 现在不擅长跟 OS 和其他基础设施交互，所以我不会用它来完成日常的工作。我目前只打算想把它作为一个研究性质的语言，满足我对程序设计语言本身的兴趣。一方面，SLIME 提供的交互式的开发环境更加合适探索性的任务（ipython 虽然不错，但是跟 SLIME 和 CL 提供的环境比起来还是差了点）；另一方面，正因为有许多工作在 Common Lisp 中还没有完成，我可以尝试自己来研究解决，在其中得到锻炼。我也希望在真正领悟 Common Lisp 的时候我能够成为一个更好的程序员。</p>
<p>语言的选择并不是至关重要的，但是我希望能够使用一个使得编程更加有趣的语言。以前在语言上花了太多的时间，现在决定把语言逐渐固定下来，把注意力放到更加重要的问题上，为我以后的研究做准备。</p>
<p>PS:<br />
现在在浦口每天的时间都可以自己支配，太爽了 :-)</p>
<p>不过想看的书太多了宏观经济学（微观已经看完了），算法导论，线性代数，Ansi Common Lisp，还要每天在毕设上投入一点时间（现在还在准备阶段），再加上要利用本科最后这个学期好好练小提琴，有点安排不过来了。为了集中精力，有些书看了一点又要停下来了。</p>
<p>最近回到浦口真开心，爱死浦口的食堂了 :-) 我现在的日子跟查师兄去年的比真是太舒服了，这两天有点堕落，明天起要鞭策自己努力了。</p>
]]></content:encoded>
			<wfw:commentRss>http://chenyufei.info/blog/2008-02-27/%e5%af%b9-python-%e5%92%8c-ruby-%e7%9a%84%e4%b8%80%e7%82%b9%e7%9c%8b%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Weak Alias</title>
		<link>http://chenyufei.info/blog/2007-11-29/weak-alias/</link>
		<comments>http://chenyufei.info/blog/2007-11-29/weak-alias/#comments</comments>
		<pubDate>Thu, 29 Nov 2007 08:05:01 +0000</pubDate>
		<dc:creator>chenyufei</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://chenyufei.info/blog/2007/11/29/weak-alias/</guid>
		<description><![CDATA[Weak Alias 跟 Weak Reference 完全没有任何关系，不过是我在看到 Weak Reference 的时候想到的而已。 Weak Alias 是 gcc 扩展里的东西，实际上是函数的属性。这个东西在库的实现里面可能会经常用到，比如 glibc 里面就用了不少。抄录一段 gcc 手册里面的话解释下函数属性是干啥的， In GNU C, you declare certain things about functions called in your program which help the compiler optimize function calls and check your code more carefully. 先上代码，看看 weak alias 怎么写。第一个文件 dummy.c 内容， #include &#60;stdio .h&#62; &#160; /* [...]]]></description>
			<content:encoded><![CDATA[<p>Weak Alias 跟 Weak Reference 完全没有任何关系，不过是我在看到 Weak Reference 的时候想到的而已。</p>
<p>Weak Alias 是 gcc 扩展里的东西，实际上是函数的属性。这个东西在库的实现里面可能会经常用到，比如 glibc 里面就用了不少。抄录一段 <a href="http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html">gcc 手册</a>里面的话解释下函数属性是干啥的，</p>
<blockquote><p>
In GNU C, you declare certain things about functions called in your program which help the compiler optimize function calls and check your code more carefully.
</p></blockquote>
<p>先上代码，看看 weak alias 怎么写。第一个文件 dummy.c 内容，</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio .h&gt;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* Do some thing. */</span>
<span style="color: #993333;">int</span> __foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    puts<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;I do no thing.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> __attribute__ <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>weak<span style="color: #339933;">,</span> alias<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;__foo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>stdio<span style="color: #339933;">&gt;</span></pre></div></div>

<p>weak 和 alias 分别是两个属性。weak 使得 <code>foo</code> 这个符号在目标文件中作为 weak symbol 而不是 global symbol。用 <code>nm</code> 命令查看编译 dummy.c 生成的目标文件可用看到 foo 是一个 weak symbol，它前面的标记是 W。</p>
<pre>
00000000 T __foo
00000000 W foo
         U puts
</pre>
<p>而 alias 则使 <code>foo</code> 是 <code>__foo</code> 的一个别名，__foo 和 foo 必须在同一个编译单元中定义，否则会编译出错。</p>
<p>那么这个东西的用处是？看第二个文件，func.c,</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio .h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> foo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    puts<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;I do something.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>stdio<span style="color: #339933;">&gt;</span></pre></div></div>

<p>这里有一个函数名字是 <code>foo</code>。如果我们编译 func.c 和 dummy.c 得到两个目标文件，当我们同时使用 func.o 和 dummy.o 和其他目标文件进行链接时，如果其他目标文件里面引用符号 <code>foo</code>，最终使用到的是 func.c 中定义的函数，而不是 <code>__foo</code>，虽然它有一个别名 <code>foo</code>。也就是说，我们最终使用到的函数会是“实际做事”的那个函数。当然，单独使用 dummy.o 链接的话使用的是那个“不做事”的函数。如果 dummy.o 中的 <code>foo</code> 不是 weak symbol 的话，在链接时会产生冲突，这就是我们要使用 weak 的原因。</p>
<p>glibc 的实现里面经常用 weak alias。比如它的 <code>socket</code> 函数，在 C 文件里面你会看到一个 <code>__socket</code> 函数，它几乎什么都没有做，只是设置了一些错误代码，返回些东西而已。在同一个 C 文件里面会再声明一个 <code>__socket</code> 的 weak alias 别名 <code>socket</code>。实际完成工作的代码通过汇编来实现，在另外的汇编文件里面会有设置系统调用号，执行 <code>sysenter</code> 或者 <code>int</code> 等动作去请求系统调用。以前看 glibc 里面系统调用的实现的时候郁闷过很久，就是那个时候才知道了 weak alias 这个东西。</p>
]]></content:encoded>
			<wfw:commentRss>http://chenyufei.info/blog/2007-11-29/weak-alias/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Weak Reference</title>
		<link>http://chenyufei.info/blog/2007-11-29/weak-reference/</link>
		<comments>http://chenyufei.info/blog/2007-11-29/weak-reference/#comments</comments>
		<pubDate>Thu, 29 Nov 2007 07:40:34 +0000</pubDate>
		<dc:creator>chenyufei</dc:creator>
				<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://chenyufei.info/blog/2007/11/29/weak-reference/</guid>
		<description><![CDATA[看到了这篇 blog 文章，Understanding Weak Reference。作者说很多 Java 程序员都不知道什么是 weak reference，他的评论至少对我来说是对的。不过这也证明了 Java 的一点好处就是即使你不是很懂 Java 也能用 Java 写程序，不过写的比较烂而已。有人说 Java 程序通常都是一团糟，其实是因为用 Java 写程序的人有许多都不能算合格的 Java 程序员，从这一点上来说这又是 Java 的缺点。扯远了，总之，我觉得我的 Java 不合格，学 Java 还从来没有完整看过哪怕一本书，或许看过了的话就不会连这个在 Java 里有了近一个年代的东西都完全不知道…… 回到正题上来。Weak Reference 是什么？其实是跟垃圾收集相关的东西。我做个原文摘要，有兴趣的看原文吧。 有 Weak Reference 当然也有 Strong Reference。其实我们常用的引用就是 strong reference，比如下面代码就会创建一个 strong reference。 Object foo = new Object(); 执行上面代码的时候将创建一个对象，变量 foo 中存放了这个对象的 Strong Reference，利用它可以访问到该对象。 记住一点，只要有 Strong Reference [...]]]></description>
			<content:encoded><![CDATA[<p>看到了这篇 blog 文章，<a href="http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html">Understanding Weak Reference</a>。作者说很多 Java 程序员都不知道什么是 weak reference，他的评论至少对我来说是对的。不过这也证明了 Java 的一点好处就是即使你不是很懂 Java 也能用 Java 写程序，不过写的比较烂而已。有人说 Java 程序通常都是一团糟，其实是因为用 Java 写程序的人有许多都不能算合格的 Java 程序员，从这一点上来说这又是 Java 的缺点。扯远了，总之，我觉得我的 Java 不合格，学 Java 还从来没有完整看过哪怕一本书，或许看过了的话就不会连这个在 Java 里有了近一个年代的东西都完全不知道……</p>
<p>回到正题上来。Weak Reference 是什么？其实是跟垃圾收集相关的东西。我做个原文摘要，有兴趣的看原文吧。</p>
<p>有 Weak Reference 当然也有 Strong Reference。其实我们常用的引用就是 strong reference，比如下面代码就会创建一个 strong reference。</p>
<pre>
Object foo = new Object();
</pre>
<p>执行上面代码的时候将创建一个对象，变量 foo 中存放了这个对象的 Strong Reference，利用它可以访问到该对象。</p>
<p>记住一点，<strong>只要有 Strong Reference 指向对象，这个对象就不会被垃圾收集器回收</strong>。Weak Reference 同样用来引用对象，但是 Weak Reference 指向的对象是可能被回收的，比如当没有 Strong Reference 指向它的时候。</p>
<p>那么什么时候可能用到 Weak Reference？看看下面几个场景。</p>
<ol>
<li>你想给对象附加一些信息，于是你用一个 Hashtable 把对象和附加信息关联起来。你不停的把对象和附加信息放入 Hashtable 中，但是当对象用完的时候，你不得不把对象再从 Hashtable 中移除，否则它占用的内存变不会释放。万一你忘记了，那么没有从 Hashtable 中移除的对象也可以算作是内存泄漏。<strong>理想的状况应该是当对象用完时，Hashtable 中的对象会自动被垃圾收集器回收，不然你就是在做垃圾回收的工作了。</strong></li>
<li>你想实现一个图片缓存，因为加载图片的开销比较大。你将图片对象的引用放入这个缓存，以便以后能够重新使用这个对象。但是你必须决定缓存中的哪些图片不再需要了，从而将引用从缓存中移除。<strong>不管你使用什么管理缓存的算法，你实际上都在处理垃圾收集的工作，更简单的办法（除非你有特殊的需求，这也应该是最好的办法）是让垃圾收集器来处理，由它来决定回收哪个对象。</strong></li>
</ol>
<p>Weak Reference 这时候就能派上用场了。<strong>把对象的 weak reference 放入 Hashtable 或者缓存中，当没有 strong reference 指向他们的时候，对象就可以被垃圾收集器回收了。</strong>实际上，有一个 WeakHashMap 就是专门做这个事的。<br />
<strong><br />
那么怎样创建对象的 weak reference 呢？</strong>很简单，Java 标准库中有个类 WeakReference，</p>
<pre>
WeakReference weakref = new WeakReference(ref);
</pre>
<p>这样 weakref 就是 ref 指向对象的一个 weak reference。要引用这个 weak reference 指向的对象可以用 get 方法。</p>
<pre>
Object ref = weakref.get();
</pre>
<p>注意，get 可能返回 null，这时原先指向的对象就不可用了，它可能已经被回收了。</p>
<p>除了 Weak Reference 以外还有 Soft Reference, Phantom references。更多内容除了参考那篇 blog 原文，也可以参考 JDK 文档的 java.lang.ref 包和相关类的文档。我对对象什么情况下可用被回收的解释可能不是完全正确，那个 WeakReference 的文档的解释实在是……如发现错误请纠正。</p>
]]></content:encoded>
			<wfw:commentRss>http://chenyufei.info/blog/2007-11-29/weak-reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Squeak &#8212; 很卡通的 Samlltalk 开发环境</title>
		<link>http://chenyufei.info/blog/2007-11-06/squeak-%e5%be%88%e5%8d%a1%e9%80%9a%e7%9a%84-samlltalk-%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83/</link>
		<comments>http://chenyufei.info/blog/2007-11-06/squeak-%e5%be%88%e5%8d%a1%e9%80%9a%e7%9a%84-samlltalk-%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83/#comments</comments>
		<pubDate>Tue, 06 Nov 2007 07:44:15 +0000</pubDate>
		<dc:creator>chenyufei</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[smalltalk]]></category>

		<guid isPermaLink="false">http://chenyufei.info/blog/2007/11/06/squeak-%e5%be%88%e5%8d%a1%e9%80%9a%e7%9a%84-samlltalk-%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83/</guid>
		<description><![CDATA[最近没有怎么看 Common Lisp 方面的东西，时间用来看书和研究 Rubinius 的代码了。（当然，上网也浪费了不少时间 :-( ）之前玩了下 Squeak，发现 Smalltalk 跟 Lisp 很像，尤其是他们完全交互式的开发环境，也看到 Ruby 从 Smalltalk 吸收到的东西，比如 block 的语法就跟 Smalltalk 的语法很像，还有对象系统。Squeak 的开发环境好卡通(自己试试看就知道卡通是什么意思了)，看了下 image file 包里面的 Welcome 文件，发现这么几行： Portions of Squeak are: Copyright (c) 1996 Apple Computer, Inc. Copyright (c) 1997-2001 Walt Disney Company, and/or Copyrighted works of many other contributors. All rights reserved. Walt Disney！完全没有想到，这是我第一次在软件中看到迪斯尼公司的名字。不过这个倒也解释了为什么 [...]]]></description>
			<content:encoded><![CDATA[<p>最近没有怎么看 Common Lisp 方面的东西，时间用来看书和研究 Rubinius 的代码了。（当然，上网也浪费了不少时间 :-( ）之前玩了下 Squeak，发现 Smalltalk 跟 Lisp 很像，尤其是他们完全交互式的开发环境，也看到 Ruby 从 Smalltalk 吸收到的东西，比如 block 的语法就跟 Smalltalk 的语法很像，还有对象系统。Squeak 的开发环境好卡通(自己试试看就知道卡通是什么意思了)，看了下 image file 包里面的 Welcome 文件，发现这么几行：</p>
<blockquote><p> Portions of Squeak are:</p>
<p>Copyright (c) 1996 Apple Computer, Inc.<br />
Copyright (c) 1997-2001 Walt Disney Company, and/or<br />
Copyrighted works of many other contributors.<br />
All rights reserved.</p></blockquote>
<p>Walt Disney！完全没有想到，这是我第一次在软件中看到迪斯尼公司的名字。不过这个倒也解释了为什么 Squeak 的吉祥物是只小老鼠 :-)。</p>
<p>Smalltalk 的开发环境很特别，看起来像是一个完整的桌面系统，有文件浏览器，编辑器，桌面等等，很特别。当然，对这样的环境不是很习惯，因为没有 vim 等工具可以使用了，窗口切换之类的也得用鼠标来（有快捷键的话暂时也不知道）。在现在的图形环境下让一个语言包含这样完整的图形系统可能意义不大，但是 Smalltalk 诞生在 Macintosh 之前，它在那个年代就创建了这样的图形环境，是它影响了 Macintosh，Windows。</p>
<p><a href="http://www.bitwisemag.com/copy/programming/smalltalk/smalltalk1.html">这里</a>是一篇 Squeak 的不错的 tutorial，抄一段它对 Smalltalk 历史的介绍：</p>
<blockquote><p>  Smalltalk is undoubtedly one of the most influential programming languages ever developed. It was created way back in the ‘70s and early &#8217;80s at a time when many programmers were still entering code at a command prompt rather than into a half-way decent text editor.</p>
<p>Smalltalk was to change all that. Unlike other languages, Smalltalk had its own dedicated user interface. Its programming environment included a multi-font editor, a graphical debugger, overlapping windows and pop-up mouse menus. Indeed, it was this environment that provided the inspiration both for the Macintosh and, later on, for Windows.</p></blockquote>
<p>现在看 Smalltalk 的语法总觉得有点诡异，但它作为对 OO 产生重要影响的一个非常有影响力的语言，很多的程序员都认为它是有必要学习一下的。不过时间有限，我没有打算认真学 Smalltalk，只准备做点简单的了解。</p>
]]></content:encoded>
			<wfw:commentRss>http://chenyufei.info/blog/2007-11-06/squeak-%e5%be%88%e5%8d%a1%e9%80%9a%e7%9a%84-samlltalk-%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
