本周在几种脚本语言之间来回切换后,我发现自己都在想它们的相似之处。然而,我总是想要谷歌(或现在的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
冲突可能包括:解析器含糊不清;名字碰撞;对象或函数或闭包的冲突语义;我猜这个范围将是一个巨大的问题,但你告诉我。
我将从一开始就将其作为“社区维基”开始,所以如果您认为这是一个有趣的问题但想要更严谨,请随时编辑。
答案 0 :(得分:3)
我建议主要问题是识别每个语句的语法应该是什么。
无论如何,重点是什么?几乎所有的脚本语言都有相同的功能,这就是为什么人们倾向于掌握他们一贯使用的语言,并坚持使用它。
答案 1 :(得分:1)
主要的困难是允许人们保持它。使用定义良好的语言,您只能print
某种方式,并以某种方式sys.argv
。一旦你允许多种语法,就没有理智的方法来搜索你所拥有的代码库中的所有sys.argv
。
答案 2 :(得分:1)
在语法级别,我能看到的唯一问题是检测哪个块具有哪种语法,然后将它们分开并用特定的解析器解析它们。当然,如果给出非常小的陈述,那么它可能存在歧义,你可能会认为它无关紧要,但事实恰恰相反,在不同的语言中,相同的字符串可以做不同的事情所以这个< em>可能是一个微妙的问题。
在 API 级别,你会有很多不同的方法来做同样的事情,但是以一种微妙的不同方式或做这个的子集。所以例如你可能无法用PHP来表示Java string.startsWith()
,所以你会做一些不同的事情,或者没办法做PHP的strstr()
(从发现中返回一部分字符串)针到最后)你会实现不同的东西,甚至对问题有不同的看法。然后你必须有所有那些不同的API方法做同样的事情,这将是巨大的API实现,支持和(上帝保佑)学习。
在 wetware 级别,除非您了解大量语言及其细微差别,否则其他人编写的代码将完全无法读取。我认为用最简单的细节学习单一的编程语言是很困难的,因此创造这种frankensteinish野兽是不切实际的。我可以想到一个例外用作算法描述语言,它已经在世界各地的大学中使用,在那里教师采用他喜欢的语言并使代码可读,因为它可以为人类而不需要实现它的解析器。
作为旁注,我认为这种系统可以以某种方式以最少的努力实现利用.NET的CLR,每次编译都有大量不同的语言到相同的字节码并访问相同的变量和东西。 所有你需要做的事情是将代码分割成不同语言的集群,然后在各自的编译器上单独编译它们然后合并字节码和以某种方式确保它们所有在不同语言中提到相同名称时都指向相同的变量和函数。
答案 3 :(得分:0)
我已经开始看到语法只是语言的一个属性。而且他们中的大多数对我来说都像C。语言的目的(面向对象,强类型等)再次是另一回事。它开始看起来像语法不是最重要的方面。
我去阅读维基百科条目......
Europanto是一种语言玩笑,被称为“构造语言”,具有大杂烩词汇
“Hodge-podge”听起来像是Perl被描述给我的方式!
答案 4 :(得分:0)
我找到了rather detailed discussion of closures in Ruby。听起来让Ruby的行为与JavaScript或Python共存需要某种丑陋的消歧。
如果有人要将Perl添加到要涵盖的语言列表中,我认为它的词汇范围规则会出现相关问题吗?