很简单,老服务器不行了,空间提供商正在抓紧时间更换服务器。

PS:昨晚利用服务器空闲时间,刚刚把WordPress升级到最新版本——2.8,今天正好“借题挥发”一下,试一试新版本中的“快速发布”功能。

言归正传。对一些表示虚义的词,应该利用“意会”来“翻译”,如果非要“言传”这些词,即非要直译其字面意思,结果不是啰里啰嗦,就是不伦不类;举两个小例子:

[例1]The most significant change reflected in this thenth edition is a new chapter on computer graphics(Chapter 10).

如果把这句话里的reflected in翻译出来,效果并不好。如:“第10版中反映出的最大变化是关于计算机图形学的新的一章(第10章)”

仔细咂吧咂吧滋味,好像是不会说中国话的人翻译的。没错,这种多此一举的翻译,恰好应了中国的一个成语,即“画蛇添足”。你看,要是去其两“足”,只剩下“第10版最大的变化是新增了关于计算机图形学的一章(第10章)”,岂不更简练、更明确?

[例2]Most of this chapter focuses on the discipline of 3D graphics in which abstract models of three-dimensional worlds are encoded and then used to produce two-dimensional images.

没错,引导定语从句的in which是万万不可“言传”的。你猜自怎么着,硬是有“敢为天下先”的,看人家翻译的:“这一章的大部分内容集中在3D图形学科,其中对三维现实世界的抽象模型被编码,然后用来生成二维图像”。

in which引导的定语从句,如果相对较短,可以让它直接“修饰中心词”(即此处的宾语discipline of 3D graphics);如果像这里比较长,就要郑重其事一点,给人家一套独立的谓语结构,不要舍不得。比如:“这一章的大部内容集中在3D图形学方面,也就是如何对三维现实世界的抽象模型进行编码,然后再据以生成二维图像的技术”。

类似地,in that、in ways都不能“言传”,而是要“意会”。归根到底,还是那句话:翻译要翻译意思,不是翻译字面。

Tags:

未刊印的译者序

2009年06月8日 原创, 翻译

引子
这是为去年12月出版的《Google Web Toolkit应用程序开发》写的译者序;遗憾的是,(估计是)由于文字过于随意,被“咔嚓”了。2009年1月,《Google Web Toolkit开发实战》出版,加上《Google Web Toolkit应用程序开发》,是当时国内唯一两本介绍GWT的书,而且恰好一本介绍原理、一本介绍实例。

Ryan Dewsbury,一介技术人员,关注非技术性的用户体验——软件应该带给用户流畅、无障碍的感觉——由来已久。溯本求源,概肇始于他本人曾受到C++模板技术生成代码的强烈震撼。那种如饮甘醴、如沐春风的感觉,让这位C++程序员久久不能释怀。然而,离开工作单位,面对作为软件用户的非技术人员(家人、朋友)却又无法言传那种美妙的“用户体验”。这让他很不爽!——“我决定抽时间编写一个客户端应用程序,让它带给用户的优雅体验,就如同开发者看到写得漂亮的代码一般”。

于是,他用C++开发了一款体积小巧、界面简洁,类似今天Google Talk的即时通信软件。结果受到用户追捧,达到百万级的下载量——简洁作为一种价值观,与full-function(全功能)相对;这与Google对用户体验的理解不谋而合。但是,C++做界面似乎笨拙了点,因此简单的HTML+CSS时常令他心驰神往。

2005年,Ajax被人发现了。虽然基于Ajax技术的Google Maps让Ryan Dewsbury惊呼:桌面级用户体验现身于Web了!然而,在了解“事实真相”后,又不免“怅然若失”——“我知道使用JavaScript存在着很多的局限性。由于这些局限性,几乎不可能用它来构建一个大型复杂的客户端应用程序”——潜台词:“浴火重生”的JavaScript虽然强大,但浏览器不兼容性问题太严重,学起来简直烦人透顶,哪有丝毫“用户体验”可言?简直令人失望至极。更何况,一人之力怎与Goolge的Maps团队相比呢?看来是没有希望开发出具有Google Maps般用户体验的Web应用程序了,唉!

但是,峰回路转,在Ryan Dewsbury熟悉的Java语言与能带给用户更好体验的Ajax应用程之间架起一座“彩虹桥”的Google Web Toolkit(GWT)发布了。真的吗?可以用Java开发Ajax应用程序——不用学习JavaScript、不必面对复杂的浏览器兼容性问题?呵呵——当然要“抢鲜”试一试喽。

结果,仅用3周时间,Ajax应用程序Gpokr诞生了,而且全Java开发;这是一个在线游戏应用程序。发布以后,引得GWT开发团队的高人纷纷赶来试用。在感谢这些GWT“之父”们之后,Ryan Dewsbury没忘提一句“最让我激动不已的,就是GWT编译器能够把优美的Java代码转换成JavaScript”——这不正是自己魂牵梦萦、上下求索的代码生成技术的翻版吗?对Java技术人员及至本书作者而言,GWT相当于提供了C++中的模板技术。GWT编译器就是代码生成器,能把Java代码转换成JavaScript——简直重现了作者当年的那种如饮甘醴、如沐春风的感觉,很有点天作之合的味道,不是吗?接着,作者又发感慨“于是,任何人都可以创建向用户交付美好体验的应用程序,而可靠的GWT则给我留下了深刻的印象”,这不是如获至宝的感觉是什么?

分享分享分享,强烈的“共产主义”精神,反复地刺激着从未写过书的Ryan Dewsbury的思想深处,他的灵魂所在地。对呀,要是写本书就好了,这么一个“令人惊叹的工具”哪能没本书来宣传宣传呢?当时市面上还没有出GWT的书,不过Ryan Dewsbury也没有写书经验。没写过怎么了,反正“当时可以说也没有什么人对GWT很在行”。不会写,先做例子呀!通过做例子,既能搞通GWT,又能掌握相关的Web技术。来他个博观约取、厚积薄发……总之,先埋头编上几个月的程序再说。

Ryan Dewsbury

当然,最好是找几个流行的Ajax应用程序参考着做。比如:Google Start Page(http://www.google.com/ig)、基于Ajax的多搜索引擎集成、Blog文章编辑器、即时通信系统(这个简单,以前用C++就做过,呵呵。不过,这次要基于开发网页了)。最后,来个更牛的基于网页编辑数据库的程序(这个好像跟那个管理MySql的phpAdmin类似,不过那是管理本地数据库文件,而这个管理的则是远程数据库,厉害吧)。嘿,还别说,几个例子做下来,对GWT简直门清了,以前那些似是而非的Web概念也都清晰了。嗯,写书这个想法还真不错哩。

又经过几个月的日夜奋战,本书就新鲜出炉了。

官方网站原文:Learning Objective-J


内存管理

JavaScript有垃圾收集机制,Objective-J同样也有,因此Objective-C中出现的保持或释放内存的代码,在Objective-J中是看不到的。DOM操作导致的很多常见的内存泄漏问题,Cappuccino框架可以帮我们处理。

但这并不是说对象不可能泄漏。任何垃圾收集语言(language),都有可能偶尔保持对象引用而不释放,这一点应该正确看待。

类目

通过类目(Categories)可以为类添加方法,而不必创建新的子类或修改类的源代码。当类目被加载后,新方法(或方法)就会变成所有类实例的一部分。

这一特性在很多情况下都很有用,例如,可以利用它为内置类添加方法。假设我们想让所有CPString对象都具有一个能够返回反转字符串的方法,可以像下面这样定义一个类目:


@import <Foundation/CPString.j>

@implementation CPString (Reversing)

- (CPString)reverse
{
    var reversedString = "",
        index = [self length];

    while(index--)
        reversedString += [self characterAtIndex:index];

    return reversedString;
}

@end

这样,就可以在任何字符串上调用reverse来取得反转字符串了。


var myString = "hello world";
var reversed = [myString reverse];
alert(reversed);  // alerts "dlrow olleh"

定义类目的语法是@implementation,后跟要添加到的那个类,再后跟括在括号中的类目名称。在@end关键字之前添加的任何方法,都将成为类目的一部分。注意,不能通过类目添加实例变量,尽管可以动态修改JavaScript对象,也不能添加。

在上面reverse方法的实现中,有几个特别值得一提的地方。例如,reversedString是按照声明JavaScript字符串的典型方式声明的。这完全归功于一种名叫“免费(toll-free)”的技术,借助该技术任何JavaScript对象(如数组或字符串),可以同时作为JavaScript对象和Cappuccino对象存在。因此,这个字符串可以调用CPString的length和characterAtIndex:等方法,也可以调用现有的JavaScript方法和运算符(如+)。

作用域

多数情况下,Objective-J与JavaScript的作用域规则是相同的。没有以var特别声明的变量就是全局变量,而使用var声明的变量则具有函数/方法级的作用域。不符合这两条规则的变量是实例变量和文件作用域变量。

本教程前面曾介绍过,实例变量通过@implementation块声明。当在类中使用那些变量时,它们具有对象级作用域——不是全局作用域,只属于每个对象实例。但是,如果忘记声明了某个实例变量,那么该变量就像在JavaScript代码中一样,会变成全局变量。

文件作用域变量则是Objective-J新引入的一种变量。如果是在函数或方法实现的外部使用var关键字声明一个变量,则该变量(有时候也称其为静态变量)就具有文件级作用域。这种变量可以被同一文件中的其他代码访问。这种变量对于不依赖全局对象而实现各种共享对象的技术提供了便利。如果文件中只包含一个类,也可以把这种变量看成是“类变量”。

以下代码展示了Objective-J中主要的作用域规则:


globalScoped = "this becomes global"; //这是一个全局变量
var fileScoped = "this stays scoped in the file"; //这样可以把作用域限制在文件中

@implementation Foo : CPObject
{
    CPString objectScoped;
}

- (void)baz
{
    var methodScoped;

    methodScoped = "function scope, declared with var"; //通过var声明的变量具有函数级作用域
    anotherGlobal = "global scope, no var"; //没有使用var声明的变量具有全局作用域
    objectScoped = "still object scoped"; //仍然还具有对象级作用域
    fileScoped = "still file scoped"; //仍然还具有文件级作用域
}

@end

结束语

Objective-J简明教程至此就结束了。这门语言只是对JavaScript简单而直观的扩展,绝大多数开发人员不用费吹灰之力即可掌握它。

要想参考本教程中完整的代码清单,可以下载这个Person.j文件

相关内容

Objective-J简明教程3-1:类、方法
Objective-J简明教程3-2:使用对象和类、导入代码