Ada中的end if语句提供的优势超过其他语言

时间:2017-10-12 05:16:57

标签: if-statement ada conditional-compilation

大多数其他编程语言在条件语句结束时不需要end if语句。

if boolean_expression then statement else statement

end if提供其他语言不具备的Ada有什么优势呢?

if boolean_expression then statement else statement end if

我认为如果条件为真,它与分支预测有关(跳过代码的其他部分),但我不确定。

3 个答案:

答案 0 :(得分:8)

考虑嵌套if,如下所示:if boolean_expression then if another_boolean_expression then statement else statement

现在,if部分属于哪个else语句?

end if解决了这个问题(为了清晰起见,缩进):

if boolean_expression then 
   if another_boolean_expression then
      statement 
   end if;
else
  statement 
end if;

或:

if boolean_expression then 
   if another_boolean_expression then
      statement
   else
      statement
   end if;
end if;

答案 1 :(得分:5)

TL; DR:

它没有任何特殊优势,但它是允许块声明的任何语言的必要部分。

Ada的块终止方法非常明确,但这并没有带来任何特别的优势。

讨论

正如其他人所指出的那样,它只是Ada的块终止的方法。 语法细节不是很重要,但语义是关键。

考虑一些如何用其他语言表达块终止的例子:

  • Erlang Prolog :lambdas和conditionals的关键字end,函数定义的全停字符.和{{ 1}}和,用于短语隔离。
  • Python YAML ,"缩进模式" Haskell RyuQ :块终止用缩进(语义空白)表示。
  • Ruby Elixir :阻止终止以关键字;表示。与Ada非常相似。
  • Algol sh / Bash / Dash :使用匹配的initiating关键字撤销来阻止快速阻止。因此endif终止,ficase终止。
  • Rust C C ++ D Java JavaScript / ECMA脚本等:全部使用关键字和左括号esac打开,并关闭所有具有结束{的块,允许块关闭令牌容易识别(通过相对天真的解析器,不一定是人类读者)。
  • Lisp 和朋友:一般来说,一切都是列表形式的语义表达,所有评估块都是用}打开的(这实际上意味着"开始评估&#34 ;)虽然列表是用(打开的(这实际上意味着"我在列表中,但跳过评估我")并且所有关闭都以关闭paren '(关闭。
  • XML HTML SGML XSLT 以及其他醒来的噩梦:每个(可能是任意的)开场像)这样的标记由匹配的标记终止,该标记带有结束斜杠指示符,例如<foo>(或者有时只是</foo>,由于重要原因,这稍微好一点)。角度支架疯狂的大多数变种现在支持&#34;自我关闭&#34;标签也是如此,其中结束斜杠可以作为简写存在于开始标记的末尾,因此像</>这样的空标记可以缩短为<foo></foo>或有时{{1它取决于它恰巧是什么样的疯狂味道。 (显然有a few semantic black holes可以被这种歧义所吸引。)

等等...

正如我们所看到的,Ada的块终止表达式在任何方面都不是奇怪的 - 它比直觉语言更明确(并且比Erlang和Prolog稍微更明确)。无论如何,不​​使用GOTO或其他形式的显式跳转表达式,绝对有必要能够定义逻辑块,这意味着还有一种明确的方法来终止它们。这只是Ada的方式。

附录:关于&#34;块&#34;

的说明

正如flyx所指出的那样,语句,块,表达式,过程,子例程和函数之间存在一个有趣的区别。有些语言有所有这些,有些语言只有函数和表达式,有些语言有任意混合。

C(及其后代)区分&#34;语句&#34;和&#34;表达式&#34;,并且在由<foo />括号分隔的C风格块的情况下,语言对待&#34;阻止&#34; 作为单个声明。意思是, not 期望以表达式的方式返回值,期望由语句本身表示的过程的执行将对程序产生一些有意义的影响。

那么这在语法方面意味着什么?

在Ada中,<foo/>显式打开一个块

但是,在C中,{}根本没有打开或声明任何内容 - 它只是保护下一个语句。因此,C中的单行if完全正常 - 没有任何括号需要关闭,因为没有一个被打开。但是,如果if之后的语句需要是一个多行语句(请注意,在C中为每个多行语句定义函数有点不合时宜)。

if

相同
if

看,马,没有括号!

前者更常见,因为大多数条件分支不止一行。

这个特殊问题变得有些多云(现在你实际上进入分支预测问题)C ternary operator

if (x) {do_something();}

或Python最近添加了三元运算符:

if (x) do_something();

一个等价物(有点单一的C):

int opening_time = (day == SUNDAY) ? 12 : 9;

等等。

以下是我们了解非命名代码块的一些非常早期的实用程序,以及在某些(但不是所有)语言中如何将它们视为复合语句。 / p>

答案 2 :(得分:3)

Ada语言的设计考虑了可读性和代码缺陷预防。因此,范围结束构造是强制性的,并且对应于范围开放构造。如果你有一段很长的代码,那么就可以更容易地找出关闭条目实际关闭的内容。

procedure Foo is
begin
    if condition then 
    -------------------
    -- a lot of code...
    -------------------
    end if;
end Foo;

相比之下,其他一些语法不同的语言可能会让开发人员不管是否要编写其他注释来澄清结束目的或者是否要编写结束条目(C ++示例):

void
Foo(void)
{
    if(condition)
    {
    ///////////////////
    // a lot of code...
    ///////////////////
    } // if
} // Foo

此类代码的可读性较低,可能容易出现范围问题或需要开发人员的额外努力。