热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

编译为c时进行垃圾收集的算法

我需要某种算法将垃圾收集添加到我的语言(正在编译为c)并添加一个free语句或其他方式,以便它不会有内存泄漏。是

我需要某种算法将垃圾收集添加到我的语言(正在编译为 c)并添加一个 free 语句或其他方式,以便它不会有内存泄漏。

是的,我在编译为 C 时查看了垃圾收集,但我不明白答案,并希望得到关于如何做的更详细的答案。

编辑:例如,如果代码是

int *i = malloc(4);

int *i = malloc(4);

用我的语言,这应该编译为

进而

free(i);

一旦我不再使用或退出堆栈框架 谢谢

回答


您首先需要阅读垃圾收集手册。

您稍后需要用书面英语记录垃圾收集器的约定和不变量。是分代GC吗?它是多线程友好的吗?它是精确的还是保守的?

C.Queinnec Lisp In Small Pieces的书很有帮助。它描述了如何编写各种 Lisp 解释器,以及一些 Lisp 到 C 编译器的代码。一些章节与垃圾收集及其与生成的 C 代码的关系有关。

在龙书(约编译)对GC的一章。

A.Appel 的书Compiling with Continuations也很有帮助。

然后,您可以记录并可能定义实现您的 GC 约定的

请注意,这malloc可以被视为一种分配垃圾收集数据的缓慢方式。例如阅读 Appel 的旧论文Garbage Collection 可以比 Stack allocation 更快(后来讨论过,但它确实提供了一个很好的直觉)。您可以考虑使用mmap(2)获取大内存区域并以更快的方式在其中分配。然后你不会free单独的垃圾值(如果你采用复制 GC 策略,使用切尼算法),但会munmap(2)一次大内存区域。还要研究malloc在GNU libc或musl libc中实现的 C 源代码。

请参阅我的Bismon项目作为带有 GC 的 C 代码(开源,适用于 Linux)的示例。

另请查看Ocaml解释器和编译器的 C 代码。

或者在SBCL或Chicken/Scheme的 C 运行时内。

或者在一些开源JVM的代码中。

该中的bigloo项目是一个Lisp的C编译器。

在GNU Emacs的编辑器包含一个垃圾收集器。该GCC编译器还包含一个。

循环引用很难用引用计数方案处理。

还可以考虑使用Boehm 保守垃圾收集器开源库。

您的 GC 将特定于操作系统,并且可能特定于目标处理器。

所述RefPerSys项目(在C ++中,随着代的C ++在运行时代码)具有GC。

最后,valgrind实用程序(检测内存泄漏的工具)是开源的,可以认为包含一些 GC。

另请阅读最近提交给ACM SIGPLAN会议的论文。其中一些与垃圾收集有关。考虑稍后提交您自己的关于 GC 的论文。

预算几年的全职工作。

附注。作为介绍,请阅读 P.Wilson Uniprocessor Garbage Collection Techniques的旧论文






推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
author-avatar
唯爱-U澄_155
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有