CN106796525A - 按需加载动态脚本语言代码以减少内存使用 - Google Patents
按需加载动态脚本语言代码以减少内存使用 Download PDFInfo
- Publication number
- CN106796525A CN106796525A CN201680003117.2A CN201680003117A CN106796525A CN 106796525 A CN106796525 A CN 106796525A CN 201680003117 A CN201680003117 A CN 201680003117A CN 106796525 A CN106796525 A CN 106796525A
- Authority
- CN
- China
- Prior art keywords
- program module
- section
- memory
- internal memory
- described program
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- 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
-
- 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/427—Parsing
-
- 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/44—Encoding
- G06F8/443—Optimisation
- G06F8/4434—Reducing the memory space required by the program code
-
- 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/51—Source to source
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44505—Configuring for program initiating, e.g. using registry, configuration files
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44594—Unloading
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45508—Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
- G06F9/45512—Command shells
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45529—Embedded in an application, e.g. JavaScript in a Web browser
Abstract
一种用于减少存储用动态脚本语言编写成的应用程序所需的内存空间量的方法和系统,其由计算机实现,将程序模块加载到内存中并从所述程序模块中移除程序代码分类,如调试信息或函数定义等。所述方法和系统还接收针对调试信息的请求,或函数调用或查询,并确定对应程序代码是否在所述内存中;若不在,则识别所述程序模块在存储器中的存储位置,并将包含对应程序代码的另一个副本加载到所述内存中;将所述对应程序代码加载并复制到内存中的所述程序模块,并响应所述请求。
Description
相关申请案交叉申请
本发明要求于2015年2月23日递交的发明名称为“按需加载动态脚本语言代码以减少内存使用”的第14/629,197号美国非临时专利申请案的在先申请优先权,该在先申请的内容以引入的方式并入本文。
技术领域
本文大体涉及动态脚本语言代码的编译和加载,更具体地,涉及通过按需编译和加载用动态脚本语言编写成的应用程序源代码以减少内存使用。
背景技术
动态脚本语言广泛应用于许多行业和学术领域。例如,JavaScript被广泛认为是构建客户端Web应用程序的主要计算机编程语言;PHP通常是用于建立服务器端Web应用程序的骨干;Python广泛应用于建立高级和低级应用程序;Lua已广泛应用在游戏行业和嵌入式系统中;R和Matlab已在特定应用中普及。
一般情况下,动态脚本语言的性能带来忧虑。例如,用动态脚本语言编写成的应用程序通常运行较慢,且比基于静态语言的应用程序使用更多的内存。但在许多场景下,内存使用至关重要。例如,在典型的嵌入式系统中,若应用程序所需的内存多过可用内存,应用程序将会崩溃。
应用程序使用的内存通常包括代码段和数据段。在许多应用程序中,所述代码段最多可使用所需总内存的一半。因此,减少代码段所需内存量是减少总应用程序内存使用的有效途径。
现有的减少代码段所需内存量的方案包括重写或重建应用程序,以移除不必要的代码。此方案可行,因为应用程序通常包含应用程序的所有可能特征的源代码,即使通常不执行某些特征。重写或重建代码能保证应用程序中只包含必要的代码。
然而,重写或重建代码是相对劳动密集型的,因此,相对昂贵。另外,纯粹基于静态信息确定有关代码段的有效性和必要性是不是很明确。只有使用运行时间可用的信息才可能更确定。
动态脚本语言使用更多内存空间的另一原因在于:通常默认动态脚本语言以编译的对象代码或字节码在内存中存储应用程序的所有相关调试信息。在某些情况下,所述调试信息占用编程代码使用的内存空间的三分之一以上。但是,所述调试信息通常很少使用,例如,当应用程序执行期间出现错误或当执行期间调用了反射功能时使用。
现有的减少代码段所需内存量的方案还包括通过将应用程序源代码预编译成字节码,以移除调试信息。例如,可使用“-s”命令拓展预编译Lua源代码,以除去所述源代码中的所有调试信息,虽然对等方法在某些动态脚本语言中不可用。但是,使用这一方法不允许在运行时间获取所述调试信息。此外,出现运行时间错误时,应用程序不能上报有用信息,如出现错误的代码行数、与所述错误相关联的变量名等。
在一些情况下,由于运行时间所需的某些应用特征取决于调试信息的可用性,因此从代码中除去调试信息是不可接受的方案。进一步地,移除调试信息会增加部署复杂性,因为在应用程序加载到内存之前,需要通过“-s”选项进行额外预编译步骤以到达中间阶段(即,字节码),而通常动态脚本语言源代码已直接执行。
此外,经常使用常见数据压缩算法对动态脚本语言代码进行压缩。虽然预编译字节码的未压缩版本比已压缩的源代码占用的内存少,但压缩所述预编译代码之后,可能占用比原始文本格式的源代码更多的内存空间。因此,在某些应用程序中,例如在闪存有限的嵌入式系统中,理想的是存储源代码而非预编译字节码,以进一步减少所述内存量。
发明内容
根据本发明一实施例,用于减少存储用动态脚本语言编写成的应用程序所需内存空间的系统包括输入/输出设备,用于接收与用动态脚本语言编写成的程序模块中的一段程序代码对应的请求。所述系统还包括按需加载器,用于确定所述一段程序代码是否在内存中;若确定所述一段程序代码不在所述内存中,则识别包含所述一段程序代码的至少一部分所述程序模块在存储器中的存储位置;定位所述一部分程序模块的第二副本中的所述一段程序代码;将所述一段程序代码复制到所述内存中的所述程序模块的第一副本中。所述系统还包括代码加载器,用于将包含所述一段程序代码的所述一部分程序模块的所述第二副本从所述存储器加载到所述内存。
根据本发明的另一实施,用于减少存储用动态脚本语言编写成的应用程序所需内存空间的方法包括:接收与程序模块中的一段程序代码对应的请求;确定所述程序代码是否在内存中,若不在,则识别包含所述一段程序代码的至少一部分所述程序模块在存储器中的存储位置。所述方法还包括将包含所述一段程序代码的所述程序模块的第二副本从存储器所述加载到所述内存,并将所述一段程序代码加载到所述一部分所述程序模块的所述第二副本。所述方法还包括将所述一段程序代码复制到所述内存中的所述程序模块的第一副本中。
附图与下述描述将对本发明一个或多个例子进行详细阐释。本发明的其他特征、目的及优势在描述、附图及权利要求中显而易见。
附图说明
图1为本发明实施例提供的使用按需源代码加载器的动态脚本语言虚拟机的示意图。
图2为能够实现图1中的动态脚本语言虚拟机的计算系统的示意图。
图3为本发明实施例提供的按需加载动态脚本语言源代码的方法流程图。
图4为本发明实施例提供的编辑的函数占位符和编译的动态脚本语言应用程序树状结构图。
图5为本发明实施例提供的按需加载动态脚本语言源代码函数的方法流程图。
具体实施方式
图1示出了本发明一实施例,其阐述了使用按需加载动态脚本语言源代码过程的示例性动态脚本语言虚拟机10,以减少存储用动态脚本语言源代码12编写成的应用程序所需的内存空间。所述虚拟机10包括代码加载器14、按需加载器16、解释器18、对象20和客户端22。
所述代码加载器14读取原始文本源代码12,通过移除程序代码分类编辑每个应用程序对象20,并将针对每个对象20的编辑的源代码占位符加载或插入到内存。例如,在一实施例中,所述代码加载器14在在线编译期间从所述源代码12中的每个函数对象中移除调试信息,并将针对每个对象20的编辑的源代码加载到内存。在另一实施例中,所述代码加载器14为所述原始源代码12中的每个函数生成函数桩。例如,所述函数桩记录元信息,如源代码文件名、函数原型以及源文件中的函数的开始和结束位置(行号和列号)等。
因此,所述虚拟机10移除程序代码分类,如调试信息或函数代码,并在所述虚拟机10将所述源代码加载和编译成字节码到内存时,存储可找到所述原始源代码的位置。在一可选实施例中,编辑的函数代码段数据存储在二级存储器中,如硬盘驱动器。与完整源代码相比,源代码占位符占用较少的内存空间,因此会降低动态脚本语言应用程序的内存消耗。
后续调用或查询所述对象20时,或请求调试信息时,所述按需加载器16提示所述代码加载器14重新加载所述源代码12,并创建包含完整函数的代码段或调试信息的编译的树状结构。所述按需加载器16搜索所述树状结构查找函数对象,其与所调用或查询对象或所请求的信息对应。所述代码段或调试信息从所述树状结构中复制到所述对象20,并返回给请求或调用客户端22。
在本发明各种实施例中,所述虚拟机10运行时间环境根据需求生成所请求的调试信息或代码段,并动态修改所述函数桩以根据运行时间行为形成完整的函数对象。因此,内存中的代码段或调试信息中只填充有运行时间实际执行的函数。所述源代码中的所有其他函数在内存中均表示为编辑的占位符,例如,无调试信息的函数桩或函数对象。
本文描述的按需加载动态脚本语言源代码的系统具有如降低内存消耗等的优点。主要通过移除的调试信息量或代码来减少存储字节码所需内存量,但被请求时,详细的代码段或调试信息可用。因对语言不做特定限制,此方法可用于任何动态脚本语言。源代码应用程序的所有组件可保持原始特征。此透明、纯粹动态的方法不需要任何额外的预编译步骤。可使用任何已知压缩算法在存储器中保持原始源代码。
如图2所示,能够实现图1中的动态脚本语言虚拟机10的计算系统30包括处理器32、内存34、输入/输出设备(input/output,简称I/O)36、存储器38和网络接口40。所述计算设备30的不同组件可通过本地数据链接42耦合,在各种实施例中,所述本地数据链路42包括例如地址总线、数据总线、串联总线、并联总线或其任意组合等。
所述计算设备30通过所述I/O设备36向用户或其他设备传递信息,并请求来自用户或其他设备的输入。在各种实施例中,所述I/O设备36包括例如互动式菜单驱动、基于视觉显示的用户界面、图形用户界面(graphical user interface,简称GUI)、指示设备,如鼠标,通过指示设备例如鼠标,用户可使用所述GUI的直接操作交互地输入信息。在一些实施例中,所述直接操作包括使用字母数字输入设备,例如键盘、如鼠标、触摸板、操纵杆或手写笔等的指示设备,从多个窗口、图标和可选领域中进行选择,所述可选领域包括可选菜单、下拉菜单、栏、按钮、项目符号、复选框、文本框等。但是,本发明各种实施例可包括不同数量的额外功能用户接口方案来替代此接口方案,需要或不需要使用字母数字输入设备、指示设备、按钮或按键,例如,使用直接语音输入。
所述计算设备30可通过所述网络接口40耦合到通信网络。在各种实施例中,所述网络接口40包括例如用于耦合基于处理器的系统的任何设备的组合以及任何相关联的软件或固件,包括调制解调器、接入点、网卡、LAN或WAN接口、无线或光接口等,以及设计所需或要求的任何相关联的传输协议。
例如,在一些实施例中,源代码12可包含在通过通信网络与所述计算系统30通信互连的远程存储器中。在各种实施例中,所述通信网络可包括能连接基于计算机的系统的任何可用的设备和系统的组合,如互联网、内网或外网、局域网(local area network,简称LAN)、广域网(wide area network,简称WLAN)、直接电缆连接、专用网络、公用网络、基于以太网的系统、令牌环网、增值网、基于电话的系统,包括如T1或E1设备,和异步传输模式(asynchronous transfer mode,简称ATM)网络、有线网、无线系统、光学系统、任何数量的分布式处理网络或系统等的组合等。
所述计算设备30可用于,例如,实现图1中的动态脚本语言虚拟机的组件的功能。在各种实施例中,所述计算设备30可包括例如服务器、控制器、路由器、工作站、大型计算机、个人电脑(personal computer,简称PC)、记事本、平板电脑、个人数字助理(personaldigital assistant,简称PDA)、智能手机等。存储在如所述存储器38或耦合到所述计算设备30的外围存储组件等的计算机可读介质上的编程代码,如源代码、对象代码或可执行代码等,可加载到所述内存34并由所述处理其32执行,以执行所述动态脚本语言虚拟机10的功能。
在一示例实施例中,用于减少存储用动态脚本语言编写成的应用程序所需的内存空间的所述计算机设备30包括:接收模块,用于通过处理器接收与用动态脚本语言编写成的程序模块中的一段程序代码对应的请求;确定模块,用于确定所述一段程序代码是否在内存中;识别模块,用于若确定所述一段程序代码不在所述内存中,识别包含所述一段程序代码的至少一部分所述程序模块在存储器中的存储位置;加载模块,用于将包含所述一段程序代码的所述一部分程序模块的所述第二副本从所述存储器加载到所述内存;定位模块,用于定位所述一部分程序模块的第二副本中的所述一段程序代码;复制模块,用于将所述一段程序代码复制到所述内存中的所述程序模块的第一副本中。在一些实施例中,所述计算设备30可包括其他或额外模块,用于执行实施例中描述的步骤中的任何一个或其组合。
在一示例实施例中,用于减少存储用动态脚本语言编写成的应用程序所需的内存空间的所述计算机设备30包括:接收模块,用于通过处理器接收与用动态脚本语言编写成的程序模块中的一段调试信息对应的请求;确定模块,用于确定所述一段调试信息是否在内存中;识别模块,用于若确定所述一段调试信息不在所述内存中,识别包含所述一段调试信息的至少一部分所述程序模块在存储器中的存储位置;加载模块,用于将包含所述一段调试信息的所述一部分程序模块的第二副本从所述存储器加载到所述内存;定位模块,用于定位所述一部分程序模块的第二副本中的所述一段调试信息;复制模块,用于将所述一段调试信息复制到所述内存中的所述程序模块的第一副本中。在一些实施例中,所述计算设备30可包括其他或额外模块,用于执行实施例中描述的步骤中的任何一个或其组合。
现参考图3,其示出了可由例如图1中的动态脚本语言虚拟机10执行的示例性过程流程,用于实现本发明描述的用于按需加载动态脚本语言源代码的方法的实施例。图3中的虚线所示的块为所有实现方式中均不可执行的可选项。所述过程开始于块50,即解析用动态脚本语言编写成的应用程序的源代码中的对象,如函数等。例如,在一实施例中,动态脚本语言虚拟机的代码加载器模块在运行时间解析所述对象。
在块52中,编辑所述对象,以将所有调试信息从代码中移除。例如,在一实施例中,将源代码编译成字节代码时移除调试信息。在块54中,将占位符加载并插入到内存中的字节码中。例如,在一实施例中,所述占位符包括源代码文件位置,以及源代码文件行号和列号,所述行号和列号用于描述从字节码内存编辑而来的代码对应的一段源代码的开始和结束。
在块56中,从运行时间客户端,如虚拟机的错误处理组件或反射组件,接收针对调试信息的请求。在块58中,所述过程检查所请求的调试信息当前是否在内存中。例如,若程序执行期间和清理流程中,如垃圾收集等,先前已请求过来自对象的调试信息,但尚未在被干涉的时间内执行,则仍可将所请求的调试信息加载到内存。如此一来,从内存中读取所请求的调试信息并返回给请求客户端。
否则,若所请求的调试信息当前不在内存中,在块60中检索对应的源文件位置。例如,在一实施例中,按需调试信息加载器读取内存中的占位符中的源文件位置。在块62中,重新解析对象源代码。例如,在一实施例,按需加载器模块请求代码加载器模块再次加载针对所述对象的源代码,包括所述调试信息。在块64中,可选地,将对象源代码与附带的调试信息编译成字节码。
在一些实施例中,在块62和块64中,重新解析并可选地编译除了如调用函数和被调用函数等的即时函数的源代码外,针对整个应用程序或部分应用程序源代码的源代码。特别地,针对整个应用程序解析和编译源代码需要应用词汇范围的编程语言,例如,使用“上值”概念的动态脚本语言。否则,结果编译功能可能不包括正确指令和变量。
例如,在Lua编程语言中,相对于函数B(),可以全部编译或局部编译以下函数,得到不同结果:
在孤立函数B()之前,全局编译函数A()正确转化所述函数B(),如下所示:
.local“b”;0
.upvalue“a”;0
.const“print”;0
[1]getupval 0 0;a
[2]getglobal 1 0;print
[3]move 2 0
[4]call 1 2 1
[5]return 0 1
然而,局部编译函数B()产生函数B()的错误转化,其具有不同上值表以及不同指令,如下所述:
.local“b”;0
.const“a”;0
.const“print”;0
[1]getglobal 0 0;a
[2]getglobal 1 1;print
[3]move 2 0
[4]call 1 2 1
[5]return 0 1
在块66中,识别与所述请求相关但不包含在内存中字节码中的调试信息。在块68中,将所述调试信息复制到内存中的字节码中。
参考图4,例如,根据图3中的块62和块64,将用动态脚本语言编写成的完整应用程序的源代码编译成树状结构80。虚假顶部82代表进入应用程序,应用程序源代码中的任何一个函数对应的字节码均表示在所述树中:例如,对应1-10行源代码的函数A()84、对应12-20行源代码的函数D()86、对应3-5行源代码的函数B()88和对应7-9行源代码的函数C()90。
源位置搜索所述树状结构80;根据图3中的块66,识别所述调试信息,其中所述调试信息与根据图3中的块56(图4中描述为函数B())所请求的与所述调试信息相关的函数相对应。将来自编译树中的配对函数对象的调试信息复制到内存94中的字节码中的对应函数B()92中,用于补充或替代初始编译字节码时包含的占位符。
再次参考图3,在块70中,将所请求的调试信息返回给客户端,以支持应用程序的执行。这样就完成了动态脚本语言源代码调试信息的按需加载过程。
参考图5,其示出了可由例如图1中的动态脚本语言虚拟机10执行的示例性过程流程,用于实现本发明中描述的用于按需加载动态脚本语言源代码的方法的另一实施例。图3中的虚线所示的块为所有实现方式中均不可执行的可选项。所述过程开始于块100,即解析用动态脚本语言编写成的应用程序的源代码中的函数对象。例如,在一实施例中,动态脚本语言虚拟机的代码加载器模块在运行时间解析所述函数对象。
在块102中,编辑所述对象,以移除函数代码段。例如,在一实施例中,将源代码编译成字节代码时移除所述函数代码。在块104中,将占位符加载并插入内存中的字节码中。例如,在一实施例中,所述占位符包括源代码文件位置,以及源代码文件行号和列号,所述行号和列号用于描述从字节码内存编辑而来的代码对应的一段源代码的开始和结束。
在块106中,从运行时间客户端,如虚拟机的执行组件,接收针对所述函数的调用或查询请求。在块108中,所述过程检查所请求的函数代码段当前是否在内存中。例如,若程序执行期间和清理流程中,如垃圾收集等,先前已请求过所述函数,但尚未在被干涉的时间内执行,则仍可将所请求的函数代码加载到内存。如此一来,在块120中,从内存中读取所请求的函数代码并返回给请求客户端。
否则,若所请求的函数代码当前不在内存中,在块110中检索对应的源文件位置。例如,在一实施例中,按需代码段加载器读取内存中的占位符中的源文件位置。在块112中,重新解析函数源代码。例如,在一实施例,按需加载器模块请求代码加载器模块再次加载针对所述函数对象的源代码。在块114中,可选地,再次将对象源代码编译成字节码。
结合以上图3和图4中的描述,在一些实施例中,在块112和块114中,重新解析并可选地编译除了如调用函数和被调用函数的即时函数的源代码外,针对整个应用程序或部分应用程序源代码的的源代码。特别地,针对整个应用程序解析和编译源代码需要应用词汇范围的编程语言,例如,使用“上值”概念的动态脚本语言。否则,如上所述,结果编译功能可能不包括正确指令和变量。
在块116中,识别与所述请求相关但不包含在内存中字节码中的代码。在块118中,将完整的函数复制到内存中的字节码中。在可选实施例中,编辑的代码段存储在二级存储器中,且函数可从所述二级存储器中直接复制到内存中的字节码中。在块120中,将所请求的函数返回给客户端,以支持应用程序的执行。这样就完成了动态脚本语言源代码函数的按需加载过程。
在可选实施例中,清理过程可在所请求的函数或调试信息返回后执行。例如,垃圾收集过程可以将代码段或调试信息从内存中的字节码中移除,以再次减少存储字节码所需的内存空间。
本发明的各个部分均结合流程图或框图进行了描述,每个块或块的组合可由计算机程序指令实现。所述指令可提供给通用计算机、专用计算机或其他可编程数据处理装置,以实现机器或制品。当处理器执行所述指令时,所述指令创建执行每个框或图中框的组合中指定的功能、动作或事件。
此时,流程图或框图中的每个框都对应一个模块、片段或一部分代码,包括一个或多个用于实现特定逻辑功能的可执行指令。也应注意的是,在一些可替代的实现方式中,和任意方框相关的功能可以不按照图中的顺序实现。例如,事实上,连续示出的两个方框可以几乎同时执行,或者有时候,方框可以按照相反的顺序执行。
本领域的普通技术人员的人员将会理解,本发明的各方面可以体现为设备、系统、方法或计算机程序产品。因此,本发明的各方面,此处通常指电路、模块、组件或系统,可以体现在硬件、软件(包括固件、驻留软件、微代码等)、或在软件和硬件的任意组合,包括体现在具有计算机可读程序代码的计算机可读介质中的计算机程序产品。
在这方面,可以利用一个或多个计算机可读介质的任何组合,包括但不限于:电子、磁、光、电磁、红外或半导体系统、装置或设备,或上述的任意合适组合。计算机可读存储介质的更具体的例子包括以下的非详尽列表:便携式计算机磁盘、硬盘、随机存取内存(random access memory,简称RAM)、只读内存(read-only memory,简称ROM)、可擦除可编程只读内存(erasable programmable read-only memory,简称EPROM)、闪存、便携式光盘只读内存(portable compact disc read-only memory,简称CD-ROM)、光存储设备,网络连接存储(network-attached storage,简称NAS)、存储区域网络(storage area network,简称SAN)、磁带、或上述的任意合适组合。在本发明的上下文中,计算机可读存储介质可包括能够包含或存储被数据处理系统、装置或设备使用或与其相关的程序指令的任何有形介质。
可以用一个或多个编程语言的任意组合来写用于实现与本发明的各方面的操作的计算机程序代码,包括如Java、Smalltalk或C++等面向对象的编程语言,以及如“C”、FORTRAN、COBOL或Pascal等传统过程化编程语言。程序代码可以在个别个人计算机上全部执行,作为一个独立的软件包,在客户端计算机上和程服务器计算机部分执行,或远程服务器或分布式计算机节点的群集上全部执行。一般情况下,远程计算机、服务器或分布式计算机节点的群集可以通过任何类型的网络连接到个人(用户)计算机,包括局域网(localarea network,简称LAN)、广域网(wide area network,简称WAN)、互联网接入点或其任意组合。
可以理解的是可以进行各种修改。例如,如果所公开的技术的步骤以不同的顺序执行,和/或如果所公开的系统中的组件以不同的方式组合,和/或由其他组件代替或补充,仍可以得到有用的结果。相应地,其他实现方式在以下权利要求的保护范围之内。
Claims (20)
1.一种用于减少存储用动态脚本语言编写成的应用程序所需内存空间的系统,其特征在于,所述系统包括:
输入/输出设备,用于接收与用动态脚本语言编写成的程序模块中的一段程序代码对应的请求;
按需加载器,用于确定所述一段程序代码是否在内存中;若确定所述一段程序代码不在所述内存中,则识别包含所述一段程序代码的至少一部分所述程序模块在存储器中的存储位置;定位所述一部分程序模块的第二副本中的所述一段程序代码;将所述一段程序代码复制到所述内存中的所述程序模块的第一副本中;
代码加载器,用于将包含所述一段程序代码的所述一部分程序模块的所述第二副本从所述存储器加载到所述内存。
2.根据权利要求1所述的系统,其特征在于,所述代码加载器还将所述程序模块的所述第一副本从所述存储器加载到所述内存;将程序代码分类从所述程序模块的所述第一副本中移除,并将占位符插入所述程序模块的所述第一副本。
3.根据权利要求2所述的系统,其特征在于,从所述程序模块的所述第一副本中移除的所述程序代码分类包括调试信息和与从所述程序模块的所述第一副本中移除的所述调试信息对应的请求。
4.根据权利要求2所述的系统,其特征在于,从所述程序模块的所述第一副本中移除的所述程序代码分类包括函数定义和调用或查询所述函数定义的请求。
5.一种用于减少存储用动态脚本语言编写成的应用程序所需内存空间的方法,其特征在于,所述方法包括:
通过处理器接收与用动态脚本语言编写成的程序模块中的一段程序代码对应的请求;
确定所述一段程序代码是否在内存中;
若确定所述一段程序代码不在所述内存中,则识别包含所述一段程序代码的至少一部分所述程序模块在存储器中的存储位置;
将包含所述一段程序代码的所述一部分程序模块的第二副本从所述存储器加载到所述内存;
定位所述一部分程序模块的所述第二副本中的所述一段程序代码;
将所述一段程序代码复制到所述内存中的所述程序模块的第一副本中。
6.根据权利要求5所述的方法,其特征在于,还包括:
将所述程序模块的所述第一副本从所述存储器加载到所述内存;
将程序代码分类从所述程序模块的所述第一副本中移除;
将占位符插入所述程序模块的所述第一副本。
7.根据权利要求6所述的方法,其特征在于,从所述程序模块的第一副本中移除的所述程序代码分类包括调试信息和与从所述程序模块的第一副本中移除的所述调试信息对应的请求。
8.根据权利要求6所述的方法,其特征在于,从所述程序模块的第一副本中移除的所述程序代码分类包括函数定义和调用或查询所述函数定义的请求。
9.根据权利要求6所述的方法,其特征在于,所述从所述存储器加载所述程序模块的第一副本还包括:通过网络从远程计算机系统下载所述程序模块或从本地存储器中读取所述程序模块。
10.根据权利要求5-9任一项所述的方法,其特征在于,还包括:存储从所述存储器中的所述程序模块的所述第一副本中移除的所述程序代码分类。
11.根据权利要求5-10任一项所述的方法,其特征在于,还包括:将所述程序模块编译成字节码。
12.根据权利要求5-11任一项所述的方法,其特征在于,还包括:执行所述程序模块。
13.根据权利要求5-12任一项所述的方法,其特征在于,还包括:对所述程序模块使用压缩算法。
14.根据权利要求5-13任一项所述的方法,其特征在于,还包括:响应所述请求。
15.一种用于减少存储用动态脚本语言编写成的应用程序所需内存空间的方法,其特征在于,所述方法包括:
通过处理器接收与用动态脚本语言编写成的程序模块中的一段调试信息对应的请求;
确定所述一段调试信息是否在内存中;
若确定所述一段调试信息不在所述内存中,则识别包含所述一段调试信息的至少一部分所述程序模块在存储器中的存储位置;
将包含所述一段调试信息的所述一部分程序模块的第二副本从所述存储器加载到所述内存;
定位所述一部分程序模块的所述第二副本中的所述一段调试信息;
将所述一段调试信息复制到所述内存中的所述程序模块的第一副本中。
16.根据权利要求15所述的方法,其特征在于,还包括:
将所述程序模块的所述第一副本从所述存储器加载到所述内存;
将所述一段调试信息从所述程序模块的所述第一副本中移除;
将占位符插入所述程序模块的所述第一副本。
17.根据权利要求15-16任一项所述的方法,其特征在于,还包括:存储从所述存储器中的所述程序模块的所述第一副本中移除的所述一段调试信息。
18.根据权利要求15-17任一项所述的方法,其特征在于,还包括:将所述程序模块编译成字节码。
19.根据权利要求15-18任一项所述的方法,其特征在于,还包括:对所述程序模块使用压缩算法。
20.根据权利要求15-19任一项所述的方法,其特征在于,还包括:响应所述请求。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911006130.5A CN110941456B (zh) | 2015-02-23 | 2016-02-16 | 按需加载动态脚本语言代码以减少内存使用 |
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US14/629,197 | 2015-02-23 | ||
US14/629,197 US9772865B2 (en) | 2015-02-23 | 2015-02-23 | On-demand loading of dynamic scripting language code for reduced memory usage |
PCT/CN2016/073859 WO2016134641A1 (en) | 2015-02-23 | 2016-02-16 | On-demand loading of dynamic scripting language code for reduced memory usage |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911006130.5A Division CN110941456B (zh) | 2015-02-23 | 2016-02-16 | 按需加载动态脚本语言代码以减少内存使用 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106796525A true CN106796525A (zh) | 2017-05-31 |
CN106796525B CN106796525B (zh) | 2019-11-19 |
Family
ID=56693759
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911006130.5A Active CN110941456B (zh) | 2015-02-23 | 2016-02-16 | 按需加载动态脚本语言代码以减少内存使用 |
CN201680003117.2A Active CN106796525B (zh) | 2015-02-23 | 2016-02-16 | 按需加载动态脚本语言代码以减少内存使用 |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911006130.5A Active CN110941456B (zh) | 2015-02-23 | 2016-02-16 | 按需加载动态脚本语言代码以减少内存使用 |
Country Status (4)
Country | Link |
---|---|
US (4) | US9772865B2 (zh) |
EP (1) | EP3198452B1 (zh) |
CN (2) | CN110941456B (zh) |
WO (1) | WO2016134641A1 (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106843836A (zh) * | 2016-12-21 | 2017-06-13 | 北京致远互联软件股份有限公司 | 动态表单的高级控件实现方法、装置及系统 |
CN117453548A (zh) * | 2023-10-26 | 2024-01-26 | 上海合芯数字科技有限公司 | 代码模块信息确定方法、装置、计算机设备和存储介质 |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP3314418A1 (en) * | 2015-06-24 | 2018-05-02 | TOI S.r.l. | Method and system for preparing code to be executed by programmable control devices |
US10366227B2 (en) * | 2016-11-15 | 2019-07-30 | International Business Machines Corporation | Secure debugging in a trustable computing environment |
CN109408323B (zh) * | 2018-09-18 | 2022-05-10 | 珠海金山网络游戏科技有限公司 | 一种服务器lua性能热点分析方法 |
CN111309332A (zh) * | 2020-02-11 | 2020-06-19 | 北京达佳互联信息技术有限公司 | 文件内容按需加载方法、装置及电子设备、存储介质 |
CN112181834B (zh) * | 2020-09-29 | 2022-02-25 | 苏州亿歌网络科技有限公司 | 基于gdb调试lua的方法、装置、设备及存储介质 |
JP2023018290A (ja) * | 2021-07-27 | 2023-02-08 | 富士通株式会社 | 解析プログラム、解析装置、及び解析方法 |
Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050125690A1 (en) * | 2003-12-09 | 2005-06-09 | Wen-Long Chin | Method for controlling an instruction memory of an embedded system |
CN101398752A (zh) * | 2007-09-29 | 2009-04-01 | 国际商业机器公司 | 重叠指令存取单元和重叠指令存取方法 |
US20090204963A1 (en) * | 2008-02-07 | 2009-08-13 | Arm Limited | Reducing memory usage of a data processing task performed using a virtual machine |
CN101834608A (zh) * | 2009-03-10 | 2010-09-15 | 华为技术有限公司 | 一种多通道编解码器运行方法及装置 |
CN102081546A (zh) * | 2009-11-30 | 2011-06-01 | 国际商业机器公司 | 通过分隔额外信息来内存优化虚拟机代码的方法和系统 |
CN102270181A (zh) * | 2010-06-01 | 2011-12-07 | 炬力集成电路设计有限公司 | 一种内存访问方法和装置 |
CN102279762A (zh) * | 2011-06-23 | 2011-12-14 | 杭州斯凯网络科技有限公司 | 在手机平台提高内存使用效率的方法 |
CN102567323A (zh) * | 2010-12-14 | 2012-07-11 | 腾讯科技(深圳)有限公司 | 一种应用程序文件搬移方法及系统 |
US20130346616A1 (en) * | 2012-06-25 | 2013-12-26 | Hitachi, Ltd. | Computer system and application program execution environment migration method |
Family Cites Families (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5261103A (en) * | 1988-09-12 | 1993-11-09 | Hitachi, Ltd. | Method of and system for compiling source program |
US6438573B1 (en) * | 1996-10-09 | 2002-08-20 | Iowa State University Research Foundation, Inc. | Real-time programming method |
US6993751B2 (en) * | 2001-05-14 | 2006-01-31 | Microsoft Corporation | Placing exception throwing instructions in compiled code |
US20060075228A1 (en) * | 2004-06-22 | 2006-04-06 | Black Alistair D | Method and apparatus for recognition and real time protection from view of sensitive terms in documents |
US7506310B2 (en) * | 2005-02-22 | 2009-03-17 | Microsoft Corporation | Method and system for caching managed code for efficient execution on resource-constrained devices |
US7650600B2 (en) * | 2005-06-20 | 2010-01-19 | Microsoft Corporation | Unique identifier resolution interfaces for lightweight runtime identity |
US20100153836A1 (en) * | 2008-12-16 | 2010-06-17 | Rich Media Club, Llc | Content rendering control system and method |
US20070220429A1 (en) * | 2006-03-17 | 2007-09-20 | Microsoft Corporation | Layered customization of a help user interface |
US8645973B2 (en) * | 2006-09-22 | 2014-02-04 | Oracle International Corporation | Mobile applications |
US8655939B2 (en) * | 2007-01-05 | 2014-02-18 | Digital Doors, Inc. | Electromagnetic pulse (EMP) hardened information infrastructure with extractor, cloud dispersal, secure storage, content analysis and classification and method therefor |
US10216854B2 (en) * | 2007-07-26 | 2019-02-26 | International Business Machines Corporation | Optimized page script downloads in a component based architecture |
US8249654B1 (en) * | 2007-09-27 | 2012-08-21 | Sprint Communications Company L.P. | Dynamic smart card application loading |
CN101251799B (zh) * | 2008-04-16 | 2010-09-29 | 中兴通讯股份有限公司 | 管理实现的方法和装置 |
US8407667B2 (en) * | 2009-03-20 | 2013-03-26 | Microsoft Corporation | Inferring missing type information for reflection |
US9361297B2 (en) * | 2009-07-30 | 2016-06-07 | Adobe Systems Incorporated | Web service-based, data binding abstraction method |
US9003380B2 (en) * | 2010-01-12 | 2015-04-07 | Qualcomm Incorporated | Execution of dynamic languages via metadata extraction |
US8612959B2 (en) * | 2011-10-03 | 2013-12-17 | International Business Machines Corporation | Linking code for an enhanced application binary interface (ABI) with decode time instruction optimization |
CN102508742B (zh) * | 2011-11-03 | 2013-12-18 | 中国人民解放军国防科学技术大学 | 面向硬件不可恢复内存故障的内核代码软容错方法 |
US8732183B2 (en) * | 2012-05-29 | 2014-05-20 | Sap Portals Israel Ltd | Comparing strings of characters |
US9026961B2 (en) * | 2013-04-19 | 2015-05-05 | Terence Wai-kwok Chan | Race logic synthesis for ESL-based large-scale integrated circuit design |
US9760343B2 (en) * | 2014-11-28 | 2017-09-12 | Sap Se | Application builder based on metadata |
US9639460B1 (en) * | 2014-12-18 | 2017-05-02 | Amazon Technologies, Inc. | Efficient string formatting |
-
2015
- 2015-02-23 US US14/629,197 patent/US9772865B2/en active Active
-
2016
- 2016-02-16 WO PCT/CN2016/073859 patent/WO2016134641A1/en active Application Filing
- 2016-02-16 CN CN201911006130.5A patent/CN110941456B/zh active Active
- 2016-02-16 EP EP16754750.4A patent/EP3198452B1/en active Active
- 2016-02-16 CN CN201680003117.2A patent/CN106796525B/zh active Active
-
2017
- 2017-07-18 US US15/652,809 patent/US20170315830A1/en not_active Abandoned
-
2020
- 2020-03-23 US US16/827,104 patent/US20200249925A1/en not_active Abandoned
-
2022
- 2022-12-16 US US18/083,375 patent/US20230117105A1/en active Pending
Patent Citations (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050125690A1 (en) * | 2003-12-09 | 2005-06-09 | Wen-Long Chin | Method for controlling an instruction memory of an embedded system |
CN101398752A (zh) * | 2007-09-29 | 2009-04-01 | 国际商业机器公司 | 重叠指令存取单元和重叠指令存取方法 |
US20090204963A1 (en) * | 2008-02-07 | 2009-08-13 | Arm Limited | Reducing memory usage of a data processing task performed using a virtual machine |
CN101834608A (zh) * | 2009-03-10 | 2010-09-15 | 华为技术有限公司 | 一种多通道编解码器运行方法及装置 |
CN102081546A (zh) * | 2009-11-30 | 2011-06-01 | 国际商业机器公司 | 通过分隔额外信息来内存优化虚拟机代码的方法和系统 |
CN102270181A (zh) * | 2010-06-01 | 2011-12-07 | 炬力集成电路设计有限公司 | 一种内存访问方法和装置 |
CN102567323A (zh) * | 2010-12-14 | 2012-07-11 | 腾讯科技(深圳)有限公司 | 一种应用程序文件搬移方法及系统 |
CN102279762A (zh) * | 2011-06-23 | 2011-12-14 | 杭州斯凯网络科技有限公司 | 在手机平台提高内存使用效率的方法 |
US20130346616A1 (en) * | 2012-06-25 | 2013-12-26 | Hitachi, Ltd. | Computer system and application program execution environment migration method |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106843836A (zh) * | 2016-12-21 | 2017-06-13 | 北京致远互联软件股份有限公司 | 动态表单的高级控件实现方法、装置及系统 |
CN106843836B (zh) * | 2016-12-21 | 2020-02-07 | 北京致远互联软件股份有限公司 | 动态表单的高级控件实现方法、装置及系统 |
CN117453548A (zh) * | 2023-10-26 | 2024-01-26 | 上海合芯数字科技有限公司 | 代码模块信息确定方法、装置、计算机设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
EP3198452A1 (en) | 2017-08-02 |
CN110941456B (zh) | 2022-09-23 |
EP3198452B1 (en) | 2021-06-30 |
EP3198452A4 (en) | 2017-11-15 |
WO2016134641A1 (en) | 2016-09-01 |
US20160246620A1 (en) | 2016-08-25 |
US20230117105A1 (en) | 2023-04-20 |
CN106796525B (zh) | 2019-11-19 |
CN110941456A (zh) | 2020-03-31 |
US9772865B2 (en) | 2017-09-26 |
US20170315830A1 (en) | 2017-11-02 |
US20200249925A1 (en) | 2020-08-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106796525A (zh) | 按需加载动态脚本语言代码以减少内存使用 | |
US8707263B2 (en) | Using a DSL for calling APIS to test software | |
CN108139891B (zh) | 用于生成建议以纠正未定义标记错误的方法和系统 | |
CN102200911B (zh) | 变量闭包 | |
US10564944B2 (en) | Efficient immutable syntax representation with incremental change | |
CN109086215B (zh) | 一种嵌入式软件单元测试用例生成方法及系统 | |
CN101208690B (zh) | 计算环境中翻译表达式 | |
US7197600B2 (en) | Transferring data along with code for program overlays | |
CN116166236A (zh) | 代码推荐方法、装置、计算机设备及存储介质 | |
CN115268879A (zh) | 代码处理方法、装置、电子设备及存储介质 | |
CN106502707B (zh) | 代码生成方法及装置 | |
CN110347416B (zh) | 脚本的更新方法和装置 | |
CN111949328A (zh) | 一种启动加速方法、装置、计算机设备及存储介质 | |
US11556317B2 (en) | Instruction translation support method and information processing apparatus | |
US20210373859A1 (en) | Instruction translation support method and information processing apparatus | |
CN112651214B (zh) | 数据表格明文转换为便于程序可读取的二进制密文的方法 | |
CN114706586A (zh) | 代码编译、代码运行方法、装置、计算机设备及存储介质 | |
CN112486465A (zh) | 一种代码更新方法及装置 | |
CN111061466A (zh) | 行为控制脚本语言的自动化转化方法、系统、终端及介质 | |
CN117289905B (zh) | 一种应用软件开发方法和装置、存储介质和电子设备 | |
CN111078631B (zh) | 文件的处理方法、终端设备及存储介质 | |
CN109858169B (zh) | 一种基于Modelica的模型平坦化方法 | |
CN110716746B (zh) | 将rn样式代码转换为小程序样式代码的方法及装置 | |
EP1306757A2 (en) | Transferring data along with code for program overlays | |
CN114253526A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |