代码之家  ›  专栏  ›  技术社区  ›  sharkin

为什么C++需要语言修改来“管理”?

  •  9
  • sharkin  · 技术社区  · 15 年前

    为什么不能写一个编译器 管理 需要什么 管理 在C++代码中(即使它“CLR兼容”)?

    也许可以妥协一下,比如禁止 无效 指针在某些情况下,但所有这些额外的关键字等。什么问题,必须解决这些增加?

    我对一些方面有自己的想法,有些问题可能很难解决,但如果能有一个很好的解释,我将不胜感激!

    11 回复  |  直到 8 年前
        1
  •  12
  •   MSalters    11 年前

    到目前为止,我不得不不同意这些答案。

    要理解的主要问题是C++编译器创建适合于非常愚蠢的环境的代码。即使是一个现代的CPU也不知道虚拟函数,地狱,甚至函数都是一个延伸。例如,cpu并不关心用于释放堆栈的异常处理代码是否在任何函数之外。CPU处理指令序列,有跳跃和返回。就CPU而言,函数当然没有名称。

    因此,支持函数概念所需的一切都由编译器放在那里。例如,vtable只是具有正确大小的数组,从cpu的角度来看具有正确的值。 __func__ 以字符串表中的字节序列结束,最后一个字节是00。

    现在,没有什么能说明目标环境 一定要哑口无言 . 你完全可以瞄准jvm。同样,编译器必须填写本机没有提供的内容。没有原始内存?然后分配一个大字节数组并使用它。没有原始指针?只需在大字节数组中使用整数索引。

    主要的问题是,C++程序看起来很难从宿主环境中识别出来。jvm并不愚蠢,它知道函数,但它希望它们是类成员。不希望他们有 < > 以他们的名义。你可以绕过这一点,但你最终得到的基本上是名称损坏。与今天的名称混乱不同,这种名称混乱不是针对C链接器,而是针对智能环境。因此,它的反射引擎可能会确信 c__plus__plus 具有成员功能 __namespace_std__for_each__arguments_int_pointer_int_pointer_function_address ,这仍然是一个很好的例子。我不想知道如果你有 std::map 用于反转迭代器的字符串。

    总的来说,另一种方法其实要容易得多。几乎所有其他语言的抽象都可以在C++中进行按摩。垃圾收集?这在C++中已经被允许了,所以你甚至可以支持它。 void* .

    有一件事我还没有提到,那就是表现。在大字节数组中模拟原始内存?这不会很快,特别是如果你投双打的话。你可以玩很多把戏来加快速度,但价格是多少?你可能得不到商业上可行的产品。事实上,您可能会遇到一种语言,它将C++最坏的部分(很多不寻常的实现依赖行为)与VM(慢速)的最坏部分结合起来。

        2
  •  4
  •   Daniel Daranas    15 年前

    现有的正确代码,即按照C++标准编写的代码,不能不经意地改变其行为。

        3
  •  3
  •   Simon H.    15 年前

    很好,c++/CLI主要是托管和非托管代码之间的黏合剂。因此,你需要有能力混合混乱的非管理概念。您需要能够在同一代码中分配托管和非托管对象,因此无法绕过单独的关键字。

        4
  •  3
  •   Hali    15 年前

    为什么你不能编译本地C++代码来引导CLR?

    是的,你猜对了,会有太多的妥协,这会使它毫无用处。我只举三个例子…

    1)模板:C++支持它们,CLR不(泛型不同)。 所以你不能在代码中使用stl,boost等。

    2)多重继承:用C++支持,不支持CLI。 您甚至不能使用标准iostream类和派生类(如stringstream、fstream),它们都继承自istream和ostream。

    几乎所有的代码都无法编译,甚至无法实现标准库。

    3.)垃圾收集: 大多数C++应用程序都是手动管理内存(使用智能指针等),CLR具有自动内存管理功能。 因此,C++风格的“新”和“删除”将与“GCNew”不兼容,使得现有的C++代码对于新编译器来说是无用的。

    如果你必须根除所有重要的特性,甚至是标准库,并且没有现有的代码可以编译…那又有什么意义呢?

        5
  •  2
  •   IMil    15 年前

    首先,“简单C++”和“托管C++”的区别是有意的,因为Mc++的目的之一是在现有的C++代码和CLR之间提供一个桥梁。

    其次,有太多的C++特性不适合CLR模型。多重继承,模板,指针算法…如果不划清界限,程序员将注定在编译和运行时都会面临神秘的错误。

        6
  •  1
  •   Hao Wooi Lim    15 年前

    我认为这是因为在C++中添加托管代码特性会使C++速度变慢,编译器变得更加复杂。所以C++会失去它最初设计的东西。C++的一个优点就是它是一种很好的语言,它的级别很低,但也有一些可移植性。这可能是C++标准委员会计划让它保持下去的原因。无论如何,我不认为C++可以被完全“托管”,因为这意味着用C++编写的程序需要一个VM来执行。如果是这样的话,为什么不直接使用C++/CLI呢?

        7
  •  1
  •   Wladimir Palant    12 年前

    Qt framework 差不多是这样。也就是说,它有智能指针,当它们指向的对象被破坏时,会自动设置为空。 它仍然是一个原生C++,经过MOC(元对象编译器)解析。

        8
  •  0
  •   unixman83    12 年前

    是的,我想C++可以被管理。但是.net需要 重写 对于C++并没有偏向于BASIC。在同一屋檐下有多种语言。某些功能必须要去。这是VB.NET或C++.NET之间的选择,VB.NET被选中。有趣的是,我听说c比vb.net更受欢迎(尽管我两者都不用!).

        9
  •  0
  •   supercat    11 年前

    .NET CLR要求在运行时不知道的任何地方都不能存在对托管对象的引用,除非对象被固定;良好的性能要求对象尽可能少被固定。由于.NETCLR无法理解所有在C++中可用的数据结构,因此在这样的结构中不必对托管对象进行引用。可以使用“普通”C++代码与.NET代码交互,而不需要对C++语言进行任何更改,但是C++代码可以将任何类型的引用引用到任何.NET对象的唯一方法是在.NET端上有一些代码为每个对象分配某个句柄,并保持一个S。与句柄关联的对象的静态表。想要操纵对象的C++代码就必须要求.NET包装器对句柄所标识的对象执行一些操作。添加新语法使编译器能够识别.NET框架需要了解的对象类型,并对它们实施必要的限制。

        10
  •  -1
  •   5hammer    9 年前

    首先要考虑的是 每一件事 c++ “快”就会消失。 C++中的完全垃圾收集系统几乎是不可能的。 因为 C++ 在代码中几乎任何地方都可以有指针。 如果不直接将运行时类型信息内置到 兰戈系统。 您可以利用真正的本机性能。 模板将消失。真正的指针将消失。 对内存的直接访问已经消失。

    必须执行的事项列表

    1. no direct pointers(pointers will get replace with complex refernces)
    2. templates (generics pay for preformance)
    3. simple c-style arrays (will get wrapped with array structures)
    4. programmer no longer has control of whether data is on the stack or
    the heap.
    5. garbage collection will be enforced(this will cause the most changes to the syntax)
    6. runtime type data will get added extensively to the code.
    (larger code size)
    7.  inlining will become more difficult for the compiler
    (no more inline key word)
    8. no more inline assembly.
    9. the new langauge by now will become incompatible c code.(unless you go through hoops) 
    
        11
  •  -1
  •   Unknown    8 年前

    我同意五锤!如果我离开Java和其他管理语言,那不是毫无用处的:那就是对计算机进行完全控制,访问内存管理内存,控制计算机如何运行我的代码,与C库(如Lua)集成。 如果我松了这个灵活性,那么我就离开C++,回到C,如果C也被管理了,那么我会去汇编程序。

    托管语言对于所有游戏平台/复杂程序来说都是最糟糕的,因为它们将您限制在无法直接访问硬件的沙箱中,并且比编译语言慢得多。

    C++的主要目的一直是性能。它是大型游戏的最佳语言之一。没有这种语言的表演,很多游戏就不存在了!