پی‌ال/۰

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

حداقل دو زبان برنامه نویسی با نام 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 * x
END;
 
BEGIN
   x := 1;
   WHILE x <= 10 DO
   BEGIN
      CALL square;
      ! squ;
      x := x + 1
   END
END.

این برنامه مربعات اعداد 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
  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;
 
BEGIN
  x := m;
  y := n;
  CALL multiply;
  x := 25;
  y :=  3;
  CALL divide;
  x := 84;
  y := 36;
  CALL gcd
END.


Oberon-0[ویرایش]

آقای Wirth ، در سومین و آخرین ویرایش از کتاب خود در مورد ساخت و ساز کامپایلر، PL/0 را با Oberon-0 جایگزین کرده است.
کامپایلر هنوز هم در تمامیت خود ارائه شده است، اگرچه زبان Oberon-0 بسیار پیچیده تر از PL/0 است. برای مثال، Oberon-0 آرایه ها، رکوردها، اعلام نوع ها و پارامترهای تابع را پیشنهاد داد.
ناشر کتابهای آقای Wirth (ادیسون - وسلی) مصمم است که همه کتابهایش را خارج کند، اما آقای Wirth ویرایش سوم از کتاب خود را در سال 2005 تجدید چاپ کرده است و الان نیز آنلاین در دسترس است.

همچنین ببینید[ویرایش]

  • P-code machine
  • مشارکت‌کنندگان ویکی‌پدیا، «P-code machine»، ویکی‌پدیای انگلیسی، دانشنامهٔ آزاد.


منابع[ویرایش]

مشارکت‌کنندگان ویکی‌پدیا، «PL/0»، ویکی‌پدیای انگلیسی، دانشنامهٔ آزاد (بازیابی در ۶ ژوئن ۲۰۱۳).