Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scripting 创建“一个”的障碍是什么;“欧罗巴托”;键入通用脚本语言?_Scripting_Language Design - Fatal编程技术网

Scripting 创建“一个”的障碍是什么;“欧罗巴托”;键入通用脚本语言?

Scripting 创建“一个”的障碍是什么;“欧罗巴托”;键入通用脚本语言?,scripting,language-design,Scripting,Language Design,本周在几种脚本语言之间来回切换之后,我发现自己在想它们有多相似。然而,我总是要求谷歌(或者现在是这样)记住一些细节,比如“instanceof”和“endswith”的本地等价物是什么,或者声明接口的正确语法,等等 这让我想起了人类的语言。只要选择一些模糊的英语语法和一些模糊的浪漫/日耳曼/斯拉夫语词汇,一切都很好 那么,如果我们尝试用脚本语言做同样的事情,会发生什么呢。今天有心情使用Python风格的缩进块吗?好的想要使用原型对象吗?好啊只能记住如何拼写某些库函数的PHP名称?没问题 无论如何

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

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

那么,如果我们尝试用脚本语言做同样的事情,会发生什么呢。今天有心情使用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
冲突可能包括:解析器歧义;名称冲突;对象、函数或闭包的语义冲突;等等。我猜范围将是一个巨大的问题,但你告诉我


我将从一开始就以“社区维基”的形式开始,因此,如果您认为这是一个有趣的问题,但想让它更严格,请随意编辑。

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


无论如何,这有什么意义?几乎所有的脚本语言都有做同样事情的工具,这就是为什么人们倾向于掌握他们一贯使用的脚本语言,并坚持使用它。

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

我去看了维基百科的条目

Europanto是一种语言笑话,以“建构语言”的形式呈现,带有霍奇·波奇词汇

“Hodge podge”听起来像是Perl对我的描述

我找到了一个。听起来,让Ruby的行为与JavaScript或Python的行为共存需要某种难看的消除歧义


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

主要的困难是允许人们维护它。使用定义良好的语言,您只能以某种方式
打印
,并以某种方式执行
sys.argv
。一旦允许使用多个语法,就没有合理的方法来搜索代码库中的所有
sys.argv

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

API级别上,您可以使用许多不同的方法来做相同的事情,但方式或子集会略有不同。例如,您可能无法在PHP中执行Java的
string.startsWith()
,因此您可能会执行一些不同的操作,或者无法执行PHP的
str()
(从找到的指针返回字符串的一部分)你会为此采取一些不同的措施,甚至对这个问题有不同的想法。然后你必须有所有不同的API方法来做同样的事情,这将是一个巨大的API来实现、支持和(上帝禁止)学习

wetware级别,除非您了解大量语言及其细微差异,否则其他人编写的代码将完全无法阅读。我认为学习一门编程语言到最小的细节是很困难的,因此创造这种弗兰肯斯坦怪兽是不现实的。我可以想到一个例外,作为一种算法描述语言,它已经在世界各地的大学中使用,在那里,老师使用他喜欢的某种语言,使代码尽可能可读,而不需要为它实现解析器


作为补充说明,我认为这种系统可以通过某种方式利用.NET的CLR来实现,在这种情况下,您可以使用大量不同的语言,每种语言都编译为相同的字节码,并访问相同的变量和内容。您所需要做的就是将代码拆分为不同语言的集群,然后在各自的编译器上分别编译,然后合并字节码,并以某种方式确保在不同语言中提到相同的名称时,它们都指向相同的变量和函数。

以前从未见过Europanto。很有趣,我能马上读到很多。感谢分享链接;)