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

ydiff:结构化的程序比较(2012-05-2200:02:07)

转载▼分类:IDEA结构化的程序比较

转载
  分类: IDEA
ydiff: <wbr>结构化的程序比较
(不耐烦的人:点击【这里】可进入 DEMO)

ydiff 是我去年做的一个概念模型,用于试验如何“结构化”的对比两个源程序,由此也引发了一些对版本控制 (version control) 的思考。这里我简要介绍一下。

ydiff 的主要功能是检测代码的修改,包括删除,添加,修改,移动和分解。它跟 Unix 的 diff 程序所要解决的问题相似——对比两个程序,但是它们的方式有非常大的区别。diff 完全不理解程序语言,把程序当成字符串来比较。而 ydiff 像编译器那样对程序进行 parse,然后针对不同的语言进行结构化的比较。ydiff 比起 diff 有如下优点:

  1. 比较结果与空白和格式无关。所以添加空行,换行,分隔符的位置,都不会影响比较的结果。
  2. 不进行无关的对比。比如字符串 "10000" 和数字 10000,不会被认为是经过“修改”而得到。
  3. 理解程序的部分语义。比如它会先比较名字相同的函数,再考虑你是否给函数换了名字。
  4. 能检测代码的移动和分解。这对于寻找旧代码在新代码中的位置非常有用。
  5. 友好的输出界面。输出的结果是交互式的,直观的,容易理解。

ydiff 含有我自己写的多种程序语言的 parser(C++, Javascript, Python,Scheme / Emacs Lisp)。虽然这些 parser 都是相当先进的设计,但是这里我要说明的主要问题是:如果程序被直接保存为一种标准化的数据结构,那么这些 parser 就完全没有必要写了!那样的话,这种结构化的比较会非常容易的扩展到支持所有程序语言。这是目前的文本编辑和存储的方式不可能做到的。

我正在设想如何实现结构化的版本控制 (structural version control)。这个内容比较复杂,我以后再讲。有兴趣的话可以暂时参考我之前的一个 talk。

ydiff 是开源软件,主要算法使用 Scheme (Racket) 实现,比较结果的网页界面含有一点 Javascript。由于是概念模型,还没有很友好的运行界面和文档,所以现在只是把生成的一些结果拿出来示意一下。如果有兴趣看代码,可以访问我的 GitHub。

上图是 ydiff 对两个不同版本的 Python 程序生成对比结果之后的界面。
(点击【这里】可进入 DEMO)

图例:

  • 白底红框:未修改的内容
  • 红色:删除的内容
  • 绿色:添加的内容
  • 蓝色:修改过的内容(鼠标指针放上去之后显示修改的方式和相似度)


在这个网页里可以进行的基本的操作是:

  • 滚动任意一边的程序,另外一边随之滚动并且对齐。
  • 点击任意一个白底红框或者蓝色方框,另外一个窗口自动滚动到对应位置

另外的 DEMO:

  • C++ DEMO1:D8, Google的 V8 Javascript引擎里的 debugger。这里比较的两个版本,跨域两年的时间间隔。普通的 diff 会输出非常不可读的内容,但是 ydiff 的比较结果可以一目了然的看到在两年里这个程序的变化。比如你会发现 Shell::Initialize 函数被分解成了4个函数: Shell::Initialize, Shell::CreateGlobalTemplate, Shell::RenewEvaluationContext 和 Shell::InstallUtilityScript
  • C++ DEMO2:V8 中的两个处理器模拟器(MIPS 和 ARM)对比。这里对比的内容不是同一个程序的两个不同版本,而是两个不同的程序。对比结果可以清晰的显示其中的相似性,所以我觉得在检查程序侵权和作业抄袭方面可能会有用处。
  • Javascript:对比 ydiff 自己的浏览器程序的两个版本。
  • Emacs Lisp:对比 Taylor Campbell 的 paredit-mode.el 的两个版本。同时推荐 paredit-mode。它是一个非常不错的结构化编辑 Lisp 的 Emacs mode。
  • Scheme:对比两个不的 miniKanren 实现。miniKanren 是 Dan Friedman 教授设计的,主要用于教学的逻辑式编程语言。这里比较的是原来的版本和一个我重新写过的版本。
  • S-expression:对比我的 Scheme 编译器的一个优化算法生成的两个不同中间结果(IR),用于寻找编译器的 bug。

希望这些例子可以展示数据结构化存储之后可能带来的一些编程环境的变化。

推荐阅读
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 本文深入探讨了JavaScript解释器的核心功能及其在开发过程中的重要作用。通过分析其工作原理和应用场景,帮助开发者更好地理解JavaScript解释器如何高效执行代码,提升开发效率。文章还结合实际案例,详细解答了开发者在使用过程中可能遇到的常见问题,为用户提供全面的技术指导。 ... [详细]
  • IveseenpostsregardingwheretoputtheusestrictlineinaTypeScriptcodefile.Myquestion ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 本书详细介绍了在最新Linux 4.0内核环境下进行Java与Linux设备驱动开发的全面指南。内容涵盖设备驱动的基本概念、开发环境的搭建、操作系统对设备驱动的影响以及具体开发步骤和技巧。通过丰富的实例和深入的技术解析,帮助读者掌握设备驱动开发的核心技术和最佳实践。 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 深入解析 JavaScript 代码执行流程:理解执行上下文与变量提升机制
    本文深入探讨了JavaScript代码的执行流程,重点解析了执行上下文和变量提升机制。通过详细分析代码解析过程,帮助开发者更好地理解JavaScript中的作用域和执行环境,为编写高效、无误的代码提供理论支持。 ... [详细]
  • 软件开发史上最具影响力的十位编程大师(附图解)
    在软件开发领域,有十位编程大师对行业发展产生了深远影响。本文基于国外知名社区的一项评选,通过图文并茂的形式,详细介绍了这十位杰出人物,包括游戏开发先驱John Carmack等,为读者呈现了他们卓越的技术贡献与创新精神。 ... [详细]
  • 本文旨在构建一个JavaScript函数,用于对用户输入的电子邮件地址和密码进行有效性验证。该函数将确保输入符合标准格式,并检查密码强度,以提升用户账户的安全性。通过集成正则表达式和条件判断语句,该方法能够有效防止常见的输入错误,同时提供即时反馈,改善用户体验。 ... [详细]
  • R语言,一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R本来是由来自新西兰奥克兰大学的RossIhaka和RobertGentleman开发(也因此称为R),现在由R开 ... [详细]
  • Thisquestionalreadyhasananswerhere:这个问题已经有了答案:HowdoIcheckifanarrayincludes ... [详细]
  • HokoBlur项目地址:HokoFlyHokoBlur简介:aneasy-to-useblurlibraryforAndroid,supporte ... [详细]
  • 本篇内容主要讲解“JavaScript在网页设计中的嵌入应用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小 ... [详细]
author-avatar
手机用户26536338_53
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有