没有合适的资源?快使用搜索试试~ 我知道了~
软件X 20(2022)101211原始软件出版物StaDyn编程语言Francisco Ortina,b,juice,Miguel Garciaa,Baltasar Garcia Perez-Schofieldc,Jose Quirogaaa奥维耶多大学计算机科学系,Federico Garcia Lorca 18,33007,西班牙b爱尔兰科克Bishopstown Rossa Avenue明斯特理工大学计算机科学系c维哥大学计算机科学系,As Lagoas s/n,32004 Ourense,西班牙ar t i cl e i nf o文章历史记录:收到日期:2022年收到修订版,2022年8月3日接受,2022年保留字:混合静态和动态类型优化.net平台编程语言StaDyna b st ra ct混合静态和动态类型语言旨在结合两种语言的优点:静态类型的早期类型错误检测和编译时优化,以及动态类型语言的运行时适应性。StaDyn编程语言是一种混合类型语言,其主要贡献是利用编译器收集的类型信息来提高编译时错误检测和运行时性能。StaDyn已被评估为.Net平台的混合类型语言,具有最高的运行时性能和最低的内存消耗。虽然大多数优化都是由编译器静态执行的,但编译时间仍然低于.Net平台上实现的现有混合语言。©2022作者(S)。由爱思唯尔公司出版这是CC BY许可下的开放获取文章(http://creativecommons.org/licenses/by/4.0/)中找到。代码元数据当前代码版本2.1.1用于此代码版本的代码/存储库的永久链接https://github.com/ElsevierSoftwareX/SOFTX-D-22-00121法律代码许可证MIT使用git的代码版本控制系统使用C#5.0的软件代码语言、工具和服务编译要求、操作环境依赖性.Net Framework 4.8如果可用,链接到开发人员文档/手册https://reflection.uniovi.es/stadyn/问题支持电子邮件ortin@uniovi.es1. 动机和意义动态类型语言通常支持运行时自适应特性,如反射、元编程、动态代码生成、鸭子类型以及动态重新配置和分发。动态语言提供的巨大的运行时灵活性使其适用于不同的场景,如运行时自适应系统、快速原型、动态面向方面编程以及数据处理和集成系统[1]。以Web开发场景为例,Ruby [2]用于借助Ruby on Rails框架[3]快速开发数据库支持的Web应用程序通讯作者:奥维耶多大学计算机科学系,Federico Garcia Lorca 18,33007,奥维耶多,西班牙。电子邮件地址:ortin@uniovi.es(Francisco Ortin),garciarmiguel@uniovi.es(Miguel Garcia),jbgarcia@uvigo.es(Baltasar Garcia Perez-Schofield),quirogajose@uniovi.es(Jose Quiroga).https://doi.org/10.1016/j.softx.2022.101211这个框架已经证实了在动态类型语言中实现DRY(不要重复自己)[4]和约定优先于配置[3]原则的简单性。JavaScript [5]被广泛用于创建Web应用程序的前端和后端模块[6]。Python [7]用于许多 不同 的目 的, 包 括使 用许 多 框架 进行Web 开 发( 例 如,Django、CherryPy、Pyramid和Flask)。然而,动态语言的巨大灵活性受到缺乏静态类型检查的限制的影响静态类型语言收集的类型信息通常用于执行不同的优化,并提供类型错误的早期检测[1]。静态类型语言为程序员提供了在编译时检测类型错误的功能,使其能够立即修复它们,而不是在运行时发现它们[8]。此外,避免由动态类型化语言执行的运行时类型检查和类型检查通常涉及运行时性能改进[9,10]。2352-7110/©2022作者。 由Elsevier B.V.出版。这是一篇开放获取的文章,使用CC BY许可证(http://creativecommons.org/licenses/by/4.0/)。可在ScienceDirect上获得目录列表SoftwareX期刊主页:www.elsevier.com/locate/softxFrancisco Ortin,Miguel Garcia,Baltasar Garcia Perez-Schofield等.软件X 20(2022)1012112由于动态和静态类型都提供了重要的好处,因此有一些方法旨在获得这两种方法的优点,遵循静态类型的哲学,在可能的情况下,动态类型在需要时[1]。在所有的理论研究工作中,渐进类型可能是影响最大的[11]-软类型[12],准静态类型[13]和混合类型[14]是其他着名的作品。渐进类型定义了一种一致性关系,正式定义了静态和动态类型之间的交互[15]。 自其概念以来,渐进式打字一直是一个活跃的研究主题,我们将在第5节中详细介绍。渐进式和混合式动态和静态类型的研究工作影响了一些商业编程语言的设计和实现。不同的混合类型语言被创造出来,如Visual Basic、Job-C、Dylan、Boo、Fantom和Cobra。类似地,一些动态类型语言,如Groovy和PHP,在包含静态类型注释后逐渐变成了类型[16,17]。此外,静态类型的C#语言包括动态类型[18],以指示编译器将类型检查推迟到运行时。Kotlin在编译为JavaScript时,遵循类似的动态类型方法[19]。本文介绍的StaDyn是一种成熟的面向对象编程语言,为.Net平台提供了混合静态和动态类型与现有的混合语言相比,StaDyn的主要贡献在于它从动态类型化代码中收集类型信息,并将其用于两个主要目的:在编译时检测动态类型化代码的类型错误;以及通过减少动态类型检查操作来提供更好的运行时性能。本文其余部分的结构如下。第2节给出了一个说明性示例。第3节描述StaDyn编程语言。StaDyn的效率评估和一些用例场景在第4节中给出。第5节描述了相关的工作,并在第6节得出结论。2. 说明性示例图 1显示了StaDyn代码的静态和动态类型的说明性示例。图中的DistanceToOrigin方法。 1接收Circumference,因此第26行中的DistanceToOrigin(cir)调用被编译器接受。相反,编译器拒绝下一个DistanceToOrigin(rec)调用,因为rec是Rectangle,而不是Circumference。即使rec实现了传递给figure参数的两条消息(GetX和GetY),该调用也会被拒绝。 如果figure参数是动态类型的,它既不会产生编译器错误,也不会产生运行时错误,因为rec提供了GetX和GetY的有效实现-这就是动态语言的所谓鸭子类型特性。Distance提供了一个动态类型方法的例子,因为它的两个参数被声明为动态的。在第28行中的调用,一个矩形和一个周长被传递给Distance。该函数调用不会产生运行时错误,因为两个对象都提供GetX和GetY。下面的Distance(cir,tri)调用不是这种情况,因为三角形不提供GetX和GetY。在C#中,调用编译后,它会在运行时抛出错误,就像大多数动态语言一样。但是,StaDyn编译器设法在第29行显示错误这是因为StaDyn执行动态类型代码的类型检查,并且知道tri执行不提供GetX和GetY的实现。此外,委员会认为,编译器收集的类型信息也用于优化生成的代码(参见第4.1节)。动态类型的编译时类型推断和类型检查代码是StaDyn和其他动态类型语言之间的主要区别。3. 软件描述StaDyn是一种用于.Net框架的混合静态和动态类型的面向对象语言。它是由奥维耶多大学的计算反射研究小组于2007年作为C#3的扩展创建的,作为微软研究院部分资助的研究项目StaDyn增强了C#隐式类型的本地引用的行为(即,var关键字)和动态类型,后来被包含在C#4中。在StaDyn中,var关键字可以用来声明隐式类型的引用。这意味着var是声明字段、参数、返回值和局部变量的有效类型-在C#中,var只能用于定义初始化的局部变量。在图中的示例代码中。1,所有使用的动态引用(第19行)都可以用var替换。var和dynamic之间的主要区别是编译器对动态引用更宽容。使用var,编译器执行经典的静态类型,确保每个可能的执行流都是安全的。然而,对于dynamic,它允许构造至少有一个有效的执行流1(细节在3.4节中给出)。StaDyn编译器是用C#实现的[20]。对于词法和句法分析,我们使用ANTLR LL(*)解析器生成器。编译器为.Net平台生成中间语言(IL)的汇编代码。最后,使用IL汇编器生成.Net二进制文件。3.1. 在运行时在动态语言中,使用一个唯一的变量在同一作用域中保存不同的类型是非常常见的。例如,图1左侧的代码。2使用value变量来保存不同类型的相同值。首先,value存储传递给命令行提示符下的程序在这种情况下,可以将Length消息传递给value,因为Length是String提供的属性。然后,第5行将String转换为一个双精度数,这样就可以将其传递给Sqrt(第6行)。Length属性不再由value提供,因此StaDyn编译器在第7行中产生编译时错误(与C#不同,它显示运行时的错误常见的静态类型平台(如Java和.Net)不允许变量在同一作用域中具有不同的类型。 因此,如果Object类型用作dynamic和var的汇编转换,则所需的强制转换或反射的使用将减慢应用程序的执行[21]。为了避免这种运行时性能损失,StaDyn编译器将程序(其抽象语法树,AST)转换为另一个程序,其中每个动态类型的引用(静态)最多分配一次。也就是说,程序被转换为静态单分配(SSA)形式[22]。SSA转换如图所示。 二、左边程序的AST被翻译成右边程序的AST [23]-同样的情况也发生在var引用上。 通过这种方式,StaDyn编译器的类型检查阶段为值0(字符串)和值1(双精度)变量推断出唯一的类型。除了第7行中检测错误的鲁棒性之外生成的代码还通过避免不必要的强制转换和反射(第4.1节)提供了更高的运行时性能。1StaDyn的第一个版本只支持我们对var类型的扩展,而不支持dynamic。之后,C# 4.0发布,并包含了新的动态类型。然后,我们创建了StaDyn2.0,以包含对动态的新解释。var和dynamic之间的确切区别在第3.4节中详细介绍Francisco Ortin,Miguel Garcia,Baltasar Garcia Perez-Schofield等.软件X 20(2022)1012113图1.一、 示例StaDyn程序与混合静态和动态类型(类构造函数被排除)。图二、 左侧:StaDyn源代码,其中value包含两种 不同的 类型。右侧:SSA算法产生的转换程序Francisco Ortin,Miguel Garcia,Baltasar Garcia Perez-Schofield等.软件X 20(2022)1012114∨∨≤≤3.2. 流量敏感型图三. StaDyn中的流量敏感型。时间[32]。尽管方法专门化技术的实现(3.5节)显著降低了这种成本,但联合类型与动态语言一样,StaDyn允许变量的类型取决于执行流。在图的源代码中。3,图形的类型(第10行)取决于args[0]的动态值。它可以是周长或矩形。StaDyn通过联合类型对流敏感类型进行建模[24]。图形变量的类型是Circumference Rectangle并集类型。并集类型T1T2表示属于T1和T2的值的集合的普通并集[25],表示T1和T2的最小上界[26]。因此,操作(例如,附加、字段访问、分配、调用和索引)是被联合类型中的每个类型接受的那些。 出于这个原因,在图11的第11行调用图11的GetX方法是安全的。 3(Circumference和Rectangle都提供GetX)。这就是动态语言社区中所谓的鸭子类型[27]。StaDyn的一个重要好处是鸭子类型是静态类型的[28]。当涉及到类型检查联合类型时,var和动态引用的行为是不一样的。对于var,类型系统检查,对于给定的操作,这样的操作被联合类型中的所有类型支持在我们的示例中,figure.GetX ( ) 是 安 全 的 , 因 为 Circumference 和Rectangle都提供了该方法。但是,GetRadius消息不能传递到图(第12行),因为Rectangle没有实现它。这是联合类型的经典解释[29]。StaDyn为动态引用提供了一种新的联合类型解释。[30 ]第30段。 在这种情况下,编译器更宽松地遵循动态语言的风格,但仍然执行静态类型。当联合类型中至少有一个类型支持某个操作时,该操作才被允许。例如,如果图在图中被声明为动态的。 3(第10行),第12行中的figure.GetRadius( ) 语 句 将 被 编 译 器 接 受 , 因 为 GetRadius 是 由Circumfer- ence实现的。 另一方面,即使figure是动态的,figure.GetArea()也会被检测为编译器错误,因为Cir- cumference和Rectangle都不支持该消息。正式的描述可以参考[31]。对于dynamic和varunion类型,StaDyn在生成的代码中添加了运行时类型检查[31]。随着联合类型中类型数量的增加,那些类型检查会消耗更多的执行通过定义一个公共的超类型可以更好地避免保存大量的类型否则,当联合类型包含126个或更多类型时,StaDyn编译器使用动态语言缓存(DLR)的类型缓存(第3.6节)-从这个值开始,DLR提供更好的性能。3.3. 动态类型化参数动态变量和var变量的类型都可以用统一算法来推断[33]。StaDyn编译器将动态变量和var变量的类型建模为可以统一的类型变量(即,用任何其他类型实例化或替换)[34]。这种统一是在方法调用、对象构造和赋值上执行的。图图4显示了右侧带有灰色类型注释的StaDyn程序摘录。类型变量表示为Xi,其中i是唯一标识符。cir的类型(第15行)是类型变量X6,它最初没有被实例化(没有找到它的替换)。第15行中的赋值将cir(X6)的类型统一为Circumference。SSA算法确保一个动态类型的局部变量被赋值一次,因此具有唯一的类型。var和dynamic参数不能统一为一个类型。 因为它们代表了所有可能被传递的参数的类型,所以它们不能像局部变量那样被推断出来。第2行中的figure参数就是这种情况。在第一次调用Distance(第17行)时,参数类型变量(X1)被统一为Circumference,但在下一次调用中(第18行),X1将是Rectangle。 因此,参数(X1)根据调用而变化--对于返回var或dynamic的方法也是如此。为了支持var和动态参数的类型推断,参数和返回值,StaDyn在其类型系统中包含约束[35]。例如,Distance的类型是一个接收X1并返回X2的方法,具有以下约束:X1必须提供GetX()和GetY()消息(X1{GetX():X3},X1{GetY():X4}),因为它们是在方法同样,GetX和GetY返回的两个值(X3和X4)必须是double的子类型,因为它们被传递给Math.Pow;最后,Distance返回的类型是double,因为这是Math.Sqrt返回的类型。Francisco Ortin,Miguel Garcia,Baltasar Garcia Perez-Schofield等.软件X 20(2022)1012115见图4。 动态类型化参数。在每次调用时,形参的类型变量与实参的类型统一起来,并检查约束。如果满足约束,则推断返回类型否则,将显示编译器错误第17、18和20行中的三个调用满足距离的约束,返回double。但是,第21行中的调用不符合因为Triangle没有实现GetX()GetY()-显示编译器错误。3.4. 静态和动态类型渐进式类型化的开发场景之一是快速原型化。在这样的场景中,动态类型化变量被用来实现原型。如果语言也支持静态类型,动态类型的变量可以逐渐转换为静态类型的变量,使应用程序更加健壮和高效。StaDyn支持使用不同的编译器选项逐步修改动态类型化的代码如前所述,该语言提供var作为一种新类型。默认情况下,var是静态类型的,当一个操作不被流敏感的联合类型中的所有类型支持时,它会显示一个编译器错误(第3.2节)。但是,如果将everythingDynamic选项传递给编译器,则所有var引用都将被视为动态的,mak- 使类型系统更宽松。当我们想把一个原型转换成一个保险箱时,这个选项将不再使用。程序[28]。StaDyn还提供了一个Visual Studio插件,便于将快速原型转换为安全的应用程序[36]。在其他功能中,它执行var和动态引用的自动替换,并使用编译器,当它们被推断为一个单一的静态类型时(流敏感的联合类型不会被替换)[37]。它支持单个变量、一个文件和整个应用程序的此选项。3.5. 方法专门化StaDyn类型推理系统结合了约束、联合类型、统一和SSA变换来检测动态类型代码的编译时错误。此外,编译器收集的类型信息用于提高生成代码的运行时性能。StaDyn执行的最重要的优化之一是方法专业化[28]。为方法调用中的参数推断的类型信息用于专门化所调用方法的代码。var和动态参数被参数的推断类型替换,并生成被调用方法的新实现。在新版本中的方法,不执行动态类型,因此运行时性能显著提高(第4.1节)。图图5显示了方法专门化技术的一个示例(左侧显示了原始代码,而右侧描述了其专门化版本)。对于第一次在-vocation到Distance(第7行),创建一个新的Distance_1方法,用参数的类型(Circumference)替换参数的动态类型(第2行);对返回类型执行因此,当专用调用调用Distance_1时,运行时性能将得到提高,因为避免了动态类型。如果参数是流敏感的联合类型(例如,第9行中的数字参数)。在这种情况下,将创建新的Distance_3方法唯一的运行时Francisco Ortin,Miguel Garcia,Baltasar Garcia Perez-Schofield等.软件X 20(2022)1012116∨图五、 原始StaDyn代码(左侧)及其专用版本(右侧)。在Distance_3中执行的类型检查是知道参数是Circumference还是Rectangle。不应检查其他类型,因为参数的类型被推断为Circumference Rectangle 。 Distance_3 调 用 Dis-tance_1 或Distance_2,其中不执行动态类型检查。3.6. 缓存类型优化尽管为每个调用执行方法专门化,但在生成的代码中保留了具有动态参数和返回类型的原始Distance这是因为编译的程序集可以用作另一个应用程序的.Net组件,在这种情况下,它不会被专用化。对于这种特殊情况,StaDyn编译器提供了另一种优化。对于那些带有动态类型参数的非专门化方法,使用运行时类型缓存[38]。在这种情况下,编译器生成的代码使用动态语言编译器(DLR)的服务。DLR为动态类型代码的典型操作实现了不同的缓存级别[39]。当使用相同的参数类型重复调用方法时,运行时缓存的使用提供了显著的性能优势(大多数应用程序中的常见情况)[38]。4. 影响StaDyn是一种适用于动态和静态类型都适合构建.Net组件或应用程序。StaDyn的主要贡献是编译器对动态类型代码执行的静态类型检查。到目前为止,我们已经描述了如何使用这些信息来生成更安全的程序,减少运行时错误(第3节)。我们现在评估如何使用类型信息来生成更有效的代码(4.1节)。最后,我们描述了使用StaDyn编程语言的一些场景(第4.2节)。4.1. 性能和内存消耗我们比较了StaDyn与.Net平台的以下混合类型语言的效率我们还包括IronPython 2.7.7实现的Python为.Net平台,由于其良好的性能。所有的源代码都没有类型注释(一切都是动态的)。对于C#,我们还测量了所有类型注释的代码,以查看实现的优化与完全类型注释的C#有多接近。还有一些其他的动态语言实现了最先进的优化,以提高动态类型代码的运行时性能。虽然它们不会为.Net平台生成代码,但我们将它们纳入分析中,以将它们的优化与StaDyn提供的优化进行比较。对于Python,我们测量了PyPy 2.7,被评估为最快的Python实现[40],以及CPython 2.7.14参考实现。JavaScript引擎V8 8.7和SpiderMonkey 24.4(带和不带IonMonkey)也因其出色的性能而被纳入评估[20]。我们还包括在高性能GraalVM多语言虚拟机上的JavaScriptGraalVM实现(本机映像和JVM运行时)[41]。我们测量不同的应用程序和基准。 首先,我们采用著名的动态类型基准测试Pybench和Pystone其次,我们包括静态类型JavaGrande基准的第2节(内核)和第3节(大规模应用程序) 还测量了点混合静态和动态基准[31]。我们将所有的程序翻译成不同的语言进行评估,所有的类型注释都被动态类型化的引用所取代。我们遵循Georges等人提出的两种方法。[42]:(1)启动性能是系统运行相对短时间运行的应用程序的速度;(2)稳态性能涉及长时间运行的应用程序,其中运行时优化已经执行。对于启动,每个程序被执行30次,计算平均结果和学生的至于启动,稳态程序执行30次。然而,在这方面,Francisco Ortin,Miguel Garcia,Baltasar Garcia Perez-Schofield等.软件X 20(2022)1012117图六、相 对 于 S t a D y n 的 平均启动执行时间(须线表示95%置信区间)。在稳定状态下的每个程序执行都运行基准测试,一个循环,它返回最后10个迭代的平均值。当这10次迭代的变异系数低于2%时(即,,达到稳定状态)-更详细的描述可参见[42]。使用启动方法评估内存消耗 对于每个程序执行,我们测量每个进 程 自 启 动 以 来 所 使 用 的 最 大 工 作 集 内 存 大 小 ( 即 , 、PeakWorkingSet)。进程的工作集是物理RAM内存中当前对进程可见的内存页面的集合,可以在不触发页面错误的情况下使用所 有程 序 都 在 2.5 GHz Intel Core i7 系 统上 测 量 ,具 有 8 GBRAM,运行更新的64位版本的Windows 10和.Net Framework 4.8。图6显示了启动执行时间,其中StaDyn的性能超过了其余测试语言,但C#具有完整的类型注释。StaDyn实现的优化使所有动态变量的代码比完全类型注释的C#慢1.8%,但由于两个置信区间重叠,因此没有显着差异[42]。当比较相同的源代码- C#与运行时性能最低的.Net语言Cobra相比,该值增长到74.9倍。当与PyPy(一个使用跟踪JIT编译器优化的Python实现)[43]相比时,StaDyn提供了272.8%的运行时间对于稳态方法(图)。7),IonMon- key和GraalVM for JVM的跟踪JIT编译器实现的动态优化与启动方法相比显示出重要的优势 。 IonMonkey 显 示 了 最 好 的 JavaScript 性 能 , 执 行 时 间 比StaDyn多127.7%。Sta-Dyn保持了第二好的稳定状态性能,比使用所有类型注释的C#多消耗5.1%的执行时间。所有这些数据表明,我们的优化使StaDyn中的动态代码非常接近类型注释的代码,并提供显着更高的运行时性能比现有的方法来优化动态类型代码。图8显示了不同语言消耗的平均运行时内存。StaDyn是一种在运行时需要较少内存资源的编程语言。这是因为StaDyn由编译器静态执行。2、相反,高度优化的实现,如PyPy,IonMonkey,V8和GraalVM,动态执行所有优化,消耗额外的内存资源。带有dynamic和IronPython的C#使用DLR的运行时缓存,而Fantom实现了自己的缓存,导致内存消耗明显更高。如前所述,Sta-Dyn提供的大多数优化都是在编译时静态进行的.这提供了比现有方法更低的执行时间和内存消耗,但需要额外的编译时间。因此,我们比较了所选程序的编译时间与不同的编译器。.Net Foundation支持两个C#和启动性能优势 JavaScript引擎评估了具有最佳启动性能的是V8,它实现了运行时自适应优化[44]。在测试的应用程序中,V8需要比StaDyn多93.4%的执行时间。2完全类型注释的C#比StaDyn多消耗2.4%的内存,因为Points基准测试中使用了DLR。StaDyn不使用DLR,因为它实现了方法特化技术[28]。Francisco Ortin,Miguel Garcia,Baltasar Garcia Perez-Schofield等.软件X 20(2022)1012118见图7。相 对 于 S t a D y n 的 平均稳态执行时间(须线表示95%置信区间)。在.Net平台上实现的Visual Basic编译器(称为Roslyn编译器),类似于StaDyn。这些C#和Visual Basic编译器的平均编译时间分别比StaDyn高92.9%和101%。与Microsoft本机实现(即,二进制编译器),C#和Visual Basic使用StaDyn消耗的编译时间的15.9%和24.6%。StaDyn编译所选程序的速度分别比Fantom、Boo和Cobra快4.5%、12.4%和63.4%,后者是.Net平台的其他混合类型语言。4.2. StaDyn的使用StaDyn编程语言用于OneRate信用风险分析系统的开发[45]。OneRate是一个高度适应性的框架,支持信用风险分析系统的常见功能,同时允许根据每个客户的特定要求进行定制。这两个目标是通过静态和动态类型的组合来实现的。StaDyn还用于DIMAG的部分开发,DIMAG是一个用于本地移动应用程序声明式实现的框架[46]。DIMAG的代码生成模块在StaDyn中实现,因为它足以使用鸭子类型添加新的目标设备同样的方法也被用于开发Linux原生视图生成系统[47]。我们使用StaDyn在实现静态类型的多-除了软件开发,StaDyn还被用于不同的学术场景。我们的语言被用于在编程范式和技术课程中教授动态和静态类型之间的区别[50]。同样,它的源代码被用来教授编程语言设计和实现模块中编译器的不同部分[51]。最后,我们使用StaDyn来教授它的不同优化,一个软件工程硕士学位的程序设计语言与平台研究课程5. 相关工作已经有许多工作旨在获得静态和动态类型的优势,在同一种编程语言。软类型将静态类型应用于Scheme动态类型语言[12]。在软类型中,静态类型检查器在可能出错的动态类型操作中插入运行时类型检查。Abadi等人在lambda演算中添加了一个Dynamic类型,包括两个转换操作:构造Dynamic类型值的dynamic和检查它们的typecase,产生了非常依赖于其动态性的冗长代码[52]。准静态类型[13]和混合类型[14]的工作执行动态和静态代码之间的隐式转换通过子类型关系。逐步分型是基于consis-.Net平台的timethods [9]。一种多方法调度程序,关联,首先定义在λ?函数演算[15]。Un-使用动态作为其多态参数的类型。这些参数被传递给实现每个多方法的静态类型重载方法[48]。StaDyn的类型系统允许静态地检测错误,同时获得高运行时性能。StaDyn还用于实现DSAW方面编织器平台的部分动态编织模块[49]。与子类型一样,一致subty→ping关系不是传递的。一致性后来与子类型(Subtyping,简写为CSTR)结合在一起,并被包含在面向对象的抽象中。渐进类型也与所有权类型[53]、细化类型[54]、会话类型[55]和类型推断[56]相结合。Francisco Ortin,Miguel Garcia,Baltasar Garcia Perez-Schofield等.软件X 20(2022)1012119⨁将联合类型视为一种渐进类型[58]。因此,T1T2图8.第八条。相 对 于 S t a D y n 的 平均运行时内存消耗(须线表示95%置信区间)。Garcia等人提出了一种新的渐进式分类基础,称为抽象渐进式分类(AGT)[57]。AGT通过使用抽象解释来根据预先存在的静态类型给渐进类型一个语义,从而导出一致谓词和渐进类型判断。渐变类型被解释为集合可能的静态类型。AGT给出了一个包含和概括传统一致性概念的一致性的正式解释。AGT包括一个系统的方法来开发动态语义的渐进程序作为证明减少源语言类型推导。受AGT关于使用抽象解释来理解渐进类型的工作的启发,Toro和Tanter定义了渐进联合类型。渐进联合类型结合了传统的静态方法,即未标记的(T1+T2)和标记的(T1<$T2)联合,并和交类型被解释为相应的集合论运算。同样,子类型关系被定义为集合包含。Castagna和Lanvin用渐变类型和集合论类型连接词定义了语言的静态和动态语义,并证明了它的可靠性。Muehlboeck和Tate提出了一种名为MonNom的演算,它允许在渐进类型化的面向对象语言中混合非类型化的结构代码和类型化的名义代码[60]。他们的系统允许程序在非类型化的结构化方法和类型化的名义方法之间转换,同时仍然确保渐进的保证[61]和可靠性。MonNom是使用LLVM的提前编译器实现的,使用标准库,泛型和新的原语扩展了他们的演算评估表明,实施低于25%。是表示T1和T2的并集渐变类型,意味着如果操作对T1或T2有意义,则接受使用值类型T1T2。如果此类操作对其中一个类型(T1或T2)有效,则会引入运行时检查,这可能会导致动态强制转换错误。如果操作对T1和T2都有效,则不需要运行时检查.如果操作对T1和T2都无效,则程序被静态拒绝由于渐进联合类型不允许完整的动态类型检查,未知类型?也包含在渐进联合类型的元理论中。Castagna和Lanvin用联合和交集类型丰富了渐进类型系统,使动态和静态类型之间的过渡更平滑,粒度更细[59]。程序员可以使用并集和交集类型来指示系统执行更少的运行时检查。它们使用集合论类型的名称是因为,将类型解释为值的集合声音逐渐类型化的语言插入运行时检查,为整个程序提供类型可靠性。因此,程序员可以依靠语言实现在运行时提供有意义的错误消息。然而,这些运行时类型检查意味着显著的性能开销[62].Rastogi等人测量了Safe TypeScript提供的健全渐进类型系统的运行时性能,报告说没有类型注释的动态代码的平均性能成本是22个因素[63]。由于健全的渐进类型语言的运行时性能成本Siek等人提出了单调引用,以避免静态类型区域中动态类型的运行时开销[64]。Herman等人的工作旨在通过组合相邻的类型子来减少类型检查操作,提供空间和时间上的潜在优化[65]。Francisco Ortin,Miguel Garcia,Baltasar Garcia Perez-Schofield等.软件X 20(2022)10121110Rastogi等人设计了一个合理的类型推断算法来提高渐进类型程序的性能,而不会引入任何新的运行时故障[66]。通过这种方式,通常可以推断静态类型,从而消除不必要的运行时检查.该算法对流入和流出未知类型的类型执行非对称处理他们的类型推断算法被包含在一个JavaScript的实现中,显示出平均运行时性能提高了60%[66]。网 格 化 Python 是 Python 编 程 语 言 的 渐 进 类 型 变 体 [67] 。Reticulated Python中渐进式输入的瞬态策略插入了轻量级的恒定时间检查(类型标记检查),而不是使用代理。然而,这种瞬时渐进类型仍然显示出与类型注释数量成线性关系的运行时性能成本,与CPython相比,最坏情况下的开销为6个因素[68]。网格化Python后来通过使用类型推断算法删除不必要的检查进行了优化,该算法使用子类型和由瞬态检查生成的检查约束[69]。线性成本消失了,与CPython相比,平均开销为6%,在PyPy上运行时为1%。Python为渐进类型的Racket语言实现了一个跟踪JIT编译器[70]。PyPython是在RPyt- hon元跟踪框架中实现的,最初是为PyPy创建的RPython自动从解释器生成跟踪JIT编译器[71]。在其他优化中,Python执行不同数据结构的RPython提供的跟踪JIT编译器允许Python消除超过90%的由Typed Rack- et引入的渐进式输入开销[72]。6. 结论StaDyn编程语言在同一种语言中结合了静态和动态类型的优点。与现有的混合类型语言相比,它的主要贡献是静态地收集动态类型代码的类型信息。这种类型信息用于提供对动态类型化代码的类型错误的早期检测和显著的运行时性能改进。由于其编译时方法专门化优化,动态内存虽然大多数优化都发生在编译时,但编译时间低于.Net平台上实现的混合类型StaDyn已成功地用于实现几个软件应用程序,并在大学课程中教授不同的主题。您可以从以下网站下载一个虚拟机,其中包含用于测量本文中这是一个很好的例子。我是一个很好的人。你好!es/stadyn/download/2022/softwarex竞合利益作者声明以下经济利益/个人关系可能被视为潜在的竞争利益:Francisco Ortin报告说,科学技术和创新部提供了财政支持。Francisco Ortin报告说,阿斯图里亚斯公国政府提供了财政支持。数据可用性本文中使用的数据是通过执行本文中描述的基准测试生成的所有基准测试的源代码都可以下载。致谢StaDyn编程语言部分由美国微软研究院资助,其项目名为“SSCLI的扩展动态功能”,在Phoenix和SSCLI中获得,编译和托管执行请求用于Pro。它还得到了西班牙科学、创新和大学部(项目RTI 2018 -099235-B-I 00)和西班牙奥维耶多大学(GR-2011-0040)的资助。我们感谢Cristina González、Daniel Zapico、Francisco Moreno和Anton Morant为StaDyn编程语言的实现做出的贡献引用[1]Meijer E , Drayton P. , Static Typing Where Possible , Dynamic TypingWhenNeeded:The End of Cold War Between Programming Languages.上一 篇 : OOPSLA 研 讨 会 关 于 动 态 语 言 复 兴 的 会 议 记 录 。 Vancouver ,Canada:ACM; 2004,p. 1比6[2]Thomas D,Fowler C,Hunt A.编程Ruby第二版Addison-Wesley;2004.[3]张文,张文.使用Rails进行敏捷Web开发。实用指南。Pragmatic Bookshelf; 2005.[4]放大图片作者:Thomas D.实用主义程序员:从工程师到大师。Addison-Wesley Longman出版公司Inc. 1999年[5]ECMA-262 ECMAScript 2021语言规范。欧洲计算机制造商协会;2021年。[6]放大图片作者:Bush E,van der Linden M.全栈JavaScript开发:在AWS上使用MongoDB、express、angular和no
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功