在 C 中实现动态类型

Posted

技术标签:

【中文标题】在 C 中实现动态类型【英文标题】:Implementing dynamic typing in C [duplicate] 【发布时间】:2012-04-16 23:13:54 【问题描述】:

可能重复:Representing dynamic typing in C

在我的计算历史副讲座中,一位教授深入探讨了明显类型化或类型推断语言,并普遍赞扬了潜在类型语言的伟大之处(更快的开发时间、动态系统等......)。

p>

同一天,在自动机课上,另一位教授说:

动态类型通过添加更多方法来做同样的事情,使事情变得更加复杂。

我一生中大部分时间都在使用静态类型语言:C/C++/Java - 我唯一接触过其他语言的是 Shell Coding 和 Ren'Py。

我的问题是,我可以用 C 编写一个简单的程序来实现两者的一些好处吗?

例如,我可以创建联合来接受所有用户驱动的数据,如下所示:

    typedef union 
        int int_type;
        char char_type;
        //and so on
     dynamic;

   // Var Creation :
   dynamic data;

   // For unknown return type
   void* function(dynamic data);

我意识到联合可能会损害类型安全,但这就是我在这里尝试做的。我还能采取什么其他方法?我只是在尝试演示。

我尝试从this question 获得答案。但老实说,我无法密切关注这些论点。

如果这个问题看起来很愚蠢,我深表歉意。

PS

使用下面的建议,我写了这个:http://codepad.org/A9JAX8lD,它基本上没有什么动态,但至少是一个开始。 我想我明白我的两位教授都想说什么了。

【问题讨论】:

【参考方案1】:

我的建议是尝试使用静态类型语言进行动态类型。它很可能具有低于标准的性能和非常强大的语法负担。相反,如果您只体验过静态类型语言,我强烈建议您尝试Python。它是高度动态的,会教你新的思维方式。

最后但同样重要的是,还有Cython,它是一种使用 C 作为中间语言的 Python 方言。它可以混合静态类型和动态类型,真是令人耳目一新。

【讨论】:

我在Ren'Py 的项目中工作时的 Python 经验很少,尽管这可能不算数。我一定会检查 Cython 及其来源。 @nightcracker,啊,是的,我很抱歉 :)(我同意 cython,这很酷!)【参考方案2】:

如果您想展示 C 如何“不安全”,请尝试使用 void* 来传递参数。缺点是它不是真正动态的,因为如果不先强制转换就无法调用对象上的任何方法。

【讨论】:

我可以用这个吗,例如? codepad.org/m9hd38OV 我同意,它效率低下并且什么都不做,但如果需要,我可能会解析出一些有用的东西。 我认为这是一个有趣的实验 - 让我知道结果 感谢您的想法。 This 是我设法拼凑起来的——我的函数指针功能很浅。我要放弃了——不管怎样,人们在 GType 和 Smalltalk 中做得更好。 只要参数是某种类型的指针,就不需要将参数强制转换为 (void*)。它是自动完成的。【参考方案3】:

我不反对类型,但我不知道任何类型系统不是完全痛苦的 [...] ——艾伦·凯

很有可能在 C 之上实现一个功能齐全的动态类型系统:以 GLib 对象系统所基于的 GType 为例。

但是,由于需要大量样板代码,这些系统通常使用起来很痛苦,而这可以通过使用自定义代码生成器和预处理器来解决,这就是 Objective-C 的起步方式。

【讨论】:

非常感谢您将我指向 Gtype:我正在查看他们的 GNOME PAGE,这真的很有趣。我也在看 SmallTalk wiki - 看起来很好奇。

以上是关于在 C 中实现动态类型的主要内容,如果未能解决你的问题,请参考以下文章

使用C语言为python编写动态模块--在C中实现python中的类

是否可以在 JSF 中实现组件的动态树?

在具有动态大小的内存池的多线程 C/C++ 中实现内存管理器?

在Scala spark中实现动态字符串插值?

根据闭包上下文的要求,返回类型“动态”不是“布尔”

我们如何在sql CTE中实现动态查询?