网页上的JavaScript的静态类型替代方法是否可行?


9

对动态和静态类型的偏好在很大程度上取决于个人喜好,并且不同的人或多或少会发现它们在不同情况下是合适的。

我的问题是,在客户端网页扩充等方面,是否有可能使用JavaScript的静态类型替代方法?


3
为什么不呢?```
Josh K 2010年

2
您是在谈论每个浏览器都必须实现的假设静态类型语言,还是已经存在的可能性?
user281377 2010年

2
我想您可以使用Java applet。
David Thornley 2010年

@ammoQ一个你提到的,假设
阿尔芒

@乔什我不知道。@David LOL,谢谢!
Armand 2010年

Answers:


22

当然,从技术上讲,这种事情不可能存在。强制使用动态类型语言的客户端代码没有什么特别的。


1
Dart具有可选的静态类型,但可以编译为普通Javascript。www.dartlang.com
Nishant George Agrwal

16

由于另一种语言不太可能被广泛采用,因此最好的选择是创建一个静态类型的JavaScript(即与Java接近的语言)和一个将其转换为普通JavaScript的预处理器。

例如,您的脚本如下所示:

<script type="text/staticjavascript">
   String foobar(int foo, String bar) {
      String result="";
      for (int i=0; i<foo; i++) {
         result += bar;
      }
      return result;
   }
</script>

然后预处理器检查每个变量,函数,对象等是否根据其类型正确使用,并将脚本更改为

<script type="text/javascript">
   function foobar(foo, bar) {
      var result="";
      for (var i=0; i<foo; i++) {
         result += bar;
      }
      return result;
   }
</script>

每个浏览器都可以处理。


5
务实的方法+1
Gary Rowe 2010年

确实,这个问题不是关于实用主义的问题,而是关于理论的问题。将更新。
Armand 2010年

2
我也建议使用类型推断。
奥利弗·韦勒

Helper方法:很好的建议,但是我现在不更改示例,因为示例很简单,因此类型推断会使静态版本与动态版本非常相似。
user281377 2010年

4
除了语法上,我认为静态类型的javascript不会非常接近Java。除了静态类型和动态类型之外,Javascript和Java还有许多不同之处-基于类和基于原型的OO是其中之一。由于您的示例代码似乎是基于类的,因此我认为“ staticjavascript”是该语言的误称,而应称为“客户端Java”。+1可以编译为javascript(顺便说一下,Google Web Toolkit确实将Java编译为javascript)。
sepp2k 2010年

8

我的问题是,在客户端网页扩充等方面,是否有可能使用JavaScript的静态类型替代方法?

当然。在谷歌Web工具包汇编静态类型的Java与JavaScript ...试想一下:所有的美丽和Java的灵活性,机器生成的JavaScript的全部性能!

认真地说,您可以对各种语言进行此操作,并且许多语言都已经尝试过(也曾经有过C和C#的编译器)。最终结果是否实际取决于您要完成的工作:Google拥有一个用于开发大型客户端应用程序的一致平台,并具有自己的JavaScript引擎可以启动;您可能会发现,采用这种野兽来产生悬停效果,而奇怪的AJAX调用所带来的痛苦要远远超过仅仅学习使用一些未类型化的代码。


3
我不能完全说出您是否在嘲笑GWT的“好处”。如果是的话,太好了。与GWT合作是我一生中最疯狂的经历之一。
妮可

@Renesis:好像使用Java脚本和浏览器兼容性还没有发疯?但是它确实具有出色的功能,例如在单个图像中下载多个图像,然后在客户端上分割它们。
Macneil

1
@Macneil他们可能现在已经解决了这个问题,但是当我使用Sprites时,它几乎抵消了所有好处,因为它会自动编写您可能不需要的其他CSS背景属性,因此您每次都必须整理CSS来覆盖它。
妮可

6

静态类型语言的大多数优点是在编译时实现的。如果要在客户端上解释该语言,则会失去很多这些优势。如果在服务器上编译它们,则需要弄清楚如何加载它们并在客户端上运行(请考虑ActiveX控件)。您可以采用混合方法(编译为某种中间标记形式),但是基本上可以回到Java小程序了。


2
+1用于解释为什么不这样做的可能原因,而不仅仅是回答可能的原因。

4

它已经存在。

ActionScript 3(Flash和Flex背后的脚本语言)是ECMAScript的一种方言,可实现强类型,您可以使用与JavaScript大致相同的客户端方式(区别在于AS3需要Flash插件,并且被编译)。这些天,我个人试图避开它,但是如果您处于“静态”阵营中,请尝试一下。

这回答了主要问题,现在我们有了这个问题,您的第二个问题变成“ Flash实用吗?” 答案是“是”,有几个“ if”和“ but”

  • ...如果出于任何原因需要隐藏代码。
  • ...如果您想要非常非常(过去的jQuery级别)的高交互性
  • ...但是即使没有HTML5,跨浏览器的兼容性最近也越来越好。
  • ...但是HTML5即将推出。
  • ...但是静态类型/编译(与解释相反)的一大吸引点是它允许通过优化来增加速度(尽管类型系统,Flash的速度确实不是很好)

AS3基于废弃的ES4。
gsnedders

3

从理论上讲,您可以将任何脚本粘贴到所需的页面上。该<script>标签有一个type属性,毕竟。

唯一的障碍是在不同浏览器中的实现方面要获得足够的市场份额,以使其值得使用。


是的,在这一点上不太可能。


那么,静态类型没问题吗?我不太担心这种流行的实用性。
Armand 2010年

1
@Alison:您可以将所需的任何文本内容放入脚本标签中(一个例外-它不能包含字符序列</script>)。如果您确实愿意,可以在其中粘贴Brainf * ck代码。然后,您需要做的就是在您要使用的浏览器中为所选语言实现一个解释器。
Anon。

@Anon。谢谢,非常有趣。如果那样简单,则可能已在某处完成。我确实记得<script type="vbscript">从前...
Armand 2010年

艾莉森:vbscript仅适用于IE,当IE的市场份额超过90%时,有人使用了它。如今,由于IE的市场份额约为50%,在世界某些地区可能更低,这是一个重大的失败。只要没有浏览器再次获得那么多的市场份额,就不要期望发生新的客户端脚本语言之类的事情。
user281377 2010年

@Alison:Internet Explorer 仍然支持VBScript作为脚本语言...我应该知道,我们这里有使用它的Intranet网站(因此需要 Internet Explorer-urgh!)
Dean Harding 2010年

2

可行吗? 没有。

可能吗?是!

最好开发自己的JavaScript静态类型替代方法很耗时。最糟糕的是,您将无法说服任何现有的浏览器来实现您的客户端脚本语言,而必须编写自己的脚本。


介意解释吗?
back2dos 2010年

添加了后续段落。
Marcie 2010年

我只是补充说,可能不可行的唯一原因是当前情况。如果我们回到Javascript发布之前的那一点,情况将会有所不同。
yakiv


1

您可以使用haXe之类的语言以静态类型的方式编写代码并将其导出到javascript。JavaScript变得非常快,因此作为一种输出语言就足够了。试图将静态类型的语言强制作为Web标准几乎是不可能的。由于广泛讨论的原因,尝试将静态类型引入JavaScript的尝试失败了。


1

从技术上讲有可能吗?如果要用Java实现,我会说“非常,非常困难,但有可能”而不会造成明显的性能损失。

我实际上现在正在用Java手写静态类型的DSL,而我发现避免运行时类型检查的唯一方法是使用泛型并抑制“未检查​​”的警告……也就是说,直到实现时为止。多维数组(类参数在编译时必须是已知的,因此固有地是有限的,而多维数组表示无限数量的类型...)不幸的是,我仍然试图弄清楚这一点-我敢肯定用户定义的类也会遇到类似的问题。

问题是,我一直在解决这些问题,但是坐了一段时间之后,我想出了一个很好的解决方案。因此,要做到这一点并具有静态类型的性能优势(无需运行时类型检查),我想说这是极其困难的,但并非不可能。除了性能,我会说很难,但很有可能。

我知道这是一个古老的问题,只是认为我的经验可能对某人有价值。


0

从技术上讲,可以使用用户代理(浏览器)支持的任何脚本语言编写客户端脚本。实际上,唯一受广泛支持的语言是JavaScript / ECMAScript。要说服浏览器制造商在此阶段实施和支持一种新语言,不太可能成功。因此,如果您想使用一种新的静态类型的客户端语言,则需要将该新语言转换为JavaScript或在JavaScript中实现一个解释器。

有几个项目已经在做这样的事情。例如,其他答案之一中提到的Google Web Toolkit


0

鉴于您没有希望让现实世界中使用的所有浏览器都支持一种新语言;该语言将不得不编译为jscript。

由于Web的所有示例都使用jscript,因此该语言应看起来像jscript。

我认为在范围内有一个jscript的“子集”,它由静态检查器检查,但也是有效的jscript。例如:

  • 所有变量都必须带有注释,并在首次使用之前说出类型。
  • 变量的所有用法都必须对以上内容有效。
  • 如果未在注释中声明函数/类,则不得使用它们#
  • js文件顶部的注释必须列出它依赖的所有其他js文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.