首页 文章

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

提问于
浏览
13

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

Answers Summary

与像Scala IMHO这样的静态类型语言相比,像Ruby这样的动态语言的主要优点是:

  • 快速编辑 - 运行周期(JavaRebel是否缩小了差距?)

  • 目前Scala / Lift社区比Ruby / Rails或Python / Django要小得多

  • 可以修改类型定义(虽然动机或需要不明确)

7 回答

  • 9

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

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

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

  • 3

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

  • 1
    • 动态语言往往具有更灵活的类型系统 . 例如,Python允许您将新方法注入现有类,甚至注入单个对象 .

    • 许多(并非所有)静态语言都缺乏构造复杂文字的工具 . 例如,像C#和Java这样的语言不能轻易模仿以下的JavaScript { 'request':{'type':'GET', 'path':mypath}, 'oncomplete':function(response) { alert(response.result) } } .

    • 动态语言具有非常流畅的语义 . Python允许导入语句,函数定义和类定义出现在函数和 if 语句中 .

    • eval 是大多数动态语言和少数静态语言的主要内容 .

    • 由于必须完全指定函数参数的类型的尴尬,高阶编程在动态语言中比静态语言更容易(在我的主观意见中) .

    • 这是特别的,因为使用递归HOP结构,类型系统可以真正阻碍 .

    • 动态语言用户无需处理协方差和逆变 .

    • 通用编程在动态语言中几乎是免费的 .

  • 0

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

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

    在选择用于给定任务的语言时,我发现问题更多地涉及其他所有问题 . 在解决语言问题时,工具,文化,图书馆比打字更有趣 .

    另一方面,编程语言研究则完全不同 . :)

  • 1

    史蒂夫耶格herehere以及Guido van Rossum表达了对斯卡拉的一些批评,他们主要攻击斯卡拉's type system complexity. They clearly aren' t "Scala programmers" . 另一方面,这里有一些praise from James Strachan .

  • 4

    我的2美分......

    IMO(强)静态类型语言可能会减少必要的测试代码量,因为其中一些工作将由编译器完成 . 另一方面,如果编译步骤相对较长,则会使“增量式”编程变得更加困难,这在现实生活中可能会导致容易出错的代码,而这些代码只是经过测试才能通过编译器 .

    另一方面,动态类型语言感觉改变事物的门槛较低,这可能会减少响应时间修复和改进的问题,因此可以在应用程序开发过程中提供更平滑的曲线:处理小变化的持续流程比处理bug块中的更改更容易/风险更小 .

    例如,对于设计非常不清楚且应该经常更改的项目,如果它有助于减少不同部分之间的相互依赖性,那么使用动态语言可能比使用静态语言更容易 . (我不坚持那个虽然:))

    我认为Scala位于介于两者之间的某个位置(例如,您不必明确指定变量的类型,与C相比,这可能会简化代码维护,但如果您最终对类型有错误的假设,编译器将会提醒关于它,不像在PHP,你可以写任何东西,如果你没有涵盖功能的良好测试,你注定要找到它,当一切都是现场和流血) . 当然可能是非常错误的:)

  • 3

    在我看来,静态和动态类型之间的区别归结为编码风格 . 尽管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可以在一秒钟内捕获的动态语言中的简单错误 . 在编译时也拥有所有类型,使重构更容易 .

相关问题