【问题标题】:Why C is not a dynamic language?为什么 C 不是动态语言?
【发布时间】:2011-05-05 20:29:21
【问题描述】:

据我所知,在 C 语言中,我们可以使用函数指针,它在运行时调用 (1)。

根据维基百科的定义:

动态编程语言是一个术语 广泛用于计算机科学 描述一类高层 执行的编程语言 运行时许多常见的行为 其他语言可能会在 编译,如果有的话......

所以我的问题是,为什么 C 不是提供 (1) 中的功能的动态语言?

【问题讨论】:

    标签: c function pointers dynamic


    【解决方案1】:

    C 不是高级语言,它是非常低级的。

    它缺少类和其他高级功能,而是提供直接位翻转和直接操作内存的能力。

    通常,动态语言在某些 VM 上运行,例如 JVM 或 CLR,被解释为 Python,或使用可执行堆栈(即 Haskell)来提供功能。相比之下,C 直接编译成机器码。

    有一些方法可以让 C 进行自我修改,但这是一项非常困难的技术,并不真正符合“动态语言”的条件。

    【讨论】:

    • 动态不等于高级
    • 功能?更像是分心。直接位翻转而不是...间接位翻转?所有语言都对内存进行操作,其中大多数都比 C 多得多,而且效率低得多。
    • 位翻转如何分散注意力?对于系统工作来说,这类东西是无价的。
    【解决方案2】:

    多态行为不是动态语言造成的。一般来说,提到“动态语言”的人指的是它的类型系统。 PHP 是一种动态语言,因为任何变量都可以包含任何类型的数据,并且数据类型之间的转换是隐式处理的。在运行时确定转换的内容和时间。

    另外,我认为 C 未能满足您引用的定义的“高级编程语言类”部分。

    【讨论】:

    • 是的,现在 C 绝对不是高级别的,虽然我以为是我第一次学习它的时候:在 BASIC、Pascal 和 Assembler 之后;它看起来像 Pascal,语法很有趣!
    【解决方案3】:

    因为你的函数指针中的函数仍然在编译时编译。

    您不能在运行时“即时”添加新函数或修改函数。

    【讨论】:

    • 当然可以。野外有自修改代码。是的,我的意思是 C。代码可以重新编译自身并执行新的二进制文件或修改其当前的二进制文件。
    • 你可以用任何语言做到这一点。
    • Samoz:你可以,但你生成的代码不是 C,而是某种 asm。
    • @samoz: C 不能重新编译自己。 C 编译器的存在,或执行它的机制,它不是 C 语言的一部分。 (然而,它是 POSIX 特定配置文件的一部分。)最接近纯 C 的方法是自己实现虚拟机和 C 编译器。
    • 大多数 (UNIX) 系统上都有 C 编译器。谁说我不能在我的程序中嵌入基本的 C 编译器?我不是说它实用,只是说你不能是不正确的。
    【解决方案4】:

    您只能将指针分配给编译时存在的函数。您不能在 C 程序的中间编译一个新函数并为该函数分配一个指针。

    【讨论】:

      【解决方案5】:

      由于其类型系统,语言通常被认为是动态的。 C 是静态类型的。这意味着每个变量在创建时都有一个分配给它的类型,并且该类型不能更改。您不能将浮点数据放入 int 指针*。在像 Python 这样的动态语言中,数据有类型,但变量没有。我可以将字符串分配给与分配整数相同的变量。

      您所指的定义似乎也在谈论动态编程,即在运行时添加代码。在 C 中,如果不考虑汇编,就不可能在编译后添加新代码。您的程序在执行时无法决定它是否需要一个新函数。在像 Scheme 这样的语言中,它可以。

      *铸造不计算在内,因为您正在显式转换类型。

      【讨论】:

        猜你喜欢
        • 2010-10-21
        • 1970-01-01
        • 2011-01-17
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 2017-07-31
        • 2015-04-26
        • 2012-08-16
        相关资源
        最近更新 更多