Jump to content

ПЛ/0

PL/0 — это язык программирования , предназначенный для обучения , он похож на Паскаль , язык программирования общего назначения , но намного проще его . Он служит примером того, как построить компилятор . Первоначально он был представлен в книге «Алгоритмы + структуры данных = программы » Никлауса Вирта в 1976 году. Он имеет довольно ограниченные языковые конструкции: нет действительных чисел, очень мало основных арифметических операций и никаких конструкций потока управления, кроме «если». и блоки «пока». Хотя эти ограничения делают написание реальных приложений на этом языке непрактичным, они помогают компилятору оставаться компактным и простым.

Все используемые константы и переменные должны быть объявлены явно.

Единственными типами данных являются целые числа . Единственными операторами являются арифметические операторы и операторы сравнения. Существует odd функция, которая проверяет, является ли аргумент нечетным.

В исходной реализации, представленной Виртом, нет процедур ввода и вывода . Компилятор печатает новое значение каждой переменной по мере его изменения. Итак программа:

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

дает вывод:

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

Однако большинство реализаций имеют подпрограммы с одним входом и одним выходом.

управления потоком Структуры if-then и while-do конструкции и определяемые пользователем процедуры . Процедуры не могут принимать параметры.

Грамматика

[ редактировать ]

Ниже приведены правила синтаксиса модельного языка, определенного в 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 ")";

Студентам довольно легко написать анализатор рекурсивного спуска для такого простого синтаксиса. Поэтому компилятор PL/0 до сих пор широко используется в курсах по построению компиляторов во всем мире. Из-за отсутствия функций в исходной спецификации студенты обычно тратят большую часть своего времени на расширение языка и его компилятора. Обычно они начинаются с ознакомления. REPEAT .. UNTIL и продолжите использовать более продвинутые функции, такие как передача параметров в процедуры или структуры данных, такие как массивы, строки или числа с плавающей запятой.

Использование в образовании

[ редактировать ]

Основная статья о компиляторах посвящена PL/0. [ нужна ссылка ] за внедрение в эту область нескольких влиятельных концепций (пошаговое уточнение, анализ рекурсивного спуска, EBNF, P-код, T-диаграммы) путем обучения студентов использованию этих концепций. За последние три десятилетия большинство университетских курсов по построению компиляторов, в которых использовался PL/0, строго следовали Вирту при использовании этих методов (см. ссылки ниже). Несколько лет назад университетские курсы отклонились от курса, установленного Виртом, с заменой классической техники синтаксического анализа рекурсивного спуска на (тем не менее классический) Unix-подобный подход с использованием lex и yacc . Лишь недавно реализация ( PL/0 Language Tools ) по этому пути также объединила современные концепции, такие как объектно-ориентированная ориентация и шаблоны проектирования, с современным языком сценариев ( Python ), что позволяет студентам использовать исходный текст реализации в современном стиле программирования. .

Конструкция компилятора

[ редактировать ]

В декабре 1976 года Вирт написал небольшую брошюру о конструкции компилятора, содержащую полный исходный код компилятора PL/0. Приведенные выше правила синтаксиса были взяты из первого издания книги Вирта Compilerbau . [1] В более поздних изданиях этой книги (под влиянием своих продолжающихся исследований) Вирт изменил синтаксис PL/0. Он изменил написание ключевых слов, например const и procedure в верхний регистр. Это изменение сделало PL/0 более похожим на Модулу-2 . В то же время друг и соратник Вирта К. Р. Хоар работал над своей влиятельной концепцией последовательных процессов связи , в которой использовался восклицательный знак ! и знак вопроса ? для обозначения примитивов связи. Вирт добавил оба символа в язык PL/0, но не упомянул в книге их семантику.

Эта программа [2] выводит квадраты чисел от 1 до 10. Сегодня в большинстве курсов по созданию компиляторов восклицательный знак заменен на WriteLn процедура.

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.

Следующая программа печатает простые числа от 1 до 100. Оператор записи соответствует '!' оператор в синтаксисе EBNF выше.

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
.

Следующий пример был взят из второго издания книги Вирта Compilerbau: [1] который появился в 1986 году в Германии.

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.

В третьем и последнем издании своей книги по созданию компиляторов Вирт заменил PL/0 на Оберон-0 . Язык Оберон-0 намного сложнее, чем PL/0. Например, Оберон-0 предлагает массивы, записи, объявления типов и параметры процедур. Издатель книг Вирта (Аддисон-Уэсли) решил прекратить выпуск всех его книг, но Вирт опубликовал исправленные издания своей книги, начиная с 2004 года. [3] По состоянию на август 2017 г. , самая последняя доступная версия датируется маем 2017 года. [4] [5]

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Jump up to: а б Вирт, 1986 г.
  2. ^ PL/0. Архивировано 21 февраля 2012 г. в Wayback Machine.
  3. ^ Пересмотренное третье издание. Архивировано 17 февраля 2017 г. в Wayback Machine (2005) компании Compiler Construction , Никлаус Вирт, 1996 г., ISBN   0-201-40353-6 никогда не публиковался в типографии, но доступен в Интернете.
  4. ^ Вирт, Никлаус (28 мая 2017 г.). «Строительство компилятора» . Проверено 25 августа 2017 г.
  5. ^ Вирт, Никлаус (18 августа 2017 г.). "news.txt" . Архивировано из оригинала 25 августа 2017 г. Проверено 25 августа 2017 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: ab3e93a84a392104ed002978ab8218f6__1715123280
URL1:https://arc.ask3.ru/arc/aa/ab/f6/ab3e93a84a392104ed002978ab8218f6.html
Заголовок, (Title) документа по адресу, URL1:
PL/0 - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)