پی‌ال/۰

حداقل دو زبان برنامه‌نویسی با نام PL/0 شناخته شده‌است. یکی از آن‌ها زیر مجموعه‌ای از آی بی ام برای اهداف عمومی است که زبان برنامه‌نویسی PL/1 نام دارد.

دیگری PL/0 است، که در این مقاله توضیح داده می‌شود. این مشابه اما بسیار ساده‌تر از برنامه‌نویسی همه منظوره زبان پاسکال است و در نظر گرفته شده به عنوان یک زبان برنامه‌نویسی آموزشی است. آن را به عنوان یک مثال از چگونگی ساخت یک کامپایلر بکار می‌برند. این در اصل در کتاب "الگوریتم + ساختمان داده = برنامه"، توسط آقای نیکلاوس ویرت در سال ۱۹۷۵ معرفی شد.

ویژگی‌های کاملاً محدود شده ساختار زبان: اعداد حقیقی وجود ندارند، عملیات محاسباتی اساسی خیلی کم و ساختارهای کنترلی غیر از if و while ندارد.

در حالیکه این محدودیت‌ها باعث می‌شود تا نوشتن برنامه‌های کاربردی واقعی در این زبان غیر عملی باشد. این کمک می‌کند تا کامپایلر جمع و جور و ساده باقی بماند.

گرامر

در زیر به عنوان مثال قواعد نحو مدل زبان که در BNF توسعه داده شده (EBNF) تعریف شده‌است می‌آید:


program = block ".".

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

statement = [ ident ":=" expression | "call" ident |
            "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 ")".

این خیلی ساده است برای دانشجویان که یک سری تجزیه‌کننده (parser) بازگشتی برای چنین نحو ساده‌ای بنویسند. بنابراین کامپایلر PL/0 هنوز به‌طور گسترده‌ای در دوره‌های ساخت و ساز کامپایلر در سرتاسر جهان استفاده می‌شود.

با توجه به نبود ویژگی‌ها در مشخصات اصلی، دانشجویان معمولاً بیشتر وقت خود را در گسترش زبان و کامپایلر خود می‌گذرانند. آن‌ها معمولاً با معرفی REPEAT...UNTIL شروع می‌کنند و ادامه می‌دهند با بیشتر ویژگی‌های پیشرفته مثل پارامترهای گذرنده به توابع یا داده ساختارهایی شبیه آرایه‌ها، رشته‌ها یا اعداد دارای ممیز شناور.

استفاده برای آموزش

مقاله اصلی در افتخارات کامپایلرهای PL/0 برای معرفی چندین مفهوم نفوذ (پالایش گام به گام، تجزیه نزولی بازگشتی، EBNF، P-code، T-diagrams ) در این زمینه توسط دانشجویانی که از این مفاهیم استفاده می‌کنند. در طول 3 دهه گذشته بیشتر دوره‌های دانشگاهی در مورد ساختارهای کامپایلرها که از PL/0 استفاده می‌کنند، توسط آقای Wirth به شدت در استفاده از این تکنیکها دنبال شده‌اند. چند سال پیش دوره‌های دانشگاهی اقدام کردند به منحرف کردن از دوره بنیان نهاده شده توسط آقای Wirth با جایگزینی تکنیکهای کلاسیک تجزیه نزولی بازگشتی با یک رویکرد شبه یونیکسی (Unix-like) از استفاده lex و yacc.
فقط اخیراً یک پیاده‌سازی (ابزارهای زبان PL/0) در طول این راه، نیز مفاهیم مدرن ترکیب شده‌ای مانند شی گرایی و طراحی الگوی با یک Scripting Language (مانند Python)، اجازه می دهد که دانشجویان تا متن سورسی از پیاده‌سازی را در یک سبک امروزی مصرف کنند و بکار برند.

ساختار کامپایلر

در دسامبر سال 1976 ، آقای Wirth یک کتابچه کوچک در مورد ساخت و ساز کامپایلر نوشت. که شامل کد سورس کامل از کامپایلر PL/0 است.
قواعد نحو بیان شده در بالا از اولین ویرایش کتاب Compilerbau آقای Wirth برگرفته شده‌است. او املا کلمات کلیدی مانند const را تغییر داد و تغییر توابع به حروف بزرگ تغییر املایی دیگر بود. در همان زمان دوست و همکار آقای Wirth، آقای CAR Hoare روی مفهوم پردازشهای ترتیبی کار می‌کرد که از علامت تعجب (!) و علامت سؤال (؟) برای مشخص کردن ارتباطات اولیه استفاده می شد. آقای Wirth هر دو علامت را به زبان PL/0 افزود، اما او معانی آن‌ها را در کتاب ذکر نکرد.

مثال

مثال زیر برگرفته شده از یک زبان توسعه داده شده به نام PL/0E است:
VAR x, squ;PROCEDURE square;BEGIN
   squ:= x * xEND;BEGIN
   x := 1;
   WHILE x <= 10 DO
   BEGIN
      CALL square;
      ! squ;
      x := x + 1
   ENDEND.
این برنامه مربعات اعداد 1 تا 10 را تولید می‌کند. امروزه اکثر روش‌ها در ساخت و ساز کامپایلرها، علامت تعجب ("!") را با تابع WriteLn جایگزین کرده‌اند.
مثال زیر برگرفته شده از ویرایش دوم کتاب Compilerbau آقای Wirth است، که در سال 1986 در آلمان نشان داده شده‌است.
CONST
  m =  7,
  n = 85;VAR
  x, y, z, q, r;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
  ENDEND;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
  ENDEND;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 := fEND;BEGIN
  x := m;
  y := n;
  CALL multiply;
  x := 25;
  y :=  3;
  CALL divide;
  x := 84;
  y := 36;
  CALL gcdEND.

Oberon-0

آقای Wirth ، در سومین و آخرین ویرایش از کتاب خود در مورد ساخت و ساز کامپایلر، PL/0 را با Oberon-0 جایگزین کرده‌است.

کامپایلر هنوز هم در تمامیت خود ارائه شده است، اگرچه زبان Oberon-0 بسیار پیچیده تر از PL/0 است. برای مثال، Oberon-0 آرایه ها، رکوردها، اعلام نوع‌ها و پارامترهای تابع را پیشنهاد داد.

ناشر کتابهای آقای Wirth (ادیسون - وسلی) مصمم است که همه کتابهایش را خارج کند، اما آقای Wirth ویرایش سوم از کتاب خود را در سال 2005 تجدید چاپ کرده‌است و الان نیز آنلاین در دسترس است.