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

**لوگو** یک زبان برنامه‌نویسی برای برنامه‌نویسی تابعی است. این زبان نسخه‌ای از زبان لیسپ است که برخی آن را لیسپ بدون پرانتز می‌نامند. امروزه این زبان با لاک‌پشت گرافیکش شناخته می‌شود، اما لوگو قابلیت‌های خوبی نظیر کار با لیست، فایل، ورودی/خروجی و حلقه‌ها دارد.
لوگو در سال ۱۹۶۷ با اهداف آموزشی خصوصاً آموزش سازنده‌گرا طراحی شد. طراحان این زبان دانیل بابرو، والاس فرزیگ و سیمور پپرت هستند.

## تاریخچه
اواسط دهه ۱۹۶۰ میلادی سیمور پپرت به همراه ماروین مینسکی آزمایشگاه هوش مصنوعی دانشگاه ام‌آی‌تی را راه‌اندازی کرد. پپرت با گروهی از شرکت بولت، برنک و نیومن (BBN) که توسط والاس فرزیگ رهبری می‌شد همکاری کرد و در سال ۱۹۶۷ اولین نسخه زبان لوگو به وجود آمد. در چهار سال اول، آموزش و تحقیقات روی این زبان در شرکت BBN انجام شد. اولین پیاده‌سازی این زبان که گوست نامیده می‌شود به‌وسیله لیسپ نوشته شد. هدف گوست آموزش حل مسئله بود و کودکان می‌توانستند در یک محیط ریاضیاتی کار با کلمات و جمله‌ها را یاد بگیرند. لاک‌پشت ویرایشگر بازخورد سریعی می‌داد تا اشکالات برنامه مشخص شود.
هدف از آموزش کودکان در زمینهٔ فناوری ، درگیر کردن آن‌ها در فعالیت‌های هدفمند است تا ضمن جذب مهارت‌ها و مفاهیم موجود کودکان ، به سمت دانش سطح بالا (پیشرفته) و اندیشهٔ انتقادی ناشی از فرایندها و تولیدات فنی سوق داده شوند. تلاش برای فهم و به‌کارگیری فرایندها ( شامل تصمیم‌گیری در بارهٔ انتخاب و به‌کارگیری فناوری‌های مناسب ؛ طراحی ، و ساخت و ارزیابی تولیدات و فرایندهای فنی ؛ اجرا و توسعهٔ مواد ، اطلاعات و سیستم‌ها ) و فناوری‌های نوین ، مطمئناً اولین چالش خواهد بود (1996,X) . اغلب تاکیدات بر استفاده از رایانه به عنوان ابزاری برای بهره وری و حل مسئله در یک محیط یادگیری سازنده است که عمدتاً ، استانداردها به‌طور روشنی ، تعریف شده‌اند . اما " ادغام رباتیک در کلاس " برای بهبود تفکر انتقادی و ترویج یادگیری سطح بالا ، یکی از حوزه‌هایی که کمتر به آن توجه شده‌است (Chambers and et al, xxxx ) و امروزه نسبتاً بلا استفاده مانده‌است.
ایدهٔ استفاده از رباتیک در کلاس ، براساس فعالیت‌های پژوهشی سیمور پاپرت ( Seymour Papert ) - پدر زبان برنامه‌نویسی لگو (Lego) - است . لگو برای استفادهٔ کودکان و بر اساس دیدگاه پیاژه (1964) مبنی بر اینکه مفاهیم انتزاعی را می‌توان با بررسی‌های اکتشافی دستی ( تجربه عملی ) یادگرفت ، طراحی شد. از نظر پاپرت ، کودکان فعالانه ساختارهای فکری خود را می سازند و توانایی یادگیری استفاده از زبان برنامه‌نویسی و رایانه را دارند که یک مهارت پایه برای یادگیری هر چیزی است (1996,X) . در برنامه‌نویسی با مؤلفه‌ای تحت عنوان " معناسازی " روبرو هستیم ، هر نشانه در برنامه ، معنایی دارد و دانش آموزان فهم خود را از این نشانه‌ها در ذهن می سازند (2006Ricca and et all,)(ترجمه پرستو علیخانی)

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

## طراحی
مشهورترین خصوصیت لوگو نشانه‌گر به شکل لاک‌پشت آن است که می‌توان دستور حرکت یا کشیدن شکل به آن داد و با توجه به برنامه خطوط گرافیکی رسم می‌کند. این نشانه‌گر معمولاً به شکل یک لاک‌پشت یا یک مثلث نشان داده می‌شود. لاک‌پشت گرافیکی در اواخر دهه ۱۹۶۰ میلادی توسط سیمور پپرت به لوگو اضافه شد تا نسخه دارای روبوت لاک‌پشت را پشتیبانی کند. این روبوت لاک‌پشت یک روبوت ساده بود که از ایستگاه کاری کاربر کنترل می‌شد و دستورهایی برای رسم اشکال به روبوت که دارای یک قلم درون خود یا چسبیده به آن بود می‌داد.

استفاده از هندسه لاک‌پشت به جای یک مدل مرسوم‌تر، حرکت منطقی روبوت لاک‌پشت را تقلید می‌کند. هندسه لاک‌پشت با (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 است.

## نسخه فارسی مفسر لوگو
سایت Turtle Academy نسخه‌ای فارسی از مفسر زبان لوگو را بهمراه مجموعه‌ای از درس‌ها ارائه کرده‌است.

## منابع

دانشنامه آزاد انگلیسی [//en.wikipedia.org/wiki/Logo_programming_language]

صفحه اصلی زبان لوگو https://web.archive.org/web/20110721122057/http://el.media.mit.edu/logo-foundation/index.html

http://www.computernostalgia.net/articles/logo.htm

رده:خانواده زبان برنامه‌نویسی لیسپ
رده:مهندسی رباتیک در ۱۹۶۷ (میلادی)
رده:زبان‌های برنامه‌نویسی
رده:زبان‌های برنامه‌نویسی آکادمیک
رده:زبان‌های برنامه‌نویسی آموزشی
رده:زبان‌های برنامه‌نویسی ساخته‌شده در ۱۹۶۷ (میلادی)
رده:زبان‌های برنامه‌نویسی ماشینی پویا
رده:زبان‌های تابعی
رده:نرم‌افزارهای آموزشی آزاد
رده:نرم‌افزار اپل II