Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第17章 2-4节翻译完毕 #149

Closed
wants to merge 3 commits into from
Closed

第17章 2-4节翻译完毕 #149

wants to merge 3 commits into from

Conversation

hltj
Copy link

@hltj hltj commented Aug 27, 2017

@huangzworks
Copy link
Owner

辛苦了,我稍后就来 review !

当心副作用
^^^^^^^^^^

需要注意的一点是,我们将 ``sin`` 作为 Haskell 中的没有副作用的纯函数。
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

原文的 bound 没有翻译出来。

^^^^^^^^^^

需要注意的一点是,我们将 ``sin`` 作为 Haskell 中的没有副作用的纯函数。
这本例中没问题,因为 C 语言中的 ``sin`` 函数是引用透明的。
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

”这本例中没问题“ 似乎缺少了什么。


需要注意的一点是,我们将 ``sin`` 作为 Haskell 中的没有副作用的纯函数。
这本例中没问题,因为 C 语言中的 ``sin`` 函数是引用透明的。
通过将 C 语言纯函数绑定到 Haskell 纯函数,Haskell 编译器会获悉一些关于 C 语言代码的情况,即它没有副作用、更易于优化。
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

binding ... to 应该翻译成“绑定为”而不是“绑定到”。

然而,纯的 Haskell 代码总是线程安全的,这是 C 语言更难以保证的。
即使文档表明该函数很可能没有副作用发生,也无法确保它同时是线程安全的,除非文档明确有说“可重入(reentrant)”。
纯的、线程安全的 C 语言代码,虽然罕见,却也是种有价的商品。
这是在 Haskell 中使用 C 语言的最简单的滋味。
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这段有几个问题:

  1. 这里的”pure“实际上就是“无副作用”的代名词,因此除了把“pure code”翻译成“纯的代码”之外,我们也可以考虑把它翻译成“无副作用的代码”,这样会更易懂一些,后续的内容也鼓励这样翻译。

  2. ”Pure, threadsafe C code, while rare, is a valuable commodity.“中的“valuable commodity”翻译成“有价的商品”让人不明所以,把它和“while rare”合并翻译成一个表示“少见且珍贵“的成语会更好,我目前能够想到的就是“寥寥可数”和“不可多得”,如果有更好的成语也可以做相应的替换。

  3. 译文中的很多地方都保留了英文原文的结构和句式,读起来“英文味”太重了,可以适当地润色,将之变得更符合中文语法。

以下是我翻译的一个版本,供参考:

”虽然无副作用的 Haskell 代码总是线程安全的,但 C 语言要做到这一点却难得多:对于 C 语言来说,除非文档声明一个函数是可重入的(reentrant),否则的话,即使一个函数看上去并没有产生任何副作用,它也很可能不是线程安全的。
无副作用且线程安全的 C 代码不仅寥寥可数,而且不可多得 —— 这就是在 Haskell 里面使用 C 代码时最直接的感受。”


当然,具有副作用的代码在命令式语言中更常见,其中语句的显式排列鼓励副作用的使用。在 C 语言中更为常见的是,函数会由于全局或者局部状态的变化对于给定相同的参数返回不同的值,或者具有其他副作用。
通常情况下,在 C 语言中会有这样暗示:函数只返回一个状态值或者一些 void 类型,而不是一个有用的结果值。
这表明该函数的实际产出在其副作用中。
Copy link
Owner

@huangzworks huangzworks Aug 29, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

一些问题:

  • “函数会由于全局或者局部状态的变化对于给定相同的参数返回不同的值,或者具有其他副作用” 这一句的关系表达有误,句子表示的原因和导致的结果不清晰。

  • “通常情况下,在 C 语言中会有这样暗示” 的原文为 “Typically this is signalled in C by ...” ,该句中的 “this” 表示的是上一句所述的情况,译文此处翻译错误。

  • “这表明该函数的实际产出在其副作用中。” 虽然原文此处也是一个单独的句子,但实际上这句完全可以跟上一句合并为一个完整的句子,不需要单独分开。

以下是我翻译的一个版本,供参考:

“副作用代码在命令式语言中非常常见,而语句的显式排列也促进了副作用的使用。
因为全局状态或局部状态的变化,又或者由于其他副作用的影响,导致函数对于相同的参数产生了不同的返回值,这样的情况在 C 语言中并不少见。
在 C 语言中,具有上述特征的函数通常会返回一个状态值又或者某种类型的空值,而不是一个有用的计算结果,这意味着函数的实际工作是通过副作用完成的。“

Copy link
Author

@hltj hltj Aug 29, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

非常赞同改进后的翻译更加通顺,只是对这句

It is much more common in C for functions to return different values, given the same arguments, due to changes in global or local state, or to have other side effects.

的短句间关系,我想我没理解错:

It is much more common in C for functions
   to return different values, given the same arguments, due to changes in global or local state,
or to have other side effects.

即,to return .... 和 to have 是并列关系,这处翻译我会根据你的建议和实际语义来改进。

不得不说原文有好多嚼起来费劲的地方。

Copy link
Owner

@huangzworks huangzworks Aug 29, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

是的,这里你的理解是正确的,是我理解错了,请做相应的修改。

这里主要的问题是“函数会由于全局或者局部状态的变化对于给定相同的参数返回不同的值,或者具有其他副作用”这一句,句子太长了,可以一分为二,关系就会清晰很多。

这本书的确是比较难译的,不然网上也不会出现那么多半途而废的翻译版本了,哈哈哈。

不过既然我们已经做到最后一章了,就让我们一起来尽可能地把这一章翻译好吧。

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

是啊,都已经完成那么多了,一定拿下。

这表明该函数的实际产出在其副作用中。
对于这样的函数,我们需要在 IO monad 中捕获那些副作用(例如,通过将返回类型改为 ``IO CDouble``\)。
对于不可重入的 C 语言纯函数,我们还需格外小心,因为与 C 语言相比,多线程在 Haskell 代码中极其常见。
我们可能需要通过一些措施让不可重入代码能够安全使用:通过事务锁缓和对 FFI 绑定的访问或者复制(duplicating)底层 C 语言状态。
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里的两个子句可以合并成一个完整的句子,没有必要使用两个”通过“。

@huangzworks
Copy link
Owner

Hi,hltj,我刚刚检查了你提交的译文的第一节,发现两个问题:

  1. 译文中有一些地方出现了漏译或者翻译错误。

  2. 译文的英式中文现象比较严重 —— 也即是说,虽然文中的词句都翻译成了中文,但用词遣句、词句的结构和语法还是保留着英文的习惯,让人无法很好地理解译文想要传达的意思。

具体的问题我已经在注释里面指出了,并给出了两个翻译示例,希望你能按照这些说明对全文进行仔细的检查,并在修正和润色译文之后再次进行提交。

因为上述原因,本次提交将不会被合并。

@hltj
Copy link
Author

hltj commented Aug 29, 2017

收到,我先更新下译错的地方,其他的再逐步润色,之前参与更新频繁、需要行级比较合并的文档翻译较多,确实有些习惯了直译,也许最终也做不到完全意译,但希望能够多改善一些。

@huangzworks
Copy link
Owner

好的,期待!

@ghost
Copy link

ghost commented Apr 2, 2021

@hltj
所以现在17章是什么情况呢?

收到,我先更新下译错的地方,其他的再逐步润色,之前参与更新频繁、需要行级比较合并的文档翻译较多,确实有些习惯了直译,也许最终也做不到完全意译,但希望能够多改善一些。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants