لوگو (زبان برنامه‌نویسی): تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
جز ویرایش Hamidrezajfr (بحث) به آخرین تغییری که JYBot انجام داده بود واگردانده شد
Fatemibot (بحث | مشارکت‌ها)
جز ربات ردهٔ همسنگ (۲۴) +نشانی+املا+مرتب+تمیز (۸.۸): + رده:زبان‌های برنامه‌نویسی آموزشی
خط ۱:
{{جعبه اطلاعات-نیاز|تاریخ=نوامبر ۲۰۱۲}}
'''لوگو''' یک زبان برنامه نویسی برای [[برنامه‌نویسی تابعی]] است. این زبان نسخه‌ای از زبان [[لیسپ]] است که برخی آن را لیسپ بدون پرانتز می‌نامند. امروزه این زبان با لاک‌پشت گرافیکش شناخته می‌شود، اما لوگو قابلیت‌های خوبی نظیر کار با لیست، فایل، ورودی/خروجی و حلقه‌ها دارد.
لوگو در سال ۱۹۶۷ با اهداف آموزشی خصوصاخصوصاً آموزش سازنده‌گرا طراحی شد. طراحان این زبان دانیل بابرو، والاس فرزیگ و سیمور پپرت هستند.
 
== تاریخچه ==
اواسط دهه ۱۹۶۰ میلادی سیمور پپرت به همراه [[ماروین مینسکی]] آزمایشگاه هوش مصنوعی [[دانشگاه ام‌آی‌تی]] را راه‌اندازی کرد. پپرت با گروهی از شرکت بولت، برنک و نیومن (BBN) که توسط والاس فرزیگ رهبری می‌شد همکاری کرد و در سال [[۱۹۶۷ (میلادی)|۱۹۶۷]] اولین نسخه زبان لوگو به وجود آمد. در چهار سال اول، آموزش و تحقیقات روی این زبان در شرکت BBN انجام شد. اولین پیاده‌سازی این زبان که گوست نامیده می‌شود به‌وسیله لیسپ نوشته شد. هدف گوست آموزش حل مسئله بود و کودکان می‌توانستند در یک محیط ریاضیاتی کار با کلمات و جمله‌ها را یاد بگیرند. لاک‌پشت ویرایشگر بازخورد سریعی می‌داد تا اشکالات برنامه مشخص شود.
در حال حاضر لوگو تفاوت چندانی با ایده‌های اولیه قبل از اولین لاک‌پشت ندارد. در اوایل طراحی این زبان یک روبوت به شکل لاک‌پشت با توجه به دستورات نوشته شده در کامپیوتر روی زمین حرکت می‌کرد. اولین روبوت لاک‌پشت در سال ۱۹۶۹ در [[دانشگاه ام‌آی‌تی|ام‌آی‌تی]] به‌وجود آمد. این روبوت که ایروینگ نام داشت دارای حسگرهای لمسی بوده و می‌توانست به عقب، جلو، راست و چپ حرکت کرده و یا زنگ خود را به صدا درآورد. بعدها روبوت لاک‌پشت حذف و به نمایشگر کامپیوتر منتقل شده و با دستوراتیدستور‌هایی شکل و طرح‌هایی را رسم می‌کرد.
 
== طراحی ==
مشهورترین خصوصیت لوگو نشانه‌گر به شکل لاک‌پشت آن است که می‌توان دستور حرکت و یا کشیدن شکل به آن داد و با توجه به برنامه خطوط گرافیکی رسم می‌کند. این نشانه‌گر معمولاً به شکل یک لاک‌پشت یا یک مثلث نشان داده می‌شود. لاک‌پشت گرافیکی در اواخر دهه ۱۹۶۰ میلادی توسط سیمور پپرت به لوگو اضافه شد تا نسخه دارای روبوت لاک‌پشت را پشتیبانی کند. این روبوت لاک‌پشت یک روبوت ساده بود که از ایستگاه کاری کاربر کنترل می‌شد و دستوراتیدستور‌هایی برای رسم اشکال به روبوت که دارای یک قلم درون خود یا چسبیده به آن بود می‌داد.
 
استفاده از هندسه لاک‌پشت به جای یک مدل مرسوم‌تر، حرکت منطقی روبوت لاک‌پشت را تقلید می‌کند. هندسه لاک‌پشت با (x،y) ای که در هندسه کارتزین استفاده می‌شود، تفاوت دارد و بیشتر در یک فضای اقلیدسی کار می‌کند (با استفاده از اندازه‌ها و زوایای نسبی و بدون مبدا و متفاوت از سیستم‌های با دستگاه مختصات). لاک‌پشت با دستوراتیدستور‌هایی نسبت به مکان فعلی خودش حرکت می‌کند. LEFT ۹۰ به این معناست که ۹۰ درجه به سمت چپ بچرخ. یک دانش‌آموز با فرض اینکه اگر جای لاک‌پشت باشد باید چه حرکتی انجام دهد، می‌تواند حرکت لاک‌پشت را بفهمد (پیش‌بینی و درباره آن استدلال کند). پپرت این موضوع را استدلال سازگار با محیط نامید. بعضی از پیاده‌سازی‌های لوگو، به خصوص آنهایی که اجازه وجود چند لاک‌پشت را می‌دهند، ردیابی برخورد (collision detection) را پشتیبانی کرده و اجازه می‌دهند کاربر نمایش نشانه‌گر لاک‌پشت را دوباره تعریف کند.
 
لوگو معمولاً به عنوان زبانی مفسری شناخته می‌شود، با این حال اخیرااخیراً برخی نسخه‌های کامپایلی لوگو مانند Lhogho و Liogo نیز ساخته شده‌است. لوگو حساس به بزرگ یا کوچک بودن حروف نیست ولی حالت را برای فرمت کردن نگه می‌دارد. لوگو مصالحه‌ای بین زبان برنامه‌نویسی ترتیبی با ساختار بلوکی و زبان برنامه‌نویسی تابعی است. لوگوی استانداردی وجود ندارد، اما UCBLogo به‌شدت مورد توجه‌است. این زبان برای آموزش برنامه‌نویسی به کار می‌رود، اما به خاطر امکانات خوب کار با لیست‌ها زبان بسیار خوبی برای ایجاد scriptهای مفید است.
 
=== داده ===
خط ۲۴:
 
دو نماد مهم وجود دارد:
 
* علامت دونقطه که نشان‌دهنده محتوا است.
این نماد برای آموزش این مفهوم که هر متغیر مکانی در حافظه دارد بسیار مفید است.
سطر ۳۰ ⟵ ۲۹:
یک عدد حالت خاص ارزیابی خود است. ۲ همان "۲ است.
 
انتساب به متغیرها (مثلامثلاً <code>x := y + ۳</code>) در لوگو با دستور <code>make</code> انجام می‌شود:
 
{{چپچینچپ‌چین}}
make "x sum :y ۳
{{پایان چپچینچپ‌چین}}
و یا:
 
{{چپچینچپ‌چین}}
make "x sum :y "۳
{{پایان چپچینچپ‌چین}}
دستور <code>make</code> دو ورودی می‌گیرد که در اینجا ورودی دوم <code>sum :y "۳</code> است. <code>sum</code> یک عملگر است و دو پارامتر می‌گیرد. <code>"۳</code> به <code>۳</code> ارزیابی شده و <code>:y</code> محتویات خانه با نام <code>y</code> را برمی‌گرداند. این دو مقدار با یکدیگر جمع شده و یک مقدار جدید را می‌دهند.
 
دستور <code>make</code> نتیجه را در ورودی اول قرار می‌دهد. از دیدگاه برنامه‌نویسی پارامتر اول <code>make</code> از نوع انتقال آدرس (pass by reference) و پارامتر دوم از نوع انتقال مقدار (pass by value) است.
سطر ۴۹ ⟵ ۴۸:
یک متغیر می‌تواند به صورت محلی تعریف شود، بنابراین حوزه تعریف آن محدود به همان رویه و رویه‌هایی که فراخوانی می‌کند است (حوزه پویا). فراخوانی یک رویه با ورودی‌هایش متغیرهای محلی ایجاد می‌کند که مقادیر آرگومان‌ها را نگه می‌دارند.
 
==== لیستفهرست ====
لوگو لیست را از لیسپ گرفته‌است و لیست‌ها روش اولیه ذخیره‌سازی بردارهاست.
 
سطر ۵۹ ⟵ ۵۸:
==== دستورات ساختار کنترلی ====
لوگو ساختارهای کنترلی مختلفی دارد:
{{چپچینچپ‌چین}}
* 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
{{پایان چپچینچپ‌چین}}
 
=== ورودی-خروجی ===
سطر ۸۹ ⟵ ۸۸:
 
== نحو ==
دستورات می‌توانند در یک یا چندین خط نوشته شوند. دستورات زیادی نمادهای نمایش کوتاهتری دارند، مثلامثلاً دستورات <code>FORWARD</code> و <code>RIGHT</code> می‌توانند به صورت <code>FD</code> و <code>RT</code> نوشته شوند. این کار دشواری ورودی را کم می‌کند. از هر نوشته‌ای بعد از علامت نقطه-ویرگول؛ صرف‌نظر شده و به کاربر این امکان داده می‌شود که توضیحاتی برای برنامه بنویسد.
{{چپچینچپ‌چین}}
FORWARD ۱۰۰ ; draws a square with sides 100 units long
LEFT 90
سطر ۱۰۲ ⟵ ۱۰۱:
FD 100 RT 120 FD 100 RT ۱۲۰ ; draws a triangle
FD 100 RT ۱۲۰
{{پایان چپچینچپ‌چین}}
یک برنامه Hello World در لوگو به این صورت است:
{{چپچینچپ‌چین}}
print [Hello World]
{{پایان چپچینچپ‌چین}}
 
=== حلقه‌ها ===
سه دستور تکرار (حلقه) در لوگو وجود دارد، یکی از آنها <code>repeat</code> است. دستور زیر یک مربع رسم می‌کند:
{{چپچینچپ‌چین}}
REPEAT ۴ [FD 100 LEFT ۹۰]
{{پایان چپچینچپ‌چین}}
دستور <code> FD 100 LEFT ۹۰ </code> چهار بار تکرار می‌شود. تقریبی از یک دایره می‌تواند با یک حلقه ۳۶۰ بار چرخش و گام به جلو رسم شود: <code> REPEAT ۳۶۰ [FD 1 RIGHT ۱] </code>. امکان نوشتن حلقه‌های تودرتو نتایج خوبی را با زحمت کم به ما می‌دهد:
{{چپچینچپ‌چین}}
REPEAT ۳۶[ RT 10 REPEAT ۳۶۰ [FD 1 RT ۱]]
FD 25
RT ۹۰
{{پایان چپچینچپ‌چین}}
 
=== توابع و زیربرنامه‌ها ===
هر خط از یک برنامه از فراخوانی توابع و یا در اصطلاح برنامه‌نویسی زیربرنامه‌هایی تشکیل شده‌است. دو نوع زیربرنامه وجود دارند:
* دستوراتیدستور‌هایی که اجرا می‌شوند ولی نتیجه‌ای به عنوان خروجی ندارند، مانند <code>print</code>
* اعمالی که مقداری را به عنوان خروجی برمی‌گردانند، مانند <code>first</code> ، <code>sum</code> و <code>readlist</code>
یک دستور مانند یک رویه در زبان پاسکال است. مجموعه‌ای از دستورات به نام گزاره‌ها که بعد از اجرا کلمه <code>true</code> یا <code>false</code> را برمی‌گردانند با حرف p تمام می‌شوند. مثالهای آن <code>wordp</code> ، <code>emptyp</code> و <code>listp</code> است.
* عبارات می‌توانند اولیه بوده و یا توسط کاربر تعریف شوند.
* عبارات می‌توانند صفر، یک و یا تعداد بیشتری پارامتر ورودی داشته باشند.
رویه‌ها می‌توانند با جفت <code>TO END </code>تعریف شوند:
{{چپچینچپ‌چین}}
TO CHAIR REPEAT ۴ [FD 100 RT ۹۰] FD 200 END
{{پایان چپچینچپ‌چین}}
لوگو می‌تواند با دستور <code>EDALL</code> یک ویرایشگر را فراخوانی کند. در ویرایشگر دستورات یک رویه می‌توانند در خطوط مختلفی نوشته شوند.
{{چپچینچپ‌چین}}
EDALL
سطر ۱۳۸ ⟵ ۱۳۷:
REPEAT ۴ [FD 100 RT ۹۰] FD 200
END
{{پایان چپچینچپ‌چین}}
کلمه جدید وارد لغات قابل استفاده می‌شود ولی تعریف آن با تمام شدن session از بین می‌رود. هر بار کلمه <code>CHAIR</code> استفاده شود دنباله <code> REPEAT ۴ [FD 100 RT ۹۰] FD ۲۰۰ </code>اجرا می‌شود. کلمه <code>CHAIR</code> بعد از این می‌تواند به‌عنوان یک دستور اجرا شود. مثلامثلاً <code> REPEAT ۴ [CHAIR] </code>عمل <code>CHAIR</code> را ۴ بار تکرار می‌کند.
عبارات ریاضی در لوگو از نمایش پیشوندی مانند <code>sum :x :y</code>، <code>product :x :y</code>، <code>difference :x :y</code> و <code>quotient :x :y</code> استفاده می‌کنند. نمایش میانوندی نیز موجود است.
لوگو اجازه فراخوانی بازگشتی توابع را نیز می‌دهد:
{{چپچینچپ‌چین}}
to spiral :size
if :size > ۳۰ [stop] ; an exit condition
fd :size rt ۱۵ ; many lines of action
spiral :size *۱٫۰۲ ; the tailend recursive call
end
{{پایان چپچینچپ‌چین}}
 
== تاثیرات ==
سطر ۱۵۴ ⟵ ۱۵۳:
 
== منابع ==
{{پانویس}}
دانشنامه آزاد انگلیسی [http://en.wikipedia.org/wiki/Logo_programming_language]
 
صفحه اصلی زبان لوگو [http://el.media.mit.edu/Logo-foundation/index.html]
خط ۱۶۳:
 
[[رده:خانواده زبان برنامه‌نویسی لیسپ]]
[[رده:زبان‌های برنامه‌نویسی آکادمیک]]
[[رده:رباتیک در ۱۹۶۷ (میلادی)]]
[[رده:زبان‌های برنامه‌نویسی]]
[[رده:زبان‌های برنامه‌نویسی آکادمیک]]
[[رده:زبان‌های برنامه‌نویسی آموزشی]]
[[رده:زبان‌های تابعی]]