网站的动态和静态类型语言[关闭]


13

该语句表明,静态类型语言不适用于网站:

我将与建立网站进行对比。呈现网页时,通常您会在网页上交互许多组件。您在这里有按钮,在那儿有小部件,网页上有数十个小部件,网站上可能有数十个或数百个动态的网页。对于具有如此大的表面积的系统,使用静态类型的语言实际上是不灵活的。当我想交互地按动按钮而不是什么时,我可能会发现很难在Scala中编程并使用它渲染网页。如果整个系统必须是连贯的,就像整个系统必须进行类型检查一样,只是为了能够左右移动按钮,我认为这确实是不灵活的。

资料来源:http : //www.infoq.com/interviews/kallen-scala-twitter

它是否正确?为什么或者为什么不?


6
在我看来,他们没有考虑具有适当对象层次结构的语言/程序包。无需检查您要移动的控件是否为Buttonwhen,它WebControl包含您需要的所有信息以及所有控件都源自该控件。
马修(Matthew)

5
是的@Matthew-听起来像是一个不太了解多态的人
Nicole

8
另外-Twitter可能很流行,但这不是因为他们的网站是工程杰作。
妮可(Nicole)

Answers:


39

我完全不同意。随着系统的发展,静态类型语言可确保组件级别的鲁棒性,从而确保系统级别的灵活性。

而且,作者给出的示例实际上没有任何意义。似乎这个家伙似乎不知道可以通过鸭式打字以外的其他方式来实现多态。

有很多人声称动态语言是高级的,但这通常是基于他们缺乏对表达类型系统的经验,这些系统例如支持结构子类型,代数数据类型和一阶函数。


1
一阶函数如何与结构子类型和代数数据类型归为同一类?您听起来好像动态语言没有一阶函数,这显然是不正确的(方案,Common Lisp,Erlang,Smalltalk等)。
Frank Shearar 2011年

21
+1表示“似乎这个家伙似乎不知道可以通过鸭式打字以外的其他方式来实现多态。”
妮可(Nicole)

1
@弗兰克·希勒(Frank Shearer):我的意思是,它们受到与其他任何值相同的类型安全性的支持。有许多严格类型的语言支持函数值,但不能区分签名。
back2dos

1
我也不同意,这就是为什么我选择这个作为答案。
布拉德福德,


8

首先,请记住,以上声明的作者正在谈论网站开发。因此,他担心演示文稿的开发,因此他认为Scala并不是一个不错的选择。

话虽如此,我在Web开发方面确实有很好的经验。我已经使用它至少工作了8年,其中5年是在数字代理机构中。

而且,是的,以我的经验,在表示层使用静态类型的编译语言可能会成为一个很大的障碍。内容需要不断更改,而不是业务需求。通常,这需要由不同的团队(“前端”开发人员)完成。他们通常对HTML,JavaScript,Web标准,CSS了解很多,但是对服务器端语言(如Java和C#)了解不多。他们还假设可以立即使用模板中的任何更改。它们不用于编译和键入错误。它们是正确的:静态类型的语言非常适合于苛刻,复杂的需求,例如数据访问和业务规则,但不适用于接口开发。

实际上,这就是使用特殊的和解释性的模板语言(例如Velocity)的主要好处之一。它的易用性,功能和灵活性足以满足表示层开发人员的需求。然后服务器端人员可以在其他地方自由使用严肃的,静态类型的语言...

但是,我也同意Scala有所不同。同时,它比Java的冗长得多,表达能力更强,我认为它可以用于表示开发-因此也许可以成功地用作模板语言。而且,如果还可以将其组合到Play之类的框架(每次更改后都会自动编译该网站),那么它可能就是IMHO的赢家。尽管如此,甚至Play都选择了Groovy式(动态)模板语言,但这并不是一个好兆头。

综上所述:Scala的问题与它被编译的事实更为相关。实际上,它的类型推断机制使您几乎忘记了它也是静态类型的。

(对我的英语感到抱歉。如果有什么不清楚的地方,请告诉我,我会设法解决。)


1
我要第二点-只要看看他们试图使Java成为Web语言时的JSP / STRUTS混乱!
James Anderson

8

我认为文字(和大多数答案)混合了静态类型化的语言和过于冗长的语言。当然,交集很大(特别是在仅考虑最主流的语言时);但是还有一些有趣的非冗长,静态类型语言的示例:Go,Haskell,Scala,Rust ...


2
定义“过多”。随着程序变得越来越复杂,并且它们的寿命和维护周期增加,除原始作者之外的其他人将需要调试或修改任何给定代码段的可能性不断增加。在这种情况下,您通常处于困境之中,并且可以立即获得更多信息,确切了解您正在处理哪些数据以及它可以做得更好。我已经调试了其他人的Delphi和其他人的JavaScript,由于冗长和类型信息
梅森·惠勒

1
附带说明一下:诸如TypeScript(带有静态类型信息的JavaScript)之类的东西可能是检验OP理论的直接方法。我对它的简短介绍非常好-一次将一些JavaScript转换为TypeScript时,它实际上帮助我发现无法调用某种方法,并且不会产生错误
Katana314 2014年

5

我鼓励您阅读Bruce Eckel的《强类型对强测试》。它的主要论点是软件质量都归结为测试。您可以通过许多不同的方式进行测试。编译器在编译时会进行一些测试:尝试将字符串存储在int变量中,它很可能会吠叫您。在动态语言中,很多测试是在运行时进行的。最终,测试何时进行并不重要。它只是必须发生。您什么时候不使用动态语言进行编译就失去了运行时的测试。您对所有内容都进行了严格测试,对吗?

鉴于此,偏向于使用具有刚性类型系统的编译语言而不是动态语言的偏爱就是这样。有点像拳击手与三角裤,丁字裤与法国短裤。没有正确或错误的答案。以正确的态度穿着它们,真是太棒了。


1
“编译器会在编译时测试一些事情:尝试将字符串存储在int变量中,它可能会吠叫您。在动态语言中,很多测试都是在运行时进行的。”:确实,当使用动态语言时,编写许多替代类型检查的测试。使用静态语言,我可以使测试更多地集中在业务逻辑上。
Giorgio 2014年

@Giorgio有趣的是,我在测试中很少有任何类型检查逻辑。
2014年

@pllee:有时它不是直接进行类型检查的逻辑,但是测试会检查静态类型系统无论如何都会强制执行的某些行为。
Giorgio

布鲁斯·埃克尔(Bruce Eckel)似乎是另一个人,他花了多年的时间来处理过于冗长的语言(Java,C ++等),然后跳开遇到的第一门不同的火车(Python)。他花了一半的文章赞美Python语法的出色表现。由于缺乏知识,他对这场辩论无能为力。
ziggystar 2015年

但是,如果您尝试使用动态语言将字符串存储在int变量中-请确保在运行/测试应用程序并看到其实际作用之前不会注意到。但是在现实世界中(超过17年的开发),我很少将其视为导致bug的主要原因!曾经!但是,即使它是-您注意到并修复了它?有什么大不了的?好像整个论点都是基于非常技术性的罕见情况。这不是大问题!另一方面,动态类型化的好处是开发速度大大加快。
Manachi

2

在大多数情况下,我都同意这一点,因为让我们面对现实吧,当您在Web平台上与客户打交道时,灵活性是必须的。

静态类型的语言比动态类型的语言更健壮和安全,但是当您开始以一种非故意的方式适应代码的行为而您又需要快速地使用它时,解决方案就显得复杂而僵化。

因此,如果您有更改以合并技术,我建议您以静态类型的语言创建一个核心(核心变化不大),并动态地用于用户交互。


松耦合好。但是不需要动态语言即可实现。可见,Web都是通过HTTP完成松散耦合的,大多数Web服务器和浏览器都是用静态语言编写的。当您需要在运行时轻松修改代码而不需要调用大型工具链时,动态语言就会在脚本应用程序中大放异彩。
9000

2

我认为这篇文章的作者没有研究Scala自己。虽然我同意Java和C#有局限性,并且对于Web开发有些僵化,但是Scala是一种静态类型的语言,与您通常听到的那种语言完全不同。Scala允许鸭子输入以及猴子修补的类型安全版本(通过隐式转换)。这使编程库更加复杂,因为您将不得不考虑类型,但是如果您仅使用像Lift这样的库,则感觉非常像一种动态语言,只是编译器会告知您一些明显的错误,而您只是不使用它而已。对。我个人认为Lift Web框架不必在红宝石或类似物品上躲藏。在这里这里看看代码示例自己决定。我已经抬起电梯很长时间了,从来没有遇到过输入错误的情况,尽管“啊,如果这是动态的,那是行得通的”……因为如果是动态的,它不会告诉我在运行期间崩溃之前一直存在错误。


1

我个人认为他们说的话适用于任何系统,而不仅仅是网站。与硬件对话时,您将需要静态类型化,对于其他所有内容,动态类型化具有相同的弊端和好处,无论您做什么,实际上,什么才是最好的取决于口味和每个项目的具体问题。


我认为值得注意的是Scala有点特殊,因为它使用类型推断,因此不像Java属于同一静态类型类别。
Winston Ewert'3

1

实用的快速解答:这取决于网络大小的大小和复杂程度。小型网站,动态进度。lang。,复杂的大型网站,静态进度。郎。

无聊的扩展答案:许多开发人员坚持认为,网站应该以动态的进度来完成。朗格。但事实是,最终,Web开发工具倾向于使用或模拟静态类型的语言。

我曾经使用PHP数次,迟早我们不得不添加大量代码来验证给定数据的类型,这些代码隐含在静态类型的程序中。郎。

键入Lagn。还有助于使用IDE,这需要大量的类型验证。

(由您的邻居程序和编译器设计师提供;-))


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.