本页使用了标题或全文手工转换

块 (编程)

维基百科,自由的百科全书
跳到导航 跳到搜索

计算机编程中,(block)或代码块是将源代码组织在一起的词法结构。块构成自一个或多个声明英语Declaration (computer programming)语句。编程语言允许创建块,包括嵌入其他块之内的块,就叫做块结构编程语言。块是结构化编程的基础,其中的控制结构用块来形成。

在编程中块的功能是确使成组的语句被当作如同就是一个语句,限定在一个块中声明的对象如变量、过程和函数的词法辖域,使得它们不冲突于在其他地方用到的同名者。在块结构编程语言中,在块外部的对象名字在块内部是可见的,除非它们被声明了相同名字的对象所遮掩

历史[编辑]

块结构的想法是在1950年代开发第一个Autocode英语Autocode期间发展出来的,并形式化于ALGOL 58ALGOL 60报告中。Algol 58介入了“复合”(compound)语句的概念,它只与控制流程有关[1]。随后的描述ALGOL 60的语法和语义的“修订报告”介入了块和块辖域的概念,这里的块构成自“一序列声明,跟随着一序列的语句,并被包围在beginend之间...”在其中“所有声明以这种方式出现在一个块中并只在这个块中有效。”[2]

语法[编辑]

块在不同语言中使用不同的语法。两个广大的家族是:

  • ALGOL家族,ALGOL及其后继者中的块是使用关键字beginend或等价者来界定。ALGOL 68使用圆括号:()。在C语言中,块使用花括号来界定:{}。在ALGOL 68和此后Edsger W. Dijkstra的1974年的守卫命令语言英语Guarded Command Language中,条件和迭代代码块可以选择使用块保留字的反写来终止:比如:if ~ then ~ elif ~ else ~ ficase ~ in ~ out ~ esacfor ~ while ~ do ~ od
  • s-表达式,圆括号包围的前缀表示法,它具有语法关键字比如lambdalet,如在Lisp家族中那样。

此外还有:

限制[编辑]

一些支持带有声明的块的语言不完全支持所有声明,例如很多C派生语言不允许在块内的函数定义(嵌套函数英语nested function)。不同于祖先ALGOL,Pascal不支持在现存的块的beginend的内部使用带有自己声明的块,只支持复合语句来确使语句序列在ifwhilerepeat和其他控制语句内被组合在一起。

提升[编辑]

在一些情境下,在一个块中的代码的求值,如同这个代码实际上是写在块的顶部或块的外部一样。这经常通俗的叫做“提升”(hoisting),这包括了:

  • 循环不变代码外提,是将在循环内不变的代码在循环之前求值的编译器优化。
  • 变量提升,是JavaScript的辖域规则,在这里变量有函数辖域,并且表现得如同它们被声明(而非定义)在函数的顶部一样。

参见[编辑]

引用[编辑]

  1. ^ Perlis, A. J.; Samelson, K. Preliminary report: international algebraic language. Communications of the ACM (New York, NY, USA: ACM). 1958, 1 (12): 8–22. doi:10.1145/377924.594925. 
  2. ^ Backus, J. W.; Bauer, F. L.; Green, J.; Katz, C.; McCarthy, J.; Perlis, A. J.; Rutishauser, H.; Samelson, K.; Vauquois, B.; Wegstein, J. H.; van Wijngaarden, A.; Woodger, M. Naur, Peter, 编. Report on the Algorithmic Language ALGOL 60 3 (5). New York, NY, USA: ACM: 299–314. May 1960 [2009-10-27]. ISSN 0001-0782. doi:10.1145/367236.367262.