ALGOL 60

来自Local Chinese Wikipedia
imported>Mhss2026年1月15日 (四) 09:22的版本 过程
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到导航 跳转到搜索

页面Module:Infobox/styles.css没有内容。

ALGOL 60
编程范型指令式过程式结构化
语言家族ALGOL
設計者package.lua第80行Lua错误:module 'Module:Ilh/data' not found, package.lua第80行Lua错误:module 'Module:Ilh/data' not found, package.lua第80行Lua错误:module 'Module:Ilh/data' not found, 巴科斯, package.lua第80行Lua错误:module 'Module:Ilh/data' not found, 佩利, package.lua第80行Lua错误:module 'Module:Ilh/data' not found, 諾爾, package.lua第80行Lua错误:module 'Module:Ilh/data' not found, 范·韦恩加登, package.lua第80行Lua错误:module 'Module:Ilh/data' not found, J. Green, 麦卡锡
发行时间1960年,​66年前​(1960
当前版本Template:Software version
型態系統静态, 弱类型[lower-alpha 1]
作用域词法
網站Template:Official url
受影响于
ALGOL 58
影響語言
ALGOL 68, 所有“类似ALGOL语言”比如: Simula, Pascal, C等, ISWIM, Scheme

ALGOL 60(源自脚本错误:没有“Lang”这个模块。的縮寫),是在1960年創建的称为“算法语言”的一種程式語言。它是以后来称为ALGOL 58的“国际代数语言”为基礎,其官方後繼者是ALGOL 68,它们一起并称为ALGOL語言家族。Algol 60引进了许多新的概念如:词法作用域递归[1]巴科斯-诺尔范式(BNF),它在程式語言设计和发展演化中有著巨大的影響力。

歷史[编辑]

1960年,在巴黎举行的讨论会上,来自欧洲的诺尔package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found范·韦恩加登package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found,与来自美国的佩利巴科斯麦卡锡package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found和J. Green,共同发表了《算法语言ALGOL 60报告》[2]戴克斯特拉实现了ALGOL 60语言的第一个编译器。在1962年罗马会议上,ALGOL 60报告得到了修订,并于1963年出版[3]

ALGOL 60是程序设计语言发展史上的一个里程碑,影響到其後的SimulaCPLALGOL WISWIMBCPLBPascalCScheme等。它标志着程序设计语言成为一门独立的科学学科,并为后来软件自动化及软件可靠性的发展奠定了基础。

標準[编辑]

ALGOL 60以及COBOL,是最初的企圖標準化的程式語言。ALGOL60曾經提出兩項ISO標準:

  • ISO 1538: 1984年,编程语言ALGOL 60[4],它已稳固化。
  • ISO 1672: 1977年,ALGOL基本符号的ISO 7位编码字符集硬件表示[5],它已撤消。

实现时间线[编辑]

ALGOL 60在语言报告中没有I/O设施;诸多实现以少有相互兼容的方式定义了自己的设施。迄今ALGOL 60已经有了至少70个扩充、扩展、派生和子语言[6]

名字 年份 作者 国家 描述 目标CPU
X1 ALGOL 60 1960年8月[7] Edsger W. Dijkstra和Jaap A. Zonneveld File:Flag of the Netherlands.svg 荷蘭 第一个ALGOL 60实现[8] package.lua第80行Lua错误:module 'Module:Ilh/data' not found
ALGOL 1960[9] Edgar T. Irons File:Flag of the United States.svg 美国 ALGOL 60 package.lua第80行Lua错误:module 'Module:Ilh/data' not found
package.lua第80行Lua错误:module 'Module:Ilh/data' not found(及一些变体) 1961 package.lua第80行Lua错误:module 'Module:Ilh/data' not found(有HoareDijkstra和其他人参与) File:Flag of the United States.svg 美国 以Burroughs(后来基于Unisys package.lua第80行Lua错误:module 'Module:Ilh/data' not found)计算机为基础。Burroughs方言包括了特殊系统编程方言比如package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found
Case ALGOL 1961 File:Flag of the United States.svg 美国 Simula最初签约为Case ALGOL的模拟器扩展 package.lua第80行Lua错误:module 'Module:Ilh/data' not found
GOGOL 1961 William M. McKeeman File:Flag of the United States.svg 美国 用于ODIN分时系统 PDP-1
DASK ALGOL 1961 Peter Naurpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found File:Flag of Denmark.svg 丹麦 ALGOL 60 package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found
SMIL ALGOL 1962 Torgil Ekman,Carl-Erik Fröberg File:Flag of Sweden.svg 瑞典 ALGOL 60 隆德大学package.lua第80行Lua错误:module 'Module:Ilh/data' not found
GIER ALGOL 1962 Peter Naurpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found File:Flag of Denmark.svg 丹麦 ALGOL 60 package.lua第80行Lua错误:module 'Module:Ilh/data' not found的GIER
package.lua第80行Lua错误:module 'Module:Ilh/data' not found[10] 1962 package.lua第80行Lua错误:module 'Module:Ilh/data' not found,Stephen J. Garland,Robert F. Hargraves,package.lua第80行Lua错误:module 'Module:Ilh/data' not found,Jorge LLacer File:Flag of the United States.svg 美国 ALGOL 60 package.lua第80行Lua错误:module 'Module:Ilh/data' not found
Alcor Mainz 2002 1962 Ursula Hill-Samelson,Hans Langmaack File:Flag of Germany.svg 德国 Siemens 2002
ALCOR-ILLINOIS 7090 1962[11][12] Manfred Paul,Hans Rüdiger Wiehle,package.lua第80行Lua错误:module 'Module:Ilh/data' not foundRudolf Bayer File:Flag of the United States.svg 美国 File:Flag of Germany.svg 西德 ALGOL 60,伊利诺伊大学慕尼黑工业大学的实现,1962年-1964年 IBM 7090
USS 90 ALGOL 1962 L. Petrone File:Flag of Italy.svg 義大利
package.lua第80行Lua错误:module 'Module:Ilh/data' not found 1962 C. A. R. Hoare File:Flag of the United Kingdom (1-2).svg 英国 在他的1980年图灵奖演讲中讨论 package.lua第80行Lua错误:module 'Module:Ilh/data' not found & package.lua第80行Lua错误:module 'Module:Ilh/data' not found
ALGOL 60 1962 Roland Strobel[13] File:Flag of East Germany.svg 东德 package.lua第80行Lua错误:module 'Module:Ilh/data' not found应用数学研究所实现 Zeiss-Rechenautomat ZRA 1
ALGOL 60 1962 package.lua第80行Lua错误:module 'Module:Ilh/data' not found,Louis Bolliet[14] File:Flag of France (1794–1815, 1830–1958).svg 法國 格勒诺布尔计算机科学与应用数学研究所(IMAG)和Bull机器公司 package.lua第80行Lua错误:module 'Module:Ilh/data' not found
ALGOL Translator 1962 G. van der Mey,package.lua第80行Lua错误:module 'Module:Ilh/data' not found File:Flag of the Netherlands.svg 荷蘭 荷兰国家邮政局,电报电话 package.lua第80行Lua错误:module 'Module:Ilh/data' not found
Kidsgrove ALGOL 1963 F. G. Duncan File:Flag of the United Kingdom (1-2).svg 英国 package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found
SCALP[15] 1963 Stephen J. Garland,package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found File:Flag of the United States.svg 美国 作为ALGOL 60子集的自齐备Algol处理器 package.lua第80行Lua错误:module 'Module:Ilh/data' not found
VALGOL 1963 Val Schorre File:Flag of the United States.svg 美国 package.lua第80行Lua错误:module 'Module:Ilh/data' not found编译器的编译器的测试品
FP6000 ALGOL 1963 package.lua第80行Lua错误:module 'Module:Ilh/data' not found File:Flag of Canada (Pantone).svg 加拿大 package.lua第80行Lua错误:module 'Module:Ilh/data' not found写作 package.lua第80行Lua错误:module 'Module:Ilh/data' not found
package.lua第80行Lua错误:module 'Module:Ilh/data' not found 1964[16] package.lua第80行Lua错误:module 'Module:Ilh/data' not found,Lawford John Russell File:Flag of the United Kingdom (1-2).svg 英国 英国电气公司原子能部。以package.lua第80行Lua错误:module 'Module:Ilh/data' not found为前提,国家物理实验室ACEpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found实现。 英国电气公司package.lua第80行Lua错误:module 'Module:Ilh/data' not found
ALGOL 60 1964 Jean-Claude Boussard[17] File:Flag of France (1794–1815, 1830–1958).svg 法國 格勒诺布尔信息与数学应用研究所 IBM 7090
ALGOL-GENIUS 1964 Börje Langefors File:Flag of Sweden.svg 瑞典 增加受COBOL启发的数据记录和I/O package.lua第80行Lua错误:module 'Module:Ilh/data' not found D-21
ALGOL 60 1965 Claude Pair[18] File:Flag of France (1794–1815, 1830–1958).svg 法國 南锡科学学院计算中心 package.lua第80行Lua错误:module 'Module:Ilh/data' not found
Dartmouth ALGOL 1965 Stephen J. Garland,Sarr Blumson,Ron Martin File:Flag of the United States.svg 美国 ALGOL 60 用于package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found
NU ALGOL 1965 File:Flag of Norway.svg 挪威 UNIVAC
ALGOL 60 1965[19] F.E.J. Kruseman Aretz File:Flag of the Netherlands.svg 荷蘭 用于EL-X8的MC编译器 package.lua第80行Lua错误:module 'Module:Ilh/data' not found
ALGEK 1965 File:Flag of the Soviet Union.svg 苏联 АЛГЭК,基于ALGOL-60并支持COBOL,用于经济任务 package.lua第80行Lua错误:module 'Module:Ilh/data' not found
MALGOL 1966 publ. A. Viil,M Kotli,M. Rakhendi 爱沙尼亚苏维埃社会主义共和国 爱沙尼亚SSR package.lua第80行Lua错误:module 'Module:Ilh/data' not found
DJS-6 ALGOL 1966 File:Flag of the People's Republic of China.svg 中國 华北计算所 DJS-6
ALGAMS 1967 GAMS组织(ГАМС,中型机器自动化编程小组),协作于Comecon科学院 经济互助委员会 package.lua第80行Lua错误:module 'Module:Ilh/data' not found,后来的package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found
ALGOL/ZAM 1967 File:Flag of Poland.svg 波蘭 波兰ZAM计算机
package.lua第80行Lua错误:module 'Module:Ilh/data' not found 1972 File:Flag of the United States.svg 美国 DG package.lua第80行Lua错误:module 'Module:Ilh/data' not found计算机家族
NASE[20] 1990 Erik Schoenfelder File:Flag of Germany.svg 德国 解释器 Linux和MS Windows
MARST[21] 2000 Andrew Makhorin File:Flag of Russia.svg 俄羅斯 ALGOL 60到C转换器 GNU编译器套件支持的全部CPU;MARST是GNU计划成员
jff-algol[22] 2016 Jan van Katwijk File:Flag of the Netherlands.svg 荷蘭 简单的ALGOL 60至C转换器 采用GPL许可证跨平台
taxi[23] 2021 Antonio Maschio, Ian Jone, Bruce Axtens File:Flag of Italy.svg 義大利 简易的ALGOL 60解释器 采用GPL许可证跨平台

词法[编辑]

简单符号[编辑]

除了字母数字之外,ALGOL定义了运算符

优先级 运算符
第一
算术
第一 (幂)
第二 ×/(实数),÷(整数)
第三 +-
第二 <=>
第三 ¬(非)
第四 (与)
第五 (或)
第六 (蕴涵)
第七 (等价)

分界符(delimiter):

, . : ;
( ) [ ]

在ISO 1672标准中,用:=表示(U+2254),用*表示×;用%表示÷,用**^表示;用>=表示,用<=表示,用<>表示;用@表示科学记数法指数运算的底数10所用符号(U+23E8),用{表示,并且用}表示,用空格 表示在字符串中的空白字符(U+2423)。

关键字[编辑]

ALGOL 60有24个关键字

  • array
  • begin
  • Boolean
  • comment
  • do
  • else
  • end
  • false
  • for
  • go to
  • if
  • integer
  • label
  • own
  • procedure
  • real
  • step
  • string
  • switch
  • then
  • true
  • until
  • value
  • while

ALGOL 60不采用保留字的概念,但包括了标准函数名字作为限制标识符:

  • abs
  • sign
  • sqrt
  • sin
  • cos
  • arctan
  • ln
  • exp
  • entier

关键字写法依赖于实现,常见的是一种叫做package.lua第80行Lua错误:module 'Module:Ilh/data' not found(stropping)的方法,即将关键字大写并包围在两个'之间,例如将go to写为'GOTO'。在ISO 1672标准中关键字还包括对特定符号的某种文字转写:

符号 转写 符号 转写 符号 转写 符号 转写
[ '(/' ] '/)' '(' ')'
< 'LT' > 'GT' 'LE' 'GE'
= 'EQ' 'EQV' 'NE' ¬ 'NOT'
'AND' 'OR' 'IMPL' ÷ '/'

语法和语义[编辑]

ALGOL 60的语法定义采用了包容左递归巴科斯范式(BNF)。用以形成语句的关键字,在ALGOL 60中被归入顺序运算符(operator)和分隔符(separator)之中。

量与变量[编辑]

在ALGOL 60中,(quantity)被区分出如下种类的语法单元(unit):简单变量、数组、标签、接转(switch)和过程。package.lua第80行Lua错误:module 'Module:Ilh/data' not found及其构成者和数组标识符,被称为拥有值。各种“类型”即integerrealBoolean指称(denote)的基本的属性。

变量是对一个单一的指定(package.lua第80行Lua错误:module 'Module:Ilh/data' not found)。加下标(subscripted)变量指定(designate)多维数组的元素的值,这里将数组元素称为“元件”(component)[24]。函数指定式(designator)定义单一的数量值或逻辑值,它们是将给定的由过程声明定义的规则集合,应用于固定的实际参数集合的结果。现在通常将变量定义为抽象的存储位置,它含有了被称为一个的某种已知或未知的信息,并且配对了关联的package.lua第80行Lua错误:module 'Module:Ilh/data' not found名字

表达式[编辑]

在描述算法处理的程序中,主要构成者是算术表达式和布尔表达式,以及用在go to语句中的得到语句标签的指定(designational)表达式。除了特定的分界符之外,表达式的构成者包括:逻辑值、数值、变量、函数指定式,和基本的算术、关系、逻辑运算符及顺序运算符。

由于算术表达式、布尔表达式和指定表达式的语法定义,都在其构成者中包容了自身形式,并且变量和函数指定式的语法定义都包容表达式,表达式的定义必须是递归的。

在左圆括号和匹配的右圆括号之间的表达式(parenthesized expression)自行求值,而这个值被用于后续的计算之中;因此通过适当的圆括号放置,总是可以在表达式之内安排出想要的运算次序

块与作用域[编辑]

在ALGOL 60中,“复合语句”被定义为:包围在语句括号beginend之间的成序列的语句,形成一个复合语句。被定义为:成序列的声明,跟随着成序列的语句,并被包围在beginend之间,形成一个块;所有声明以这种方式出现在一个块中,并只在这个块中有效。[25]

一个程序是特定的一个块或复合语句,它不包含在另一个语句之中,并且不使用不包含在它之中的其他语句。在1976年的修改版语言报告中,程序只能包含在叫做“环境块”的假定总是存在的一个拟制块之中,除了可以使用在环境块中声明的过程标识符和函数指定符之外,不使用不包含在它之中的其他语句。

声明负担定义在程序中用到的量的特定属性,并给它们关联上标识符。声明包括:类型声明、数组声明、接转声明(用标签组成switch列表[26])和过程声明。量的作用域是语句和表达式的集合,在其中关联于这个量的标识符的声明是有效的。所有的块,自动地介入名称目录(nomenclature)的一个新的层级:

  • 在这个块内出现的标识符,可以通过合适的声明,而被规定(specify)为局部于所论及的这个块。这个标识符在这个块里面的所表示的实体,不存在于它的外面。这个标识符在这个块外面的所表示的任何实体,在这个块里面是不可见的。
  • 除了表示标签的标识符之外,一个标识符,如果出现在一个块中,而且并非声明于这个块中,则它package.lua第80行Lua错误:module 'Module:Ilh/data' not found于这个块[27],就是说它在这个块里面和在紧邻其外的层级中所表示的是同一个实体。
  • 因为块中的语句自身可以是一个块,局部和非局部于一个块的概念,必须递归地去理解,就是说非局部于一个块A的一个标识符,可是亦可否地,非局部于A是其中语句的块B

这动态的蕴涵了:在通过begin进入一个块的时候,所有为这个块声明的标识符,假定了这个给定声明的package.lua第80行Lua错误:module 'Module:Ilh/data' not found所蕴涵的package.lua第80行Lua错误:module 'Module:Ilh/data' not found(significance);如果这些标识符已经被外面的其他声明所定义,这时它们被给予新的意义;在另一方面,并非为这个块声明的标识符,保持它们旧有的含义。在通过endgo to语句退出一个块的时候,为这个块声明的标识符失去它们的局部意义。声明可以标记上额外的声明符own,其效果为:在重新进入一个块的时候,自有的这些量的值将不变更而仍是上次退出时的值,然而声明的没有标记上own的变量的值是未定义的。

语句[编辑]

ALGOL 60将语句分为三类:无条件语句、条件语句和for循环语句。由于成序列的语句,可以被组织成复合语句和块,语句的定义必需是递归的。

赋值语句担负将表达式的值,指派(assign)到一个或多个变量,或者在定义函数指定式的值的过程主体中指派到过程标识符;在作为指派目标的加下标变量中出现的任何下标表达式,先于得出所指派之值的表达式,而按从左至右顺序求值。

过程语句负担实施调用一个过程主体的执行。go to语句结合了无条件跳转和计算跳转二者,go to语句不能从块外跳转到块内的标签,但可以跳转进入复合语句。空无的虚设(dummy)语句不执行任何运算。

ALGOL 60介入了子句概念:if子句和for子句,即if <布尔表达式> thenfor <变量> := <for列表> do;并且算术表达式、布尔表达式和指定表达式中,可以有括号包围着的条件表达式,即(if ~ then ~ else ~)[if ~ then ~ else ~][28]

条件语句包括三种形式:if语句,即<if子句> <无条件语句><if语句> else <语句>形式;和<if子句> <for语句>形式。ALGOL 60在语法上避免了if ~ then if ~ then ~ else ~形式的package.lua第80行Lua错误:module 'Module:Ilh/data' not found歧义,它等价于if ~ then begin if ~ then ~ else ~ end,但仍然介入了if ~ then for ~ do if ~ then ~ else ~形式的悬摆else歧义[29]

过程[编辑]

在ALGOL 60中,过程声明担负定义过程标识符所关联的过程,其主要构成者是过程主体,它是一个语句或一段代码。过程主体总是表现得如同一个块,不管它是否有着块的形式;故而标记了在过程主体内语句或者主体自身的标签的作用域,永远不能延伸超出这个过程主体[30]

过程主体关联着一个头部,它规定了出现在过程主体内的代表形式参数的特定标识符。在过程的参数列表( … <参数分界符> … )中,有可选的“) <字母串>: (”样式的参数package.lua第80行Lua错误:module 'Module:Ilh/data' not found[31]过程参数传递有两种求值策略传名调用传值调用。在过程声明中,对传递数值的形式参数名字,必须提供前导value的规定(specification),形式参数缺省为传递名字。在过程主体是用ALGOL语言写的语句的情况下,过程语句执行它的效果,等价于在程序上进行下列操作的效果:

  • 声明为传值调用的形式参数,都要被赋值即指派上对应的实际参数的值,这些指派被认为是在进入过程主体之前显式进行的。其效果如同创建了包围着这个过程主体的一个额外的块,在其中所做的这些指派针对的是局部于这个拟制(fictitious)块的变量,它们具有在相应规定中给出的类型。作为结论,传值调用的变量,被认为package.lua第80行Lua错误:module 'Module:Ilh/data' not found于过程主体,但是局部于这个拟制块。
  • 声明为传递名字的形式参数,在整个过程主体内,要被替代为对应的实际参数,并且只要语法上可能就对这些实际参数包围上圆括号。在通过这个名字替代处理而插入的标识符,和已经存在于过程主体之内的其他标识符,二者之间的可能冲突,将凭借对涉及到的(这个过程主体的)形式标识符或局部标识符的适合的系统性变更来避免[32]
  • 最终经过上述修改后的过程主体,被插入到过程语句的位置上并被执行。如果调用这个过程的位置,处在这个过程主体的任何非局部量[33]作用域的外面,在通过这个过程主体替代处理而插入的标识符,和在这个过程语句或函数指定式所在位置上其声明有效的标识符,二者之间的可能冲突,将通过(在发起调用的这个层级上)对后者标识符的适合的系统性变更来避免[34]

对于定义函数指定式的值的过程声明,在其过程主体中,必须出现具有过程标识符在其左侧部份中的一个或多个赋值语句,其中至少有一个必须被执行;并且这个过程标识符所关联的类型,必须通过以类型声明符作为其过程声明的最先符号的样貌来声明。最后那个这样指派的值,被用来继续此函数指定式在其中出现的表达式的求值。在这个过程主体中,这个过程标识符的不在赋值语句左侧部份中的任何出现,指示了这个过程的激活(activation)。

两个传名形式参数,其对应的实际参数之间可能存在依赖关系,比如一个是整数变量i,而另一个是加下标变量A[i],从而导致后者形式参数也依赖于前者形式参数,利用传递名字和这种副作用可以实现package.lua第80行Lua错误:module 'Module:Ilh/data' not found[35];它典型的用于定义对应于<math>\ \textstyle\sum_{k=\ell}^u a_k \ </math>的级数过程Sum(k, l, u, ak),它有两个传名形式参数:索引变量k和通项(general)表达式ak

对于交换两个参数的值的swap(x, y)过程,其过程主体定义为:t:=x; x:=y; y:=t,这种依赖性副作用会导致可能出现异常行为,由于名字替代机制相当于展开(expansion),过程语句swap(i, A[i])中加下标变量A[i]的下标i未经求值,对应的过程主体就转换成为:t:=i; i:=A[i]; A[i]:=t。1964年package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found制定了《SUBSET ALGOL 60报告》,在这个子集语言中对“完全的名字概念”(full name-concept)增加了一项限制:在名字替代(传名调用)中,实际参数只能是一个标识符或字符串。

众所周知的传名调用实现采用了package.lua第80行Lua错误:module 'Module:Ilh/data' not found机制[lower-alpha 2]Donald Knuth设计了“男人抑或男孩测试”,来区分编译器是否正确的实现了“递归和非局部引用”,在这个测试中局部定义的函数将自身用作其所调用函数的传名实际参数。

例子[编辑]

下面是语言报告中过程声明的一个例子[lower-alpha 3]

procedure Absmax(a) Size:(n, m) Result:(y) Subscripts:(i, k);
    value n, m; array a; integer n, m, i, k; real y;
    comment 矩阵a,其大小为nm,其绝对值最大的元素
            被传送到y,并且这个元素的下标是ik;
begin
    integer p, q;
    y := 0; i := k := 1;
    for p := 1 step 1 until n do
        for q := 1 step 1 until m do
            if abs(a[p, q]) > y then
            begin
                y := abs(a[p, q]);
                i := p; k := q
            end
end Absmax

在1976年修改版语言报告的环境块中,定义了输入输出过程:incharoutcharlengthoutstringoutterminatorinintegeroutintegerinrealoutreal,下面以其中的outinteger作为演示例子:

procedure outinteger(channel, int);
    value channel, int;
    integer channel, int;
    comment 将表示int的值的那些字符
            加上尾随的终结符传递到channel;
begin
    procedure digits(int);
        value int; integer int;
    begin
        integer j;
        comment 使用递归从右至左求值数字 
                但从左至右打印它们;
        j := int ÷ 10;
        int := int - 10 × j;
        if j  0 then
            digits(j);
        outchar(channel, 0123456789, int + 1)
    end digits;
    if int < 0 then
    begin
        outchar(channel, -, 1);
        int := -int
    end;
    digits(int); outterminator(channel)
end outinteger

这里调用到的outchar(channel, str, int),将在字符串str中对应整数int的值的那个字符,传递到通道channeloutterminator(channel),用于输出在数值之后的终结符(即空格、换行或分号)。此外,package.lua第80行Lua错误:module 'Module:Ilh/data' not foundpackage.lua第80行Lua错误:module 'Module:Ilh/data' not found在1964年曾制定《ALGOL 60输入输出过程报告》,其中定义了insymboloutsymbollengthinrealoutrealinarrayoutarray,这里的多维数组採用了package.lua第80行Lua错误:module 'Module:Ilh/data' not found(Row major)次序[37]

参见[编辑]

页面Template:Div col/styles.css没有内容。

  • ALGOL
  • ALGOL 58
  • package.lua第80行Lua错误:module 'Module:Ilh/data' not found
  • ALGOL 68
  • ALGOL W
  • package.lua第80行Lua错误:module 'Module:Ilh/data' not found
  • package.lua第80行Lua错误:module 'Module:Ilh/data' not found
  • package.lua第80行Lua错误:module 'Module:Ilh/data' not found
  • package.lua第80行Lua错误:module 'Module:Ilh/data' not found
  • package.lua第80行Lua错误:module 'Module:Ilh/data' not found
  • ISWIM
  • JOVIAL
  • package.lua第80行Lua错误:module 'Module:Ilh/data' not found
  • Simula
  • package.lua第80行Lua错误:module 'Module:Ilh/data' not found
  • Scheme

注释与引用[编辑]

  1. 对一种编程语言的类型系统的强弱定性,存在着对强类型有多种有分歧的定义的问题,这里将ALGOL 60的类型强弱定性参照于普遍性的对C语言的弱类型定性,ALGOL 60有着隐式强制解过程化,例如男人抑或男孩测试
  2. thunk是一种早期有限类型的闭包。传递给thunk的环境是这个表达式的环境,而非所调用例程的环境。[36]
  3. 这里采用了1976年修改版语言报告中的代码,对原版进行的修改是增加了i := k := 1;,针对的是数组的全部元素都是0的特殊情况。
  1. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  2. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  3. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  4. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  5. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  6. The Encyclopedia of Computer Languages 互联网档案馆存檔,存档日期September 27, 2011,.
  7. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  8. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  9. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  10. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  11. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  12. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  13. Rechenautomaten mit Trommelspeicher页面存档备份,存于互联网档案馆), Förderverein der Technischen Sammlung Dresden
  14. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  15. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  16. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  17. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  18. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  19. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  20. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  21. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  22. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  23. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  24. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found“9.1.2. An array is a set of elements, called the components of the array, everyone of which behaves like a simple variable. The components of an array are distinguished by a set of p integers (subscripts)i1, i2, ……, ip, where p is called the dimension of the array. If we interpret the subscripts as coordinates in a p-dimensional space, then the entire array corresponds to the total of all unit-gridpoints in a p-dimensional hyperbox
        lk ≤ ik ≤ uk  (k = 1, 2, ……, p),
    whose boundaries (i.e. the array bounds l1, l2 ……, lp, u1, u2, ……, up) are given in the corresponding array declaration ……. ……
    14.3.2. A subscripted variable «I[E1, E2, ……, Ep]», if encountered in an expression, represents also a single value defined as follows: Evaluate the subscript expressions E1, E2, ……, Ep; if their values are i1, i2, ……, ip, then the subscripted variable represents the value that has most recently been assigned to the i1, i2, ……, ip-component of the array I.”
  25. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  26. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
    package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found“25.4.3.

     
    «

    begin
        switch wernik := ariea, aeryl, m17, larix;
        goto wernik[k];
    arica: ; comment this for k = 1 ;
        
        goto common;
    aeryl: ; comment this for k = 2 ;
        
        goto common;
    m17: ; comment this for k = 3 ;
        
        goto common;
    larix: ; comment this for k = 4 ;
        
    common: 
    end
    

    ».
     

    Here, by virtue of switch wernik, the computation follows one of four possible branches of the program depending on the current value of k. Afterwards the common course of the calculation (i.e. the statements which would follow «end») is taken up again.”

  27. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found“42.5.1. The operands of a block B are defined as those quantities existing outside the block which are involved in the execution of the block. Obviously the quantities global to B are operands of B provided they are actually used inside B. ……
    42.5.2. Hidden operands. A block may have hidden operands: Indeed, if a procedure P is operand of block B, …… the global parameters of P are also involved in the execution of B, hence operands of B. We call these hidden operands of B because they cannot be found by inspection of block B but only by inspection of the declaration for procedure P, which is given somewhere outside B. ……
    42.5.3. The operands of a block B fall into the following four categories:
    Arguments …… ⒝ Results …… ⒞ Transients: …… which have properties of both arguments and results …… ⒟ Exits: Labels referring to destinations located outside B and switches which are declared outside B. ……
    52.3.1. Considering a mathematical expression, e.g. an integral
        <math>I = \int_{0}^{1}f(x,y)\,\mathrm{d}x</math>
    it is seen that the variables x and y serve entirely different purposes: y is a variable upon which the value of I depends; in mathematical logic this is called a free variable (of the expression). This latter term indicates that one is free to substitute a value, e.g. 2.75, for y, where-upon one obtains the result
        <math>I = \int_{0}^{1}f(x, 2.75)\,\mathrm{d}x</math>
    The variable x, on the other hand, is only an auxiliary object for describing the operation to be performed by the expression. It is called a bound variable since it is not accessible from outside the expression. ……
    52.3.2. Comparing these examples with an ALGOL procedure and the terminology used ……, it becomes obvious that the free variables correspond to what are called the operands of a procedure, while the bound variables correspond to the internal quantities.”
  28. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
    19.7.1. «x + (if t > t1 then 1 else -1) / x».
    We recall that a conditional arithmetic expression cannot be used directly as a primary in a larger expression, but must for this purpose be enclosed in parentheses (the sequence «+ if» is always illegal).
    19.7.2. Selection of a component of an array with safeguards against exceeding the array bounds:
         «a[if k > n then n else if k < 1 then 1 else k]».
    19.7.3. Where conditional expressions are intended as comparands of a relation or as alternatives of a conditional expression, they must again be enclosed in parentheses:
         «if (if u then x else y) > 0 then (if z = 0 then x + y else x - y) else x × y».”
  29. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
    package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  30. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found“44.2. …… The operands of a procedure, i.e. the quantities involved in its execution, are essentially the operands of the fictitious block which - if S stands for the procedure body - is defined as the construction
        «begin real æ; S end»1, 2.
    ……
    1 The declaration of the fictitious variable æ serves solely to make this piece of program a block.
    2 In case S is already an unlabelled block, this artificial construction is unneeded and we could take S instead. ……”
  31. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  32. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found“45.2.3. Name conflicts. …… Indeed, without this rule, the effect of a call «x(z)» of a

     
    «

    procedure x(y);
        real y;
        begin real z; z := 2 × y; y := y / z end
    

    »
     

    would erroneously be interpreted as
      «begin real z; z := 2 × y; z := z / z end»,
    which certainly was not the intention of the designer of the procedure. With the above amendment, however, the internal z is changed into , after which we obtain the equivalence block correctly as
      «begin real zæ; zæ := 2 × z; z := z / zæ end».”

  33. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found“44.2. Operands of a procedure …… Indeed, execution of a procedure means essentially execution of this fictitious block, …… However, it is one of the most important properties of procedures that their operands - besides being distinguished as arguments, results, transients and exits - fall into three categories, namely
    ⒜ Those operands of the fictitious block whose identifiers are not quoted in the formal parameter part are called global operands of the procedure. …… ⒝…… formal operands ……⒞…… hidden operands ……
    44.3.1. A global parameter - that is, the identifier of a global operand - represents the same quantity inside the procedure body as outside in the environment of the procedure declaration. A global operand is therefore simply the extension of a quantity which exists outside the procedure. As a consequence we have
    44.3.2. The environment rule for global parameters:
    If the identifier I is global parameter of a procedure, then a (true or formal) quantity Q with that identifier must exist in the environment of the procedure declaration, and it is this Q which in a call of the procedure is meant by the identifier I.
    According to this rule, a global parameter acts like a thread which links the procedure declaration permanently to its environment; indeed, a procedure which has global parameters is only fully defined if it is embedded into an ALGOL program in which the global operands are properly declared.”
  34. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found“45.2.4. Suppressed global operands. …… Consider, for instance

     
    «

    begin
        integer t;
        procedure common(x); real x; t := x;
    z:  begin
            real t;
            common(t);
        end z
    end
    

    ».
     

    Here the integer type variable t is suppressed in block z, and therefore the actual parameter of the call «common(t)» refers to the real type variable which is local to block z. …… the t occurring as global parameter of procedure common refers to the suppressed quantity t. The above rule makes this evident by requiring that the name of the real type variable t be changed throughout block z into tee before the substitution rule is applied:

     
    «

    begin
        integer t;
        procedure common(x); real x; t := x;
    z:  begin
            real tæ;
            common(tæ);
        end z
    end
    

    ».
     

    Now the substitution rule yields the equivalent block for the call «common(t)» correctly as (æ denoting again the hypothetical variable necessary to make this piece of program a block)
      «begin real æ; t := tæ end».
    Accordingly, this call accomplishes something which would seem impossible, namely changing the value of a suppressed variable.
    45.2.5. ……Consequently no name changes apply where the identifier of a global operand not suppressed at the location of a procedure call coincides with the identifier of an actual operand.”

  35. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  36. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
    package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found
  37. package.lua第80行Lua错误:module 'Module:Citation/CS1/People' not found“49.3.2. For inarray and outarray the order in which the components of the array b are transferred is defined to be what for matrices (two-dimensional arrays) is usually called "row-wise". More precisely: b[i1, i2, ……, ip] is transferred before b[j1, j2, ……, jp] provided we have for some h ≤ p:
        il = jl for l = 1, 2, ……, h - 1, but ih < ih.
    Moreover, these procedures always transfer all components of the array appearing as the second actual operand.
    As a consequence, a call «outarray(15, p)», where p is declared e.g. as «array p[-4:5, 1:50, 0:20]», is equivalent to

     
    «

    for j1 := -4 step 1 until 5 do
        for j2 := 1 step 1 until 50 do
            for j3 := 0 step 1 until 20 do outreal(15, p[j1, j2, j3])
    

    ».”
     

外部链接[编辑]

package.lua第80行Lua错误:module 'Module:Authority control/config' not found

package.lua第80行Lua错误:module 'Module:Navbar/configuration' not found Template:ALGOL programming