Pointers 无显式内存alloc/dealloc和无垃圾收集的语言 我想知道是否可以创建一个没有明确的内存分配/解除分配的编程语言,比如C,C++…没有像Java这样的垃圾收集,C。。。在每个范围结束时进行全面分析

Pointers 无显式内存alloc/dealloc和无垃圾收集的语言 我想知道是否可以创建一个没有明确的内存分配/解除分配的编程语言,比如C,C++…没有像Java这样的垃圾收集,C。。。在每个范围结束时进行全面分析,pointers,memory,garbage-collection,Pointers,Memory,Garbage Collection,明显的问题是,在每个范围结束时,这将需要一些时间,但我想知道,在当前CPU的所有处理能力和多核情况下,这是否变得可行。这样的语言已经存在了吗 我也在想,如果C++中的一个变体,其中智能指针是唯一可以使用的指针,它会是这样一种语言,还是我错过了一些问题? 编辑: 经过进一步研究,显然是这样的: 我想知道为什么这个不流行。上面列出的缺点似乎不太严重,我认为开销应该是那么大。对于我来说,一种非解释性的、从底层正确编写的、带有引用计数的C族语法的语言似乎是一个好主意。你所说的没有什么特别的,而且它总是出

明显的问题是,在每个范围结束时,这将需要一些时间,但我想知道,在当前CPU的所有处理能力和多核情况下,这是否变得可行。这样的语言已经存在了吗

<>我也在想,如果C++中的一个变体,其中智能指针是唯一可以使用的指针,它会是这样一种语言,还是我错过了一些问题? 编辑: 经过进一步研究,显然是这样的:
我想知道为什么这个不流行。上面列出的缺点似乎不太严重,我认为开销应该是那么大。对于我来说,一种非解释性的、从底层正确编写的、带有引用计数的C族语法的语言似乎是一个好主意。

你所说的没有什么特别的,而且它总是出现。你所寻找的C或C++变体只是普通的C或C++。 例如,正常编写程序,但约束自己不使用任何动态内存分配—不使用new、delete、malloc或free,也不使用他们的任何朋友,并确保您的库也这样做,那么您就拥有了这种系统。您可以提前计算出所能做的一切所需的内存量,并静态地声明该内存,可以是函数级静态变量,也可以是全局变量。编译器以正常的方式处理所有的计算,在每个作用域的末尾没有特殊的事情发生,并且不需要额外的计算

您甚至可以将运行时环境配置为具有静态分配的堆栈空间—该堆栈空间实际上不在编译器的控制之下—更多链接器和操作系统环境。只要弄清楚你的函数调用链有多深,以及它在探查器或类似工具中使用了多少内存,然后在链接选项中设置它

如果没有动态内存分配,也就没有通过垃圾收集或显式管理进行释放,那么您只能使用编写程序时声明的内存。但这没关系,许多程序不需要动态内存,而且已经这样编写了。在嵌入式和实时系统中,当您绝对、积极地需要确切地知道一个操作需要多长时间,它将使用多少内存和其他资源,并且运行时间和这些资源的使用永远不会改变时,这种真正的需求就会显现出来


< C和C++的伟大之处在于语言对环境的要求很低,并且给了你这么多的工具,智能指针或静态分配的内存,甚至是你所设想的一些特殊的方案可以被实现。要求使用它们,以及你对自己施加的限制,这只是一个政策决定。您可以通过代码审核强制执行该策略,使用脚本扫描源文件或目标文件,并且不允许链接到动态内存库。引用计数的最大问题是它不是一个完整的解决方案,无法收集循环结构。每次设置引用时都会产生开销;对于许多类型的问题,这会很快累积起来,并且可能比稍后等待GC更糟糕。现代GC是非常先进和可怕的-不要像那样倒数

引用计数的问题是循环引用:如果父级有一个子级列表,并且每个子级都知道自己的父级,那么整个树将永远不会被释放。引用计数是实现垃圾收集系统的一种方法。您是要求一个不允许任何动态分配的系统,还是要求一个具有不同于标记和扫描算法的动态分配的系统?此外,执行内存管理策略最好由策略决定。像C和C++这样的语言可以很好地支持引用计数或其他动态内存管理方案,而且当你想按你的方式做事时,它们不会妨碍你的工作。如果您使用的是强制执行这些策略的语言,那么您迟早需要在某些项目中绕过它们。那么你的语言就不能满足你的需要了。如果您正在寻找强制执行这些内容的方法,请参阅下面的我的帖子。在基于引用计数的GC中,有几种方法可以检测周期。不过,它们中的任何一个都很便宜。当您尝试检测这样的循环时,您基本上是在进行标记扫描收集。这是处理该问题的简单方法,但确实存在。弱引用是欺骗:PModern垃圾收集对大多数问题都有好处。如果你的服务器上有50GB的小对象,比如缓存中的小对象,那就没那么多了。扫描堆可能需要30秒或更长时间, 我还没有看到一个系统,其中最旧的堆不会锁定整个进程。如果尝试使用GC语言实现缓存服务器,GC期间的延迟将使其完全不可用。