CN107454954B - 数据绑定相关性分析 - Google Patents

数据绑定相关性分析 Download PDF

Info

Publication number
CN107454954B
CN107454954B CN201680019375.XA CN201680019375A CN107454954B CN 107454954 B CN107454954 B CN 107454954B CN 201680019375 A CN201680019375 A CN 201680019375A CN 107454954 B CN107454954 B CN 107454954B
Authority
CN
China
Prior art keywords
data binding
source code
computing device
expressions
application
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
Application number
CN201680019375.XA
Other languages
English (en)
Other versions
CN107454954A (zh
Inventor
伊基特·博亚尔
乔治·弗朗西斯·蒙特
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.)
Google LLC
Original Assignee
Google 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 Google LLC filed Critical Google LLC
Publication of CN107454954A publication Critical patent/CN107454954A/zh
Application granted granted Critical
Publication of CN107454954B publication Critical patent/CN107454954B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/38Creation or generation of source code for implementing user interfaces
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/48Incremental compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/72Code refactoring
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Abstract

描述了包括预处理器模块和编译器模块的计算装置。预处理器模块基于解析定义用户界面的布局文件的源代码来识别多个数据绑定表达,多个数据绑定表达中的每一个定义在用户界面的用户界面元素与模型对象之间的相应数据绑定,基于多个数据绑定表达来确定多个数据绑定表达中的每一个之间的相关性,并且基于相关性来生成附加源代码,附加源代码用于响应于对模型对象的属性的改变来更新由多个数据绑定表达定义的至少一个相应数据绑定。编译器模块生成包括基于布局文件的源代码、模型对象和附加源代码的机器可执行代码的应用。

Description

数据绑定相关性分析
背景技术
一些计算机程序可提供诸如图形用户界面的用户界面。图形用户界面可以包括一个或多个用户界面元素,诸如文本字段、图像、按钮和菜单,这只是几个示例。各种信息和/或动作可以与用户界面元素相关联。例如,计算机程序可以将诸如名称的值指派给文本字段,使得执行计算机程序的计算装置在文本字段中显示该名称。在另一示例中,计算机程序可以将动作与按钮相关联,使得当用户输入选择按钮时,执行计算机程序的计算装置执行动作。
提供图形用户界面的计算机程序可以被写入以将数据(例如,模型或模型对象)和呈现逻辑(例如,视图)分离成不同的但可互操作的组件。在一些示例中,控制器逻辑(例如,控制器)可以发送用于更新模型的命令和/或发送用于更新视图的命令。这样,呈现逻辑可以在图形用户界面中输出来自模型的数据和/或接收修改模型中的数据的图形用户界面处的用户输入。为了便于显示和修改这种数据,计算机程序可以包括数据绑定,数据绑定以编程方式将用户界面元素与模型相关联或以其他方式关联。通过将用户界面元素与模型关联,如果模型改变,则计算机程序可以更新与模型对应的用户界面元素。然而,数据绑定技术会在计算上可能是成本高的,并且可能需要大量的计算资源。
发明内容
在一个示例中,本公开涉及一种方法,该方法包括:由计算装置并且至少部分地基于解析定义图形用户界面的布局文件的源代码来识别多个数据绑定表达,其中,多个数据绑定表达中的每一个定义在图形用户界面的用户界面元素和模型对象之间的相应数据绑定;由计算装置至少部分地基于多个数据绑定表达来确定在多个数据绑定表达中的每一个之间的一个或多个相关性;由计算装置至少部分地基于一个或多个相关性来生成附加源代码,附加源代码用于响应于对模型对象的至少一个属性的改变来更新由所述多个数据绑定表达定义的至少一个相应数据绑定;以及由计算装置生成包括至少部分地基于布局文件的源代码、模型对象和附加源代码的机器可执行代码的应用。
在另一示例中,本公开涉及一种计算装置,该计算装置包括:至少一个处理器;预处理器模块,其可由至少一个处理器操作以:至少部分地基于解析定义图形用户界面的布局文件的源代码来识别多个数据绑定表达,其中,多个数据绑定表达中的每一个定义在图形用户界面的用户界面元素和模型对象之间的相应数据绑定;至少部分地基于多个数据绑定表达来确定在多个数据绑定表达中的每一个之间的一个或多个相关性;至少部分地基于一个或多个相关性来生成附加源代码,附加源代码用于响应于对模型对象的至少一个属性的改变来更新由多个数据绑定表达定义的至少一个相应数据绑定;以及编译器模块,该编译器模块能够由至少一个处理器操作以生成包括至少部分地基于布局文件的源代码、模型对象和附加源代码的机器可执行代码的应用。
在另一示例中,本公开涉及一种包括指令的计算机可读存储介质,该指令在被执行时使得计算装置的一个或多个处理器:至少部分地基于解析定义图形用户界面的布局文件的源代码来识别多个数据绑定表达,其中,多个数据绑定表达中的每一个定义在图形用户界面的用户界面元素和模型对象之间的相应数据绑定;至少部分地基于多个数据绑定表达来确定在多个数据绑定表达中的每一个之间的一个或多个相关性;至少部分地基于一个或多个相关性来生成附加源代码,附加源代码用于响应于对模型对象的至少一个属性的改变来更新由多个数据绑定表达定义的至少一个相应数据绑定;以及生成包括至少部分地基于布局文件的源代码、模型对象和附加源代码的机器可执行代码的应用。
在附图和以下描述中阐述了一个或更多个示例的细节。根据说明书和附图并且根据权利要求书,本公开的其他特征、目的和优点将显而易见。
附图说明
图1是图示根据本公开的技术的通过数据绑定来编译源代码的示例性计算装置的原理图。
图2是图示根据本公开的一个或多个方面的由示例性计算装置执行的示例性软件编译和构建过程的流程图。
图3是图示根据本公开的一个或多个方面的配置成执行示例性软件编译和构建过程的示例性计算装置的框图。
图4A-4F是图示根据本公开的一个或多个方面的由通过数据绑定编译源代码的示例性计算装置所执行的示例性预编译过程的不同阶段的一系列原理图。
图5A-5C是图示根据本公开的一个或多个方面的由通过数据绑定来编译源代码的示例性计算装置所执行的另一示例性预编译过程的不同阶段的一系列原理图。
图6A-6C是图示根据本公开的一个或多个方面的由通过数据绑定来编译源代码的示例性计算装置所执行的另一示例性预编译过程的不同阶段的一系列原理图。
图7是图示根据本公开的一个或多个方面的由通过数据绑定来编译源代码的示例性计算装置所执行的示例性操作的流程图。
具体实施方式
总体上,本公开的技术可以使得计算装置能够生成源代码,源代码一旦作为应用被编译和执行,就使得应用仅更新图形用户界面的用户界面元素,这些用户界面元素被数据绑定到模型对象的属性值,这些模型对象的属性值从对图形用户界面的先前更新开始已经改变。如本文所使用的,术语“模型对象”是指存储与模型相关的数据的元素。计算装置可以解析和分析定义图形用户界面的布局文件,以确定在不同数据绑定表达之间可能存在的一个或多个相关性。例如,计算装置可以确定布局文件的哪些数据绑定表达具有取决于特定模型对象的相同属性的项。
计算装置可以使用相关性来构建一组逻辑规则,该组逻辑规则定义当该特定模型对象的各种属性值改变时要更新哪些数据绑定。当计算装置构建底层应用时,计算装置可以将规则连同其他应用源代码一起预编译为随后编译的所生成的源代码。当执行应用时,所生成的源代码可以使得应用仅更新受改变影响的那些用户界面元素,而不是每当模型对象属性改变时就更新整个用户界面。
图1是图示根据本公开的技术的作为通过数据绑定来编译源代码的示例性构建器计算装置的构建器计算装置100的原理图。在图1的示例中,构建器计算装置100可以是台式计算机。然而,在其他示例中,构建器计算装置100可以是平板计算机、智能电话、膝上型计算机、工作站、服务器或另一类型的计算装置。构建器计算装置100可以是下述计算装置:该计算装置由软件开发人员使用以编写包括源代码的计算机程序,并且以可执行计算机程序对源代码进行编译。在一些示例中,构建器计算装置100可以是由软件开发人员的工作站经由网络访问以将源代码编译成计算机程序的服务器。虽然图1中未示出,但是除了构建器模块102之外,构建器计算装置100可以包括应用和/或模块。例如,计算装置100可以包括操作系统、集成开发环境、文本编辑器、web浏览器、命令行终端或可由计算装置执行的任何其他应用和/或模块,这仅仅是几个示例。
构建器计算装置100可以接收一个或多个应用资源118和应用源代码121,计算装置100可以将其编译成一个或多个应用,诸如应用模块114。应用资源118可以包括但不限于构建定义外观图形用户界面的脚本、源代码或标记语言以及数据文件(例如,包括在应用中的文本文件、图像等),这仅仅是几个示例。应用源代码121可以定义用于应用模块114的控制器逻辑、应用模型和呈现逻辑的功能。
构建器计算装置100可以包括用于处理和编译应用资源118和应用源代码121的一个或多个子组件。例如,如图1所示,构建器模块102可以包括预处理器104和编译器106。如在本公开中进一步描述的,预处理器104可以解析诸如定义图形用户界面的外观的源代码的应用资源,以识别表示数据绑定的语法元素。基于语法元素,预处理器104自动生成用于绑定对象的源代码,这可以提高应用的运行时性能。
构建器模块102还可包括编译器106。编译器106可以将人类可读源代码(例如,由预处理器104生成和/或由用户编写的)编译成机器可执行代码。例如,编译器106可以执行对人类可读源代码的词法分析。词法分析可以包括将源代码的语法元素划分成令牌。每个令牌可以对应于编程语言中的符号,诸如键盘、变量或数字。编译器106还可以执行对令牌的语法分析。例如,编译器106可以生成称为语法或解析树的树数据结构,树数据结构基于与令牌对应的语法元素之间的关系来组织令牌。语法树的每个节点可以表示令牌。这样,语法树可以表示计算机程序的结构或组织。编译器106还可以执行对语法树的类型检查,以确定是否违反了一个或多个编程语言要求。
在一些示例中,编译器106可以将语法树中的人类可读源代码转换成机器无关的中间代码,而在其他示例中,编译器106可以将人类可读源代码转换成用于特定机器架构的汇编语言。出于本公开的目的,机器可执行代码可以指用于特定计算机体架构的机器无关的中间代码或汇编语言。机器无关的中间代码可以由已经针对特定计算机架构编译的运行时环境或虚拟机(VM)来执行,而用于特定机器架构的汇编语言由具有特定计算机架构的处理器直接执行。
如图1所示,应用模块114可以包括机器可执行代码。用户计算装置108可以存储和执行应用模块114。在图1的示例中,用户计算装置108可以是移动电话。然而,在其他示例中,计算装置108可以是平板计算机、个人数字助理(PDA)、膝上型计算机、便携式游戏装置、便携式媒体播放器、电子书阅读器、智能手表、电视平台或另一类型的计算装置。
用户计算装置108的应用模块114可以包括在计算装置108上执行任何各种操作的功能。例如,应用模块114可以包括电子邮件应用、文本消息收发应用、即时消息收发应用、天气应用、视频会议应用、社交网络应用、股票市场应用、紧急警报应用、体育相关应用、办公生产应用、多媒体播放器,这仅仅是几个示例。
虽然被示出为能够由用户计算装置108操作,但是应用模块114可以与通信地耦合到用户计算装置108的远程计算装置进行互操作。在此示例中,应用模块在远程计算装置处执行并且可以使得远程计算装置使用任何适当形式的数据通信(例如,有线或无线网络、诸如近场通讯或蓝牙的短距离无线通信等)向应用模块111发送信息。在一些示例中,远程计算装置可以是与用户计算装置108分离的计算装置。例如,远程计算装置可以通过网络与用户计算装置108操作地耦合。远程计算装置的示例可包括但不限于服务器、智能电话、平板计算装置、智能手表和台式计算机。应用模块114和用户界面模块116可以以各种方式来实现。例如,模块114和116中的任何一个可以被实现为可下载的或预先安装的应用或“app”。在另一个示例中,模块114和116中的任何一个可以被实现为用户计算装置108的操作系统的部分。
如图1所示,用户计算装置108可以包括存在敏感显示器112。用户计算装置108的存在敏感显示器112可以用作用户计算装置108的输入装置和输出装置。在一些示例中,存在敏感显示器112可以包括集成的存在敏感输入装置和显示装置。例如,存在敏感显示器112可以用作使用存在敏感屏幕(诸如,电阻式触摸屏、表面声波触摸屏、电容式触摸屏、投影式电容触摸屏、压敏屏幕、声学脉冲识别触摸屏)的存在敏感输入装置或另一种存在敏感屏幕技术。存在敏感显示器112可以用作能够向用户计算装置108的用户输出可见信息的输出装置,诸如使用液晶显示器(LCD)、点阵显示器、发光二极管(LED)显示器、有机发光二极管(LED)显示器、电子墨水或类似单色或彩色显示器中的任何一个或多个的显示装置。
存在敏感显示器112可以通过检测由用户计算装置108接收的一个或多个轻击和/或非轻击手势、连续手势或其他任何触摸手势(例如,多触摸手势)来接收用户输入的指示(例如,用户用手指或触笔触摸或指向存在敏感显示器112的一个或多个位置)。基于用户输入的指示,存在敏感显示器112的显示装置可以呈现对用户的输出。例如,存在敏感显示器112的显示装置可以呈现在用户计算机装置108处执行的应用的各种用户界面。用户计算装置108的用户可以在存在敏感显示器112的存在敏感输入装置处提供用户输入,以与这些应用中的一个或多个进行交互。
用户计算装置108还可以包括UI模块116。用户计算装置108的UI模块116可以从存在敏感显示器112接收存在敏感显示器112处检测到的用户输入的一个或多个指示。总体上,每当存在敏感显示器112接收到在存在敏感显示器112的特定位置处检测到的用户输入的指示时,UI模块116可以从存在敏感显示器112接收关于用户输入的信息。UI模块116可以将从存在敏感显示器112接收到的信息汇编成诸如一个或多个触摸事件序列的、指示手势的一组事件,该组事件可以按时间排序。序列中的每个触摸事件可以包括表示表征在存在敏感屏幕处输入的存在和/或移动的参数(例如,何时、何地、发起方向)的数据或分量。序列中的每个触摸事件可以包括与存在敏感显示器112的位置对应的位置分量、与存在敏感显示器112何时检测到在该位置处的用户输入相关的时间分量、和/或与触摸事件是否对应于该位置处的抬起或按下相关的动作分量。此外,事件中的一个或多个可以具有并发时间分量,并且这些事件仅仅是出于示例目的而被描述为触摸事件,并且可以指示任何形式的存在敏感输入装置处的手势。
UI模块116可以基于触摸事件的序列来确定用户输入的一个或多个特征,并且包括关于触摸事件的序列中的每个触摸事件内的这一个或多个特征的信息。例如,UI模块116可以确定用户输入的开始位置、用户输入的结束位置、用户输入的一部分的密度、用户输入的一部分的速度、用户输入的一部分的方向以及用户输入的一部分的曲率。触摸事件的序列中的一个或多个触摸事件可以包括(除了如上所述的时间、位置和动作分量之外)特征分量,特征分量包括关于用户输入的一个或多个特征的信息(例如,密度、速度等)。UI模块116可以以其他方式向应用模块114发送包括与每个触摸事件相关联的分量或参数化数据的触摸事件的序列。
UI模块116可以用作计算装置106的各种组件之间的中介,以基于由存在敏感显示器112检测到的输入进行确定并且生成由存在敏感显示器112呈现的输出。例如,UI模块116可以接收包括文本视图134A和134B的图形用户界面的表示作为来自应用114的输入。UI模块116还可以接收从关于由存在敏感显示器112检测到的用户输入的信息生成的触摸事件的序列作为来自应用114的输入。UI模块116可以基于序列中的位置分量来确定一个或多个位置分量接近图形用户界面124的一个或多个位置的选择的触摸事件(例如,UI模块116可以确定触摸事件中的一个或多个的位置对应于存在敏感显示器112的呈现图形用户界面124的区域)。UI模块116可以发送触摸事件的序列作为对应用模块114的输出。UI模块116还可以接收信息应用模块114,信息应用模块114可以被输出以在存在敏感显示器112处进行显示。UI模块116可以将图形用户界面124更新为例如包括文本视图134A和134B。UI模块116可以使得存在敏感显示器112显示包括文本视图134A和134B的图形用户界面124。
如图1所示并且如上所述,软件开发人员可以编写应用资源118和应用源代码121,使得当由构建器计算装置100编译时,应用模块114包括机器可执行代码。应用资源118包括定义图形用户界面124的布局和外观的布局文件120A。在图1的示例中,以可扩展标记语言(XML)编写布局文件120A,但是可以使用任何编程语言。出于示例目的,用伪代码说明图1中包括的源代码,并且实际代码可以包括更多或更少的语法元素。布局文件120A可以具有文件名Activity_main.xml。
为了建立在模型对象和图形用户界面124的用户界面元素(诸如,文本视图134A)之间的数据绑定,软件开发者可以包括源文件120A中的一个或多个语法元素,这些语法元素使得构建器模块102在编译时建立在图形用户界面124的用户界面元素和模型对象的属性之间的数据绑定。例如,布局文件120A包括用值{@user.firstName}表示的语法元素126。在一些示例中,值@{user.firstName}可以被称为表达。可以使用“@{}”语法在性质属性中写入布局内的表达。在一些示例中,表达是在运行时评估的占位符值并且用基于表达的语法的值进行替换。例如,当在运行时评估表达时,可以用用户的名来替换表达@{user.firstName}。
如图1所示,通过将语法元素126包含在文本视图134A的声明中,将语法元素126与文本视图134A相关联:
<TextView text=
"@{user.firstName}"
id="firstName"/>
布局文件120A还可以包括指示绑定于用户界面元素的模型对象的类型的语法元素。例如,布局文件120A可以包括指定绑定于文本视图134A的模型对象的类型的语法元素124。图1中的语法元素124是包括具有布局文件120A本地的范围的变量名“用户(user)”以及包括用于模型对象的定义的类的完整类名称“com.example.User”的标签。如在本公开中进一步描述的,预处理器104可以使用语法元素124和126以在编译时自动生成提供在文本视图134A和模型对象之间的数据绑定的绑定对象。
语法元素126可以识别包括绑定于文本视图134A和134B的属性的模型对象的类别。模型对象可以包括用于应用模块114的至少一部分的数据或状态信息。在图1的示例中,由源文件120B的用户类定义的模型对象122A可以包括用户的名和姓。应用源文件120B包括定义用户模型对象的类。例如,源文件120B的用户(User)类包括分别与用户的名和用户的姓对应的属性名(firstName)和姓(lastName)。能向名和姓的属性中的每一个指派串值。在运行时,用户模型对象122A可以包括诸如名值和姓值的用户的状态信息。
在一些示例中,模型对象可以是可观察的。这样,可以向模型对象注册一个或多个观察者对象,以监听指示模型对象状态的改变的通知。在一些示例中,在本公开中的诸如ActivityMainBinding绑定对象122B的绑定对象可以是观察者。因此,如果模型对象的状态改变,则可以通知绑定对象并且基于模型对象改变来执行附加动作。
应用源代码121还可以包括应用源文件120C。应用源文件120C可以定义当应用源文件120C被启动、打开或以其他方式发起时由用户计算装置108初始执行的类。应用源代码121包括获取对绑定对象的引用或句柄的语句128,其中,用于绑定对象的源代码将由编译器106基于语法元素124、126和127来自动生成,如本公开中进一步描述的。语句130在被执行时实例化新的用户模型对象,并且将模型对象122A的名和姓属性初始化成“测试(Test)”和“用户(User)”。语句132使用数据绑定对象122B建立在模型对象122A与文本视图120A和120B之间的数据绑定。
为了编译应用资源118和应用源121,构建器模块100可以初始地接收文件120A-120C。预处理器104可以基于解析对布局文件120A的源代码来识别表示数据绑定的语法元素126和127。使用语法元素124中的模型对象122A的完整类名称,预处理器104可以确定数据绑定包括在用户模型对象122A的名属性和图形用户界面124的用户界面元素(即,文本视图134A)之间的关联。文本视图134A对应于语法元素126,因为它被包括在定义文本视图134A的标签中。类似地,预处理器104可以确定数据绑定包括在用户模型对象122A的姓属性和图形用户界面124的用户界面元素(即,文本视图134A)之间的关联。文本视图134B对应于语法元素127,因为它被包括在定义文本视图134A的标签中。
为了确定数据绑定包括在用户模型对象122A的名属性和文本视图134A之间的关联,预处理器104确定在语法元素126的花括号之间的值“用户.名(user.firstName)”,并且确定与“名(firstName)”对应的语法元素124的完整类名称所标识的用户(User)类中是否存在属性。在图1的示例中,用户(User)类的属性“名(firstName)”与语法元素126中的值“用户.名(user.firstName)”匹配。在一些示例中,预处理器104可以基于一个或多个编程约定来自动地确定返回用户(User)类中的属性名(firstName)的值的方法getFirstName()与方法元素126中的值“用户.名(user.firstName)”匹配。例如,编程约定可以包括具有与私有范围属性(名(firstName))对应的名称(getFirstName或setFirstName)的公共范围方法。基于属性的名称(例如,名(firstName)),预处理器可以确定对应的方法名称(例如,getFirstName)。这样,预处理器104可以确定在布局文件的语法元素中的值与模型对象源文件中的属性名称之间的匹配,但是该值和属性名称没有精确匹配。
响应于确定语法元素126中的值“用户.名(user.firstName)”与用于用户模型对象122A的源代码中的属性名(firstName)匹配,预处理器104可以自动生成用于绑定对象122B的源代码。在一些示例中,预处理器104可以生成定义绑定对象122B的类,其中,类名称是布局文件名和单词“绑定”的连结,诸如图1中关于绑定对向122B示出的“ActivityMainBinding”。
预处理器104可以自动生成绑定对象122B的源代码,使得用户模型对象122A的属性名(firstName)和图形用户界面124的用户界面元素(文本视图134A)都是绑定对象122B可访问的。为了使用户模型对象122A的属性名(firstName)和文本视图134A是绑定对象122B可访问的,预处理器104可以包括在用于绑定对象122B的源代码中对用户模型对象122A和文本视图134A的引用。例如,绑定对象源代码可以包括对文本视图134A的引用或指示符,使得绑定对象122B可以寻址或访问文本视图134A,以对文本视图134A执行一个或多个操作。
在一些示例中,预处理器104还可以生成响应于用户模型对象122A的状态改变而执行一个或多个操作的监听器方法。也就是说,预处理器104可以向用户模型对象注册绑定对象122B,使得当用户模型对象122A的状态在运行时改变时,用户模型对象将向绑定对象122B通知。在一些示例中,通知可以指示用户模型对象122A的哪些特定属性已经改变。
预处理器104可以自动地生成用于绑定对象122B的监听器方法的源代码,该源代码使得用来自模型对象122A的改变后的值来更新图形用户界面124中的用户界面元素。例如,源文件120C(或另一个源文件)中的源代码可以使得用户模型对象122A的名(firstName)属性在运行时被更新。响应于设置名(firstName)属性,用户模型对象122A可以通知被注册为用户模型对象122A的观察者的任何观察者对象。因为绑定对象122B包括用于监听器方法的自动生成的源代码,所以监听器方法接收在用户模型对象122A中已经改变的名(firstName)属性的标识符。监听器方法可以包括由预处理器104自动生成的源代码,该源代码使得用用户模型对象122A中的名(firstName)的改变后的值更新文本视图134A。例如,源代码可以包括绑定对象122B中对用户模型对象122A的引用以访问名(firstName)属性的更新后的值。源代码可以使用绑定对象122B中对文本视图134A(即,用户界面元素)的引用,以将输出以进行显示的文本值120A的值设置为来自用户模型对象的名(firstName)属性的更新后的值。这样,用于绑定对象122B的源代码包括响应于模型对象的属性改变而更新用户界面元素的指令集。
编译器106可以至少部分地基于布局文件的源代码、模型对象的源代码和绑定对象的自动生成的源代码来生成包括机器可执行代码的应用模块114。也就是说,编译器106可以将布局文件的源代码、模型对象的源代码以及绑定对象的自动生成的源代码编译到应用模块114中。在图2中描述了编译源代码的更多细节。应用模块114可以被加载到用户计算装置108上并且由用户计算装置108执行。在执行期间(例如,在运行时间期间),计算装置108可以实例化一个或多个对象122。对象122可以包括用户模型对象122A(基于源文件120B)、绑定对象122B(基于由预处理器104自动生成的源代码)和主程序对象122C(基于源文件120C)。程序执行可以从主程序对象122C的指令开始。初始地,文本视图134A和文本视图134B可以分别包括图形用户界面124中的值“测试(Test)”和“用户(User)”。值“测试(Test)”和“用户(User)”可以被存储在用户模型对象122A中。
在执行应用模块114期间的稍后时间,用户模型对象122A的属性名(firstName)和姓(lastName)可以被更新成“David”和“Smith”。在将名(firstName)和姓(lastName)分别设置为“David”和“Smith”时,用户模型对象122A可以通知被注册为用户模型对象122A的观察者的任何观察者对象。被注册为用户模型对象122A的观察者对象的绑定对象122B经由监听器方法接收用户模型对象122A的属性名(firstName)和姓(lastName)已经改变的通知。因此,绑定对象122B使用其对用户模型对象的引用来确定用户模型对象122A的名(firstName)和姓(lastName)的更新后的值。然后,绑定对象122B使用其对文本视图134A和文本视图134B的引用来更新文本视图134A和文本视图134B,以分别显示“David”和“Smith”。以这种方式,绑定对象122B实现例如模型对象122A和文本视图134A之间的数据绑定。当基本用户模型对象122A的状态改变时,可以使通过数据绑定对象122B来更新文本视图120A和120B。
根据本公开的技术,构建器模块102的预处理器104可以生成提高当用户计算装置108执行应用模块114时用户计算装置108所执行的绑定操作的运行时性能的源代码。所生成的源代码一旦由编译器106编译并且稍后由用户计算装置108作为应用模块108被执行,就可以使得应用模块108仅更新图形用户界面124的用户界面元素(例如,文本视图134A和134B),这些用户界面元素是被绑定于模型对象122A的属性值的数据,这些属性值从上次应用模块108使得UI模块1160在用户界面124在存在敏感显示器112处显示时更新图形用户界面124开始已经改变。
例如,在编译器106将应用资源118和应用源代码121编译为用于生成应用模块108的机器可执行代码的构建过程的一部分之前,构建器计算装置100可以至少部分地基于解析定义图形用户界面的布局文件的源代码来识别多个数据绑定表达。多个数据绑定表达中的每一个可以定义在图形用户界面的用户界面元素和模型对象之间的相应数据绑定。例如,预处理器104可以解析包括语法元素126作为表达是数据绑定表达的指示的一个或多个表达的布局文件120A。
构建器计算装置100可以至少部分地基于多个数据绑定表达来确定多个数据绑定表达中的每一个之间的一个或多个相关性。例如,预处理器104可以识别用作所识别的数据绑定表达中的项的各种模型对象属性,并且确定当各种属性中的每一个改变值时需要评估哪些特定数据绑定表达。如果该数据绑定表达包括该特定模型对象属性作为其项之一,则预处理器104可以将数据绑定表达标记为取决于特定模型对象属性。
构建器计算装置100可以至少部分地基于所述一个或多个相关性来生成附加源代码,该附加源代码用于响应于对模型对象的至少一个属性的改变来更新多个数据绑定表达所定义的至少一个相应数据绑定。例如,预处理器104可以输出定义一个或多个规则或评估操作的附加应用源代码,该一个或多个规则或评估操作用于当模型对象属性中的任何一个改变时确定哪些数据绑定表达需要评估。例如,如果用户.名(user.firstName)改变并且避免了或不评估与文本视图134B相关联的数据绑定表达,则预处理器104可以生成定义规则的源代码,该规则使得应用模块108仅评估与文本视图134A相关联的数据绑定表达。
构建器计算装置100可以生成包括至少部分基于布局文件的源代码、模型对象和附加源代码的机器可执行代码的应用。例如,当编译器106产生应用模块108的机器可执行代码时,编译器106可以将由预处理器104生成的附加源代码与应用源代码121和应用资源118一起进行编译。
以这种方式,当用户计算装置102执行应用模块114而不是每当任何模型对象属性值改变时就更新整个用户界面124时,由预处理器104创建的所生成的源代码可以使得应用模块114仅更新那些受改变影响的用户界面元素。不同于每当用户界面的任何模型对象属性值改变时就构建评估用户界面的每个绑定表达的应用的其他构建器计算装置,根据本公开的技术,将源代码与数据绑定进行编译的示例性构建器计算装置可以构建仅评估直接受模型对象属性值的改变影响的绑定表达的应用。以这种方式,示例性构建器计算装置可以创建应用,这些应用在用户计算装置处被执行时,执行较少的操作来保持用户界面的数据绑定,并且因此,与由其他构建器计算装置所构建的其他应用相比,操作更高效并且消耗更少的电力。
图2是图示根据本公开的一个或多个方面的可以由诸如图1的构建器计算装置100的示例性计算装置执行的软件编译和构建过程200的流程图。在图1的构建器计算装置100的构建器模块102的场境下描述了过程200。
过程200涉及通过执行用于产生处理器可执行应用代码的操作262-272来操纵和生成中间文件220-244。也就是说,中间文件220-244表示下述信息:当构建器模块102执行操作262-272中的每一个以生成在诸如图1的用户计算装置108的计算装置处可执行的代码时,构建器计算装置100的构建器模块102可以在过程200的各个阶段生成该信息(例如,数据)。过程200仅仅是构建器模块102可以执行的一个示例性软件编译和构建过程。在一些示例中,构建器模块102可以执行生成附加的或更少的中间文件和/或执行除了过程200中示出的中间文件和操作的附加或更少的操作。在一些示例中,构建器模块102可以以与图2中示出的和下面描述的顺序不同的顺序来执行过程200的操作。
过程200开始于构建器模块102执行对一个或多个应用资源220的资源编译262以产生所生成的源代码224A和224B(统称为“所生成的源代码224”)。根据定义,应用资源220表示指定诸如应用用户界面(例如,设计布局、对象、颜色和其他预定义特征)的特征的、应用的预定义特征(例如,所声明的特征和许可)的信息。相比于应用资源220,应用源代码226按照定义表示应用的内部工作背后的逻辑,包括应用和应用用户界面的预定义特征背后的逻辑。例如,虽然应用资源220可以定义应用的用户界面中的对象的形状、颜色或样式,但是应用源代码226可以替代地定义当用户与对象交互时由计算装置执行的操作。
由于应用资源220通常用标记语言(例如,可扩展标记语言[XML]等)来定义,并且应用资源226通常以通用或面向对象的编程语言(例如,Java、C等)来定义,因此构建器模块102可能需要对应用资源220执行各种资源编译262任务,以便以与用于定义由应用源代码226指定的应用的逻辑特征相似的通用或面向对象编程语言来翻译和指定应用的预定义特征。例如,构建器模块102的资产打包工具可以编译资源220并输出所生成的源代码224(例如,r.java文件),以用与应用源代码226所定义的应用的逻辑特征在编译时可协调的语言来指定应用的预定义特征。
构建器模块102可以执行所生成的源代码224A和应用源代码226的源编译264A,以产生虚拟机(VM)代码228A。VM代码228A按照定义是机器可读的可执行代码,该代码可以由诸如用户计算装置108的计算装置的一个或多个处理器(例如,在一个或多个处理器处执行的虚拟机模块)翻译和执行。例如,在Java编程语言中,.class文件是VM代码228A的示例。构建器模块102可以通过将与代码224A和226相关联的通用或面向对象的编程语言指令转换和协调成稍后可以由虚拟机解释和执行的VM代码228A,来执行对所生成的源代码224A和应用源代码226的源编译264A。
在一些示例中,构建器模块102可以可选地执行VM代码228A的源编译264B,以产生与VM代码228A不同的虚拟机(VM)代码228B。例如,一些计算平台可以作为预先存在的计算平台的高度定制化适应而存在。虽然预先存在的计算平台可以适用于某些应用,但是一些移动计算和/或可佩戴计算平台可以提供执行和性能上的各种增强,其需要在底层硬件上执行不同的VM代码和/或完全不同的虚拟机来执行不同的VM代码。构建器模块102可以可选地执行VM代码228A的源编译264B,以将VM代码228A翻译和重新定义成机器可读的可执行VM代码228B,VM代码228B可以由与可以执行VM的虚拟机模块不同的虚拟机模块来解释和执行。
在一些示例中,构建器模块102可以接收任何第三方虚拟机代码230作为输入,当构建器模块102执行VM代码228A的源编译264B时,该第三方虚拟机代码230可需要进行编译。例如,构建器模块102可以通过进一步编译开发人员已经指示构建器模块102包括在VM代码228B构建阶段中的任何公开可用或其他第三方VM代码230来将VM代码228A编译成VM代码228B。
在应用构建268阶段,构建器模块102可以将VM代码228B与资源代码224B和其他资源236打包,以产生单个应用包238。其他资源236通常表示任何“未编译”资源(例如,图像等)。构建器模块102可以将应用包238上传到应用库,计算装置102可以从应用库下载并安装应用包238。计算装置102的一个或多个处理器可以执行应用包238。例如,在计算装置102的一个或多个处理器处执行的VM可以使得一个或多个处理器执行由VM代码228A/228B定义的指令。
在一些示例中,在构建器模块102构建应用包238之后,构建器模块102可以在上传或以其他方式释放应用包238之前执行附加操作,以供诸如图1的用户计算装置108的一个或多个计算装置的后续执行。例如,在一些情况下,构建器模块102可以对应用包238执行调试和/或发布签名270,以创建带签名的应用包242。也就是说,在安装应用包238的内容之前,一些计算装置可能要求内容具有标记内容作者(例如,开发人员)的标识符(例如,位、数字签名、证书或某种其他标记)以及将内容指定为应用的调试或发布版本的信息。构建器模块102可以用内容是调试或发布版本的指示对应用包238的内容进行数字签名,并且将标记的内容作为带签名的应用包242输出。
在一些情况下,构建器模块102可以在上传或以其他方式释放应用包244以供诸如图1的用户计算装置108的一个或多个计算装置的后续执行之前,对准272带签名的应用包242以创建带签名和对准的应用包244。例如,构建器模块102可以执行带签名的应用包242的对准272,以确保与包242相关联的所有未压缩数据从相对于文件开始的特定(存储器)对准开始。例如,通过执行对准272,构建器模块102可以使得包242内的所有未压缩数据,诸如图像或其他未压缩文件,在双字节、四字节或其他字节级边界上被对准。以这种方式,即使一些部分包含具有对准限制的二进制数据,包244的所有部分随后也可以直接通过存储器调用进行访问。通过对准带签名的应用包242,构建器模块102可以使得计算装置能够使用较少的存储器来执行应用包244。
图3是图示根据本公开的一个或多个方面的构建器计算装置300的框图,构建器计算装置300作为配置为执行示例软件编译和构建过程的示例性计算装置。图3仅图示可以存在构建器计算装置300的一个特定示例和构建器计算装置300的其他示例。图3的构建器计算装置300可以包括图1的构建器计算装置100中所包括的组件的子集,并且可以包括图3中未示出的附加组件。构建器计算装置300可以执行图2的过程200。下面,在图1的构建器计算装置100和图2的过程200的场境中,描述构建器计算装置300。
在图3的示例中,构建器计算装置300可以是移动计算装置(例如,移动电话)或非便携式计算装置(例如,台式计算机、膝上型计算机、工作站等)。在任何情况下,构建器计算装置300是被配置为将代码编译为构建过程的一部分(例如,图2的过程200)的软件开发装置,构建过程用于创建一个或多个可执行软件应用,诸如图2的应用包238-244。
如图3的示例中所示,构建器计算装置300包括一个或多个处理器340、一个或多个输入组件342、一个或多个输出组件344、一个或多个通信组件346以及一个或多个存储组件348。构建器计算装置300的存储组件348包括构建器模块360、应用资源320、所生成的源代码324、应用源代码326和应用包328。构建器模块360包括预处理器模块362和编译器模块364。
通信信道350可以将组件340、342、344、346和348中的每一个进行互连以用于组件间通信(物理地、通信地和/或操作性地)。在一些示例中,通信信道350可以包括有线和/或无线系统总线、有线和/或无线网络连接、进程间通信数据结构或用于在构建器计算装置300的内部组件之间通信数据的任何其他方法。
构建器计算装置300的一个或多个输入组件342可以代表构建器计算装置300的各种其他组件和模块来接收输入。例如,在用于写入应用源代码326和/或应用资源320的文本编辑器处的来自装置300的用户的键盘输入。输入的示例是触觉、音频和视频输入。在一个示例中,构建器计算装置300的输入组件342包括存在敏感显示器、触摸敏感屏幕、鼠标、键盘、语音响应系统、摄像机、麦克风或用于检测来自人或机器的输入的任何其他类型的装置。
构建器计算装置300的一个或多个输出组件344可以生成供其他计算装置、系统和装置300的用户接收的输出。例如,一个或多个输出组件344可以在输出组件344的显示器处呈现文本编辑器的用户界面,装置300的用户可以从显示器查看应用源代码326和/或应用资源320。输出的示例是触觉、音频和视频输出。在一个示例中,构建器计算装置300的输出组件344包括存在敏感显示器、声卡、视频图形适配器卡、扬声器、阴极射线管(CRT)监视器、液晶显示器(LCD)、发光二极管(LED)显示器、有机发光二极管(OLED)显示器或用于生成对人或机器的输出的任何其他类型的装置。
构建器计算装置300的一个或多个通信单元346可以经由一个或多个有线和/或无线网络通过在一个或多个网络上发送和/或接收网络信号来与外部装置通信。通信单元346的示例包括网络接口卡(例如,诸如以太网卡)、光学收发器、射频收发器、GPS接收器或可以发送和/或接收信息的任何其他类型的装置。通信单元346的其他示例可以包括短波无线电装置、蜂窝数据无线电装置、无线网络无线电装置以及通用串行总线(USB)控制器。
一个或多个处理器340可以在构建器计算装置300内实现功能和/或执行指令。例如,构建器计算装置300上的处理器340可以接收并执行由执行模块360、362和364的功能的存储组件348所存储的指令。由处理器340执行的这些指令可以使得构建器计算装置300在程序执行期间将信息存储在存储组件348内。处理器340可以执行模块360、362和364的指令,以使得模块360、362和364执行图2的过程200。也就是说,模块360、362和364可以由处理器340操作,以执行构建器计算装置300的各种动作或功能,例如,用从所生成的源代码324和应用源代码326产生从用于构建应用包328的应用资源320所生成的源代码324。
构建器计算装置300内的一个或多个存储组件348可以存储用于在构建器计算装置300的操作期间的处理的信息(例如,构建器计算装置300可以存储在构建器计算装置300处的执行期间由模块360、362和364访问的数据)。在一些示例中,存储组件348是瞬时存储器,意味着存储组件348的主要目的不是长期存储。构建器计算装置300上的存储组件348可以被配置为作为易失性存储器对信息进行短期存储,并且因此如果断电则不保留所存储的内容。易失性存储器的示例包括随机存取存储器(RAM)、动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM)以及本领域已知的其他形式的易失性存储器。
在一些示例中,存储组件348还包括一个或多个计算机可读存储介质。存储组件348可以被配置为存储比易失性存储器更大量的信息。存储组件348还可以被配置为作为非易失性存储器空间对信息进行长期存储并且在通电/断电周期之后保持信息。非易失性存储器的示例包括磁性硬盘、光盘、软盘、闪存或电可编程存储器(EPROM)或电可擦除可编程(EEPROM)存储器的形式。存储组件348可以存储与模块360、362和364相关联的程序指令和/或信息(例如,数据)、应用资源320、所生成的源代码324、应用源代码326和应用包328。
模块360、362和364可以使用驻留在构建器计算装置300中并在其上执行的软件、硬件、固件或者硬件、软件和/或固件的组合来执行操作。构建器计算装置300可以用诸如处理器340的单个或多个处理器来执行模块360、362和364。构建器计算装置300可以将模块360、362和364作为在构建器计算装置300的底层硬件组件上执行的虚拟机(VM)来执行。在一些示例中,模块360、362和364可以被布置成远离构建器计算装置300并且可由构建器计算装置300进行远程访问,例如,作为由构建器计算装置300经由网络云访问的一个或多个网络服务。
构建器模块360是图1的构建器模块102的更具体示例。构建器模块360可以执行与构建器模块102执行的那些操作相同、附加或更少的操作。例如,构建器模块360可以执行图2的过程200、过程200的子集或超出过程200的附加操作,以解释、操纵和生成中间文件320-326,作为用于生成应用包328的构建过程的一部分。
构建器模块360包括编译器模块364。编译器模块364可以对所生成的源代码324和应用源代码326执行源编译操作,以产生诸如用户计算装置108的计算装置可以例如作为虚拟机执行的机器可读的、可执行代码。例如,编译器模块364可以将与代码324和326相关联的通用或面向对象的编程语言指令翻译成编译器模块364作为应用包328封装的单个VM代码集并且进行协调。例如,编译器模块364可以包括用于将所生成的源代码324和应用源代码326翻译成机器可读指令的Java或C编译器,机器可读指令在由计算装置执行时,使得一个或多个处理器执行与应用包328相关联的操作。在一些示例中,编译器模块364可以执行用于构建应用包328(例如,签名、对准和其他操作,诸如图2的过程200的操作264A-272)的附加操作。在编译器模块364已经完成将代码324和326编译成单个应用包328之后,构建器计算装置300可以输出应用包328,以供在诸如用户计算装置108的远程计算装置处的后续下载、安装和执行。
构建器模块360还包括预处理器模块362。相对于图4A-4F、图5A-5C和图6更详细地描述预处理器模块362。
通常,预处理器模块362可以针对应用资源320执行预编译阶段的资源编译操作(例如,过程200中的资源编译262),以产生所生成的源代码324,编译器模块362接收源代码324作为用于构建应用包328的输入。由预处理器模块362执行的资源编译操作可以包括用于将应用资源320翻译成所生成的源代码324的操作,所以由应用资源320定义的应用的预定义特征(例如,布局、视图设置等)被替代地以编译器模块364可读的通用或面向对象的编程语言格式进行定义。例如,预处理器模块362可以包括将应用资源320的XML代码编译成可由编译器模块364的Java或C编译器解释的逻辑Java或C代码指令的XML编译器。
除了将由应用资源320定义的特征转换成通用或面向对象的编程指令之外,预处理器模块362可以针对应用资源320执行预编译、相关性分析操作,作为用于改善当应用数据包328被安装诸如图1的用户计算装置108的计算装置出并且在此处执行时应用数据包328可以执行的数据绑定操作的运行时性能的方式。换句话讲,预处理器模块362可以针对数据绑定表达来分析应用资源320,并且产生附加生成的源代码324,编译器模块362可以将源代码324构建到应用包328中,以减少计算装置花费用于评估运行时间期间的数据绑定表达的时间量。
如本文所使用的,术语“数据绑定表达”和“绑定表达”通常是指诸如应用资源320的应用资源文件中具有标识符或语法的特定表达或语句,该标识符或语法将该表达识别为定义图形用户界面的用户界面元素与模型对象之间的相应数据绑定的绑定表达。例如,以下的伪代码表示示例性数据绑定表达,该示例性数据绑定表达定义图形用户界面的布局文件的“文本视图(TextView)”(例如,字符串)元素的如“用户(user)”模型对象所指定的值。
<TextView text="@{user.fullName}"/>
当被编译和评估时,以上表达可以使得与文本视图(TextView)的值对应的图形用户界面的一部分包括与用户模型对象的全名(fullName)属性对应的字符串。
如图1中所指示的,由其他计算装置构建的应用在计算装置处执行时,可能消耗附加的计算资源来执行数据绑定操作。例如,当更新用户界面组件时仅仅计算布局(例如,决定用户界面上的每个可见组件的尺寸)可能花费数十毫秒(例如,16毫秒)的有价值的处理器时间。当仅与单个用户界面组件相关联的数据和对应的数据绑定表达已经改变时,其他计算装置可以重新评估和更新整个用户界面的所有数据绑定表达。这样,其他计算装置可以重复花费数十毫秒来重新计算布局,以确保用户界面保持被刷新,即使仅布局的很小部分会发生改变。
与需要应用数据包328在计算装置处执行的同时,每当布局的组件改变时,必须重复地重新评估应用资源320中定义的整个布局的所有数据绑定表达相反,无论何时应用包328确定了特定数据绑定表达已经变成无效或以其他方式需要重新评估时,预处理器模块362都生成专用的生成的源代码324,该源代码324使得计算装置仅评估那些应该被评估的数据绑定表达。换句话说,预处理器模块362用作高级静态分析工具,其分析用于数据绑定语句和应用源代码326中包含的表达的应用资源320(例如,基于XML的布局文件),以求解可以改变的数据之间的相关性以及布局或使用改变后的数据的布局的一部分。根据该分析,预处理器模块362可以产生所生成的源代码324(例如,面向对象的代码),源代码324使得应用包328能够通过仅更新已经改变的布局的受影响部分(例如,视图)来以更有效方式更新用户界面。
例如,预处理器模块362可以解析用于数据绑定表达的应用资源320并且从数据绑定表达构建表达树。预处理器模块362可以分析表达树中的每一个以开发相关性树(例如,指定用于相对于另一数据绑定表达评估每个表达的规则),以便用户确定何时以及是否在其他表达值改变时评估数据绑定表达。换句话说,对于每个数据绑定表达,预处理器模块362可以产生通用或面向对象的编程代码,通用或面向对象的编程代码在被编译和执行时,指示应用包328何时以及是否基于布局的任何其他数据绑定表达是否已被无效来评估布局的任何给定绑定表达。例如,预处理器模块362可以输出所生成的源代码324,源代码324包括下述操作:该操作用于将数据改变标识符标志与应用包328可以在运行时引用的位图进行比较,以响应于模型对象属性值改变的改变来确定应该何时评估布局文件的绑定表达。
图4A-4F是一系列原理图,图示了根据本公开的一个或多个方面的通过数据绑定来编译源代码的示例性计算装置所执行的示例性预编译过程的不同阶段。以下在图3的构建器计算装置300的场境下描述图4A-4F。
构建器计算装置300的预处理器模块362可以输出所生成的源代码324(例如,数据绑定类)。所生成的源代码324在由编译器模块364与应用源代码326一起编译时,可以产生应用包328,(例如,当作为应用模块114在诸如图1的用户计算装置108的计算装置处安装和执行时)保持跟踪当模型对象属性改变时应该更新图形用户界面的哪些用户界面元素(例如,视图134A和134B)以及取决于应该被评估的用户界面元素来处理这些更新的绑定表达。
例如,考虑图4A,图4A包括表示来自应用资源320的示例性布局文件的源代码的一部分。预处理器模块362可以接收应用资源320作为输入,并且解析图4A的布局文件的源代码。基于该解析,预处理器模块362可以针对每个布局文件来提取并保持模型中的变量定义、导入语句和表达。换句话说,预处理器模块362可以至少部分地基于解析定义图形用户界面的布局文件的源代码来识别多个数据绑定表达。多个数据绑定表达中的每一个可以定义图形用户界面的用户界面元素和模型对象之间的相应数据绑定。
预处理器模块362可以至少部分地基于多个数据绑定表达来确定多个数据绑定表达中的每一个之间的一个或多个相关性。也就是说,预处理器模块362可以基于多个数据绑定表达来生成多个表达树。多个表达树中的每个表达树可以对应于多个数据绑定表达中的特定数据绑定表达,并且可定义模型对象的一个或多个属性。模型对象的一个或多个属性可以包括模型对象的至少一个属性,即该特定数据绑定表达的项。
例如,图4B示出了包括预处理器模块362可以基于图4A的布局文件的解析而生成的三个表达树的表。预处理器模块362可以根据图4B的表达树中定义的关系来产生保持图4A的布局文件的数据绑定表达的各项和模型对象之间的关系的数据结构。图4B的表的左侧列包括由预处理器模块362识别的特定绑定表达,并且图4B的表的右侧列包括与该特定绑定表达相关联的对应的表达树类型数据结构。预处理器模块362可以生成图4B中示出的表达树,以用于分析图4A的布局文件的绑定对象。
在一些示例中,绑定表达可以被定义为表示表达树中的每一个的根的表达。例如,关于图4B,用户.名称(user.name)以及用户.名称(user.name)+“”+用户.年龄(user.age)以及用户.朋友.年龄(user.friend.age)+用户.年龄(user.age)都被认为是绑定表达。
预处理器模块362可以至少部分地基于多个数据绑定表达来确定多个数据绑定表达中的每一个之间的一个或多个相关性。每个绑定表达是用于图形用户界面的元素和模型对象的属性之间的数据绑定的构建块。在一些示例中,在确定一个或多个相关性时,预处理器模块362可以基于多个表达树来生成相关性树,该相关性树定义在评估多个数据绑定表达中的其他数据绑定表达之前要被评估的多个数据绑定表达中的一个或多个数据绑定表达。例如,基于图4A中示出的布局,预处理器模块362可以确定用以下列表表示的相关性树:
1.用户(user)
2.用户.名称(user.name)
3.““
4.用户.名称(user.name)+““
5.用户.年龄(user.age)
6.用户.名称(user.name)+“”+用户.年龄(user.age)
7.用户.朋友(user.friend)
8.用户.朋友.年龄(user.friend.age)
9.用户.朋友.年龄(user.friend.age)+用户.名称(user.name)
上述列表的九个元素中的每一个对应于不同的表达或绑定表达(例如,具有直接指派给视图的最终结果的表达)。表达和绑定表达的以上列表也可以由预处理器模块362以保持表达之间的一个或多个相关性。例如,如果以上列表中的每行表示不同的带编号表达,则预处理器模块262可以将以上列表表示为指示在表达之间存在的表达相关性的以下相关性树:
1.用户(user)
2.[1].名称(name)
3.““
4.[2]+[3]
5.[1].年龄(age)
6.[4]+[5]
7.[1].朋友(friend)
8.[7].年龄(age)
9.[8]+[1]
表达相关性的以上列表中的每个绑定表达或者也称为相关性树取决于至多两个其他绑定表达。在其他示例中,绑定表达可以取决于多于两个的其他绑定表达。实际上,在一些示例中,绑定表达可以取决于任何数目的表达。
预处理器模块362可以至少部分地基于一个或多个相关性来生成附加源代码,该附加源代码用于响应于对模型对象的至少一个属性的改变来更新由多个数据绑定表达定义的至少一个相应数据绑定。例如,对于来自应用资源320的每个布局文件,预处理器模块362可以生成所计算的绑定表达相关性的模型表示作为所生成的源代码324的一部分。
在该步骤中,预处理器模块362可能已经确定了图4A的布局文件的绑定表达的相关性树,使得预处理器模块362可以针对特定绑定表达来确定在评估特定绑定表达之前应该计算哪些其他绑定表达。例如,遵照上述相关性树的规则,预处理器模块362可以在评估绑定表达[2]用户.名称([2]user.name)时首先评估用户。
一些数据绑定技术可以使得应用开发人员能够将模型对象标记为“可观察的”。当模型对象是“可观察的”时,该模型对象的属性可以被“无效”(例如,当与该属性相关联的数据改变时)。当模型对象的属性改变值并因此变成无效时,依赖于该属性的对应表达也变为无效。当模型对象的属性无效时,预处理器模块362可以重新评估绑定表达,以便确保用户界面包括准确的刷新后的信息。
基于以上的相关性树,预处理器模块362可以开发与所识别的绑定表达相关联的规则,并且使用这些规则来生成源代码,源代码使得应用包238在运行时仅更新当所识别的绑定表达所依赖的项或模型对象属性改变时所识别的绑定表达。图4C示出了由预处理器模块362生成的规则表。图4C的表中的每行对应于不同的绑定表达,并且包括关于哪个或哪些模型对象属性可以使得该表达变得无效的信息以及应该何时基于何时评估其他表达来评估表达的指示。换句话说,使用图4C的规则,预处理器模块362可以至少部分地基于一个或多个相关性来生成附加源代码,该附加源代码用于响应于对模型对象的至少一个属性的改变来更新多个数据绑定表达所定义的至少一个相应数据绑定。
在一些示例中,为了跟踪哪些绑定表达响应于对象模型属性的改变而需要更新,预处理器模块362可以使得应用包328在被执行时保持指示模型对象属性的值何时改变的“状态”标志。可以生成由预处理器模块362产生的附加源代码,以将应用包328配置为在被执行时响应于模型对象的属性改变来更新状态标志。
例如,以下是用于对象模型的不同属性的示例性“无效标记(invalidate flags)”的列表。
0b000001:用户(user)
0b000010:用户.朋友(user.friend)
0b000100:用户.名称(user.name)
0b001000:用户.年龄(user.age)
0b010000:用户.朋友.年龄(user.friend.age)
0b100000:任何无效
可以被单独无效的每个“可观察”对象模型属性被指派无效标志列表中的单个位标识符。每个“不可观察的”可以不被指派无效标志列表中的位标识符,因为按照定义,不可观察的属性没有改变,并且因此不会使得绑定表达需要被重新评估。在以上无效标志的列表中,名称(name)属性、朋友(friend)属性和年龄(age)属性都是具有相应的无效标志的所有可观察对象模型属性。
在确定以上无效标志的列表并且执行以上绑定表达分析之后,预处理器模块362生成源代码,源代码在被执行时,使得应用确定绑定表达何时无效、应该何时评估绑定表达以及应该在评估特定绑定表达时评估哪些其他绑定表达。当且仅当相关绑定表达本身或其无效标志无效时,预处理器模块362可以确定特定绑定表达是无效的,并且还可以确定首先(即,在评估特定绑定表达之前)应该评估特定数据绑定表达的所有相关性。
例如,图4D示出了根据以上无效标志的列表中表达的图4C的表的信息。在图4C的表中,要注意,对于依赖于多于一个的对象模型属性的某些绑定表达,“它何时无效(whenit is invalid)”标志等于“何时应该评估它(when it should be evaluated)”标志。
因此,预处理器模块362生成源代码,源代码在被执行时,使得应用确定绑定表达何时无效、应该何时评估绑定表达以及应该在评估特定绑定表达时评估哪些其他绑定表达。在运行时,当预处理器模块362所生成的源代码由诸如应用模块114的应用执行时,所执行的源代码使得应用保存保持图4D的标志的位图。每当无效标志指示绑定表达无效时,其对应的标志位被翻转(例如,从0到1)。当应用更新由布局文件定义的图形用户界面时,应用根据这些标志值来评估绑定表达的绑定对象。以这种方式,仅评估需要被评估的绑定表达。在评估之后,对应的无效标志被重置(例如,从1翻转成0)。
预处理器模块362所生成的源代码可以使得应用在运行时基于标志来评估在多个数据绑定表达中的每个之间的一个或多个相关性中的每一个。预处理器模块362所生成的源代码进一步可以使得应用通过以下步骤在运行时评估多个数据绑定表达中的每一个之间的一个或多个相关性中的每一个:至少用标志来掩蔽与多个绑定表达中的特定绑定表达相关联的相应位图,该相应位图定义一个或多个相关性中的哪一个与该特定绑定表达关联。例如,图4E示出了可以由预处理器模块362生成的示例性源代码,该源代码用于配置应用以在运行时基于以上相关性分析和无效位图来评估绑定表达。图4E的示例源代码示出了对于每个绑定表达,在无效标志(例如,“脏标志(dirtyFlags)”)和相应的“它应该何时被评估”标志之间执行逐位和操作。
预处理器模块362所生成的源代码还可以使得应用在运行时响应于基于标志评估多个数据绑定表达中的每一个之间的一个或多个相关性中的每一个而在运行时更新多个数据绑定表达中的至少一个数据绑定。例如,图4F示出了可以由预处理器模块362生成的附加示例性源代码,该附加示例性源代码用于配置应用以在运行时更新一定需要更新的所有绑定表达。在图4F的源代码中,可以使得应用在运行时基于图4E的表中的绑定表达的“它何时无效(when it is invalid)”标记来在运行时重新评估绑定表达。
在一些示例中,虽然源代码用于更新布局,但是预处理器模块362可以执行以下的简化步骤。预处理器模块362可以将所有绑定表达标记为未处理。预处理器模块362接下来可以选择被标记为未处理的绑定表达,并且如果无法找到绑定表达,则预处理器模块362可以终止该过程。从所选择的绑定表达,预处理器模块362可以选择其相关性已经被处理的绑定表达,并且预处理器模块362可以生成将在必要时评估绑定表达的代码(例如,使用“何时应该评估它(when it should be evaluated)”标志)。预处理器模块362可以将这些绑定表达标记为已处理。
在一些示例中,由于绑定表达之间的相关性,可以存在标志之间的某些封装。例如,可以保证图4D的表中的用户.年龄(user.age)的“应该读取标志(should read flags)”是应该读取用户标志的子集。这是给定的,因为无法存在以下情况:因为用户.年龄(user.age)取决于用户,所以执行应用需要评估用户.年龄(user.age)而非用户(user)。后者可能不为真,因为执行应用可能需要对于用户.名称(user.name)是否无效来对用户进行评估,但是可能不需要读取用户.年龄(user.age)。有时,这种固有性(inheriancy)表示精确相等。例如,用于用户.朋友(user.friend)的“应该读取标记(should read flags)”可以精确等于用于用户.朋友.年龄(user.friend.age)的“应该读取标记(should readflags)”。这可能是因为,这两个对象模型属性仅存在于同一绑定表达(用户.朋友.年龄(user.friend.age)+用户.年龄(user.age))中。
例如,如果存在包括用户.朋友.年龄(user.friend.age)的另一绑定表达,则将会不是这样。预处理器模块362利用该关系来减少在运行时执行应用所执行的分支数。增强算法可以使得预处理器模块362如下操作:将所有绑定表达标记为未处理,选择被标记为未处理的绑定表达,并且如果无法找到,则终止。然而,从所选择的绑定表达中选取相关性全部被标记为已处理(也称为“Expr A”)的绑定表达。预处理器模块362可以生成用于读取绑定表达的源代码并且将其标记为已处理。该代码可以在“if”语句内生成,该语句将脏标志(dirty flags)与Expr A的“应该读取标志(should read flags)”进行比较。
预处理器模块362可以从取决于Expr A的绑定表达列表中选择被标记为未处理的表达,但是它们的所有相关性都已处理(也称为Expr B)。预处理器模块362可以生成用于读取Expr B的源代码。如果Expr B的“应该读取标志(should read flags)”不是Expr A,则预处理器模块362可以生成创建if语句以检查这些标志的源代码。否则,预处理器模块362可以生成忽略“if”语句的源代码(因为它将一直为真)并且将Expr B标记为已处理。最后,预处理器模块362可以生成遍历Expr B的相关性的源代码并且递归地继续该步骤,直到无法找到这样的绑定表达。
假设执行由预处理器模块362生成的代码的应用具有对评估任何绑定表达的许可,上述算法可以正常工作。然而,在一些示例中(例如,当表达语言支持条件评估)时,执行由预处理器模块362生成的代码的应用可能没有对评估任何绑定表达的许可。例如,以下伪代码表示“条件绑定表达”的示例。
<TextViewplatform:id=”@+id/friend_or_self_name”
platform:text=”@{user.friend==null?user.name:user.friend.name}”/>
当执行由预处理器模块362生成的代码的应用时,当且仅当用户.朋友(user.friend)等于空的条件为真时,应用应该评估用户.名称(user.name)。另外,当且仅当用户.朋友(user.friend)等于空的条件为假时,应用应该评估用户.朋友.名称(user.friend.name)。这样,对于以上示例性条件绑定表达,预处理器模块362可以生成使得应用评估用户.名称(user.name)的源代码,只要该应用具有用户(user)(例如,满足用户.名称(user.name)的所有相关性)。
预处理器模块362可以生成当绑定表达处于条件后面时使得应用避免从绑定表达继承“应该读取标志(shouldReadFlag)”标签的源代码。对于上面的示例,预处理器模块362可以生成使得应用在朋友_或_自己_名称(friend_or_self_name)视图的绑定表达无效时避免获得用于用户.名称(user.name)的获得应该无效(gettingshouldInvalidate)标志。
对于这些情况,预处理器模块362可以创建条件相关性,该条件相关性使得执行应用将这些视为不保证执行的较低级相关性。对于上述示例,绑定表达取决于具有条件用户.朋友(user.friend)等于空的用户.名称(user.name)。该相关性可以被称为条件相关性。
预处理器模块362可以生成使得应用针对每个条件表达创建两个标志的源代码。对于以上语言,绑定表达可以接收两个标志,一个表示谓词为真,并且另一个表示谓词为假(在本文中也分别称为“标志T(flagT)”和“标志F(flagF)”)。为了说明,除了为确定何时绑定表达可以无效而创建的前一个标志之外,标志T(flagT)和标志F(flagF)还表示新的标志。
标志T(flagT)和标志F(flagF)被添加到绑定表达的每个相关性的应该读取标志(shouldReadFlags)。对于以上示例,可以将标志T(flagT)添加到用户.名称(user.name)的应该读取标志(shouldReadFlags),可以将标志F(flagF)添加到用户.朋友.名称(user.friend.name)的应该读取标志(shouldReadFlags)。
预处理器模块362可以不选择在其相关性树中具有条件相关性的表达(例如,绑定表达可以不具有条件相关性,但是其相关性之一可以具有条件相关性)。当评估作为另一条件相关性的谓词的表达时,预处理器模块362可以根据结果来更新脏标志(dirtyFlags)变量。如果谓词解析为真,则预处理器模块362可以将脏标志(dirtyFlags)的标志T(flagT)位设置成1。如果谓词解析为假,则预处理器模块362可以将脏标志(dirtyFlags)的标志T(flagT)位设置成1。
在设置这些标志之后,预处理器模块362可以遍历所有条件相关性,找到取决于该谓词并提升它们的条件。升高相关性意味着将其移至正常的相关性(例如,换句话说,解锁相关性表达的评估)。当评估表达时,预处理器模块362可以不再直接将绑定表达标记为正在处理。替代地,预处理器模块362可以检查预处理器模块362是否也已经覆盖了其所有条件情况。如果预处理器模块362覆盖了所有条件情况,则预处理器模块362可以将其标记为已读。如果预处理器模块362尚未覆盖其条件情况,则预处理器模块362可以将条件情况保留在列表中。
图5A-5C是图示了根据本公开的一个或多个方面的由示例性计算装置执行的附加示例性预编译、绑定表达分析过程的不同阶段的一系列原理图。以下,在图3的构建器计算装置300的场境下描述图5A-5C。
图5A示出了包括绑定表达相关性之间的循环相关性的布局文件的示例绑定表达。“a”和“b”二者表示绑定表达相关性。如以上关于图4A-4F描述的,由预处理器模块362执行的表达选择步骤可以忽略具有条件相关性的任何绑定表达。对于该示例,评估“a>3”和a可以由于“视图1(view1)”而有条件地取决于“a”。
“a>3”和a之间的条件相关性可以创建死锁,其中预处理器模块362既无法找到要评估的任何东西,预处理器模块362也不能完成生成表达列表。清晰起见,预处理器模块362将在评估a或“a>3”之前等待要解析的a(因为视图1(view1))。在一些示例中,预处理器模块362可以在计算“应该读取标志(should read flags)”的同时执行相关性消除,而不是等待。
当计算应该读取(should read)标志时,如果表达具有条件相关性,则预处理器模块362可以检查将触发谓词的评估的所有可能的无效集合。然后,预处理器模块362可以检查条件表达是否将被计算为计算这些相关性。对于上述示例,当针对a计算应该读取(should read)标志时,预处理器模块362可以确定计算视图1中的谓词(例如,“a>3”),应用在运行时可能必须计算a,因为”a>3”取决于a。由于该原因,预处理器模块362可以放弃条件。图5B示出了基于以上关于图5A描述的分析,预处理器模块362在生成用于评估绑定表达中的循环相关性的源代码时使用的无效标志的示例性列表。图5C示出了可以由预处理器模块362生成的使得应用在运行时处理以上关于图5A描述的分析的示例性源代码。
图6A-6C是图示根据本公开的一个或多个方面的由示例性计算装置执行的附加示例性预编译、绑定表达分析过程的不同阶段的一系列原理图。以下,在图3的构建器计算装置300的场境下描述图6A-6C。
图6A示出了来自包括具有圆形相关性的绑定表达的布局文件的另一示例性绑定表达。在这种情况下,“b”由于“视图1”而具有对“a”的条件相关性,并且“a”由于“视图2(view2)”而具有对“b”的条件相关性。如以上关于图4A-4F描述的,预处理器模块362所执行的评估路径解析可以避免产生死锁并且开始读取“a”和“b”,但是永远不会终止,因为预处理器模块362可能无法将“a”或“b”标记为正在被完全读取,因为要完全准备好“a”,预处理器模块362需要完全准备好“b”(反之亦然)。
在一些示例中,预处理器模块362可以利用称为“部分读取”的技术来处理这种内部表达相关性。当表达无法被标记为已处理时,预处理器模块362仍然可以将表达标记为被部分处理,并且随后的评估可以仅包括剩余的位。
当预处理器模块362无法将表达标记为完全读取时,发生部分读取。预处理器模块362仍然可以跟踪预处理器模块362读取该表达的位的列表。下一次表达显示在未处理列表中时,预处理器模块362可以仅考虑表达的未读取位,同时生成避免完全重新评估表达的代码。这样,对于图6A的代码样本,预处理器模块362可以首先分别读取针对“视图1(view1)”和“视图2(view2)”的无效的“a”和“b”,然后预处理器模块362可以分别从“视图1(view1)”和“视图2(view2)”读取针对其条件的“a”和“b”。
图6B示出了基于以上关于图6A描述的分析,预处理器模块362在生成用于评估绑定表达中的循环相关性的源代码时使用的无效标志的示例性列表。图6C示出了可以由预处理器模块362生成的使得应用在运行时处理以上关于图6A描述的分析的示例性源代码。
图7是图示根据本公开的一个或多个方面的作为通过数据绑定来编译源代码的示例性计算装置所执行的示例性操作的操作710-716的流程图。以下,在图3的构建器计算装置300的场境下描述图7。
在操作中,绑定计算装置300可以至少部分基于解析定义图形用户界面的布局文件的源代码来识别多个数据绑定表达,每个数据绑定表达定义图形用户界面的用户界面元素和模型对象之间的相应数据绑定(710)。例如,当构建器模块360开始用于生成应用包328的构建过程时,预处理器模块362可以解析应用资源320,以识别定义用户界面的元素和模型对象之间的数据绑定的任何和所有绑定表达。
构建器模块360可以生成源代码324而不是产生应用,源代码324定义用于提高应用的效率的规则并且使得应用仅评估取决于最近改变的属性值的必要绑定表达,应用是在当在诸如图1的用户计算装置108的用户计算装置处被执行时,每当模型对象的属性改变时,花费评估用户界面的各个和每个绑定表达的有价值的计算资源。绑定计算装置300可以至少部分地基于多个数据绑定表达来确定多个数据绑定表达中的每一个之间的一个或多个相关性(712)。例如,预处理器模块362可以分析所识别的绑定表达的项,以找到绑定表达之间的匹配项和其他有关的相关性。换句话说,预处理器模块362可以在评估每个绑定表达时,识别需要评估的各种模型对象属性中的相似度。
绑定计算装置300可以至少部分地基于一个或多个相关性来生成附加源代码,该附加源代码用于响应于对模型对象的至少一个属性的改变来更新多个数据绑定表达所定义的至少一个相应数据绑定(714)。例如,预处理器模块362可以生成源代码324,源代码324使得应用包328在执行期间创建状态标志,以跟踪对模型对象的属性改变以及与定义一个或多个相关性中的哪一个与该特定绑定表达相关联的绑定表达中的每一个相关联的相应位图。预处理器模块362还可以生成源代码324,源代码324在执行期间使得应用包328执行在状态标志和各个位图中的每一个之间的掩蔽操作(例如,逐位和操作),以确定响应于模型对象属性的改变而需要评估哪个绑定表达。
绑定计算装置300可以生成应用(716),应用包括至少部分地基于布局文件的源代码、模型对象和附加源代码的机器可执行代码。例如,编译器模块364可以接收应用资源320、所生成的源代码324和应用源代码326作为输入,并且产生(例如,遵循图2的过程200)应用包328作为输出。在一些示例中,构建器计算装置300可以将应用包328输出到诸如用户计算装置108的远程装置,以供后续执行。
条款1.一种方法,包括:由计算装置并且至少部分地基于解析定义图形用户界面的布局文件的源代码来识别多个数据绑定表达,其中,多个数据绑定表达中的每一个定义在图形用户界面的用户界面元素和模型对象之间的相应数据绑定;由计算装置至少部分地基于多个数据绑定表达来确定在多个数据绑定表达中的每一个之间的一个或多个相关性;由计算装置至少部分地基于一个或多个相关性来生成用于响应于模型对象的至少一个属性的改变来更新由多个数据绑定表达定义的至少一个相应数据绑定的附加源代码;以及由计算装置生成包括至少部分地基于布局文件的源代码、模型对象和附加源代码的机器可执行代码的应用。
条款2.根据条款1的方法,进一步包括:由计算装置基于多个数据绑定表达来生成多个表达树,其中,多个表达树中的每个表达树对应于多个数据绑定表达中的特定数据绑定表达并且定义模型对象的一个或多个属性,该一个或多个属性包括作为特定数据绑定表达的项的模型对象的至少一个属性,其中,至少部分地基于多个表达树来进一步确定多个数据绑定表达中的每一个之间的一个或多个相关性。
条款3.根据条款2的方法,进一步包括:由计算装置基于多个表达树来生成相关性树,相关性树定义在评估多个数据绑定表达中的其他数据绑定表达之前要评估的该多个数据绑定表达中的一个或多个数据绑定表达,其中,至少部分地基于相关性树来进一步确定多个数据绑定表达中的每一个之间的一个或多个相关性。
条款4.根据条款1-2中的任一项的方法,其中,进一步生成附加源代码,附加源代码线用于响应于模型对象的至少一个属性的改变来更新标志,该标志定义对模型对象的至少一个属性的改变。
条款5.根据条款4的方法,其中,进一步生成附加源代码,附加源代码用于基于标志来评估多个数据绑定表达中的每一个之间的一个或多个相关性中的每一个。
条款6.根据条款5的方法,其中,进一步生成附加源代码,附加源代码用于响应于基于标志评估多个数据绑定表达中的每一个之间的一个或多个相关性中的每一个来更新多个数据绑定表达中的至少一个数据绑定。
条款7.根据条款5-6中的任一项的方法,其中,进一步生成附加源代码,附加源代码用于通过至少下述来评估多个数据绑定表达中的每一个之间的一个或多个相关性中的每一个:用标志来掩蔽与多个绑定表达中的特定绑定表达相关联的相应位图以确定是否评估该特定绑定表达,相应位图定义一个或多个相关性中的哪一个与特定绑定表达相关联。
条款8.根据条款1-7中的任一项的方法,其中,布局文件的源代码包括标记语言,并且附加源代码包括面向对象的编程语言。
条款9.根据条款1-8中的任一项的方法,进一步包括:由计算装置向远程装置输出用于在远程装置处执行的应用。
条款10.一种计算装置,包括:至少一个处理器;预处理器模块,其可由至少一个处理器操作以:至少部分地基于解析定义图形用户界面的布局文件的源代码来识别多个数据绑定表达,其中,多个数据绑定表达中的每一个定义在图形用户界面的用户界面元素和模型对象之间的相应数据绑定;至少部分地基于多个数据绑定表达来确定在多个数据绑定表达中的每一个之间的一个或多个相关性;至少部分地基于一个或多个相关性来生成附加源代码,附加源代码用于响应于对模型对象的至少一个属性的改变来更新由多个数据绑定表达定义的至少一个相应数据绑定;以及编译器模块,该编译器模块能够由至少一个处理器操作以生成包括至少部分地基于布局文件的源代码、模型对象和附加源代码的机器可执行代码的应用。
条款11.根据条款10所述的计算装置,其中,预处理器模块进一步可由至少一个处理器操作以:基于多个数据绑定表达来生成多个表达树,其中,多个表达树中的每个表达树对应于多个数据绑定表达中的特定数据绑定表达并且定义模型对象的一个或多个属性,该一个或多个属性包括作为特定数据绑定表达的项的模型对象的至少一个属性;以及至少部分地基于多个表达树来确定多个数据绑定表达中的每一个之间的一个或多个相关性。
条款12.根据条款11所述的计算装置,其中,预处理器模块进一步可由至少一个处理器操作以:基于多个表达树来生成相关性树,相关性树定义在评估多个数据绑定表达中的其他数据绑定表达之前要评估的该多个数据绑定表达中的一个或多个数据绑定表达;以及至少部分地基于相关性树来确定多个数据绑定表达中的每一个之间的一个或多个相关性。
条款13.根据条款10-12中的任一项所述的计算装置,其中,预处理器模块可由至少一个处理器进一步操作,以生成附加源代码,该附加源代码用于响应于模型对象的至少一个属性的改变来更新标志,该标志定义对模型对象的至少一个属性的改变。
条款14.根据条款13所述的计算装置,其中,预处理器模块进一步可由至少一个处理器进行操作以生成所述附加源代码,以用于:基于标志来评估多个数据绑定表达中的每一个之间的一个或多个相关性中的每一个;以及响应于基于标志评估多个数据绑定表达中的每一个之间的一个或多个相关性中的每一个来更新多个数据绑定表达中的至少一个数据绑定。
条款15.根据条款10-14中的任一项所述的计算装置,其中,编译器模块可由至少一个处理器进一步操作,以向远程装置输出应用以在远程装置处执行。
条款16.一种包括指令的计算机可读存储介质,该指令在被执行时使得计算装置的一个或多个处理器:至少部分地基于解析定义图形用户界面的布局文件的源代码来识别多个数据绑定表达,其中,多个数据绑定表达中的每一个定义在图形用户界面的用户界面元素和模型对象之间的相应数据绑定;至少部分地基于多个数据绑定表达来确定在多个数据绑定表达中的每一个之间的一个或多个相关性;至少部分地基于一个或多个相关性来生成附加源代码,附加源代码用于响应于对模型对象的至少一个属性的改变来更新由多个数据绑定表达定义的至少一个相应数据绑定;以及生成包括至少部分地基于布局文件的源代码、模型对象和附加源代码的机器可执行代码的应用。
条款17.根据权利要求16的计算机可读存储介质,包括附加指令,附加指令在被执行时使得计算装置的一个或多个处理器通过至少下述来确定多个数据绑定表达中的每一个之间的一个或多个相关性:基于多个数据绑定表达来生成多个表达树,其中,多个表达树中的每个表达树对应于多个数据绑定表达中的特定数据绑定表达并且定义模型对象的一个或多个属性,该一个或多个属性包括作为特定数据绑定表达的项的模型对象的至少一个属性;以及至少部分地基于多个表达树来确定一个或多个相关性。
条款18.根据条款17的计算机可读存储介质,包括附加指令,附加指令在被执行时使得计算装置的一个或多个处理器通过至少下述来确定多个数据绑定表达中的每一个之间的一个或多个相关性:基于多个表达树来生成相关性树,相关性树定义在评估多个数据绑定表达中的其他数据绑定表达之前要评估的该多个数据绑定表达中的一个或多个数据绑定表达;以及至少部分地基于相关性树来确定多个数据绑定表达中的每一个之间的一个或多个相关性。
条款19.根据条款16-18中的任一项的计算机可读存储介质,包括附加指令,附加指令在被执行时使得计算装置的一个或多个处理器进一步响应于模型对象的至少一个属性的改变来更新标志,该标志定义对模型对象的至少一个属性的改变。
条款20.根据条款16-19中的任一项所述的计算机可读存储介质,包括附加指令,附加指令在被执行时使得计算装置的一个或多个处理器进一步生成附加源代码,附加源代码用于通过至少下述来基于标志评估多个数据绑定表达中的每一个之间的一个或多个相关性中的每一个:用标志来掩蔽与多个绑定表达中的特定绑定表达相关联的相应位图以确定是否评估该特定绑定表达,相应位图定义一个或多个相关性中的哪一个与特定绑定表达相关联。
条款21.根据条款10的计算装置,其中,预处理器模块和编译器模块可由至少一个处理器进一步操作以执行条款1-9的方法中的任一项。
条款22.一种计算装置,包括用于执行条款1-9中的方法中的任一项的装置。
条款23.一种包括指令的计算机可读存储介质,指令在由计算装置的一个或多个处理器执行时,使得所述一个或多个处理器执行条款1至9中的方法中的任一项。
在一个或多个示例中,所描述的功能可用硬件、软件、固件或其任何组合来实现。如果用软件来实现,则功能可以被作为一个或多个指令或代码存储在计算机可读介质上或由基于硬件的处理单元来执行。计算机可读介质可包括与诸如数据存储介质的有形介质对应的计算机可读存储介质,或包括便于例如根据通信协议将计算机程序从一个地方传递到另一个地方的任何介质的通信介质。以这种方式,计算机可读介质通常可对应于(1)非瞬时有形计算机可读存储介质或(2)诸如信号或载波的通信介质。数据存储介质可以是可由一个或多个计算机或一个或多个处理器访问以检索用于实现本公开中描述的技术的指令、代码和/或数据结构的任何可用介质。计算机程序产品可包括计算机可读介质。
作为示例而非限制性地,这种计算机可读存储介质可包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储器、磁盘存储器或其他磁存储装置、闪速存储器或可用于以指令或数据结构的形式存储期望的程序代码并且可由计算机访问的任何其他存储介质。而且,任何连接被适当地称为计算机可读介质。例如,如果使用同轴电缆、光纤电缆、双绞线、数字订户线(DSL)或无线技术(诸如,红外线、无线电和微波)从网站、服务器或其他远程源发送指令,则同轴电缆、光纤电缆、双绞线、DSL或无线技术(诸如,红外线、无线电和微波)被包括在介质的定义中。然而,应当理解,计算机可读存储介质和数据存储介质不包括连接、载波、信号或其他瞬时介质,而是替代地涉及非瞬时有形存储介质。如本文所使用的,磁盘和光盘包括紧凑盘(CD)、激光盘、光学光盘、数字通用盘(DVD)、软盘和蓝光盘,其中,磁盘通常以磁性方式再现数据,而光盘利用激光光学地再现数据。以上的组合也应该被包括在计算机可读介质的范围内。
指令可由诸如一个或多个数字信号处理器(DSP)、通用微处理器、专用集成电路(ASIC)、现场可编程逻辑阵列(FPGA)或其他等效的集成或分立逻辑电路的一个或多个处理器执行。因此,如本文所使用的术语“处理器”可以指适于实现本文所述技术的前述结构或任何其他结构中的任何一个。另外,在一些方面中,本文中描述的功能可以被设置在专用硬件和/或软件模块内。而且,这些技术可以在一个或多个电路或逻辑元件中被完全实现。
本公开的技术可以在各种各样的装置或设备中实现,这些装置或设备包括无线手机、集成电路(IC)或IC集(例如,芯片集)。在本公开中描述了各种组件、模块或单元,以强调被配置成执行所公开技术的装置的功能方面,但不一定需要由不同硬件单元实现。相反,如上所述,各种单元可被组合在硬件单元中,或者由包括如上所述的一个或多个处理器的协作的硬件单元的集合结合适当的软件和/或固件来提供。
已经描述了各种实施例。这些和其他实施例在随附权利要求书的范围内。

Claims (16)

1.一种用于数据绑定相关性分析的方法,所述方法包括:
由计算装置并且至少部分地基于解析定义应用的图形用户界面的布局文件的源代码来识别多个数据绑定表达,其中,所述多个数据绑定表达中的每一个定义相应数据绑定,该相应数据绑定包括在所述图形用户界面的用户界面元素和所述应用的模型的模型对象的至少一个属性之间的关联;
由所述计算装置至少部分地基于所述多个数据绑定表达来通过以下操作确定所述多个数据绑定表达中的两个或更多个数据绑定表达之间的一个或多个相关性:确定所述两个或更多个数据绑定表达均具有取决于所述模型对象的所述至少一个属性的一个或多个项;
由所述计算装置至少部分地基于所述一个或多个相关性来生成用于响应于对所述模型对象的所述至少一个属性的改变来更新由所述两个或更多个数据绑定表达定义的至少一个相应数据绑定的附加源代码;以及
由所述计算装置生成包括至少部分地基于所述布局文件的源代码、所述模型对象和所述附加源代码的机器可执行代码的所述应用。
2.根据权利要求1所述的方法,进一步包括:
由所述计算装置基于所述多个数据绑定表达来生成多个表达树,
其中,所述多个表达树中的每个表达树对应于所述多个数据绑定表达中的特定数据绑定表达,并且定义所述模型对象的一个或多个属性,所述一个或多个属性包括所述模型对象的所述至少一个属性,
其中,至少部分地基于所述多个表达树来进一步确定所述两个或更多个数据绑定表达之间的所述一个或多个相关性。
3.根据权利要求2所述的方法,进一步包括:
由所述计算装置基于所述多个表达树来生成相关性树,所述相关性树定义在评估所述多个数据绑定表达中的其他数据绑定表达之前要评估的所述多个数据绑定表达中的一个或多个数据绑定表达,其中,至少部分地基于所述相关性树来进一步确定所述两个或更多个数据绑定表达之间的所述一个或多个相关性。
4.根据权利要求1所述的方法,其中,进一步生成所述附加源代码,所述附加源代码用于响应于所述模型对象的至少一个属性的改变来更新标志,所述标志定义对所述模型对象的至少一个属性的改变。
5.根据权利要求4所述的方法,其中,进一步生成所述附加源代码,所述附加源代码用于基于所述标志来评估所述两个或更多个数据绑定表达之间的所述一个或多个相关性中的每一个。
6.根据权利要求5所述的方法,其中,进一步生成所述附加源代码,所述附加源代码用于响应于基于所述标志评估所述两个或更多个数据绑定表达之间的所述一个或多个相关性中的每一个,来更新所述两个或更多个数据绑定表达。
7.根据权利要求5所述的方法,其中,进一步生成所述附加源代码,所述附加源代码用于通过至少下述来评估所述两个或更多个数据绑定表达之间的所述一个或多个相关性中的每一个:用所述标志来掩蔽与所述多个绑定表达中的特定绑定表达相关联的相应位图以确定是否评估所述特定绑定表达,所述相应位图定义所述两个或更多个数据绑定表达之间的所述一个或多个相关性中的哪一个与所述特定绑定表达相关联。
8.根据权利要求1-4中任一项所述的方法,其中,所述布局文件的源代码包括标记语言,并且所述附加源代码包括面向对象的编程语言。
9.根据权利要求1-4中任一项所述的方法,进一步包括:
由所述计算装置向远程装置输出用于在所述远程装置处执行的应用。
10.根据权利要求9所述的方法,其中,生成所述应用包括:
由所述计算装置执行编译器来生成所述应用以供在包括所述远程装置的移动计算装置处执行。
11.一种计算装置,包括:
至少一个处理器;
预处理器模块,所述预处理器模块能够由所述至少一个处理器操作以:
至少部分地基于解析定义应用的图形用户界面的布局文件的源代码来识别多个数据绑定表达,其中,所述多个数据绑定表达中的每一个定义相应数据绑定,该相应数据绑定包括在所述图形用户界面的用户界面元素和所述应用的模型的模型对象的至少一个属性之间的关联;
至少部分地基于所述多个数据绑定表达来通过以下操作确定所述多个数据绑定表达中的两个或更多个数据绑定表达之间的一个或多个相关性:确定所述两个或更多个数据绑定表达均具有取决于所述模型对象的所述至少一个属性的一个或多个项;
至少部分地基于所述一个或多个相关性来生成用于响应于对所述模型对象的所述至少一个属性的改变来更新由所述两个或更多个数据绑定表达定义的至少一个相应数据绑定的附加源代码;以及
编译器模块,所述编译器模块能够由所述至少一个处理器操作以生成包括至少部分地基于所述布局文件的源代码、所述模型对象和所述附加源代码的机器可执行代码的所述应用。
12.根据权利要求11所述的计算装置,其中,所述预处理器模块进一步能够由所述至少一个处理器操作以:
基于所述多个数据绑定表达来生成多个表达树,其中,所述多个表达树中的每个表达树对应于所述多个数据绑定表达中的特定数据绑定表达,并且定义所述模型对象的一个或多个属性,
所述一个或多个属性包括所述模型对象的所述至少一个属性;并且
至少部分地基于所述多个表达树来确定所述两个或更多个数据绑定表达之间的所述一个或多个相关性。
13.根据权利要求12所述的计算装置,其中,所述预处理器模块进一步能够由所述至少一个处理器操作以:
基于所述多个表达树来生成相关性树,所述相关性树定义在评估所述多个数据绑定表达中的其他数据绑定表达之前要评估的所述多个数据绑定表达中的一个或多个数据绑定表达;以及
至少部分地基于所述相关性树来确定所述两个或更多个数据绑定表达之间的所述一个或多个相关性。
14.根据权利要求11-13中任一项所述的计算装置,其中,所述预处理器模块能够由所述至少一个处理器进一步操作,以生成所述附加源代码,所述附加源代码用于响应于所述模型对象的至少一个属性的改变来更新标志,所述标志定义对所述模型对象的至少一个属性的改变。
15.根据权利要求14所述的计算装置,其中,所述预处理器模块进一步能够由所述至少一个处理器操作以生成所述附加源代码,以用于:
基于所述标志来评估所述两个或更多个数据绑定表达之间的所述一个或多个相关性中的每一个;以及
响应于基于所述标志评估所述两个或更多个数据绑定表达之间的所述一个或多个相关性中的每一个,来根据所述两个或更多个数据绑定表达更新所述至少一个数据绑定。
16.一种用于数据绑定相关性分析的系统,所述系统包括用于执行根据权利要求1-10中的任一项所述的方法的装置。
CN201680019375.XA 2015-05-27 2016-04-12 数据绑定相关性分析 Active CN107454954B (zh)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US201562166765P 2015-05-27 2015-05-27
US62/166,765 2015-05-27
US14/753,543 US9483240B1 (en) 2015-05-27 2015-06-29 Data binding dependency analysis
US14/753,543 2015-06-29
PCT/US2016/027093 WO2016190973A1 (en) 2015-05-27 2016-04-12 Data binding dependency analysis

Publications (2)

Publication Number Publication Date
CN107454954A CN107454954A (zh) 2017-12-08
CN107454954B true CN107454954B (zh) 2021-03-02

Family

ID=57189397

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201680019375.XA Active CN107454954B (zh) 2015-05-27 2016-04-12 数据绑定相关性分析

Country Status (4)

Country Link
US (1) US9483240B1 (zh)
EP (1) EP3304286B1 (zh)
CN (1) CN107454954B (zh)
WO (1) WO2016190973A1 (zh)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9984105B2 (en) * 2014-12-04 2018-05-29 International Business Machines Corporation Automatic discovery of code and data stores that populate a user interface element
US20170242668A1 (en) * 2016-02-24 2017-08-24 Microsoft Technology Licensing, Llc Content publishing
US10838699B2 (en) 2017-01-18 2020-11-17 Oracle International Corporation Generating data mappings for user interface screens and screen components for an application
US10168999B2 (en) * 2017-05-25 2019-01-01 International Business Machines Corporation Software object definition and integration
US10310821B2 (en) * 2017-06-03 2019-06-04 Apple Inc. Integration of learning models into a software development system
US10606566B2 (en) * 2017-06-03 2020-03-31 Apple Inc. Integration of learning models into a software development system
US10956498B2 (en) 2017-09-29 2021-03-23 Google Llc Scanning for bindings in webpage markup
US10489126B2 (en) * 2018-02-12 2019-11-26 Oracle International Corporation Automated code generation
CN108628629B (zh) * 2018-05-21 2022-02-22 网易(杭州)网络有限公司 Ui更新方法、装置、设备及存储介质
JP7046217B2 (ja) * 2018-10-03 2022-04-01 三菱電機株式会社 ソフトウェア解析装置、ソフトウェア解析方法およびソフトウェア解析プログラム
CN110427233A (zh) * 2019-06-26 2019-11-08 北京三快在线科技有限公司 后台数据绑定方法、装置、电子设备及存储介质
US11416661B2 (en) * 2019-08-07 2022-08-16 Synopsys, Inc. Automatic derivation of integrated circuit cell mapping rules in an engineering change order flow
CN111158698B (zh) * 2019-12-30 2024-03-26 北京百舸飞驰科技有限公司 Android平台下的模块化通信装置和方法
CN113515905A (zh) * 2021-09-13 2021-10-19 中科亿海微电子科技(苏州)有限公司 一种资源属性配码正确性的验证方法、装置、介质及设备
CN115373683A (zh) * 2022-08-22 2022-11-22 北京字跳网络技术有限公司 页面的展示方法、编译源代码的方法及相关设备

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1834906A (zh) * 2005-03-15 2006-09-20 微软公司 丰富数据绑定应用程序
CN1867886A (zh) * 2003-09-02 2006-11-22 捷讯研究有限公司 用于用户界面定制的方法和数据结构
CN104111828A (zh) * 2013-04-22 2014-10-22 易保网络技术(上海)有限公司 人机交互界面自动生成方法及系统

Family Cites Families (27)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6330006B1 (en) * 1998-05-12 2001-12-11 Silverstream Software, Inc. Method and apparatus for synchronizing an application's interface and data
US6571253B1 (en) * 2000-04-28 2003-05-27 International Business Machines Corporation Hierarchical view of data binding between display elements that are organized in a hierarchical structure to a data store that is also organized in a hierarchical structure
US6898604B1 (en) 2001-06-29 2005-05-24 Microsoft Corporation XML serialization and deserialization
US7117504B2 (en) * 2001-07-10 2006-10-03 Microsoft Corporation Application program interface that enables communication for a network software platform
US7962925B2 (en) 2002-02-22 2011-06-14 Oracle International Corporation System and method for XML data binding
US7493603B2 (en) 2002-10-15 2009-02-17 International Business Machines Corporation Annotated automaton encoding of XML schema for high performance schema validation
US7149752B2 (en) 2002-12-03 2006-12-12 Jp Morgan Chase Bank Method for simplifying databinding in application programs
US7650276B2 (en) 2003-02-26 2010-01-19 Bea Systems, Inc. System and method for dynamic data binding in distributed applications
US7873668B2 (en) 2003-08-15 2011-01-18 Laszlo Systems, Inc. Application data binding
US20050114361A1 (en) * 2003-11-26 2005-05-26 Brent Roberts Method and apparatus for integrating data repositories and frameworks
US20070276689A1 (en) 2006-05-12 2007-11-29 Kirk Slone Workflow data binding
US7437374B2 (en) 2004-02-10 2008-10-14 International Business Machines Corporation Efficient XML schema validation of XML fragments using annotated automaton encoding
US7653880B2 (en) 2004-04-13 2010-01-26 Microsoft Corporation Application of data-binding mechanism to perform command binding
US7281018B1 (en) * 2004-05-26 2007-10-09 Microsoft Corporation Form template data source change
US7475384B2 (en) 2004-10-19 2009-01-06 Microsoft Corporation Binding to types
US7469402B2 (en) * 2004-12-28 2008-12-23 Sap Aktiengesellschaft Pluggable model framework
US7379943B2 (en) 2005-01-28 2008-05-27 Microsoft Corporation Method and system for bidirectionally data binding a control of a template
US9141402B2 (en) * 2005-04-25 2015-09-22 Aol Inc. Providing a user interface
US20070113221A1 (en) 2005-08-30 2007-05-17 Erxiang Liu XML compiler that generates an application specific XML parser at runtime and consumes multiple schemas
NL1031006C2 (nl) * 2006-01-25 2007-07-26 Javeline B V Werkwijze, inrichting, datadrager en computerprogrammaproduct voor het representeren van data in een gebruikersinterface.
US20090112915A1 (en) * 2007-10-31 2009-04-30 Microsoft Corporation Class configuration for locally cached remote data binding
US8229976B2 (en) 2008-03-27 2012-07-24 Microsoft Corporation Data binding for XML schemas
US8245210B2 (en) 2009-05-22 2012-08-14 Microsoft Corporation Compile-time context for dynamically bound operations
US20110090236A1 (en) * 2009-10-15 2011-04-21 Microsoft Corporation Graphic Object Data Binding
US8458586B2 (en) * 2010-03-15 2013-06-04 Jasim George Schluter X/HTML support for silverlight applications
US8464233B2 (en) 2010-06-21 2013-06-11 Microsoft Corporation Compile time interpretation of markup codes
US8910193B2 (en) * 2011-08-30 2014-12-09 Embarcadero Technologies, Inc. Dynamically binding data in an application

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1867886A (zh) * 2003-09-02 2006-11-22 捷讯研究有限公司 用于用户界面定制的方法和数据结构
CN1834906A (zh) * 2005-03-15 2006-09-20 微软公司 丰富数据绑定应用程序
CN104111828A (zh) * 2013-04-22 2014-10-22 易保网络技术(上海)有限公司 人机交互界面自动生成方法及系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
Aspect-driven, data-reflective and context-aware user interfaces design;Cerny T等;《ACM SIGAPP Applied Computing Review》;20131231;摘要及正文第2-4节 *

Also Published As

Publication number Publication date
EP3304286A1 (en) 2018-04-11
WO2016190973A1 (en) 2016-12-01
CN107454954A (zh) 2017-12-08
US9483240B1 (en) 2016-11-01
EP3304286B1 (en) 2021-11-24

Similar Documents

Publication Publication Date Title
CN107454954B (zh) 数据绑定相关性分析
CN108027722B (zh) 在编译和部署中动态更新应用
AU2012203071B2 (en) Computer-implemented method, system and computer program product for displaying a user interface component
US9471282B2 (en) System and method for using annotations to automatically generate a framework for a custom javaserver faces (JSF) component
US8302069B1 (en) Methods and systems utilizing behavioral data models with variants
CN108027721B (zh) 用于使用控件来配置通用程序的技术
US9733930B2 (en) Logical level difference detection between software revisions
WO2017087801A1 (en) Dynamic update of an application in compilation and deployment
Mackey Introducing. NET 4.0: With Visual Studio 2010
CN111782181A (zh) 代码生成方法、装置、电子设备以及存储介质
CN114489619A (zh) 一种界面视图显示方法及终端设备、计算机可读存储介质
US20210365277A1 (en) Static reconcilliation of application view hierarchies
US20240061687A1 (en) Dynamic generation and customization of user interfaces
CN115758021A (zh) 网页渲染方法及装置、电子设备和介质
CN117873482A (zh) 智能合约的代码验证方法、装置、设备及存储介质

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
CB02 Change of applicant information

Address after: American California

Applicant after: Google limited liability company

Address before: American California

Applicant before: Google Inc.

CB02 Change of applicant information
GR01 Patent grant
GR01 Patent grant