زبان برنامه‌نویسی لوگو

از ویکی‌پدیا، دانشنامهٔ آزاد

پرش به: ناوبری, جستجو

لوگو يک زبان برنامه نويسي براي برنامه‌نویسی تابعی است. اين زبان نسخه‌اي از زبان ليسپ است که برخي آن را ليسپ بدون پرانتز مي‌نامند. امروزه اين زبان با لاک‌پشت گرافيکش شناخته مي‌شود، اما لوگو قابليت‌هاي خوبي نظير کار با ليست‌، فايل، ورودي/خروجي و حلقه‌ها دارد. لوگو در سال 1967 با اهداف آموزشي خصوصا آموزش سازنده‌گرا طراحي شد. طراحان اين زبان دانيل بابرو، والاس فرزيگ و سيمور پپرت هستند.

فهرست مندرجات

[ویرایش] تاریخچه

اواسط دهه ۱۹۶۰ میلادی سیمور پپرت به همراه ماروین مینسکی آزمایشگاه هوش مصنوعی دانشگاه ام‌آی‌تی را راه‌اندازی کرد. پپرت با گروهی از شرکت بولت، برنک و نیومن (BBN) که توسط والاس فرزیگ رهبری می‌شد همکاری کرد و در سال ۱۹۶۷ اولین نسخه زبان لوگو به وجود آمد. در چهار سال اول، آموزش و تحقیقات روی این زبان در شرکت BBN انجام شد. اولین پیاده‌سازی این زبان که گوست نامیده می‌شود به‌وسیله لیسپ نوشته شد. هدف گوست آموزش حل مسئله بود و کودکان می‌توانستند در یک محیط ریاضیاتی کار با کلمات و جمله‌ها را یاد بگیرند. لاک‌پشت ویرایشگر بازخورد سریعی می‌داد تا اشکالات برنامه مشخص شود. در حال حاضر لوگو تفاوت چندانی با ایده‌های اولیه قبل از اولین لاک‌پشت ندارد. در اوایل طراحی این زبان یک روبوت به شکل لاک‌پشت با توجه به دستورات نوشته شده در کامپیوتر روی زمین حرکت می‌کرد. اولین روبوت لاک‌پشت در سال ۱۹۶۹ در ام‌آی‌تی به‌وجود آمد. این روبوت که ایروینگ نام داشت دارای حسگرهای لمسی بوده و می‌توانست به عقب، جلو، راست و چپ حرکت کرده و یا زنگ خود را به صدا درآورد. بعدها روبوت لاک‌پشت حذف و به نمایشگر کامپیوتر منتقل شده و با دستوراتی شکل و طرح‌هایی را رسم می‌کرد.

[ویرایش] طراحی

مشهورترين خصوصيت لوگو نشانه‌گر به شکل لاک‌پشت آن است که مي‌توان دستور حرکت و يا کشيدن شکل به آن داد و با توجه به برنامه خطوط گرافيکي رسم می‌کند. اين نشانه‌گر معمولا به شکل يک لاک‌پشت يا يک مثلث نشان داده مي‌شود. لاک‌پشت گرافيکي در اواخر دهه 1960 ميلادي توسط سيمور پپرت به لوگو اضافه شد تا نسخه داراي روبوت لاک‌پشت را پشتيباني کند. اين روبوت لاک‌پشت يک روبوت ساده بود که از ايستگاه کاري کاربر کنترل مي‌شد و دستوراتي براي رسم اشکال به روبوت که داراي يک قلم درون خود يا چسبيده به آن بود مي‌داد.

استفاده از هندسه لاک‌پشت به جاي یک مدل مرسوم‌تر، حرکت منطقي روبوت لاک‌پشت را تقليد مي‌کند. هندسه لاک‌پشت با (x,y) اي که در هندسه کارتزين استفاده مي‌شود، تفاوت دارد و بيشتر در يک فضاي اقليدسي کار مي‌کند (با استفاده از اندازه‌ها و زواياي نسبي و بدون مبدا و متفاوت از سيستم‌هاي با دستگاه مختصات). لاک‌پشت با دستوراتي نسبت به مکان فعلي‌ خودش حرکت مي‌کند. LEFT 90 به اين معناست که 90 درجه به سمت چپ بچرخ. يک دانش‌آموز با فرض اينکه اگر جاي لاک‌پشت باشد بايد چه حرکتي انجام دهد، مي‌تواند حرکت لاک‌پشت را بفهمد (پيش‌بيني و درباره آن استدلال کند). پپرت اين موضوع را استدلال سازگار با محيط ناميد. بعضي از پياده‌‌سازي‌‌هاي لوگو، به خصوص آنهايي که اجازه وجود چند لاک‌پشت را مي‌دهند، رديابي برخورد (collision detection) را پشتيباني کرده و اجازه مي‌دهند کاربر نمايش نشانه‌گر لاک‌پشت را دوباره تعريف کند.

لوگو معمولا به عنوان زباني مفسري شناخته مي‌شود، با اين‌ حال اخيرا برخي نسخه‌هاي کامپايلي لوگو مانند Lhogho و Liogo نيز ساخته شده است. لوگو حساس به بزرگ يا کوچک بودن حروف نيست ولي حالت را براي فرمت کردن نگه مي‌دارد. لوگو مصالحه‌اي بين زبان برنامه‌نويسي ترتيبي با ساختار بلوکي و زبان‌ برنامه‌نويسي تابعي است. لوگوي استانداردي وجود ندارد، اما UCBLogo به‌شدت مورد توجه است. اين زبان براي آموزش برنامه‌نويسي به کار مي‌رود، اما به خاطر امکانات خوب کار با ليست‌ها زبان بسيار خوبي براي ايجاد scriptهاي مفيد است.

[ویرایش] داده

سه نوع تايپ داده در UCBLogo وجود دارد:

  • کلمه (word)
  • ليست (list)
  • آرايه (array)

اعداد حالت خاصي از کلمه هستند.

تايپ‌دهي صريح وجود ندارد و مفسر نوع داده را از متن برنامه به‌دست مي‌آورد.

دو نماد مهم وجود دارد:

  • علامت دونقطه که نشان‌دهنده محتوا است.

اين نماد براي آموزش اين مفهوم که هر متغير مکاني در حافظه دارد بسيار مفيد است.

  • گيومه: به اين معنا که "اين عبارت به همين شکل ارزيابي مي‌شود" يا "ارزش اين عبارت بعد از ارزيابي همان ارزش قبل از ارزيابي است".

يک عدد حالت خاص ارزيابي خود است. 2 همان "2 است.

انتساب به متغيرها (مثلا x := y + 3) در لوگو با دستور make انجام مي‌شود:

   make "x sum :y 3

و يا:

   make "x sum :y "3

دستور make دو ورودي مي‌گيرد که در اينجا ورودي دوم sum :y "3 است. sum يک عملگر است و دو پارامتر مي‌گيرد. "3 به 3 ارزيابي شده و :y محتويات خانه با نام y را برمي‌گرداند. اين دو مقدار با يکديگر جمع شده و يک مقدار جديد را مي‌‌دهند.

دستور make نتيجه را در ورودي اول قرار مي‌دهد. از ديدگاه برنامه‌نويسي پارامتر اول make از نوع انتقال آدرس (pass by reference) و پارامتر دوم از نوع انتقال مقدار (pass by value) است.

[ویرایش] حوزه

لزومي به تعريف متغيرها قبل از استفاده از آنها وجود ندارد، در نتيجه حوزه تعريف آنها سراسري (global) است.

يک متغير مي‌تواند به صورت محلي تعريف شود، بنابراين حوزه تعريف آن محدود به همان رويه و رويه‌هايي که فراخواني مي‌کند است (حوزه پويا). فراخواني يک رويه با ورودي‌هايش متغيرهاي محلي ايجاد مي‌کند که مقادير آرگومان‌ها را نگه مي‌دارند.

[ویرایش] لیست

لوگو ليست را از ليسپ گرفته است و ليست‌ها روش اوليه ذخيره‌سازي بردارهاست.

آرايه‌ نيز در اين زبان پشتيباني شده است:

  • عملگرهايي براي تبديل کلمه‌ها به ليست و ليست به آرايه و برعکس وجود دارد.
  • اين نوع داده مزيتي نسبت به آرايه دارد که قابلیت گسترش نامحدود آن است. داده توسط عملگرهاي first، butfirst، last، butlast، butmember، member و item استخراج مي‌شود. هم‌چنين داده توسط fput و iput اضافه مي‌شود.
  • يک ليست مي‌تواند مانند يک صف فرض شده و از عملگرهاي queue و dequeue استفاده کند و يا مانند يک پشته از عملگرهاي push و pop استفاده کند.

[ویرایش] دستورات ساختار کنترلی

لوگو ساختارهاي کنترلي مختلفي دارد:

  • ifelse test [ do_if_true list ] [do_if_false list]

دستورهاي تکرار لوگو عبارتند از:

  • while condition [instruction list]
  • until condition [instruction list ]
  • repeat number [instruction list]


[ویرایش] الگوی تکرار

لوگو تعدادي ساختار کنترلي مخصوص ليست دارد. ايده اصلي از دو ليست است:

   OPERATION [ a list of commands ] [ many data items ]

هر يک از دستورات به ترتيب روي هر يک از data item ها اجرا مي‌شود. الگوهاي دستور مختلفي با نامهاي MAP، APPLY، FILTER،FOREACH ، REDUCE و CASCADE وجود دارد.

[ویرایش] لیست های خصوصیت

يک ليست خصوصيت ليستي است که در آن آيتم‌هاي با شماره فرد نشان‌دهنده اسم خصوصيت و آيتم‌هاي با شماره زوج نشان‌دهنده مقدار خصوصيت است. سه دستور براي پردازش ليست‌هاي خصوصيت وجود دارد:

   pprop :listname :name :value ;to add a new pair to the list
   remprop :listname :name :value ;to remove a pair to the list
   show gprop :listname :name  ;to get the matching value from the list


[ویرایش] ورودی-خروجی

متن توسط دستور print روي جريان خروجي (صفحه دستور) و با دستور label روي صفحه گرافيکي نمايش داده مي‌شود. دستورهاي استاندارد readlist readword readchar هستند که جريان ورودي آنها صفحه کليد است. در سيستمهاي Unix جريان ورودي مي‌تواند به يک فايل درون ديسک تغيير کند. به صورت مشابه جريان خروجي نيز مي‌تواند عوض شود.

[ویرایش] نحو

دستورات مي‌توانند در يک يا چندين خط نوشته شوند. دستورات زيادي نمادهاي نمايش کوتاهتري دارند، مثلا دستورات FORWARD و RIGHT مي‌توانند به صورت FD و RT نوشته شوند. اين کار دشواري ورودي را کم مي‌کند. از هر نوشته‌اي بعد از علامت نقطه-ويرگول ؛ صرف‌نظر شده و به کاربر اين امکان داده مي‌شود که توضيحاتي براي برنامه بنويسد.

   FORWARD 100 ; draws a square with sides 100 units long
   LEFT 90
   FORWARD 100
   LEFT 90
   FORWARD 100
   LEFT 90
   FORWARD 100
   LEFT 90
   FD 100 RT 120 FD 100 RT 120 ; draws a triangle
   FD 100 RT 120

يک برنامه Hello World در لوگو به اين صورت است:

   print [Hello World]


[ویرایش] حلقه‌ها

سه دستور تکرار (حلقه) در لوگو وجود دارد، يکي از آنها repeat است. دستور زير يک مربع رسم مي‌کند:

   REPEAT 4 [FD 100 LEFT 90]

دستور FD 100 LEFT 90 چهار بار تکرار مي‌شود. تقريبي از يک دايره مي‌تواند با يک حلقه 360 بار چرخش و گام به جلو رسم شود: REPEAT 360 [FD 1 RIGHT 1] . امکان نوشتن حلقه‌هاي تودرتو نتايج خوبي را با زحمت کم به ما مي‌دهد:

   REPEAT 36[ RT 10 REPEAT 360 [FD 1 RT 1]]
   FD 25
   RT 90


[ویرایش] توابع و زيربرنامه‌‌ها

هر خط از يک برنامه از فراخواني توابع و يا در اصطلاح برنامه‌نويسي زيربرنامه‌هايي تشکيل شده است. دو نوع زيربرنامه‌ وجود دارند:

  • دستوراتي که اجرا مي‌شوند ولي نتيجه‌اي به عنوان خروجي ندارند، مانند print
  • اعمالي که مقداري را به عنوان خروجي برمي‌گردانند، مانند first ، sum و readlist

يک دستور مانند يک رويه در زبان پاسکال است. مجموعه‌اي از دستورات به نام گزاره‌ها که بعد از اجرا کلمه true يا false را برمي‌گردانند با حرف p تمام مي‌شوند. مثالهاي آن wordp ، emptyp و listp است.

  • عبارات مي‌توانند اوليه بوده و يا توسط کاربر تعريف شوند.
  • عبارات مي‌توانند صفر، يک و يا تعداد بيشتري پارامتر ورودي داشته باشند.

رويه‌ها مي‌توانند با جفت TO END تعريف شوند:

   TO CHAIR  REPEAT 4 [FD 100 RT 90]  FD 200  END

لوگو مي‌تواند با دستور EDALL يک ويرايشگر را فراخواني کند. در ويرايشگر دستورات يک رويه مي‌توانند در خطوط مختلفي نوشته شوند.

   EDALL
    
   TO CHAIR
   REPEAT 4 [FD 100 RT 90]  FD 200
   END

کلمه جديد وارد لغات قابل استفاده مي‌شود ولي تعريف آن با تمام شدن session از بين مي‌رود. هر بار کلمه CHAIR استفاده شود دنباله REPEAT 4 [FD 100 RT 90] FD 200 اجرا مي‌شود. کلمه CHAIR بعد از اين مي‌تواند به‌عنوان يک دستور اجرا شود. مثلا REPEAT 4 [CHAIR] عمل CHAIR را 4 بار تکرار مي‌کند. عبارات رياضي در لوگو از نمايش پيشوندي مانند sum :x :y، product :x :y، difference :x :y و quotient :x :y استفاده مي‌کنند. نمايش ميانوندي نيز موجود است. لوگو اجازه فراخواني بازگشتي توابع را نيز مي‌دهد:

   to spiral :size
      if  :size > 30 [stop] ; an exit condition
      fd :size rt 15        ; many lines of action
      spiral :size *1.02    ; the tailend recursive call
   end


[ویرایش] تاثیرات

لوگو تاثیر زیادی روی زبان برنامه نویسی اسمال‌تاک داشت. این زبان هم چنین تاثیر اولیه زبان و محیط آموزش برنامه نویسی Etoys است.

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

دانشنامه آزاد انگلیسی [۱]

صفحه اصلی زبان لوگو [۲]

[۳]