代码改变世界

随笔分类 - 03. 语言编程

最容易令初学者混乱的F#命令

2010-03-31 12:39 by Jeffrey Zhao, 6348 阅读, 收藏, 编辑
摘要:话说,其实我也是F#的初学者,至少相对于C#等语言来说一定是这样的。而对于初学者,或是C#和F#混用的程序员来说,我认为最F#中最容易令人混乱的命令是Reference Cells的取值操作了。下面便详细谈谈这么说的原因,及建议的应对方法。 阅读全文

F#中的异步及并行模式(3 - 下):代理的进一步使用

2010-03-21 18:19 by Jeffrey Zhao, 6017 阅读, 收藏, 编辑
摘要:之前的文章中我们了解了F#中并行及交互式程序的编程方式。在本系列的第3部分中,我们会来探索F#中轻量级的,交互式的代理,以及与代理有关的一些模式,包括隔离的内部状态。(译注:由于原文内容较多,译文拆成两段进行。在上半段文章中讨论了代理的基本使用方式,而下半段则讨论关于代理使用中更进一步的模式。) 阅读全文

F#中的异步及并行模式(3 - 上):代理的基本使用

2010-03-15 01:35 by Jeffrey Zhao, 7017 阅读, 收藏, 编辑
摘要:之前的文章中我们了解了F#中并行及交互式程序的编程方式。在本系列的第3部分中,我们会来探索F#中轻量级的,交互式的代理,以及与代理有关的一些模式,包括“隔离的内部状态”。(译注:由于原文较长,因此译文分为两段,目前是第一段,讲解了F#中异步代理的基本使用方式。) 阅读全文

F#中的异步及并行模式(2):反馈进度的事件(包含Twitter示例)

2010-03-08 00:33 by Jeffrey Zhao, 7214 阅读, 收藏, 编辑
摘要:上一篇文章中谈到,“异步CPU并行”与“异步I/O并行”两个模式的限制之一便是无法通知组合操作的进度或结果。在这篇文章中,我们讲关注一个常见的异步模式:反馈进度的事件(Reporting Progress with Events),这是一种用于强大而优雅的做法,用于在某个边界之后对并行的执行过程加以封装,并同时汇报执行的结果或是进度。在文章最后,我们会使用这个设计模式开发一个示例,从Twitter中获取一系列记录。 阅读全文

F#中的异步及并行模式(1):并行CPU及I/O计算

2010-03-03 23:37 by Jeffrey Zhao, 8825 阅读, 收藏, 编辑
摘要:F#是一门并行(parallel)及响应式(reactive)语言。这个说法意味着一个F#程序可以存在多个进行中的运算(如使用.NET线程进行F#计算),或是多个等待中的回应(如等待事件或消息的回调函数及代理对象)。 F#的异步表达式是简化异步及响应式程序编写的方式之一。在这篇及今后的文章中,我会探讨一些使用F#进行异步编程的基本方式──大致说来,它们都是F#异步编程时使用的模式。我们从两个简单的设计模式开始:CPU异步并行(Parallel CPU Asyncs)和I/O异步并行(Paralle I/O Asyncs)。 阅读全文

为什么JVM上没有C#语言?浅谈Type Erasure特性

2010-02-22 23:50 by Jeffrey Zhao, 16871 阅读, 收藏, 编辑
摘要:JVM上目前已经有许多语言了:JRuby,Jython,也有一些特定于JVM平台的语言,如Scala和Groovy等。但是,为什么JVM上没有C#语言呢?按理说,这门和Java十分相似,却又强大许多的语言更容易被Java程序员接受才对。有人说,Sun和微软是对头,怎么可能将C#移植到JVM平台上呢?嗯,有道理,但是为什么社区里也没有人这么做呢(要知道JVM上其他语言都是由社区发起的)?其实在我看来,这是受到了技术方面的限制。例如:Type Erasure。 阅读全文

哥谈的是语言,不是寂寞

2010-02-20 21:48 by Jeffrey Zhao, 14785 阅读, 收藏, 编辑
摘要:经常看到一些文章在谈论语言,例如“哪个语言更有前途”,“语言选择是否关键”。我是个语言粉丝,但是看到这些文章总有一些奇怪的感觉。因为在我看来,这些文章谈的东西都不是我眼中的语言——可能与国内技术环境有关,语言本身被淡化了,例如,谈语言的时候涉及更多的却是“平台”方面的内容。那么我现在便来描述一下我眼中的“语言”该如何谈论吧——下次在我猛砍Java语言时也好有个参考。 阅读全文

人肉反编译使用yield关键字的方法

2010-01-26 00:06 by Jeffrey Zhao, 11922 阅读, 收藏, 编辑
摘要:我认为这是一个真命题:“没有用.NET Reflector反编译并阅读过代码的程序员不是专业的.NET程序员”。.NET Reflector强大的地方就在于可以把IL代码反编译成可读性颇高的高级语言代码,并且能够支持相当多的“模式”,根据这些模式它可以在一定程度上把某些语法糖给还原,甚至可以支持简单的Lambda表达式和LINQ。只可惜,.NET Reflector还是无法做到极致,某些情况下生成的代码还是无法还原到易于理解——yield关键字便是这样一个典型的情况。不过还行,对于不复杂的逻辑,我们可以通过人肉来“整理”个大概。 阅读全文

按月统计博客园单个用户的发文数量

2010-01-11 00:07 by Jeffrey Zhao, 7966 阅读, 收藏, 编辑
摘要:这几天在家闲着,便试着写一些小程序。之前有朋友问到“F#能不能写Web”,于是我也就打算这么一试。虽然我能肯定,用F#写Web应用程序不会是问题,不过倒真还没有做过这方面的尝试。我想,如果用F#写Web应用程序,那么它很重要的一点,应该是利用其在异步编程方面的强大特性。最后我决定,使用F#编写一个按月统计博客园单个用户发文数量的简单服务。尝试的结果是——还有些问题没有解决。不管怎么样,我先把其主体逻辑描述一下吧。 阅读全文

浅谈代码的执行效率(2):编译器的威力

2010-01-08 00:06 by Jeffrey Zhao, 11665 阅读, 收藏, 编辑
摘要:在上一篇文章中,我主要表达了这样一个观点:影响程序效率的关键之一是算法,而算法的选择与优化,和是否多一个赋值少一个判断的关系不大。关于算法的选择,我谈到其理论上的复杂度,并不直接反映出效率。因为在实际运用时,数据的规模,形式等等都会涉及到算法的实际效用。一个时间复杂度低的算法并不代表任何情况下的效率都高。这是“实际”和“理论”的区别之一。现在我打算来谈一下另一个比较“实际”的东西:编译器对于程序效率的影响。 阅读全文

浅谈代码的执行效率(1):算法是关键

2010-01-07 17:14 by Jeffrey Zhao, 14557 阅读, 收藏, 编辑
摘要:前一段时间在博客园里看到这样一篇文章,那位兄弟谈到程序效率的关键是“简短”。他说,“程序越简短,其可执行代码就越少,就越有效率”,而在编写程序的时候,“要尽量改进我们的算法,而改进算法中最重要的一条,就是减少语句”。这句话从表面上似乎正确,但我认为性能这问题不能用“简短”这种方式去思考,否则会进入一些误区。我整理了一下思路,希望可以从几个方面把详细谈一下这个问题。首先我想说的是:“简短”不是关键,“算法”更加重要。 阅读全文

一次批量修改博客文章的经验(下):操作过程

2010-01-05 19:40 by Jeffrey Zhao, 5451 阅读, 收藏, 编辑
摘要:上一篇文章中我们进行了一些预备工作,主要是了解了该如何使用MetaWeblog API读取和修改博客园的文章——包括同步和异步两种调用方式。此外,由于F#在异步调用方面的优势,我决定使用F#来完成批量修改文章任务。这个任务并不困难,但很“危险”,一旦出错可能之前的文章就无法恢复了。因此,我把这个任务拆成多个步骤,每个步骤都会将数据保存在硬盘上。由此,即便出错,还是有挽回的余地。 阅读全文

一次批量修改博客文章的经验(上):准备工作

2010-01-04 18:57 by Jeffrey Zhao, 6677 阅读, 收藏, 编辑
摘要:这几天赋闲在家,除了看书和还债(如RSS订阅),终于把一直以来想做却拖着的事情完成了:批量去除博客文章段首的空格。这个过程并不难,只需要按部就班地去做就行了,一切资料都可以在互联网上搜索到。不过我还是打算记录一下,也是为了今后再做类似工作时有个参考,少走一些弯路。 阅读全文

F#中的XML序列化

2010-01-03 21:24 by Jeffrey Zhao, 7527 阅读, 收藏, 编辑
摘要:这两天在用F#写一小段代码,需要把一些对象存到外部文件中去。这个功能很容易,因为.NET本身就内置了序列化功能。方便起见,我打算将这个对象序列化成XML而不是二进制数据流。这意味着我需要使用XmlSerializer而不是BinaryFormatter。这本应没有问题,但是在使用时候还是发生了一些小插曲。 阅读全文

五十种语言的“圣诞快乐”(下):F#实现

2009-12-28 11:18 by Jeffrey Zhao, 7182 阅读, 收藏, 编辑
摘要:不知道大家的圣诞节过的如何?有没有玩点啥有趣的东西?上次的文章中我们主要分析了使用Google Translate进行文字翻译的方式,并使用C#写了一个简单的的翻译程序,效果良好。不过,在平时开发过程中,对于此类问题我常用F#来解决这样的问题。那么使用F#来实现此类任务有什么优势吗?不错,我们现在便来看看这个问题。 阅读全文

五十种语言的“圣诞快乐”(上):分析与实现

2009-12-25 11:17 by Jeffrey Zhao, 7834 阅读, 收藏, 编辑
摘要:您知道“圣诞快乐”在不同语言中的写法吗?Google Translate知道。不过Google Translate好像并不希望我们可以直接获得这些内容——但这并不能阻止我们这些光荣的程序员来获得这些信息。 阅读全文

在.NET平台上使用Scala语言(下):分析

2009-12-21 00:30 by Jeffrey Zhao, 7416 阅读, 收藏, 编辑
摘要:上一篇文章里我们简单尝试了在Scala里编写.NET应用程序。这个过程并不困难,因为似乎Scala官方已经对此已经有较好的支持了。我们要做的只是“获取工具”,“编译成IL”,最后再“生成程序集”即可。那么,这些工具究竟做了些什么,Scala究竟又是如何支持.NET平台的,它的可用性究竟如何,我们还需要进一步的分析及尝试。 阅读全文

在.NET平台上使用Scala语言(上):初尝

2009-12-18 12:47 by Jeffrey Zhao, 11098 阅读, 收藏, 编辑
摘要:Scala是Java平台上的一门新兴起的语言,我也不止一次在博客上提到它。我非常希望它可以取代Java这种劣质语言,让Java平台的生产力上一个台阶。事实上,Scala从一开始——或者说“很早”就对生成.NET程序集提供了支持。只可惜,毕竟还是Java平台的东西,.NET方面的资源少之又少,不过我们还是可以进行一番尝试的。 阅读全文

总结一下F#中运算符的定义规则

2009-12-14 01:46 by Jeffrey Zhao, 6309 阅读, 收藏, 编辑
摘要:F#允许开发人员定义或重载各类运算符,合理利用这一规则可以让编程变得方便,让代码更容易阅读。例如,在使用F#的MailboxProcessor的时候,我会习惯于定义一个运算符来代替显式的Post操作。不过,F#的运算符定义规则较为复杂,要搞清楚编译器的整体处理方式着实花费了一番功夫。比较奇怪的是,即便是《Expert F#》中对于这个话题也没有详细的叙述——更夸张的是MSDN的文档也相当马虎,甚至有代码缺失以及与试验不符情况(因为还没有正式发布?)。于是我连看带试,最终打算总结一番,作为备忘的同时也算是补充互联网资源。 阅读全文

数十行F#打造简易Comet聊天服务

2009-12-11 12:00 by Jeffrey Zhao, 11664 阅读, 收藏, 编辑
摘要:普通的Web应用程序,都是靠大量HTTP短连接维持的。如实现一个聊天服务时,客户端会不断轮询服务器端索要新消息。这种做法的优势在于简单有效,因此广为目前的聊天服务所采用。不过Comet技术与之不同,简单地说,Comet便是指服务器推(Server-Push)技术。它的实现方式是(这里只讨论基于浏览器的Web平台)在浏览器与服务器之间建立一个长连接,待获得消息之后立即返回。否则持续等待,直至超时。客户端得到消息或超时之后,又会立即建立另一个长连接。Comet技术的最大优势,自然就是很高的即使性。而F#实现一个Comet原型,只要几十行代码。 阅读全文