زبان برنامهنویسی لوگو
لوگو یک زبان برنامه نویسی برای برنامهنویسی تابعی است. این زبان نسخهای از زبان لیسپ است که برخی آن را لیسپ بدون پرانتز مینامند. امروزه این زبان با لاکپشت گرافیکش شناخته میشود، اما لوگو قابلیتهای خوبی نظیر کار با لیست، فایل، ورودی/خروجی و حلقهها دارد. لوگو در سال ۱۹۶۷ با اهداف آموزشی خصوصا آموزش سازندهگرا طراحی شد. طراحان این زبان دانیل بابرو، والاس فرزیگ و سیمور پپرت هستند.
محتویات |
[ویرایش] تاریخچه
اواسط دهه ۱۹۶۰ میلادی سیمور پپرت به همراه ماروین مینسکی آزمایشگاه هوش مصنوعی دانشگاه امآیتی را راهاندازی کرد. پپرت با گروهی از شرکت بولت، برنک و نیومن (BBN) که توسط والاس فرزیگ رهبری میشد همکاری کرد و در سال ۱۹۶۷ اولین نسخه زبان لوگو به وجود آمد. در چهار سال اول، آموزش و تحقیقات روی این زبان در شرکت BBN انجام شد. اولین پیادهسازی این زبان که گوست نامیده میشود بهوسیله لیسپ نوشته شد. هدف گوست آموزش حل مسئله بود و کودکان میتوانستند در یک محیط ریاضیاتی کار با کلمات و جملهها را یاد بگیرند. لاکپشت ویرایشگر بازخورد سریعی میداد تا اشکالات برنامه مشخص شود. در حال حاضر لوگو تفاوت چندانی با ایدههای اولیه قبل از اولین لاکپشت ندارد. در اوایل طراحی این زبان یک روبوت به شکل لاکپشت با توجه به دستورات نوشته شده در کامپیوتر روی زمین حرکت میکرد. اولین روبوت لاکپشت در سال ۱۹۶۹ در امآیتی بهوجود آمد. این روبوت که ایروینگ نام داشت دارای حسگرهای لمسی بوده و میتوانست به عقب، جلو، راست و چپ حرکت کرده و یا زنگ خود را به صدا درآورد. بعدها روبوت لاکپشت حذف و به نمایشگر کامپیوتر منتقل شده و با دستوراتی شکل و طرحهایی را رسم میکرد.
[ویرایش] طراحی
مشهورترین خصوصیت لوگو نشانهگر به شکل لاکپشت آن است که میتوان دستور حرکت و یا کشیدن شکل به آن داد و با توجه به برنامه خطوط گرافیکی رسم میکند. این نشانهگر معمولاً به شکل یک لاکپشت یا یک مثلث نشان داده میشود. لاکپشت گرافیکی در اواخر دهه ۱۹۶۰ میلادی توسط سیمور پپرت به لوگو اضافه شد تا نسخه دارای روبوت لاکپشت را پشتیبانی کند. این روبوت لاکپشت یک روبوت ساده بود که از ایستگاه کاری کاربر کنترل میشد و دستوراتی برای رسم اشکال به روبوت که دارای یک قلم درون خود یا چسبیده به آن بود میداد.
استفاده از هندسه لاکپشت به جای یک مدل مرسومتر، حرکت منطقی روبوت لاکپشت را تقلید میکند. هندسه لاکپشت با (x,y) ای که در هندسه کارتزین استفاده میشود، تفاوت دارد و بیشتر در یک فضای اقلیدسی کار میکند (با استفاده از اندازهها و زوایای نسبی و بدون مبدا و متفاوت از سیستمهای با دستگاه مختصات). لاکپشت با دستوراتی نسبت به مکان فعلی خودش حرکت میکند. LEFT ۹۰ به این معناست که ۹۰ درجه به سمت چپ بچرخ. یک دانشآموز با فرض اینکه اگر جای لاکپشت باشد باید چه حرکتی انجام دهد، میتواند حرکت لاکپشت را بفهمد (پیشبینی و درباره آن استدلال کند). پپرت این موضوع را استدلال سازگار با محیط نامید. بعضی از پیادهسازیهای لوگو، به خصوص آنهایی که اجازه وجود چند لاکپشت را میدهند، ردیابی برخورد (collision detection) را پشتیبانی کرده و اجازه میدهند کاربر نمایش نشانهگر لاکپشت را دوباره تعریف کند.
لوگو معمولاً به عنوان زبانی مفسری شناخته میشود، با این حال اخیرا برخی نسخههای کامپایلی لوگو مانند Lhogho و Liogo نیز ساخته شدهاست. لوگو حساس به بزرگ یا کوچک بودن حروف نیست ولی حالت را برای فرمت کردن نگه میدارد. لوگو مصالحهای بین زبان برنامهنویسی ترتیبی با ساختار بلوکی و زبان برنامهنویسی تابعی است. لوگوی استانداردی وجود ندارد، اما UCBLogo بهشدت مورد توجهاست. این زبان برای آموزش برنامهنویسی به کار میرود، اما به خاطر امکانات خوب کار با لیستها زبان بسیار خوبی برای ایجاد scriptهای مفید است.
[ویرایش] داده
سه نوع تایپ داده در UCBLogo وجود دارد:
- کلمه (word)
- لیست (list)
- آرایه (array)
اعداد حالت خاصی از کلمه هستند.
تایپدهی صریح وجود ندارد و مفسر نوع داده را از متن برنامه بهدست میآورد.
دو نماد مهم وجود دارد:
- علامت دونقطه که نشاندهنده محتوا است.
این نماد برای آموزش این مفهوم که هر متغیر مکانی در حافظه دارد بسیار مفید است.
- گیومه: به این معنا که "این عبارت به همین شکل ارزیابی میشود" یا "ارزش این عبارت بعد از ارزیابی همان ارزش قبل از ارزیابی است".
یک عدد حالت خاص ارزیابی خود است. ۲ همان "۲ است.
انتساب به متغیرها (مثلا x := y + ۳) در لوگو با دستور make انجام میشود:
make "x sum :y ۳
و یا:
make "x sum :y "۳
دستور make دو ورودی میگیرد که در اینجا ورودی دوم sum :y "۳ است. sum یک عملگر است و دو پارامتر میگیرد. "۳ به ۳ ارزیابی شده و :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 ۱۰۰ ; 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 ۱۲۰ ; draws a triangle FD 100 RT ۱۲۰
یک برنامه Hello World در لوگو به این صورت است:
print [Hello World]
[ویرایش] حلقهها
سه دستور تکرار (حلقه) در لوگو وجود دارد، یکی از آنها repeat است. دستور زیر یک مربع رسم میکند:
REPEAT ۴ [FD 100 LEFT ۹۰]
دستور FD 100 LEFT ۹۰ چهار بار تکرار میشود. تقریبی از یک دایره میتواند با یک حلقه ۳۶۰ بار چرخش و گام به جلو رسم شود: REPEAT ۳۶۰ [FD 1 RIGHT ۱] . امکان نوشتن حلقههای تودرتو نتایج خوبی را با زحمت کم به ما میدهد:
REPEAT ۳۶[ RT 10 REPEAT ۳۶۰ [FD 1 RT ۱]] FD 25 RT ۹۰
[ویرایش] توابع و زیربرنامهها
هر خط از یک برنامه از فراخوانی توابع و یا در اصطلاح برنامهنویسی زیربرنامههایی تشکیل شدهاست. دو نوع زیربرنامه وجود دارند:
- دستوراتی که اجرا میشوند ولی نتیجهای به عنوان خروجی ندارند، مانند
print - اعمالی که مقداری را به عنوان خروجی برمیگردانند، مانند
first،sumوreadlist
یک دستور مانند یک رویه در زبان پاسکال است. مجموعهای از دستورات به نام گزارهها که بعد از اجرا کلمه true یا false را برمیگردانند با حرف p تمام میشوند. مثالهای آن wordp ، emptyp و listp است.
- عبارات میتوانند اولیه بوده و یا توسط کاربر تعریف شوند.
- عبارات میتوانند صفر، یک و یا تعداد بیشتری پارامتر ورودی داشته باشند.
رویهها میتوانند با جفت TO END تعریف شوند:
TO CHAIR REPEAT ۴ [FD 100 RT ۹۰] FD 200 END
لوگو میتواند با دستور EDALL یک ویرایشگر را فراخوانی کند. در ویرایشگر دستورات یک رویه میتوانند در خطوط مختلفی نوشته شوند.
EDALL
TO CHAIR REPEAT ۴ [FD 100 RT ۹۰] FD 200 END
کلمه جدید وارد لغات قابل استفاده میشود ولی تعریف آن با تمام شدن session از بین میرود. هر بار کلمه CHAIR استفاده شود دنباله REPEAT ۴ [FD 100 RT ۹۰] FD ۲۰۰ اجرا میشود. کلمه CHAIR بعد از این میتواند بهعنوان یک دستور اجرا شود. مثلا REPEAT ۴ [CHAIR] عمل CHAIR را ۴ بار تکرار میکند. عبارات ریاضی در لوگو از نمایش پیشوندی مانند sum :x :y، product :x :y، difference :x :y و quotient :x :y استفاده میکنند. نمایش میانوندی نیز موجود است. لوگو اجازه فراخوانی بازگشتی توابع را نیز میدهد:
to spiral :size
if :size > ۳۰ [stop] ; an exit condition
fd :size rt ۱۵ ; many lines of action
spiral :size *۱٫۰۲ ; the tailend recursive call
end
[ویرایش] تاثیرات
لوگو تاثیر زیادی روی زبان برنامه نویسی اسمالتاک داشت. این زبان هم چنین تاثیر اولیه زبان و محیط آموزش برنامه نویسی Etoys است.
[ویرایش] منابع
دانشنامه آزاد انگلیسی [۱]
صفحه اصلی زبان لوگو [۲]
|
|||||||||||