动态语言的真实生活好处?

Roe*_*ler 23 language-agnostic dynamic-languages

我正在探索开发新系统(Web应用程序)的几种可能性.

我是一个"老式的"有点人,在自然界中面向对象(多年前从程序转换而来).我玩过Python并学习了一点Ruby,但坦率地说,我被吸引回使用微软的工具(C#,ASP.NET MVC).所有这些运行时类型,基本内容上没有编译器错误等等,只会让我在构建大型复杂应用程序时更加艰难.

我经常听到人们谈论你可以用动态语言做的伟大的事情,但除了狗,猫以及你能用多快的代码编写一个很酷的方式来计算事物的例子,Visual Studio的"工业实力"似乎消除了那些动态语言提供的整洁小东西,特别是现在您有免费的快速版本的VS和完整版本可供初创公司免费使用.

我觉得我在这里遗漏了一些东西,因为大型应用程序确实是用动态语言开发的,那么在查看大型复杂应用程序时,这些语言能让你做些什么呢?什么能让你放弃VS的力量?

S.L*_*ott 19

"你能以多快的速度编码",所以完全担心我,我很乐意放弃漫长而缓慢的工作,通过编译来完成任务.

动态语言的优点.

  1. 没有编译,没有构建.只需编码和测试,然后部署到生产.

  2. 即刻满足.没有时间花在API调用可能的上面.只需在Python >>>提示符中以交互方式键入它,看看它实际上做了什么.

  3. 非常非常短的设计周期.我不是精心制作具有奖励界面定义和适当的抽象声明和覆盖的类层次结构,而是可以对类进行编码,对它们进行单元测试并完成.

  4. 更少的代码.动态语言自省减少了源的数量.我不会在我的应用程序中写这些东西; 我依靠框架来为我做这件事.但基于框架的代码通常很短; 没有在Java中如此常见的重复声明,您必须在XML配置中重复这些声明.

  5. 没有神秘感.正如我们在Python社区中所说:"使用源代码,Luke." 框架的功能或API的真正含义并不含糊.

  6. 绝对的灵活性.随着我们的要求发生变化,我们不必为破坏整个架构的破坏性变革而苦苦挣扎.我们可以 - 平凡地 - 对几个类进行更改,因为Python的Duck Typing消除了在我们认为不需要它们的情况下改进缺少的接口定义的需要.他们只是不是; 我们没有编写的代码是我们无需修复或维护的代码.

  7. 弹性.当我们的精算师有脑屁时,我们不必花费数月时间来弄清楚如何将这种新的,更复杂的承保模型整合到应用程序中.几乎任何东西都可以被挤进去.再次,这完全是鸭子打字的结果.我们从一个无法预测新业务模式的架构中解脱出来.

  8. 由于源应用程序,因此源可以是它自己的配置文件.我们在某些外来语法中没有XML或INI配置文件.我们在Python中有配置文件.Django框架做到了这一点,我们跟随他们的领导.我们为销售演示和单元测试提供了非常复杂的模拟数据声明.超复杂数据实际上是来自数据库的Python对象的集合 - 除了 - 我们省略了加载数据库.只调整Python对象构造函数而不是加载SQL数据库更简单.

[BTW.经过30多年的Cobol,Fortran,PL/I,Java,C,C++软件开发,我只是厌倦了大多数编译语言所需的相对低级的手工优化.几年前,我读到了大多数编译器效率低下的评论:它引导我们创建精细的构建系统来解决编译器的限制.我们只需要make因为cc它太慢了.


编辑

动态编程不会让你成为天才.它只是节省了很多时间.您仍然需要管理学习过程.你不知道的事情在所有语言中都很难.动态语言允许您逐步进行,一次发现一件新事物,而无需进行大量设计工作,只是发现您的假设是错误的,从而为您提供了杠杆作用.

如果您想根据误解的API编写大量代码,那么动态语言可以提供帮助.您可以自由编写大量以语言崩溃和烧毁的代码:C#,VB,C++,Java或Python.您始终可以编写无效的代码.

编译器会提前警告代码不起作用.通常,不编译是一个很大的暗示.但是,您仍然可以编写大量编译并失败所有单元测试的代码.编译器只检查语法,而不检查语义.

Python可以提前警告代码不起作用.通常,您无法以交互方式运行它.但是,您仍然可以编写大量未通过所有单元测试的代码.

  • 绝对自由,绝对释放....但这听起来有点像火车残骸的食谱. (6认同)
  • @Kenny:有趣的是,我从未提及"绝对自由".我们仍然受到(a)语言(b)架构,(c)合理设计以及(d)必须通过大量单元测试的约束.不确定你从哪里得到"绝对自由"的引用.我当然没有说出来,并试图不暗示它. (6认同)
  • "没有任何谜团.正如我们在Python社区中所说:使用源代码,Luke." - 这是另一种说法,生活太短暂,无法将界面与实施分开.当你编写代码时非常棒,如果你要发送给需要将代码封装在一些明确定义的抽象背后的第三方,则不可行.您也可以在其他语言中查找源代码,并得出结论(例如)文件名可以安全地包含":"字符.崩溃.然后燃烧. (6认同)
  • "Python始终将接口与实现分开." 如果我发送2000行代码,15行API文档,在六周内承诺版本1.1,并且告诉"接口与实现完全分离",我看不出那些7个诡辩词如何帮助我.当然不是.动态语言和鸭子类型在定义前向和后向兼容接口时根本不协助*.我从不关心接口对当前版本的代码是什么 - 我只关心这个和未来版本之间的通用接口. (5认同)
  • @ S.Lott:现在你走得太远了,搜索和替换不是重构.首先,它是不安全的,除非你一次做一个(不要告诉我你只是在做"替换所有"并祈祷动态的上帝),其次它比用ReSharper重命名方法慢几个数量级. C#,随着代码库的不断增长而变得越来越糟糕. (2认同)

Dav*_*ley 6

静态类型是一种过早优化的形式.当你可能没有制作它们的知识时,它会迫使你事先做出详细的决定.除非您创建足够的类型以使其符合逻辑,否则它对程序的正确性没有特别的帮助.这使得在运行中更改数据结构变得困难.

你从中得到的是非常有限的正确性检查:非常有限,因为它没有分开使用int的方式,例如.假设我们正在处理行和列; 两者都可能是整数,但行和列变量不应互换使用.您也可以获得优化,这可能是一个非常有用的东西,但不值得放慢初始开发速度.您可以通过编写适当的测试来弥补正确性检查.

Common Lisp类型系统对此有好处.所有数据对象都知道它们的类型,如果您愿意,可以显式指定该类型.

eval循环类型的执行模型使您可以在编写例程时轻松测试它们.您不必事先明确地编写测试(尽管没有什么可以阻止您这样做); 您可以编写它们并在运行中执行它们(然后您可以将其改进为测试套件 - 将其视为增量测试开发).

没有很长的构建步骤可以更容易地进行测试驱动的开发,因为运行测试要快得多.每次要测试时,您都不必分解您正在做的事情.

当我听到有人抱怨动态语言时,我会想起有人抱怨没有独占锁的版本控制系统.通过迁移到现代VCS,需要很长时间才能意识到他们获得了什么,同样需要一些人花很长时间来欣赏动态语言.


Vat*_*ine 5

总的来说,我更喜欢谈论"交互式"语言而不是"动态"语言.当您只有编辑/编译/运行周期时,任何周转都需要很长时间.好吧,至少按照"需要保存,编译,检查编译报告,测试运行,检查测试结果"的顺序.

使用交互式语言,通常很容易修改一小部分,然后立即测试结果.如果您的测试运行仍然需要一段时间,那么您没有赢得那么多,但您通常可以测试较小的情况.这有利于快速发展.一旦你有一个已知正确的实现,这也有助于优化,因为你可以快速开发和测试新的,改进的功能,并尝试不同的表示或算法.

  • 不同的事情 - 一些静态类型的语言(Java,无论如何)现在支持增量编译和热代码替换,这使得几乎相同的体验. (2认同)
  • 我大多使用这种方法的语言是Common Lisp.我想这意味着现在计算机语言定义中存在第三个(或者甚至是第四个)轴(强/弱类型,静态/动态类型,交互/批处理以及可能的脚本编写). (2认同)