用于动态语言

时间:2009-01-29 23:42:47

标签: python programming-languages language-design dynamic-languages duck-typing

我现在的主要语言是D,我正在学习Python,因为这是我正在学习的课程所必需的。虽然我理解为什么动态语言会让人们在没有类型推断或模板的情况下使用静态语言进行编程(IMHO模板在很大程度上是编译时的鸭子打字),但我很好奇动态语言的好处是什么即使你有那些。

最重要的是,如果我要学习Python,我想以一种真正改变我对编程思路的方式来学习它,而不仅仅是在Python中编写D。我没有使用动态语言,因为我是一个相当新手的程序员,无法欣赏他们所提供的灵活性,并希望学会现在充分利用它们。在静态语言中,动态类型的解释语言可以轻松/优雅地完成什么,即使使用模板,多态,静态类型推断,也许还有运行时反射?

13 个答案:

答案 0 :(得分:15)

理论上,动态语言无法做到,静态语言也无法做到。聪明的人在制作非常好的动态语言方面付出了很多努力,导致人们认为动态语言领先,而静态语言需要赶上。

随着时间的推移,这将以另一种方式摆动。已有各种静态语言:

  • 泛型,通过让对象传递时选择正确的类型来使静态类型变得更简单,从而使程序员不必自己投射它

  • 类型推断,可以节省编写应该显而易见的东西的时间

  • 闭包,其中很多其他东西有助于将机制与意图分开,让你从大多数现有成分中拉出复杂的算法。

  • 隐式转换,可让您模拟“猴子修补”,而不会产生通常涉及的风险。

  • 加载代码并轻松编程访问编译器,因此用户和第三方可以编写程序脚本。请谨慎使用!

  • 更有利于在其中创建域特定语言的语法。

......毫无疑问会有更多。动态运动在静态语言设计中产生了一些有趣的发展,我们都从竞争中获益。我只希望更多这些功能成为主流。

有一个地方我没有看到主流动态语言被替换,那就是浏览器中的Javascript。现有的市场需要更换太多,所以重点似乎是改善Javascript本身。

答案 1 :(得分:3)

Here's Steve Yegge关于这个主题。

Guido van Rossum也与his take of Scala中的那次谈话有关。

答案 2 :(得分:2)

  

“我很好奇它的好处是什么   动态语言,即使你有   那些“。

与D编程语言相比:

  • Python是一种更紧凑的语言。它允许你表达尽可能多的D,但它使用更少的不同概念来实现它 - less is more

  • Python有一个功能强大的标准库 - 电池包含

我不知道D是否具有交互式提示,但在Python中,ipython等交互式shell是开发过程的一个集成部分。

答案 3 :(得分:2)

Python中的示例:

def lengths(sequence):
    try:
        return sum(len(item) for item in sequence)
    except TypeError:
        return "Wolf among the sheep!"

>>> lengths(["a", "b", "c", (1, 2, 3)])
6
>>> lengths( ("1", "2", 3) )
'Wolf among the sheep!'

您认为这需要我写多长时间,以及编译运行调试周期有多少?

如果您认为我的示例很简单,我可以回答说动态语言会使许多编程任务变得微不足道。

答案 4 :(得分:1)

在动态语言中,您可以使用您知道正确的方式使用值。在静态类型语言中,您只能以编译器知道正确的方式使用值。你需要你提到的所有东西来重新获得由类型系统带走的灵活性(我不是在抨击静态类型系统,灵活性通常是有充分理由的)。如果您想以语言设计者没有预料到的方式使用值(例如,将不同类型的值放在哈希表中),那么您在动态语言中无需处理这种复杂性。 / p>

所以不是你不能用静态类型的语言做这些事情(如果你有运行时反射),它就更复杂了。

答案 5 :(得分:1)

我实际上写了一篇博文:linky。但该帖子基本上可以这样总结:

你会感到惊讶的是,在编译时不必指定你的变量是什么类型的。因此,python往往是一种非常高效的语言。

另一方面,即使进行了良好的单元测试,你也会惊讶于你允许自己制造什么样的愚蠢错误。

答案 6 :(得分:1)

使用对象时动态输入的一大优势是,当您希望多个类具有相同的接口时,您不再需要使用类层次结构 - 这或多或少被称为duck打字。之后很难修复糟糕的继承 - 这使得重构通常比使用像python这样的语言更难。

答案 7 :(得分:1)

关键是,在动态语言中,您可以比静态类型更快地实现相同的功能。因此,生产率通常要高得多。

模板或多态这样的东西原则上给你很大的灵活性,但你必须编写大量的代码才能使它工作。在动态语言中,这种灵活性几乎是免费的。

所以我认为你以错误的方式看待差异,生产力确实是这里的主要观点(就像垃圾收集提高了生产力,但其他方面并不能真正让你做新事物。)

答案 8 :(得分:0)

我打算说闭包但找到了this thread ...(不是我理解它是如何用“静态”语言工作的)

相关概念包括functions-as-first-class-objectshigher-order procedures。 (例如,将函数作为输入和/或将函数作为输出返回的函数)

编辑:(对于这里的挑剔者)我会回应我在@David Locke的帖子上发表的评论。动态解释语言可以将现有的软件程序/项目与在瞬间创建的小型函数或类一起使用,以交互方式探索某些内容。可能最好的例子是函数图形。如果我写了一个带有graph(f,xmin,xmax)函数的函数图形对象,我可以用它来探索x 2 或sin(x)等函数。我一直在MATLAB中这样做;它被解释并具有匿名函数(@(x) x^2),可以在解释器提示符处构造,以传递给更高阶的函数(图形函数,派生运算符,根查找器等)。

答案 9 :(得分:0)

使用动态语言,使用命令行解释器要容易得多,这样您就可以在命令行上测试内容,而不必担心编译步骤,看看它们是否有效。

答案 10 :(得分:0)

我发现像Perl这样的动态语言,在较小程度上,Python允许我为我需要做的事情编写快速而脏的脚本。动态语言中的运行周期要短得多,并且通常需要使用静态类型语言编写更少的代码,从而提高了我的工作效率。不幸的是,这是以可维护性为代价的,但这是我用动态语言编写程序的方式的错误,而不是他们自己的语言。

答案 11 :(得分:0)

在JavaScript中查看此e4x示例:

var sales = <sales vendor="John">
    <item type="peas" price="4" quantity="6"/>
    <item type="carrot" price="3" quantity="10"/>
    <item type="chips" price="5" quantity="3"/>
  </sales>;

alert( sales.item.(@type == "carrot").@quantity );
alert( sales.@vendor );
for each( var price in sales..@price ) {
  alert( price );
}

特别是,请看一下:

alert( sales.item.(@type == "carrot").@quantity );

在典型的静态语言中,您无法编写sales.item,因为在运行时之前您无法知道该项是销售的属性。 这不仅限于e4x。在编写SOAP客户端或在运行时之前不知道的任何其他基础类型进行连接时,您可以以类似的方式编程。 在静态语言中,您通常需要运行一个工具,以非常详细的方式生成存根类或程序。然后,如果Web服务中的某些内容发生更改,则需要重新生成存根。看一下java DOM代码:

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class Foo {

    public Document createDocument() {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement( "root" );

        Element author1 = root.addElement( "author" )
            .addAttribute( "name", "James" )
            .addAttribute( "location", "UK" )
            .addText( "James Strachan" );

        Element author2 = root.addElement( "author" )
            .addAttribute( "name", "Bob" )
            .addAttribute( "location", "US" )
            .addText( "Bob McWhirter" );

        return document;
    }
}

绝对比动态代码更冗长。当然,它不是静态类型的。在运行时之前,无法检查拼写错误的“author”是否为“autor”。所有这些冗长本质上都是为了让你在静态风格中捕捉到一些动态的东西。

我认为这是动态语言的优势之一。

答案 12 :(得分:-2)

当效率和类型安全是优先事项时,往往会使用编译语言。否则我想不出任何人不会使用ruby的原因:)