当您选择静态类型语言(如Scala(或F#,Haskell,C#))而不是动态类型语言(如Ruby,Python,Clojure,Groovy(具有宏或运行时元编程功能)时,您在实践中会失去什么? )?请考虑最好的静态类型语言和最好的(在您看来)动态类型语言,而不是最差的语言。
回答摘要:
Ruby等动态语言与Scala IMHO等静态类型语言的主要优势是:
答案 0 :(得分:9)
原则上,当你不清楚(在静态环境中)正确的事情是什么时,你放弃了能够忽略你正在使用的类型,而这就是它。
由于复杂的类型检查可能非常耗时,因此您可能也不得不放弃快速的在线元编程。
在实践中,使用Scala,你几乎没有放弃任何其他东西 - 而且我并不特别关心。您不能注入新方法,但可以编译并运行新代码。你必须在函数参数中指定类型(以及带递归函数的返回类型),如果你自己从不犯类型错误,这有点烦人。由于它编译了每个命令,因此Scala REPL并不像Python shell。并且由于它使用了Java反射机制,因此您无法轻松进行在线检查。 Python(无论如何都不是建立自己的检查库)。
答案 1 :(得分:4)
选择哪种静态或动态语言比静态/动态选择本身更重要。一些动态语言具有良好的性能和良好的工具。一些静态语言可以简洁,富有表现力和增量。有些语言很少有这些特性,但确实有大量经过验证的代码库。
答案 2 :(得分:3)
{ 'request':{'type':'GET', 'path':mypath}, 'oncomplete':function(response) { alert(response.result) } }
。if
语句中。eval
是大多数动态语言和少数静态语言的主要内容。答案 3 :(得分:3)
我不确定你是否会因为简单而失去任何东西。静态类型系统是要学习的额外负担。
我想你通常也会失去eval
,但我从不使用它,即使是在动态语言中也是如此。
在选择用于给定任务的语言时,我发现问题更多地是关于 else 的所有内容。在解决语言问题时,工具,文化,图书馆都比打字更有趣。
另一方面,编程语言研究是完全不同的。 :)答案 4 :(得分:1)
Steve Yegge here和here以及主要攻击Scala类型系统复杂性的Guido van Rossum表达了对Scala的一些批评。但他们显然不是“Scala程序员”。另一方面,这里有一些praise from James Strachan。
答案 5 :(得分:1)
我的2美分......
IMO(强大的)静态类型语言可能会减少必要的测试代码量,因为其中一些工作将由编译器完成。另一方面,如果编译步骤相对较长,则会使“增量式”编程变得更加困难,这在现实生活中可能会导致容易出错的代码,而这些代码只是经过测试才能通过编译器。
另一方面,动态类型的语言感觉改变事物的门槛较低,这可能会减少修复和改进的响应时间,因此可能会在应用程序开发过程中提供更平滑的曲线:处理小变化的持续流量比处理bug块中的变化更容易/风险更小。
例如,对于设计非常不清楚并且应该经常更改的项目,如果它有助于减少不同部分之间的相互依赖性,那么使用动态语言可能比使用静态语言更容易。 (虽然我不坚持那个:))
我认为Scala介于两者之间(例如,您不必明确指定变量的类型,与C ++相比,这可能会简化代码维护,但如果您最终对类型有错误的假设,那么编译器会提醒它,不像在PHP中你可以编写任何东西,如果你没有很好的测试覆盖功能,那么你注定要在一切都生动和流血时找到它。当然可能非常错误:))
答案 6 :(得分:0)
在我看来,静态和动态类型之间的区别归结为编码风格。尽管Scala中存在结构类型,但程序员大多数时候都在考虑对象的类型,包括像trait这样的酷小工具。另一方面,我认为Python / Javascript / Ruby程序员根据对象的原型(方法和属性列表)来思考,这与类型略有不同。
例如,假设有一类名为Vehicle
的类,其子类包括Plane
,Train
和Automobile
;以及另一类名为Animal
的类,其子类包括Cat
,Dog
和Horse
。 Scala程序员可能会创建一个名为Transportation
的特征或具有
def ride: SomeResult
def ride(rider: Someone): SomeResult
作为会员,因此她可以同时处理Train
和Horse
作为交通工具。 Python程序员只需传递train对象而无需额外的代码。在运行时,语言会指出对象支持ride
。
在运行时解析方法调用的事实允许像Python和Ruby这样的语言具有重新定义属性或方法含义的库。一个很好的例子是O / R映射或XML数据绑定,其中未定义的属性名称被解释为表/ XML类型中的字段名称。我认为这就是人们所说的“灵活性”。
在我使用动态语言的非常有限的经验中,我认为只要你不犯错误就可以更快地编写代码。而且,当您或您的同事擅长使用动态语言进行编码时,他们可以减少错误或开始编写更多单元测试(祝您好运)。在我有限的经验中,我花了很长时间才发现Scala可以在一秒钟内捕获的动态语言中的简单错误。在编译时也拥有所有类型,使重构更容易。