CN106484489A - 一种扩展编程语言特性的方法及装置 - Google Patents

一种扩展编程语言特性的方法及装置 Download PDF

Info

Publication number
CN106484489A
CN106484489A CN201510551440.0A CN201510551440A CN106484489A CN 106484489 A CN106484489 A CN 106484489A CN 201510551440 A CN201510551440 A CN 201510551440A CN 106484489 A CN106484489 A CN 106484489A
Authority
CN
China
Prior art keywords
programming language
code
characteristic
markup information
source code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201510551440.0A
Other languages
English (en)
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.)
Alibaba Group Holding Ltd
Original Assignee
Alibaba Group Holding Ltd
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 Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201510551440.0A priority Critical patent/CN106484489A/zh
Publication of CN106484489A publication Critical patent/CN106484489A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

本申请公开了一种扩展编程语言特性的方法,包括:根据待扩展的编程语言特性和原始代码中承载所述特性的实体,生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述编程语言特性的语句;将生成的代码与原始代码合并,以在运行时扩展原始代码编程语言的特性。本申请同时提供一种扩展编程语言特性的装置。采用本申请提供的方法,不需要对编程语言自身做任何修改,而是采用了拦截操作行为并添加相应代码的方式,从而快捷、简便地实现了在运行时增强原始代码编程语言特性的功能,达到满足编程框架需求的目的。

Description

一种扩展编程语言特性的方法及装置
技术领域
本申请涉及编程技术,具体涉及一种扩展编程语言特性的方法。本申请同时提供一种扩展编程语言特性的装置。
背景技术
编程语言(programming language),是用来定义计算机程序的形式语言,俗称“计算机语言”,种类多种多样,总的来说可以分成机器语言、汇编语言、高级语言三大类。其中,由于高级语言简化了程序中的指令、屏蔽了底层硬件细节,开发者可以相对快捷、高效地编写出实现所需功能的程序,因此高级语言得到比较广泛的应用,例如:C#、C++、Java、JavaScript等。
每种编程语言,特别是高级语言,都有自己的优点和擅长的应用领域,同时每种编程语言通常也会有一些缺陷。例如,在基于Web交互的客户端应用程序中得到广泛应用的JavaScript脚本语言,其具有简洁、高安全性、动态性以及跨平台等多种优点,但是由于该语言自身仅仅是基于对象的,在面向对象编程方面以及元数据标注等方面都存在缺陷,对一些关键的语言特性无法提供支持,也无法实现一些关键的技术,例如:
1)类似Java那种对方法指定public、private等访问修饰符并进行访问限制;
2)对某个类、或某个类中的某个API的访问权限控制;
3)对同一套代码在不同类型平台上呈现不同API进行控制;
4)对同一套代码在不同版本平台上呈现不同API进行控制。
其他编程语言存在的缺陷可能与JavaScript不尽相同,但是通常也会存在类似的问题。在实际应用中,由于编程语言欠缺某种或者某些语言能力,在具体的应用开发过程中难以满足编程框架的需求,对于开发高质量的代码以及后期维护都造成了诸多不便。
为了增强编程语言的特性,一种比较直接的方法是修改编程语言,也就是直接从语言层面消除缺陷、增强语言对所需特性的支持。采用这种方法,不仅要考虑编程语言的兼容性,同时所涉及的修改不仅包括编程语言本身、还需要对编译器或者解释器进行相应修改,修改的复杂度通常比较高、工作量也比较大。而且即使采用这种方式进行了修改也可能难以满足编程框架的所有需求,仍以上述JavaScript语言为例,即使对该语言及解释器进行修改,一般来说也很难对上述2)、3)、4)所列特性提供支持。
发明内容
本申请实施例提供一种扩展编程语言特性的方法和装置,对于现有编程语言无法满足编程框架需求、以及修改编程语言复杂度高的问题,提供了一种扩展编程语言特性的技术方案,能够快捷、简便地满足编程框架的需求。
本申请提供一种扩展编程语言特性的方法,包括:
根据待扩展的编程语言特性和原始代码中承载所述特性的实体,生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述编程语言特性的语句;
将生成的代码与原始代码合并,以在运行时扩展原始代码编程语言的特性。
可选的,在所述生成在运行时对操作所述实体的行为进行拦截的代码之前,执行下述操作:
从原始代码中读取用于扩展编程语言特性的预设标注信息;
所述待扩展的编程语言特性包括:所述预设标注信息对应的编程语言特性;所述原始代码中承载所述特性的实体包括:被所述预设标注信息标注的实体。
可选的,所述从原始代码中读取用于扩展编程语言特性的预设标注信息,包括:从原始代码的注释中读取所述预设标注信息。
可选的,所述原始代码中承载所述特性的实体包括以下元素之一或者组合:类、变量、函数。
可选的,所述原始代码的编程语言为JavaScript。
可选的,当所述方法包含从原始代码中读取用于扩展编程语言特性的预设标注信息的步骤时,所述预设标注信息包括:遵循JSDoc规范的预设标注信息、和/或遵循JSDoc格式的扩展标注信息。
可选的,所述从原始代码中读取用于扩展编程语言特性的预设标注信息,包括:
以类为单位读取JSDoc标注信息;
对所述JSDoc标注信息进行分析,从中提取用于扩展编程语言特性的预设标注信息。
可选的,所述生成在运行时对操作所述实体的行为进行拦截的代码,采用如下方式实现:
根据ECMAScript6提供的代理机制,生成所述代码。
可选的,所述将生成的代码与原始代码合并,包括:
将所述生成的代码添加到所述实体所属类的构造函数中。
可选的,所述待扩展的编程语言特性包括以下之一或者组合:
对类中的方法实施基于私有方式的访问限制;
对类或者类中应用程序编程接口的访问权限控制;
对同一套代码在不同类型平台上呈现不同应用程序编程接口进行控制;
对同一套代码在不同版本平台上呈现不同应用程序编程接口进行控制。
相应的,本申请还提供一种扩展编程语言特性的装置,包括:
代码生成单元,用于根据待扩展的编程语言特性和原始代码中承载所述特性的实体,生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述编程语言特性的语句;
代码合并单元,用于将生成的代码与原始代码合并,以在运行时扩展原始代码编程语言的特性。
可选的,所述装置包括:
标注信息读取单元,用于在触发所述代码生成单元之前,从原始代码中读取用于扩展编程语言特性的预设标注信息;
所述代码生成单元所采用的待扩展编程语言特性包括:所述标注信息读取单元读取的预设标注信息对应的编程语言特性;所述代码生成单元所采用的实体包括:被所述预设标注信息标注的实体。
可选的,所述标注信息读取单元具体用于,从原始代码的注释中读取所述预设标注信息。
可选的,所述原始代码的编程语言为JavaScript,所述标注信息读取单元具体用于,从原始代码中读取遵循JSDoc规范的预设标注信息、和/或遵循JSDoc格式的扩展标注信息。
可选的,所述标注信息读取单元包括:
JSDoc标注信息读取子单元,用于以类为单位读取JSDoc标注信息;
预设标注信息提取子单元,用于对所述JSDoc标注信息进行分析,从中提取用于扩展编程语言特性的预设标注信息。
可选的,所述原始代码的编程语言为JavaScript,所述代码生成单元具体用于,根据ECMAScript6提供的代理机制生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述编程语言特性的语句。
可选的,所述代码合并单元具体用于,将所述代码生成单元生成的代码添加到所述实体所属类的构造函数中。
与现有技术相比,本申请具有以下优点:
本申请提供的一种扩展编程语言特性的方法,根据待扩展的编程语言特性和原始代码中承载所述特性的实体,生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述编程语言特性的语句,最后将生成的代码与原始代码合并,以在运行时扩展原始代码编程语言的特性。采用本方法,不需要对编程语言自身做任何修改,而是采用了拦截操作行为并添加相应代码的方式,从而快捷、简便地实现了在运行时增强原始代码编程语言特性的功能,达到满足编程框架需求的目的。进一步地,开发者可以在原始代码中添加预设标注信息、而本申请提供的上述方法可以在读取预设标注信息的基础上实施,从而能够实现自动根据标注信息扩展编程语言特性的功能,简化开发者的代码编写工作、提高开发效率。
附图说明
图1是本申请的一种扩展编程语言特性的方法的第一实施例的流程图;
图2是本申请的一种扩展编程语言特性的装置的第一实施例的示意图;
图3是本申请的一种扩展编程语言特性的方法的第二实施例的流程图;
图4是本申请的一种扩展编程语言特性的装置的第二实施例的示意图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是,本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此,本申请不受下面公开的具体实施的限制。
在本申请中,分别提供了一种扩展编程语言特性的方法,以及一种扩展编程语言特性的装置,在下面的实施例中逐一进行详细说明。在对实施例进行描述之前,先对本申请的技术方案以及实施例作简要说明。
针对编程语言由于自身缺陷等原因导致无法满足编程框架需求的问题,例如:无法支持private私有访问修饰符并进行访问限制、无法进行访问权限控制、或者无法进行版本控制等,比较容易想到的方式是对编程语言进行修改,不仅复杂度高、工作量大,而且还可能无法满足编程框架的全部需求。针对该问题,本申请的发明人在研发工作中发现,可以摒弃上述常规思路,而采用一种扩展编程语言特性的新思路:在原始代码基础上生成具备拦截功能的代码、并在生成的代码中实现对所需语言特性的支持,从而可以在运行时增强原始代码编程语言的特性,简便、快捷地满足编程框架的需求。
进一步地,在上述核心技术方案的基础上,发明人进一步提出了扩展技术方案:可以预先定义用于扩展编程语言特性的标注信息,开发人员在编写原始代码时只需要按照约定进行相应的标注,本技术方案则可以在读取标注信息的基础上、采用上述方式在原始代码中生成支持所需语言特性的扩展代码,从而实现了自动根据标注信息扩展编程语言特性的功能,简化开发者的代码编写工作、提高开发效率。
为了对本申请技术方案的实施方式进行充分地说明,后续文字中将针对上述的核心技术方案和扩展技术方案,分别提供两个实施例加以描述。
需要说明的是,由于JavaScript语言目前在互联网应用开发中得到了比较广泛的应用,而且该语言也存在扩展某些语言特性的需求,因此在本文的后续实施例中以JavaScript语言为例进行描述。但是本申请的技术方案并不仅仅局限于扩展JavaScript语言的特性,对于其他具有类似需求的编程语言,只要具备对实体操作行为进行拦截的能力,同样也可以采用本申请的技术方案进行相应扩展。下面对本申请的实施例进行详细说明。
请参考图1,其为本申请的一种扩展编程语言特性的方法的第一实施例的流程图。所述方法包括如下步骤:
步骤101:根据待扩展的编程语言特性和原始代码中承载所述特性的实体,生成在运行时对操作所述实体的行为进行拦截的代码,并在其中添加实现所述编程语言特性的语句。
在具体实施时,所述待扩展的编程语言特性,可以根据所述编程语言的自身特点以及具体编程框架的需求来确定。所述实体可以是原始代码中包含的以下元素之一或者组合:类、变量、函数。
以JavaScript编程语言为例,由于该语言自身是基于对象的、而非面向对象的,因此在面向对象编程方面存在一些缺陷,例如不具备象Java等面向对象语言那样将成员声明为公用(public)或者私有(private)的内置机制,因此自然也无法对私有类型的成员进行访问控制;此外,JavaScript编程语言也不具备以下特性:对类或者类中应用程序编程接口的访问权限控制;对同一套代码在不同类型平台上呈现不同应用程序编程接口进行控制;对同一套代码在不同版本平台上呈现不同应用程序编程接口进行控制。对于JavaScript来说,上述所列都属于待扩展的编程语言特性,而根据不同编程框架的需求,JavaScript语言可能还缺少对其他特性的支持,此处不一一列举。
承载待扩展编程语言特性(简称待扩展特性)的实体,通常是指待扩展特性发生作用的目标实体,例如,在用JavaScript语言编写的原始代码中,希望对类ClassA中的某个成员函数method1(也称方法)进行类似private方式的访问限制。那么,待扩展特性为:对类中的方法实施基于私有方式的访问限制,而承载该待扩展特性的实体即为:所述ClassA类中的method1方法。
在本步骤中,根据待扩展的编程语言特性和原始代码中承载所述特性的实体,生成可以在运行时拦截对所述实体的操作行为的代码、并在该代码中添加实现所述编程语言特性的语句。也可以这样理解,在运行阶段对所述实体的操作行为,例如:对属性的访问(包括get和set)、对方法的调用等,会被所生成的代码拦截,而其中用于实现待扩展特性的语句也会得到相应的执行。
对于不同的编程语言可以采用不同的方式生成上述具有拦截功能的代码。在本实施例中,原始代码的编程语言为JavaScript,因此可以根据ECMAScript6提供的代理机制生成所述具有拦截功能的代码。
JavaScript是对由ECMA(European Computer Manufacturer's Association,欧洲计算机制造商联合会)定义的ECMAScript标准的实现,而ECMAScript6(简称ES6)提供了一种新的机制:Proxy(代理),用于修改某些操作的默认行为,等同于在语言层面做出修改,属于“元编程”(meta programming)。其中,对属性的访问,Proxy提供了get(target,propKey,receiver)和set(target,propKey,value,receiver)两个方法进行拦截;对方法的调用,Proxy提供了apply(receiver,...args)方法进行拦截;而对类本身的构造,Proxy提供了construct(receiver,...args)方法进行拦截。此外,对于其他一些对类的访问,Proxy也都有相应的机制可以进行拦截。
Proxy的基本定义方式如下所示:var proxy=new Proxy(target,handler)。其主要原理是将对target(目标对象)的操作行为转向到handler(处理器)中,也即对target进行上述代理封装后,所有对target的操作会由handler接管,如果handler中提供了对特定操作的定制处理,则执行相应处理,否则将该操作行为依然交由target处理。由此可见Proxy具有拦截功能,本实施例则可以利用Proxy机制的这一特性,在handler中实现所需的编程语言特性,例如:基于私有方式的访问限制、版本控制等。
为了便于理解,下面以具体的JavaScript原始代码片段为例,对本步骤的实施作进一步举例说明。原始代码片段如下所示:
为了对ClassA中的成员变量_name和ClassB中的成员函数privateMethod()实现基于私有方式的访问限制,可以利用Proxy机制分别为ClassA和ClassB生成如下所示的代码:
并在针对ClassA和ClassB的上述代码中分别添加对name的判断以及相应的处理语句,对于不满足要求的访问方式可以直接抛出异常,以实现基于私有方式的访问限制。添加上述判断及处理语句后的代码如下所示:
需要说明的是,上面给出的JavaScript代码片段只是对根据Proxy机制生成代码的简单示意,在具体应用中,可以根据具体需求生成更为复杂或者更为优化的代码,而无需局限于上述代码片段的形式。
步骤102:将生成的代码与原始代码合并,以在运行时扩展原始代码编程语言的特性。
将在步骤101中生成的代码添加到原始代码中,从而使得原始代码编程语言的特性得以增强。在具体实施时如果原始代码编程语言是需要编译执行的,那么可以用相应的编译器对合并后的原始代码进行编译,得到可执行的目标文件,如果原始代码编程语言是解释性编程语言,则可以直接在相应的环境中解释执行。
对于在原始代码中添加所述生成代码的具***置,可以根据原始代码编程语言的语法要求、运行功能的正确性、运行时开销等综合因素进行选择,在选定原始代码中的适当位置后,可以将所述扩展代码***该位置中,将原本位于该位置以及该位置之后的原始代码相应后移。
在本实施例中,原始代码编程语言是JavaScript语言,根据该语言的语法要求、以及运行时开销等综合因素,可以将步骤101生成的代码添加到承载编程语言特性的实体所属类的构造函数中,一方面可以在运行时减少对内存的占用,避免每构造一个对象都创建一个Proxy;另一方面,由于添加在构造函数中,便于正确地引用JavaScript中的this关键字,避免出现因为上下文变更导致引用错误的问题。
仍沿用在步骤101中给出的扩展JavaScript语言特性的具体例子,可以将针对ClassA和ClassB生成的代码,添加到原始代码中各自构造函数的结尾处。
完成上述代码合并操作后可以解释运行原始代码,如果在原始代码中有针对上述两个类的如下操作,将会看到相应的输出信息。为了便于理解,将所述输出信息列在访问操作之后,并用“//”符号进行分隔:
由此可见,通过在对操作行为进行拦截的扩展代码中,添加对name的判断及相应处理,实现了对_name变量和privateMethod()方法的访问限制,从而增强了JavaScript语言的特性,使其具有了对类中的成员实施基于私有方式的访问限制的特性,弥补了JavaScript语言的缺陷。
综上所述,采用本实施例提供的扩展编程语言特性的方法,不需要对编程语言自身做任何修改,而是采用了生成具有拦截操作行为功能的扩展代码、并针对待扩展编程语言特性添加相应处理语句的方式,从而快捷、简便地实现了在运行时增强原始代码编程语言特性的功能,达到满足编程框架需求的目的。
在上述的实施例中,提供了一种扩展编程语言特性的方法,与之相对应的,本申请还提供一种扩展编程语言特性的装置。请参看图2,其为本申请的一种扩展编程语言特性的装置的第一实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。
本实施例的一种扩展编程语言特性的装置,包括:代码生成单元201,用于根据待扩展的编程语言特性和原始代码中承载所述特性的实体,生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述编程语言特性的语句;代码合并单元202,用于将生成的代码与原始代码合并,以在运行时扩展原始代码编程语言的特性。
可选的,所述装置包括:
标注信息读取单元,用于在触发所述代码生成单元之前,从原始代码中读取用于扩展编程语言特性的预设标注信息;
所述代码生成单元所采用的待扩展编程语言特性包括:所述标注信息读取单元读取的预设标注信息对应的编程语言特性;所述代码生成单元所采用的实体包括:被所述预设标注信息标注的实体。
可选的,所述标注信息读取单元具体用于,从原始代码的注释中读取所述预设标注信息。
可选的,所述原始代码的编程语言为JavaScript,所述标注信息读取单元具体用于,从原始代码中读取遵循JSDoc规范的预设标注信息、和/或遵循JSDoc格式的扩展标注信息。
可选的,所述标注信息读取单元包括:
JSDoc标注信息读取子单元,用于以类为单位读取JSDoc标注信息;
预设标注信息提取子单元,用于对所述JSDoc标注信息进行分析,从中提取用于扩展编程语言特性的预设标注信息。
可选的,所述原始代码的编程语言为JavaScript,所述代码生成单元具体用于,根据ECMAScript6提供的代理机制生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述编程语言特性的语句。
可选的,所述代码合并单元具体用于,将所述代码生成单元生成的代码添加到所述实体所属类的构造函数中。
在上述提供的一种扩展编程语言特性的方法的第一实施例的基础上,本申请还提供了所述方法的第二实施例。在本实施例中,从原始代码中读取用于扩展编程语言特性的预设标注信息,并根据读取的预设标注信息生成实现相应编程语言特性的代码。本实施例与上述方法实施例步骤相同的部分不再赘述,下面重点描述不同之处。
请参考图3,其为本申请的一种扩展编程语言特性的方法的第二实施例的流程图。所述方法包括如下步骤:
步骤301:从原始代码中读取用于扩展编程语言特性的预设标注信息。
为了简化开发人员的工作量,可以预先约定标注待扩展编程语言特性的具体方式,开发人员在编写原始代码时按照该方式对相应实体进行标注,而本实施例则可以按照该方式从原始代码中提取标注信息,并在原始代码中加入支持相应语言特性的代码,从而实现了自动根据标注信息扩展编程语言特性的功能。
本步骤从原始代码中读取用于扩展编程语言特性的预设标注信息,根据预先约定的标注方式不同,本步骤可以采用相应的读取方式。例如:如果约定在实体名称中(例如变量名称或者方法名称)附加标注信息,则本步骤可以通过对原始代码中实体名称的分析提取预设标注信息。
为了避免对命名方式进行变更,作为一种更为通用的方式,可以约定在原始代码的注释中包含预设标注信息,本实施例即采用这种方式,即从原始代码的注释中读取预设标注信息。
预设标注信息的形式也可以预先约定,例如:可以采用预先设定的符号作为前缀,后面跟随预先设定的关键字,例如表明待扩展编程语言特性的全称或者缩写词等、以及所需的参数等。
在本实施例中,所述原始代码的编程语言为JavaScript,考虑到使用JavaScript语言的开发人员通常采用JSDoc对原始代码进行注释,为了减少开发人员的学习成本,因此本实施例在遵循JSDoc格式的基础上进行标注信息的扩展,开发人员按照JSDoc格式进行标注,本技术方案则按照JSDoc格式读取。
所述JSDoc是一门用于标注JavaScript源代码的语言,开发人员只要遵循JSDoc规范在JavaScript代码中添加相应的注释,就可以利用相应的JSDoc工具自动生成HTML或者Rich Text Format格式的API文档。
由于JSDoc本身已经提供了@public、@private等原生标注,实施本技术方案时可以复用这部分标注,而不用额外进行重复定义(第一实施例中的ClassA和ClassB中的成员即采用了原生标注)。因此本实施例中的原始代码可以包含以下两种标注信息:遵循JSDoc规范的标注信息、遵循JSDoc格式的扩展标注信息(也称为自定义标注信息),在本实施例中将上述两类标注信息统称为JSDoc标注信息。
为了便于理解,下面以具体的JavaScript原始代码片段为例,对本步骤的实施作进一步举例说明。原始代码片段如下所示:
上述代码片段是经过开发人员标注后的代码片段,其中@accessLevel system是为了扩展JavaScript语言“对类或者类中应用程序编程接口的访问权限控制”这一特性而标注的预设标注信息,表明只允许***应用访问被标注的实体systemInvoke()。其中,所述应用程序编程接口(简称API)是指,在某个类中定义的、可供外界访问的实体,可以包括:成员变量、成员函数(也称为方法)等。
在本实施例中,对于用JavaScript编写的原始代码,可以以类为单位读取JSDoc标注信息,即从以“/**”开头的注释中读取信息,并根据@字符提取JSDoc标注信息,然后再对JSDoc标注信息进行进一步分析,根据@字符后的关键字辨别是否为用于扩展编程语言特性的预设标注信息,如果是则提取该标注信息。
需要说明的是,在具体实施本技术方案时,如果采用本实施例提供的方式按照JSDoc格式对待扩展编程语言特性进行标注,由于这部分标注信息也会集成到经由后续步骤处理后的原始代码中,从而可以让代码做到“自解释”,为今后编程框架所配套的IDE支持“智能代码提示功能”提供方便的手段。
步骤302:根据所述预设标注信息以及被标注的实体,生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述预设标注信息对应的编程语言特性的语句。
步骤301通过对原始代码的解析读取了预设标注信息,根据预设标注信息可以获知待扩展的编程语言特性,通过原始代码的解析还可以获取与预设标注信息对应的被标注实体,本步骤根据上述信息,生成在运行时对操作所述实体的行为进行拦截的代码、并添加实现所述编程语言特性的语句。
仍沿用步骤301中给出的具体例子,针对已读取的预设标注信息以及被标注的实体systemInvoke()方法,利用Proxy机制生成拦截代码、并在其中添加相应的实现“访问权限控制”的语句,得到如下所示的代码片段:
在上述代码片段中,对实施访问的应用的级别进行判断,并根据判断结果进行相应的处理,如果实施访问的应用并非***应用,则可以直接抛出异常,从而实现对API的访问权限控制。
步骤303:将生成的代码与原始代码合并,以在运行时扩展原始代码编程语言的特性。
本步骤将生成的代码添加到原始代码中,添加的具***置可以根据原始代码编程语言的语法要求、运行功能的正确性、运行时开销等综合因素进行选择。例如,针对步骤302给出的具体例子,可以将生成的代码添加到ClassA的构造函数中。
在上面给出的具体例子中,对于如何扩展“访问权限控制”这一语言特性进行了说明,在具体实施本技术方案时,还可以采用上述类似的方式对编程语言的其他特性进行扩展,例如:对同一套代码在不同类型平台上呈现不同API进行控制,或者对同一套代码在不同版本平台上呈现不同API进行控制等。
对于“对同一套代码在不同类型平台上呈现不同API进行控制”这一特性,可以在生成的对API访问进行拦截的代码中、对当前平台类型进行检查(所述平台类型可以包括设备类型,如手表、手机、电视等,也可以包括软件***的类型),如果当前平台类型与被访问API不相符,则可以进行相应的处理,例如:直接抛出异常;否则允许执行对该API的访问。通过上述扩展方式使编程语言具备这一特性后,在开发过程中就可以针对不同类型平台维护一套代码,而不必开发多套代码,能够减少代码开发和维护的工作量。对于“对同一套代码在不同版本平台上呈现不同API进行控制”这一特性,其实现方法也是类似的,此处不再赘述。
在具体实施时,对于包含多个类的JavaScript原始代码,可以在步骤101中以类为单位读取针对每个类的预设标注信息,然后在步骤102中分别针对每个类生成相应的代码段,然后在步骤103中将生成的各代码段合并到原始代码中。
至此,通过步骤301至步骤303的描述,提供了本申请的一种扩展编程语言特性的方法的另一种实施方式。在具体应用时,可以将步骤301-步骤303的操作封装为一个独立的预处理器(也可以称为“编译器”),通过预处理器的处理,可以根据原始代码中的标注信息自动转换生成内部处理代码、并更新到原始代码中。采用这种方式,对于开发人员来说,无需进行额外的编码工作,只需要在编写原始代码时按照预设方式对代码中的实体进行标注,然后利用该预处理器对原始代码进行处理,就可以在运行原始代码时通过动态拦截机制实现对被标注的实体的控制,增强编程语言的能力,满足编程框架的需求。
与上述的一种扩展编程语言特性的方法的第二实施例相对应,本申请还提供一种扩展编程语言特性的装置的第二实施例。请参看图4,其为本申请的一种扩展编程语言特性的装置的第二实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。
本实施例的一种扩展编程语言特性的装置,包括:标注信息读取单元401,用于在触发所述代码生成单元之前,从原始代码中读取用于扩展编程语言特性的预设标注信息;代码生成单元402,用于根据所述预设标注信息以及被标注的实体,生成在运行时对操作所述实体的行为进行拦截的代码,并在其中添加实现所述预设标注信息对应的编程语言特性的语句;代码合并单元403,用于将生成的代码与原始代码合并,以在运行时扩展原始代码编程语言的特性。
可选的,所述标注信息读取单元具体用于,从原始代码的注释中读取所述预设标注信息。
可选的,所述原始代码的编程语言为JavaScript,所述标注信息读取单元具体用于,从原始代码中读取遵循JSDoc规范的预设标注信息、和/或遵循JSDoc格式的扩展标注信息。
可选的,所述标注信息读取单元包括:
JSDoc标注信息读取子单元,用于以类为单位读取JSDoc标注信息;
预设标注信息提取子单元,用于对所述JSDoc标注信息进行分析,从中提取用于扩展编程语言特性的预设标注信息。
可选的,所述原始代码的编程语言为JavaScript,所述代码生成单元具体用于,根据ECMAScript6提供的代理机制生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述预设标注信息对应的编程语言特性的语句。
可选的,所述代码合并单元具体用于,将所述代码生成单元生成的代码添加到所述实体所属类的构造函数中。
本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
2、本领域技术人员应明白,本申请的实施例可提供为方法、***或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

Claims (17)

1.一种扩展编程语言特性的方法,其特征在于,包括:
根据待扩展的编程语言特性和原始代码中承载所述特性的实体,生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述编程语言特性的语句;
将生成的代码与原始代码合并,以在运行时扩展原始代码编程语言的特性。
2.根据权利要求1所述的扩展编程语言特性的方法,其特征在于,在所述生成在运行时对操作所述实体的行为进行拦截的代码之前,执行下述操作:
从原始代码中读取用于扩展编程语言特性的预设标注信息;
所述待扩展的编程语言特性包括:所述预设标注信息对应的编程语言特性;所述原始代码中承载所述特性的实体包括:被所述预设标注信息标注的实体。
3.根据权利要求2所述的扩展编程语言特性的方法,其特征在于,所述从原始代码中读取用于扩展编程语言特性的预设标注信息,包括:从原始代码的注释中读取所述预设标注信息。
4.根据权利要求1所述的扩展编程语言特性的方法,其特征在于,所述原始代码中承载所述特性的实体包括以下元素之一或者组合:类、变量、函数。
5.根据权利要求1-4任一项所述的扩展编程语言特性的方法,其特征在于,所述原始代码的编程语言为JavaScript。
6.根据权利要求5所述的扩展编程语言特性的方法,其特征在于,当所述方法包含从原始代码中读取用于扩展编程语言特性的预设标注信息的步骤时,所述预设标注信息包括:遵循JSDoc规范的预设标注信息、和/或遵循JSDoc格式的扩展标注信息。
7.根据权利要求6所述的扩展编程语言特性的方法,其特征在于,所述从原始代码中读取用于扩展编程语言特性的预设标注信息,包括:
以类为单位读取JSDoc标注信息;
对所述JSDoc标注信息进行分析,从中提取用于扩展编程语言特性的预设标注信息。
8.根据权利要求5所述的扩展编程语言特性的方法,其特征在于,所述生成在运行时对操作所述实体的行为进行拦截的代码,采用如下方式实现:
根据ECMAScript6提供的代理机制,生成所述代码。
9.根据权利要求8所述的扩展编程语言特性的方法,其特征在于,所述将生成的代码与原始代码合并,包括:
将所述生成的代码添加到所述实体所属类的构造函数中。
10.根据权利要求5所述的扩展编程语言特性的方法,其特征在于,所述待扩展的编程语言特性包括以下之一或者组合:
对类中的方法实施基于私有方式的访问限制;
对类或者类中应用程序编程接口的访问权限控制;
对同一套代码在不同类型平台上呈现不同应用程序编程接口进行控制;
对同一套代码在不同版本平台上呈现不同应用程序编程接口进行控制。
11.一种扩展编程语言特性的装置,其特征在于,包括:
代码生成单元,用于根据待扩展的编程语言特性和原始代码中承载所述特性的实体,生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述编程语言特性的语句;
代码合并单元,用于将生成的代码与原始代码合并,以在运行时扩展原始代码编程语言的特性。
12.根据权利要求11所述的扩展编程语言特性的装置,其特征在于,所述装置包括:
标注信息读取单元,用于在触发所述代码生成单元之前,从原始代码中读取用于扩展编程语言特性的预设标注信息;
所述代码生成单元所采用的待扩展编程语言特性包括:所述标注信息读取单元读取的预设标注信息对应的编程语言特性;所述代码生成单元所采用的实体包括:被所述预设标注信息标注的实体。
13.根据权利要求12所述的扩展编程语言特性的装置,其特征在于,所述标注信息读取单元具体用于,从原始代码的注释中读取所述预设标注信息。
14.根据权利要求12所述的扩展编程语言特性的装置,其特征在于,所述原始代码的编程语言为JavaScript,所述标注信息读取单元具体用于,从原始代码中读取遵循JSDoc规范的预设标注信息、和/或遵循JSDoc格式的扩展标注信息。
15.根据权利要求14所述的扩展编程语言特性的装置,其特征在于,所述标注信息读取单元包括:
JSDoc标注信息读取子单元,用于以类为单位读取JSDoc标注信息;
预设标注信息提取子单元,用于对所述JSDoc标注信息进行分析,从中提取用于扩展编程语言特性的预设标注信息。
16.根据权利要求11所述的扩展编程语言特性的装置,其特征在于,所述原始代码的编程语言为JavaScript,所述代码生成单元具体用于,根据ECMAScript6提供的代理机制生成在运行时对操作所述实体的行为进行拦截的代码、并在其中添加实现所述编程语言特性的语句。
17.根据权利要求16所述的扩展编程语言特性的装置,其特征在于,所述代码合并单元具体用于,将所述代码生成单元生成的代码添加到所述实体所属类的构造函数中。
CN201510551440.0A 2015-09-01 2015-09-01 一种扩展编程语言特性的方法及装置 Pending CN106484489A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510551440.0A CN106484489A (zh) 2015-09-01 2015-09-01 一种扩展编程语言特性的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510551440.0A CN106484489A (zh) 2015-09-01 2015-09-01 一种扩展编程语言特性的方法及装置

Publications (1)

Publication Number Publication Date
CN106484489A true CN106484489A (zh) 2017-03-08

Family

ID=58237670

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510551440.0A Pending CN106484489A (zh) 2015-09-01 2015-09-01 一种扩展编程语言特性的方法及装置

Country Status (1)

Country Link
CN (1) CN106484489A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111078566A (zh) * 2019-12-20 2020-04-28 大唐网络有限公司 一种基于es6的对象自检方法
CN115328544A (zh) * 2022-10-14 2022-11-11 统信软件技术有限公司 一种环境定制方法、计算设备及存储介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN100478874C (zh) * 2003-07-23 2009-04-15 微软公司 用于扩充配置相关可扩充软件的方法和***
CN103440440A (zh) * 2013-08-27 2013-12-11 浙江大学城市学院 一种增强JavaScript函数封装性的方法
CN104572072A (zh) * 2014-12-01 2015-04-29 北京百度网讯科技有限公司 一种对基于mvc模式的程序的语言转换方法与设备
CN104657189A (zh) * 2013-11-20 2015-05-27 财团法人资讯工业策进会 混合式动态码编译装置、方法及其服务***

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN100478874C (zh) * 2003-07-23 2009-04-15 微软公司 用于扩充配置相关可扩充软件的方法和***
CN103440440A (zh) * 2013-08-27 2013-12-11 浙江大学城市学院 一种增强JavaScript函数封装性的方法
CN104657189A (zh) * 2013-11-20 2015-05-27 财团法人资讯工业策进会 混合式动态码编译装置、方法及其服务***
CN104572072A (zh) * 2014-12-01 2015-04-29 北京百度网讯科技有限公司 一种对基于mvc模式的程序的语言转换方法与设备

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111078566A (zh) * 2019-12-20 2020-04-28 大唐网络有限公司 一种基于es6的对象自检方法
CN115328544A (zh) * 2022-10-14 2022-11-11 统信软件技术有限公司 一种环境定制方法、计算设备及存储介质
CN115328544B (zh) * 2022-10-14 2023-02-28 统信软件技术有限公司 一种环境定制方法、计算设备及存储介质

Similar Documents

Publication Publication Date Title
CN109597661B (zh) 一种业务功能配置方法及装置
Mellor et al. Guest editors' introduction: Model-driven development
WO2020173128A1 (zh) 软件开发工具包的生成方法、装置及终端设备
US8245186B2 (en) Techniques for offering and applying code modifications
US8479283B2 (en) Generating security validation code automatically
WO2019233293A1 (zh) 一种应用程序的开发方法和装置
CN105229603B (zh) 控制对应用编程接口的运行时访问
JP2009070372A (ja) 動的ウェブページコンテンツファイルからのサーバ側コード生成
US11048885B2 (en) Cognitive translation service integrated with context-sensitive derivations for determining program-integrated information relationships
US8195766B2 (en) Dynamic implicit localization of web content
CN102023856A (zh) 根据用户的需求格式化输出及操作伺服端业务数据的方法
US8881123B2 (en) Enabling symbol resolution of private symbols in legacy programs and optimizing access to the private symbols
CN107943465B (zh) 一种生成html表单的方法及装置
CN105373536A (zh) 一种实现dao接口的方法及装置
CN106484489A (zh) 一种扩展编程语言特性的方法及装置
US20090049423A1 (en) Javascripttm programming extension
US20160062748A1 (en) Embedded domain specific languages as first class code artifacts
JP2013186647A (ja) 難読化装置、難読化方法、及び難読化プログラム、並びに難読化されたソースコード
Bystrický et al. Preserving use case flows in source code: Approach, context, and challenges
Shetty et al. Crust: AC/C++ to Rust transpiler using a “nano-parser methodology” to avoid C/C++ safety issues in legacy code
CN103744687B (zh) 输入/输出端口的访问方法和装置
CN108089852B (zh) 建立属性访问的方法、介质、装置和计算设备
US7917893B2 (en) Using a system of annotations to generate views and adapters
CN106815003A (zh) 一种计算机语言的交互***及交互方法
Helland et al. ASP. NET Core 5 for Beginners: Kick-start your ASP. NET web development journey with the help of step-by-step tutorials and examples

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication

Application publication date: 20170308

RJ01 Rejection of invention patent application after publication