6

本周在几种脚本语言之间来回切换后,我发现自己在想它们有多相似。然而,我一直在寻求谷歌(或现在的 SO)来记住诸如“instanceof”和“endswith”的本地等价物是什么,或者声明接口的正确语法等细节。

这让我想起了(人类)语言Europonto。只需选择一些模糊的英语语法和一些模糊的浪漫/日耳曼语/斯拉夫语词汇,一切都很好!

那么如果我们尝试用脚本语言做同样的事情会发生什么。今天想要 Python 风格的缩进块吗?美好的!想使用原型对象吗?好的!只记得某些库函数的 PHP 名称怎么拼写?没问题!

无论如何,这是疯狂而疯狂的想法。既然我们需要一个承认具体答案的问题,让我们像这样收紧它:

在创建允许 [Python、Ruby、PHP、Perl、shell 和 JavaScript] 的所有本机语法和库函数的脚本语言时,最重要的冲突是什么,这样您就可以在语言之间自由混合代码块和函数名称?

假设任何特定的结构都应该在语句级别保持一致。所以我们允许:

foreach( $foo as $bar )
{
   if $foo == 2:
      print "hi"
}

但不是,说,

foreach( $foo as $bar )
{
   if $foo == 2:
      print "hi"
   endif
end

冲突可能包括:解析器歧义;名称冲突;对象或函数或闭包的语义冲突;等等。我猜这个范围将是一个巨大的问题,但你告诉我。

我将从一开始就将其作为“社区 wiki”开始,因此,如果您认为这是一个有趣的问题,但又想让它更加严谨,请随时进行编辑。

4

5 回答 5

3

我建议主要问题是识别每个语句的语法应该是什么。

无论如何,重点是什么?几乎所有的脚本语言都具有执行相同功能的功能,这就是为什么人们倾向于掌握一种他们一贯使用的语言并坚持使用它的原因。

于 2008-10-12T17:12:09.117 回答
1

The main difficulty would to be to allow people maintain it. With a well defined language you can only print a certain way and do sys.argv a certain way. once you allow multiple syntaxes there is no sane way to search for all the sys.argv in the code base you have.

于 2008-10-12T18:54:34.120 回答
1

语法级别上,我能看到的唯一问题是检测哪个块具有哪种语法,然后将它们分开并用特定的解析器解析它们。当然,给定非常小的陈述,关于它是哪种语言可能存在歧义,您可能会争辩说这并不重要,但可能是这种情况,在不同的语言中,相同的字符串会做不同的事情,所以这可能成为一个微妙的问题。

API级别上,您将有许多不同的方法来做同样的事情,但方式或子集略有不同。因此,例如,您可能无法string.startsWith()在 PHP 中执行 Java,因此您会做一些不同的事情,或者无法执行 PHP strstr()(从找到的针头到末尾返回字符串的一部分)并且您会实现一些东西对此有所不同,甚至对问题有不同的看法。然后你必须拥有所有这些不同的 API 方法来做同样的事情,这将是一个巨大的 API 来实现、支持和(上帝保佑)学习。

湿件级别,除非您了解大量语言及其细微差别,否则其他人编写的代码将完全不可读。我认为从最小的细节学习单一的编程语言已经足够困难了,因此创造这种科学怪人的野兽根本不切实际。我可以想到一个例外,它被用作一种算法描述语言,它已经在世界各地的大学中使用,教师采用他喜欢的某种语言,并使代码对人类来说尽可能易读,而无需实现一个解析器。

作为旁注,我认为这种系统可以通过以某种方式利用.NET的CLR来实现,在其中你有大量不同的语言,每种语言都编译为相同的字节码并访问相同的变量和东西。您需要做的就是将代码拆分为不同语言的集群,然后在各自的编译器上分别编译它们,然后合并字节码,并以某种方式确保它们在提及相同名称时都指向相同的变量和函数不同的语言。

于 2009-05-11T21:20:39.200 回答
0

我已经开始看到语法只是语言的一个属性。他们中的大多数在我看来都像 C。语言的目的(面向对象、强类型等)又是另外一回事。它开始看起来语法不是最重要的方面。

我去阅读了维基百科条目......

Europanto 是一个语言笑话,呈现为一种带有大杂烩词汇的“建构语言”

“大杂烩”听起来就像 Perl 向我描述的那样!

于 2008-10-12T17:21:19.147 回答
0

在 Ruby 中找到了关于闭包的相当详细的讨论。听起来让 Ruby 的行为与 JavaScript 或 Python 共存需要某种丑陋的消歧。

如果有人将 Perl 添加到要涵盖的语言列表中,我认为它的词法范围规则会带来一个相关的问题吗?

于 2008-10-12T17:36:16.977 回答