Please provide the PL/0 content you want me to translate to Chinese. I need the text to be able to translate it.
PL/0

原始链接: https://en.wikipedia.org/wiki/PL/0

PL/0 是一种由尼克劳斯·维尔特设计的、故意简单的编程语言,作为教学编译器构造的工具。它于 1976 年在他的著作《算法 + 数据结构 = 程序》中首次介绍,是 Pascal 的简化前身,缺乏像实数和复杂控制流这样的特性,而是专注于基本的整数运算和 `if`/`while` 语句。 它的简单性使其成为学生构建编译器的理想选择,通常使用递归下降解析。虽然不适用于实际应用,但 PL/0 的设计鼓励将其扩展为具有数组和参数传递等特性,作为学习练习。 维尔特最初的实现具有有限的输入/输出,但大多数版本现在都包含基本例程。在几十年里,PL/0 一直是编译器课程的核心,介绍了像 EBNF 符号和 P 代码这样的关键概念。最近,现代实现已经结合了面向对象原则和 Python 等脚本语言。 维尔特最终用更复杂的 Oberon-0 替换了 PL/0,并在他教科书的后续版本中使用。

黑客新闻 新的 | 过去的 | 评论 | 提问 | 展示 | 工作 | 提交 登录 PL/0 (wikipedia.org) 12 分,由 tosh 发表于 2 小时前 | 隐藏 | 过去的 | 收藏 | 3 条评论 帮助 verbatim 29 分钟前 | 下一个 [–] 有趣。文章说“编译器在变量改变时打印其值”——这肯定是指程序,而不是编译器吧?回复 monocasa 13 分钟前 | 父级 | 下一个 [–] 我认为这意味着编译器在变量修改时插入变量打印代码。回复 js8 18 分钟前 | 上一个 [–] 与 PL/I 有关系吗?回复 指南 | 常见问题 | 列表 | API | 安全 | 法律 | 申请 YC | 联系 搜索:
相关文章

原文

Programming language

PL/0 is a programming language, intended as an educational programming language, that is similar to but much simpler than Pascal, a general-purpose programming language. It serves as an example of how to construct a compiler. It was originally introduced in the book, Algorithms + Data Structures = Programs, by Niklaus Wirth in 1976. It features quite limited language constructs: there are no real numbers, very few basic arithmetic operations and no control-flow constructs other than "if" and "while" blocks. While these limitations make writing real applications in this language impractical, it helps the compiler remain compact and simple.

All constants and variables used must be declared explicitly.

The only data types are integers. The only operators are arithmetic and comparison operators. There is an odd function that tests whether the argument is odd.

In the original implementation presented by Wirth, there are no input and output routines. The compiler prints the value as a given variable changes. So the program:

var i, s;
begin
  i := 0; s := 0;
  while i < 5 do
  begin
    i := i + 1;
    s := s + i * i
  end
end.

gives the output:

          0
          0
          1
          1
          2
          5
          3
         14
          4
         30
          5
         55

However, most implementations have single input and single output routines.

Flow control structures are if-then and while-do constructs and user-defined procedures. Procedures cannot accept parameters.

The following is the syntax rules of the model language defined in EBNF:

program = block "." ;

block = [ "const" ident "=" number {"," ident "=" number} ";"]
        [ "var" ident {"," ident} ";"]
        { "procedure" ident ";" block ";" } statement ;

statement = [ ident ":=" expression | "call" ident 
              | "?" ident | "!" expression 
              | "begin" statement {";" statement } "end" 
              | "if" condition "then" statement 
              | "while" condition "do" statement ];

condition = "odd" expression |
            expression ("="|"#"|"<"|"<="|">"|">=") expression ;

expression = [ "+"|"-"] term { ("+"|"-") term};

term = factor {("*"|"/") factor};

factor = ident | number | "(" expression ")";

It is rather easy for students to write a recursive descent parser for such a simple syntax. Therefore, the PL/0 compiler is still widely used in courses on compiler construction throughout the world. Due to the lack of features in the original specification, students usually spend most of their time with extending the language and their compiler. They usually start with introducing REPEAT .. UNTIL and continue with more advanced features like parameter passing to procedures or data structures like arrays, strings or floating point numbers.

The main article on compilers honours PL/0[citation needed] for introducing several influential concepts (stepwise refinement, recursive descent parsing, EBNF, P-code, T-diagrams) to the field by educating students to use these concepts. Over the last 3 decades, most university courses on compiler construction that used PL/0 have followed Wirth strictly in employing these techniques (see references below). Some years ago university courses deviated from the course set by Wirth with the replacement of the classical recursive descent parsing technique by a (nonetheless classical) Unix-like approach of employing lex and yacc. Only recently an implementation (PL/0 Language Tools) along this way has also combined modern concepts like object-orientation and design patterns with a modern scripting language (Python), allowing students to consume the source text of the implementation in a contemporary programming style.

Compiler construction

[edit]

In December 1976, Wirth wrote a small booklet about compiler construction, containing the full source code of the PL/0 compiler. The syntax rules above were taken from this first edition of Wirth's book Compilerbau.[1] In later editions of this book (under the influence of his ongoing research) Wirth changed the syntax of PL/0. He changed the spelling of keywords like const and procedure to uppercase. This change made PL/0 resemble Modula-2 more closely. At the same time, Wirth's friend and collaborator C. A. R. Hoare was working on his influential communicating sequential processes concept, which used the exclamation mark ! and the question mark ? to denote communication primitives. Wirth added both symbols to the PL/0 language, but he did not mention their semantics in the book.

This program[2] outputs the squares of numbers from 1 to 10. Most courses in compiler construction today have replaced the exclamation mark with the WriteLn procedure.

VAR x, squ;

PROCEDURE square;
BEGIN
   squ:= x * x
END;

BEGIN
   x := 1;
   WHILE x <= 10 DO
   BEGIN
      CALL square;
      ! squ;
      x := x + 1
   END
END.

This following program prints the prime numbers from 1 to 100. The write statement corresponds to '!' statement in the EBNF syntax above.

const max = 100;
var arg, ret;

procedure isprime;
var i;
begin
	ret := 1;
	i := 2;
	while i < arg do
	begin
		if arg / i * i = arg then
		begin
			ret := 0;
			i := arg
		end;
		i := i + 1
	end
end;

procedure primes;
begin
	arg := 2;
	while arg < max do
	begin
		call isprime;
		if ret = 1 then write arg;
		arg := arg + 1
	end
end;

call primes
.

The following example was taken from the second edition of Wirth's book Compilerbau,[1] which appeared in 1986 in Germany.

VAR x, y, z, q, r, n, f;

PROCEDURE multiply;
VAR a, b;
BEGIN
  a := x;
  b := y;
  z := 0;
  WHILE b > 0 DO
  BEGIN
    IF ODD b THEN z := z + a;
    a := 2 * a;
    b := b / 2
  END
END;

PROCEDURE divide;
VAR w;
BEGIN
  r := x;
  q := 0;
  w := y;
  WHILE w <= r DO w := 2 * w;
  WHILE w > y DO
  BEGIN
    q := 2 * q;
    w := w / 2;
    IF w <= r THEN
    BEGIN
      r := r - w;
      q := q + 1
    END
  END
END;

PROCEDURE gcd;
VAR f, g;
BEGIN
  f := x;
  g := y;
  WHILE f # g DO
  BEGIN
    IF f < g THEN g := g - f;
    IF g < f THEN f := f - g
  END;
  z := f
END;

PROCEDURE fact;
BEGIN
  IF n > 1 THEN
  BEGIN
    f := n * f;
    n := n - 1;
    CALL fact
  END
END;

BEGIN
  ?x; ?y; CALL multiply; !z;
  ?x; ?y; CALL divide; !q; !r;
  ?x; ?y; CALL gcd; !z;
  ?n; f := 1; CALL fact; !f
END.

In the third and last edition of his book on compiler construction, Wirth replaced PL/0 with Oberon-0. The language Oberon-0 is much more complex than PL/0. For example, Oberon-0 offers arrays, records, type declarations and procedure parameters. The publisher of Wirth's books (Addison-Wesley) has decided to phase out all his books, but Wirth has published revised editions of his book beginning in 2004.[3] As of August 2017[update], the most recent revision available is from May 2017.[4][5]

联系我们 contact @ memedata.com