将一种编程语言翻译成另一种人类语言有多难?

7
让我来解释一下。假设我想教一个只会说西班牙语的人学Python。正如你所知,大多数编程语言中的所有关键字都是英文的。那么创建一个程序来查找给定源代码中的所有关键字并将其翻译成其他语言会有多复杂呢?我需要使用解析器之类的工具吗,还是几个正则表达式和字符串函数就足够了?
如果这取决于源编程语言,那么Python和Javascript将是最重要的。
我的意思是,“有多复杂”是指是否有足够的语法怪异性需要更复杂的处理方式,或者只需要一个关键字列表,并解析源代码以查找不在引号中的关键字即可?

9
如果目标是真正学习这门语言,那么你所提出的建议将会适得其反。 - Azeem.Butt
我记得有一些严肃的尝试将BASIC语言翻译成西班牙语、法语等,如果我没记错的话,像"para"就是西班牙语中的"for"语句,不幸的是,我在网上找不到任何关于这方面的参考资料——但无论如何,这种尝试从未起飞。 - Artelius
1
教简单的英语关键词像forwhilefunction是否真的这么难?而且,这些是关键词。如果他们有一天需要在某些编程主题上寻求帮助,他们会发现自己无法理解别人在写什么。 - mauris
1
我曾经在多年前看到过一种翻译后的编程语言写成的程序。如果我没记错的话,那是用法语写的Basic。作为法语的母语者,我可以告诉你,即使这样的“翻译”语言今天仍然存在,我也不会使用它。如果没有人能理解你的代码,在互联网上寻求帮助将变得更加困难。 - Marcel Gosselin
1
有几个现存的SO问题涉及非英语人类语言中的编程语言。特别是https://dev59.com/33VC5IYBdhLWcg3wtzqs,还有http://stackoverflow.com/questions/440052/should-identifiers-and-comments-be-always-in-english-or-in-the-native-language-of和http://stackoverflow.com/questions/250824/do-you-use-another-language-instead-of-english。 - dmckee --- ex-moderator kitten
显示剩余2条评论
9个回答

8

如果你只是想翻译关键字,那么(虽然你确实需要一个合适的解析器,否则避免字符串、注释等任何变化将成为一场噩梦)这个任务相当简单。例如,既然你提到了Python:

import cStringIO
import keyword
import token
import tokenize

samp = '''\
for x in range(8):
  if x%2:
    y = x
    while y>0:
      print y,
      y -= 3
    print
'''

translate = {'for': 'per', 'if': 'se', 'while': 'mentre', 'print': 'stampa'}

def toks(tokens):
  for tt, ts, src, erc, ll in tokens:
    if tt == token.NAME and keyword.iskeyword(ts):
      ts = translate.get(ts, ts)
    yield tt, ts

def main():
  rl = cStringIO.StringIO(samp).readline
  toki = toks(tokenize.generate_tokens(rl))
  print tokenize.untokenize(toki)

main()

我希望您能理解如何将此推广到“翻译”任何Python源代码并翻译为任何语言(我仅提供了一个非常简单的意大利关键字翻译字典)。输出结果如下:
per x in range (8 ):
  se x %2 :
    y =x 
    mentre y >0 :
      stampa y ,
      y -=3 
    stampa 

(strange though correct whitespace, but that could be easily enough remedied). 作为一个意大利语使用者,我可以告诉你这很难读,但这是任何“编程语言翻译”都必须面对的问题。更糟糕的是,像range这样的非关键字仍然没有被翻译(根据您的规格) - 当然,您不必将翻译限制在关键字上(可以轻松地删除上面的if)。

0

曾经有一刻我在考虑为bash脚本做类似的事情,但这个想法也可以在其他语言中实现:

#!/bin/bash

PrintOnScreen() {
    echo "$1 $2 $3 $4 $5 $6 $7 $8 $9"
}
PrintOnScreenWithoutNewline() {
    echo -n "$1 $2 $3 $4 $5 $6 $7 $8 $9"
}
MathAdd() {
    expr $1 + $2
}

然后我们可以将这个添加到一些脚本中:

#!/bin/bash
. HumanLanguage.sh
PrintOnScreen Hello
PrintOnScreenWithoutNewline "Some number:"
MathAdd 2 3

这将产生:

Hello
Some number: 5

0

要制作一个能够处理每种情况的翻译是不可能的。以这段Javascript代码为例:

var x = Math.random() < 0.5 ? window : { location : { href : '' } };
var y = x.location.href;

x变量可以成为窗口对象的引用,也可以成为新创建对象的引用。如果是窗口对象,翻译成员才有意义,否则您还需要翻译变量名称,这会很混乱并且可能会引起问题。

此外,了解错误语言并不真正有用。所有文档和示例都将使用原始语言,因此它们将无用。


0
你可能会觉得 Perl 的 Lingua::Romana::Perligata 很有趣 -- 它允许你用拉丁文编写 Perl 程序。它与你的想法不完全相同,因为它实际上是围绕拉丁思想重构语言语义,而不仅仅是翻译字符串。

0
你将遇到的问题是,除非你有严格的编码标准,否则人们不一定会按照代码规范进行编码。在任何动态语言中,你都会遇到一个问题,即eval函数中会有括号内的关键字。
如果你想教授一门语言,你可以创建一个DSL,该DSL中有西班牙语关键字,以便你可以用你的语言教学,并且可以在Python或JavaScript中进行处理,因此你已经制作了自己的语言,其中包含你想要的结构,可用于教学。
一旦他们理解如何编程,他们就需要开始学习带有“英语”关键字的语言,以便他们可以与其他人沟通,但如果这能让你的生活更轻松,这可以在他们理解如何编程之后再来。
因此,回答你的问题,由于足够的语法怪异性,翻译关键字会更加复杂。

0

这不是一个乐观的答案,也不是一个伟大的答案。然而,我认为它有一些价值。

我可以谈谈C#,但翻译并不值得。以下是原因:

  1. C#基于英语,但它本身并不是英语文学。例如,“var”或“int”在西班牙语中应该怎么翻译呢?
  2. 可以创建一个程序,让您使用西班牙语单词代替英语关键字,如“for”,“in”和“as”。然而,一些西班牙语等效词可能是复合词(两个单词而不是一个,处理空格可能会变得棘手),或者英语关键字可能没有直接的西班牙语等效词。
  3. 调试可能会变得棘手。将代码转换成英语、西班牙语,再转回英语和西班牙语,这样做充满了错误的标记。
  4. 用户将无法获得学习资源。所有C#代码示例都是按照微软设计的方式编写的。没有人会尝试为了几个使用您的应用程序的用户而将语法西班牙化。


我看到一些人在非英语语言中讨论C#代码。在所有情况下,作者都用他们的母语解释代码,但是以自然的英语代码编写它。最好的方法似乎是尝试学习足够的英语,以便舒适地使用C#。


我同意这个观点。重要的部分是文档和讨论,而不是那20个关键词左右。我的意思是,大多数关键词甚至都不是英语单词(method是希腊语,routine是法语(我想),function是拉丁语,lambda甚至不是一个单词,只是一个字母拼写出来)。=~是什么样的单词?即使它们是英语单词,它们通常也不意味着它们在英语中的含义。Yield是一个很好的例子。实际上,在大多数编程语言中,yield甚至不意味着它在计算机科学中通常的含义,而且在每种语言中都有不同的含义。 - Jörg W Mittag

0

你应该认为在常用编程语言中,令牌的“事实上”语言是英语。因此,纯粹出于教育目的,使用翻译后的语言来教授可能会对学生造成伤害。

但是,如果你真的想要翻译计算机语言令牌,你应该考虑以下问题:

  • 你应该翻译语言的基本构造。这很容易... 你只需要学习和使用像yacc或antlr这样的基本解析器。
  • 你应该翻译语言的API。这可能非常痛苦和困难... 首先,现代API(如Java的API)非常广泛;其次,你必须翻译API的文档... 关于这一点就不多说了。

0

虽然我没有对这个问题的答案,但我认为这是一个有趣的问题。它提出了一些我一直在思考的问题:

  • 随着发展中国家开始向他们的人民介绍更高级的技术,自然会有一些人对学习编程感兴趣。英语作为唯一的编程语言是否会成为阻碍?

  • 假设一种编程语言是在世界上非英语区域开发的:关键字用该地区的本地语言书写,并使用本地标点符号(例如,使用«»代替“ ”,逗号作为小数点(123,45)等)。这是一种很棒的编程语言,引起了很多关注。你认为它会被广泛采用吗?你会使用它吗?

大多数讲英语的人对第一个问题的回答是“不”。即使是非英语(但受过教育的)人也会回答“不”。但是他们也对第二个问题回答“不”,这似乎是矛盾的。


Ruby的创造者是日本人,但他用英语创造了它。 - hasen
很好的观点。也许他意识到使用日语关键词会对其采用造成不利影响。 - Barry Brown

0

将一个编程语言中的关键字翻译成另一种语言相对容易。有几种非英语为基础的编程语言,包括中文Python,它用中文关键字替换了英文关键字。

将每个单独的变量名从英语翻译成其他自然语言会更加困难。如果两个不同的英语变量名在另一种语言中只有一个翻译,那么就会出现名称冲突


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接