CN115981652B - 语言互操作方法、装置、存储介质及程序产品 - Google Patents
语言互操作方法、装置、存储介质及程序产品 Download PDFInfo
- Publication number
- CN115981652B CN115981652B CN202111200966.6A CN202111200966A CN115981652B CN 115981652 B CN115981652 B CN 115981652B CN 202111200966 A CN202111200966 A CN 202111200966A CN 115981652 B CN115981652 B CN 115981652B
- Authority
- CN
- China
- Prior art keywords
- language
- interoperation
- languages
- code
- abstract representation
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 150
- 238000003860 storage Methods 0.000 title claims abstract description 27
- 238000012545 processing Methods 0.000 claims description 94
- 239000000470 constituent Substances 0.000 claims description 89
- 230000015654 memory Effects 0.000 claims description 66
- 230000008569 process Effects 0.000 claims description 49
- 238000006243 chemical reaction Methods 0.000 claims description 39
- 238000013507 mapping Methods 0.000 claims description 29
- 238000004590 computer program Methods 0.000 claims description 8
- 230000002159 abnormal effect Effects 0.000 claims description 5
- 230000006870 function Effects 0.000 description 33
- 238000010586 diagram Methods 0.000 description 18
- 238000011161 development Methods 0.000 description 16
- 230000007246 mechanism Effects 0.000 description 14
- 238000013519 translation Methods 0.000 description 10
- 238000012423 maintenance Methods 0.000 description 9
- 230000005856 abnormality Effects 0.000 description 8
- 241000609666 Tuber aestivum Species 0.000 description 5
- 238000004458 analytical method Methods 0.000 description 5
- 230000009467 reduction Effects 0.000 description 4
- 239000008186 active pharmaceutical agent Substances 0.000 description 3
- 238000013473 artificial intelligence Methods 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 3
- 230000008859 change Effects 0.000 description 3
- 239000010979 ruby Substances 0.000 description 3
- 229910001750 ruby Inorganic materials 0.000 description 3
- 238000003491 array Methods 0.000 description 2
- 238000013528 artificial neural network Methods 0.000 description 2
- 230000003190 augmentative effect Effects 0.000 description 2
- 230000006399 behavior Effects 0.000 description 2
- 230000008901 benefit Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- ZLIBICFPKPWGIZ-UHFFFAOYSA-N pyrimethanil Chemical compound CC1=CC(C)=NC(NC=2C=CC=CC=2)=N1 ZLIBICFPKPWGIZ-UHFFFAOYSA-N 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- RYGMFSIKBFXOCR-UHFFFAOYSA-N Copper Chemical compound [Cu] RYGMFSIKBFXOCR-UHFFFAOYSA-N 0.000 description 1
- 102100030148 Integrator complex subunit 8 Human genes 0.000 description 1
- 101710092891 Integrator complex subunit 8 Proteins 0.000 description 1
- 230000003044 adaptive effect Effects 0.000 description 1
- 230000000712 assembly Effects 0.000 description 1
- 238000000429 assembly Methods 0.000 description 1
- 229910052802 copper Inorganic materials 0.000 description 1
- 239000010949 copper Substances 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000000835 fiber Substances 0.000 description 1
- 238000007667 floating Methods 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000010801 machine learning Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000004806 packaging method and process Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请涉及一种语言互操作方法、装置、存储介质及程序产品,所述方法包括,获取第一语言代码以及多种第二语言代码;根据多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,统一抽象表示是多种第二语言的互操作边界信息的二进制代码,多种第二语言的互操作边界信息表示多种第二语言的构成要素中允许与第一语言互相访问或使用的构成要素;根据统一抽象表示,编译第一语言代码,得到第一语言代码的二进制代码并输出。根据本申请实施例的语言互操作方法,能够在为编程语言提供语言互操作能力的同时,降低语言互操作实现的成本及操作难度,提高编程语言的语言互操作能力扩展性。
Description
技术领域
本申请涉及计算机编程领域,尤其涉及一种语言互操作方法、装置、存储介质及程序产品。
背景技术
随着计算机技术的发展,编程语言的种类也不断增加。编程语言作为一种开发工具,通常是针对特定的领域或行业的开发需求来设计的,例如,Java语言多应用于企业软件开发、安卓移动开发,大数据云计算领域等IT行业;Python语言常用在图形处理,科学计算,web编程,多媒体应用和引擎开发、机器学习、人工智能等领域。也就是说,每种编程语言擅长的领域不同。因此,针对不同的开发环境,需要适应性选择合适的编程语言来实现开发需求。
其中,一种编程语言不能满足特定环境下的开发需求时,或者相比该种编程语言,其他编程语言对于完成特定环境下开发需求中的某一部分具有优势时,可以采用该种编程语言结合其他编程语言来共同实现开发需求。为此,提出了语言互操作能力的概念。语言互操作能力表示不同编程语言作为同一系统的一部分进行互操作的能力。现有的语言互操作方法,虽然能够使得编程语言具有语言互操作能力,但其缺点也十分明显:一是开发成本和维护成本较高,二是难以进一步扩展实现多语言的互操作,三是使用编程语言实现语言互操作时需要多个步骤,操作复杂,降低开发者的体验。
有鉴于此,如何在为编程语言提供语言互操作能力的同时,降低语言互操作实现的成本及操作难度,提高编程语言的语言互操作能力扩展性,成为本领域的研究热点。
发明内容
有鉴于此,提出了一种语言互操作方法、装置、存储介质及程序产品,根据本申请实施例的语言互操作方法,能够在为编程语言提供语言互操作能力的同时,降低语言互操作实现的成本及操作难度,提高编程语言的语言互操作能力扩展性。
第一方面,本申请的实施例提供了一种语言互操作方法,所述方法包括:获取第一语言代码以及多种第二语言代码;根据所述多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,所述统一抽象表示是多种第二语言的互操作边界信息的二进制代码,所述多种第二语言的互操作边界信息表示多种第二语言的构成要素中允许与第一语言互相访问或使用的构成要素;根据所述统一抽象表示,编译所述第一语言代码,得到第一语言代码的二进制代码并输出,所述第一语言代码的二进制代码在执行时使得第一语言代码中的构成要素和多种第二语言中的任一第二语言的构成要素能够互相访问或使用。
根据本申请实施例的语言互操作方法,通过获取多种第二语言代码,可以根据多种第二语言代码生成多种第二语言的互操作边界信息的统一抽象表示,统一抽象表示是多种第二语言的互操作边界信息的二进制代码,使得统一抽象表示可以体现多种第二语言的构成要素中允许与第一语言互相访问或使用的构成要素,根据统一抽象表示,可以编译第一语言代码,得到第一语言代码的二进制代码。第一语言代码的二进制代码在执行时,使得第一语言代码中的构成要素和多种第二语言代码中的构成要素能够互相访问或使用,即使得第一语言具有与多种第二语言的互操作能力。统一抽象表示可以由多种第二语言的互操作边界信息得到,不涉及构成要素的内部方法,不需要解析多种第二语言的全部语法,使得本申请实施例的语言互操作方法具有较低的开发成本;多种语言的构成要素的内部方法的更新不会影响到多种第二语言的互操作边界信息,因此不会对统一抽象表示带来影响,不必对统一抽象表示进行维护,使得本申请实施例的语言互操作方法具有较低的维护成本;第二语言的增加使得多种第二语言的构成要素可能增加,不会影响到原有的构成要素,进而不会影响统一抽象表示原有的内容,便于第一语言和多种第二语言的互操作能力的进一步扩展;对于开发者而言,完成第一语言代码的撰写以及启动语言互操作方法即可,减少了开发者的工作量,降低了语言互操作方法的操作难度;综上所述,根据本申请实施例的语言互操作方法,能够在为编程语言提供语言互操作能力的同时,降低语言互操作实现的成本及操作难度,提高编程语言的语言互操作能力扩展性。
根据第一方面,在所述语言互操作方法的第一种可能的实现方式中,根据所述多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,包括:根据所述多种第二语言代码,识别所述多种第二语言的互操作边界信息;根据所述多种第二语言的互操作边界信息,生成所述统一抽象表示。
通过这种方式,使得统一抽象表示可以直接由互操作边界信息处理得到,避免对多种第二语言的大量语法进行分析,可以提升根据本申请实施例的语言互操作方法的效率。
根据第一方面的第一种可能的实现方式,在所述语言互操作方法的第二种可能的实现方式中,所述多种第二语言的互操作边界信息包括至少一个重复的构成要素和至少一个唯一的构成要素,根据所述多种第二语言的互操作边界信息,生成所述统一抽象表示,包括:根据所述多种第二语言的互操作边界信息的共性部分和特有部分生成所述统一抽象表示,其中,所述共性部分通过将所述至少一个重复的构成要素中的每一重复的构成要素作为一个构成要素得到,所述特有部分包括所述至少一个唯一的构成要素。
通过这种方式,可以减少统一抽象表示中构成要素的数量,使得统一抽象表示所占据的内存空间降低,并使得后续根据统一抽象表示编译第一语言代码的操作复杂度降低。
根据第一方面,以及以上第一方面的任意一种可能的实现方式,在所述语言互操作方法的第三种可能的实现方式中,根据所述统一抽象表示,编译所述第一语言代码,得到第一语言代码的二进制代码并输出,包括:根据所述统一抽象表示与第一语言的互操作边界信息的差异,得到对所述统一抽象表示与第一语言的语义进行处理的处理手段,所述第一语言的互操作边界信息根据所述第一语言代码确定;编译所述第一语言代码时使用所述处理手段,得到所述第一语言代码的二进制代码并输出。
第一语言的语义描述了计算机执行使用第一语言编写的程序时所表现的行为,例如逻辑运算、读写数据等。对统一抽象表示与第一语言的语义进行处理的处理手段,可以是对统一抽象表示与第一语言的语义进行融合的手段。例如将统一抽象表示的构成要素与第一语言的构成要素“融合”为以构成要素内存作为构成要素名称的同一构成要素。又例如为第一语言的构成要素增加标记,表示该构成要素中的参数以统一抽象表示的构成要素的实现方式来实现,从而将统一抽象表示的构成要素的语义“融合”到第一语言中。
通过这种方式,可以在对第一语言代码进行编译时,完成统一抽象表示与第一语言的语义的处理,使得访问或使用第二语言的构成要素的第一语言代码得以成功编译。在处理手段预先设置好的前提下,不需开发者在编译过程中再做出指示,可以进一步降低开发者的工作难度。在处理手段由开发者实时确定时,可以提升编译第一语言代码时,对所述统一抽象表示与所述第一语言的语义进行处理的灵活性。
根据第一方面的第三种可能的实现方式,在所述语言互操作方法的第四种可能的实现方式中,所述处理手段包括映射处理,其中,所述映射处理为针对所述第一语言代码中、与所述统一抽象表示内存相同、名称不同的构成要素,按照映射关系中对应内存的数据类型进行编译,所述映射关系指示所述统一抽象表示的构成要素、第一语言的互操作边界信息的构成要素与不同内存的数据类型的对应关系。
对于第一语言代码中的构成要素,在编译时仅关注其所需内存即可,不关注构成要素的名称,因此,可以预先统计第一语言代码与所述统一抽象表示的内存相同、名称不同的构成要素,并基于统计的内存相同、名称不同的构成要素的内存确定构成要素到不同内存的映射关系,使得在编译第一语言代码时基于映射关系可直接确定构成要素的内存,实现第一语言代码中与统一抽象表示内存相同、名称不同的构成要素的语义处理。
根据第一方面的第三种可能的实现方式或第四种可能的实现方式,在所述语言互操作方法的第五种可能的实现方式中,所述统一抽象表示的构成要素变量包括空指针、且所述第一语言的构成要素变量不包括空指针,所述处理手段包括第一运行时转换处理,其中,所述第一运行时转换处理为使用运行时转换代码确定所述运行时为空时,将当前编译的构成要素变量作为异常值抛出。
构成要素变量指的是构成要素的实例变量。由于编译过程中运行时是否为空与当前编译的构成要素的变量是否为空指针相关联,因此通过使用运行时转换代码确定运行时为空,可以间接确定当前编译的构成要素变量为空指针,使得变量传入第一语言代码后第一语言的安全性,在变量传入第一语言代码内部之前得以确定;通过在确定所述运行时为空时,将当前编译的构成要素变量作为异常值抛出,使得异常不会传入第一语言,从而能保证第一语言的安全性。
根据第一方面的第三种至第五种可能的实现方式中的任意一种可能的实现方式,在所述语言互操作方法的第六种可能的实现方式中,所述统一抽象表示的构成要素变量包括空指针、且所述第一语言的构成要素变量不包括空指针,所述处理手段包括第二运行时转换处理,其中,所述第二运行时转换处理为使用运行时转换代码确定所述运行时为空时,返回可选构成要素中的空值。
由于编译过程中运行时是否为空与当前编译的构成要素的变量是否为空指针相关联,因此通过使用运行时转换代码确定运行时为空,可以间接确定当前编译的构成要素变量为空指针,使得变量传入第一语言代码后第一语言的安全性,在变量传入第一语言代码内部之前得以确定;通过在确定所述运行时为空时,返回可选构成要素中的空值,使得编译第一语言代码时不会产生异常,从而能保证第一语言的安全性。
根据第一方面的第三种至第六种可能的实现方式中的任意一种可能的实现方式,在所述语言互操作方法的第七种可能的实现方式中,所述统一抽象表示与第一语言的互操作边界信息中,存在名称相同、语法不同的构成要素,所述处理手段包括语法差异标记处理,其中,所述语法差异标记处理为编译所述第一语言代码时,为第一语言的构成要素增加与所述统一抽象表示的构成要素对应的标记,所述标记指示第一语言代码中,所述具有标记的构成要素执行时,实现所述统一抽象表示的构成要素的语法。
通过这种方式,可以在编译时指示当前编译的构成要素应当使用的语法,避免因同一名称的构成要素对应第一语言和第二语言的多个语法时无法做出选择。使得能够提升本申请实施例的语言互操作方法支持的互操作能力。
第二方面,本申请的实施例提供了一种语言互操作装置,所述装置包括:编译器,用于:获取第一语言代码以及多种第二语言代码;根据所述多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,所述统一抽象表示是多种第二语言的互操作边界信息的二进制代码,所述多种第二语言的互操作边界信息表示多种第二语言的构成要素中允许与第一语言互相访问或使用的构成要素;根据所述统一抽象表示,编译所述第一语言代码,得到第一语言代码的二进制代码并输出,所述第一语言代码的二进制代码在执行时使得第一语言代码中的构成要素和多种第二语言中的任一第二语言的构成要素能够互相访问或使用。
根据第二方面,在所述语言互操作装置的第一种可能的实现方式中,根据所述多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,包括:根据所述多种第二语言代码,识别所述多种第二语言的互操作边界信息;根据所述多种第二语言的互操作边界信息,生成所述统一抽象表示。
根据第二方面的第一种可能的实现方式,在所述语言互操作装置的第二种可能的实现方式中,所述多种第二语言的互操作边界信息包括至少一个重复的构成要素和至少一个唯一的构成要素,根据所述多种第二语言的互操作边界信息,生成所述统一抽象表示,包括:根据所述多种第二语言的互操作边界信息的共性部分和特有部分生成所述统一抽象表示,其中,所述共性部分通过将所述至少一个重复的构成要素中的每一重复的构成要素作为一个构成要素得到,所述特有部分包括所述至少一个唯一的构成要素。
根据第二方面,以及以上第二方面的任意一种可能的实现方式,在所述语言互操作装置的第三种可能的实现方式中,根据所述统一抽象表示,编译所述第一语言代码,得到第一语言代码的二进制代码并输出,包括:根据所述统一抽象表示与第一语言的互操作边界信息的差异,得到对所述统一抽象表示与第一语言的语义进行处理的处理手段,所述第一语言的互操作边界信息根据所述第一语言代码确定;编译所述第一语言代码时使用所述处理手段,得到所述第一语言代码的二进制代码并输出。
根据第二方面的第三种可能的实现方式,在所述语言互操作装置的第四种可能的实现方式中,所述处理手段包括映射处理,其中,所述映射处理为针对所述第一语言代码中、与所述统一抽象表示内存相同、名称不同的构成要素,按照映射关系中对应内存的数据类型进行编译,所述映射关系指示所述统一抽象表示的构成要素、第一语言的互操作边界信息的构成要素与不同内存的数据类型的对应关系。
根据第二方面的第三种可能的实现方式或第四种可能的实现方式,在所述语言互操作装置的第五种可能的实现方式中,所述统一抽象表示的构成要素变量包括空指针、且所述第一语言的构成要素变量不包括空指针,所述处理手段包括第一运行时转换处理,其中,所述第一运行时转换处理为使用运行时转换代码确定所述运行时为空时,将当前编译的构成要素变量作为异常值抛出。
根据第二方面的第三种至第五种可能的实现方式中的任意一种可能的实现方式,在所述语言互操作装置的第六种可能的实现方式中,所述统一抽象表示的构成要素变量包括空指针、且所述第一语言的构成要素变量不包括空指针,所述处理手段包括第二运行时转换处理,其中,所述第二运行时转换处理为使用运行时转换代码确定所述运行时为空时,返回可选构成要素中的空值。
根据第二方面的第三种至第六种可能的实现方式中的任意一种可能的实现方式,在所述语言互操作装置的第七种可能的实现方式中,所述统一抽象表示与第一语言的互操作边界信息中,存在名称相同、语法不同的构成要素,所述处理手段包括语法差异标记处理,其中,所述语法差异标记处理为编译所述第一语言代码时,为第一语言的构成要素增加与所述统一抽象表示的构成要素对应的标记,所述标记指示第一语言代码中,所述具有标记的构成要素执行时,实现所述统一抽象表示的构成要素的语法。
第三方面,本申请的实施例提供了一种语言互操作装置,包括:处理器;用于存储处理器可执行指令的存储器;其中,处理器被配置为可以执行上述第一方面或者第一方面的多种可能的实现方式中的一种或几种的语言互操作方法。
第四方面,本申请实施例提供一种非易失性计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述第一方面或者第一方面的多种可能的实现方式中的一种或几种的语言互操作方法。
第五方面,本申请的实施例提供了一种计算机程序产品,包括计算机可读代码,或者承载有计算机可读代码的非易失性计算机可读存储介质,当所述计算机可读代码在电子设备中运行时,所述电子设备中的处理器执行上述第一方面或者第一方面的多种可能的实现方式中的一种或几种的语言互操作方法。
本申请的这些和其他方面在以下(多个)实施例的描述中会更加简明易懂。
附图说明
包含在说明书中并且构成说明书的一部分的附图与说明书一起示出了本申请的示例性实施例、特征和方面,并且用于解释本申请的原理。
图1示出现有技术中Kotlin语言和Java语言的互操作实现的一个示例。
图2示出现有技术中Kotlin语言和C语言的互操作实现的一个示例。
图3示出现有技术的GraalVM多语言虚拟机架构示意图。
图4示出根据本申请实施例的语言互操作方法的示例性应用场景。
图5示出根据本申请实施例的语言互操作方法的示例性示意图。
图6示出根据本申请实施例生成多种第二语言的互操作边界信息的统一抽象表示的一个示例。
图7示出根据本申请实施例的统一抽象表示的二进制格式的一个示例。
图8示出根据本申请实施例获取第一语言代码的二进制代码以及运行第一语言代码的二进制代码的一个示例。
图9示出根据本申请实施例的语言互操作装置的示例性结构示意图。
图10示出根据本申请实施例的语言互操作装置的示例性结构示意图。
具体实施方式
以下将参考附图详细说明本申请的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。
在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。
另外,为了更好的说明本申请,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有某些具体细节,本申请同样可以实施。在一些实例中,对于本领域技术人员熟知的方法、手段、元件和电路未作详细描述,以便于凸显本申请的主旨。
以下,对本文可能出现的术语进行解释。
构成要素:表示构成编程语言代码的要素。构成要素可以包括类、接口、函数、数据格式等代码中的内容中的至少一种,例如可以包括整数类型、浮点数类型、布尔类型等多种类型的数据格式,和/或多种类型的类、多种类型的接口、多种类型的函数等。
宿主语言、目标语言:当为A语言提供互操作能力,使其能够和B、C、D等语言进行互操作,即用A语言编写的类能直接与用B/C/D语言编写的类通信时,可称A语言为宿主语言,称B、C、D语言等为目标语言。
泛型擦除:在编译期间所有泛型信息(泛型的构成要素的实例的使用参数的实际类型,即类/接口/函数/数据结构等的具体类型)都被擦掉,以Java泛型为例,如泛型类型List<String>等在编译后都会变成List,Java虚拟机无法获取泛型附加的类型信息<String>,只能获取到List。
泛型实例化:类似C++模板采用的方式,产生模板的特性类型的构成要素的实例(例如类的实例等)的过程称为实例化。
字节码(Bytecode):通常是指已经编译但与当前使用环境的机器码(计算机可以直接执行的代码)无关,需要解释器(或虚拟机)转译后才能称为机器码的中间代码。字节码通常通过编译器生成。典型的例子为Java字节码,其中,Java、kotlin等语言通常都支持编译得到Java字节码。
垃圾回收:一种自动的内存管理形式,垃圾收集器尝试回收程序已分配但不再使用的内存,因这些内存不再被引用因此称为垃圾。
应用程序二进制接口(application binary interface,ABI):表示编译器和链接器遵守的一组规则,包括调用约定,名字修饰(name-mangling)等,调用约定用于规定函数如何翻译到汇编以及如何调用,名字修饰则用于描述如何暴露函数。
下面介绍现有技术提出的一种语言互操作方法。
现有技术提出的一种语言互操作方法的原理是,针对特定的两种编程语言之间设计特定的互操作机制,使得该两种编程语言具备与对方进行的互操作的能力。下面以Kotlin语言和Java语言的互操作实现、以及Kotlin语言与C语言的互操作实现为例进行描述。
Kotlin语言是一种用于现代多平台应用的静态编程语言,包括Java虚拟机(javavirtual machine,JVM)后端、Native后端、JavaScript后端等多个负责编译优化和目标代码生成的后端,各个不同后端处于不同的运行环境,具备不同的能力,因此无法互通。其中,JVM后端下Kotlin语言具备和Java语言的互操作能力,以及进一步利用Java本地接口(javanative interface,JNI)可具备与C语言的互操作能力。
图1示出现有技术中Kotlin语言和Java语言的互操作实现的一个示例。
如图1所示,开发者使用Kotlin语言编程得到Kotlin源文件(.kt),其中,编程过程中,调用了Java方法,例如Java语言的类或者接口等。在此情况下,在对Kotlin源文件进行编译时,依次执行以下步骤:
步骤一,Kotlin编译器(kotlinc)分别对Java源文件(.java)和Kotlin源文件进行解析,确定Kotlin源文件中调用的Java方法,此后,Kotlin编译器对Kotlin源文件进行编译,得到字节码文件(.class)。
步骤二,Java编译器(Javac)对由Kotlin编译器生成的字节码文件和Java源文件进行编译,得到字节码文件(.class)。
步骤三,由Kotlin编译器生成的字节码文件和由Java编译器生成的字节码文件共同打包得到Java文件包(.jar),Java虚拟机JVM运行Java文件包。在此情况下,Kotlin语言和Java语言可以实现互操作。
由图1的相关描述可知,Kotlin语言和Java语言的互操作主要是通过Kotlin编译器对Java源文件的直接解析,使得Kotlin编译器能确定Kotlin源文件中调用的Java方法并处理得到对应的字节码文件来实现的,这一过程是Kotlin编译器针对Kotlin语言和Java语言的互操作引入的新机制,该机制只能用于Kotlin语言和Java语言的互操作实现,无法在Kotlin语言和其他语言的互操作实现中进行复用。
图2示出现有技术中Kotlin语言和C语言的互操作实现的一个示例。
kotlin语言和C语言的互操作可以通过Java本地接口JNI实现。Java本地接口是一种标准的Java虚拟机接口,Java本地接口可以用于创建、检查、更新Java对象,调用Java方法等,它作为桥梁连接了Java虚拟机和C语言/C++语言,从而使Java虚拟机支持的多种语言获得了和C语言/C++语言的互操作能力。如图2所示,为使得Kotlin语言能够操作C语言,开发者需要根据Java本地接口JNI提供的应用程序编程接口(application programminginterface,API),在Java本地接口JNI中间层代码(.c或.cpp)中封装需要通过Java本地接口操作的方法,以便在kotlin代码执行时能够调用封装好的C语言/C++语言方法。为使得C语言能够操作Kotlin语言,需要在Java本地接口JNI的底层代码中封装应用程序编程接口API的相应能力,例如减弱互操作实现所需的调用步骤对垃圾回收带来的影响等,以便在C语言代码执行时能够通过应用程序编程接口API调用Kotlin语言方法/Java方法。通过这种方式,使得Kotlin语言和C语言具有互操作能力。
其中,完成代码编写、得到调用了Java方法的kotlin源文件可以是开发者在实现kotlin语言与C语言的互操作的第一步工作,为了完成kotlin源文件的编译,开发者还需使用开发环境完成以下操作:
第二步,根据kotlin源文件需要编译得到字节码文件,第三步,根据字节码文件生成C语言的头文件,第四步,根据C语言的头文件编写Java本地接口的相关代码,第五步,根据第四步得到的代码链接到库文件,以得到可执行文件。
由此可知,Kotlin语言与C语言的互操作采用的JNI机制使用流程复杂,需要多个步骤,而现有的其他Kotlin语言与C语言的互操作机制,诸如Java本地访问(Java NativeAccess,JNA)等框架虽然可以对JNI机制的使用步骤进行了简化,代价则是互操作性能的降低。
结合图1、图2,可以得出,使用现有技术提出的语言互操作方法,一种语言想要具备与多种其他语言都能互操作的能力,需要针对多种语言中的每一种都设计对应的互操作机制,使得一种语言通过增加可进行互操作的对象来扩展其互操作能力的实现代价过大,实用性差。且对于设计互操作机制的开发者来说,互操作机制涉及的每一种编程语言都要掌握,对开发者的个人能力要求较高,开发者在使用具有语言互操作性的编程语言进行互操作编程时,需要较多的步骤,降低开发者的体验。并且,开发者完成代码撰写后需要编译器对代码进行实现,这种语言互操作方法对于编译器来说,实现成本高、维护复杂。
下面介绍现有技术提出的另一种语言互操作方法。
现有技术提出的另一种语言互操作方法的原理是,提供一个通用的虚拟机来运行各种语言代码,可以为能够运行的全部代码中的任意代码组合之间提供语言互操作能力。下面以GraalVM多语言虚拟机为例对其实现多语言互操作的机制进行描述。
图3示出现有技术的GraalVM多语言虚拟机架构示意图。
GraalVM是一个在Java HotSpot虚拟机基础上增强而成的跨语言虚拟机,可以作为多种编程语言的运行平台使用。如图3所示,多种编程语言包括了Java、Scala、Groovy等基于Java虚拟机的语言,还包括了C、C++等基于低级虚拟机(Low Level Virtual Machine,LLVM)的语言,同时支持其他像JavaScript、Ruby和R语言等。GraalVM可以混合使用这些编程语言,支持不同语言中混用对方的接口和对象,也能够支持这些语言使用已经编写好的本地库文件。
Java HotSpot虚拟机通过JVM编译器接口(JVM Compiler Interface,JVMCI)将编译请求分发给Graal编译器,Graal编译器又通过JVM编译器接口响应Java HotSpot虚拟机发出的编译请求,在编译期间,高级操作(比如加载Java字段)的中间码会被转换为底层操作(比如读取地址+偏移量处的数据)的中间码。而底层操作的中间码最终会被翻译为机器码。
GraalVM的底层是Java HotSpot虚拟机,因此可以直接运行Java语言、Scala语言、groovy语言等基于Java虚拟机的语言。非JVM语言,即C、C++、JavaScript、Ruby和R语言等可以通过Truffle框架来实现在Java HotSpot虚拟机上运行。Truffle框架作为GraalVM多语言互操作机制中的重要组成部分,是一个基于Java的语言实现框架,基于Truffle的语言实现需要使用Java实现语言的词法分析、语法分析以及针对语法分析生成抽象语法树(abstract syntax tree,AST)的解释执行器。基于Truffle的语言实现本身以及Truffle框架均采用Java实现,因此可以运行在任何Java虚拟机JVM上。对于JavaScript、Ruby和R语言等编程语言,采用Truffle框架可以分别得到对应的解释执行器。对于C、C++语言等,采用Truffle框架可以得到称为Sulong的高性能LLVM字节码解释器。Java HotSpot虚拟机将调用Graal编译器所提供的接口,主动触发对非JVM语言的即时编译,将对抽象语法树的解释执行转换为执行即时编译后的机器码。
采用通用的虚拟机实现多语言互操作机制仍具有以下缺点:一是任何要进行互操作的语言都需要使用Truffle框架完整重写该语言的词法解析、语法解析以及AST解释执行器,而对于大多数的互操作场景来说,仅专注于互操作过程中调用的函数名称及调用约定即可,并不需要解释执行整个互操作目标语言,因此采用通用的虚拟机实现多语言互操作机制的时间成本和处理成本都较大。二是进行互操作的语言本身的语言演进过程中,语法特性等功能的演进会对该语言的互操作实现造成重大影响和变更,哪怕只是一个符号的语法改动也可能影响互操作机制的工作,可维护性差,进一步提高了互操作实现的维护成本及操作难度。
有鉴于此,本申请实施例提供一种语言互操作方法、装置、存储介质及程序产品,根据本申请实施例的语言互操作方法,能够在为编程语言提供语言互操作能力的同时,降低语言互操作实现的成本及操作难度,提高编程语言的语言互操作能力扩展性。
图4示出根据本申请实施例的语言互操作方法的示例性应用场景。
如图4所示,该应用场景可例如是针对鸿蒙系统的软件开发场景,软件开发中可能使用到多种编程语言:例如仓颉语言、Java语言、C语言、JS/TS语言等,上述多种编程语言代码可例如存储在存储器上。本申请实施例的语言互操作方法可以由处理器执行,以对存储器存储的某种编程语言提供互操作能力。
在执行本申请实施例的语言互操作方法前,可以先确定当前应用场景下的宿主语言以及目标语言。例如,结合当前应用场景以及存储器存储的代码对应的编程语言的多种类型(仓颉、Java、C、JS/TS),可以先选择最适用于当前应用场景的一种编程语言,例如选择仓颉语言,作为第一语言(宿主语言)。根据应用场景需求,可以选择存储器中存储的代码对应的编程语言中、除第一语言外的其他语言中的部分或全部,例如选择Java语言、C语言、JS/TS语言,作为多种第二语言(目标语言)。
确定第一语言以及多种第二语言后,处理器可以从存储器获取第一语言代码(第一语言的源文件或字节码文件等)以及多种第二语言代码(多种第二语言的源文件或字节码文件等),并执行本申请实施例的语言互操作方法。执行本申请实施例的语言互操作方法时,根据多种第二语言代码,生成多种第二语言的互操作边界信息统一抽象表示,其中,统一抽象表示是多种第二语言的互操作边界信息的二进制代码,多种第二语言的互操作边界信息可以包括多种第二语言的构成要素中允许与第一语言互相访问或使用的构成要素,例如,多种第二语言中允许与第一语言互相访问或使用的函数和/或类的名称及调用约定。根据统一抽象表示,编译第一语言代码,可以得到第一语言代码的二进制代码,例如字节码。在虚拟机运行基于本申请实施例的语言互操作方法得到的第一语言代码的二进制代码以及基于现有技术得到的第二语言代码的二进制代码时,可以使得第一语言具备与多种第二语言进行互操作的能力。
下面介绍本申请实施例的语言互操作方法。图5示出根据本申请实施例的语言互操作方法的示例性示意图。
如图5所示,根据本申请实施例的语言互操作方法包括步骤S1-S3:
S1,获取第一语言代码以及多种第二语言代码;
S2,根据多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,统一抽象表示是多种第二语言的互操作边界信息的二进制代码,多种第二语言的互操作边界信息表示多种第二语言的构成要素中允许与第一语言互相访问或使用的构成要素;
S3,根据所述统一抽象表示,编译所述第一语言代码,得到第一语言代码的二进制代码并输出,所述第一语言代码的二进制代码在执行时使得第一语言代码中的构成要素和多种第二语言中的任一第二语言的构成要素能够互相访问或使用。
第一语言代码中的构成要素和多种第二语言中的任一第二语言的构成要素互相访问或使用,可以是第一语言代码中的类和多种第二语言中的任一第二语言的类互相访问或使用、第一语言代码中的接口和多种第二语言中的任一第二语言的接口互相访问或使用等等。
根据本申请实施例的语言互操作方法,通过获取多种第二语言代码,可以根据多种第二语言代码生成多种第二语言的互操作边界信息的统一抽象表示,统一抽象表示是多种第二语言的互操作边界信息的二进制代码,使得统一抽象表示可以体现多种第二语言的构成要素中允许与第一语言互相访问或使用的构成要素,根据统一抽象表示,可以编译第一语言代码,得到第一语言代码的二进制代码。第一语言代码的二进制代码在执行时,使得第一语言代码中的构成要素和多种第二语言代码中的构成要素能够互相访问或使用,即使得第一语言具有与多种第二语言的互操作能力。统一抽象表示可以由多种第二语言的互操作边界信息得到,不涉及构成要素的内部方法,不需要解析多种第二语言的全部语法,使得本申请实施例的语言互操作方法具有较低的开发成本;多种语言的构成要素的内部方法的更新不会影响到多种第二语言的互操作边界信息,因此不会对统一抽象表示带来影响,不必对统一抽象表示进行维护,使得本申请实施例的语言互操作方法具有较低的维护成本;第二语言的增加使得多种第二语言的构成要素可能增加,不会影响到原有的构成要素,进而不会影响统一抽象表示原有的内容,便于第一语言和多种第二语言的互操作能力的进一步扩展;对于开发者而言,完成第一语言代码的撰写以及启动语言互操作方法即可,减少了开发者的工作量,降低了语言互操作方法的操作难度;综上所述,根据本申请实施例的语言互操作方法,能够在为编程语言提供语言互操作能力的同时,降低语言互操作实现的成本及操作难度,提高编程语言的语言互操作能力扩展性。
结合图4的应用场景,步骤S1中,第一语言可以是仓颉语言,多种第二语言可例如分别是C语言、Java语言、JS/TS语言,多种第二语言代码可例如分别是C语言代码、Java语言代码、JS/TS语言代码,其中,C语言代码可以是后缀为.c的文件或后缀为.h的文件,Java语言代码可以是后缀为.java的文件或后缀为.class的文件,JS/TS语言代码可以是后缀为.js的文件或后缀为.ts.d的文件。
本领域技术人员应理解,不同应用场景的第一语言可以不同,例如,在安卓软件开发应用场景中,第一语言可以是Java语言,在浏览器开发场景中,第一语言可以是JS语言。相应地,不同应用场景的多种第二语言也可以不同。本申请实施例对于第一语言和多种第二语言的具体类型不作限制。
其中,互操作边界信息、统一抽象表示的示例性解释说明,可以参照上文图4的应用场景的相关描述。
下面介绍本申请实施例的步骤S2的示例性实现方法。图6示出根据本申请实施例生成多种第二语言的互操作边界信息的统一抽象表示的一个示例。
在一种可能的实现方式中,步骤S2中,根据多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,包括:
根据所述多种第二语言代码,识别所述多种第二语言的互操作边界信息;
根据所述多种第二语言的互操作边界信息,生成所述统一抽象表示。
通过这种方式,使得统一抽象表示可以直接由互操作边界信息处理得到,避免对多种第二语言的大量语法进行分析,可以提升根据本申请实施例的语言互操作方法的效率。
举例来说,如图6所示,根据C语言代码识别到的C语言的互操作边界信息,可以包括function、char*、Struct、Pointer、Primitive Types等多个构成要素;根据Java语言代码识别到的Java语言的互操作边界信息,可以包括interface、class等多个构成要素;根据JS/TS语言代码识别到的JS/TS语言的互操作边界信息,可以包括function、PrimitiveTypes、Class等多个构成要素。在此情况下,多种第二语言的互操作边界信息,可以包括上述C语言的互操作边界信息、Java语言的互操作边界信息以及JS/TS语言的互操作边界信息。
本领域技术人员应理解,多种第二语言的互操作边界信息还可以包括与多种第二语言的构成要素相关的更多内容,只要包括构成要素的必须信息(例如函数和/或类的名称及调用约定),且不包括构成要素内部信息(例如函数内部信息和类的方法内部的执行信息)即可,本申请对于互操作边界信息的具体组成成分不作限制。
下面结合图6和图7介绍介绍本申请实施例根据多种第二语言的互操作边界信息生成统一抽象表示的示例性方法。
在一种可能的实现方式中,所述多种第二语言的互操作边界信息包括至少一个重复的构成要素和至少一个唯一的构成要素,根据所述多种第二语言的互操作边界信息,生成所述统一抽象表示,包括:
根据所述多种第二语言的互操作边界信息的共性部分和特有部分生成所述统一抽象表示,其中,所述共性部分通过将所述至少一个重复的构成要素中的每一重复的构成要素作为一个构成要素得到,所述特有部分包括所述至少一个唯一的构成要素。
通过这种方式,可以减少统一抽象表示中构成要素的数量,使得统一抽象表示所占据的内存空间降低,并使得后续根据统一抽象表示编译第一语言代码的操作复杂度降低。
举例来说,参见上文图6的相关描述,每种第二语言的互操作边界信息可能包括多个构成要素,多种第二语言的互操作边界信息包括的构成要素中,可能存在重复出现的构成要素(重复的构成要素)和仅一次出现的构成要素(唯一的构成要素)。以多种第二语言的互操作边界信息包括至少一个重复的构成要素和至少一个唯一的构成要素为例,针对多种第二语言的互操作边界信息,可以寻找共性部分,共性部分可以是多种第二语言中至少两种第二语言的互操作边界信息包括的相同的构成要素,可例如通过将至少一个重复的构成要素中的每一重复的构成要素作为一个构成要素得到。例如图6的示例中,至少一个重复的构成要素可包括Primitive Types数据格式(C语言)、Primitive Types数据格式(JS/TS语言)、function函数(C语言)、function函数(JS/TS语言)、class类(Java语言)、class类(JS/TS语言),在此情况下,共性部分可包括Primitive Types数据格式、function函数、class类。可以寻找特有部分,特有部分可例如是包括至少一个唯一的构成要素,例如图6的示例中,至少一个唯一的构成要素可包括char*数据格式(C语言)、Struct类(C语言)、Pointer指针(C语言)、interface接口(Java语言),在此情况下,特有部分可包括char*数据格式、Struct类、Pointer指针、interface接口。
通过上述得到的共性部分和特有部分,可以合成得到统一抽象表示。例如图6的示例中,统一抽象表示可以包括Primitive Types数据格式、function函数、class类、char*数据格式、Struct类、Pointer指针、interface接口。统一抽象表示可以存储为二进制格式,可以通过struct类的结构来存储,例如,以C语言、Java语言、JS/TS语言作为第二语言得到的统一抽象表示中,构成要素可包括class、interface、function、variable、parameter、field等,对应的数据类型可包括i8、i16、i32、i64、u8、u16、u32、u64、f16、f32、f64、char、bool、function、array、class、interface、generics等。图7示出根据本申请实施例的统一抽象表示的二进制格式的一个示例。其中,构成要素的相关信息可填充在Decl部分,数据类型的相关信息可填充在Type部分。
本领域技术人员应理解,可以用于生成统一抽象表示的互操作边界信息应不限于上述三种第二语言的互操作边界信息,在第二语言有更多种类时,可以包括更多种类的第二语言的互操作边界信息,生成更多种类的第二语言的互操作边界信息的统一抽象表示的方式,可以参照上述示例中根据C语言、Java语言、JS/TS语言的的互操作边界信息的统一抽象表示的示例,因此根据本申请实施例的语言互操作方法具有良好的可扩展性以及较低的开发成本。并且,由于统一抽象表示仅针对多种第二语言的互操作边界信息处理得到,因此,多种第二语言的互操作边界信息之外的语法特性等功能的演进,并不会对统一抽象表示造成影响,可以降低维护成本。
下面介绍本申请实施例的步骤S3的示例性实现方法。
在一种可能的实现方式中,步骤S3中,根据所述统一抽象表示,编译所述第一语言代码,得到第一语言代码的二进制代码并输出,包括:
根据所述统一抽象表示与第一语言的互操作边界信息的差异,得到对所述统一抽象表示与第一语言的语义进行处理的处理手段,所述第一语言的互操作边界信息根据所述第一语言代码确定;
编译所述第一语言代码时使用所述处理手段,得到所述第一语言代码的二进制代码并输出。
第一语言的语义描述了计算机执行使用第一语言编写的程序时所表现的行为,例如逻辑运算、读写数据等。对统一抽象表示与第一语言的语义进行处理的处理手段,可以是对统一抽象表示与第一语言的语义进行融合的手段。例如将统一抽象表示的构成要素与第一语言的构成要素“融合”为以构成要素内存作为构成要素名称的同一构成要素。又例如为第一语言的构成要素增加标记,表示该构成要素中的参数以统一抽象表示的构成要素的实现方式来实现,从而将统一抽象表示的构成要素的语义“融合”到第一语言中。
通过这种方式,可以在对第一语言代码进行编译时,完成统一抽象表示与第一语言的语义的处理,使得访问或使用第二语言的构成要素的第一语言代码得以成功编译。在处理手段预先设置好的前提下,不需开发者在编译过程中再做出指示,可以进一步降低开发者的工作难度。在处理手段由开发者实时确定时,可以提升编译第一语言代码时,对所述统一抽象表示与所述第一语言的语义进行处理的灵活性。
第一语言的互操作边界信息可以根据第一语言代码确定,可以包括第一语言代码中的构成要素。在图6的示例中,第一语言的互操作边界信息可以包括Class类、Interface接口、function函数。
其中,统一抽象表示与第一语言的互操作边界信息的差异不同时,处理手段可能也不同,下面分别针对不同的处理手段及其示例性实现方式进行描述。
在一种可能的实现方式中,所述处理手段包括映射处理,其中,所述映射处理为针对所述第一语言代码中、与所述统一抽象表示内存相同、名称不同的构成要素,按照映射关系中对应内存的数据类型进行编译,所述映射关系指示所述统一抽象表示的构成要素、第一语言的互操作边界信息的构成要素与不同内存的数据类型的对应关系。
举例来说,第一语言代码中的构成要素和统一抽象表示中的构成要素仅存在名称上的差异,不存在内存占用空间的差异时,可以选择使用包括映射处理的处理手段,映射处理使得编译第一语言代码时,可以按照预设的映射关系将第一语言中的构成要素映射为对应内存的数据类型再进行编译,以第二语言包括C语言为例,映射关系的一个示例如表1所示。
表1
第一语言代码中的构成要素 | 统一抽象表示中的构成要素 | 映射后的数据类型 |
Unit | Void | u1 |
Int8 | int8_t | i8 |
Uint8 | uint8_t | u8 |
Int16 | int16_t | i16 |
UInt16 | uint16_t | u16 |
Int32 | int32_t | i32 |
Uint32 | uint32_t | u32 |
Int64 | int64_t | i64 |
UInt64 | uint64_t | u64 |
Float16 | / | f16 |
Float32 | Float | f32 |
Float64 | Double | f64 |
参见表1,映射关系指示统一抽象表示的构成要素、第一语言的互操作边界信息的构成要素(例如第一语言代码中的构成要素)与不同内存的数据类型的对应关系,映射后的数据类型可以体现构成要素的内存占用空间。
对于第一语言代码中的构成要素,在编译时仅关注其所需内存即可,不关注构成要素的名称,因此,可以预先统计第一语言代码与所述统一抽象表示的内存相同、名称不同的构成要素,并基于统计的内存相同、名称不同的构成要素的内存确定构成要素到不同内存的映射关系,使得在编译第一语言代码时基于映射关系可直接确定构成要素的内存,实现第一语言代码中与统一抽象表示内存相同、名称不同的构成要素的语义处理。
多种第二语言包括Java语言时,Java语言的任何构成要素的实例变量(以下简称变量)都可能是值为空(null)的空指针,表示没有这个对象,那么对空指针直接访问其成员或调用其成员的属性和方法时,将在运行时抛出空指针异常(null pointer exception,NPE)。假设第一语言在其任何变量都不允许为空值时具有较高的安全性,第一语言与Java语言进行互操作时,第一语言调用的Java语言的变量传入第一语言,如果该变量恰好是空值,就会使得该值为空值的变量传入第一语言的运行时中,即使得第一语言的运行时出现空指针异常,破坏第一语言的安全性。
为了保护第一语言的安全性,在编译第一语言代码时,可以选择使用运行时转换代码。其中,运行时转换代码可以用来检查运行时是否为空。多个处理手段可能均使用运行时转换代码,但不同处理手段中运行时转换代码的使用方式可以不同。可以先对多种第二语言和第一语言的属性进行判断,根据多种第二语言和第一语言的属性的不同情况,结合应用场景的具体需求来确定使用哪一种处理手段。
在一种可能的实现方式中,所述统一抽象表示的构成要素变量包括空指针、且所述第一语言的构成要素变量不包括空指针,所述处理手段包括第一运行时转换处理,其中,所述第一运行时转换处理为使用运行时转换代码确定所述运行时为空时,将当前编译的构成要素变量作为异常值抛出。
构成要素变量指的是构成要素的实例变量。由于编译过程中运行时是否为空与当前编译的构成要素的变量是否为空指针相关联,因此通过使用运行时转换代码确定运行时为空,可以间接确定当前编译的构成要素变量为空指针,使得变量传入第一语言代码后第一语言的安全性,在变量传入第一语言代码内部之前得以确定;通过在确定所述运行时为空时,将当前编译的构成要素变量作为异常值抛出,使得异常不会传入第一语言,从而能保证第一语言的安全性。
例如,确定多种第二语言具有nullable属性,第一语言不具有nullable属性时,也即统一抽象表示的构成要素变量包括空指针,第一语言的构成要素变量不包括空指针时,认为多种第二语言中至少有一种第二语言具备较低的安全性,第一语言具备较高的安全性。如果应用场景的需求是保证第一语言的安全性,可以选择包括第一运行时转换处理的处理手段。第一运行时转换处理使得对第一语言代码进行编译过程中,在多种第二语言的变量赋值到第一语言的变量时使用运行时转换代码,用来检查运行时是否为空。如果运行时为空,可以直接抛出空指针异常NPE,也即将当前编译的构成要素变量作为异常值抛出。在此情况下,空指针异常仍旧抛出,但空指针异常仅出现在第一语言的互操作的边界信息部分,不会进一步向第一语言内传播,因此可以保证第一语言的安全性。
在一种可能的实现方式中,所述统一抽象表示的构成要素变量包括空指针、且所述第一语言的构成要素变量不包括空指针,所述处理手段包括第二运行时转换处理,其中,所述第二运行时转换处理为使用运行时转换代码确定所述运行时为空时,返回可选构成要素中的空值。
由于编译过程中运行时是否为空与当前编译的构成要素的变量是否为空指针相关联,因此通过使用运行时转换代码确定运行时为空,可以间接确定当前编译的构成要素变量为空指针,使得变量传入第一语言代码后第一语言的安全性,在变量传入第一语言代码内部之前得以确定;通过在确定所述运行时为空时,返回可选构成要素中的空值,使得编译第一语言代码时不会产生异常,从而能保证第一语言的安全性。
例如,确定多种第二语言具有nullable属性,第一语言不具有nullable属性时,也即统一抽象表示的构成要素变量包括空指针,第一语言的构成要素变量不包括空指针时,认为多种第二语言中至少有一种第二语言具备较低的安全性,第一语言具备较高的安全性。如果应用场景的需求是保证第一语言的安全性,可以选择包括第二运行时转换处理的处理手段。第二运行时转换处理使得对第一语言代码进行编译过程中,在多种第二语言变量赋值到第一语言的变量时使用运行时转换代码,用来检查运行时是否为空。如果运行时为空,可以返回可选构成要素中的空值(None),如果运行时不为空,可以返回可选构成要素中的具体值。在此情况下,不会抛出空指针异常,因此可以保证第一语言的安全性。
在一种可能的实现方式中,除上述第一语言具备较高的安全性时,要求保证第一语言的安全性的应用场景,也可能存在不要求保证第一语言具备安全性的应用场景。例如,确定多种第二语言具有nullable属性,第一语言不具有nullable属性时,也即统一抽象表示的构成要素变量包括空指针,第一语言的构成要素变量不包括空指针时,认为多种第二语言中至少有一种第二语言具备较低的安全性,第一语言具备较高的安全性。如果应用场景的需求是不必保证第一语言的安全性,可以选择在对第一语言代码进行编译时,不使用运行时转换代码。在此情况下,能够最大程度地保证第一语言与多种第二语言的互操作能力。
在一种可能的实现方式中,除上述第一语言具备安全性的情况,第一语言也可能不具备安全性。例如,确定第一语言具有nullable属性时,也即第一语言的构成要素变量包括空指针时,此时第一语言本身不具备较高的安全性,因此不管多种第二语言的是否具有nullable属性,也即统一抽象表示的构成要素变量是否包括空指针,都不会进一步破坏第一语言的安全性,在此情况下,可以选择在对第一语言代码进行编译时,不使用运行时转换代码。
本领域技术人员应理解,上述第一运行时转换处理的处理手段、第二运行时转换处理的处理手段的确定方式,可以是固定的、预先设置好的,也可以由开发者进行实时确定,本申请对此不作限制。
在一种可能的实现方式中,所述统一抽象表示与第一语言的互操作边界信息中,存在名称相同、语法不同的构成要素,所述处理手段包括语法差异标记处理,其中,所述语法差异标记处理为编译所述第一语言代码时,为第一语言的构成要素增加与所述统一抽象表示的构成要素对应的标记,所述标记指示第一语言代码中,所述具有标记的构成要素执行时,实现所述统一抽象表示的构成要素的语法。
通过这种方式,可以在编译时指示当前编译的构成要素应当使用的语法,避免因同一名称的构成要素对应第一语言和第二语言的多个语法时无法做出选择。使得能够提升本申请实施例的语言互操作方法支持的互操作能力。
举例来说,当第一语言的构成要素和统一抽象表示中的构成要素名称相同但某些特性差异相当巨大,例如实现机制语法等要求都不同时,也即,统一抽象表示与第一语言的互操作边界信息中,存在名称相同、语法不同的构成要素时,可以选择包括语法差异标记处理的处理手段。语法差异标记处理使得编译第一语言代码时,构成要素可以按照其具有的标记对应的第二语言的语法来编译。也即,具有标记的构成要素执行时,实现统一抽象表示的构成要素的语法。例如第二语言是Java语言,Java语言中的泛型采用泛型擦除来实现,而当第一语言泛型采用实例化实现时,第二语言和第一语言在语义的处理上就会产生巨大的冲突。可以通过对统一抽象表示中的泛型构成要素进行标记(标记存储在attributes属性中),如果期望在第一语言中调用Java语言的泛型类、接口等,可以在第一语言中添加明确的标记语法(比如注解、宏等),也即,为第一语言的构成要素增加与统一抽象表示的构成要素对应的标记,用来区分一个泛型类属于第一语言还是第二语言,比如通过@java等来标记一个泛型构成要素,表示该构成要素中的泛型采用泛型擦除来实现。
下面结合第一语言代码示例来对语法差异标记进行示例性描述。
//第一语言代码示例
package example
import java.GenericClassExample
@java
class B<:GenericClassExample{
override public foo<T>(t:T){
//do something
}
}
func main(){
var p=B()
p.foo(p)
}
如上述第一语言代码,通过@java来标记第一语言中的构成要素B类,该B类继承了来自java的泛型类型,并重写了foo泛型函数,在此情况下,泛型参数T可以采用Java语言的泛型擦除处理,可以通过@java进行标记用于区别第一语言本身泛型函数的处理,也即为第一语言的构成要素增加与统一抽象表示的构成要素对应的标记(例如@java),具有标记的构成要素执行时,实现统一抽象表示的构成要素的语法(例如泛型擦除)。
通过语法差异标记可用于区分各种语义上的巨大差异,在此以包括Java语言的第二语言和第一语言的泛型作为示例。本领域技术人员应理解,语法差异标记同样也适用于其他第二语言与第一语言的构成要素,例如C语言、JS/TS语言等。
通过上述多种处理手段,可以获得由第一语言代码编译得到的第一语言代码的二进制代码,例如字节码。第一语言代码的二进制代码,与由多种第二语言代码编译得到的第二语言代码的二进制代码,可以一同输入到虚拟机运行,即可实现第一语言和多种第二语言的互操作。图8示出根据本申请实施例获取第一语言代码的二进制代码以及运行第一语言代码的二进制代码的一个示例。其中,如果第二语言包括C语言等比较基础的语言,在虚拟机进行运行时,可以直接使用对应语言的库文件。
根据本申请实施例的语言互操作方法,如表2所示,一般可在3/人年的实现成本下使第一语言具备基本的语言互操作能力,相比现有技术平均40+/人年的实现成本,本申请实施例的语言互操作方法成本低、工作量小;采用统一抽象表示来表征多种第二语言的互操作边界信息,使得维护成本大大降低;第二语言的特性变更对统一抽象表示造成影响极小,仅专注于互操作边界信息也可以提高方案稳定性,在为第一语言增加与新的第二语言的互操作能力时依然可使用该语言互操作方法;互操作边界信息可随着第一语言的能力的扩充而随时扩充,只需按特性级别对统一抽象表示进行扩展即可,如新增C语言的数组互操作功能,并不影响其他部分已有的互操作功能;用户使用步骤缩减到撰写第一语言的代码、作出编译指示两步完成,并且编译所述第一语言代码时使用的处理手段简洁明了,这为用户带来较好的体验。
表2
本申请方法 | 现有技术 | |
实现成本 | 8/人年 | 40/人年+ |
可维护性 | 高 | 低 |
扩展性 | 高 | 低 |
用户体验 | 优 | 差 |
图9示出根据本申请实施例的语言互操作装置的示例性结构示意图。
如图9所示,在一种可能的实现方式中,本申请的实施例提供了一种语言互操作装置,所述装置包括:编译器90,用于:获取第一语言代码以及多种第二语言代码;根据所述多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,所述统一抽象表示是多种第二语言的互操作边界信息的二进制代码,所述多种第二语言的互操作边界信息表示多种第二语言的构成要素中允许与第一语言互相访问或使用的构成要素;根据所述统一抽象表示,编译所述第一语言代码,得到第一语言代码的二进制代码并输出,所述第一语言代码的二进制代码在执行时使得第一语言代码中的构成要素和多种第二语言中的任一第二语言的构成要素能够互相访问或使用。
在一种可能的实现方式中,根据所述多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,包括:根据所述多种第二语言代码,识别所述多种第二语言的互操作边界信息;根据所述多种第二语言的互操作边界信息,生成所述统一抽象表示。
在一种可能的实现方式中,所述多种第二语言的互操作边界信息包括至少一个重复的构成要素和至少一个唯一的构成要素,根据所述多种第二语言的互操作边界信息,生成所述统一抽象表示,包括:根据所述多种第二语言的互操作边界信息的共性部分和特有部分生成所述统一抽象表示,其中,所述共性部分通过将所述至少一个重复的构成要素中的每一重复的构成要素作为一个构成要素得到,所述特有部分包括所述至少一个唯一的构成要素。
在一种可能的实现方式中,根据所述统一抽象表示,编译所述第一语言代码,得到第一语言代码的二进制代码并输出,包括:根据所述统一抽象表示与第一语言的互操作边界信息的差异,得到对所述统一抽象表示与第一语言的语义进行处理的处理手段,所述第一语言的互操作边界信息根据所述第一语言代码确定;编译所述第一语言代码时使用所述处理手段,得到所述第一语言代码的二进制代码并输出。
在一种可能的实现方式中,所述处理手段包括映射处理,其中,所述映射处理为针对所述第一语言代码中、与所述统一抽象表示内存相同、名称不同的构成要素,按照映射关系中对应内存的数据类型进行编译,所述映射关系指示所述统一抽象表示的构成要素、第一语言的互操作边界信息的构成要素与不同内存的数据类型的对应关系。
在一种可能的实现方式中,所述统一抽象表示的构成要素变量包括空指针、且所述第一语言的构成要素变量不包括空指针,所述处理手段包括第一运行时转换处理,其中,所述第一运行时转换处理为使用运行时转换代码确定所述运行时为空时,将当前编译的构成要素变量作为异常值抛出。
在一种可能的实现方式中,所述统一抽象表示的构成要素变量包括空指针、且所述第一语言的构成要素变量不包括空指针,所述处理手段包括第二运行时转换处理,其中,所述第二运行时转换处理为使用运行时转换代码确定所述运行时为空时,返回可选构成要素中的空值。
在一种可能的实现方式中,所述统一抽象表示与第一语言的互操作边界信息中,存在名称相同、语法不同的构成要素,所述处理手段包括语法差异标记处理,其中,所述语法差异标记处理为编译所述第一语言代码时,为第一语言的构成要素增加与所述统一抽象表示的构成要素对应的标记,所述标记指示第一语言代码中,所述具有标记的构成要素执行时,实现所述统一抽象表示的构成要素的语法。
本申请的实施例提供了一种语言互操作装置,包括:处理器以及用于存储处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令时实现上述方法。
本申请的实施例提供了一种非易失性计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述方法。
本申请的实施例提供了一种计算机程序产品,包括计算机可读代码,或者承载有计算机可读代码的非易失性计算机可读存储介质,当所述计算机可读代码在电子设备的处理器中运行时,所述电子设备中的处理器执行上述方法。
图10示出根据本申请实施例的语言互操作装置的示例性结构示意图。
如图10所示,语言互操作装置的可以包括桌面型计算机、膝上型计算机、手持计算机、笔记本电脑、超级移动个人计算机(ultra-mobile personal computer,UMPC)、上网本、个人数字助理(personal digital assistant,PDA)、增强现实(augmented reality,AR)设备、虚拟现实(virtual reality,VR)设备、人工智能(artificial intelligence,AI)设备、可穿戴式设备、车载设备、智能家居设备、或智慧城市设备、服务器设备中的至少一种。本申请实施例对该语言互操作装置的具体类型不作特殊限制。
语言互操作装置可以包括处理器110,存储器121。可以理解的是,本申请实施例示意的结构并不构成对语言互操作装置的具体限定。在本申请另一些实施例中,语言互操作装置可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
处理器110可以包括一个或多个处理单元,例如:处理器110可以包括应用处理器(application processor,AP),调制解调处理器,图形处理器(graphics processingunit,GPU),图像信号处理器(image signal processor,ISP),控制器,视频编解码器,数字信号处理器(digital signal processor,DSP),基带处理器,和/或神经网络处理器(neural-network processing unit,NPU)等。其中,不同的处理单元可以是独立的器件,也可以集成在一个或多个处理器中。
处理器110可以根据指令操作码和时序信号,产生操作控制信号,完成获取指令和执行指令的控制。
处理器110中还可以设置存储器,用于存储指令和数据。在一些实施例中,处理器110中的存储器可以为高速缓冲存储器。该存储器可以保存处理器110用过或使用频率较高的指令或数据。如果处理器110需要使用该指令或数据,可从该存储器中直接调用。避免了重复存取,减少了处理器110的等待时间,因而提高了系统的效率。
存储器121可以用于存储计算机可执行程序代码,该可执行程序代码包括指令。存储器121可以包括存储程序区和存储数据区。其中,存储程序区可存储操作系统,至少一个功能所需的应用程序(比如处理手段)等。存储数据区可存储语言互操作装置使用过程中所创建的数据(比如统一抽象表示)等。此外,存储器121可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件,闪存器件,通用闪存存储器(universal flash storage,UFS)等。处理器110通过运行存储在存储器121的指令,和/或存储在设置于处理器中的存储器的指令,执行语言互操作装置的各种功能方法或上述语言互操作方法。
计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RandomAccess Memory,RAM)、只读存储器(Read Only Memory,ROM)、可擦式可编程只读存储器(Electrically Programmable Read-Only-Memory,EPROM或闪存)、静态随机存取存储器(Static Random-Access Memory,SRAM)、便携式压缩盘只读存储器(Compact Disc Read-Only Memory,CD-ROM)、数字多功能盘(Digital Video Disc,DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。
这里所描述的计算机可读程序指令或代码可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
用于执行本申请操作的计算机程序指令可以是汇编指令、指令集架构(Instruction Set Architecture,ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(Local Area Network,LAN)或广域网(WideArea Network,WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(Field-ProgrammableGate Array,FPGA)或可编程逻辑阵列(Programmable Logic Array,PLA),该电子电路可以执行计算机可读程序指令,从而实现本申请的各个方面。
这里参照根据本申请实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本申请的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
附图中的流程图和框图显示了根据本申请的多个实施例的装置、系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。
也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行相应的功能或动作的硬件(例如电路或ASIC(Application SpecificIntegrated Circuit,专用集成电路))来实现,或者可以用硬件和软件的组合,如固件等来实现。
尽管在此结合各实施例对本发明进行了描述,然而,在实施所要求保护的本发明过程中,本领域技术人员通过查看所述附图、公开内容、以及所附权利要求书,可理解并实现所述公开实施例的其它变化。在权利要求中,“包括”(comprising)一词不排除其他组成部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其它单元可以实现权利要求中列举的若干项功能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措施不能组合起来产生良好的效果。
以上已经描述了本申请的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
Claims (11)
1.一种语言互操作方法,其特征在于,所述方法包括:
获取第一语言代码以及多种第二语言代码;
根据所述多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,所述统一抽象表示是多种第二语言的互操作边界信息的二进制代码,所述多种第二语言的互操作边界信息表示多种第二语言的构成要素中允许与第一语言互相访问或使用的构成要素;
根据所述统一抽象表示,编译所述第一语言代码,得到第一语言代码的二进制代码并输出,所述第一语言代码的二进制代码在执行时使得第一语言代码中的构成要素和多种第二语言中的任一第二语言的构成要素能够互相访问或使用。
2.根据权利要求1所述的方法,其特征在于,根据所述多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,包括:
根据所述多种第二语言代码,识别所述多种第二语言的互操作边界信息;
根据所述多种第二语言的互操作边界信息,生成所述统一抽象表示。
3.根据权利要求2所述的方法,其特征在于,所述多种第二语言的互操作边界信息包括至少一个重复的构成要素和至少一个唯一的构成要素,
根据所述多种第二语言的互操作边界信息,生成所述统一抽象表示,包括:
根据所述多种第二语言的互操作边界信息的共性部分和特有部分生成所述统一抽象表示,
其中,所述共性部分通过将所述至少一个重复的构成要素中的每一重复的构成要素作为一个构成要素得到,所述特有部分包括所述至少一个唯一的构成要素。
4.根据权利要求1-3中任一项所述的方法,其特征在于,根据所述统一抽象表示,编译所述第一语言代码,得到第一语言代码的二进制代码并输出,包括:
根据所述统一抽象表示与第一语言的互操作边界信息的差异,得到对所述统一抽象表示与第一语言的语义进行处理的处理手段,所述第一语言的互操作边界信息根据所述第一语言代码确定;
编译所述第一语言代码时使用所述处理手段,得到所述第一语言代码的二进制代码并输出。
5.根据权利要求4所述的方法,其特征在于,
所述处理手段包括映射处理,其中,所述映射处理为
针对所述第一语言代码中、与所述统一抽象表示内存相同、名称不同的构成要素,按照映射关系中对应内存的数据类型进行编译,所述映射关系指示所述统一抽象表示的构成要素、第一语言的互操作边界信息的构成要素与不同内存的数据类型的对应关系。
6.根据权利要求4所述的方法,其特征在于,
所述统一抽象表示的构成要素变量包括空指针、且所述第一语言的构成要素变量不包括空指针,所述处理手段包括第一运行时转换处理,
其中,所述第一运行时转换处理为
使用运行时转换代码确定所述运行时为空时,将当前编译的构成要素变量作为异常值抛出。
7.根据权利要求4所述的方法,其特征在于,
所述统一抽象表示的构成要素变量包括空指针、且所述第一语言的构成要素变量不包括空指针,所述处理手段包括第二运行时转换处理,
其中,所述第二运行时转换处理为
使用运行时转换代码确定所述运行时为空时,返回可选构成要素中的空值。
8.根据权利要求4所述的方法,其特征在于,
所述统一抽象表示与第一语言的互操作边界信息中,存在名称相同、语法不同的构成要素,所述处理手段包括语法差异标记处理,
其中,所述语法差异标记处理为
编译所述第一语言代码时,为第一语言的构成要素增加与所述统一抽象表示的构成要素对应的标记,所述标记指示第一语言代码中,所述具有标记的构成要素执行时,实现所述统一抽象表示的构成要素的语法。
9.一种语言互操作装置,其特征在于,所述装置包括:
编译器,用于:
获取第一语言代码以及多种第二语言代码;
根据所述多种第二语言代码,生成多种第二语言的互操作边界信息的统一抽象表示,所述统一抽象表示是多种第二语言的互操作边界信息的二进制代码,所述多种第二语言的互操作边界信息表示多种第二语言的构成要素中允许与第一语言互相访问或使用的构成要素;
根据所述统一抽象表示,编译所述第一语言代码,得到第一语言代码的二进制代码并输出,所述第一语言代码的二进制代码在执行时使得第一语言代码中的构成要素和多种第二语言中的任一第二语言的构成要素能够互相访问或使用。
10.一种语言互操作装置,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述指令时实现权利要求1-8任意一项所述的方法。
11.一种非易失性计算机可读存储介质,其上存储有计算机程序指令,其特征在于,所述计算机程序指令被处理器执行时实现权利要求1-8中任意一项所述的方法。
Priority Applications (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311417836.7A CN117389570A (zh) | 2021-10-14 | 2021-10-14 | 语言互操作方法、装置、存储介质及程序产品 |
CN202311434387.7A CN117406999A (zh) | 2021-10-14 | 2021-10-14 | 语言互操作方法、装置、存储介质及程序产品 |
CN202111200966.6A CN115981652B (zh) | 2021-10-14 | 2021-10-14 | 语言互操作方法、装置、存储介质及程序产品 |
PCT/CN2022/125164 WO2023061452A1 (zh) | 2021-10-14 | 2022-10-13 | 语言互操作方法、装置、存储介质及程序产品 |
EP22880388.8A EP4361796A1 (en) | 2021-10-14 | 2022-10-13 | Language interoperation method and apparatus, storage medium, and program product |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111200966.6A CN115981652B (zh) | 2021-10-14 | 2021-10-14 | 语言互操作方法、装置、存储介质及程序产品 |
Related Child Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311417836.7A Division CN117389570A (zh) | 2021-10-14 | 2021-10-14 | 语言互操作方法、装置、存储介质及程序产品 |
CN202311434387.7A Division CN117406999A (zh) | 2021-10-14 | 2021-10-14 | 语言互操作方法、装置、存储介质及程序产品 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115981652A CN115981652A (zh) | 2023-04-18 |
CN115981652B true CN115981652B (zh) | 2023-09-29 |
Family
ID=85968609
Family Applications (3)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311417836.7A Pending CN117389570A (zh) | 2021-10-14 | 2021-10-14 | 语言互操作方法、装置、存储介质及程序产品 |
CN202111200966.6A Active CN115981652B (zh) | 2021-10-14 | 2021-10-14 | 语言互操作方法、装置、存储介质及程序产品 |
CN202311434387.7A Pending CN117406999A (zh) | 2021-10-14 | 2021-10-14 | 语言互操作方法、装置、存储介质及程序产品 |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311417836.7A Pending CN117389570A (zh) | 2021-10-14 | 2021-10-14 | 语言互操作方法、装置、存储介质及程序产品 |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311434387.7A Pending CN117406999A (zh) | 2021-10-14 | 2021-10-14 | 语言互操作方法、装置、存储介质及程序产品 |
Country Status (3)
Country | Link |
---|---|
EP (1) | EP4361796A1 (zh) |
CN (3) | CN117389570A (zh) |
WO (1) | WO2023061452A1 (zh) |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6066181A (en) * | 1997-12-08 | 2000-05-23 | Analysis & Technology, Inc. | Java native interface code generator |
CN106415495A (zh) * | 2014-05-30 | 2017-02-15 | 苹果公司 | 用于应用开发的编程系统和语言 |
US9996328B1 (en) * | 2017-06-22 | 2018-06-12 | Archeo Futurus, Inc. | Compiling and optimizing a computer code by minimizing a number of states in a finite machine corresponding to the computer code |
CN108345458A (zh) * | 2018-01-25 | 2018-07-31 | 微梦创科网络科技(中国)有限公司 | 一种静态编译语言与脚本语言的调用方法及系统 |
CN111381817A (zh) * | 2020-03-25 | 2020-07-07 | 北京字节跳动网络技术有限公司 | 实现跨平台多语言开发的方法、装置、介质和电子设备 |
CN111488154A (zh) * | 2020-04-23 | 2020-08-04 | 北京东土科技股份有限公司 | St语言源代码编译方法、装置、计算机设备及介质 |
CN111651165A (zh) * | 2020-05-18 | 2020-09-11 | 深圳市大富网络技术有限公司 | 编程语言的集成方法、编程软件系统和电子装置 |
CN111736838A (zh) * | 2019-03-25 | 2020-10-02 | 华为技术有限公司 | 一种跨语言编译方法及设备 |
CN111813381A (zh) * | 2020-06-22 | 2020-10-23 | 北京字节跳动网络技术有限公司 | 跨平台生成可运行程序的方法、装置、介质和电子设备 |
CN111913691A (zh) * | 2020-06-16 | 2020-11-10 | 武汉达梦数据库有限公司 | 一种Python和Java数据互操作的方法和装置 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9965259B2 (en) * | 2002-11-20 | 2018-05-08 | Purenative Software Corporation | System for translating diverse programming languages |
US8667466B2 (en) * | 2010-12-28 | 2014-03-04 | Microsoft Corporation | Parameterized interface identifier techniques |
WO2014074251A1 (en) * | 2012-11-06 | 2014-05-15 | Coherent Logix, Incorporated | Multiprocessor programming toolkit for design reuse |
CN106970802B (zh) * | 2017-04-25 | 2024-04-09 | 北京航天飞行控制中心 | 在领域特定语言中集成编程脚本语言的方法及装置 |
CN109871284A (zh) * | 2017-12-05 | 2019-06-11 | 北京元比特科技有限责任公司 | 一种应用程序跨语言运行时环境执行的虚拟化技术及方法 |
GB2575844A (en) * | 2018-07-25 | 2020-01-29 | The Open Univ | Processing method using binary intermediate representations |
US10803087B2 (en) * | 2018-10-19 | 2020-10-13 | Oracle International Corporation | Language interoperable runtime adaptable data collections |
-
2021
- 2021-10-14 CN CN202311417836.7A patent/CN117389570A/zh active Pending
- 2021-10-14 CN CN202111200966.6A patent/CN115981652B/zh active Active
- 2021-10-14 CN CN202311434387.7A patent/CN117406999A/zh active Pending
-
2022
- 2022-10-13 EP EP22880388.8A patent/EP4361796A1/en active Pending
- 2022-10-13 WO PCT/CN2022/125164 patent/WO2023061452A1/zh active Application Filing
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6066181A (en) * | 1997-12-08 | 2000-05-23 | Analysis & Technology, Inc. | Java native interface code generator |
CN106415495A (zh) * | 2014-05-30 | 2017-02-15 | 苹果公司 | 用于应用开发的编程系统和语言 |
US9996328B1 (en) * | 2017-06-22 | 2018-06-12 | Archeo Futurus, Inc. | Compiling and optimizing a computer code by minimizing a number of states in a finite machine corresponding to the computer code |
CN108345458A (zh) * | 2018-01-25 | 2018-07-31 | 微梦创科网络科技(中国)有限公司 | 一种静态编译语言与脚本语言的调用方法及系统 |
CN111736838A (zh) * | 2019-03-25 | 2020-10-02 | 华为技术有限公司 | 一种跨语言编译方法及设备 |
CN111381817A (zh) * | 2020-03-25 | 2020-07-07 | 北京字节跳动网络技术有限公司 | 实现跨平台多语言开发的方法、装置、介质和电子设备 |
CN111488154A (zh) * | 2020-04-23 | 2020-08-04 | 北京东土科技股份有限公司 | St语言源代码编译方法、装置、计算机设备及介质 |
CN111651165A (zh) * | 2020-05-18 | 2020-09-11 | 深圳市大富网络技术有限公司 | 编程语言的集成方法、编程软件系统和电子装置 |
CN111913691A (zh) * | 2020-06-16 | 2020-11-10 | 武汉达梦数据库有限公司 | 一种Python和Java数据互操作的方法和装置 |
CN111813381A (zh) * | 2020-06-22 | 2020-10-23 | 北京字节跳动网络技术有限公司 | 跨平台生成可运行程序的方法、装置、介质和电子设备 |
Non-Patent Citations (4)
Title |
---|
.NET下的多语言互操作性;邱勇, 兰永杰;信息技术(第05期);全文 * |
Test Coverage Metric for Two-Staged Language with Abstract Interpretation;Taeksu Kim;《IEEE Xplore》;全文 * |
基于Java编译器的Maven混淆插件的设计与实现;傅晓巍;;电脑知识与技术(第10期);全文 * |
编译系统中间代码的一种抽象表示;戴桂兰;《电子学报》(第S1期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
WO2023061452A1 (zh) | 2023-04-20 |
CN117389570A (zh) | 2024-01-12 |
CN115981652A (zh) | 2023-04-18 |
CN117406999A (zh) | 2024-01-16 |
EP4361796A1 (en) | 2024-05-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9891900B2 (en) | Generation of specialized methods based on generic methods and type parameterizations | |
US9965259B2 (en) | System for translating diverse programming languages | |
US9086931B2 (en) | System for translating diverse programming languages | |
CN106462425B (zh) | 使用复常量的方法和系统 | |
US8332828B2 (en) | System for translating diverse programming languages | |
US11347489B2 (en) | Accessing a migrated member in an updated type | |
US8656372B2 (en) | System for translating diverse programming languages | |
US9182980B2 (en) | Expansion and reduction of source code for code refactoring | |
TWI536263B (zh) | 將作業系統之原始應用程式介面投射至其它程式語言 | |
US8418134B2 (en) | Method for efficiently managing property types and constraints in a prototype based dynamic programming language | |
WO2024045379A1 (zh) | 编译方法和编译器、Wasm虚拟机 | |
US11782774B2 (en) | Implementing optional specialization when compiling code | |
US10360008B2 (en) | Metadata application constraints within a module system based on modular encapsulation | |
CN115981652B (zh) | 语言互操作方法、装置、存储介质及程序产品 | |
KR20190060561A (ko) | 이종 디바이스의 선택적 추상화를 통한 사물 인터넷 어플리케이션의 개발 환경을 통합하는 방법 및 시스템 | |
CN117369861A (zh) | 应用程序的线程管理策略配置方法及相关装置 | |
CN116931947A (zh) | 一种优化wasm字节码的方法及执行方法、计算机设备及存储介质 | |
Kastinger | Piero Ploner (pploner@ cosy. sbg. ac. at), Michael Wallner (mwallner@ cosy. sbg. ac. at) University of Salzburg, Department of Computer Sciences |
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 |