CN114041117A - 用于代码优化的语法图的持续注释 - Google Patents

用于代码优化的语法图的持续注释 Download PDF

Info

Publication number
CN114041117A
CN114041117A CN202080048722.8A CN202080048722A CN114041117A CN 114041117 A CN114041117 A CN 114041117A CN 202080048722 A CN202080048722 A CN 202080048722A CN 114041117 A CN114041117 A CN 114041117A
Authority
CN
China
Prior art keywords
optimization
code
graph
program
grammar
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202080048722.8A
Other languages
English (en)
Inventor
B·J·F·德斯迈特
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Technology Licensing LLC
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Technology Licensing LLC filed Critical Microsoft Technology Licensing LLC
Publication of CN114041117A publication Critical patent/CN114041117A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9024Graphs; Linked lists
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

定位并记录优化机会以通过编译器或解释器增强代码转换。增强型转换器扫描程序语法图,识别子图结构,并且注释该图的节点,以记录与该节点相关联的程序代码实体的优化特性。子图结构和对应注释可以维持在与任何特定可优化程序不同的优化目录中。优化器基于所注释的语法图来改进程序代码转换。优化特性可以指定关于执行值范围和执行行为(例如,副作用、局部或全局变量使用、I/O、引用参数)的代码纯度,并且哪些异常是可能的。可以使用例程名称、哈希值和具有孔的模板来标识子图结构,任何常数将填满该孔。可以根据子节点的特性来推断父节点特性。可以使用权重函数使优化候选优先化。可以插入优化器回调以递增地评估优化特性。

Description

用于代码优化的语法图的持续注释
背景技术
软件开发活动通常包括转换源代码以获得可执行代码。可以通过编译器完成转换,该编译器通过相对较大段(诸如,整个文件)地转换源代码来产生可执行代码。或者,可以通过解释器完成转换,该解释器较小段地产生可执行代码,例如,一次转换一个单编程语言语句接着执行。因为许多编译器在给定转换工作期间比许多解释器使用更大量的源代码,因此编译器通常比解释器具有更多机会来优化通过转换产生的可执行代码。然而,优化不限于通过编译器进行的转换活动。
优化可以减少可执行代码所使用的存储器量,或者例如减少运行可执行代码所需的时间量。然而,优化是否在实践中而不仅在理论上可用取决于多个因素。给定转换器必须鉴于特定源代码并且鉴于特定目标处理器和目标执行环境来正确地识别给定优化是可能的。此外,针对在实践中可用的优化,转换器必须能够生成可执行代码,该可执行代码具体实现优化而不破坏程序。即,程序的可执行代码的经优化的版本与程序的非优化的版本应关于所有程序输入和对应输出具有相同行为;经更改的行为指示经破坏的程序。例如,经优化的版本与非优化的版本做相同的事情,但是做得更快或使用更少的存储器。
由于这样的相关性并且由于其他因素(诸如,代码优化的复杂度以及从开发人员的视角经常缺失优化的可见性),因此代码优化通常是专门的尝试,其中失去了优化的许多机会。
发明内容
一些实施例使用或执行在代码转换期间寻找优化机会的操作。这些操作扫描程序的语法图的至少一部分。语法图具有节点,并且其表示程序的语法结构方面。操作还查明与语法图的节点相关联的程序的代码具有优化特性,并且其根据经查明的优化特性来注释语法图。然后,实施例能够至少部分地基于所注释的语法图来产生程序的优化。
本文中所呈现的教导的一些实施例包括代码转换优化功能性或与代码转换优化功能性相联,该代码转换优化功能性包括被配置为执行某些操作的数字硬件。这些操作可以包括(a)遍历程序的语法图的至少一部分,(b)识别语法图中的预定子图结构,(c)将优化特性注释与所识别的语法子图结构相关联,所得关联指示代码段的与所识别的子图结构相对应的方面在执行代码段之前可辨别的程度,该方面包括执行值或执行效果或两者,以及(d)至少部分地基于关联步骤的结果来执行程序的代码转换的优化。
与本文中的教导有关的其他技术活动也将对本领域技术人员变得显而易见。所给出的示例只是说明性的。本发明内容即无意于标识所要求保护主题的关键特征或必要特征,也无意于用于限制所要求保护主题的范围。相反,本发明内容被提供来以简化形式介绍一些技术概念,下面在具体实施方式中进一步描述这些技术概念。创新由权利要求定义,并且在本发明内容与权利要求冲突的情况下,应以权利要求为准。
附图说明
将参考附图来给出更具体的描述。这些图仅图示所选择的方面,因此并不能完整地确定覆盖范围或范围。
图1是大体上图示了计算机系统并且还大体上图示了经配置的存储介质的框图;
图2是图示了具有代码转换功能性的计算环境的框图;
图3是图示了代码转换环境的一些示例的框图;
图4是图示了系统的被配置用于使用语法图优化注释功能性的代码转换的方面的框图;
图5是图示了代码段的一些执行相关的方面的框图;
图6是图示了优化目录条目的框图;
图7是图示了语法子图结构标识的框图;
图8是图示了一些优化特性注释中的一些值的一些功能性的框图;
图9是图示了不同种类的优化的一些示例的框图;
图10是语法图示图;
图11是另一语法图示图;
图12是图示了一些代码转换优化方法中的步骤的流程图;以及
图13是进一步图示了一些代码转换优化方法中的步骤的流程图。
具体实施方式
概述
许多创新突破超出其起源,但是理解创新的起源可以帮助人们更完整地理解创新。在现有情况下,通过优化库中的函数代码的技术挑战来推动本文中所描述的一些教导。库函数的相关方面通常是编译器未知的,因此函数不易受诸如常数合并的优化影响。在常数合并中,某些可执行代码被常数值替换而不破坏程序。然而,本文中所呈现的教导不限于该上下文。由在此教导的创新解决的其他技术挑战还将根据下面所提供的讨论对本领域技术人员显而易见。
作为推动示例,编译器通常包括执行常数合并的优化步骤,以便通过评估编译时间的程序的部分来减少所生成的代码的执行时间。这些优化通常是基于原始数据类型的内置知识以及其操作是安全的以进行优化的内置知识。库函数的相关方面(诸如,其功能纯度的程度)(例如,关于异常或副作用)通常是编译器未知的。因此,库函数和其执行上下文不太适合于一些优化。该创新公开内容描述了丰富语义机制,该语义机制向编译器提供信息以允许其执行更彻底的优化。
本文中所描述的一些实施例可以被一些人在更广泛的上下文中检视。例如,诸如注释、恒定性、执行、优化、语法和转换之类的概念可以被视为与特定实施例相关。然而,不必遵循专有权在本文中针对抽象理念寻求的广泛上下文的可用性;其并非如此。相反,本公开集中于提供适当的具体实施例,该具体实施例的技术效果完整地或部分地解决特定技术问题,诸如如何使关于程序优化机会的信息在特定编译或特定开发环境的上下文之外可用。涉及注释、恒定性、执行、优化、语法或转换的其他经配置的存储介质、系统和过程在本发明范围之外。因此,在本公开的适当理解下,还避免模糊、纯粹抽象、缺失技术特性和伴随的求证问题。
更一般地,本领域技术人员将认识到不一定需要本公开的每个部分或其中的任何特定细节以满足诸如启用、书面描述或最佳方式等法律标准。而且,实施例不限于特定转换器、软件开发环境、编程语言、语法图示例、开发工具、标识符、文件、数据结构、记号、控制流、伪码、或者本文中所描述的其他实现选择。与任何其他的专利公开的任何明显冲突(甚至来自本发明创新的所有者)在理解本专利公开中所呈现的权利要求上没有作用。
技术特性
本文中所描述的实施例的技术特性将对本领域技术人员显而易见,并且还将以若干方式对广泛范围的所关注读者显而易见。一些实施例解决诸如代码优化以及从一种形式(例如,高级编程语言或汇编语言的源代码)到另一种形式(例如,汇编语言或字节代码或p代码或机器代码)的代码转换之类的技术活动,这是深知于计算技术的活动。所讨论的技术机制中的一些技术机制包括例如语法图、用于遍历语法图的算法、语法子图结构、用于识别语法子图结构的算法、优化目录、使用或更新优化目录中的条目的算法、各种哈希值、以及优化特性注释(其为数据结构或其部分)。所讨论的一些技术效果包括例如通过由常数替换代码(即,常数合并)而实现的经优化的代码、所存储的数据、所存储的指令、以及存储在例如源代码中、转换器输出中或优化目录中的注释关于优化机会的语义信息的持续。因此,排除纯粹心理过程。一些实施例通过使代码优化实际上更可用来改进计算系统的运作。根据所提供描述,基于教导的技术特性的其他优势还将对本领域技术人员显而易见。
缩略词、缩写词、名称和符号
一些缩略词、缩写词、名称和符号在下面被定义。其他的缩略词、缩写词、名称和符号在本文中的别处被定义,或者在此不需要定义,以便本领域技术人员理解。
ALU:算法和逻辑单元
API:应用程序接口
BIOS:基本输入/输出系统
CD:光盘
CPU:中央处理单元
DVD:数字多用盘或数字视频光盘
FPGA:现场可编程门阵列
FPU:浮点处理单元
GPU:图形处理单元
GUI:图形用户接口
IaaS或IAAS:基础设施即服务
ID:标识或身份
IDE:集成开发环境,有时也被称为“交互式开发环境”
IDS:干扰检测系统,例如可以是或包括HIDS(基于主机的IDS)或NIDS(基于网络的IDS)
IoT:物联网
IP:因特网协议
LAN:局域网
OS:操作系统
PaaS或PAAS:平台即服务
RAM:随机存取存储器
ROM:只读存储器
UEFI:统一可扩展固件接口
VM:虚拟机
WAN:广域网
一些附加术语
本文中对示例性实施例进行了参考,诸如图中所图示的示例性实施例,并且在本文中使用了特定语言来对其进行描述。但是本文中所说明的特征的更改和进一步修改以及(多个)相关领域技术人员将想到的并且具有本公开的所有的本文中的特定实施例所说明的抽象原理的附加技术应用应被视为在权利要求的范围内。
本公开中阐述了术语的含义,所以在阅读权利要求时应仔细注意这些阐述。给出了具体示例,但是(多个)相关领域技术人员将理解的是,其他示例也可以落在所使用的术语的含义内以及一项或多项权利要求的范围内。术语在此不必具有其在一般使用中(具体地,在非技术使用中)或在特定工业使用中或在特定词典或词典集中的相同含义。附图标号可以与各种短语一起使用以帮助显示术语的广度。给定的一段文本的附图标号的省略不一定意味着文本没有讨论图的内容。本发明人主张并行使具体和选定词典学的权利。所引用的术语被明确地定义,但是术语还可以被隐含地定义而不使用引用标记。术语可以被明确地或隐含地定义,此处在具体实施方式和/或申请文件中的别处中。
如本文中所使用的,“计算机系统”(也被叫作“计算系统”)可以包括例如一个或多个服务器、母板、处理节点、笔记本电脑、平板电脑、个人计算机(便携式或非便携式)、个人数字助理、智能手机、智能手表、智能手环、手机或移动电话、至少具有处理器和存储器的其他移动设备、视频游戏系统、增强现实系统、全息投影系统、电视、可穿戴计算系统和/或提供至少部分地通过指令控制的一个或多个处理器的(多个)其他设备。指令可以是存储器和/或专用电路系统中的固件或其他软件的形式。
“多线程”计算机系统是支持多个执行线程的计算机系统。术语“线程”应被理解为包括能够或经受调度并且可能地经受同步的代码。例如,线程还可以在本公开之外被称为另一名称,诸如“任务”、“过程”或“协同例程”。然而,在本文中在线程与过程之间进行区分,原因是线程定义过程内部的执行路径。此外,过程的线程共用给定地址空间,而不同过程具有不同的相应地址空间。过程的线程可以按顺序并行运行或组合并行执行和顺序执行(例如,时间切割)。
“处理器”是线程处理单元,诸如同步多线程实现中的核心。处理器包括硬件。给定芯片可以容纳一个或多个处理器。处理器可以是通用的,或者其可以专用于特定用途,诸如向量处理、图形处理、信号处理、浮点算数处理、加密、I/O处理、机器学习等。
“核”包括操作系统、监控程序、虚拟机、BIOS或UEFI代码、以及类似硬件接口软件。
“代码”是指处理器指令、数据(其包括常数、变量和数据结构)或指令与数据两者。“代码”和“软件”在本文中被互换使用。可执行代码、解释代码和固件是代码的一些示例。
“程序”在本文中被广泛使用的,以包括应用、核、驱动程序、中断处理程序、固件、状态机、库、以及由程序员(也被称为开发人员)写入和/或自动生成的其他代码。
“服务”是指云计算环境或其他网络或计算系统环境中的可消耗程序提供,其向多个程序提供资源或资源访问。
“云”是指用于计算、存储和联网的汇集资源,其是所测量按需服务弹性可用的。云可以是专用的、公用的、社区的或混合的,并且云服务可以以基础设施即服务(IaaS)、平台即服务(PaaS)、软件即服务(SaaS)或另一服务的形式提供。除非另有说明,否则从文件读取或写入文件的讨论包括读取/写入本地文件或经由网络读取/写入,其可以是云网络或其他网络,或者完成两者(本地和联网读取/写入)。
“IoT”或“物联网”是指可寻址嵌入式计算节点的任何联网集合。这样的节点是如本文中所定义的计算机系统的示例,但是其还具有以下特性中的至少两个特性:(a)无本地人类可读显示器;(b)无本地键盘;(c)输入的主要源是跟踪非语言数据的源的传感器;(d)无本地转盘存储装置–RAM芯片或ROM芯片仅提供本地存储器;(e)无CD或DVD驱动器;(f)嵌入在家用电器或家用装置中;(g)嵌入在植入式或可穿戴医疗设备中;(h)嵌入在车辆中;(i)嵌入过程自动化控制系统中;或(j)集中于以下至少一项的设计:环境监测、市政基础设施监测、工业装备监测、能量使用监测、人类或动物健康监测、物理安全或物理运输系统监测。IoT存储装置可以是经由云、经由另一网络或经由直接本地访问尝试的未授权访问的目标。
如本文中所使用的,“包括”允许附加元件(即,包括是指包含),除非另有说明。
“优化”是指改进,不一定完美。例如,在已优化的程序或算法中进行进一步改进可以是可能的。
“过程”有时在本文中被用作计算科学领域的术语,并且在该技术意义上包含资源用户,即,例如协同例程、线程、任务、中断处理程序、应用过程、核过程、程序和目标方法。“过程”还在本文中被用作专利法领域术语,例如以描述与系统权利要求或产品(经配置的存储介质)权利要求相对的过程权利要求。类似地,“方法”在本文中有时被用作计算科学领域中的技术术语(一类“例程”)并且还用作专利法领域术语(“过程”)。专利法意义上的“过程”和“方法”在本文中被互换使用。本领域技术人员将理解在特定情况下意指哪个含义,并且还将理解给定要求的过程或方法(在专利法意义上)可以有时使用一种或多种过程或方法(在计算科学意义上)来实现。
“自动地”是指通过使用自动化(例如,通过用于本文中讨论的具体操作和技术效果的软件配置的通用计算硬件),与没有自动化相对。具体地,“自动地”执行的步骤并非通过手写或人的思想来执行,然而其可以通过人来开始或通过人交互地引导。自动步骤使用机器来执行以获得一个或多个技术效果,其将不在没有由此提供的技术交互的情况下实现。
本领域技术人员理解技术效果是技术实施例的假定目的。例如在实施例中涉及计算并且还能够在没有技术组件的情况下执行一些计算(例如,通过纸和笔,或者甚至作为心智步骤)的单纯事实不去除技术效果的存在或改变实施例的具象和技术性质。所讨论的诸如自动遍历语法图的至少一部分、识别语法图中的子图结构、注释语法图、评定优化目录、计算哈希值、重写语法图、存储代码等操作以及许多其他操作在本文中被理解为固有数字化的。人类思想不能直接与CPU或其他处理器直接连接,或者与RAM或其他数字存储连接,以读取和写入必要数据来执行本文中教导的代码转换优化步骤。这都将鉴于本公开被本领域技术人员清楚的理解,但是其他人有时可能需要被告知或提醒事实。
“计算地”同样是指计算设备(至少处理器加存储器)正在被使用,并且排除仅通过人类思想或仅通过人类行为获得结果。例如,如本文中所理解的,用纸和笔进行算术不是计算地进行算术。计算结果更快、更广泛、更深入、更准确、更一致、更全面,和/或另外提供超出单独人类表现的范围的技术效果。“计算步骤”是计算地执行的步骤。“自动地”和“计算地”都不一定意味着“立即地”。“计算地”和“自动地”在本文中被互换使用。
“主动地”意指没有来自用户的直接请求。实际上,用户可能甚至未意识到通过实施例的主动步骤是可能的,直到步骤的结果已呈现给用户。除非另外陈述,否则也可以主动进行本文中所描述的任何计算和/或自动步骤。
贯穿此文,使用可选复数“(多个)”意指存在所指示特征中的一个或多个。例如,“(多个)处理器”意指“一个或多个处理器”或等效地“至少一个处理器”。
出于美国法律和实践的目的,在权利要求书或别处使用本文中的词语“步骤”无意援引手段加功能、步骤加功能或35美国法典第112章节第六段/章节112(f)权利要求说明。特此明确地驳回对该效果的任何假设。
出于美国法律和实践的目的,权利要求书无意援引手段加功能解释,除非其使用短语“用于……的手段”。意在被解释为手段加功能语言(如果有)的权利要求语言将明确地叙述通过使用短语“用于……的手段”的意图。当手段功能用语解释应用时,不论是通过使用“手段加方式”和/或通过权利要求语言的法律解释,针对给定名词或给定动词的说明书中所记载的方式应被理解为通过以下任一项与权利要求语言链接并且在本文中链接在一起:图的框中的相同块内的出现、通过相同或类似名称的表示、通过相同参考标号的表示、图中的任一图中所描绘的功能关系,本公开的文本中所注明的功能关系。例如,如果权利要求限制记载“zac widget”并且该专利权利要求限制变为经受手段加功能解释,那么至少所有结构在任何图框、段落或提到“zac widget”的示例中标识说明书中的任何处,或者通过分配给zac widget的任何参考标号系结在一起,或者公开为具有与zac widget的结构或操作的功能关系,将被视为用于zac widget的应用中标识的结构的部分并且将帮助定义用于zac widget结构的等效集。
本领域技术人员将认识到该创新公开内容讨论各种数据值和数据结构,并且识别这样的项目驻留在存储器(RAM、磁盘等)中,从而配置存储器。本领域技术人员还将认识到该创新公开内容讨论在给定实现中以可执行代码具体实现的各种算术步骤,并且这样的代码也驻留在存储器中,并且其有效地配置对其执行的任何通用处理器,从而将其从通用处理器转变为专用处理器,该专用处理器为功能上专用的硬件。
因此,本领域技术人员将不会犯将以下视为非重叠项目的错误(a)权利要求中叙所记载的存储器,以及(b)权利要求中所记载的数据结构或数据值或代码。数据结构和数据值以及代码被理解为驻留在存储器中,即使权利要求不明确地叙述提及的每个和全部数据结构或数据值或代码段的驻留也如此。因此,不需要这样的驻留的明确叙述。然而,其也不会被禁止,并且可以存在一个或两个所选择的记载以进行强度,从而不排除来自驻留的所有其他数据值和数据结构和代码。同样地,权利要求中所记载的代码功能性被理解为配置处理器,而不管权利要求中是否明确地记载该配置质量。
贯穿此文,除非明确地另外陈述,否则对过程中的步骤的任何参考假定步骤可以通过相关方直接执行和/或通过经中间机构和/或中间实体的一方间接的执行,并且仍处在步骤的范围内。即,不需要通过相关方的步骤的直接执行,除非直接执行为明确陈述的要求。例如,涉及关于目的地或其他主体通过相关方的动作(诸如,访问、注释、查明、分配、关联、编译、咨询、禁用、辨别、启用、增强、进入、评估、执行、寻找、哈希、标识、包括、指示、插入、调用、列示、匹配、记忆化、命名、优化、传递、执行、优先化产生、识别、重新编译、减少、依赖、替换、重写、保存、扫描、引发、转换、遍历、触发、更新(以及,访问(accesses/accessed)、注释(annotates/annotated)等))的步骤可以涉及通过某一其他方的中间动作(诸如,转发、复制、上传、下载、编码、解码、压缩、解压缩、加密、解密、验证、调用等等),包括本文中所记载的任何动作,然而仍被理解为通过相关方直接执行。
每当参考数据或指令时,应当理解,这些项目配置计算机可读存储器和/或计算机可读存储介质,从而将其转变为在人的思想上与仅存在于纸上相对的特定物品,或者例如作为仅在线上传播的信号。出于美国专利保护的目的,在In re Nuijten案例的美国专利商标局(USPTO),存储器或其他计算机可读存储介质不是可取得专利的主题范围之外的传播信号或载波或纯粹能量。在美国没有权利要求涵盖信号本身或纯粹能量,并且鉴于本公开另外断定的任何权利要求解释表面上看不合理。除非在美国外授权的权利要求中另外明确地陈述,否则权利要求不涵盖信号本身或纯粹能量。
此外,尽管有表面上与本文中别处相反的任何事物,但是将理解以下项之间的明显区别:(a)一方面是计算机可读存储介质和计算机可读存储器,以及(b)另一方面是传输介质,也被称为信号介质。传输介质是传播信号或载波计算机可读介质。相比而言,计算机可读存储介质和计算机可读存储器不是传播信号或载波计算机可读介质。除非权利要求中另外明确地陈述,否则“计算机可读介质”是指计算机可读存储介质,而不是传播信号本身并且不是纯粹能量。
本文中的“实施例”为示例。术语“实施例”不可与“本发明”互换。实施例可以自由地共用或借用方面以创建其他实施例(前提是结果可操作),即使方面的所得组合在本文中本身未明确地描述。需要每个和所有允许组合明确地且单独地描述对于本领域技术人员为不必要的,并且将与识别针对读者(其为本领域技术人员)书写的专利说明书的策略相反。关于从甚至小数目的可组合特征引起的大量可能组合的正式组合计算和非正式一般感知将还指示大量方面组合针对本文中所描述的方面存在。因此,需要每个和所有组合的明确叙述将与要求专利说明书为简要的且要求读者在所关注技术领域为博学的策略相反。
参考标号列表
以下列表是出于方便并支持附图的目的而提供的,并且作为说明书的文本的一部分,其通过参考多个项目来描述创新。然而,此处未列示的项目可以是给定实施例的部分。出于文本的更佳可读性,接近文本中的引用项目的一些但非全部叙述来叙述给定参考标号。可以参考给定项目的不同示例或不同例项来使用相同参考标号。参考标号的列表如下:
100 操作环境,也被称为计算环境
102 计算机系统,也被称为运算系统或计算系统
104 用户
106 外围设备
108 一般为网络,包括例如LAN、WAN、软件定义的网络、云和其他有线和无线网络
110 处理器
112 计算机可读存储介质,例如RAM、硬盘
114 可移除配置的计算机可读存储介质
116 可用处理器执行的指令;可以在可移除存储介质上或其他存储器(易失性或非易失性或两者)中
118 数据
120 (多个)核,例如,(多个)操作系统、BIOS、UEFI、设备驱动程序
122 工具,例如防病毒软件、防火墙、分组嗅探器软件、干扰检测系统、干扰防止系统、调试程序、探查器、编译器、解释器、软件开发工具和工具套装、硬件开发工具和工具套装、诊断
124 应用,例如文字处理器、网络浏览器、电子表格、游戏、电子邮件工具
126 显示屏幕,也被称为“显示器”
128 计算硬件,不以其他方式与参考标号106、108、110、112、114相关联
202 代码转换环境
204 转换的程序;可以是核120、工具122、应用124或其他软件的部分或全部
206 转换器(例如,编译器或解释器),使用代码转换优化功能性(例如,结合图4、图6、图7、图8、图11、图12或图13说明或讨论的功能性)增强;206还指代计算系统102,使用代码转换优化功能性配置
208 代码的转换,即来自转换器206的输出
210 经优化的程序代码
212 优化目录;可以通过转换器206更新;212不仅指代存储在目录条目602中的数据而且还指代API或其他接口软件,其帮助维持目录数据并且向目录数据602提供访问
214 一般为优化或非优化的代码
216 一般为注释或非注释的源代码
302 云;也可以称为“云计算环境”
304 虚拟机,例如提供硬件虚拟化并且包括操作系统的计算构造;尽管容器308关于客户操作系统的包含物与虚拟机不同,但是出于本公开的目的,容器和虚拟机在功能上类似,这是因为两者可以运行转换器206并且两者作为能够通过合适的转换器206优化的代码运行,因此除非另外指示,否则对虚拟机的任何引用还指代容器
306 集成开发环境
308 容器,例如提供用户空间虚拟化并且本身不包括操作系统的计算构造
402 优化特性,例如代码在执行时是否可以(或者,确实)具有副作用,代码在执行时是否可以(或者,确实)访问非局部变量等等;优化特性的这些和其他示例在图8中说明(其针对给定实施例不必为详尽的)
404 优化特性注释,即指示优化特性的数据结构(其可以与位标记或枚举值或其他数据值一样简单)
406 图注释器,即,在执行时使用优化特性注释来注释语法图的代码
408 程序204代码214,与语法图中的注释404相对应
410 语法图;如本文中所使用的,“语法图”是至少表示程序204的至少一部分的语法结构的图形数据结构;语法图还可以表示程序的数据类型信息;语法图的一些示例包括抽象语法树(AST)和分析树;树和有向无环图(DAG)是图的一些示例
412 语法图遍历器,即,在执行时遍历语法图的代码;除非另有说明,否则例如使用深度优先搜索以从下到上的方式在语法图的树部分中执行遍历
414 语法图节点,即,包含语法信息并且具有语法图中的位置的数据结构;位置可以由与语法图的(多个)其他节点的节点的(多个)连接来定义;语法图为有向图,即彼此直接连接的任何两个给定语法图节点具有父子关系,除非另有说明。
416 节点414之间的连接;该连接可以被实现为例如指针或索引,该指针或索引明确地标识该连接的节点并且还明确地或隐含地指示哪个节点是父节点或哪个节点是子节点
418 语法子图结构,例如表示二进制运算符和其操作数的语法图子树,或者表示通过引用而非通过值传递参数的函数调用的语法图子树,或者表示处理代码段的try-catch异常的语法图子树,或者表示常数值的语法图子树,或者表示代码的另一语法子图结构,该代码具有执行值或在执行之前在执行时间可辨别的执行效果的一些方面502
420 语法子图结构识别器,即,在执行时识别预定义语法图子图结构的代码;识别可以例如通过将哈希或向量化或语法图的部分的其他表示与优化目录中的条目进行比较来实现
422 一般为用户接口;例如可以包括图形用户接口(GUI)或应用程序接口(API)或两者
424 一般为优化器;424还指代优化器的可插拔实现;优化器是在执行时视代码段X或其被表示为输入并且产生经优化的代码X’或其表示作为输出的代码
426 语法图重写器
502 代码的与转换时间优化相关的方面
504 在代码执行期间由代码进行或产生的值
506 可能执行值504的界定
508 代码的执行效果,例如函数的副作用,或者在代码外部但通过执行代码访问的变量的变化,或者由执行代码引起的异常;508还指代代码的执行无效,例如,函数的任何副作用的不存在,或者代码外部的变量的任何变化的不存在,或者来自代码执行的特定异常的不存在
602 优化目录中的条目
604 适合用于优化目录条目的子图结构标识;还指代标识子图结构或子图结构模板的动作
702 代码库,其能够动态地链接在可执行程序中,由链接器链接或另外包括于可执行程序中
704 一般为例程,例如函数、程序、处理程序或可参数化或可调用或两者的另一代码段
706 例程的名称
708 例程704,其是库702的一部分,因此被配置用于多个程序(不同程序可以共用单个例程副本,或者其可以具有相应例程副本)
710 例程704,专用于特定程序,而不是库例程
712 一般为哈希值
714 例程704的哈希值;其参数或其本体不同的例程将具有不同哈希值;例如,给定实现可以根据例程的源代码或根据例程的语法图表示或两者来计算例程的哈希值
716 子图结构418的哈希值;其节点414种类数目不同的子图结构将具有不同哈希值
718 子图结构模板,即,通过用占位符替换细节来使一组子图结构一般化的数据结构,例如常数占位符而非特定常数,或者作为用于特定数目和特定顺序的例程参数的占位符的参数列表
720 子图结构模板的哈希值;其节点414种类数目不同的子图结构模板将具有不同哈希值
802 优化特性注释中的值的功能性
804 优化特性注释中的值
806 指示关于执行程序代码的副作用的语义信息;806指代指示(动词)的动作并且还指代指示(名词)
808 代码的副作用;例程的副作用是由除函数的返回值的例程的执行引起的程序状态的任何变化或由函数的返回值引起的状态变化,例如,在函数设定全局变量且接着返回值时出现副作用
810 指示关于通过程序代码的非局部变量访问的语义信息;810指代指示(动词)的动作并且还指代指示(名词)
812 非局部变量;812还指代访问非局部变量的动作
814 指示关于通过程序代码的局部静态变量访问的语义信息;814指代指示(动词)的动作并且还指代指示(名词)
816 局部静态变量;816还指代访问局部静态变量的动作
818 指示关于通过引用将参数传递给例程的程序代码而非通过值对其传递的语义信息;818指代指示(动词)的动作并且还指代指示(名词)
820 通过引用传递给例程的参数;820还指代通过引用将参数传递给例程的动作
822 指示使用I/O设备或I/O流或两者关于程序代码的语义信息;822指代指示(动词)的动作并且还指代指示(名词)
824 I/O设备或I/O流或两者的使用;824还指代使用I/O设备或I/O流或两者的动作,并且指代I/O设备或I/O流或两者;一些示例包括从文件读取,即使文件为空的或静态的
826 指示关于在执行期间引发异常的程序代码的语义信息;826指代指示(动词)的动作并且还指代指示(名词)
828 异常,例如溢出、尝试被零除、尝试越界访问、指针无效;828还指代引发异常的动作
830 指示关于未能在执行包含代码的程序期间终止的程序代码的语义信息;830指代指示(动词)的动作并且还指代指示(名词)
832 代码段的终止,例如通过将控制传递给程序中的另一代码段或将控制传递回给核,此时程序运行;当参考标号的上下文陈述关于终止的“非”或“失效”时,“非终止”还可以由832指代
900 优化
902 处理器循环的减小
904 存储器大小的减小;可以一般指代RAM大小,或者指代RAM的特定部分,诸如堆,或者指代磁盘上存储器
906 I/O操作的减小
908 常数合并
910 异常处理程序
912 使用异常处理程序的减小
914 记忆化,例如存储向例程的特定输入的计算结果,识别已在例程的后续调用中再次供应相同输入,并且接着返回所存储的结果而非重新执行例程以重新计算相同结果值
1200 流程图;1200还指代由图12流程图说明或与图12流程图一致的代码转换优化方法
1202 例如通过执行遍历器412来遍历语法图
1204 例如通过计算或比较哈希或节点向量化来扫描用于匹配子图结构的语法图
1206 例如通过识别子图结构与目录212条目之间的匹配或通过子节点的优化特性注释来推断父节点处特性的存在,查明优化特性的存在
1208 例如通过使用相似性度量来比较哈希或比较向量化来识别子图结构与目录212条目之间的匹配
1210 通过子节点的优化特性注释来推断在父节点位置处特性的存在,例如,如果所有子节点在其不引发任何异常的意义上为纯的,那么推断其对应代码(例如,实施二进制运算符的代码)的父节点具有该相同纯度
1212 通过将注释404与节点相关联来注释语法图节点(因此,注释语法图本身)
1214 例如通过在实现节点的数据结构中设定位标记或枚举值或列表指针来将注释404与节点相关联;1214还可以指代节点408与语法图的部分的关联
1216 例如通过重写语法图或合并常数或通过产生不同字节代码或机器代码而不破坏程序来执行优化
1218 通过产生经优化的字节代码或机器代码或其他可执行代码210而不破坏程序来产生经优化的代码
1300 流程图;1300还指代由图13流程图(其并入图12的步骤)说明或与图13流程图一致的代码转换优化方法
1302 转换代码,例如编译代码或解释代码;编译可以是提前(ahead-of-time)(AOT)的或即时(just-in-time)(JIT)的。
1304 先于事件而存在,例如目录212可以在尝试编译之前存在;实际上,目录可以先于程序的源代码中的一些或全部源代码的创建而存在,其部分地基于与目录的条目602匹配而后续优化
1306 在事件之后存在,例如,目录212可以甚至在完成编译之后存在,而严格上来说,而一旦完成编译,则优化编译器内的内部数据结构停止有效地存在,并且编译器过程在其运行时释放其使用的存储器
1308 指示代码的可辨别方面或代码的语法图表示;1308指示的一些示例在图8中示出并且在806、810、814、818、822和826处指定
1310 程序的执行;可以被称为程序的“运行”;1310还指代至少部分地执行程序的动作
1312 标识(动词)项目;还可以指代标识(名词)
1314 标识1312的示例,其涉及使用阵列、列表、图、数据库或其他数据结构中的偏移或指针或其他索引;1314还指代索引
1316 启用对插件或其他代码段的使用
1318 禁用对插件或其他代码段的使用
1320 在改变配置文件或制作文件或其他设定以改变程序的功能性之后重新编译先前已编译的程序代码
1322 优化特性子树
1324 语法图中的位置,例如特定节点或特定节点集
1326 将程序的代码或程序语法图部分(即,子图)与目录条目子图结构标识匹配
1328 提供能访问语法图的优化器
1330 产生优化候选,即,在给定情况中可能的优化
1332 将相对权重分配给优化候选
1334 优化候选的相对权重
1336 至少部分地基于其相对权重使用于实际实现的优化候选优先化
1338 重写语法图的一部分(例如,)以执行常数合并优化
1340 在语法图中或在根据语法图生成的代码中插入回调
1342 回调例程;也被简称为“回调”
1344 呼叫回调;也可以被称为调用回调
1346 触发可执行代码的部分评估
1348 可执行代码的部分评估
1350 避免依赖于源代码中的关键字以指示1308可辨别方面
1352 编程语言关键字,例如,C++的常量表达式关键字
1354 例如通过搜索目录来咨询目录212
1356 例如通过添加条目602或修改条目602或删除条目602或改变条目602的顺序来更新目录212
1358 例如通过基于子节点的纯度(或者,纯度的缺失)来推断父节点为纯的(或者,非纯的),形成特性子树
1360 定位(即,寻找)语法图中的特性子树
1362 通过添加注释404来增强源代码
1364 将注释或所注释的语法图保存在文件中
1366 文件
1368 尚未分配一些其他参考标号的本公开中讨论的任何步骤
1370 优化候选,即,可以是可能执行但尚未执行的优化
操作环境
参考图1,用于实施例的操作环境100包括至少一个计算机系统102。计算机系统102可以是或不是多处理器计算机系统。操作环境可以包括给定计算机系统中的一个或多个机器,其可以是在云中群集的、客户端-服务器联网的和/或点对点联网的。单独的机器是计算机系统,并且一组协作的机器也是计算机系统。给定计算机系统102可以使用应用、针对管理员、作为服务器、作为分配的处理节点和/或以其他方式被配置用于终端用户。
人类用户104可以通过使用显示器、键盘和其他外围设备106经由所键入的文本、触控、语音、移动、计算机视觉、手势和/或其他形式的I/O与计算机系统102交互。屏幕126可以是可移除外围设备106,或者可以是系统102的整体部分。用户接口可以支持实施例与一个或多个人类用户之间的交互。用户接口可以包括命令行接口、图形用户接口(GUI)、自然用户接口(NUI)、语音命令接口和/或其他用户接口(UI)呈现,其可以被呈现为不同选项或可以被集成。
系统管理员、网络管理员、云管理员、安全分析员和其他安全人员、操作人员、开发人员、测试人员、工程师、审计员和终端用户分别是特定类型的用户104。代表一个或多个人行事的自动代理、脚本、回放软件、设备等也可以是用户104以例如促进测试系统102。存储设备和/或网络设备取决于其与处理器110的可拆卸可以在一些实施例中被视为外围装备且在其他实施例中为系统102的部分。图1中未示出的其他计算机系统可以通过技术方式与计算机系统102交互,或者例如使用经由网络接口装备与网络108的一个或多个连接与另一系统实施例交互。
每个计算机系统102包括至少一个处理器110。与其他合适的系统一样,计算机系统102还包括一个或多个计算机可读存储介质112。存储介质112可以是不同的物理类型。存储介质112可以是易失性存储器、非易失性存储器、就地固定介质、可移除介质、磁性介质、光学介质、固态介质和/或其他类型的物理耐用存储介质(仅与传播信号或纯粹能量相对)。具体地,经配置的存储介质114(诸如,便携式(即,外部)硬盘、CD、DVD、记忆棒或其他可移除非易失性存储器介质)可以在插入或另外安装时在功能上变为计算机系统的技术部分,从而使其内容可以与处理器110交互且由处理器110使用。可移除经配置的存储介质114为计算机可读存储介质112的示例。计算机可读存储介质112的一些其他示例包括内置RAM、ROM、硬盘和其他存储器存储设备,该设备不易被用户104移除。为了符合当前美国专利要求,在美国待决或授权的任何权利要求下,计算机可读介质、计算机可读存储介质或计算机可读存储器都不是信号本身或纯粹能量。
存储介质114被配置有由处理器110可执行的二进制指令116;“可执行”在本文中广义使用以包括例如机器代码、可解释代码、字节代码和/或在虚拟机器上运行的代码。存储介质114还被配置有数据118,该数据118被创建、修改、引用和/或另外用于通过执行指令116的技术效果。指令116和数据118配置其驻留的存储器或其他存储介质114;当存储器或其他计算机可读存储介质是给定计算机系统的功能部分时,指令116和数据118也配置该计算机系统。在一些实施例中,数据118的一部分表示真实项目,诸如产品特性、库存、物理测量、设定、图像、读数、目标、体量等等。这样的数据还通过备份、还原、提交、中止、重新格式化和/或其他技术操作来转换。
给定操作环境100可以包括集成开发环境(IDE)122、306,其向开发人员提供一组协作计算技术开发工具122,诸如编译器、解释器、反编译器、汇编程序、反汇编程序、源代码编辑器、探查器、调试程序、模拟器、模糊测试器、存储库访问工具、版本控制工具、优化器、协作工具等等。具体地,用于一些软件开发实施例的合适的操作环境中的一些包括或帮助创建被配置用于支持程序开发的
Figure BDA0003453237090000221
Visual
Figure BDA0003453237090000222
开发环境(微软公司的标志)。一些合适的操作环境包括
Figure BDA0003453237090000223
环境(Oracle America公司的标志),并且一些包括利用诸如C++或C#(“C-Sharp”)等语言的环境,但是本文中的许多教导适用广泛多种编程语言、编程模型和程序。
尽管实施例可以被描述为被实现为由计算设备(例如,通用计算机、服务器或群集)中的一个或多个处理器执行的软件指令,但是此这样的描述不意味着耗尽所有可能实施例。本领域技术人员将理解的是,通常还能够整体地或部分地直接在硬件逻辑中实施相同或类似功能性以提供相同或类似技术效果。备选地,或者除软件实现外,能够至少部分地通过一个或多个硬件逻辑组件执行本文中所描述的技术功能性。例如且在不排除其他实现的情况下,实施例可以包括硬件逻辑组件110、128,诸如现场可编程门阵列(FPGA)、特殊应用集成电路(ASIC)、特殊应用标准产品(ASSP)、系统单芯片组件(SOC)、复杂可编程逻辑设备(CPLD)和类似组件。实施例的组件基于例如其输入、输出和/或其技术效果可以分组为交互功能模块。
除了处理器110(例如,CPU、ALU、FPU和/或GPU)、存储器/存储介质112和显示器126以外,操作环境还可以包括其他硬件128,诸如例如电池、总线、电源、有线和无线网络接口卡。名词“屏幕”和“显示器”在本文中被互换使用。显示器126可以包括一个或多个触摸屏、响应于来自笔或触笔的输入的屏幕或仅为了输出操作的屏幕。在一些实施例中,诸如人类用户I/O设备(屏幕、键盘、鼠标、触笔、麦克风、扬声器、运动传感器等)的外围设备106将与一个或多个处理器110和存储器可操作通信而存在。
在一些实施例中,系统包括通过有线和/或无线网络108连接的多个计算机。联网接口装备128可以使用诸如可以存在于给定计算机系统中的分组交换网络接口卡、无线收发器或电话网络接口等网络组件向网络108提供访问。联网接口装备和诸如开关或路由器或防火墙等其他网络组件的虚拟化也可以存在(例如,)于软件定义网络或沙盒或其他安全云计算环境中。给定实施例还可以经由直接存储器访问、可移除非易失性存储介质或其他信息存储检索和/或传输途径传达技术数据和/或技术指令。
本领域技术人员将了解的是,在“操作环境”下在本文中所呈现的前述方面和其他方面可以形成给定实施例的部分。本文标题不意图提供特征分为实施例和非实施例特征集的严格分类。
一个或多个项目以图中的轮廓示出,或者在括号中列出,以强调其不是所图示的操作环境或所有实施例的必要部分,但是可以与如本文中所讨论的操作环境或一些实施例中的项目互操作。在任何图或任何实施例中,不必遵循必定需要不是轮廓或括号形式的项目。具体地,图1是出于方便的目的而提供的;图1中包含项目并非暗示在当前创新之前已知的项目或所描述的项目的使用。
更多关于系统
参考图1至图11,一些实施例使用或提供功能性增强型系统206。功能性增强通过提供技术机制来促进代码优化,其能够(a)使得代码优化机会对于开发人员更可见,例如作为目录或源代码中的注释404,以及(b)使得代码优化机会在编译器的内部工作范围之外持续,例如作为所注释的语法图,其作为编译器输出被提供并且作为后续编译的输入可再使用。
图2图示了转换环境202中的增强型转换器206。馈入增强型转换器206中的程序204产生作为输出的优化程序代码210,并且还可以产生优化目录212,或者作为输出对其更新。即,转换208不必限于机器代码或字节代码,但是在一些实施例中还可以包括呈例如目录212或注释的源代码216形式的持续优化特性注释404。
图3示出了转换环境202的一些示例。所列出的示例包括网络108、云302、虚拟机304或容器308以及集成开发环境306。然而,本领域技术人员将识别转换器206还可以在其他环境中运行,并且这些环境中的一些环境可以交叠,例如虚拟机304可以驻留在云302中。
图4图示了具有用于代码转换优化的增强的功能性的系统102的形式的增强型代码转换器206。在该示例中,功能性增强包括图注释器406,该图注释器406通过语法图遍历器412和子图结构识别器420调用或与其协调。语法图遍历器412遍历语法图410的连接416节点414,其为分析树、抽象语法树或一些程序204代码214的结构的类似表示。子图结构识别器420识别语法图410中的某些子图结构418,即,具有优化特性402(可辨别的特质)的子图结构418,该优化特性诸如为缺失副作用、对运行时异常的限制、不使用局部静态变量或引用参数等。此类特质的可辨别缺失还被视为优化特性402。图注释器406在语法图410中相应地放置优化特性注释404。注释404可以接着由优化器424使用,该优化器424是转换器206的一部分或与其协调以在代码转换期间通过将代码408合并为常数来执行代码优化。
图5示出了呈可辨别的优化特性402的两个目录形式的代码214的一些方面502。一个目录涉及在执行之前可辨别的具体执行值504,或者在执行之前可辨别的对执行值504的界定506。例如,增强型转换器可以根据语法图来辨别某一布尔表达式将在执行时总是评估为真504,或者界定506某一算法表达式其将在执行时总是产生非零值504。优化特性402的另一目录包括执行效果508或非效果508。例如,增强型转换器可以使用语法图来辨别某一代码段408、214可能引发除零异常,并且另一代码段408、214是不具有任何副作用的纯函数(例如,类似sin(x))。
图6图示了优化目录212中的条目602。所示示例包括语法子图结构418的标识604以及对应优化特性注释404。例如,条目602En可以标识子图结构418,该子图结构418与除法运算符匹配并且包括指示除零异常是可能的注释404。类似地,条目602En可以标识子图结构418匹配,该子图结构418与库sine()函数或库cosine()函数匹配,并且包括指示没有副作用是可能的注释404。与在编译期间单独在优化编译器内部使用的暂态数据结构不同,目录212在使用目录的编译启动之前存在,并且目录在甚至完成编译之后持续。目录212还可以供多个工具122使用,而非在单个编译器内硬编码的功能性,并且由此仅通过单个编译器可用。
图7示出了语法子图结构标识604的一些示例。两个示例是例程704的名称706;一组是属于库702的例程708、704,而另一组是专用于特定程序204的例程710、704(有时被称为“用户定义例程”)。
库702可以如本文中所教导通过确定其例程708的优化特性402并相应地创建目录条目602来增强。例如,用于某些函数(诸如,sine()、cosine()、绝对值、指数运算、截断、最小值、最大值、平均值和其他)的数学库例程可以具有条目602,该条目602指示这些函数在其没有副作用、不具有局部静态变量、以及不使用I/O流的意义上是纯的。
图7中所图示的语法子图结构标识604示例中的一些示例包括哈希值712。可以使用安全哈希算法(SHA)、诸如MD5的消息摘要算法或其他哈希函数来计算哈希值。所使用的哈希函数可以在一些实现中为加密安全的,但不是在每个实现中都如此。例如,所使用的哈希值可以包括例程704的哈希714、子图结构418的哈希716、子图结构模板718的哈希720或其组合。
图8图示了优化特性注释功能性802的一些示例,如实现优化特性注释404的数据结构中的值804表达或表示。取决于实现的特殊性,值可以是位标记、枚举值、整数或布尔标记、列表中的指针或其他数据值。给定注释404的功能性802为关于在执行代码408之前可辨别的代码408的执行效果508或执行值504的指示。执行效果508的一些示例包括副作用808、非局部变量812访问、局部静态变量816访问、访问引用参数820(其为非局部变量812访问的特殊情况)以及异常828(除零、溢出等)。使用I/O设备或I/O流还可以被视为执行效果508,或者其可以被视为对执行值的负面界定506(或者,如果通过已知方式限制经由I/O使用可获得的值,则作为正面界面506)。例如,如果在编译时间已知变量或表达无法为零或无法为负的或必须在-1与+1的范围内,注释可以指示执行值的界定506。注释404可以指示830函数或子图的非终止832(例如,“状况(真)”循环或终止程序的函数)。经由注释识别非终止代码段允许丢弃后续评估,例如f()+g(),其中f()证实为非终止为本身非终止(注释的传播1210),并且使得g()丢弃(由于其从不运行)并且由不相关常数替换,或者整个节点减小至“f();throw”。
在该示例中,注释值804可以指示806关于副作用的信息,包括副作用808的可能性的存在或不存在。注释值804还可以或备选地指示810关于对非局部变量812的访问(每个实现的读取或写入或两者)的信息,包括此访问的可能性的存在或不存在。注释值804还可以或备选地指示814关于对局部静态变量816的访问的信息,包括此访问的可能性的存在或不存在。注释值804还可以或备选地指示818关于对引用参数820的访问的信息,包括此访问的可能性的存在或不存在。注释值804还可以或备选地指示822关于对I/O设备或I/O流824的访问的信息,包括此访问的可能性的存在或不存在。注释值804还可以或备选地指示826关于一个或多个特殊异常828的信息,包括引发的这样的(多个)异常的可能性的存在或不存在。注释值804还可以或备选地指示830关于代码段的终止或非终止832的信息。
图9说明优化900目录的一些示例。一些优化902、900减少在执行期间执行的处理器110循环的数目。一些优化904、900减少在执行期间使用的存储器112(RAM、处理器高速缓存、光盘、存储器堆等)的数量。一些优化906、900减少在执行期间I/O设备或I/O流824的使用。一些优化908、900用表示常数值的代码替换在执行期间执行一系列计算的代码。一些优化912、900通过减少或消除(其为减少的极端示例)运行时异常828来减少在执行期间异常处理程序910的使用。一些优化914、900用有时返回先前计算的值504代替重新计算值替换在执行期间执行一系列计算的代码。本领域技术人员还将识别其他优化900还可以使用特性402和注释404来实施,并且根据本文中的教导执行。
图10示出了基于还可以被表示为“f(a,b,c+d*e,g)”的代码214的语法图410的示例,其中f为函数名称706,括号封入传递给函数的调用的自变量,加号“+”指示加法,并且星号“*”指示乘法。为方便读者,该示例语法图包括明确的语法元素标识符,诸如“函数”、“自变量”、“变量”、“表达式”和“运算符”。但本领域技术人员将认识到,此类语法元素标识符可以被实施例如为数据结构中的枚举值,并且在其他语法图表示中可能为明确的或省略的。在图10中未示出优化特性注释404,但其能够通过注释器406增加。
图11示出了基于还可以被表示为表达式“a(x)*b(x)+c(x)/d(x)”的代码214的另一语法图410的示例,其中a、b、c和d分别为函数名称706,括号的集分别封入碰巧传递给每个函数调用的参数x,加号“+”指示加法,星号“*”指示乘法,并且斜线号“/”指示除法。取决于注释404中的“纯”的含义和特定函数a、b、c、d的特性,图11的语法图表示多个可能优化情况和不同代码214。
在图11中示出注释404。在该示例中,取决于实现,“纯”为意指指示806、810、814、818、822或826中的一个或多个指示的标签。在其他示例中,纯度可以具有其他含义。在特定情况中,函数a和d可以被称为在其没有副作用808的意义上为纯的,而函数b和c在尚未确定其是否具有副作用的意义上仅为可能纯的。
一些实施例使用或提供代码转换优化系统206、102,其包括存储器112和与存储器进行可操作通信的处理器110。处理器被配置为执行步骤,其包括(a)遍历程序204的语法图410的至少一部分,(b)识别语法图中的预定子图结构418,(c)将优化特性注释404与所识别的语法子图结构相关联。所得关联指示与所识别的子图结构相对应的代码段408、214的方面502在执行代码段之前可辨别的程度。方面502包括执行值504或执行效果508或两者。在该示例中,处理器被配置为(d)至少部分地基于关联步骤的结果执行程序的代码转换208的优化900。
在一些实施例中,存储器112包括具有条目602的目录212(例如,包含该目录212,由该目录212配置)。条目602包括子图结构418的标识604,并且还包括与标识的子图结构相关联的优化特性注释404。给定条目602可以使一个或多个子图结构与一个或多个注释404相关。目录条目602在程序204的代码转换之前存在,并且还在执行程序的代码转换的优化之后存在。
在一些实施例中,子图结构的标识604包括以下密钥中的至少一个密钥或由以下密钥中的至少一个密钥创建索引:被程序204利用的库702的例程708、704的名称706;作为程序204的部分且专用于程序的用户定义例程710、704的名称706;例程的哈希值714;子图结构的哈希值716;或语法子图结构模板718的哈希值720。模板718可以被视为钻取语法树中的一个或多个孔的方式以执行一组不同常数或其他小事中的任一个从语法角度的条目602标识匹配取模。
在一些实施例中,优化特性注释404包括以下至少一项:指示806与所识别的子图结构相对应的代码段是否在执行代码段期间没有副作用的值;指示810与所识别的子图结构相对应的代码段是否在执行代码段期间访问任何非局部变量的值;指示814与所识别的子图结构相对应的代码段是否具有任何局部静态变量的值;指示818与所识别的子图结构相对应的代码段是否具有通过引用传递以支持执行代码段的任何参数的值;指示822与所识别的子图结构相对应的代码段是否在执行代码段期间访问任何I/O设备或I/O流的值;指示830代码段是否未能在执行代码段开始之后终止的值;或指示826与所识别的子图结构相对应的代码段是否可以在执行代码段期间引发异常的值。
一些实施例包括可插拔优化器424,系统206被配置为调用该可插拔优化器424来执行优化900。当优化器能够被启用或禁用或两者时,优化器被视为“可插拔的”,而不重新编译调用优化器的代码。
在本文中还描述其他系统实施例,直接地或可导出为所描述过程或配置的介质的系统版本,由计算硬件的本文中的广泛讨论告知。
尽管在图中示出具体架构示例,但实施例可以脱离那些示例。例如,在不同图中示出的项目可以一起包括在实施例中,图中示出的项目可以省略,不同项目中示出的功能性可以组合为更少项目或组合为单个项目,项目可以重新命名,或者项目可以通过不同方式彼此连接。
在本文中提供示例以帮助说明技术的方面,但此文中给定的示例不描述所有可能实施例。实施例不限于本文中提供的具体组件名称、优化、算法选择、数据、数据类型、配置、实现、布置、显示、特征、方式或情景。给定实施例可以包括例如附加或不同技术特征、机制、顺序、数据结构或功能性,并且可以另外脱离本文中提供的示例。
过程(即,方法)
图12说明方法1200,该方法1200为可以通过增强型系统206执行或辅助的方法的示例。增强型转换器206遍历1202语法图410,按其方式扫描1204子图结构418。转换器206通过识别1208编入目录的子图结构或通过从图410上的现有注释404来推断1210优化特性,查明1206优化特性的存在。转换器206通过将注释与图的相关部分或对应代码408相关联1214相应地注释1212语法图。接着,优化器424(其为转换器206的部分或通过转换器206调用或后续操作为独立工具122)基于注释图来执行1216优化并产生1218经优化的代码210。
图13进一步图示了代码优化方法(也被称为过程),其适用于在代码转换期间使用,包括图12中所示的步骤的改进、补充或情境动作。除非另外指示,否则图中所示或另外公开的技术过程将例如通过转换器206自动执行。过程还可以部分地自动执行或部分地手动执行达到包含由人类管理员或其他人员的动作的程度,例如在一些实施例中,人们可以指定需要哪种优化900。本文中没有预期为创新的过程为完全手动的。在给定实施例中,可以重复过程的零个或更多个所说明步骤,或者许不同参数或数据在其上操作。实施例中的步骤还可以通过与图12和图13中列出的从上到下顺序不同的顺序进行。步骤可以连续地、以部分交叠方式或完全平行地执行。具体地,遍历流程图1200动作项目或流程图1300动作项目以指示在过程期间执行的步骤的顺序可以在过程的一个性能到过程的另一性能变化。流程图遍历顺序还可以从一个过程实施例到另一过程实施例变化。步骤还可以被省略、组合、重新命名、重组、对一个或多个机器执行,或者另外脱离所说明流程,前提是所执行过程为可操作的并且符合至少一个权利要求项。
一些实施例使用或提供在代码转换期间寻找优化机会的方法,该方法包括:扫描1204程序的语法图410的至少一部分、具有节点414的语法图、表示程序204的至少语法结构方面的语法图;查明1206与语法图的节点相关联的程序的代码408、214具有优化特性402;以及根据经查明的优化特性注释1212语法图。
在一些实施例中,查明1206与语法图的节点相关联的程序的代码具有优化特性包括以下至少一项:使代码与描述优化特性的目录中的条目602匹配1326;使包含节点的语法子图418与描述优化特性的目录中的条目602匹配1326。匹配可以例如通过计算和比较项目的相应标识来完成;当相应标识相同时建立匹配。
在一些实施例中,查明1206与语法图410的第一节点414相关联的程序的代码408具有第一优化特性402包括从与语法图410的第二节点414相关联的第二优化特性402进行1210推断。第一节点和第二节点在语法图中具有不同的相应位置1324。第一优化特性和第二优化特性可以具有相同值或具有不同相应值。推断可以用于使优化特性拼结在一起以构建可优化子树。
一些实施例提供1328访问所注释的语法图的优化器424。接着,优化器产生1218以下至少一项:减小用于执行程序的代码的处理器循环计数的优化器902、900;减小用于执行程序的代码的存储器需求的优化器904、900;减小用于执行程序的代码的I/O需求的优化器906、900;在编译时间用恒定值替换程序的代码段的优化908、900;将数据118或指令116或两者存储在程序的代码中的优化914、900;或去除程序的代码中调用或跳转到异常处理程序910的优化912、900。
在一些实施例中,优化器424基于所注释的语法图产生1218优化900,并且优化包括语法图410的至少一部分的重写1338。例如,可以重写1338图以实施常数合并或包括记忆化914。
在一些实施例中,优化器4242产生1330基于所注释的语法图的多个优化候选1370。优化器或转换器206将相应权重分配1332给优化候选中的至少两个优化候选,并且至少部分地基于其相应分配权重来优先化1336优化候选。例如,当目标系统102为具有相对较少存储器和几乎与人类用户没有交互的IoT设备时,存储器大小减小904可以在速度增加902内优先化。
一些实施例插入1340回调1342,该回调1342在执行时触发1346部分评估1348,该部分评估1348至少部分地基于所注释的语法图产生优化900。例如,转换器206可以经由语法图的部分进行多次传递,并且可以在附加信息变为从先前传递可用时使用回调来更新该部分的注释404。
在一些实施例中,查明1206不依赖1350专用于表示优化特性的程序204的源代码中的编程语言关键字1352的使用。例如,常数合并优化机会可以通过识别1208每个子节点414将评估为常数且接着推断1210对那些常数执行算术运算的母节点也将评估为常数来标识。此与使用C++常量表达式关键字或类似编程语言关键字1352形成对比。不同于编程语言关键字的使用,使用注释404来实施附加优化不需要编程语言规范的变化。
在一些实施例中,查明1206包括咨询1354目录212,该目录212具有分别列出相应代码段408的优化特性402或目录中标识604的语法子图结构418的条目602。一些实施例更新1356目录以包括附加代码段或附加语法子图结构,并且以包括与语法图的附加注释404匹配的对应优化特性。
经配置的存储介质
一些实施例包括配置的计算机可读存储介质112。存储介质112可以包括磁盘(磁性、光学或其他)、RAM、EEPROMS或其他ROM,和/或其他可配置的存储器,尤其包括计算机可读存储介质(其不仅为传播信号)。经配置的存储介质可以尤其为可移除存储介质114,诸如CD、DVD或闪速存储器。可以移除或不移除且可以是易失性或非易失性的通用存储器能够使用呈数据118和指令116形式的项目(诸如,优化目录212、优化特性注释、子图结构标识604、图注释器406和子图结构识别器420)被配置到实施例中,从可移除存储介质114和/或另一源(诸如,网络连接)读取以形成经配置的存储介质。经配置的存储介质112能够使得计算机系统206执行用于代码转换优化的技术过程步骤,如本文中所讨论。图因此帮助说明经配置的存储介质实施例和过程(即,方法)实施例,以及系统和过程实施例。具体地,图12或图13中说明的过程步骤中的任何一个过程步骤或本文中教导的其他可以用于帮助配置存储介质以形成经配置的存储介质实施例。
一些实施例使用或提供用数据118和指令116配置的计算机可读存储介质112、114,其在由处理器110执行时执行用于在代码转换期间寻找优化机会的方法。此方法包括:扫描1204程序的语法图的至少一部分、具有节点的语法图、表示程序的至少语法结构方面的语法图;查明1206与语法图的节点相关联的程序的代码具有优化特性;根据经查明的优化特性注释1212语法图;以及至少部分地基于所注释的语法图产生1218程序的优化。
在一些实施例中,方法还包括形成1358或定位1360优化特性子树1322,即,具有相同或推断关联相应优化特性402并且还共同地定义语法图的子树的一组节点414,其由节点和集中的节点之间的连接组成。
在一些实施例中,方法还包括用可能值注释506来注释1212语法图以及利用1210可能值注释同时产生程序的优化,该可能值注释506界定用于代码段408、214的所有可能执行值504,其能够假定在不同程序执行期间的不同值。
在一些实施例中,方法包括通过向源代码增加语法图优化特性注释404的文本表示来增强1362程序的源代码。在一些实施例中,方法包括保存1364文件1366中的语法图优化特性注释404的表示;该文件来源于程序并且具体地与程序相关联;该注释信息被保存以用于程序的版本的后续代码转换中。在一些实施例中,方法包括进入1356非专用于程序的目录212中的语法图优化特性注释的表示,以用于程序的后续代码转换中或用于另一程序的后续代码转换中或两者。
在一些实施例中,查明1206与语法图410的节点相关联的程序的代码408(在本文中被表示为代码F)具有优化特性402包括查明1206代码F仅为功能代码,原因是,针对给定输入集,执行代码F总是在控制从代码F传递到另一代码时提供相同执行结果。该纯功能性可以例如在代码F不具有局部静态变量或不使用此变量以维持调用之间的状态的情况下发生。此纯功能性可以例如在代码F不产生基于随机化变量的结果或基于I/O流或设备读取的结果的情况下发生。
附加示例和观察
本领域技术人员将识别不一定需要本公开的每个部分或其中的任何特定细节以满足诸如启用、书面描述或最佳方式等法律标准。此外,实施例不限于特定网络、工具、标识符、场、数据结构、函数、常数或本文中所描述的其他实施选择。与任何其他专利公开的任何明显冲突(甚至来自本发明创新的所有者)对于理解本专利公开中呈现的权利要求没有作用。通过关于本公开的所有部分的此理解,提供一些附加示例和观察。
更多关于注释
在一些实施例中,简单注释404是布尔值或列举标记。例如,针对纯度的指定功能定义,一些注释可以被表示为[IsPure(true)]或[IsPure(false)],例如,纯度可以被定义为没有副作用808。类似地,一些注释可以被表示为[ThrowsException(Never)](从未引发)、或者表示为[ThrowsException(Fatal)](无法处理异常,例如损坏)、或者被表示为[ThrowsException(InputValidation)](仅在输入出界时引发异常,例如空复选)。
在一些实施例中,一些注释是二值的(黑/白、开/关、存在/不存在等),而一些其他注释在一个范围。在一个范围的注释可以具有某一排序,例如关于异常828,“从不引发”比强于“针对任意原因引发”的“针对验证引发”更强。
优化器424可以通过基于子节点的注释在父节点处使其组合1210来使用注释,例如考虑在父节点处生根并且表示“f(x)+g(x)”的子树。如果f和g两者为纯的,那么通过推断1210,表示+的节点处生根的所得树为纯的。作为另一示例,考虑在父节点处生根且表示“f(x)/g(x)”的子树。如果f和g两者从不引发异常,那么在节点处生根表示/的所得子树仍可以引发异常,这是因为如果g(x)返回0,那么存在被零除的尝试。
在一些实施例中,更多复杂注释404包含集或列表。例如,[PossibleExceptions(typeof(DivideByZeroException))]指示包括DivideByZeroException的异常828的集或列表。实施例可以使用集合论代数构造来组合1210父节点中的这样的注释404。例如,[ThrowsException(Never)]等效于空集,并且具有两个子节点的二进制表达式节点将具有如其可能异常的集合的其子节点的可能异常的并集。使大括号表示集,并且再次考虑以上加法示例(“f(x)+g(x)”)和以上除法示例(“f(x)/g(x)”)。如果f()可以引发异常类型A且g()可以引发异常类型A或B,那么当+运算具有溢出检测时,f(x)+g(x)具有可能异常类型的集{A,B}或{A,B,OverflowException}。另一方面,f(x)/g(x)具有如可能异常类型的集{A,B,DivideByZeroException}。
在一些实施例中,注释404能够彼此交叉影响。例如,一些函数704具有域和范围。假设函数f(x)针对x具有域[0,int.MaxValue],并且假定其具有声明[ThrowsException(InputValidation)]的注释。假定转换器或优化器能够可以建立与x绑定的自变量在有效范围内(例如,自变量评估为有效范围内的常数)。接着ArgumentOutOfRangeException不在具有给定自变量的f(x)的调用的该发生的可能异常的集中发生。类似地,如果g(x)具有界定范围[1,100],那么f(x)/g(x)中的g(x)的使用排除DivideByZeroException的发生。
在一些实施例中,一些注释器406或注释404使用路径遍历来创建延迟评估的注释值。考虑该代码段:a(x)*b(x)+c(x)/d(x)。该代码的语法树410表示在图11中示出。出于说明清楚起见,在图11中仅明确示出该树的可能注释中的一些注释。
+节点414的注释404可以类似为[IsPure(IsPure(Left.Right)&IsPure(Right.Left))],这意味着节点的纯度是针对b(x)(相对于+的Left.Right)和c(x)(相对于+的Right.Left)确定的纯度值的&,其中&表示逻辑与。这可以是如下情况:因为工具可以确定a(x)和d(x)为无条件纯的,并且b(x)和c(x)明确为纯的(在该情况下,整个表达式将为不纯的),但是优化器的工作的下一阶段需要具有b(x)和c(x)处的近观以确定能够确定哪些另外优化特性。a(x)和d(x)在目录212中可以是事实。或者,a(x)和d(x)可能关于优化特性为不重要的,例如,其可能缺失除法、局部变量和I/O调用,而b(x)和c(x)不在目录中且并非为不重要的。
在许多情况下,纯度特性是依赖产物(例如,子节点)的纯度的逻辑与。例如:当根据副作用、访问非局部变量、使用静态局部变量、使用引用参数或使用I/O流或I/O设备定义纯度时,IsPure(x+y)=IsPure(x)AND IsPure(y)。
更一般来说,在一些实施例中,路径表达式描述从当前节点开始的图410中的遍历。Left/Right仅为从二进制节点导航的方式。更一般的形式是使用边缘416的索引的路径的编码。例如,f(a,b,c,d)可以使用被表示为Arguments[2]的路径以导航到表示c的节点,其中Arguments[1]指示b,并且Arguments[0]指示a。作为另一示例,被表示为表示f(a,b,c+d*e,g)的图中的[3,1,0]的遍历路径可以指代d;在该示例中,函数的节点3为c+d*e(0:f,1:a,2:b等),节点c+d*e的子节点1为d*e,并且节点d*e的子节点0为d。
在一些实施例中,推断1210或遍历路径可以甚至更复杂以表示优化尝试期间的分支。例如,考虑被表示为f(x)?g(x)的代码:h(x),其中使用熟悉C语法;这还可以被表示为“if f(x)then g(x)else h(x)”。如果f为纯函数但x为未知的,那么工具206、424无法在编译时间评估f(x)。工具还可以找出g(x)为纯的,但h(x)不是。并非直到运行时f(x)将具有真或假的确定值,并且可以知晓整个表达式的纯度。然而,可能是此整个表达式在较大表达式中发生,并且当内联化较大表达式时,工具能够评估f(x)且以g(x)或h(x)结束且决定纯度。因此,注释404可以使用其他布尔代数,诸如=>含意以用公式表示将条件纯度表述为优化特性402的逻辑命题。
更多关于回调和部分评估
在一些实施例中,回调实施(a)语法图查看器412和分析器420与(b)优化提供程序424之间的协定。经由语法图410的第一转换器206查看可以是相对通用的。例如,转换器可以通过深度优先方式查看语法树,确定节点414(例如,常数值四十二为常数、从不引发异常等的节点)的语义信息,并且接着再次使用知晓如何组合注释的语义提供程序在其恢复到树时组合1358、1210。如本文中所使用的,“语义提供程序”是指本文中所描述的优化注释语义功能性,其可以实施于图注释器406、子图结构识别器420、优化器424、目录212或其任何组合中。
例如,考虑表示可以表示为“1+2”的代码的子树。在该情况下,表示1和2的节点为纯的,因此+能够组合针对1+2子树纯的根实体中纯的两种情况(或者,在一些实现中,等效地,针对子树根处的+节点)。
当实施优化器424时使用回调1342以有效地指示其他转换软件如果其他软件遇到为纯的(但是其父节点不是)节点,那么应向优化器提供节点和状态,以使得优化器能够对其执行优化。
例如,考虑“f(1+2)”。如果f不是纯的,那么优化器在适当位置设定指令以在稍后向f(1+2)节点提供优化器访问,其中回调传达该节点的子节点1(在具有该自变量的f的调用中表示1+2的子节点)为纯的信息。优化器能够接着执行1346 1+2的部分评估1348,并且告诉重写器426值已变为3,因此重写器能够将树改变1338为f(3)。
作为另一示例,考虑以下异常处理代码:
Figure BDA0003453237090000371
如果分析器206或424得出结论f(x)可以引发Bar但无法引发Foo,并且在寻找具有确定性异常行为的节点时优化器424已请求回调,那么能够进行1340此回调1342以实际上说“此try语句的子节点0能够引发{BarException,QuxException}”。优化器424能够接着针对FooException请求去除处理程序910,这是因为FooException能够从未发生。
此外注意,此分析器能够针对整个try语句创建注释404,以具有与PossibleExceptions(“f(x)”)\{BarException}U PossibleExceptions(“//bar it”)相对应的一组可能异常828。这是在该情况下使用集合论组合1358注释值的另一示例。在该描述中,“U”表示集合论并集运算符,并且“\”表示差集。在下文示出的另一try…catch…statement的上下文中,可能从try语句引发的可能异常的集为PossibleExceptions(try_body)\{E1,E2}UPossibleExceptions(catch_body1)U PossibleExceptions(catch_body2)。此处为对应try…catch…statement:
Figure BDA0003453237090000381
catch子句带走E1和E2(因此使用\作为差集),但这些catch块的本体可以引发需要并集在其中的更多异常。
在一些实施例中,优化器424可以注入本身以在运行时而非仅在编译时运行。例如,考虑代码“GetBigSet().Contains(x)”,其检查项目x是否为大项目集的成员。“大”的精确含义能够取决于涉及的特定系统102,但是可用措施中的一些措施可以是例如集太大而不能完全适合于可用RAM,或者集太大使得经由其成员一半的迭代将花费这么长的时间在可用计算功率以致人类用户将考虑无响应的程序。
此处,分析器206或424可以推断出GetBigSet()为纯的,因此其能够表示为包含大集合的常数(如名称所暗示)。但此代码“GetBigSet().Contains(x)”是否将运行可能为未知的,因此分配来保持常数的存储器112将为浪费的。当x为常数时发生特殊情况,从而允许优化器424(至少在存储器中)在编译时间将代码评估为真的或假的。假定x不是常数。那么要么工具使代码保持原状,这可以在代码多次运行时产生大量CPU时间,要么工具将GetBigSet()调用减小为大集合常数。
该示例中针对优化器的备选方案为尝试减小为大集合常数,(基于例如管理设定或配置文件或启发)推断出结果将使用比所需更多的存储器,并且通过重写树为“Memoize(()=>GetBigSet()).Contains(x)”延迟应用优化直到运行时,其中Memoize为用以执行记忆化的优化器提供函数。此记忆化函数可以在其内部隐藏高速缓存行为、频率分析等以在其不频繁使用时基于运行时动态行为实施策略来释放大集合的存储器。实际上,此插入1340回调至优化器以在程序204运行时运行优化器。
在代码表示“Memoize(()=>GetBigSet()).Contains(x)”中,“()”和“=>”指示拉姆达表达式的存在。此特定注释为来自C#的拉姆达表达式语法。在其中,()为空的参数列表,并且=>为表示拉姆达的标记。因此,其提供写下不采用自变量的回调。类似注释在一些其他编程语言中为:
C#:()=>foo-or-delegate(){return foo;}
VB:Function()foo
JavaScript:function(){return foo;}
C++[](){returnfoo;}
优化器424注入本身以在运行时而非仅在编译时运行的能力提供技术效益。在上述示例中,传统的优化器必须决定是否将GetBigSet()的评估移动到某一共用位置,或者使其留在原始位置。未强迫如本文中教导的增强型优化器在这两个极端之间选择。此外,在具有长运行代码的环境中,在已执行编译时间优化遍历很久之后,对由优化器使用的目录212的更新能够影响运行代码。例如,整个代码段可以被视为不经常运行(可能由于此代码的先前调用,其已将统计供应到目录中),因此优化器能够决定通过将该代码升入某一拉姆达中在目标代码处运行本身。其将不必为Memoize(()=>code)操作,但能够替代地类似于Eval(()=>code)操作,这是因为尚未必要地评定代码纯度。优化器可以经由回调安装其本身以在稍后时间运行,该时间还可以是在目录包含更多信息或另外更新的信息时的时间。记忆化操作可以被视为具有CPU/存储器取舍的在运行时使用代码纯度的编译时间优化器知识调用优化器的特殊情况。更一般的情况是在运行时调用优化器,可能地具有自在编译时间推断的知识的暗示。
更多关于优化优先化
如本文中别处所讨论的,优化候选1370可以基于其相对权重1334来优先化1336。优先化权重函数能够基于编译时间的纯(子)表达式的评估,测量各种项目,诸如使用的CPU循环、进行的存储器分配(并且在一些实现中,触发的垃圾收集的数目)以及存储器中的所得常数的总大小。这些值能够放在注释404中,以使得其能够被后续优化器遍历利用。
在一些实施例中,其他权重是基于代码408的静态形状或代码408的属性。例如,子节点414的数目能够为代码复杂度的反射,如可以是代码中的循环(循环可以是CPU密集型)的存在,或者至C++代码中的“新”运算符的调用或构造或分配存储器的另一表达式的存在。
此突出本文中所呈现的教导的灵活性。当各种编程语言可以具有用于纯度或不变性(例如,C++的“constexpr”)或异常行为(例如,Java的“throws”)的注释时,其缺失其他特性指示,诸如指示代码408“分配”、“可以分配”或“决不分配”的注释404。
优化候选权重1334的具体定义和使用可以在实现之间发生变化。一者可以涉及通过用户的阈值集,例如实施例可以评估1348是否这样做则将不使用超过存储器112的x个字节,或者评估1348是否评估将在编译时间花费小于x秒而不管存储器使用。在一些中,策略引擎插入。在一些中,使用机器学习,例如,优化器424可以将学习回调1342放置1340在省略的代码中,以加强或导向优化决定并使未来的决定更好地与观察的行为对准。
更多关于注释组合
实施例可以使用图上方的查看器412或代码214的树表示410来查询语义提供程序及获得广泛多种注释404。这些注释的代数可以由语义提供程序提供,并且可以提供组合1358、1210注释的方式(例如,本文中表示为“&”、并集等的逻辑与)。由优化器寄存的回调1342可以用于制定优化决策,例如,“如果其分配,那么在编译时间对其进行评估,或者向节点分配增加1212另一注释以传达其可以引发OutOfMemoryException”。通过将编译时间的代码段评估为常数值,后续优化可以变为可能的,其结果在运行时需要更少分配。说明该益处的一般案例为:“新人(“巴特(Bart)”,21).年龄”,其在优化后跳过运行时处字符串和人物的分配且仅获得为常数21的年龄属性。
关于由语义提供程序212、406、420或424提供的注释的代数,包括组合1358、1210注释的方式,在一些实施例中,语义提供程序作为聚合函数,就这种意义而言,当向语义提供程序提供N个子节点414的注释404以及对父节点414的参考,那么其针对该父节点返回一组注释。
例如,考虑由“x/f(y)”表示的代码子树,其中“/”表示除法。在该示例中,语法查看器206(包括语法遍历器412)首先分析“x”,并且向语义提供程序(包括子图结构标识器420和注释器406)询问注释,向语义提供程序提供对表示“x”的节点的参考和注释的空集(由于“x”不有子节点,所以为空的)。语义提供程序可以返回一组注释,诸如{IsPure(true)}。
接着,语法查看器分析“y”,并且向语义提供程序询问注释404,向其提供对“y”的参考和注释的空集,这是因为“y”没有子节点。语义提供程序可以返回一组注释,诸如{IsPure(true)}。
接着,语法查看器分析“f(y)”,并且向语义提供程序询问注释,向其提供对“f(y)”的参考和用于“y”的注释的集{IsPure(true)}。语义提供程序可以返回一组注释,诸如{IsPure(true)}、PossibleExceptions(Foo)、Range(1,100)}。在该示例中,注释Range(1,100)为界定506,其指示函数f的范围(和域相对;如“函数范围”中的“范围”)的可能值限于从1到100的值。
接着,语法查看器分析“x/f(y)”,向语义提供程序询问注释,向其提供对“x/f(y)”的参考以及集{IsPure(true)}(针对左侧)和{IsPure(true)、PossibleExceptions(Foo)、Range(1,100)}(针对右侧)。语义提供程序可以返回一组注释,比如{IsPure(true)}、PossibleExceptions(Foo)}。在此步骤中,注意语义提供程序使用针对/除法的右操作数获得的注释Range(1,100)且使用其不将DivideByZeroException添加到用于表示除法的节点的可能异常828的集。相比而言,如果范围已包括零,或者如果没有范围返回用于子节点且因此不排除零,那么DivideByZeroException将并集到可能异常的集中。
更多关于目录
一个相对简单的目录212为用于不透明库函数708的目录,优化器无法通过查看该函数来检测该函数。例如,例程Math.Sin已知为纯的且决不引发,但被实施为优化器不必理解的CPU指令。纯函数还能够被实施为优化器不具备解析的以诸如C或Fortran等另一语言写入的复杂算法,或者用于例程的源代码可以不可用于分析用于纯度的例程。在一些实施例中,目录212将名称“Math.Sin”706、604或其哈希712、604映射到其纯度注释404,从而有效地为语法图410中的叶节点提供优化知识。在该示例中,此目录为静态的且先于编译时间由开发人员提供。
一些实施例使用或提供更高级的目录212,其标识用户定义的函数710。此函数代码的优化特性402分析发生一次,并且存储结果602。目录中的键604可以再次为函数名称706,但目录条目602还可以包含更多信息,诸如版本编号,或者定义函数710的模块,或者甚至函数中的代码的哈希714。哈希714可以用于帮助确保函数的代码408的变化使注释与代码的关联1214失效,这是因为在改变代码之后关联可能不再有效。添加1356到此目录可以例如在“定义函数”操作中明确地触发,或者目录更新1356可以在遇到更大代码段中的函数的第一次使用时延迟进行,或者更新1356可以例如通过夜间工作或后台处理以离线处理方式进行。
在一些实施例中,甚至更高级的目录212具有一些键604,该键不指代已命名(与“匿名”相对的“非匿名”)函数而是表示语法(子)树的某一哈希716或720。例如,假设分析的代码片段214包含形式“a+b*c–d”的子表达式,其中a、b、c和d本身为一些树。实施例可以创建1356目录条目602,该目录条目针对该整个代码段存储注释404并且通过“a+b*c–d”的哈希712编索引604。
实施细节可以变化。例如,本领域技术人员可以选择条目602大小,其使存储需求和预期(或者,测量的)使用频率保持平衡。当条目太特定且因此不常使用并且还相对较大时,其可能为存储浪费。如果太特定,甚至相对较小的条目602也可能为浪费的,例如条目陈述3.1415为常数,或者2*PI为常数,或者Math.Sin(30)/2为常数。
通常重新使用大树但总是在某一部分改变甚微也可能发生。例如,税收计算可以是通常以较大表达式(与命名为辅助函数相对)联网发生的复杂公式,并且总是为相同模某一常数(例如,税率等级或某一百分比)。为适应这样的情况,人们可以提高常数和表达式中的纯节点且弄清楚结果。例如,“f(x)*0.2-g(x)”和“f(x)*0.3-g(x)”能够针对常数c的不同值变为“f(x)*c-g(x)”。因此,c为表达式中的一类孔,并且“f(x)*c-g(x)”可以相应地表示为子图结构模板718。此重写表达式的哈希720可以被用作目录2121中的键604以跟踪用于c的任何值的“f(x)*c-g(x)”的语义信息。
在一些情况中,如果树使用创建模板的此技术变得一般化,那么引入更多未知。例如:f(x)/2可以针对任何值c变为f(x)/c。然而,如果c变为0,那么所得代码的属性与c不为0的情况不同。这是本公开中早前讨论的“条件注释”的回忆。这是异常集依赖于c的值的示例。在先前讨论具有条件纯度的示例的情况下,此注释可以是类似[ThrowsExceptionIf(typeof(DivideByZeroException),c==0)],由此条件变为在注释中编码。作为附加观察,在一些情况中,此类条件注释可以趋向于级联。假定在输入上存在异常条件,且整个表达式为更大try…catch…statement的部分。则陈述的异常也变为条件的(且通常具有更复杂的描述这些条件的论断)。这可以导致截断点,其中限制使用模板代码技术的代码的一般化,以使得注释中的这些条件的复杂度不是无界的。
作为旁注,如果模板表示“f(x)/c-g(x)”,那么注释404可以具有关于被零除异常的可能性的条件,这是由于依赖于c值的除法。
语法查看器能够在其以自下而上的方式遍历1202树410时计算模板哈希720,在树的表示中钻孔以执行匹配模常数(或者,其他琐碎),且从而提高匹配1326可能性。更复杂的数据结构能够用于优化此哈希计算且提高目录中的条目602的搜索效率。例如,“f(x)”的目录条目能够记住存在“f(x)*c”的相关条目,因此语法查看器知晓如果父节点“f(x)”为乘法,那么其应再次在目录中查看父节点的匹配。在该情况下,目录有效地为优化的反向索引。
简言之,目录212能够为静态的(所有条目602的一次性定义)或动态的(当分析更多代码214时为更多或更改的条目)。此外,与条目602的匹配1326可以是精确的(例如,通过匹配名称或完整哈希),或者匹配1326可以是模糊的(例如,部分哈希上的匹配)。因此,目录实施例的空间和其使用非常大。
更多关于起源和上下文
本文中的一些教导的早期观点涉及具有效果注释的常数合并。借助于上下文,一些编译器包括执行常数合并的优化步骤,以通过评估编译时间的程序的部分减少所产生代码的执行时间。这些优化通常是基于原始类型的内置知识和其操作安全优化的知识。库函数通常为编译器未知的且因此不经受此类优化。本文中提供的一些教导描述丰富的语义提供程序机制,该语义提供程序机制向编译器提供信息以执行更彻底的优化。作为旁注,本领域技术人员将识别软件“知晓”(或者,不知晓)一些数据或一些能力的效果的陈述意指适当地配备或设计或配置(或者,不配备或设计或配置)软件以处理数据或执行提供能力的计算。同样地,说软件“理解”(或者,不理解)项目意指适当地配备或设计或配置(或者,不配备或设计或配置)软件以通过计算方式处理项目。
一些编译器具有其具有深层语义理解的原始类型的富集,且由此提供优化。示例为知晓字符串上的“+”串联运算符和安全执行的优化的C#编译器。“+”的C#语义与“Concat”函数的运行时行为对准,并且语言和运行时保持同步。
作为另一示例,考虑正则表达式。通过本文中提供的教导的有益应用,许多此类小语言能够通过仅用语义信息标记库函数来支持。例如:“String.Format(“{0}is{1)”,person.Name,person.Age);”可以是纯的,而编译器不必理解传递为Format的格式字符串。在此特定示例中,Format不必为纯的,这是因为其具有用于印刷例如具有所需小数点分隔符的小数或具有所需格式的日期的关于用户机器的区域性的隐藏参数。然而,Format的其他负载为纯的,这是因为其使用固定区域性。假定注释能够以单独方法提供,一些实施例不遭受编译器代码中的极端特殊情况以培训编译器关于库函数的变化。另一示例为“newRegex(“[0-9]*”).Match(42)”。目录可以含在关于Regex和Match为纯函数的信息,并且接着优化自动进行。
一些编译器具有其在编译期间靶向的单独库702或库702的框架的深层内置知识,并且包含这些库定制的优化。例如,一些C++编译器理解“printf”和printf自变量中嵌入的迷你语言(例如,%d点位符),从而允许那些编译器在编译时间进行格式化字符串的一些优化计算。这是运行时库的语义漏入编译器中的地点。
一些编译器依赖于语言延伸以执行或导向更积极的优化。示例包括用于代码的编译时间扩展和以C++的“constexpr”的引入的宏语言。此方式不允许现有库使用语义知识来注释(无源级别编辑),并且还缺失能够由优化器424使用的其他各类的注释404,例如关于异常行为的保证。为了以类似于C++“constexpr”的方式引入这些,语言将需要过剩的附加关键字1352。相比而言,本文中所呈现的一些教导提供可扩展语义注释404,该可扩展语义注释能够导向优化而不依赖1350于新关键字。
在一些实施例中,自下而上扫描描述程序的抽象语法树410以发现关于各种节点414提到的代码实体408的信息。作为示例,考虑执行方法的调用的节点。当遇到此节点时,咨询语义提供程序以回答问题,诸如方法是否为纯函数(例如,比如Math.Sin的一个人),方法是否引发异常(例如,BigInteger的除法运算符),等等。该语义信息402拼接1358在一起以寻找共用某些优化特性402的最大跨越子树。
例如,使用参考标号806(无副作用)、810(无外部变量访问)、814(无静态局部)、822(无I/O)和826(不能引发异常)通过本文中表示的方式中的每种方式来假定Math.Sin和Math.Cos为纯的。在该假定前提下,将这些函数施加到稳定值(例如,按值传递的变量)也将在那些意义上且如参考标号818(无引用参数)所指示为纯的。另外,Math.Pow能够被发现在相同意义上为纯的,因此诸如“Math.Pow(Math.Sin(x),2)+Math.Pow(Math.Cos(x),2)”等表达式能够被视为完全纯的。使用三角恒等式(正弦平方加上余弦平方等于一)接着允许优化器424将整个表达式减少为值一的常数。
作为旁注,本领域技术人员识别除数学三角恒等式的此应用,数字和计算不相同。在数学上,不存在溢出异常的概念。但在此计算讨论中,关于函数结果的大小的论证和关于整数或浮动存储的大小的假定以及值504如何在该存储112中表示构成假定将不引发溢出异常的基础。
构建于此Math.Sin和Math.Cos示例,本文中教导的方案206、1200的一个机制涉及(a)鉴于针对其子节点发现1206、1208、1210的语义属性,发现1206、1210与节点相关联的语义属性402,以及(b)当关于这些语义属性的某些断言被评估为真的时,调用1216优化提供程序424。在纯度分析中,对应优化提供程序可以是当节点被视为纯的时请求回调1342的提供程序,因此其能够触发部分评估1348,从而将节点减小为常数。在已评估所有语义属性之后,这些优化提供程序424能够通过语法树410在第一次(自下而上)遍历期间或第二次(自上而下)遍历期间调用,从而允许发现1358某些属性402保持的树410的最大部分。
此外,一些优化提供程序424能够将新的重写1338树410返回给优化分析驱动程序420或406,其能够施加1336权重函数1334以(局部地)决定哪个优化提供程序424提供最大或最需要的增益。在一些实施例中,这些成本函数1334为可插拔的,并且能够在扫描1204树(或者,在最新重写1338的树,后优化)时利用发现的所有语义信息。例如,一个成本提供程序1334能够考虑常数的数目(更多,更好,因为评估更少),而另一成本提供程序1334能够通过评估原始树和比较成本到评估新树来评定成本,而又另一者能够基于诸如针对节点报告的所估计成本等(诸如,CPU循环的数目、存储器成本、I/O行为等)准则执行代数运算。
在一些实施例中,发现语义信息402、404经由提供程序发生,该提供程序能够通过目录212返回。在一个实现中,内部使用的目录是针对Microsoft.NETTM框架(Microsoft公司的标记)中的函数的大子集构建。目录212中的信息能够部分地从现有元数据注释(例如,主机保护属性、纯度注释)供应或能够手动地提供。
如本文中所讨论的,一些实施例提供或使用可扩展注释机制以表示诸如函数、成员、类型等等代码实体408上的优化机会。表示与副作用、函数纯度等等相关的行为的注释404与代码实体相关联1214以帮助优化器424确定是否可以安全地执行候选优化。一些优化器424遵守插入架构,并且一些可以经由注释发现并且接着参与编译器管道的优化阶段。
在一些实施例中,本文中教导的注释能力在现有语言和运行时顶部分层,而非改变语言或运行时。此将这些实施例与类似将常量表达式添加到C++的方式或编程语言本身通过其获得纯函数相对具有副作用的函数(例如,具有IO monads的Haskell)的观念的方式区分开。本文中教导的许多工具和技术可适用于现有语言和运行时以例如优化服务的后端。因此,评估许多表达式的云服务能够通过施加优化来提供,即使潜在语言(例如,C#)或运行时(例如,Microsoft公共语言运行时)或库(例如,Microsoft.NET库)不提供能够被利用来执行此类优化的深层语义信息也如此。
一些附加组合和变化
代码、数据结构、逻辑、组件、通信和/或其功能等同的这些组合中的任何组合还可以与上述系统和其变化中的任一者组合。过程可以包括可操作的任何子集或组合或顺序中的本文中所描述的任何步骤。每个变体可以单独地或与其他变体中的任何一个或多个组合发生。每个变体可以使用过程中的任一过程发生,并且每个过程可以与其他过程中的任何一个或多个组合。包括变体的每个过程或过程的组合可以与上文描述的经配置的存储介质组合和变体中的任一者组合。
结论
简言之,本文中提供的教导可以适用于定位和记录优化机会,因此通过编译器122或解释器122增强代码转换1302。在一些实施例中,增强型转换器122、206扫描1204程序204语法图410,识别1208子图结构418,且注释1212图410的节点414以记录与节点414相关联1214的程序代码条目408的优化特性402。子图结构418和对应注释404可以维持1356在不同于任何特定可优化程序204的优化目录212中。优化器424基于所注释的语法图410改进程序代码214转换208。
在一些实施例中,优化特性402可以指定1308关于可能执行值504(包括值范围506)和潜在执行行为508的代码纯度,例如,副作用808、局部静态变量816使用或全局变量812使用、I/O使用824、引用参数820的使用,异常828在程序执行和代码的非终止832期间为可能的。
在一些实施例中,子图结构418可以使用例程704名称706、哈希值712和具有任何常数将填满的孔的模板718来标识604。
在一些实施例中,父节点414优化特性402可以通过子节点414的特性402推断1210。
在一些实施例中,优化候选1370可以使用权重函数1334来优先化1336。
在一些实施例中,优化器424回调1342可以插入1340图410或代码408中以递增地评估1348优化特性402。
实施例被理解为还包括或受益于测试和适当的安全控制和隐私控制,诸如一般数据保护条例(GDPR),例如,应理解应采取适当的措施以帮助防止代码转换误用(诸如,转换期间注入恶意软件)且帮助避免用在程序执行期间转换可以处理的任何个人或私有信息来篡改。本文中教导的工具和技术的使用与此类控制的使用兼容。
尽管特定实施例在本文中明确地说明且描述为过程、经配置的存储介质或系统,但将了解,一种类型的实施例的讨论还通常延伸到其他实施例类型。例如,结合图12和图13的过程的描述还帮助描述经配置的存储介质,并且帮助描述技术效果和系统操作以及如结合其他图讨论的制造。不必遵循来自一个实施例的限制必要地彼此读入。具体地,当讨论诸如配置的存储器等系统或制造时,过程不必限于数据结构和呈现的布置。
本领域技术人员将理解,实施细节可以关于具体代码,诸如具体API、具体场、具体种类的组件和具体样本程序,因此不需要在每个实施例中出现。本领域技术人员还将理解,程序标识器和用于讨论细节的一些其他术语为实施专用的且因此不需要关于每个实施例。然而,尽管不一定需要在此对其呈现,但此类细节可以通过提供文本来帮助一些读者和/或可以说明本文中讨论的技术的许多可能实现中的几个实现。
本文中对具有某一特征X的实施例的参考和本文中别处对具有某一特征Y的实施例的参考不排除具有特征X和特征Y的本公开实施例,除非在本文中明确地陈述此排除。所有可能负面权利要求限制在本公开的范围内,从这一意义来说,陈述为实施例的部分的任何特征还可以明确地从另一实施例的包含中去除,即使在本文中的任何示例中未给定具体排除也如此。术语“实施例”在本文中仅用作“过程、系统、制品、配置的计算机可读存储介质和/或如与适用法律一致的方式适用的本文中的教导的其他示例”的更方便形式。因此,给定“实施例”可以包括本文中公开的特征的任何组合,前提是实施例与至少一项权利要求一致。
并非图中示出的每个项目都需要呈现于每个实施例中。相反,实施例可以包含图中未明确示出的(多个)项目。尽管通过具体示例在文本和图中在此处说明一些可能性,但实施例可以脱离这些示例。例如,示例的具体技术效果或技术特征可以省略、重新命令、以不同方式分组、重复、以不同方式在硬件和/或软件中实例化或为在示例中的两个或多个示例中出现的效果或特征的混合。在一些实施例中,在一个位置处示出的功能性还可以在不同位置处提供;本领域技术人员识别能够在给定实现中以各种方式定义功能性模块而不必从视作一个整体的交互模块的集合省略所需技术效果。由于空间限制或出于方便,不同步骤可以在图中的单个框中一起示出,然而为单独可执行的,例如可以执行一个而不执行方法的给定性能中的另一个。
现通过参考标号贯穿全文参考图。图中或文本中与给定参考标号相关联的短语中的任何明显不一致应被理解为简单地拓宽由该标号参考的范围。给定参考标号的不同实例可以指代不同实施例,即使使用相同参考标号也如此。类似地,给定参考标号可以用于指代每个的动词、名词和/或对应实例,例如处理器110可以通过执行指令来处理110指令。
如本文中所使用的,诸如“一”和“该”等术语包括所指示项目或步骤中的一个或多个。具体地,在权利要求中,参考项目通常意指至少一个此项目存在,并且参考步骤意指执行步骤的至少一个实例。类似地,当文本允许时,“是”和其他单数动词形式应被理解为包含“是”和其他复数形式的可能性,以避免语法错误或误解。
标题仅为方便起见;关于给定主题的信息可以在其标题指示该主题的章节外找到。
如申请的所有权利要求和摘要为说明书的部分。
在本文中使用的任何术语表明或另外指代工业标准的程度上且在适用法律需要诸如标准的特定版本的标识的程度上,本公开应被理解为指代已根据适用专利法在本公开的最早优选权日期时以至少草稿形式(最终形式如果更新则优先)公布的该标准的最新版本。
尽管已在图中示出且在上文描述示例性实施例,但对于本领域技术人员将为显而易见的是,能够进行许多修改而不脱离权利要求中阐述的原理和概念,并且此类修改不需要涵盖全部摘要概念。尽管以专用于结构特征和/或程序动作的语言来描述主题,但应理解的是,随附权利要求中定义的主题不必限于权利要求上描述的具体技术特征或动作。在每个实施例中呈现或利用给定定义或示例中标识的每种方式或方面或技术效果为不必要的。实际上,所描述具体特征和动作和效果针对实施权利要求时的考虑公开为示例。
没有包含整个抽象概念但在权利要求的等效含义和范围内的所有改变包含在其范围内以达到法律所允许的完整范围。

Claims (15)

1.一种代码转换优化系统,包括:
存储器;
处理器,与所述存储器可操作地通信,所述处理器被配置为执行步骤,所述步骤包括(a)遍历程序的语法图的至少一部分,(b)识别所述语法图中的预定子图结构,(c)将优化特性注释与所识别的所述语法子图结构相关联,所得关联指示代码段的与所识别的所述子图结构相对应的方面在执行所述代码段之前可辨别的程度,所述方面包括执行值或执行效果或两者,以及(d)至少部分地基于关联步骤的结果来执行所述程序的代码转换的优化。
2.根据权利要求1所述的系统,其中所述存储器包括具有条目的目录,所述条目包括所述子图结构的标识以及与所标识的子图结构相关联的所述优化特性注释,所述目录条目在所述程序的所述代码转换之前存在并且还在执行所述程序的所述代码转换的所述优化之后存在。
3.根据权利要求2所述的系统,其中所述子图结构的所述标识包括以下密钥中的至少一个密钥或由以下密钥中的至少一个密钥索引:
被所述程序利用的库的例程的名称;
作为所述程序的一部分并且专用于所述程序的用户定义例程的名称;
例程的哈希值;
所述子图结构的哈希值;或者
语法子图结构模板的哈希值。
4.根据权利要求1所述的系统,其中所述优化特性注释包括以下至少一项:
指示与所识别的所述子图结构相对应的所述代码段是否在所述代码段的执行期间不具有副作用的值;
指示与所识别的子图结构相对应的所述代码段是否在所述代码段的执行期间访问任何非局部变量的值;
指示与所识别的所述子图结构相对应的所述代码段是否具有任何局部静态变量的值;
指示与所识别的子图结构相对应的所述代码段是否具有通过引用被传递以支持所述代码段的执行的任何参数的值;
指示与所识别的所述子图结构相对应的所述代码段是否在所述代码段的执行期间访问任何I/O设备或I/O流的值;或者
指示与所识别的所述子图结构相对应的所述代码段是否可以在所述代码段的执行期间抛出异常的值。
5.根据权利要求1所述的系统,包括可插拔优化器,所述系统被配置为调用所述可插拔优化器来执行所述优化,其中当优化器可以被启用或禁用或两者时,所述优化器被视为可插拔的,而不重新编译调用所述优化器的代码。
6.一种用于在代码转换期间寻找优化机会的方法,所述方法包括:
扫描程序的语法图的至少一部分,所述语法图具有节点,所述语法图至少表示所述程序的语法结构方面;
查明与所述语法图的节点相关联的所述程序的代码具有优化特性;以及
根据所查明的所述优化特性来注释所述语法图。
7.根据权利要求6所述的方法,其中查明与所述语法图的所述节点相关联的所述程序的代码具有所述优化特性包括以下至少一项:
将所述节点与描述所述优化特性的目录中的条目进行匹配;
将包含所述节点的语法子图与描述所述优化特性的目录中的条目进行匹配。
8.根据权利要求6所述的方法,其中查明与所述语法图的第一节点相关联的所述程序的代码具有第一优化特性包括:根据与所述语法图的第二节点相关联的第二优化特性进行推断,所述第一节点和所述第二节点在所述语法图中具有不同的相应位置,所述第一优化特性和所述第二优化特性具有相同或不同的相应值。
9.根据权利要求6所述的方法,还包括向优化器提供对所注释的所述语法图的访问,并且所述优化器产生以下至少一项:
减小用于所述程序的所述代码的执行的处理器循环计数的优化;
减小用于所述程序的所述代码的执行的存储器要求的优化;
减小用于所述程序的所述代码的执行的I/O要求的优化;
在编译时间用恒定值替换所述程序的代码段的优化;
将数据或指令或两者存储在所述程序的所述代码中的优化;或者
去除所述程序的所述代码中调用或跳转到异常处理程序的优化。
10.根据权利要求6所述的方法,还包括优化器基于所注释的语法图来产生优化,其中所述优化包括对所述语法图的至少一部分的重写。
11.根据权利要求6所述的方法,还包括:
优化器产生多个优化候选,所述多个优化候选是基于所注释的所述语法图的;
将相应权重分配给所述优化候选中的至少两个优化候选;以及
至少部分地基于其相应分配权重来使优化候选优先化。
12.根据权利要求6所述的方法,还包括插入在执行时触发部分评估的回调,所述部分评估至少部分地基于所注释的语法图来产生优化。
13.根据权利要求6所述的方法,其中所述查明不依赖于对所述程序的源代码中的专用于指示所述优化特性的编程语言关键字的使用。
14.根据权利要求6所述的方法,其中所述查明包括咨询具有条目的目录,所述条目各自列出相应代码段的优化特性或在所述目录中标识的语法子图结构。
15.根据权利要求14所述的方法,还包括更新所述目录以包括附加代码段或附加语法子图结构,以及更新所述目录以包括与所述语法图的附加注释匹配的对应优化特性。
CN202080048722.8A 2019-05-16 2020-03-27 用于代码优化的语法图的持续注释 Pending CN114041117A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US16/414,526 US10871950B2 (en) 2019-05-16 2019-05-16 Persistent annotation of syntax graphs for code optimization
US16/414,526 2019-05-16
PCT/US2020/025096 WO2020231529A1 (en) 2019-05-16 2020-03-27 Persistent annotation of syntax graphs for code optimization

Publications (1)

Publication Number Publication Date
CN114041117A true CN114041117A (zh) 2022-02-11

Family

ID=70334128

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202080048722.8A Pending CN114041117A (zh) 2019-05-16 2020-03-27 用于代码优化的语法图的持续注释

Country Status (4)

Country Link
US (1) US10871950B2 (zh)
EP (1) EP3970002A1 (zh)
CN (1) CN114041117A (zh)
WO (1) WO2020231529A1 (zh)

Families Citing this family (31)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11256606B2 (en) 2016-11-04 2022-02-22 Salesforce.Com, Inc. Declarative signup for ephemeral organization structures in a multitenant environment
US10664320B2 (en) * 2017-08-03 2020-05-26 Red Hat, Inc. Host specific containerized application configuration generation
US11010481B2 (en) * 2018-07-31 2021-05-18 Salesforce.Com, Inc. Systems and methods for secure data transfer between entities in a multi-user on-demand computing environment
US11010272B2 (en) * 2018-07-31 2021-05-18 Salesforce.Com, Inc. Systems and methods for secure data transfer between entities in a multi-user on-demand computing environment
GB2576375A (en) * 2018-08-17 2020-02-19 Uvue Ltd Transaction system and method of operation thereof
US11516234B1 (en) * 2019-07-08 2022-11-29 Cisco Technology, Inc. In-process correlation through class field injection
US11487878B1 (en) 2019-09-18 2022-11-01 Amazon Technologies, Inc. Identifying cooperating processes for automated containerization
US11442765B1 (en) 2019-09-18 2022-09-13 Amazon Technologies, Inc. Identifying dependencies for processes for automated containerization
CN111291554B (zh) * 2020-02-27 2024-01-12 京东方科技集团股份有限公司 标注方法、关系抽取方法、存储介质和运算装置
US11537372B2 (en) * 2020-03-25 2022-12-27 ManyCore Corporation Generating compilable machine code programs from dynamic language code
US11392445B2 (en) * 2020-04-29 2022-07-19 Cognizant Technology Solutions India Pvt. Ltd. System and method for supporting resilience in it environment
US11650810B1 (en) * 2020-05-27 2023-05-16 Amazon Technologies, Inc. Annotation based automated containerization
US11340873B2 (en) 2020-07-14 2022-05-24 X Development Llc Code change graph node matching with machine learning
US11455152B2 (en) 2020-09-01 2022-09-27 X Development Llc Matching graphs generated from source code
US11977906B1 (en) * 2020-11-06 2024-05-07 EJ2 Communications, Inc. Method for generating no-code automated cybersecurity tasks
US20220230249A1 (en) * 2021-01-19 2022-07-21 Better Holdco, Inc. Condition tree optimization
US11321218B1 (en) * 2021-03-08 2022-05-03 Correct Computation, Inc. Automated generation of source code models from machine code for code analysis
US11675688B2 (en) * 2021-05-20 2023-06-13 Nextmv.Io Inc. Runners for optimization solvers and simulators
US20230087457A1 (en) * 2021-09-17 2023-03-23 Nvidia Corporation Application programming interface to retrieve data
US11704226B2 (en) * 2021-09-23 2023-07-18 Intel Corporation Methods, systems, articles of manufacture and apparatus to detect code defects
US12013773B2 (en) * 2021-12-10 2024-06-18 International Business Machines Corporation Generating debuggable executables based on optimizing different compiler options for source code modules
US20230305845A1 (en) * 2022-03-22 2023-09-28 Nvidia Corporation Techniques to selectively store data
US20240126761A1 (en) * 2022-10-14 2024-04-18 Jpmorgan Chase Bank, N.A. System and methods for processing data queries in hybrid data mesh architectures
US11983515B1 (en) * 2022-10-26 2024-05-14 International Business Machines Corporation Optimizing source code using callable unit matching
CN115495095B (zh) * 2022-11-18 2023-03-21 上海燧原科技有限公司 张量程序的整程序编译方法、装置、设备、介质及集群
US11734502B1 (en) * 2022-12-01 2023-08-22 Suki AI, Inc. Systems and methods to maintain amends to an annotation as discrete chronological events
US11902832B1 (en) * 2023-07-20 2024-02-13 Spideroak, Inc. Ordering multiple commands issued by multiple computing devices in a network, when chronological ordering is not possible
US11928612B1 (en) 2023-07-20 2024-03-12 Spideroak, Inc. Fixing a changing weave using a finalize node
CN116701237B (zh) * 2023-08-09 2023-12-29 北京集度科技有限公司 测试脚本生成及测试方法、设备及存储介质
CN116737763B (zh) * 2023-08-16 2023-11-21 腾讯科技(深圳)有限公司 结构化查询语句执行方法、装置、计算机设备、存储介质
CN117610325B (zh) * 2024-01-24 2024-04-05 中国人民解放军国防科技大学 基于分布式的优化设计节点调度方法、系统和设备

Family Cites Families (39)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5752038A (en) * 1994-03-16 1998-05-12 Microsoft Corporation Method and system for determining an optimal placement order for code portions within a module
US6745384B1 (en) * 1998-05-29 2004-06-01 Microsoft Corporation Anticipatory optimization with composite folding
US6804682B1 (en) * 2002-04-29 2004-10-12 Borland Software Corporation System and methodology providing compiler-assisted refactoring
US7165238B2 (en) * 2003-06-06 2007-01-16 Intentional Software Corporation Method and system for organizing and manipulating nodes by category in a program tree
US20050198624A1 (en) * 2004-03-02 2005-09-08 Chipman Timothy W. Method and system for program transformation
US7370318B1 (en) * 2004-09-02 2008-05-06 Borland Software Corporation System and methodology for asynchronous code refactoring with symbol injection
US20090077532A1 (en) * 2007-09-13 2009-03-19 Universities Space Research Association Automated annotation inference for safety certification of automatically generated code
US8250544B2 (en) * 2008-03-05 2012-08-21 Microsoft Corporation Annotating exception information in a computer program
US8386941B2 (en) 2008-06-27 2013-02-26 Microsoft Corporation User interface localization conflict indication
US20120072411A1 (en) 2010-09-16 2012-03-22 Microsoft Corporation Data representation for push-based queries
US20120072442A1 (en) 2010-09-22 2012-03-22 Microsoft Corporation Monadic type preservation for query operators
US9177017B2 (en) 2010-09-27 2015-11-03 Microsoft Technology Licensing, Llc Query constraint encoding with type-based state machine
US20120078878A1 (en) 2010-09-28 2012-03-29 Microsoft Corporation Optimized lazy query operators
US20120084749A1 (en) 2010-10-01 2012-04-05 Microsoft Corporation Programming language support for reactive programming
US20120151187A1 (en) 2010-12-13 2012-06-14 Microsoft Corporation Instruction optimization
US20120150913A1 (en) 2010-12-13 2012-06-14 Microsoft Corporation Multidimensional data-centric service protocol
US9477537B2 (en) 2010-12-13 2016-10-25 Microsoft Technology Licensing, Llc Reactive coincidence
US8539463B2 (en) * 2011-07-28 2013-09-17 Qualcomm Innovation Center, Inc. Apparatus and method for improving the performance of compilers and interpreters of high level programming languages
US8539439B2 (en) 2011-10-13 2013-09-17 Microsoft Corporation Asynchronous programming model mapping
US8745591B2 (en) 2011-10-19 2014-06-03 Microsoft Corporation Data flow visualization and debugging
US20130117288A1 (en) 2011-11-08 2013-05-09 Microsoft Corporation Dynamically typed query expressions
US9400638B2 (en) 2011-11-08 2016-07-26 Microsoft Technology Licensing, Llc Reactive expression generation and optimization
US20130117326A1 (en) 2011-11-08 2013-05-09 Microsoft Corporation External serialization and deserialization
US20130132962A1 (en) 2011-11-22 2013-05-23 Microsoft Corporation Scheduler combinators
US9886474B2 (en) 2011-11-22 2018-02-06 Microsoft Technology Licensing, Llc Multidimensional grouping operators
US9182957B2 (en) * 2012-07-10 2015-11-10 Loring Craymer Method and system for automated improvement of parallelism in program compilation
US9524323B2 (en) 2012-09-05 2016-12-20 Microsoft Technology Licensing, Llc Delegation of expression tree evaluation
US9696968B2 (en) 2014-01-17 2017-07-04 Microsoft Technology Licensing, Llc Lightweight optionally typed data representation of computation
US9218497B2 (en) 2014-02-24 2015-12-22 Microsoft Technology Licensing, Llc Incentive-based app execution
US9560055B2 (en) 2014-04-30 2017-01-31 Microsoft Technology Licensing, Llc Client-side integration framework of services
US10574714B2 (en) 2014-06-25 2020-02-25 Microsoft Technology Licensing, Llc Stream-based reactive programming platform
US9952916B2 (en) 2015-04-10 2018-04-24 Microsoft Technology Licensing, Llc Event processing system paging
US20160299786A1 (en) 2015-04-10 2016-10-13 Microsoft Technology Licensing, Llc Code examination by scheduler timeline manipulation
US10303558B2 (en) 2015-04-17 2019-05-28 Microsoft Technology Licensing, Llc Checkpointing higher order query operators
US9678724B2 (en) * 2015-05-29 2017-06-13 Intentional Software Corporation System and method for combining text editing and tree encoding for computer programs
US10318511B2 (en) 2015-11-25 2019-06-11 Microsoft Technology Licensing, Llc Expression tree interning
US10853366B2 (en) 2015-12-01 2020-12-01 Microsoft Technology Licensing, Llc Cooperative expression visitors
US20170154080A1 (en) 2015-12-01 2017-06-01 Microsoft Technology Licensing, Llc Phasing of multi-output query operators
US10565110B2 (en) 2016-08-02 2020-02-18 Microsoft Technology Licensing, Llc Reducing memory usage for long standing computations

Also Published As

Publication number Publication date
US20200364036A1 (en) 2020-11-19
EP3970002A1 (en) 2022-03-23
WO2020231529A1 (en) 2020-11-19
US10871950B2 (en) 2020-12-22

Similar Documents

Publication Publication Date Title
US10871950B2 (en) Persistent annotation of syntax graphs for code optimization
US11379227B2 (en) Extraquery context-aided search intent detection
Pawlak et al. Spoon: A library for implementing analyses and transformations of java source code
US10152309B2 (en) Cross-library framework architecture feature sets
KR101944570B1 (ko) 변형 컨텍스트-인식 데이터 소스 관리
US8732674B1 (en) Revertable managed execution image instrumentation
US8850581B2 (en) Identification of malware detection signature candidate code
US8881122B1 (en) Predicate matching library for complex program analysis
JP5893038B2 (ja) ユーザ定義型のコンパイル時境界検査
EP3455730A1 (en) Systems and methods for model-based analysis of software
JP2012504826A (ja) 拡張可能な構文を有するプログラミング言語
US20200210158A1 (en) Automated or machine-enhanced source code debugging
US20110239200A1 (en) Method for compiling a computer program
Yu et al. Building certified libraries for PCC: Dynamic storage allocation
US11934801B2 (en) Multi-modal program inference
US20070074185A1 (en) Identifier expressions
Biggar Design and Implementation of an Ahead-of-Time Compiler for PHP
US20170075668A1 (en) Methods and Systems for Generating Client-Server Applications for Target Devices
Schröder et al. An empirical investigation of command-line customization
US11714613B2 (en) Surfacing underutilized tool features
Bolotnikov et al. Interprocedural static analysis for finding bugs in go programs
Petricek Context-aware programming languages
Girka et al. A mechanically checked generation of correlating programs directed by structured syntactic differences
US11972237B1 (en) Member invocation declarative interception
US20240160436A1 (en) Software development tool installation and command routing

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination