您在Scala中缺少的动态语言(如Ruby或Clojure)的功能有哪些?

时间:2010-04-02 12:15:17

标签: ruby scala clojure language-features dynamic-languages

当您选择静态类型语言(如Scala(或F#,Haskell,C#))而不是动态类型语言(如Ruby,Python,Clojure,Groovy(具有宏或运行时元编程功能)时,您在实践中会失去什么? )?请考虑最好的静态类型语言和最好的(在您看来)动态类型语言,而不是最差的语言。

回答摘要

Ruby等动态语言与Scala IMHO等静态类型语言的主要优势是:

  • 快速编辑 - 运行周期(JavaRebel是否缩小了差距?)
  • 目前Scala / Lift社区比Ruby / Rails或Python / Django
  • 小得多
  • 可以修改类型定义(虽然动机或需要不明确)

7 个答案:

答案 0 :(得分:9)

原则上,当你不清楚(在静态环境中)正确的事情是什么时,你放弃了能够忽略你正在使用的类型,而这就是它。

由于复杂的类型检查可能非常耗时,因此您可能也不得不放弃快速的在线元编程。

在实践中,使用Scala,你几乎没有放弃任何其他东西 - 而且我并不特别关心。您不能注入新方法,但可以编译并运行新代码。你必须在函数参数中指定类型(以及带递归函数的返回类型),如果你自己从不犯类型错误,这有点烦人。由于它编译了每个命令,因此Scala REPL并不像Python shell。并且由于它使用了Java反射机制,因此您无法轻松进行在线检查。 Python(无论如何都不是建立自己的检查库)。

答案 1 :(得分:4)

选择哪种静态或动态语言比静态/动态选择本身更重要。一些动态语言具有良好的性能和良好的工具。一些静态语言可以简洁,富有表现力和增量。有些语言很少有这些特性,但确实有大量经过验证的代码库。

答案 2 :(得分:3)

  1. 动态语言往往具有更灵活的类型系统。例如,Python允许您将新方法注入现有类,甚至注入单个对象。
  2. 许多(并非所有)静态语言都缺乏构建复杂文字的工具。例如,像C#和Java这样的语言不能轻易模仿以下JavaScript { 'request':{'type':'GET', 'path':mypath}, 'oncomplete':function(response) { alert(response.result) } }
  3. 动态语言具有非常流畅的语义。 Python允许导入语句,函数定义和类定义出现在函数和if语句中。
  4. eval是大多数动态语言和少数静态语言的主要内容。
  5. 由于必须完全指定函数参数的类型的尴尬,高阶编程在动态语言中比静态语言更容易(在我的主观意见中)。
    • 这是特别的,所以使用递归的HOP结构,类型系统可以真正阻碍。
  6. 动态语言用户无需处理协方差和逆变。
  7. 通用编程在动态语言中几乎是免费的。

答案 3 :(得分:3)

我不确定你是否会因为简单而失去任何东西。静态类型系统要学习的额外负担。

我想你通常也会失去eval,但我从不使用它,即使是在动态语言中也是如此。

在选择用于给定任务的语言时,我发现问题更多地是关于 else 的所有内容。在解决语言问题时,工具,文化,图书馆都比打字更有趣。

另一方面,编程语言研究是完全不同的。 :)

答案 4 :(得分:1)

Steve Yegge herehere以及主要攻击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的类,其子类包括PlaneTrainAutomobile;以及另一类名为Animal的类,其子类包括CatDogHorse。 Scala程序员可能会创建一个名为Transportation的特征或具有

的特征
def ride: SomeResult
def ride(rider: Someone): SomeResult

作为会员,因此她可以同时处理TrainHorse作为交通工具。 Python程序员只需传递train对象而无需额外的代码。在运行时,语言会指出对象支持ride

在运行时解析方法调用的事实允许像Python和Ruby这样的语言具有重新定义属性或方法含义的库。一个很好的例子是O / R映射或XML数据绑定,其中未定义的属性名称被解释为表/ XML类型中的字段名称。我认为这就是人们所说的“灵活性”。

在我使用动态语言的非常有限的经验中,我认为只要你不犯错误就可以更快地编写代码。而且,当您或您的同事擅长使用动态语言进行编码时,他们可以减少错误或开始编写更多单元测试(祝您好运)。在我有限的经验中,我花了很长时间才发现Scala可以在一秒钟内捕获的动态语言中的简单错误。在编译时也拥有所有类型,使重构更容易。