正如我们在ADA 2022支持的GNAT中所看到的那样,对ADA 2022的支持现在主要是为了每个人都可以利用。我们'现在穿越手指,以便在2022年由ISO正式盖章。
在实践中,制作新的ISO的语言修订是一个漫长的过程,到目前为止每十年大概发生。在我们方面,遵循语言设计文化的一般演变,以及我们从我们的用户社区接收的一些反馈,我们希望有一个更短,更热烈的反馈循环。
这就是为什么我们在2019年开始进行新的倡议,以ADA / Spark RFCS平台为中心,这将使我们能够尝试ADA的新语言功能。
在这个平台上,我们希望任何人有机会通过RFCS("评论&#34的请求和#34;),与社区公开讨论RFC的优点,选择那些最有前途的原型设计,原型在GNAT(和/或Spark的适当时)中的功能,从功能的用户收集反馈,并根据该反馈取决于放弃功能,修改或保留它。最后,当相关时,提出我们保留的特征,以便包含在Ada报告员集团的下一个版本,国际机构,负责ADA标准化。
为了评估ADA编程语言的当前和未来用户的需求,我们向内外询问了他们所希望的ADA和Spark的未来。我们从这些答案中获得了很多洞察力,来自有不同背景的程序员。其中一个最常见的请求是在使用前的数据初始化等区域中获得更多的编译时间保证,访问识别的字段,可能为空指针的DEREURE,动态内存管理。请注意,Spark已经提供了这样的保证,以约束语言并要求分析比编译更昂贵。在这里,我们的目标是通过更简单的编译提供上述ADA程序的保证。其他常见请求是:具有更丰富的规范和隐式实例化的更强大的泛型,更好的字符串处理,正确支持Unicode,更普遍可用的数据完成机制以及一些常用的语法添加。 Ada的特殊对象模型成为一个有争议的问题,具有一些强大的支持者和强大的对手,他们主张重建java / c ++的主导模型。
由于迄今为止来自外部贡献者的建议以及涂鸦语言设计团队,我们已经开始添加其中一些新的实验功能,并在最新的GNAT社区2021版本中提供了第一个可供选择以及最新的GNAT Pro 22连续释放,在-GNATX开关下并详述下面。
让'首先以两个&#34开始;最想要的"许多ADA用户多年来一直在要求的功能:
在RFC#38中详细说明,您现在可以指定针对固定为特定值的无约束阵列的较低限制。 通过简化码,使用此功能可以提高安全性,也可以提高索引操作的效率。 例如,每个维度的具有固定下限的矩阵类型可以通过以下声明: 型矩阵为阵列(自然范围0 ..<,自然范围0 ..<>)整数; 使用索引约束声明的类型矩阵对象必须具有以零开始的索引范围: M1:矩阵(0 .. 9,0 .. 19); M2:矩阵(2 .. 11,3 .22); - 警告界限; 将提出CE 类似地,可以声明字符串的子类型,其指定该子类型的对象的下限为1:
如果将字符串切片传递给对子程序S的呼叫中的子类型String_1,则切片的界限将“幻灯片”,以便下限为1.在S中,正式的下限为1,因此,与正常的不受约束的字符串正式不同,无需担心其他可能的较低限制值:
过程str1是子类型String_1是字符串(1 ..>);程序proc(s:string_1)是begin - s' first = 1 put_line;终止; s:string_1:="你好世界&#34 ;; begin proc(s(7 .. s'最后)); - 在S(7 .. s'最后)上滑动,所以在调用proc时自动发生,所以这将通过其内容的字符串_1(1 .. 5)"世界"结束str1;
在RFC#34中详细说明,所谓的呼叫的前缀视图表示法被扩展,以便还允许此类语法来调用到未标记类型的原始子程序。具有前缀图的未标记类型T的基元是那些子程序的第一个正式参数是t类型的那些,或者是指定类型是t的匿名访问参数。这是另一个"最想要的;自从ADA 2005中引入此表示法以来的功能!例如:
通用类型elem_type是私有的;包矢量是型矢量是私有的;过程Add_Element(v:在向外矢量; elem:Elem_type);功能nth_element(v:vector; n:正面)返回Elem_type;功能长度(V:Vector)返回自然; ...终端向量;包INT_VECS是新矢量(整数); v:int_vecs.vector; ... v.add_element(42); v.add_element(-33); pragma assert(v.length = 2); pragma断言(v.nth_element(1)= 42);
在RFC#73中讨论的这种较小的句法添加增加了使用&#34的能力;当&#34时;关键字与"返回&#34 ;," goto"和"筹集"陈述,除了现有的"退出时"控制结构。
程序DO_ALL(元素:ACCESS REC;成功:OUT BOOLEAN)ISBEGIN RESING CONSTAIL_ERROR与"元素为null"当元素= null时; do_1(成功);不成功返回; do_2(成功);不成功返回; do_3(成功);不成功返回; do_4(成功);结束do_all;
另一方面这个功能(在RFC#50中详细说明)是一个很大的一个并且仍在工作。它提供了案例语句的延伸,以涵盖记录和数组,以及标量类型的更精细的群体套管,并且在访问判断字段时,将特别会在将来提供更多的编译时间保证。
类型标志是(NEG,零,POS);函数乘法(S1,S2:符号)返回符号是(案例(S1,S2)是(NEG,NEG)|(POS,POS)=> POS,何时(零,<>)|(ZHON)(ZERO)=>零,当(NEG,POS)|(POS,NEG)=> neg);
匹配的复合类型目前仅支持没有判别的记录。对判别和阵列的支持将稍后。
用于案例语句的选择器可以是复合类型。聚合语法用于选择案例陈述;然而,在“正常”聚合的情况下是离散值的情况下,可以使用离散的亚型; BoxNotation也可用于匹配所有值。
RECT reg是记录f1,f2:整数;结束记录;程序匹配_record(x:rec)isbegin case x是(f1 =>阳性,f2 =>阳性)=>做这个;当(f1 =>天然,f2 =><)| (F1 =><>,f2 => national)=>去做;当别人=> do_the_other_thing;结束案例;结束match_record;
如果调用match_record并且x的两个组件都是正的,则将调用thendo_this;否则,如果任一组件是非负(自然),则将调用do_that;否则,将调用do_the_other_thing。
如果匹配早期替代端的选择的值的一组值,则稍后替代的相应组,那么第一个版子应是第二个的适当子集(如果早期替代“匹配”,则不执行后来的替代替代。 )。应涵盖复合类型的所有可容纳。
此外,支持图案绑定。这是一个机制,将名称绑定到匹配值的组件以便在案例语句的替代方案中使用。对于一个组件协会,该组件在案例选择内发生,表达式之后可以是“是<标识符>”。在“框”组件关联的特殊情况下,可以在框内提供标识符。关键词中的任何一个,给定的标识符表示案例选择器的匹配子组件的(常量视图)。
过程匹配_record2(x:rec)isbegin case x是(f1 =>正为abc,f2 =>阳性)=> do_this(abc);当(F1 => Natural是N1,F2 =>< n2>)| (F1 =>< n2>,f2 => natial是n1)=> do_that(param_1 => n1,param_2 => n2);当别人=> do_the_other_thing;结束案例;结束match_record2;
此示例与前一个相对于若要进行的若要若要调用。但是对于这个版本,do_this需要一个参数和do_thattakes两个参数。如果调用do_this,则thecall中的实际参数将是x.f1。
如果调用do_that,情况更复杂,因为这是该替代方案的两思卡。如果叫做of_that是因为第一个choicatched(即,因为x.f1是非负面的,并且x.f1或x.f2是zeroor负数),那么呼叫的实际参数将是(按顺序)x.f1和x。 F2。如果调用do_that是因为第二选择匹配(并且第一个没有),那么实际参数将被反转。
这一点(见RFC#47)仍然是一个移动目标,肯定会欢迎一些用户的实验和反馈!它开始观察到多年来,在ADA中管理可访问性的规则,即允许指针的操作,已经成长为一个点,他们几乎不理解的实施者,甚至更少被用户更少。因此,通过引入新的限制Pragma,我们希望简化规则并提出与使用匿名访问类型相关的运行时可访问性检查的模型被抑制和替换,特别是因为运行时可访问性检查是不可能的要完全或更差,可能会产生误报(在实际发生悬垂访问的情况下提高异常)。
在GNAT社区版2021中使用no_dynamic_accessibility_Checks时的默认模型虽然在更新的GNAT Pro开发版本中,我们将这种型号与另一个交换了此模型,除了-GNATD_B调试开关之外,该模型将通过-gnatd_b调试开关。限制。
在此模型中,匿名访问类型在声明指定类型的点处隐式声明。
通过在GNAT CE 2021中的-GNATD_B交换机的附加使用以及默认情况下使用NO_DYNAMIC_ACCESSIBLIBICE_CHECKS在更新的GNAT PRO版本中,匿名访问类型在使用匿名访问的位置(作为子程序参数的一部分)隐式声明,对象声明等......)。
这两种模型都可以进一步提高基于在实际代码上收到的反馈以及用户会发现最有用和实用的反馈,因此请不要犹豫,试一试,让我们知道! 你发现其中一些功能有用吗? 你想试一试,告诉我们你的想法吗? 您是否对其他新的ADA功能或其他对现有功能的更改有一些想法? 我们鼓励您尝试一下,提供您的反馈,并在ADA / Spark RFC平台中提出新的建议! 在我们方面,我们' LL继续原型设计其他RFC并完善现有的,所以保持调整。 Arnaud Charlet是墓穴产品工程领先,也在协调GNAT前端的开发。 此外,他最近领导了GNAT CCG和GNAT LLVM技术的设计和实施。 arnaud以前曾在执行GNAT任务运行时,GNAT编程工作室和代码赛中的实施,无论是软件工程师还是产品管理器。