也许有一些妥协,就像在某些情况下禁止void指针等等.但所有这些额外的关键字等.这些添加需要解决的问题是什么?
我有一些方面的想法,什么可能难以解决,但一个很好的坚实的解释将高度赞赏!
解决方法
要解决的主要问题是,C编译器会创建适合于非常恶劣环境的代码.即使是现代的cpu也不了解虚拟功能,地狱甚至功能也是一个伸展. cpu真的不在意,解决堆栈的异常处理代码在任何功能之外. cpu处理指令序列,具有跳转和返回.功能当然没有cpu的名称.
因此,支持函数概念所需的一切都由编译器放在这里.例如. vtables只是正确大小的数组,具有来自cpu视角的正确值. __func__结束为字符串表中的字节序列,最后一个字节为00.
现在,没有什么可以说目标环境是愚蠢的.你绝对可以定位到JVM.再次,编译器必须填写本来不提供的内容.没有原始记忆?然后分配一个大字节数组,并使用它.没有指针?只需使用整数索引到该大字节数组.
主要的问题是C程序看起来与主机环境相当无法识别. JVM并不愚蠢,它知道函数,但它希望它们是类成员.它不期望他们拥有<和>在他们的名字.你可以规避这个,但是你最终得到的基本上就是名字.与今天的名称不一样,这种名称变化不适用于C连接器,而是用于智能环境.所以,它的反射引擎可能会确信有一个类c _plus__plus与成员函数__namespace_std__for_each__arguments_int_pointer_int_pointer_function_address,这仍然是一个很好的例子.我不想知道如果你有一个std ::地图的字符串来反转迭代器会发生什么.
一般来说,其他方式其实很容易. C语言中几乎所有抽象的其他语言都可以被按摩.垃圾收集?今天C已经被允许了,所以你可以支持这个void *.
我还没有解决的一件事是表演.在大字节数组中模拟原始内存?这不会很快,特别是如果你把它们加倍.你可以玩很多的技巧,使它更快,但在哪个价格?你可能不会得到商业上可行的产品.事实上,您可能会使用将C(最常见的实现依赖行为)的最坏部分与VM的最差部分(慢)相结合的语言.