CN110678839B - 基于流的范围界定 - Google Patents
基于流的范围界定 Download PDFInfo
- Publication number
- CN110678839B CN110678839B CN201880033532.1A CN201880033532A CN110678839B CN 110678839 B CN110678839 B CN 110678839B CN 201880033532 A CN201880033532 A CN 201880033532A CN 110678839 B CN110678839 B CN 110678839B
- Authority
- CN
- China
- Prior art keywords
- code segment
- code
- scope
- variables
- uninitialized
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/436—Semantic checking
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3624—Software debugging by performing operations on the source code, e.g. via a compiler
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/33—Intelligent editors
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/425—Lexical analysis
Abstract
公开了用于基于流的范围界定的技术。相同级别代码段序列中的第一代码段封装第一较低级别词法范围。第一较低级别范围包括为相同级别代码段序列提供的范围界定。第一代码段包括条件和未初始化变量。如果第一代码段被执行,则使得条件被评估。如果条件被满足,则未初始化变量被初始化,并且使未初始化变量仅在第一较低级别词法范围内可用。如果第二代码段(a)引用未初始化变量,并且(b)在相同级别代码段序列中或在第一较低级别词法范围之外的第二较低级别词法范围中,则呈现指示未初始化变量在第二代码段的范围之外的错误消息。
Description
权益要求;通过引用并入本文
本申请要求于2017年4月8日提交的美国临时专利申请No.62/483,342和于2018年4月6日提交的美国专利申请No.15/947,432的权益,这些申请通过引用并入本文。
申请人特此撤销在(一个或多个)母申请或其申请历史中的权利要求范围的任何声明,并告知USPTO本申请中的权利要求可能比(一个或多个)母申请中的任何权利要求更广泛。
技术领域
本公开涉及范围界定(scoping)变量。特别地,本公开涉及基于流的范围界定。
背景技术
在计算机编程中,变量的范围是其中变量可用于使用的代码区域。例如,特定变量可能在特定代码段或代码区域的范围中。如本文所使用的,“代码段”是范围界定规则适用于的语句、表达式或任何其它类型的代码段(或其一部分)。“代码区域”是块、方法、函数、类、程序包(packages)、模块、应用或包围一个或多个代码段的任何其它类型的代码区域。范围界定是确定一个或多个变量可用于在其中使用的(一个或多个)范围的处理。具体而言,在实施例中,范围界定确定代码中的(一个或多个)变量的(一个或多个)范围,其中一个代码段序列封装一个或多个其它代码段序列。不同的编程语言具有不同的规则用于范围界定变量。一般而言,存在两种类型的范围界定:动态范围界定和词法范围界定,如下面进一步详细描述的。
典型地,在动态范围界定中,变量在范围内,直到其中声明该变量的函数返回。例如,假设函数f()在一个代码段中声明了局部变量x,然后在随后的代码段中调用另一个函数g()。在运行时,x在声明x的代码段之后的f()中的所有代码段的范围内,无论在调用g()之前还是调用g()之后。但是,当从f()内调用g()时,x也在g()中的所有代码段的范围内,因为在调用g()时,f()尚未返回。换句话说,当从f()内调用g()时,g()的范围包括f()的范围。在典型的动态范围界定的编程语言中,如果g()声明也称为x的另一个局部变量,则g()的变量x覆盖f()’的变量x,直到g()返回。
典型地,在词法范围界定(也称为静态范围界定)中,变量的范围取决于其中声明该变量的词法环境,遵守特定编程语言的范围界定规则。在典型的词法范围界定的编程语言中,在方法中声明的变量被视为局部变量。例如,假设方法f()在一个代码段中声明了变量x,然后在后续代码段中调用了另一个方法g()。因为x对于f()是局部的,因此不必编译或执行应用就知道x不在g()中的任何代码段的范围内。换句话说,g()的范围不包括f()的范围。类似地,当使用方法中的代码段实例化对象时,新实例化的对象内的代码段的范围不包括实例化了对象的方法的范围。但是,方法中的块的范围典型地包括该方法中前面顶级代码段的范围。
典型地,变量的范围取决于其中声明该变量的代码区域。在方法中声明的变量可能在该方法内的后续代码段的范围内,但不在位于该方法外部的代码段的范围内,诸如相同类或另一个类中的不同方法中。在块内声明的变量可以在位于该块内的后续代码段的范围内,但不在位于该块外部的代码段的范围内。在一些面向对象的编程语言中,当在类中但在方法外部声明变量时,可以将关键字用作访问修饰符,以使变量可在类、子类、程序包或(一个或多个)应用级别可访问。例如,Java编程语言的版本包括访问修饰符public、protected和private。缺少访问修饰符可能意味着默认访问级别。例如,在类中但在方法的外部声明的变量,如果没有显式的访问修饰符,则只能由该类及其包含的程序包访问。
在本部分中描述的方法是可以实行的方法,但不一定是先前已经构想或实行的方法。因此,除非另外指出,否则不应当假设在本部分中描述的任何方法仅仅凭其包括在本部分中就被认为是现有技术。
附图说明
在附图的各个图中,实施例是作为示例而不是作为限制进行图示的。应当注意的是,在本公开中对“一”或“一个”实施例的引用不一定是指相同的实施例,并且它们意味着至少一个。在附图中:
图1图示了其中可以实践本文描述的技术的示例计算架构;
图2是图示适合于实现本文描述的方法和特征的计算机系统的一个实施例的框图;
图3图示了根据实施例的以框图形式的示例虚拟机存储器布局;
图4图示了根据实施例的以框图形式的示例帧;
图5是图示根据一个或多个实施例的代码的框图;
图6图示了根据一个或多个实施例的用于基于流的范围界定的操作集合;
图7A-图7B图示了根据一个或多个实施例的用于执行控制流分析的规则;以及
图8示出了图示根据一个或多个实施例的计算机系统的框图。
具体实施方式
在以下描述中,为了解释的目的,阐述了许多具体细节以便提供透彻的理解。可以在没有这些具体细节的情况下实践一个或多个实施例。在一个实施例中描述的特征可以与在不同实施例中描述的特征组合。在一些示例中,参考框图形式来描述众所周知的结构和设备,以便避免不必要地模糊本发明。
1.总体概述
2.架构概述
2.1示例类文件结构
2.2示例虚拟机架构
2.3加载、链接和初始化
2.4模块化和非模块化环境
2.5开发环境示例
2.6生成自动模块
3.具有词法范围界定的代码
4.基于流的范围界定
5.其它事项;扩展
6.硬件概述
7.计算机网络和云网络
8.微服务应用
9.硬件概述
1.总体概述
一个或多个实施例提供了用于基于流的范围界定的技术。相同级别代码段序列中的代码段封装较低级别词法范围。较低级别范围包括为相同级别代码段序列提供的范围界定。代码段包括条件和一个或多个未初始化变量。如果代码段被执行,则使得条件被评估。如果满足条件,则一个或多个未初始化变量被初始化并使一个或多个未初始化变量仅在较低级别词法范围内可用。如果另一个代码段(a)引用该一个或多个未初始化变量,并且(b)在相同级别代码段序列中或在不同的较低级别词法范围中,则呈现指示该一个或多个未初始化变量在该另一个代码段的范围之外的错误消息。
在本说明书中描述和/或在权利要求中叙述的一个或多个实施例可能不包括在该总体概述部分中。
2.架构概述
图1图示了其中可以实践本文描述的技术的示例架构。关于示例架构所描述的软件和/或硬件组件可以被省略或与和本文所描述的功能集合不同的功能集合相关联。根据一个或多个实施例,可以在环境内使用本文中未描述的软件和/或硬件组件。因此,示例环境不应当被认为是限制任何权利要求的范围。
如图1所示,计算架构100包括源代码文件101,其由编译器102编译成表示要被执行的程序的类文件103。类文件103然后由执行平台112加载和执行,执行平台112包括运行时环境113、操作系统111以及使得能够在运行时环境113和操作系统之间通信的一个或多个应用编程接口(API)110。运行时环境113包括虚拟机104,虚拟机104包括各种组件,诸如存储器管理器105(其可以包括垃圾收集器)、检查类文件103的有效性的类文件验证器106、定位和构建类的存储器中(in-memory)表示的类加载器107、用于执行虚拟机104代码的解释器108以及用于产生优化的机器级别代码的即时(JIT)编译器109。
在实施例中,计算架构100包括源代码文件101,其包含已经用特定编程语言(诸如Java、C、C++、C#、Ruby、Perl等)编写的代码。因此,源代码文件101遵循用于相关联语言的特定语法和/或语义规则集合。例如,用Java编写的代码遵循Java语言规范。但是,由于规范随着时间的推移被更新和修订,因此源代码文件101可能与指示源代码文件101遵循的规范的版本的版本号相关联。用于编写源代码文件101的确切编程语言通常不是关键的。
在各种实施例中,编译器102将根据针对程序员的便利性的规范编写的源代码转换为,或者可由特定机器环境直接执行的机器代码或目标代码,或者可由能够在各种特定机器环境之上运行的虚拟机104执行的中间表示(“虚拟机代码/指令”),诸如字节码。虚拟机指令可由虚拟机104以比源代码更直接和高效的方式执行。将源代码转换为虚拟机指令包括将源代码功能从语言映射到利用底层资源(诸如数据结构)的虚拟机功能。通常,由程序员经由源代码以简单术语呈现的功能被转换为更复杂的步骤,这些步骤更直接地映射到由虚拟机104所驻留的底层硬件支持的指令集。
一般而言,程序作为或者编译或者解释的程序来执行。当程序被编译时,代码在执行之前从第一语言全局变换为第二语言。由于变换代码的工作是提前执行的,因此编译代码往往具有优异的运行时性能。此外,由于变换在执行之前在全局发生,因此可以使用诸如常量合并(constant folding)、死代码消除(dead code elimination)、内联(inlining)等技术来分析和优化代码。但是,取决于被执行的程序,启动时间可能很长。此外,插入新代码将需要使程序下线(offline)、重新编译和重新执行。对于被设计为允许代码在程序执行期间被插入的许多动态语言(诸如Java),纯编译的方法可能是不合适的。当程序被解释时,程序的代码被逐行读取,并且在程序执行的同时转换为机器级别指令。因此,程序具有短的启动时间(可以几乎立即开始执行),但是运行时性能由于即时(on the fly)执行变换而降低。此外,由于每条指令被单个分析,因此依赖于程序的更全局分析的许多优化不能被执行。
在一些实施例中,虚拟机104包括解释器108和JIT编译器109(或实现这两个方面的组件),并且使用解释和编译技术的组合来执行程序。例如,虚拟机104可以初始地通过经由解释器108解释表示程序的虚拟机指令来开始,同时跟踪与程序行为相关的统计信息,诸如不同的代码部分或代码块多频繁地被虚拟机104执行。一旦代码块超过阈值(变“热”),虚拟机104就调用JIT编译器109来执行对该块的分析并且生成优化的机器级别指令,其代替“热”代码块用于将来的执行。由于程序往往花费大部分时间执行整个代码的一小部分,因此只编译程序的“热”部分可以提供与完全编译代码相似的性能,但没有启动惩罚。此外,尽管优化分析被约束到被代替的“热”块,但是仍然存在比单个转换每条指令大得多的优化潜力。在上述示例中存在多种变体,诸如分层编译。
为了提供清楚的示例,源代码文件101已经被图示为要由执行平台112执行的程序的“顶级”表示。虽然计算架构100将源代码文件101绘为“顶级”程序表示,但是在其它实施例中,源代码文件101可以是经由将不同语言的代码文件处理成源代码文件101的语言的“较高级别”编译器接收到的中间表示。以下公开中的一些示例假设源代码文件101遵循基于类的面向对象的编程语言。但是,这不是对利用本文所描述的特征的要求。
在实施例中,编译器102接收源代码文件101作为输入,并且将源代码文件101转换为以由虚拟机104所期望的格式的类文件103。例如,在JVM的上下文中,Java虚拟机规范定义了类文件103被期望要遵循的特定类文件格式。在一些实施例中,类文件103包含已从源代码文件101转换的虚拟机指令。但是,在其它实施例中,类文件103也可以包含其它结构,诸如识别常量值的表和/或与各种结构(类、字段、方法等)相关的元数据。
以下讨论假设类文件103中的每一个表示在源代码文件101中定义的(或由编译器102/虚拟机104动态生成的)相应的“类”。但是,前述假设不是严格的要求并且将取决于虚拟机104的实现。因此,无论类文件103的确切格式如何,本文描述的技术都仍然可以被执行。在一些实施例中,类文件103被划分为一个或多个“库”或“程序包”,其中的每一个包括提供相关功能的类的集合。例如,库可以包含实现输入/输出(I/O)操作、数学工具、密码技术、图形实用工具等的一个或多个类文件。此外,一些类(或这些类内的字段/方法)可以包括将其使用限制在特定类/库/程序包内或限制到具有适当权限的类的访问限制。
2.1示例类文件结构
图2图示了根据实施例的以框图形式的类文件200的示例结构。为了提供清楚的示例,本公开的其余部分假设计算架构100的类文件103遵循本部分中所描述的示例类文件200的结构。但是,在实际环境中,类文件200的结构将取决于虚拟机104的实现。此外,本文所讨论的一个或多个特征可以修改类文件200的结构,以例如添加附加的结构类型。因此,类文件200的确切结构对于本文描述的技术不是关键的。为了第2.1部分的目的,“类”或“当前类”是指由类文件200表示的类。
在图2中,类文件200包括常量表201、字段结构208、类元数据207和方法结构209。在实施例中,常量表201是除了其它功能之外充当类的符号表的数据结构。例如,常量表201可以存储与在源代码文件101中使用的各种标识符相关的数据,诸如类型、范围、内容和/或位置。常量表201具有用于值结构202(表示类型int、long、double、float、byte、string等的常量值)、类信息结构203、名称和类型信息结构204、字段引用结构205、以及由编译器102从源代码文件101导出的方法引用结构206的条目。在实施例中,常量表201被实现为将索引i映射到结构j的数组。但是,常量表201的确切实现不是关键的。
在一些实施例中,常量表201的条目包括对其它常量表201条目进行索引的结构。例如,用于表示字符串的值结构202之一的条目可以保持将其“类型”识别为字符串的标签,以及指向存储表示该字符串的ASCII字符的char、byte或int值的常量表201的一个或多个其它值结构202的索引。
在实施例中,常量表201的字段引用结构205保持指向常量表201中表示定义字段的类的类信息结构203之一的索引、以及指向常量表201中提供字段的名称和描述符的名称和类型信息结构204之一的索引。常量表201的方法引用结构206保持指向常量表201中表示定义方法的类的类信息结构203之一的索引、以及指向常量表201中提供方法的名称和描述符的名称和类型信息结构204之一的索引。类信息结构203保持指向常量表201中保持相关联的类的名称的值结构202之一的索引。
名称和类型信息结构204保持指向常量表201中存储字段/方法的名称的值结构202之一的索引、以及指向常量表201中存储描述符的值结构202之一的索引。
在实施例中,类元数据207包括类的元数据,诸如(一个或多个)版本号、常量池中的条目数量、字段数量、方法数量、访问标志(类是否是公共的(public)、私有的(private)、最终的(final)、抽象的(abstract)等)、指向识别当前类的常量表201的类信息结构203之一的索引、指向识别超类(superclass)(如果有的话)的常量表201的类信息结构203之一的索引等等。
在实施例中,字段结构208表示识别类的各种字段的结构集合。字段结构208为类的每个字段存储字段的访问器标志(字段是否是静态的(static)、公共的(public)、私有的(private)、最终的(final)等)、指向常量表201中保持字段的名称的值结构202之一的索引、以及指向常量表201中保持字段的描述符的值结构202之一的索引。
在实施例中,方法结构209表示识别类的各种方法的结构集合。方法结构209为类的每个方法存储方法的访问器标志(例如,方法是否是静态的(static)、公共的(public)、私有的(private)、同步的(synchronized)等)、指向常量表201中保持方法的名称的值结构202之一的索引、指向常量表201中保持方法的描述符的值结构202之一的索引、以及与如在源代码文件101中定义的方法的主体对应的虚拟机指令。
在实施例中,描述符表示字段或方法的类型。例如,描述符可以实现为遵循特定语法的字符串。虽然确切的语法不是重要的,但以下将描述几个示例。
在描述符表示字段的类型的示例中,描述符识别由字段保持的数据的类型。在实施例中,字段可以保持基本类型、对象或数组。当字段保持基本类型时,描述符是识别基本类型的字符串(例如,“B”=byte、“C”=char、“D”=double、“F”=float、“I”=int、“J”=long int等)。当字段保持对象时,描述符是识别对象的类名称(例如,“L ClassName”)的字符串。在这种情况下,“L”指示引用,因此“L ClassName”表示对类ClassName的对象的引用。当字段是数组时,描述符识别由数组保持的类型。例如,“[B”指示字节的数组,其中“[”指示数组并且“B”指示数组保持字节的基本类型。但是,由于数组可以嵌套,因此数组的描述符也可以指示嵌套。例如,“[[L ClassName”指示数组,其中每个索引保持持有类ClassName的对象的数组。在一些实施例中,ClassName是完全限定的,并且包括类的简单名称以及类的路径名。例如,ClassName可以指示文件存储在程序包、库或托管类文件200的文件系统中的哪里。
在方法的情况下,描述符识别方法的参数和方法的返回类型。例如,方法描述符可以按照一般形式“({Parameter Descriptor})ReturnDescriptor”,其中{ParameterDescriptor}是表示参数的字段描述符的列表,并且ReturnDescriptor是识别返回类型的字段描述符。例如,字符串“V”可以用于表示void返回类型。因此,在源代码文件101中定义为“Object m(int I,double d,Thread t){...}”的方法与描述符“(I D LThread)L Object”匹配(match)。
在实施例中,在方法结构209中保持的虚拟机指令包括引用常量表201的条目的操作。使用Java作为示例,考虑以下类:
在以上示例中,Java方法add12and13在类A中定义,不带参数,并且返回整数。方法add12and13的主体调用类B的静态方法addTwo,其采用常整数值12和13作为参数,并且返回结果。因此,在常量表201中,编译器102除其它条目之外包括与对方法B.addTwo的调用对应的方法引用结构。在Java中,对方法的调用向下编译为JVM的字节码中的invoke命令(在这种情况下为invokestatic,因为addTwo是类B的静态方法)。invoke命令被提供指向常量表201中与方法引用结构对应的索引,该方法引用结构识别定义addTwo的类“B”、addTwo的名称“addTwo”、以及addTwo的描述符“(I I)I”。例如,假设上述方法引用存储在索引4处,则字节码指令可以出现为“invokestatic#4”。
由于常量表201引用符号上具有携带识别信息的结构的类、方法和字段,而不是直接引用存储器位置,因此常量表201的条目被称为“符号引用”。符号引用被用于类文件103的一个原因是因为在一些实施例中一旦类被加载到运行时环境113中,编译器102就不知道类将如何被存储以及存储在哪里。如将在2.3部分中所描述的,在所引用的类(及相关联的结构)已被加载到运行时环境中并且被分配具体的存储器位置之后,最终,符号引用的运行时表示被虚拟机104解析为实际的存储器地址。
2.2示例虚拟机架构
图3图示了根据实施例的以框图形式的示例虚拟机存储器布局300。为了提供清楚的示例,其余的讨论将假设虚拟机104遵循图3中绘出的虚拟机存储器布局300。此外,虽然虚拟机存储器布局300的组件可以被称为存储器“区域”,但是不要求存储器区域是连续的。
在图3图示的示例中,虚拟机存储器布局300被划分为共享区域301和线程区域307。共享区域301表示在虚拟机104上执行的各种线程之间共享的结构被存储在其中的存储器中的区域。共享区域301包括堆302和每个类的(per-class)区域303。在实施例中,堆302表示从中分配用于类实例和数组的存储器的运行时数据区域。在实施例中,每个类的区域303表示其中存储与各个类有关的数据的存储区域。在实施例中,对于每个加载的类,每个类的区域303包括表示来自类、字段和方法数据306的常量表201的数据(例如,以保持类的静态字段)的运行时常量池304,以及表示用于类的方法的虚拟机指令的方法代码305。
线程区域307表示其中存储特定于各个线程的结构的存储器区域。在图3中,线程区域307包括线程结构308和线程结构311,其表示由不同线程利用的每个线程的(per-thread)结构。为了提供清楚的示例,图3中绘出的线程区域307假设两个线程正在虚拟机104上执行。但是,在实际环境中,虚拟机104可以执行任何任意数量的线程,其中线程结构的数量相应地缩放。
在实施例中,线程结构308包括程序计数器309和虚拟机堆栈310。类似地,线程结构311包括程序计数器312和虚拟机堆栈313。在实施例中,程序计数器309和程序计数器312存储由其相应的线程执行的虚拟机指令的当前地址。
因此,当线程逐步通过指令时,程序计数器被更新,以维持指向当前指令的索引。在实施例中,虚拟机堆栈310和虚拟机堆栈313每个存储用于其相应线程的保持局部变量和部分结果并且还用于方法调用和返回的帧(frame)。
在实施例中,帧是用于存储数据和部分结果、返回方法的值、以及执行动态链接的数据结构。每次调用方法时,创建新帧。当使得生成帧的方法完成时,帧被销毁。因此,当线程执行方法调用时,虚拟机104生成新帧并将该帧推送到与线程相关联的虚拟机堆栈上。
当方法调用完成时,虚拟机104将方法调用的结果传递回到前一帧,并将当前帧从堆栈中弹出。在实施例中,对于给定的线程,在任何点处一个帧活动。这种活动帧被称为当前帧,使得生成当前帧的方法被称为当前方法,并且当前方法所属的类被称为当前类。
图4图示了根据实施例的以框图形式的示例帧400。为了提供清楚的示例,其余的讨论将假设虚拟机堆栈310和虚拟机堆栈313的帧遵守帧400的结构。
在实施例中,帧400包括局部变量401、操作数堆栈402和运行时常量池引用表403。在实施例中,局部变量401被表示为变量数组,每个变量都保持值,例如,布尔值、byte、char、short、int、float或reference(引用)。此外,一些值类型(诸如long或double)可以由数组中的多于一个的条目表示。局部变量401用于在方法调用上传递参数并存储部分结果。例如,当响应于调用方法而生成帧400时,参数可以存储在局部变量401内的预定义位置中,诸如与调用中的第一至第N个参数对应的索引1-N。
在实施例中,当虚拟机104创建帧400时,操作数堆栈402默认为空。然后,虚拟机104从当前方法的方法代码305中供给指令以将来自局部变量401的常量或值加载到操作数堆栈402上。其它指令从操作数堆栈402获取操作数、对其进行操作、并将结果推送回到操作数堆栈402上。此外,操作数堆栈402用于准备要传递给方法的参数和接收方法结果。例如,被调用的方法的参数可以在向方法发出调用之前被推送到操作数堆栈402上。然后,虚拟机104为方法调用生成新帧,其中前一帧的操作数堆栈402上的操作数被弹出并被加载到新帧的局部变量401中。当被调用的方法终止时,新帧从虚拟机堆栈中弹出并且返回值被推送到前一帧的操作数堆栈402上。
在实施例中,运行时常量池引用表403包含对当前类的运行时常量池304的引用。运行时常量池引用表403用于支持解析。解析是其中将常量池304中的符号引用转换成具体的存储器地址的处理,从而根据需要加载类以解析尚未定义的符号并将变量访问转换成与这些变量的运行时位置相关联的存储结构中的适当偏移。
2.3加载、链接和初始化
在实施例中,虚拟机104动态地加载、链接和初始化类。加载是找到具有特定名称的类并在运行时环境113的存储器内从那个类的相关联的类文件200创建表示的处理。例如,为虚拟机存储器布局300的每个类的区域303内的类创建运行时常量池304、方法代码305以及字段和方法数据306。链接是取得类的存储器中表示并将其与虚拟机104的运行时状态组合使得类的方法可以被执行的处理。初始化是执行类构造函数(constructor)以设置类的字段和方法数据306的开始状态和/或在堆302上创建用于初始化的类的类实例的处理。
以下是可以由虚拟机104实现的加载、链接和初始化技术的示例。但是,在许多实施例中,这些步骤可以被交错,使得初始类被加载,然后在链接期间,第二类被加载以解析在第一类中找到的符号引用,这又导致第三类被加载等等。因此,通过加载、链接和初始化阶段的进展可以因类而异。此外,一些实施例可以延迟(“懒惰”执行)加载、链接和初始化处理的一个或多个功能,直到实际上需要该类。例如,方法引用的解析可以被延迟,直到调用方法的虚拟机指令被执行。因此,对于每个类,执行步骤的确切时间在各种实现之间会有很大不同。
为了开始加载处理,虚拟机104通过调用加载初始类的类加载器107来启动。指定初始类的技术将在实施例之间不同。例如,一种技术可以使虚拟机104在启动时接受指定初始类的命令行变元。
为了加载类,类加载器107解析与该类对应的类文件200,并且确定类文件200是否是良好形成的(满足虚拟机104的句法期望)。如果不是,则类加载器107生成错误。例如,在Java中,错误可能以异常的形式生成,其中异常被抛出给异常处理器进行处理。否则,类加载器107通过为每个类的区域303内的类分配运行时常量池304、方法代码305以及字段和方法数据306来生成类的存储器中表示。
在一些实施例中,当类加载器107加载类时,类加载器107还递归地加载被加载类的超类。例如,虚拟机104可以确保在继续特定类的加载、链接和初始化处理之前,该特定类的超类被加载、链接和/或初始化。
在链接期间,虚拟机104验证类、准备类、并且执行在类的运行时常量池304中定义的符号引用的解析。
为了验证类,虚拟机104检查类的存储器中表示是否在结构上正确。例如,虚拟机104可以检查除通用类Object之外的每个类具有超类、检查最终类没有子类以及最终方法没有被覆盖、检查常量池条目是否彼此一致、检查当前类是否具有对常量池304中引用的类/字段/结构的正确访问权限、检查方法的虚拟机104代码将不会引起意外行为(例如,确保跳转指令不会将虚拟机104发送到超出该方法的结束范围)等等。在验证期间执行的确切检查取决于虚拟机104的实现。在一些情况下,验证会导致附加的类被加载,但不一定要求那些类在继续之前也被链接。例如,假设类A包含对类B的静态字段的引用。在验证期间,虚拟机104可以检查类B,以确保被引用的静态字段实际上存在,这可能导致类B的加载,但不一定导致类B的链接或初始化。但是,在一些实施例中,某些验证检查可以被延迟直到以后的阶段,诸如在符号引用的解析期间被检查。例如,一些实施例可以延迟检查对符号引用的访问许可,直到那些引用正被解析。
为了准备类,虚拟机104将类的位于字段和方法数据306内的静态字段初始化为默认值。在某些情况下,将静态字段设置为默认值可能与运行类的构造函数不同。例如,验证处理可以将静态字段清零或将其设置为构造函数期望那些字段在初始化期间具有的值。
在解析期间,虚拟机104从包括在类的运行时常量池304中的符号引用动态地确定具体的存储器地址。为了解析符号引用,虚拟机104利用类加载器107加载在符号引用中识别出的类(如果尚未加载)。一旦被加载,虚拟机104就知道所引用类及其字段/方法的每个类的区域303内的存储器位置。然后,虚拟机104用对所引用类、字段或方法的具体存储器位置的引用替换符号引用。在实施例中,虚拟机104将解析进行高速缓存,以在当虚拟机104处理另一个类时遇到相同类/名称/描述符的情况下进行重用。例如,在一些情况下,类A和类B可能调用类C的相同方法。因此,当对类A执行解析时,其结果可以被高速缓存,并且在解析类B中的相同符号引用期间被重用,以减少开销。
在一些实施例中,在链接期间解析符号引用的步骤是可选的。例如,实施例可以以“懒惰”的方式执行符号解析,从而延迟解析的步骤直到需要所引用类/方法/字段的虚拟机指令被执行。
在初始化期间,虚拟机104执行类的构造函数以设置该类的开始状态。例如,初始化可以初始化类的字段和方法数据306并且生成/初始化由构造函数创建的堆302上的任何类实例。例如,用于类的类文件200可以指定特定方法是用于设置开始状态的构造函数。因此,在初始化期间,虚拟机104执行那个构造函数的指令。
在一些实施例中,虚拟机104通过初始地检查字段/方法是否在所引用类中被定义来执行对字段和方法引用的解析。以其它方式,虚拟机104针对所引用字段/方法递归地搜索所引用类的超类,直到定位该字段/方法,或者到达顶级超类,在这种情况下生成错误。
3.具有词法范围界定的代码
在实施例中,如本文所述,控制流分析涉及基于流的范围界定。控制流分析是用于确定执行或评估代码段的顺序的处理。在实施例中,如本文所述,控制流分析也可以用于范围界定。控制流分析是静态处理,这意味着无需实际执行代码即可执行控制流分析。例如,可以在软件开发期间(例如,通过集成开发环境(IDE))或在编译时(例如,通过编译器或相关联的工具)执行控制流分析。可以对源代码段本身或对编译后的代码(例如,Java字节码)执行控制流分析。
图5是图示根据一个或多个实施例的代码500的框图。在一个或多个实施例中,代码500可以包括比图5所示的组件更多或更少的组件。可以用能够实现本文描述的一个或多个操作的任何编程语言来编写代码500,或者可以以提供该能力的编程语言的组合来编写代码500。
在实施例中,代码500包括相同级别代码段序列:代码段504;代码段506;代码段520;以及代码段522。相同级别代码段序列可以包括比图5中所示的代码段更多或更少的代码段。相同级别代码段序列可以被定义为代码中彼此跟随的代码段,但不包括提供较低级别词法范围的块或其它代码结构的内容。出于本讨论的目的,当代码段提供被封装的代码的入口点时,例如使用大括号(brackets)、括号(parentheses)或用于封装代码的一些其它词法构造时,该代码段被称为“封装”代码。例如,方法中的顶级代码段可以被视为相同级别代码段序列。但是,由顶级代码段封装的块的内容不是相同级别代码段序列的一部分。在下面的代码示例中,行被编号以便于参考:
在上面的示例中,行1、2、3直到左大括号,以及行5从右大括号开始是相同级别指令序列。在实施例中,块内的代码段被认为是它们自己的相同级别指令序列的一部分,具有比顶级代码段较低级别的词法范围。代码可以包括多个级别的相同级别代码段以及对应级别的词法范围。例如,考虑包括if-then语句的方法。在if-then语句的大括号内,还有另一个if-then语句。在这个示例中,至少有三个级别的词法范围:(1)方法的顶级;(2)第一个if-then语句内;以及(3)第二个if-then语句内。相同级别代码段序列可以在许多不同的上下文中使用,并且不限于方法和/或块中包含的代码段。
在实施例中,相同级别代码段序列不允许将相同级别代码段的一个子集的范围中的任何变量在本地界定在相同级别代码段的另一个子集的“范围外”(例如,不在范围中)。如果代码段504声明了在代码段506的范围中的变量,则该变量也可能被要求在代码段520和代码段522的范围中。如下面所讨论的,这个要求不适用于在代码段中初始化并且仅在较低级别词法范围内可用的变量。
在实施例中,作为相同级别代码段序列中的代码段的代码段506封装较低级别词法范围516。代码段518是包含在较低级别词法范围516中的代码段,并且不是包括代码段506的相同级别代码段序列的一部分。例如,如在上面的示例中,较低级别词法范围516可以通过左大括号和右大括号来指定,并且代码段518可以是包含在大括号内的代码段。
在实施例中,代码段506包括条件507和未初始化变量512。可以使未初始化变量512被初始化并且使其(a)仅在较低级别词法范围516中以及(b)仅在满足条件507时才可用。条件507可以采取许多不同的形式。例如,条件507可以是有条件地返回值的方法调用。在实施例中,条件507包括一个或多个测试代码段508、测试谓词510和单一命令514。单一命令514可执行以相对于测试谓词510检查测试代码段508,如下面进一步详细描述的。例如,单一命令514可以是被指定用于匹配操作的关键字,诸如词语“matches”。在实施例中,单一命令514对于编程语言是原生的,即内置于由编译器支持的编程语言规范中。测试谓词510和未初始化变量512可以以编程语言语法(其可以被称为“模式”)可识别出的方式组合。如本文所述,基于条件的范围界定可以被称为基于流的范围界定,因为控制流分析可以用于确定变量是否在特定代码段的范围中。基于流的范围界定将在下面进一步详细讨论。
在实施例中,测试代码段508是变量。在遇到代码段506之前,可以使变量初始化并使其在相同级别指令序列的范围中可用。例如,可以在代码段504中初始化变量。替代地,可以在代码段506本身中初始化变量。在后一种情况下,使用图5所示的示例,变量可以用于供代码段520和代码段522使用,但不能由代码段504使用。替代地,测试代码段508可以是方法调用、函数调用或被配置为返回可以对照测试谓词510检查的值的任何其它类型的代码段。
在实施例中,作为与代码段506相同的相同级别代码段序列中的代码段的代码段522封装另一个较低级别词法范围524。代码段522可以包括条件和未初始化变量,类似于代码段506,或者可以是被配置为封装较低级别词法范围524的另一种类型的代码结构。如果代码段522包括条件,则该条件可以基于代码段506的条件S07所基于的一个或多个相同测试代码段508。替代地或附加地,条件可以基于一个或多个其它测试代码段。
在实施例中,代码段526是包括在另一个较低级别词法范围524中的代码段,并且不是包括代码段506和代码段522的相同级别代码段序列的一部分。此外,较低级别词法范围524与较低级别词法范围516不是相同的词法范围。被初始化并使得仅在较低级别词法范围516中可用的变量在较低级别词法范围524中不可用,反之亦然。
在实施例中,未初始化变量512不在代码段504、代码段520、代码段524或代码段526的范围中,因为这些代码段都不在由代码段506封装的较低级别词法范围516内。一般而言,未初始化变量512仅在它已在较低级别词法范围516内的代码段506中被初始化之后才可用于使用。在到达代码段506之前,未初始化变量512可能甚至尚未被声明。
4.基于流的范围界定
图6图示了根据一个或多个实施例的用于基于流的范围界定的操作集合。可以一起修改、重新布置或省略图6中所示的一个或多个操作。相应地,图2中所示的特定操作序列不应被解释为限制一个或多个实施例的范围。
在一个或多个实施例中,基于控制流分析,处理确定相同级别代码段序列中的代码段封装较低级别词法范围(操作602)。为了便于讨论,此代码段被称为“封装代码段”,因为它封装较低级别词法范围(“封装范围”)。封装代码段包括条件和未初始化变量。如下所述,如果执行封装代码段并且满足条件,则封装代码段会导致未初始化变量被初始化,并且使其仅在封装范围中可用。执行这个步骤的处理可以是集成开发环境(IDE)、编译器和/或被配置为使用控制流分析来评估范围界定的任何其它处理的一部分。在实施例中,当条件评估为真时,条件被满足。但是,可以使用不同类型的条件,包括当其评估为假时满足的条件。
在一个或多个实施例中,该处理确定另一个代码段引用了未初始化变量(操作604)。为了便于讨论,该代码段被简单地称为“另一个”代码段,但是它可以封装另一个较低级别词法范围。基于控制流分析,该处理确定另一个代码段是否在封装范围中(操作606)。如果执行了封装代码段并且满足了条件,则未初始化变量将被初始化并且使其仅在封装范围内可用。如果另一个代码段在封装范围之外,则未初始化变量将对另一个代码段不可用。尝试执行其它代码段将导致运行时错误,因为无法解析对未初始化变量的引用。未初始化变量将在另一个代码段的范围之外。一般而言,如果(a)另一个代码段在相同级别代码段序列中,或者(b)另一个代码段在未由封装代码段封装的不同的较低级别词法范围中,则另一个代码段可以被视为在封装范围之外。
在一个或多个实施例中,如果另一个代码段不在封装范围中,则呈现错误消息(操作610)。错误消息指示未初始化变量在另一个代码段的范围之外。此外,错误消息可以表示将不允许编译和或执行相同级别指令序列。替代地或附加地,错误消息可以提供用于改变代码的建议,使得未初始化变量将在另一个代码段的范围中。
在一个或多个实施例中,如果另一个代码段在封装范围中,则允许执行相同级别的代码段序列(操作612)。在运行时,封装代码段可以被执行,使得条件被评估(操作614)。如果满足条件(操作616),则封装代码段使未初始化变量被初始化并且使其仅在由第一代码段封装的较低级别范围内可用(操作620)。在一个或多个实施例中,如果不满足条件,则未初始化变量不被初始化(操作618)。
在实施例中,初始化未初始化变量(操作620)的细节取决于封装代码段的格式和条件本身。如图5所示,条件可以包括一个或多个测试代码段、测试谓词、以及可执行以对照测试谓词检查一个或多个测试代码段的单一命令。测试谓词可以包括对象类型,并且初始化未初始化变量可以涉及将初始化变量强制转换为该对象类型。
在下面的代码示例中,行被编号以便于参考:
/>
在上面的示例一中,第2行的代码段“if(x matches String s)”包括条件“xmatches String”和未初始化变量“s”。在这个示例中,假定在到达这个代码段之前s尚未被声明。关键字matches是对照测试谓词检查测试代码段(在本例中为初始化变量x)的单一命令。在这个示例中,测试谓词是对象类型String。因此,当初始化变量x具有与String匹配的对象类型时,满足此代码段的条件。测试谓词和未初始化变量的组合形成模式“String s”。可能不需要确切的对象匹配;x的对象类型可以被强制转换成String可能就足够。例如,许多编程语言都允许将日期强制转换成字符串。这里,如果满足条件,则未初始化变量s被初始化为x强制转换为String。此外,在示例一中,控制流分析指示,当s由第2行上的代码段初始化时,它在封装范围(即“if”代码段(即第3行)之后的大括号之间的较低级别词法范围)中可用。代码段“else if(x matches Integer i)”(第4行)在与第一个“if”代码段(第2行)相同的相同级别代码段序列中,并且封装了不同的较低级别词法范围。如果未初始化变量s已在else if块内的代码段中被引用(例如,在第5行),则将呈现错误消息(操作610),指示s在试图引用它的代码段的范围之外。
在上面的示例二中,第8行的代码段“if(!(x matches String s))”包括不同的条件“(!(x matches String s)”。当初始化变量x没有与String匹配的对象类型时,满足该代码段的条件。此外,在示例二中,由于条件中的否定,控制流分析指示s在“else”代码段(即第10行)之后的大括号之间的较低级别范围中可用。仅当与对象类型String的匹配成功时才可以执行else块内的代码,在这种情况下s被初始化。如果在第9行的代码段中已经引用了s,则将呈现错误消息(操作610),指示s在试图引用它的代码段的范围之外。
在一个或多个实施例中,可以将匹配的代码段组合以形成复合布尔代码段。例如:
在实施例中,如在上面的示例三中所示,相同的未初始化变量名可以在与相同的较低级别词法范围相关联的不同的、不冲突的测试谓词中使用。此外,如上面的示例四中所示,未初始化变量可以被初始化并使得在多个范围中可用。这些多个范围可以被视为单个非连续范围(并可以由编译器、IDE等内部处理)。使变量在范围中可用也可以被称为将变量“注入”到范围中。在示例4中,变量s被注入到复合布尔代码段的第二部分和由大括号包围的块两者中。可以使用许多不同类型的复合布尔代码段。
在实施例中,测试谓词可以在switch语句中组合为不同的case(情况)。switch语句可以被认为是n-向跳转;它是表示短路顺序评估的几种条件或情况的语句。在这种上下文中,“短路”意味着当满足条件时,不评估后续条件。每个switch case可以封装不同的较低级别词法范围。在下面的示例中,如以上所讨论的,具有形式“case object-typeletter”的case在功能上等同于“if x matches object-type letter”。在这个示例中,如果对应的case评估为真,则使用省略号来表示执行的一个或多个代码段(未示出)。
在上面的示例中,未初始化变量(i,b,l或d)被初始化并使其(a)仅当对应的case标签与目标x匹配时以及(b)仅在由该特定case之后的省略号表示的较低级别范围中可用。变量(i,b,l或d)一旦被初始化,就不在其它case的范围中或在该switch代码段外部。
在实施例中,代码段可以用于初始化多于一个未初始化变量。例如:
在实施例中,如果永远不能满足代码段中的条件,则可能永远无法达到该代码段封装的较低级别词法范围。控制流分析可以被配置为识别其中较低级别词法范围不可达的情况。例如,在上面的代码示例中,如果x已被初始化为Square,并且它不可能变成Circle,则可能呈现指示永远无法满足“case Circle”的错误消息。
在实施例中,控制流分析利用编程语言的现有流规则并引入新规则来确定变量的范围,包括如本文所述有条件地引入的未初始化变量。具体而言,控制流分析可以基于代码段中的一个或多个表达式的真(true)和/或假(false)集合来确定范围界定。图7A-图7B图示了根据一个或多个实施例的用于执行控制流分析的规则。提供图7A-图7B中所示的规则仅出于说明性目的,并且不应被解释为限制一个或多个实施例。
如图7A所示,表达式可以采用许多不同的形式。每个表达式的真和/或假集合取决于表达式的形式。范围界定基于真和假集合。对于缩写为“e”的假设表达式,真集合指示当e评估为真时引入(即初始化和使其可用)的(一个或多个)变量(如果有的话)。假集合指示当e评估为假时引入的(一个或多个)变量(如果有的话)。例如,如图7A所示,对于形式为“xmatches P”(其中P包括未初始化变量)的表达式,真集合包括P中的变量绑定。假集合为空。作为另一个示例,对于形式为“x&&y”的表达式,真集合是x的真集合(即x.T)和y的真集合(即y.T)的逻辑并集。假集合是x的假集合(即x.F)和y的假集合(即y.F)的逻辑交集的逻辑交集。在这个示例中,x.T在y中的范围中,使得在x评估为真时引入的任何变量将在评估y时可用。图7A包括应用于不同形式的表达式的此类规则的示例。在实施例中,可以将两种或更多种不同形式的表达式组合成复合表达式,其中范围界定逻辑相应地被应用于不同级别的嵌套表达式。例如,形式“!(x&&y)”的复合表达式将具有与“x&&y”的复合表达式相反的真假集合,如由“!x”的真假集合所指示的。
图7B图示了根据一个或多个实施例的用于对某些形式的语句执行控制流分析的规则。图7B中所示的语句形式可以被读为伪代码。例如,形式“if(x)y else z;s”的语句可以替换地被表示为以下:
在上面的示例中,x.T在y的范围中,并且x.F在z的范围中。下面是使用“matches”关键字的这种语句形式的示例
在实施例中,编程语言规范包括定义控制构造(例如,表达式、语句、块或代码的分支)突然完成的情况。一般而言,当由于某种原因阻止控制构造正常完成时,认为控制构造突然完成。例如,根据JavaTM标准版本8(“SE8”)的JavaTM语言规范(“JLS”),不带标签的“break”语句始终突然完成(JLS SE8 14.15)。当“if”语句的子语句(“then”分支或“else”分支)诸如由于没有标签的“break”语句而突然完成时,则“if”语句突然完成(JLSSE814.9)。但是,“while”语句当子语句由于没有标签的“break”语句而突然完成时,仍然正常完成(JLS SE8 14.12.1)。提供来自JLS SE8的这些规则仅用于示例性目的。取决于特定的编程语言规范,许多不同种类的控制构造可能会由于许多不同的原因而突然完成。
JavaTM编程语言规范包括例如由于“break”语句、“continue”语句、“return”语句或“throw”语句而可能突然完成的控制构造。
在实施例中,控制流分析包括针对如由对应编程语言规范定义的控制构造始终突然完成的情况的范围界定规则。当控件构造包含(a)在该控件构造内始终遇到以及(b)使控件构造突然完成的代码时,该控件构造始终突然完成。例如:
在上面的示例中,当e匹配类型T(即,否定的“matches”表达式评估为真)时,通常使得x在“else”块中可用。但是,在这个示例中,“else”块缺失。此外,由于“return”语句,“then”分支始终突然完成。在这种情况下,系统可以将x引入到s的范围中,而通常它不在该范围中。在图7B中,控制构造始终突然完成的条件被表示为A(y)、A(z)等。具体而言,A(y)可以被读为“当流导致由y表示的控制构造时,该控制构造始终突然完成”。
在实施例中,控制流分析包括针对如由对应编程语言规范定义的控制构造从未突然完成的情况的范围界定规则。当控制构造不包含任何可能显式导致控制构造突然完成的代码语句时,它永远不会突然完成。控制构造无论如何可以完成,但不会这样突然完成。例如:
在这个示例中,如果由于e匹配类型T而使“while”语句正常完成,则系统可以将x引入到s的范围中,而它通常不在该范围内。依据确定控制构造是突然完成还是正常完成的JLS SE8的规则,如果在“while”语句主体中的“break”语句被执行,则“while”语句也正常完成。(注意的是,在JLS SE8中,所有“break”语句都突然完成)。在这个示例中,系统不应将x引入到s的范围中,因为并不一定是e匹配类型T的情况。在图7B中,条件N(x)评估x的执行是否始终或者(a)正常完成,或者(b)在除不带标签的“break”以外的突然动作的情况下完成。在实施例中,仅当x可能由于不带标签的“break”而可能突然完成时,N(x)才为假。在实施例中,基于代码是始终突然完成还是在不带标签的break的情况下永远不会突然完成的范围界定规则有助于确保系统不会尝试在变量可能尚未被正确初始化的范围中使变量可用。
在一个或多个实施例中,使用基于条件被初始化的未初始化变量,基于流的范围界定允许更加容易且灵活地编程。例如,取决于满足多个条件中的哪个条件,特定的变量名可以被绑定到特定的较低级别词法范围中的不同类型的对象。此外,这种基于流的范围界定可以允许程序员声明仅在特定的较低级别词法范围中使用的变量,而不必担心变量是否或如何可能在该特定的较低级别词法范围之外被引用。此外,通过确定代码段是否引用不在该代码段的范围中的未初始化变量,可以避免运行时错误。一般而言,一个或多个实施例允许基于流的范围界定,同时防止那种格式错误的代码段被编译成运行的程序。
5.其它事项;扩展
实施例针对具有一个或多个设备的系统,一个或多个设备包括硬件处理器并且被配置为执行本文描述的和/或以下权利要求中任一项所述的任何操作。
在实施例中,非暂态计算机可读存储介质包括指令,当由一个或多个硬件处理器执行时,所述指令使得执行本文描述的和/或权利要求中任一项所述的任何操作。
根据一个或多个实施例,可以使用本文描述的特征和功能的任何组合。在前面的说明书中,已经参考因实现而异的许多具体细节描述了实施例。因此,说明书和附图应当被认为是说明性的而不是限制性的。本发明的范围的唯一且排他的指标以及申请人预期作为本发明的范围的内容是从本申请中发出的权利要求集合的字面和等同范围,以这种权利要求发出的具体形式,包括任何后续的更正。
6.硬件概述
根据一个实施例,本文描述的技术由一个或多个专用计算设备来实现。专用计算设备可以是硬连线的以执行本技术,或者可以包括被永久性地编程以执行本技术的数字电子设备,诸如一个或多个专用集成电路(ASIC)、现场可编程门阵列(FPGA)或网络处理单元(NPU),或者可以包括被编程为根据固件、存储器、其它存储装置或组合中的程序指令执行本技术的一个或多个通用硬件处理器。这种专用计算设备还可以将定制的硬接线逻辑、ASIC、FPGA或NPU与定制的编程组合来实现本技术。专用计算设备可以是台式计算机系统、便携式计算机系统、手持式设备、联网设备或结合硬连线和/或程序逻辑来实现技术的任何其它设备。
例如,图8是图示可以在其上实现本发明的实施例的计算机系统800的框图。计算机系统800包括总线802或用于传送信息的其它通信机制以及与总线802耦合用于处理信息的硬件处理器804。硬件处理器804可以是例如通用微处理器。
计算机系统800还包括耦合到总线802用于存储信息和要由处理器804执行的指令的主存储器806,诸如随机存取存储器(RAM)或其它动态存储设备。主存储器806也可以用于存储在要由处理器804执行的指令的执行期间的临时变量或其它中间信息。当这种指令被存储在处理器804可访问的非暂态存储介质中时,这种指令使计算机系统800成为被定制用于执行指令中指定的操作的专用机器。
计算机系统800还包括耦合到总线802用于存储静态信息和处理器804的指令的只读存储器(ROM)808或其它静态存储设备。诸如磁盘或光盘之类的存储设备810被提供并且被耦合到总线802,以用于存储信息和指令。
计算机系统800可以经由总线802耦合到用于向计算机用户显示信息的显示器812,诸如阴极射线管(CRT)。包括字母数字键和其它键的输入设备814耦合到总线802,用于将信息和命令选择传送到处理器804。另一种类型的用户输入设备是光标控件816,诸如鼠标、轨迹球或光标方向键,用于向处理器804传送方向信息和命令选择并且用于控制显示器812上的光标移动。这种输入设备典型地具有两个轴(第一轴(例如,x)和第二轴(例如,y))上的两个自由度,以允许设备在平面中指定位置。
计算机系统800可以使用定制的硬连线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑来实现本文描述的技术,所述定制的硬连线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑与计算机系统结合使计算机系统800成为专用机器或将计算机系统800编程为专用机器。根据一个实施例,本文的技术由计算机系统800响应于处理器804执行主存储器806中包含的一条或多条指令的一个或多个序列而执行。这些指令可以从另一个存储介质(诸如存储设备810)读取到主存储器806中。在主存储器806中包含的指令序列的执行使处理器804执行本文描述的处理步骤。在替代实施例中,可以使用硬连线电路系统代替软件指令或与软件指令组合使用。
如本文使用的术语“存储介质”是指存储有使机器以特定方式操作的数据和/或指令的任何非暂态介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘或磁盘,诸如存储设备810。易失性介质包括动态存储器,诸如主存储器806。存储介质的常见形式包括例如软盘、柔性盘、硬盘、固态驱动器、磁带或任何其它磁性数据存储介质、CD-ROM、任何其它光学数据存储介质、具有孔模式的任何物理介质、RAM、PROM和EPROM、FLASH-EPROM、NVRAM、任何其它存储器芯片或盒式磁带、内容可寻址存储器(CAM)和三态内容可寻址存储器(TCAM)。
存储介质与传输介质不同但可以与传输介质结合使用。传输介质参与在存储介质之间传递信息。例如,传输介质包括同轴电缆、铜线和光纤,包括包含总线802的电线。传输介质还可以采取声波或光波的形式,诸如在无线电波和红外线数据通信期间生成的那些。
各种形式的介质可以涉及将一条或多条指令的一个或多个序列携带到处理器804以供执行。例如,指令最初可以在远程计算机的磁盘或固态驱动器上携带。远程计算机可以将指令加载到其动态存储器中,并使用调制解调器通过电话线发送指令。计算机系统800本地的调制解调器可以在电话线上接收数据并使用红外线发射器将数据转换为红外线信号。红外线检测器可以接收红外线信号中携带的数据,并且适当的电路系统可以将数据放置在总线802上。总线802将数据携带到主存储器806,处理器804从主存储器806中检索并执行指令。由主存储器806接收的指令可以可选地在由处理器804执行之前或之后存储在存储设备810上。
计算机系统800还包括耦合到总线802的通信接口818。通信接口818提供耦合到网络链路820的双向数据通信,其中网络链路820连接到本地网络822。例如,通信接口818可以是综合业务数字网络(ISDN)卡、电缆调制解调器、卫星调制解调器、或向对应类型的电话线提供数据通信连接的调制解调器。作为另一个示例,通信接口818可以是提供到兼容的局域网(LAN)的数据通信连接的LAN卡。也可以实现无线链路。在任何这种实现中,通信接口818发送和接收携带表示各种类型信息的数字数据流的电信号、电磁信号或光信号。
网络链路820典型地通过一个或多个网络向其它数据设备提供数据通信。例如,网络链路820可以通过本地网络822提供到主计算机824或到由互联网服务提供商(ISP)826操作的数据设备的连接。ISP 826又通过现在通常称为“互联网”828的全球分组数据通信网络提供数据通信服务。本地网络822和互联网828都使用携带数字数据流的电信号、电磁信号或光信号。通过各种网络的信号以及在网络链路820上并且通过通信接口818的信号是传输介质的示例形式,这些信号将数字数据携带到计算机系统800或携带来自计算机系统800的数字数据。
计算机系统800可以通过(一个或多个)网络、网络链路820和通信接口818发送消息和接收数据,包括程序代码。在互联网示例中,服务器830可以通过互联网828、ISP 826、本地网络822和通信接口818传输对于应用程序的所请求代码。
接收到的代码可以在它被接收时由处理器804执行,和/或存储在存储设备810或其它非易失性存储装置中以供以后执行。
7.计算机网络和云网络
在一个或多个实施例中,计算机网络提供节点集合之间的连接。节点可以在彼此本地和/或远离。节点通过一组链路连接。链路的示例包括同轴电缆、非屏蔽绞合电缆、铜缆、光纤和虚拟链路。
节点子集实现计算机网络。这样的节点的示例包括交换机、路由器、防火墙和网络地址转换器(NAT)。另一个节点子集使用计算机网络。这样的节点(也称为“主机”)可以执行客户端进程和/或服务器进程。客户端进程做出对计算服务(诸如,特定应用的执行和/或特定量的数据的存储)的请求。服务器进程通过执行所请求的服务和/或返回对应的数据来响应。
计算机网络可以是物理网络,包括通过物理链路连接的物理节点。物理节点是任何数字设备。物理节点可以是特定于功能的硬件设备,诸如硬件交换机、硬件路由器、硬件防火墙和硬件NAT。附加地或替代地,物理节点可以是被配置为执行各种虚拟机和/或执行相应功能的应用的通用机器。物理链路是连接两个或更多个物理节点的物理介质。链路的示例包括同轴电缆、非屏蔽绞合电缆、铜缆和光纤。
计算机网络可以是覆盖网络。覆盖网络是在另一个网络(诸如,物理网络)之上实现的逻辑网络。覆盖网络中的每个节点对应于底层网络中的相应节点。因此,覆盖网络中的每个节点与覆盖地址(寻址到覆盖节点)和底层地址(寻址实现覆盖节点的底层节点)两者相关联。覆盖节点可以是数字设备和/或软件进程(诸如虚拟机、应用实例或线程)。连接覆盖节点的链路被实现为通过底层网络的隧道。隧道任一端处的覆盖节点将它们之间的底层多跳路径视为单个逻辑链路。隧道处理(tunneling)通过封装和解封装来执行。
在实施例中,客户端可以位于计算机网络的本地和/或远离计算机网络。客户端可以通过其它计算机网络(诸如专用网络或互联网)访问计算机网络。客户端可以使用通信协议(诸如超文本传输协议(HTTP))将请求传送到计算机网络。通过诸如客户端接口(诸如web浏览器)、程序接口或应用编程接口(API)之类的接口来传送请求。
在实施例中,计算机网络提供客户端和网络资源之间的连接。网络资源包括被配置为执行服务器进程的硬件和/或软件。网络资源的示例包括处理器、数据存储装置、虚拟机、容器和/或软件应用。网络资源在多个客户端之间共享。客户端彼此独立地从计算机网络请求计算服务。网络资源按需动态分配给请求和/或客户端。分配给每个请求和/或客户端的网络资源可以基于例如(a)由特定客户端请求的计算服务,(b)由特定租户请求的聚合计算服务和/或(c)计算机网络的所请求的聚合计算服务来扩大或缩小。这种计算机网络可以被称为“云网络”。
在实施例中,服务提供商向一个或多个最终用户提供云网络。云网络可以实现各种服务模型,包括但不限于软件即服务(SaaS)、平台即服务(PaaS)和基础设施即服务(IaaS)。在SaaS中,服务提供商向最终用户提供使用服务提供商的正在网络资源上执行的应用的能力。在PaaS中,服务提供商向最终用户提供将定制应用部署到网络资源上的能力。可以使用由服务提供商支持的编程语言、库、服务和工具来创建定制应用。在IaaS中,服务提供商向最终用户提供供应由网络资源提供的处理、存储、网络和其它基本计算资源的能力。可以在网络资源上部署任何任意应用,包括操作系统。
在实施例中,计算机网络可以实现各种部署模型,包括但不限于私有云、公共云和混合云。在私有云中,网络资源被供应给一个或多个实体的特定组独占使用(如本文所使用的术语“实体”是指企业、组织、个人或其它实体)。网络资源可以在特定实体组的处所本地和/或远离特定实体组的处所。在公共云中,云资源被供应给彼此独立的多个实体(也称为“租户”或“客户”)。计算机网络及其网络资源由与不同租户对应的客户端访问。这样的计算机网络可以被称为“多租户计算机网络”。几个租户可以在不同时间和/或相同时间使用相同的特定网络资源。网络资源可以在租户的处所本地和/或远离租户的处所。在混合云中,计算机网络包括私有云和公共云。私有云和公共云之间的接口允许数据和应用的可移植性。存储在私有云处的数据和存储在公共云处的数据可以通过接口交换。在私有云处实现的应用和在公共云处实现的应用可能具有彼此依赖性。可以通过接口执行从私有云处的应用到公共云处的应用(反之亦然)的调用。
在实施例中,多租户计算机网络的租户彼此独立。例如,一个租户的业务或操作可以与另一个租户的业务或操作分离。不同的租户可能对计算机网络具有不同的网络要求。网络要求的示例包括处理速度、数据存储量、安全要求、性能要求、吞吐量要求、时延要求、弹性要求、服务质量(QoS)要求、租户隔离和/或一致性。相同计算机网络可能需要实现由不同租户所要求的不同网络要求。
在一个或多个实施例中,在多租户计算机网络中,实现租户隔离以确保不同租户的应用和/或数据彼此不共享。可以使用各种租户隔离方法。
在实施例中,每个租户与租户ID相关联。多租户计算机网络的每个网络资源用租户ID标记。仅当租户和特定网络资源与相同租户ID相关联时,才允许该租户访问特定网络资源。
在实施例中,每个租户与租户ID相关联。由计算机网络实现的每个应用用租户ID标记。附加地或替代地,由计算机网络存储的每个数据结构和/或数据集用租户ID标记。仅当租户和特定应用、数据结构和/或数据集与相同租户ID相关联时,才允许租户访问特定应用、数据结构和/或数据集。
作为示例,由多租户计算机网络实现的每个数据库可以用租户ID标记。只有与对应租户ID相关联的租户才可以访问特定数据库的数据。作为另一个示例,由多租户计算机网络实现的数据库中的每个条目可以用租户ID标记。只有与对应租户ID相关联的租户才可以访问特定条目的数据。但是,数据库可以由多个租户共享。
在实施例中,订阅列表指示哪些租户有权访问哪些应用。对于每个应用,存储被授权访问该应用的租户的租户ID列表。仅当租户的租户ID被包含在与特定应用对应的订阅列表中时,才允许该租户访问特定应用。
在实施例中,与不同租户对应的网络资源(诸如数字设备、虚拟机、应用实例和线程)被隔离到由多租户计算机网络维护的特定于租户的覆盖网络。作为示例,来自租户覆盖网络中的任何源设备的数据包可以仅被发送到相同租户覆盖网络内的其它设备。封装隧道用于禁止从租户覆盖网络上的源设备到其它租户覆盖网络中的设备的任何传输。具体而言,从源设备接收的数据包被封装在外部数据包内。外部数据包从第一封装隧道端点(与租户覆盖网络中的源设备通信)发送到第二封装隧道端点(与租户覆盖网络中的目的地设备通信)。第二封装隧道端点对外部数据包进行解封装,以获得由源设备发送的原始数据包。原始数据包从第二封装隧道端点发送到相同特定覆盖网络中的目的地设备。
8.微服务应用
根据一个或多个实施例,本文描述的技术用微服务架构实现。这种上下文中的微服务是指被设计为可独立部署的软件逻辑,其具有可以逻辑地耦合到其它微服务以构建各种应用的端点。使用微服务构建的应用不同于单片应用,单片应用被设计为单个固定单元并且通常包括单个逻辑可执行文件。通过微服务应用,不同的微服务可作为分开的可执行文件独立部署。微服务可以使用超文本传输协议(HTTP)消息和/或经由API端点根据其它通信协议进行通信。微服务可以分开管理和更新、用不同语言编写,并独立于其它微服务执行。
微服务提供了管理和构建应用的灵活性。可以通过连接不同的微服务集合来构建不同的应用,而无需改变微服务的源代码。因此,微服务充当逻辑构建块,可以以各种方式布置逻辑构建块以构建不同的应用。微服务可以提供监控服务,该监控服务在暴露于微服务管理器的触发事件集合中的触发事件发生时通知微服务管理器(诸如If-This-Then-That(IFTTT)、Zapier或Oracle自助服务自动化(OSSA))。为应用暴露的微服务可以替代地或附加地基于从微服务管理器接收到的数据提供在应用中执行动作的动作服务(通过传递值、将动作连接到其它触发器和/或从微服务管理器中的其它动作传递的数据,经由微服务管理器可控制和可配置)。微服务触发器和/或动作可以被链在一起以形成在可选的不同应用中发生的动作的配方,这些应用以其他方式彼此不知道或者没有对彼此的控制或依赖性。这些受管理的应用可以例如利用用户供应给管理器的应用凭据被认证或插入到微服务管理器中,而无需每次受管理的应用被单独使用或与其它应用结合使用时进行重新认证。
在一个或多个实施例中,微服务可以经由GUI连接。例如,微服务可以显示为GUI的窗口、框架、其它元素内的逻辑块。用户可以将微服务拖放到用于构建应用的GUI的区域中。用户可以使用有向箭头或任何其它GUI元素将一个微服务的输出连接到另一个微服务的输入。应用构建器可以运行验证测试以确认输出和输入是兼容的(例如,通过检查数据类型、大小限制等)。
触发器
根据一个或多个实施例,可以将上述技术封装到微服务中。换句话说,微服务可以基于上述技术触发(进入到微服务管理器中以供本文称为“目标”微服务的其它插入的应用可选地使用的)通知和/或可以表示为GUI块并连接到一个或多个其它微服务。触发条件可以包括值的绝对阈值或相对阈值,和/或要分析的数据量或数据持续时间的绝对阈值或相对阈值,使得每当插入的微服务应用检测到阈值被越过时,就发生对微服务管理器的触发。例如,当微服务应用检测到值已越过触发阈值时,用户可以向微服务管理器请求触发器。
在一个实施例中,触发器在被满足时可以输出数据以供目标微服务消费。在另一个实施例中,触发器在被满足时输出指示触发器已被满足的二进制值,或输出满足触发条件的字段名称或其它上下文信息。附加地或替代地,目标微服务可以连接到一个或多个其它微服务,使得向其它微服务输入警报。其它微服务可以基于上述技术执行响应动作,包括但不限于部署附加资源、调整系统配置和/或生成GUI。
动作
在一个或多个实施例中,插入的微服务应用可以向微服务管理器暴露动作。暴露的动作可以接收数据或数据对象的标识或数据的位置作为输入,这使得数据被移动到数据云中。
在一个或多个实施例中,暴露的动作可以接收增加或减少现有警报阈值的请求作为输入。输入可以识别现有的应用中(in-application)警报阈值以及是增加或减少还是删除阈值。附加地或替代地,输入可以请求微服务应用创建新的应用中警报阈值。应用中警报可以在登录到应用中时向用户触发警报,或者可以使用微服务应用本身内可用的默认或用户选择的警报机制,而不是通过插入到微服务管理器中的其它应用向用户触发警报。
在一个或多个实施例中,微服务应用可以基于识别、定位或提供历史数据并定义所请求的输出的程度或范围的输入来生成和提供输出。动作在被触发时使微服务应用提供、存储或显示例如作为数据模型或作为描述数据模型的聚合数据的输出。
在前面的说明书中,已经参考因实现而异的许多具体细节描述了实施例。因此,说明书和附图应当被认为是说明性的而不是限制性的。本发明的范围的唯一且排他的指标以及申请人预期作为本发明的范围的内容是从本申请中发出的权利要求集合的字面和等同范围,以这种权利要求发出的具体形式,包括任何后续的更正。
Claims (28)
1.一种包括指令的非暂态计算机可读介质,所述指令在由一个或多个硬件处理器执行时,执行包括以下的操作:
通过集成开发环境IDE或编译器评估代码的词法范围界定,来确定相同级别代码段序列中的第一代码段封装第一较低级别词法范围,
其中,词法范围界定包括基于至少一个词法构造来确定其中一个或多个变量能用于使用的至少一个词法范围,所述至少一个词法构造封装其中所述一个或多个变量被声明的一个或多个代码段,
其中,所述第一较低级别词法范围包括为所述相同级别代码段序列提供的范围界定,
其中,所述第一代码段包括条件和一个或多个未初始化变量,
其中,所述第一代码段的执行如果被执行,则使得所述条件被评估,并且如果所述条件被满足,则使得所述一个或多个未初始化变量被初始化并使所述一个或多个未初始化变量仅在所述第一较低级别词法范围内能用;
由IDE或编译器确定第二代码段(a)引用所述一个或多个未初始化变量,并且(b)在所述相同级别代码段序列中或者在所述第一较低级别词法范围之外的第二较低级别词法范围中;以及
由IDE或编译器呈现指示所述一个或多个未初始化变量在所述第二代码段的范围之外的错误消息。
2.如权利要求1所述的介质,
其中所述第一代码段的所述条件包括至少一个初始化变量、测试谓词和单一可执行命令,
其中所述单一可执行命令是对照所述测试谓词执行所述至少一个初始化变量的检查。
3.如权利要求2所述的介质,其中所述单一可执行命令是编程语言原生的。
4.如权利要求2所述的介质,其中所述测试谓词包括对象类型,并且其中所述一个或多个未初始化变量被初始化为被强制转换成所述对象类型的所述至少一个初始化变量。
5.如权利要求1所述的介质,其中所述第二较低级别词法范围由包括第二一个或多个未初始化变量的第三代码段封装,其中所述第三代码段的执行如果被执行,则使得所述第二一个或多个未初始化变量被初始化并且使所述第二一个或多个未初始化变量仅在所述第二较低级别词法范围内能用。
6.如权利要求5所述的介质,其中当另一个条件被满足时,所述第三代码段使得所述第二一个或多个未初始化变量被初始化并且使所述第二一个或多个未初始化变量能用。
7.如权利要求1所述的介质,其中所述相同级别代码段序列不允许将所述相同级别代码段的一个子集中的任何变量局部地界定在所述相同级别代码段的另一个子集之外。
8.如权利要求1所述的介质,其中呈现所述错误消息是在编译时执行的。
9.如权利要求1所述的介质,其中所述第一代码段与switch语句中的case相关联。
10.如权利要求1所述的介质,其中所述第二代码段位于与所述第一代码段相关联的else块中。
11.如权利要求1所述的介质,其中所述错误消息包括用于改变代码的建议,使得所述一个或多个未初始化变量在所述第二代码段的范围中。
12.如权利要求1所述的介质,其中所述第一代码段和所述第二代码段是复合布尔代码段的不同部分。
13.如权利要求12所述的介质,其中所述操作还包括:
确定所述一个或多个未初始化变量是否在由所述复合布尔代码段封装的第三代码段的范围中。
14.一种计算机系统,包括:
一个或多个硬件处理器;以及
如权利要求1至13中任一项所述的非暂态计算机可读介质。
15.一种用于基于流的范围界定的方法,所述方法包括:
通过集成开发环境IDE或编译器评估代码的词法范围界定,来确定相同级别代码段序列中的第一代码段封装第一较低级别词法范围,
其中,词法范围界定包括基于至少一个词法构造来确定其中一个或多个变量能用于使用的至少一个词法范围,所述至少一个词法构造封装其中所述一个或多个变量被声明的一个或多个代码段,
其中,所述第一较低级别词法范围包括为所述相同级别代码段序列提供的范围界定,
其中,所述第一代码段包括条件和一个或多个未初始化变量,
其中,所述第一代码段的执行如果被执行,则使得所述条件被评估,并且如果所述条件被满足,则使得所述一个或多个未初始化变量被初始化并使所述一个或多个未初始化变量仅在所述第一较低级别词法范围内能用;
由IDE或编译器确定第二代码段(a)引用所述一个或多个未初始化变量,并且(b)在所述相同级别代码段序列中或者在所述第一较低级别词法范围之外的第二较低级别词法范围中;以及
由IDE或编译器呈现指示所述一个或多个未初始化变量在所述第二代码段的范围之外的错误消息;
其中所述方法由包括硬件处理器的至少一个设备执行。
16.如权利要求15所述的方法,
其中所述第一代码段的所述条件包括至少一个初始化变量、测试谓词和单一可执行命令,
其中所述单一可执行命令是对照所述测试谓词执行所述至少一个初始化变量的检查。
17.如权利要求16所述的方法,其中所述单一可执行命令是编程语言原生的。
18.如权利要求16所述的方法,其中所述测试谓词包括对象类型,并且其中所述一个或多个未初始化变量被初始化为被强制转换成所述对象类型的所述至少一个初始化变量。
19.如权利要求15所述的方法,其中所述第二较低级别词法范围由包括第二一个或多个未初始化变量的第三代码段封装,其中所述第三代码段的执行如果被执行,则使得所述第二一个或多个未初始化变量被初始化并且使所述第二一个或多个未初始化变量仅在所述第二较低级别词法范围内能用。
20.如权利要求19所述的方法,其中当另一个条件被满足时,所述第三代码段使得所述第二一个或多个未初始化变量被初始化并且使所述第二一个或多个未初始化变量能用。
21.如权利要求15所述的方法,其中所述相同级别代码段序列不允许将所述相同级别代码段的一个子集中的任何变量局部地界定在所述相同级别代码段的另一个子集之外。
22.如权利要求15所述的方法,其中呈现所述错误消息是在编译时执行的。
23.如权利要求15所述的方法,其中所述第一代码段与switch语句中的case相关联。
24.如权利要求15所述的方法,其中所述第二代码段位于与所述第一代码段相关联的else块中。
25.如权利要求15所述的方法,其中所述错误消息包括用于改变代码的建议,使得所述一个或多个未初始化变量在所述第二代码段的范围中。
26.如权利要求15所述的方法,其中所述第一代码段和所述第二代码段是复合布尔代码段的不同部分。
27.如权利要求26所述的方法,还包括:
确定所述一个或多个未初始化变量是否在由所述复合布尔代码段封装的第三代码段的范围中。
28.一种用于基于流的范围界定的装置,所述装置包括用于执行如权利要求15至27中任一项所述的方法的单元。
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201762483342P | 2017-04-08 | 2017-04-08 | |
US62/483,342 | 2017-04-08 | ||
US15/947,432 US10310827B2 (en) | 2017-04-08 | 2018-04-06 | Flow-based scoping |
US15/947,432 | 2018-04-06 | ||
PCT/US2018/026675 WO2018187798A1 (en) | 2017-04-08 | 2018-04-09 | Flow-based scoping |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110678839A CN110678839A (zh) | 2020-01-10 |
CN110678839B true CN110678839B (zh) | 2023-09-05 |
Family
ID=63711627
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201880033532.1A Active CN110678839B (zh) | 2017-04-08 | 2018-04-09 | 基于流的范围界定 |
Country Status (4)
Country | Link |
---|---|
US (1) | US10310827B2 (zh) |
EP (1) | EP3607432B1 (zh) |
CN (1) | CN110678839B (zh) |
WO (1) | WO2018187798A1 (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110865806B (zh) * | 2019-11-20 | 2023-08-18 | 腾讯科技(深圳)有限公司 | 代码处理方法、装置、服务器及存储介质 |
CN111158663B (zh) * | 2019-12-26 | 2021-07-02 | 深圳逻辑汇科技有限公司 | 用于处理程序代码中的变量的引用的方法和系统 |
JP7447723B2 (ja) | 2020-07-22 | 2024-03-12 | 富士通株式会社 | 情報処理プログラム、情報処理方法、および情報処理装置 |
US11727017B2 (en) * | 2020-07-28 | 2023-08-15 | Salesforce, Inc. | Methods for introspecting code in a multi-tenant environment |
US20220300352A1 (en) | 2021-03-19 | 2022-09-22 | Oracle International Corporation | Determining a resolution state of an anchor constant associated with an application programming interface (api) point |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102222013A (zh) * | 2010-04-17 | 2011-10-19 | 微软公司 | 用于改变回复力的中间语言支持 |
CN103809966A (zh) * | 2012-11-08 | 2014-05-21 | 国际商业机器公司 | 数据流分析方法和装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7810081B2 (en) | 2006-08-22 | 2010-10-05 | International Business Machines Corporation | Compilation error isolation, optimization and resolution |
US7827127B2 (en) * | 2007-10-26 | 2010-11-02 | Microsoft Corporation | Data scoping and data flow in a continuation based runtime |
US8776013B2 (en) * | 2011-10-03 | 2014-07-08 | Resilient Science, Inc. | Flow-optimization system and method for cloud computing |
US20150309913A1 (en) * | 2014-04-24 | 2015-10-29 | International Business Machines Corporation | Identifying potentially uninitialized source code variables |
US10296311B2 (en) * | 2015-11-25 | 2019-05-21 | International Business Machines Corporation | Finding uninitialized variables outside the local scope |
-
2018
- 2018-04-06 US US15/947,432 patent/US10310827B2/en active Active
- 2018-04-09 EP EP18721223.8A patent/EP3607432B1/en active Active
- 2018-04-09 WO PCT/US2018/026675 patent/WO2018187798A1/en active Application Filing
- 2018-04-09 CN CN201880033532.1A patent/CN110678839B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102222013A (zh) * | 2010-04-17 | 2011-10-19 | 微软公司 | 用于改变回复力的中间语言支持 |
CN103809966A (zh) * | 2012-11-08 | 2014-05-21 | 国际商业机器公司 | 数据流分析方法和装置 |
Non-Patent Citations (1)
Title |
---|
What is lexical?scoping?;Eric Lippert;《https://ericlippert.com/2013/05/20/what-is-lexical-scoping/》;20130520;全文 * |
Also Published As
Publication number | Publication date |
---|---|
US10310827B2 (en) | 2019-06-04 |
US20180293058A1 (en) | 2018-10-11 |
WO2018187798A1 (en) | 2018-10-11 |
CN110678839A (zh) | 2020-01-10 |
EP3607432B1 (en) | 2023-04-05 |
EP3607432A1 (en) | 2020-02-12 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11385872B2 (en) | Extending a virtual machine instruction set architecture | |
US10367822B2 (en) | Restrictive access control for modular reflection | |
CN110678839B (zh) | 基于流的范围界定 | |
US11366643B2 (en) | Generating dynamic modular proxies | |
US10303449B2 (en) | Compiling non-native constants | |
CN107924326B (zh) | 对经更新的类型的迁移方法进行覆盖 | |
US10719337B2 (en) | Container-based language runtime loading an isolated method | |
US20210055941A1 (en) | Type-constrained operations for plug-in types | |
US10853110B2 (en) | Constructor accessibility checks for deserialization | |
US10120777B1 (en) | Remediating serialization incompatibilities | |
US10802855B2 (en) | Producing an internal representation of a type based on the type's source representation | |
US11366657B2 (en) | Inferring code deprecation from module deprecation | |
US11347487B2 (en) | Confining reflective access based on module boundaries | |
US10394610B2 (en) | Managing split packages in a module system | |
US10346225B2 (en) | Synthesized modules for module renaming | |
US10908910B2 (en) | Lazy copying of runtime-managed stack frames |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |