CN115934374A - 一种高性能cgo跨语言调用方法 - Google Patents
一种高性能cgo跨语言调用方法 Download PDFInfo
- Publication number
- CN115934374A CN115934374A CN202211228993.9A CN202211228993A CN115934374A CN 115934374 A CN115934374 A CN 115934374A CN 202211228993 A CN202211228993 A CN 202211228993A CN 115934374 A CN115934374 A CN 115934374A
- Authority
- CN
- China
- Prior art keywords
- language
- function
- calling
- cross
- hcgo
- 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
Links
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
本发明涉及跨语言调用技术领域,公开了一种高性能CGO跨语言调用方法,将解绑逻辑处理器P和系统线程M这一操作从整体的跨语言调用流程中取消,只在Go语言运行时尝试抢占处于HCGO调用过程中的Go协程时被调用,从而能够使得在大多数情况下的跨语言调用都不需要执行这一操作;通过取消栈切换来优化跨语言调用链,降低调用开销。
Description
技术领域
本发明涉及跨语言调用技术领域,具体涉及一种高性能CGO跨语言调用方法。
背景技术
Go语言,又称Golang。Go语言的语法简单,易于开发,且有垃圾回收、多返回值、并发编程等高级语言特性,深受开发者欢迎。
Go语言提供了一种名为CGO的跨语言互调机制,可以使Go和C两种语言的代码互相调用,从而较为方便地复用历史遗留的、或者高性能的C代码库。然而,CGO调用的性能一直为用户所诟病,它的调用链冗长,调用开销较高。通过对Go语言调用C语言中的空函数,以及对C语言重复调用n(n=1M)次Go语言中的空函数进行实验,分别统计单次CGO调用的平均开销,得到如表1所示的结果。从中可见,Go语言调用C语言、C语言调用Go语言的开销均远高于Go语言调用Go语言,具体可达48倍-2707倍。
表1 CGO的调用开销
调用方式 | 时间 |
Go语言调用Go语言 | 1.442ns |
Go语言调用C语言 | 69.90ns |
C语言调用Go语言(Go语言为宿主语言) | 119.749ns |
C语言调用Go语言(C语言为宿主语言) | 3904.44ns |
这种情况主要由Go语言的运行时调度模型GMP所致,运行时调度模型GMP中的G代表Goroutine,即Go协程,M代表Machine或worker thread,即传统意义上的系统线程,P代表Processor,即用户级代码逻辑处理器。如图1所示,Go语言的调度单元是一个Go协程,只有当系统线程M与一个逻辑处理器P关联后才能执行该逻辑处理器P队列LRQ中的Go协程,除非系统线程M发生阻塞或在进行系统调用时间过长时没有与之关联的逻辑处理器P。
在GMP模型下,若Go语言的函数的运行时间过长会导致Go协程被抢占,垃圾收集(GC)执行时会导致所有的Go协程被挂起;而当Go语言的函数调用C语言的函数时,C语言的函数的执行会限制Go语言运行时的调度行为,此时会将运行C语言的系统线程M做标记,并将该系统线程M从Go语言运行时的调度范围去除。
此外,Go协程的栈空间大小是动态变化的,初始为2KB,而C语言的函数的执行可能需要一个静态未知的更大栈空间,故不适合直接在Go协程的栈空间上执行C语言的函数。Go语言运行时会有一个特殊Go协程g0,负责对每个运行在系统线程M上的Go协程进行调度和管理;特殊Go协程g0在系统线程M初始化时会被分配大小固定且超过常规Go协程栈的系统栈。如图2所示,当Go语言的函数调用C语言的函数时,会切换到特殊Go协程g0的系统栈上执行,在C语言的函数调用返回Go语言的函数时需要再切换回来;这种切换是导致CGO调用开销高的主要原因。
发明内容
为解决上述技术问题,本发明提供一种高性能CGO跨语言调用方法。
为解决上述技术问题,本发明采用如下技术方案:
一种高性能CGO跨语言调用方法,对Go语言跨语言互调中的逻辑处理器P和系统线程M进行惰性解绑:Go语言与C语言相互调用过程中,如果Go协程收到Go语言发送的抢占信号时,进行如下步骤:
a)跳转到Go语言的信号处理函数;
b)将当前Go协程所在的逻辑处理器P和系统线程M解绑,并标记进入系统调用状态;
c)转到C语言的函数执行,此时所述的系统线程M被划分到Go语言的运行时调度范围外;
d)当C语言的函数执行结束或者C语言的函数回调Go语言的函数时,判断逻辑处理器P和系统线程M在C语言的函数执行前是否进行过解绑,如是,则重新绑定逻辑处理器P和系统线程M后再执行Go语言的函数。
进一步地,包括取消Go语言和C语言跨语言互调中的栈切换:
在Go语言程序编译时,通过以下方式获取C语言的函数的栈空间使用上界Spacec:用户指定、对C语言的函数执行静态分析、默认大小;
当Go语言的函数调用C语言的函数时,根据Spacec的值为执行C语言函数的Go协程指示栈空间大小,使C语言的函数以及Go语言的函数均可运行在Go协程的同一块栈空间中。
与现有技术相比,本发明的有益技术效果是:
本发明将解绑逻辑处理器P和系统线程M这一操作从整体的跨语言调用流程中取消,只在Go语言运行时尝试抢占处于HCGO调用过程中的Go协程时被调用,从而能够使得在大多数情况下的跨语言调用都不需要执行这一操作;通过取消栈切换来优化跨语言调用链,降低调用开销。
附图说明
图1为Go语言的运行时调度模型GMP的示意图;
图2为现有技术中跨语言互调机制CGO的调用示意图;
图3(a)为本发明高性能跨语言调用机制HCGO中Go语言的函数正常调用C语言的函数的执行流程图;
图3(b)为本发明高性能跨语言调用机制HCGO中C语言的函数执行时发生抢占的执行流程图;
图4(a)、图4(b)为本发明高性能跨语言调用机制HCGO中基于栈伪装的回溯机制示意图;
图5(a)、图5(b)分别为本发明高性能跨语言调用机制HCGO中Go语言的函数调用C语言的函数时的示意图、C语言的函数调用Go语言的函数时的示意图。
具体实施方式
下面结合附图对本发明的一种优选实施方式作详细的说明。
CGO是Go语言提供的允许Go语言和C语言互相调用的机制。针对CGO调用链冗长、调用开销高的不足,本发明提出一种高性能跨语言调用机制HCGO,它主要通过“惰性解绑逻辑处理器P和系统线程M”以及“取消栈切换”两种优化思想,来优化CGO调用链,在保持安全性和功能不变的前提下提升CGO调用的性能,降低CGO调用的开销。经实验表明,相较于原生CGO调用机制,本发明中的高性能CGO跨语言调用方法能够在Go语言调用C语言的场景下实现大约7倍的性能提升。
本发明中的高性能CGO跨语言调用方法,主要分为三个部分:Go语言程序编译流程、运行时CGO调用流程、运行时其余机制的适配。
其中,Go语言程序编译流程主要通过修改Go编译器,在兼容原生CGO调用机制的前提下,增加新的高性能跨语言调用机制HCGO的识别与适配;运行时CGO调用流程则主要通过惰性解绑逻辑处理器P和系统线程M、取消栈切换来优化跨语言调用链,降低调用开销;运行时其余机制的适配则是通过实现基于栈伪装的回溯(traceback)机制以及修改部分运行时函数来保证高性能跨语言调用机制HCGO下的Go语言运行时安全性与功能完整性。
1.Go语言程序编译流程
高性能跨语言调用机制HCGO支持使用三种不同的方式从不同的粒度开启:
(1)在Go语言代码内部通过[import“HC”]标记开启高性能跨语言调用机制HCGO,并使用[HC.xxx]来指示xxx函数使用高性能跨语言调用机制HCGO执行跨语言调用。
(2)在Go语言的编译命令中加入参数-hcgo,此时所有的被编译文件将会使用高性能跨语言调用机制HCGO。
(3)在环境变量中设置“HCGO=true”,此时所有的Go程序都将使用高性能跨语言调用机制HCGO。
2.运行时CGO调用流程
在原生CGO的调用流程中,调用一个C语言的函数前后需要执行三个步骤:
(1)解绑逻辑处理器P和系统线程M并标记进入系统调用状态(或绑定逻辑处理器P和系统线程M并标记退出系统调用状态);
(2)切换Go协程,即从普通Go协程切换到特殊Go协程g0,从而将C语言的函数的执行切换到特殊Go协程g0的系统栈上;
(3)执行ABI调用约定的转换。
而在高性能跨语言调用机制HCGO的调用流程中,通过惰性解绑逻辑处理器P和系统线程M去掉非必要的解绑操作,通过取消栈切换来取消Go协程的切换操作,只需要在C语言的函数调用前后执行ABI调用约定的转换。
2.1惰性解绑逻辑处理器P和系统线程M
在高性能跨语言调用机制HCGO的设计中,Go协程不会在每次C语言的函数被调用前都执行逻辑处理器P和系统线程M的解绑操作,而是将解绑逻辑处理器P和系统线程M这一操作从整体的调用流程中取消,只在Go语言运行时尝试抢占处于高性能跨语言调用机制HCGO调用过程中的Go协程时被调用,从而能够使得在大多数情况下的跨语言调用都不需要执行这一操作。
如图3(a)所示,在一般情况下,高性能跨语言调用机制HCGO的调用流程并不会执行解绑操作;如图3(b)所示,当处于高性能跨语言调用机制HCGO调用过程中的Go协程,接收到Go语言运行时发送的抢占信号时,会进行如下流程:
(1)跳转到Go语言的信号处理函数;
(2)将当前Go协程所在的逻辑处理器P和系统线程M解绑,并标记进入系统调用状态;
(3)转到C语言的函数正常执行;此时系统线程M已经被划分到Go语言的运行时调度范围外了,不会再阻塞Go语言的抢占;
(4)在C语言的函数执行结束或者C语言的函数回调Go语言的函数时,增加对当前逻辑处理器P和系统线程M的状态的判断,若发现在C语言的函数执行过程中执行过解绑操作,则重新将其绑定再开始执行Go语言的函数。
2.2取消栈切换
在Go语言中,由于Go协程栈空间的大小可能难以支持任意C语言函数的调用,故原生的CGO调用机制在执行跨语言调用时需要先将C语言的函数运行的栈空间切换到特殊Go协程g0的系统栈上。这种操作违背了内存的局部性,会导致较高的高速缓存缺失(cachemiss)。
在高性能跨语言调用机制HCGO设计中,首先,在Go程序编译阶段,通过修改CGO编译流程,可以采用以下三种途径之一来获取C语言的函数栈空间的使用上界:(1)用户指定;(2)对C语言的函数执行静态分析;(3)默认为8MB;从而在运行时中,能够指示即将进行C语言函数调用的Go协程需要至少多大的栈空间。其次,在运行时调用阶段,修改CGO的跨语言调用链,在执行C语言的函数之前通过Go语言运行时本身提供的栈扩展机制将Go协程的栈空间扩展到指定的大小,以支持C语言的函数的调用;并且,在接下来的调用流程中,取消栈切换的操作,让C语言的函数和Go语言的函数运行在同一块栈空间中。
3.运行时其余机制的适配
由于在高性能跨语言调用机制HCGO中取消了逻辑处理器P和系统线程M的解绑以及栈切换的操作,打破了Go语言运行时对CGO调用机制的一些假定,所以为了保持Go语言运行时的安全性与功能完整性,还需要对运行时其余机制进行适配。
3.1基于栈伪装的回溯(traceback)机制
Go语言中的回溯机制在很多场景下都会被使用:例如垃圾收集时的栈扫描、栈扩展/收缩时的栈复制、程序崩溃时的错误信息打印等。在这些场景下,回溯机制会从Go协程的当前栈帧出发,依次向栈底部扫描各个函数的栈帧,从而实现上述功能。
由于在高性能跨语言调用机制HCGO中,Go语言的函数调用的C语言的函数与该Go语言的函数运行在同一块栈空间下,而Go语言的回溯机制无法、也不应该对C语言函数的栈帧执行扫描,所以在高性能跨语言调用机制HCGO中还实现了一套基于栈伪装的回溯机制,如图4(a)、4(b)所示。
为方便定位调用C语言函数之前的最后一个Go语言函数的栈帧记录,高性能跨语言调用机制HCGO引入存放该Go语言函数调用的当前程序计数器的域hcgopc和栈帧的栈顶指针的域hcgosp。对于Go语言中通过高性能跨语言调用机制HCGO调用C语言的函数、进而又回调Go语言函数的情况,在C语言的函数回调第一个Go语言的函数时会将当前hcgosp的值压栈(即保存该Go语言函数的上一个Go语言函数的栈顶指针),以便回溯之用。当触发回溯扫描之后:
(1)如果识别到当前的Go协程处于高性能跨语言调用机制HCGO的C语言的函数调用过程中,如图4(a)所示,通过事先记录的域hcgopc和域hcgosp来让回溯机制跳过当前C语言的函数的栈帧,直接从高性能跨语言调用机制HCGO调用之前的最后一个Go语言的函数的栈帧开始执行回溯;
(2)如果识别到当前Go协程处于高性能跨语言调用机制HCGO的回调Go语言的函数的过程中,如图4(b)所示,通过获取事先保存在C语言函数回调Go语言函数之后的第一个Go语言函数栈帧内的上一个Go语言的函数的栈顶指针,从而跳过C语言的函数。
3.2其他运行时机制的修改
在Go语言的运行时机制中,存在有针对CGO调用机制的特殊适配,然而对于高性能跨语言调用机制HCGO,由于其运行时状态和CGO机制的状态不完全相同,会导致某些运行时为C语言的函数调用所进行的适配失效。所以在分析出高性能跨语言调用机制HCGO和原生CGO调用机制这两种机制在Go运行时中表现的差异性之后,根据这种差异性对部分运行时机制进行了修改。这种修改涉及Go的崩溃报错机制、信号处理机制以及回溯机制。
(1)崩溃报错机制。由于高性能跨语言调用机制HCGO执行过程中不切换Go协程,会导致HCGO在崩溃处理时进入panic报错流程,而外部代码执行的崩溃报错应该进入fatal报错流程,所以修改Go语言的崩溃报错机制,使得高性能跨语言调用机制HCGO中的崩溃处理能进入fatal报错流程。
(2)信号处理机制。对于不执行“解绑逻辑处理器P和系统线程M”操作的高性能跨语言调用机制HCGO,Go语言运行时无法感知到其在执行外部代码,从而在信号处理时会当作正常的Go协程的信号处理流程。所以修改Go的信号处理机制,使得在高性能跨语言调用机制HCGO调用过程中,执行CGO调用机制下的信号处理流程;在接受到某些特定信号时,运行时将信号转发给当前在Go协程上执行的C语言的函数;在调整Go语言的信号栈位置时,将其调整为执行高性能跨语言调用机制HCGO调用的Go协程。
(3)回溯机制。修改回溯机制,使得高性能跨语言调用机制HCGO支持设置自定义的回溯过程中的CGO回调函数(用来支持对C语言的函数栈帧的自定义扫描)。
4.优点和积极效果
表1高性能跨语言调用机制HCGO与CGO调用机制的开销对比表
调用方式 | HCGO开销 | CGO开销 | 加速比 |
Go语言调用C语言 | 9.488ns | 69.90ns | 7.367 |
C语言调用Go语言(Go语言为宿主语言) | 72.274ns | 119.749ns | 1.657 |
C语言调用Go语言(C语言为宿主语言) | 3852.35ns | 3904.44ns | 1.014 |
表2显示了高性能跨语言调用机制HCGO和CGO调用机制在几种不同调用方式下的调用开销对比。测试调用开销的实验设置如下:重复执行N次(N为千万级别常数)对空函数的跨语言调用,记录所花费的总时间T,表中记录的是单次平均调用时间,即t=T/N。从表中可以看到,在使用最多的Go语言调用C语言的场景下,高性能跨语言调用机制HCGO能够达到7倍以上的加速比;在Go语言作为宿主语言、C语言调用Go语言的场景下,高性能跨语言调用机制HCGO也能达到约1.6倍的加速比;而在以C语言作为宿主语言、C语言调用Go语言的场景下,由于在进入调用链之前需要先启动Go的运行时的初始化操作,运行时的初始化操作会占用较高的开销,这导致高性能跨语言调用机制HCGO相较于CGO调用机制的加速并不明显。
同时,在使用高性能跨语言调用机制HCGO的情况下,能够全量通过Go语言社区中的CGO相关的安全测试,这说明高性能跨语言调用机制HCGO具有一定的安全性。
高性能跨语言调用机制HCGO中,Go语言函数调用C语言函数的流程如图5(a)所示,当Go语言的函数通过[C.xxx]或[HC.xxx]的方式调用C语言的函数时,将执行以下三步:
(1)进入运行时函数runtime.hcgocall,函数runtime.hcgocall有两方面工作:在调用C语言的函数之前执行栈扩容;设置高性能跨语言调用机制HCGO相关的标记位,如hcgopc和hcgosp,并进行状态的转换;
(2)调用汇编函数runtime.asmhcgocall,进行C语言和Go语言之间的ABI调用约定转换;
(3)调用C语言的函数。
高性能跨语言调用机制HCGO下的C语言函数调用Go语言函数的流程如图5(b)所示,当C语言的函数发起对Go语言的函数的调用时,高性能跨语言调用机制HCGO将执行以下五步:
(1)调用crosscall2函数来执行ABI调用约定的转换;
(2)执行汇编函数runtime.cgocallback,判断当前调用流程是否是高性能跨语言调用机制HCGO的调用流程,若是则进入高性能跨语言调用机制HCGO调用链,否则执行原生CGO的调用链;
(3)执行运行时函数runtime.hcgocallback,进行高性能跨语言调用机制HCGO相关标记位的设置与保存(如保存pc和sp到栈上);
(4)执行runtime.hcgocallbackg函数用来保存系统调用状态,以防止在回调过程中被修改;
(5)执行runtime.hcgocallbackg1函数进行参数的准备,并调用实际的Go语言的函数。
实施例
高性能跨语言调用机制HCGO的启用方式一:高性能跨语言调用机制HCGO可以通过在代码中使用[import“HC”]开启引用,并通过[HC.sum]调用名为sum的C函数;代码示意如下:
//HCGO启用方式一
//int sum(int a,int b){return a+b;}
import“HC”
func main(){
HC.sum(1,2)
}。
由于高性能跨语言调用机制HCGO启用方式一需要将应用代码中的[import“C”]修改为[import“HC”]才能使用,所以还提供了如下所示的两种无需修改应用代码的方式:启用方式二是通过在编译命令中增加[-hcgo]参数,启用方三则是通过设置系统环境变量[HCGO=true]来实现的;代码示意如下:
#HCGO启用方式二
$go run sum_cgo.go-hcgo;
#HCGO启用方式三
$HCGO=true go run sum_cgo.go。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括在本发明内,不应将权利要求中的任何附图标记视为限制所涉及的权利要求。
此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个实施方式仅包含一个独立技术方案,说明书的这种叙述方式仅仅是为了清楚起见,本领域技术人员应当将说明书作为一个整体,各实施例中的技术方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。
Claims (2)
1.一种高性能CGO跨语言调用方法,其特征在于,对Go语言跨语言调用中的逻辑处理器P和系统线程M进行惰性解绑:Go语言与C语言相互调用过程中,如果Go协程收到Go语言发送的抢占信号,进行如下步骤:
a)跳转到Go语言的信号处理函数;
b)将当前Go协程所在的逻辑处理器P和系统线程M解绑,并标记进入系统调用状态;
c)转到C语言的函数执行,此时所述的系统线程M被划分到Go语言的运行时调度范围外;
d)当C语言的函数执行结束或者C语言的函数回调Go语言的函数时,判断逻辑处理器P和系统线程M在C语言的函数执行前是否进行过解绑,如是,则重新绑定逻辑处理器P和系统线程M后再执行Go语言的函数。
2.根据权利要求1所述的高性能CGO跨语言调用方法,其特征在于,包括取消Go语言和C语言跨语言互调中的栈切换:
在Go语言程序编译时,通过以下方式获取C语言的函数的栈空间使用上界Spacec:用户指定、对C语言的函数执行静态分析、默认大小;
当Go语言的函数调用C语言的函数时,根据Spacec的值为执行C语言函数的Go协程指示栈空间大小,使C语言的函数以及Go语言的函数均可运行在Go协程的同一块栈空间中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211228993.9A CN115934374A (zh) | 2022-10-08 | 2022-10-08 | 一种高性能cgo跨语言调用方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211228993.9A CN115934374A (zh) | 2022-10-08 | 2022-10-08 | 一种高性能cgo跨语言调用方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115934374A true CN115934374A (zh) | 2023-04-07 |
Family
ID=86556691
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211228993.9A Pending CN115934374A (zh) | 2022-10-08 | 2022-10-08 | 一种高性能cgo跨语言调用方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115934374A (zh) |
-
2022
- 2022-10-08 CN CN202211228993.9A patent/CN115934374A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6059840A (en) | Automatic scheduling of instructions to reduce code size | |
Gowing et al. | Meta-object protocols for C++: The Iguana approach | |
US8522222B2 (en) | Tracing just-in-time compilation with pointers to local variables | |
EP0509623A2 (en) | Program processing system and method | |
JPH09325901A (ja) | デバッギングを実施する方法 | |
JPH05204656A (ja) | スレッド固有データ保持方法 | |
JP2001147819A (ja) | 最適化装置および記録媒体 | |
US9003377B2 (en) | Efficient resumption of co-routines on a linear stack | |
JP2002527811A (ja) | オンスタックリプレースメントを伴うことなくバーチャルコールを直接にインライン化する方法 | |
WO2022227410A1 (zh) | 一种嵌入式终端远程软件调试方法 | |
US20020147758A1 (en) | Data processing system and method for high-efficiency multitasking | |
US8341613B2 (en) | Reducing stack space consumption via head-call optimization | |
Taura et al. | Fine-grain multithreading with minimal compiler support—a cost effective approach to implementing efficient multithreading languages | |
US20040015925A1 (en) | Method, article of manufacture and apparatus for performing automatic intemodule call linkage optimization | |
JPH0738158B2 (ja) | コード最適化方法およびコンパイラ・システム | |
CN105117269B (zh) | 基于向量中断的编译器的优化方法 | |
CN113220326B (zh) | 智能合约升级方法及区块链系统 | |
CN115934374A (zh) | 一种高性能cgo跨语言调用方法 | |
US7788653B2 (en) | Apparatus and methods for performing generational escape analysis in managed runtime environments | |
JP3327674B2 (ja) | プログラム翻訳装置及び方法 | |
JP2003256215A (ja) | プログラム変換方法、これを用いたデータ処理装置及びプログラム | |
Haahr et al. | Es: A shell with higher-order functions. | |
JPH0581069A (ja) | プログラムのデバツグ方法 | |
Pichler et al. | Hybrid Execution: Combining Ahead-of-Time and Just-in-Time Compilation | |
Marti | Compilation techniques for a control-flow concurrent LISP system |
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 |