为什么动态打字通常与口译语言相关联?

简单的问题家伙:我在C ++ / Java等编译语言和Python / Javascript等解释型语言中进行了大量编程(专业和个人)。 我个人发现,当我使用静态类型语言进行编程时,我的代码几乎总是更健壮。 但是,我遇到的几乎所有解释语言都使用动态类型(PHP,Perl,Python等)。 我知道为什么编译语言使用静态类型(大部分时间),但我无法弄清解释语言设计中对静态类型的反感。

为什么陡峭的断开连接? 它是解释型语言本质的一部分吗? OOP?


有趣的问题。 顺便说一句,我是phc(PHP的编译器)的作者/维护者,并且正在我的动态语言编译器上完成博士学位,所以我希望我能提供一些见解。

我认为这里有一个错误的假设。 PHP,Perl,Python,Ruby,Lua等的作者没有设计“解释型语言”,他们设计了动态语言,并使用解释器来实现它们。 他们这样做是因为解释器比编译器更容易编写。

Java的第一个实现被解释了,它是一种静态类型的语言。 解释器确实存在静态语言:Haskell和OCaml都有解释器,并且曾经是C的一种流行解释器,但那是很久以前的事了。 它们很受欢迎,因为它们允许REPL,这可以使开发更容易。

也就是说,正如你所期望的那样,动态语言社区存在对静态类型的厌恶。 他们认为由C,C ++和Java提供的静态类型系统是冗长的,不值得付出努力。 我想我在某种程度上同意这一点。 Python编程远比C ++更有趣。

为了解决他人的观点:

  • dlamblin说:“我从来没有强烈地感觉到编译与解释有什么特别之处,这表明静态类型的动态性。” 那么,你在那里错了。 编辑动态语言非常困难。 大多数eval语句需要考虑,这在Javascript和Ruby中广泛使用。 phc提前编译PHP,但我们仍然需要一个运行时解释器来处理evaleval也不能在优化编译器中静态分析,但如果不需要健壮性,则有一种很酷的技术。

  • 对damblin对Andrew Hare的回应:你当然可以在解释器中执行静态分析,并在运行时发现错误,这正是Haskell的ghci所做的。 我期望在函数式语言中使用的解释器的风格需要这样做。 dlamblin当然有权说,分析不是解释的一部分。

  • 安德鲁海尔的答案是以提问者错误的假设为基础的,而且类似的事情也是错误的。 但是,他提出了一个有趣的问题:“动态语言的静态分析有多难?”。 非常非常困难。 基本上,你会得到一个博士来描述它是如何工作的,这正是我正在做的。 另请参阅前一点。

  • 迄今为止最正确的答案是Ivo Wetzel。 然而,他描述的观点可以在运行时在编译器中进行处理,并且存在许多具有这种类型的动态绑定的Lisp和Scheme的编译器。 但是,是的,它很棘手。


  • 解释型语言使用动态类型,因为没有进行静态分析的编译步骤。 编译语言在编译时进行静态分析,这意味着任何类型的错误都会在开发人员工作时报告给开发人员。

    如果您认为静态类型语言具有编译器来强制执行上下文之外的类型规则,则更容易理解。 解释语言不会静态分析,因此类型规则必须由解释器在执行的上下文中执行。


    我认为这是因为解释型语言的本质,他们希望是动态的,所以你可以在运行时改变事物。 由于这个原因,在下一行代码执行完毕后,编译器从不知道程序的状态。

    想象下面的场景(用Python):

    import random
    foo = 1
    
    def doSomeStuffWithFoo():
        global foo
        foo = random.randint(0, 1)
    
    def asign():
        global foo
        if foo == 1:
            return 20
        else:
            return "Test"
    
    
    def toBeStaticallyAnalyzed():
        myValue = asign()
    
        # A "Compiler" may throw an error here because foo == 0, but at runtime foo maybe 1, so the compiler would be wrong with its assumption
        myValue += 20
    
    
    doSomeStuffWithFoo() # Foo could be 1 or 0 now... or 4 ;)
    toBeStaticallyAnalyzed()
    

    正如你所希望的那样,编译器在这种情况下是没有任何意义的。 实际上,它可能会警告你“myValue”可能不是数字。 但是,然后在JavaScript中,将失败,因为如果“myValue”是一个字符串,20将被隐含地转换为一个字符串,因此不会发生错误。 所以你可能会得到成千上万的无用的警告,我不认为这是编译器的意图。

    灵活性总是伴随着价格,你需要更深入地了解你的程序,或者更加仔细地编程,换句话说,你是上述情况下的编译器。

    那么你的解决方案是编译器? - 修正它与“尝试:除了”:)

    链接地址: http://www.djcxy.com/p/72305.html

    上一篇: Why Is Dynamic Typing So Often Associated with Interpreted Languages?

    下一篇: Dynamic type languages versus static type languages