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

时间:2009-10-31 02:42:02

标签: parsing localization

让我解释一下。假设我想向只讲西班牙语的人教Python。如您所知,在大多数编程语言中,所有关键字都是英文的。创建一个程序可以找到给定源代码中的所有关键字并进行翻译,这有多复杂?我是否需要使用解析器和东西,或者几个正则表达式和字符串函数是否足够?

如果它依赖于源编程语言,那么Python和Javascript将是最重要的。

我的意思是“它有多复杂”是否足以拥有关键字列表,并解析源代码以查找不在引号中的关键字?或者是否有足够的语法怪异,需要更复杂的东西?

9 个答案:

答案 0 :(得分:8)

如果你想要的只是翻译关键词,那么(虽然你肯定需要一个合适的解析器,否则避免任何字符串的变化,评论和c成为一场噩梦)任务很简单。例如,既然你提到了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 

(奇怪但正确的空格,但这可以很容易地补救)。作为一名意大利语演讲者,我可以告诉你这很难阅读,但这对于任何“编程语言翻译”的课程都是如此。更糟糕的是,range等非关键字仍未翻译(根据您的规格) - 当然,您 不能将您的翻译限制为仅限关键字(这很容易)足以删除执行上述操作的if; - )。

答案 1 :(得分:0)

您将遇到的问题是,除非您有严格的编码标准,否则人们不一定会遵循他们如何执行代码的模式。在任何动态语言中,如果eval函数的引号内包含关键字,您就会遇到问题。

如果您正在尝试教授某种语言,您可以创建一个包含西班牙语关键字的DSL,以便您可以使用您的语言进行教学,并且可以使用python或javascript进行处理,因此您基本上已经制作了自己的语言,用你想要的结构,教学。

一旦他们理解了如何编程,他们就需要开始学习使用“英语”关键词的语言,以便他们可以与他人交流,但这可能是在他们理解如何编程之后,如果它会让你的生活更容易。

所以,为了回答你的问题,有足够的语法怪异,翻译关键词要复杂得多。

答案 2 :(得分:0)

这不是一个乐观的答案,也不是一个伟大的答案。但是,我觉得它有一些优点。

我可以谈论C#,翻译不值得。原因如下:

  1. C#基于英语,但本身并不是英文文学。例如,“var”或“int”是什么用西班牙语?
  2. 可以创建一个程序,让您使用西班牙语单词代替“for”,“in”和“as”等英语关键词。但是,一些西班牙语等价词可能是复合词(两个词而不是一个词,处理空格可能会变得棘手)或英语关键词可能没有直接的西班牙语等价词。
  3. 调试可能会变得棘手。转换为英语和西班牙语,然后再转换为英语,然后西班牙语就有了“满载错误”的标记。
  4. 用户将无法获得学习资源。所有C#代码示例都与Microsooft设计的方式相同。没有人会尝试使用西班牙语 - 仅针对将使用您的应用的一些用户的语法。


我见过一些人用英语以外的语言讨论C#代码。在所有情况下,作者都用他们的母语解释代码,但用自然的代码用英文代码编写代码。最好的方法似乎是尝试学习足够的英语以适应C#,因为它自然而然。

答案 3 :(得分:0)

要做出能够处理所有案件的翻译是不可能的。以此Javascript代码为例:

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

x变量可以成为对窗口对象的引用,也可以成为对新创建的对象的引用。如果成员是窗口对象,那么翻译成员是有意义的,否则你也必须翻译变量名称,这将是一团糟,很容易引起问题。

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

答案 4 :(得分:0)

您应该认为常用编程语言中令牌的“事实上”语言是英语。因此,对于纯粹的教育目标,教授翻译的语言可能对您的学生有害。 但是,如果你真的想要翻译计算机语言,你应该考虑以下问题:

  • 您应该翻译语言原语构造。这很容易......您必须学习并使用基本的解析器,如yacc或antlr
  • 您应该翻译语言API。这可能是如此痛苦和困难......首先,现代API就像java一样非常广泛;第二,你必须翻译API的文档....没有更多的话。

答案 5 :(得分:0)

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

  • 随着发展中国家开始向更高技术引进人口,自然有些人会对学习编程感兴趣。英语编程语言会成为障碍吗?

  • 假设一种编程语言是在世界上非英语部分开发的:关键字是用该语言的母语编写的,它使用原生标点符号(例如,«»而不是“”,逗号作为小数点(123,45),依此类推)。这是一种非常棒的编程语言,产生了很多嗡嗡声。你认为它会被广泛采用吗? 会使用它吗?

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

答案 6 :(得分: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

答案 7 :(得分:0)

你可能会发现Perl的Lingua::Romana::Perligata很有趣 - 它允许你用拉丁语编写你的perl程序。它与你的想法并不完全相同,因为它基本上重新构建了拉丁语思想的语言语义,而不仅仅是翻译字符串。

答案 8 :(得分:0)

将关键字从一种编程语言翻译成另一种语言相对容易。有几个non-English-based programming languages,包括Chinese Python,用中文关键字替换英文关键字。

将每个变量名称从英语翻译成另一种自然语言要困难得多。如果两个不同的英文变量名在另一种语言中只有一个翻译,则会有name collision