首页> 中国专利> 用于对具有缺少源位置的代码段的源代码建模的方法

用于对具有缺少源位置的代码段的源代码建模的方法

摘要

本发明公开了一种用于对不具有位置的代码段建模的系统和方法。可以将源代码编索引,以及在数据图中使用表示代码段的节点和表示节点之间的关系的边来建模。然而,一些代码元素可能是隐藏的或者隐式的,并且因此可能缺少位置信息。在这些情况下,创建代码虚构并且表示为图中的节点。虚构节点可以被特别地指派,使得虚构节点能够很容易地同真实源代码节点区分开来。然后更新图以便包括与隐藏代码或者隐式代码交互的节点中的代码虚构的位置信息。然后可以将数据图提供给用户,或者将数据图提供作为要通过编码工具来使用的服务。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-03-20

    专利权人的姓名或者名称、地址的变更 IPC(主分类):G06F9/44 变更前: 变更后: 申请日:20140204

    专利权人的姓名或者名称、地址的变更

  • 2017-05-17

    授权

    授权

  • 2015-11-11

    实质审查的生效 IPC(主分类):G06F9/44 申请日:20140204

    实质审查的生效

  • 2015-10-07

    公开

    公开

说明书

背景技术

软件开发者使用若干不同的编程语言来编写源代码。每个编程语言具有不同的语法和语义。需要编码工具(该编码工具包括代码浏览器、集成的开发环境(IDE)和历史分析工具)能够理解源代码语言,以便这些工具能够用于软件开发者。多数工具擅长表示一种或多种语言,但是在支持其他语言方面具有困难。为了跨所有编程语言具有适当的工具支持,应当存在能够由所有工具来使用的单个代码模型。针对所有语言来表示源代码的语义和语法需要复杂的数据模型和理解每种语言的细微差别的服务。还需要数据模型和服务能够对元素编索引以及显示来自任何编程语言和跨语言的元素之间的关系。

发明内容

本说明书描述了总体上与数据建模相关的技术,以及具体地与用于对缺少源位置的代码段建模的方法和系统相关的技术。

一般而言,本说明书中所描述的主题的一方面可以在用于对源代码建模的系统和方法中来实施。示例性系统包括一个或多个处理设备以及存储指令的一个或多个存储设备,该指令在由一个或多个处理设备执行时引起一个或多个处理设备:接收包括不具有源位置的代码段的源代码;对所接收的源代码编索引;根据经编索引的源代码创建数据模型,该数据模型包括表示代码元素的多个节点以及用于元素之间的关系的多个边;确定要与每个节点关联的源位置;响应于将代码段中的一个代码段识别为隐藏代码段或者隐式代码段,创建用于代码段的虚构表示;以及将所创建的代码段指派为与代码段的节点关联的源位置。示例性方法包括:接收包括不具有源位置的代码段的源代码;对所接收的源代码编索引;根据经编索引的源代码创建数据模型,数据模型包括表示代码元素的多个节点以及用于元素之间的关系的多个边;确定要与每个节点关联的源位置;响应于将代码段中的一个代码段识别为隐藏代码段或者隐式代码段,创建用于代码段的虚构表示;以及将所创建的代码段指派为与代码段的节点关联的源位置。用于使用表示不具有源位置的代码段的数据模型的第二示例性方法包括:请求包括不具有源位置的代码段的代码的数据模型;接收包括不具有源位置的代码段的虚构表示的所请求的数据模型;以及可选地向最终用户显示所述代码段的所述虚构表示。

这些以及其他实施例可以可选地包括以下特征中的一个或多个特征:可以特别地注释虚构节点以将所述节点同所述数据模型中的其他节点区分开来;可以向用户提供数据模型;可以经由应用编程界面(API)来提供数据模型;可以经由用户界面向用户提供数据模型;可以经由命令行代码来向用户提供数据模型;虚构表示的内容可以是有效的代码语法;虚构表示的内容对代码行为建模,但是不表示有效的代码语法;可以存在有在使用隐藏代码段或者隐式代码段的源代码的节点与表示所创建的虚构的节点之间的边;数据模型可以包含关于虚构表示的元数据;元数据可以用来示出或者隐藏来自最终用户的虚构表示;元数据可以用于显示代码段是虚构这一信息;元数据可以用于显示代码段包含虚构这一信息;以及数据模型可以使用应用编程界面来请求。

在仅以说明的方式给出的附图以及下面的说明书中给出本发明的一个或多个实施例的细节。本发明的其他特征、方面和优点根据说明书、附图和权利要求将变得很清楚。各个附图中相似的附图标记指示相似的元素。

附图说明

图1a是图示示例性代码段的框图。

图1b是图示示例性代码段的框图。

图2是图示用于图1a和图1b中定义的代码段的数据模型的框图。

图3是图示对两个代码段编索引并且绘制两个代码段的示例性过程的框图。

图4是图示用于图3中定义的代码段的数据模型的框图。

图5是图示包括用于隐藏代码和/或隐式代码的代码虚构的、用于图3中所定义的代码段的示例性模型的框图。

图6是图示对宏编索引并且绘制宏的示例性过程的框图。

图7是图示用于图6中定义的宏的数据模型的框图。

图8是图示包括用于隐藏代码和/或隐式代码的代码虚构的、用于图6中定义的宏的示例性模型的框图。

图9是用于创建表示隐藏代码和/或隐式代码的代码虚构的示例性方法的流程图。

图10是图示示例性计算设备的框图。

图11是用于使用表示不具有源位置的代码段的数据模型的示例性方法的流程图。

具体实施方式

示例性数据模型和服务提供源代码和编译器元数据的语言中性规范化表示。该模型将源代码表示为数据图。数据图是存储数据并且使用有限点集、调用节点、线、调用边来示出数据之间的关系的数据结构。如图2所描绘的,通过使用边彼此连接节点来表示图内的关系。

为了根据源代码来创建数据图模型,必须将源代码翻译成形成图的节点和边的集合。一种产生高的精度水平的便利方法是针对源代码重用现有的编译器。编译器可以设置有编索引器,该编索引器从编译器提取数据以构造用于数据图模型的节点和边。

图1a和1b示出可以一起用于指出词语“hello world”的源代码文件的两个示例片段。图1a中的文件“stdio.h”(105)包含行2上的函数“printf”的定义,其将串“format”的指针作为参数并且向标准输出写入由“format”指出的串。在图1b中,文件“hello.c”(11)包括行2上的“stdio.h”文件并且在称为“main”(行3)的函数中使用来自行4上的“stdio.h”的“printf”的定义以向标准输出写入串“hello world”。数据模型可以将源代码片段表示为如下,该图类似于图2中所描绘的图。图2示出两个文件“hello.c”(232)和“stdio.h”(234)作为图中的节点,其具有用两个节点之间的双向边表示的“包括/被包括”关系。表示文件“hello.c”(232)的节点通过描绘两个节点之间的“声明/被声明”关系的双向边连接到表示函数“main”(224)的节点。表示文件“stdio.h”(234)的节点通过“声明/被声明”关系边连接到用于“printf”(222)的节点。由于“printf”由“main”在源代码中调用,因此表示“main”(224)的节点通过“调用/被调用”关系镜像边连接到表示“printf”(222)的节点。在图中,用于“main”(224)的节点和用于“printf”(222)的节点二者与它们所返回的内置类型具有关系。“main”(224)具有空的返回,并且“printf”返回“int”(206)。

如以上所讨论的,创建节点以表示源代码的分段。节点可以表示若干不同类型的元素,诸如:内置类型;参数化的类型;复合类型;指针类型;符号声明;用户定义的类型;引用;方法,方法调用,字段,指派,评论,内联文档和文件。每个节点可以包含某些信息,这些信息包括:用于节点的全局唯一标识符;元素的种类;显示名称;元素在源代码中的位置;元素的修饰符;维数;以及源代码中元素周围存在的代码片段。节点可以是但不限于若干种类中的一种,诸如:未决,评论,丢失,名称空间,分组,模块,类,结构,接口,枚举,枚举常量,函数,方法,构造函数,域,局域,参数,变量,属性,布尔,字符,字符串,正则表达式,整数,浮点数,固定数目,有理数,复数,大数,对象,实例,文件,目录,符号链接,诊断,指针,引用,别名,空,空的,单元,变化类型,参数类型,变量类型,专门化类型,符号,名称,值,使用,数组,设置,映射,列表,元组,联盟。

边可以表示数据模型中的元素之间的关系。这些边可以是双向的,这表示从第一节点到第二节点的每个边具有从第二节点到第一节点的镜像边。可以存在有若干不同种类的边对,包括:扩展/被扩展;实现/被实现;跨接/被跨接;继承/被继承;声明/被声明;捕获/被捕获;基础类型/包括类型;具有类型/属于类型;返回类型/被返回;调用/被调用;例示/被例示;引用/被引用;具有属性/属于属性;具有声明/属于声明;具有定义/属于定义;具有输入/被消耗;具有输出/被产生;生成/被生成;被限于/被允许访问;使用情境/封闭式用途;被注释/注释;父/子;以及丢弃/被丢弃。

在一些情况下,数据图存储关于不具有源位置的元素的语义信息,因为一些代码段是隐藏代码段或者隐式代码段并且不具有物理位置。不具有位置的代码的示例包括:默认构造函数;宏扩展;模板实例;静态可索引运行时间对象;隐式函数参数;lambda扩展;文档评论;常量合并以及生成代码。

可以引用隐藏代码段或者隐式代码段、使用或者链接到源代码的其他部分。问题是,这些代码段缺少位置。如果用户想要从源代码中调用上述代码段中的一个代码段的位置对该段遍历数据图,则一般的“jump”函数不起作用,因为源代码中没有用于隐藏代码段或者隐式代码段的实际物理位置,并且因此数据图中没有用于元素的位置。隐藏代码段或者隐式代码段还可以不具有在源语言中的有效的语法的表示。

在存在有隐藏代码或者隐式代码的某些情况下,普通的数据模型通常示出如下消息,其告诉用户没有源位置可用。其他普通模型备选地合成指向相关源代码片段的位置。虽然这一合成方法可以足以用于软件开发者理解代码,然而这一方法不可用于静态分析工具。例如,在默认构造函数的情况下,如果用户点击构造函数的例示,则数据图模型可以替代地将用户带到类的声明。多数用户(如果他们点击默认构造函数)会理解数据图模型为何将他们带到使得隐式的默认构造函数变为存在的声明。然而,静态分析工具可能没有这一特定知识。因此,如果静态分析工具想要在存在隐藏代码或者隐式代码的情况下重构源代码,则工具很可能会向无效的代码中写入代码。另一普通模型包括建立普通用户界面,但是这一模型要求每种隐藏数据/隐式数据具有其自己的方式来存储元数据以及定制UI。

示例性数据图模型没有跳过或者合成备选的位置以隐藏代码段或者隐式代码段。相反,示例性模型通过创建代码虚构来暴露隐藏代码段/隐式代码段的表示。示例性方法认识源代码内的隐藏/隐式代码段。然后针对隐藏代码/隐式代码生成源“虚构”。这些虚构不需要是实际编译代码或者甚至源语言中的有效的语法。然而,虚构应当以有意义的方式来表示隐藏代码或者隐式代码。优选的是,虚构具有尽可能靠近原始源语言的语法,以便最终用户能够理解虚构。

用于对不具有源位置的代码段建模的示例性方法开始于源代码(901),如图9所示。然后应当对源代码(903)编索引。可以根据经编索引的源代码、使用表示元素的节点以及表示节点之间的关系的边来生成数据模型(905)。对于每个节点,可以确定源位置(907)。如果用节点表示的代码段是隐藏的或者隐式的,则可以创建代码段的代码虚构表示(909)。然后可以使用虚构位置来对表示隐藏代码或者隐式代码的任何方面的任何节点的位置(911)建模。还可以特别地注释虚构代码以区分虚构节点与真实节点。然后可以经由用户界面、应用编程界面或者某些其他机制来向最终用户提供数据。

图3图示其中示例性服务对两个java文件编索引以创建示例性数据图模型的过程。Demo.java()(305)在行3具有对Tester类的默认构造函数的调用。Tester类被定义在Tester.java(303)中,但是Tester.java(303)中不存在默认构造函数的清楚定义。因此不存在用于这一构造函数的源代码,并且编译器可以将默认实现方式编辑为用于代码的占位符。

图4是用于Demo.java()(305)与Tester.java(303)之间的交互的数据图模型的部分实现。如以上所讨论的,节点描述了源代码中的元素。在这一示例中,每个节点具有唯一的标识符(标签名称)和源位置。该节点经由标记的边而相关。当做出从Demo.java行3(409)向Test构造函数(404,行3)的调用时,很难发出构造函数(412)与构造函数节点(408)的使用之间的边,因为不存在附接至描述构造函数节点(408)的节点的源位置。

在诸如图5所示的示例性数据图模型中,添加虚构(519)以表示隐式的Tester构造函数(521)。这一虚构(519)(其是自身可能不可编译的java代码的片段)包含关于用于用户理解隐式代码的构造函数的足够信息。描述虚构(519)的代码被标注为特定注释,诸如,如节点中所示的“虚构:真实”,从而表示节点是虚构。然后修改描述Tester构造函数(509)的节点以具有指向新添加的虚构的节点的位置。

图6图示用于对定义和使用宏(601)的C++文件建模的示例性过程。宏是规定应当如何根据定义的过程来将某个输入序列映射至替代输入序列的规则或者方式。

图7是在对图6的源代码编索引时可以创建的数据图的部分实现。在这一图中,很难对源代码的行10(703)上的“IntegerContainer”的使用建模,因为已经通过在行7(703)调用宏而引入了结构体(704,行07),但是不存在用于结构体的定义的任何实际的源代码。另外,很难对行11(703)上的“IntegerContainer”类型的字段值建模,因为不存在用于“IntegerContainer”的任何实际源代码。使用丢失位置(711)向图中放入“IntegerContainer”。在没有位置(713)的情况下还向图中合并“IntegerContainer”的值。

图8示出创建包含IntegerContainer结构体(807)的定义的新的文件“//fingments/container.cc/IntegerContainer”的示例性图。然后可以使用这一新的文件(804)作为用于以下两个节点的位置信息:表示IntegerContainer STRUCT(805)的节点以及用于IntegerContainer值FIELD(816)的节点。另外,可以在原始源文件中在值字段的类型与类型定义的定义之间添加使用节点(817)。另外,因为虚构表示了由用户动作创建的语义,所以在宏(803)的使用与虚构文件(804)之间可以创建有边,该虚构文件(804)定义这两个节点之间的“FIGMENT/FIGMENT_OF”关系。

位置信息可以是关于代码段的位置有用的任何种类的信息。虽然图中的位置信息被示出为文件或者行号,但是这一信息仅出于示例目的而图示。

在示例性实施例中,编码工具和用户界面可以使用通过虚构增强的该数据模型以向最终用户表示代码。用于使用表示不具有源位置的代码段的数据模型的示例性方法开始于请求数据模型(1101),如图11所示。可以使用对示例性数据图模型服务的应用编程界面(API)调用来请求数据模型。所接收的数据模型可以包含不具有源位置的至少一个代码段。所接收的数据模型可以包括不具有源位置的代码段的虚构表示(1103)。然后可以向最终用户显示这一数据模型(1105)。除了不具有源位置的代码段的虚构表示,数据模型还可以包含关于虚构表示的元数据。这一元数据可以包括作为虚构的模型节点与不是虚构的模型节点之间的区别。数据模型还可以提供包含没有源位置的代码段的节点与表示没有源位置的代码段的节点之间的边关系。可以对该边关系建模为“FIGMENT_OF?HAS_FIGMENT”关系。代码工具和用户界面可以使用元数据、边关系和其他所提供的信息来确定要向用户显示什么信息。

图10是被布置用于在代码段不具有源位置时对数据模型中的代码段建模的示例性计算机(1000)的高层框图。在非常基本配置(1001)中,计算设备(1000)通常包括一个或多个处理器(1010)和系统存储器(1020)。存储器总线(1030)可以被用于处理器(1010)与系统存储器(1020)之间的通信。

取决于所期望的配置,处理器(1010)可以是任何类型,包括但不限于:微处理器(μP)、微控制器(μC)、数字信号处理器(DSP)或者其任何组合。处理器(1010)可以包括一层或者多层缓存(诸如层1缓存(1011)和层2缓存(1012))、处理器核(1013)和寄存器(1014)。该处理器核(1013)可以包括算法逻辑单元(ALU)、浮点单元(FPU)、数字信号处理核(DSP Core)或者其任何组合。存储器控制器(1016)还可以与处理器(1010)一起使用,或者在一些实现中,存储器控制器(1015)可以是处理器(1010)的内部部分。

取决于期望的配置,系统存储器(1020)可以是任何类型,包括但不限于:易失性存储器(诸如RAM)、非易失性存储器(诸如ROM、闪存等)或者其任何组合。系统存储器(1020)通常包括操作系统(1021)、一个或多个应用(1022)和程序数据(1024)。应用(1022)可以包括用于双过滤电子邮件注释的系统,使得仅向用户示出与用户很可能进行的动作关联的注释。程序数据(1024)包括存储指令,这些指令在由一个或多个处理设备执行时实现如下的系统和方法(1023),其用于根据电子邮件文本来解析可动作项以及过滤这些可动作项以仅显示用户很可能作用于其的那些项。在一些实施例中,应用(1022)还可以被布置成在操作系统(1021)上运行程序数据(1024)。

计算设备(1000)可以具有附加特征或者功能、以及用以促进基本配置(1001)与任何期望的设备和界面之间的通信的附加界面。

系统存储器(1020)是计算机存储介质的示例。计算机存储介质包括但不限于RAM、ROM、EEPROM、闪存或者其他存储器技术、CD_ROM、数字多功能盘(DVD)或者其他光学存储装置、磁带盒、磁带、磁盘存储装置或者其他磁性存储设备、或者能够用于存储期望的信息并且能够由计算设备1000来访问的任何其他介质。任何这样的计算机存储介质可以是设备(1000)的一部分。

计算设备(1000)可以被实现为小型便携式(或者移动)电子设备(诸如蜂窝电话、智能电话、个人数字助理(PDA)、个人媒体播放器设备、平板电脑(平板),无线web观看设备、个人头戴式设备、专用设备、或者包括任何上述功能的混合设备)的一部分。计算设备(1000)还可以被实现为包括膝上型电脑配置和非膝上型电脑配置二者的个人计算机。

以上详细描述已经通过使用框图、流程图和/或示例而阐述了设备和/或处理的各种实施例。在这样的框图、流程图和/或示例包含一个或多个功能和/或操作的范围内,本领域技术人员应当理解,这样的框图、流程图或者示例内的每个功能和/或操作可以通过各种硬件、软件、固件或者实际上其任何组合来单独地实现或共同地实现。在一个实施例中,本文中所描述的主题的若干部分可以经由专用集成电路(ASIC)、现场可编程门阵列(FPGA)、数字信号处理器(DSP)或者其他集成电路来实现。然而,本领域技术人员将认识到,可以将本文中所描述的实施例的一些方面整体或者部分等同地用集成电路来实现作为以下各项:在一个或多个计算机上运行的一个或多个计算机程序(例如在一个或多个计算机系统上运行的一个或多个程序),在一个或多个处理器上运行的一个或多个程序(例如在一个或多个微处理器上运行的一个或多个程序),固件,或者实际上的其任何组合,以及应当认识到,鉴于本公开内容,设计电路和/或编写用于软件和/或固件的代码在本领域技术人员的技术内。另外,本领域技术人员应当理解,本文中所描述的主题的机制能够被分发作为各种形式的程序产品,并且应当理解,本文中所描述的主题的说明性实施例不管用于实际上执行分发的非暂态信号承载介质的特定类型而应用。非暂态信号承载介质的示例包括但不限于:可记录型介质(诸如软盘、硬盘驱动器、压缩盘(CD)、数字化视频盘(DVD)、数字带、计算机存储器等);以及传输型介质(诸如数字和/或模拟通信介质)(例如光纤线缆、波导、有线通信链路、无线通信链路等)。

关于本文中基本上任何复数个和/或单数个术语的使用,本领域技术人员可以根据情境和/或应用来从复数变换成单数和/或从单数变换成复数。出于清楚的目的在本文中清楚地给出了各种单数/复数置换。

因此,已经描述了主题的特定实施例。其他实施例在以下权利要求的范围内。在一些情况下,权利要求中记载的动作可以按照不同的顺序来执行并且仍然实现期望的结果。另外,附图中描绘的处理不一定必须所示出的特定顺序或者依次顺序来实现期望的结果。在某些实现中,多任务和平行处理可能是有利的。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号