真正的多语言编程语言?

时间:2009-03-20 19:55:14

标签: programming-languages internationalization

我意识到大多数语言都支持多种语言,但我所看到的每种语言都以美国为中心或多或少。我的意思是关键字,标准库函数等都有英文名称。所以,作为一名程序员,你仍然需要至少知道一些英语来理解它。

是否有任何真正的“多语言”语言支持多种语言的语言关键词?

11 个答案:

答案 0 :(得分:29)

这通常是一个可怕的想法,因为任何在本地化IDE中工作的人都可以证明这一点。程序员严重依赖于一个共同的词汇表。当编译器给我错误“缺少类型说明符 - 假定的int”时,我可以与其他人共享这个确切的错误消息,例如在SO上,并且它将熟悉给那些其他人,所以他们可以告诉我它意味着什么。如果编译器用丹麦语生成错误消息,我只能从相对较少说丹麦语的程序员那里获得帮助。

突然间,我的词汇不再与德国,法国或日本的同一个词汇相同。我们不能再交换代码,错误,错误修复或想法。

西班牙的开发人员无法使用我的代码,因为它实际上是用另一种语言编写的。如果我的代码出现问题,其他人就无法调试它,因为它甚至无法在其本地化设置下进行编译(如果确实如此,那么它们仍然是不可读的。)

最终,编程语言是一种语言。它可能借用了一些英语单词,但它 不是英语,你不需要理解英语就可以在其中编程,不仅仅是我需要理解拉丁语才能说英语(英语)也借用拉丁语。)

您还可以要求多语言英语。 有什么意义?是的,从理论上讲,那些不会说英语的人会说英语。它与其他英语使用者所说的英语不一样,所以它实际上不会实现它们之间的沟通。

编程语言中的关键字if 与英语中的相同。它们意味着不同的东西,尽管其中一个明显受到另一个的启发。

C#中的delegate关键字与英语中的“委托”并不相同。 whilereturn或“构造函数”也不是。它们不是英语单词,它们是C ++,Java,C#,Python或任何其他编程语言中的关键字或概念。

答案 1 :(得分:9)

对我来说听起来不错。如果我正在编写程序,我怎么知道我输入的变量名实际上是保加利亚语或韩语中的音译关键字?我是否必须处理数以千计的关键字,或者我在结合瑞典和埃及同事编写的两个例程时遇到了问题?

只要意识到编程关键字是英文的,就像音乐关键字是意大利语一样。

答案 2 :(得分:4)

这似乎是一个很好的起点:Non-English-based programming languages

那里有一些有趣的,比如Python translated to Chinese

答案 3 :(得分:2)

您可以使用C / C ++预处理器重新定义所有关键字 - 有些人已经这样做了。我在担任挪威公司的培训师/导师时遇到过这个问题。一些明亮的火花已经实现了一个将所有C关键词翻译成挪威语并强制使用它的标题。挪威的工作人员,他们都说出优秀的英语(或者我不可能用他们来获得我的外壳)都讨厌它而死了。

我在荷兰也做过相当广泛的工作,大多数程序员似乎用英语编程。我所遇到的唯一能够抵抗编程语言英语霸权的人(不用说)就是法语。

答案 4 :(得分:2)

有一个区域本地化语言可能有用且有用,这些是非语言程序员使用的DLS(领域特定语言)。这些语言肯定会受益于本地化,因为来自非英语国家的商务用户通常不会像程序员那样了解英语。

如果这些本地化的DSL处理大量不可翻译的术语,那么它们也可以证明对程序员有利。我遇到的一个相当成功的系统被用来计算以色列军队人员的工资。它使用了基于希伯来语的语法以及数百个只能用希伯来语正确表达的术语。在该特定情况下,标准逻辑关键字ifthenelse等被翻译为希伯来语,整个代码编辑器从右向左。到目前为止,以这种方式维持了大量的业务逻辑,恕我直言,这是正确的。

答案 5 :(得分:2)

这似乎是非常困难的,除非这是一项社区工作,但对于某些语言,我不明白为什么你不能使现有语言多语言,但创建自定义库,本地化标准库。

例如,在Java中,您可以创建

public class HoweverYouSayExampleObjectInYourLanguage extends ExampleObjectName {
  }

然后创建包含目标语言名称的包装函数/方法,但基本上调用现有的标准方法

private void HoweverYouSayExampleMethodInYourLanguage(parameters) {
      this.ExampleMethod(parameters);
      // Some error handling code
}

如果你正确地进行错误处理,堆栈跟踪/错误都将引用标准库中的错误,除非特别是本地库的实现错误 - 在这种情况下应该通过正确的错误处理指出在本地化库本身。

正如其他人提到的那样,缺点是共享源代码。如果我们在同一页面上都有一个用于给定语言的IDE - 我不明白为什么你不能构建一个真正国际化的IDE,你在屏幕上看到的源代码就是这样的原因。这是真正的源代码本身,但是通过某种形式的映射对真实源代码进行局部渲染。

我要继续说我上面说的所有内容最多都是好主意,因为函数名称与库和API的本地化文档几乎一样重要。根据我的经验,对于常见的编程语言/上下文,完全或根本没有完成的事情。

答案 6 :(得分:0)

您可以在Latin中编写Perl。

答案 7 :(得分:0)

不要试图用自然语言编码,这是无用的。 Learn the "programming" language instead

例如,“切换”一词对我来说对英语没有任何意义,但这是一个决定多个选择的指示。

后来(当我学习英语时)我想......嘿,这很有趣,英语也有一个“切换”字,就像C.(doh!)

:)

无论你的英语有多好或坏,你都不能对java说

将java.util。*导入我的CD-ROM;

因为它不是有效的语法。

答案 8 :(得分:0)

APLJ等语言怎么样? APL中的关键字都是单个符号;不幸的是,其中大部分不在你的键盘上,所以J出现并用ASCII表示替换了大部分(在很多情况下由多个字符组成)。

答案 9 :(得分:0)

Sorted!

  

排序!是双语的。它可以理解英语和德语代码。据我所知,排序!是世界上唯一可以做到这一点的编程语言。

有用吗?这是一个更好的问题。

答案 10 :(得分:0)

在很大程度上,您可以在任何unicode脚本中使用prolog进行编程(因为它是一种符号语言)。有一个(微小的,weeny)捕获 - 变量由你可能遇到的所有prolog编译器中的初始大写罗马字母表示,你将不得不重新定义内置函数(但prolog使这相对容易*)。

我认为一个例子将说明我的最佳意思:

%用于查找复活节日期的算法,给定年份(作为第一个参数)

復活節( V1, V2, V3) :-
   A 是 (V1 mod 19),
   B 是 V1// 100,
   C 是 V1 mod 100,
   D 是 B // 4,
   E 是 B mod  4,
   F 是 (B + 8) // 25,
   G 是 (B - F + 1) // 3,
   H 是 (19*A + B - D - G + 15 )mod 30,
   I 是 C // 4,
   J 是 C mod  4,
   K 是 (32 + 2*E + 2*I - H - J) mod  7 ,
   L 是 (A + 11*H + 22*K) // 451,
   M 是 (H + K - 7*L + 114) // 31,
   N 是 (H + K - 7*L + 114)mod  31,
   V2 是 M,
   V3 是 N + 1.

/ *

示例测试:

? - 复活节(2013,V2,V3)。 V2 = 3, V3 = 31

即。今年复活节将于3月31日举行。

* /

  • 这就是我以前用'is'运算符重新定义构建的内容(如果它不完美则不要开枪):

    : - OP(500,XFY,是)

    是(X,Y): - 是(X,Y)