320 likes | 623 Views
LISP. کیوان شفیعی. Lisp,1960. نگاهی به تاریخچه ی Lisp : ایده کلی: برخی از ایده های قدیمی ، قدیمی به نظر می رسند. برخی از ایده های قدیمی ، جدید به نظر می رسند. مثالی از یک زبان خوش ساخت و کار راه انداز متفاوت از C ، C++ و JAVA : شانسی برای متفاوت فکر کردن
E N D
LISP کیوان شفیعی
Lisp,1960 • نگاهی به تاریخچه ی Lisp: • ایده کلی: • برخی از ایده های قدیمی ، قدیمی به نظر می رسند. • برخی از ایده های قدیمی ، جدید به نظر می رسند. • مثالی از یک زبان خوش ساخت و کار راه انداز • متفاوت از C ، C++ و JAVA : شانسی برای متفاوت فکر کردن • موضوعات کلی در رابطه با طراحی زبان را شرح می دهد.
John McCarthy • پیشگام در AI • فرموله کردن استدلال ها • همچنین • پیشنهاد اشتراک زمانی • تئوری های ریاضی • Lisp از علاقه به محاسبات سمبلیک سرچشمه گرفت (ریاضی ، منطق)
خلاصه ای از Lisp • دارای لهجه های متفاوتی است: • Lisp 1.5, Maclisp, …, Scheme, ... • CommonLisp دارای ویژگیهای اضافی است • در این درس مختصری از Lisp 1.5 توضیح داده خواهد شد. • دارای نحو ساده ای است (+ 1 2 3) (+ (* 2 3) (* 4 5)) (f x y)
Atom ها و Pair ها • Atom ها شامل اعداد و رشته های غیر قابل تقسیم است. <atom> ::= <smbl> | <number> <smbl> ::= <char> | <smbl><char> |<smbl><digit> <num> ::= <digit> | <num><digit> • جفتهای دارای نقطه (dotted pairs) • برای pair از (A . B) استفاده می شود. • به عبارتهای سمبلیک، S-expressionsمی گویند: <sexp> ::= <atom> | (<sexp> . <sexp>)
توابع پایه • توابعی که روی اتمها و pair ها عمل می کنند: cons car cdreq atom • اعلانها و کنترل: cond lambda define eval quote یا‘ • مثال: (lambda (x) (cond ((atom x) x) (T (cons ‘A x)))) function f(x) = if atom(x) then x else cons(“A”,x) • توابعی با اثرات جانبی (Side Effect) rplacarplacd
ارزیابی عبارت ها • لیسپ از حلقه Read-eval-print استفاده می کند • فراخوانی تابع (function arg1 ... argn) • هر یک از آرگومانها ارزیابی می شوند • لیستی از مقادیر آرگومانها به تابع داده می شود • در بعضی از فراخوانی ها تمام آرگومانها ارزیابی نمی شوند • مثال (cond (p1 e1) ... (pn en) ) • از چپ به راست پیش می رود • اولین pi با مقدار درست یافته می شود، ei مربوط به آن ارزیابی می شود • مثال: در (quote A) ، A ارزیابی نمی شود
مثالها (+ 4 5) expression with value 9 (+ (+ 1 2) (+ 4 5)) evaluate 1+2, then 4+5, then 3+9 to get value (cons (quote A) (quote B)) pair of atoms A and B (quote (+ 1 2)) evaluates to list (+ 1 2) '(+ 1 2) same as (quote (+ 1 2))
مقاله ی McCarthy در سال 1960 • مقاله ای قابل توجه بخاطر: • ایده های خوب برای زبانها • شرح وضعیت برنامه نویسی در 1960 • بینش خوبی در پروسه ی طراحی زبان ارائه می داد. • مفاهیم مهم: • علاقه به محاسبات سمبلیک طراحی را تحت تأثیر قرار داده بود. • از مدل ماشین ساده ای استفاده شده بود • به مسایل تئوری توجه شده بود تئوری تابع بازگشتی ، محاسبات لامبدا • ایده های خوب: برنامه ها به عنوان داده، زباله روبی
طراحی یک زبان خوب • کاربرد انگیزه دهنده • ماشین انتزاعی (Abstract machine) • بنیاد تئوری
کاربرد انگیزه دهنده • کاربردهای انگیزه دهنده قسمتی از طراحی زبان خوب است و در طراحی زبان به صورتهای زیر تأثیر می گذارد: • تمرکز روی مهمترین اهداف • حذف ایده های جذاب ولی غیر ضروری Lisp محاسبات سمبلیک ، منطقی ، برنامه نویسی اکتشافی C سیستم عامل یونیکس Simula شبیه سازی PL/1 سعی در حل تمام مسائل برنامه نویسی ؛ موفق نبود
مدل اجرا (ماشین انتزاعی) • معنای زبان باید تعریف شده باشد • خیلی واقعی • برنامه ها قابل حمل نیستند ، وابسته به معماری خاص • مانع بهینه سازی • خیلی انتزاعی • به آسانی زمان و فضای اجرا قابل محاسبه نیست • لیسپ: IBM 704، ایده های خاص • ثباتهای آدرس و کاهشی -> سلولهایی با دو بخش • زباله روبی(Garbage Collection) دیدی انتزاعی از حافظه ارائه می دهد
ماشین انتزاعی • مفاهیم ماشین انتزاعی: • کامپیوتر ایده آل، برنامه ها را مستقیماً اجرا می کنند • برنامه نویس تصویر ذهنی از اجرا دارد • نباید خیلی واقعی ، یا خیلی انتزاعی باشد • مثال: • فرترن • ماشین با ثباتهای تخت، چیدمان حافظه مثل آرایه ی خطی • بدون بازگشت پذیری، بدون پشته • خانواده الگول • ماشین پشته ای، رکورد فعالیت، ذخیره سازی در توده (heap) • اسمالتاک • اشیا ، برقراری ارتباط با پیغام
بررسی تئوری • توضیح McCarthy از لیسپ • ” ... طرحی برای نمایش توابع نیمه بازگشتی از کلاس خاصی از عبارتهای سمبولیک“ • لیسپ از موارد زیر استفاده می کند: • مفهوم توابع (نیمه بازگشتی) قابل محاسبه • می خواهد تمام توابع قابل محاسبه را بیان کند • عبارتهای تابعی: • از محاسبات لامبدا استفاده می کند • محاسبات لامبدا با ماشین تورینگ یکسان است، ولی از نحو و قوانین محاسباتی مفیدی استفاده می کند
نوآوری ها در طراحی لیسپ • عبارت گرا • عبارتهای تابعی • عبارتهای شرطی • توابع بازگشتی • دید انتزاعی از حافظه • سلول ها بجای آرایه ای از مکانهای شماره دار • زباله روبی • برنامه ها مثل داده ها هستند • توابع مرتبه ی بالاتر
اقسام کلمه در زبانهای برنامه نویسی • دستور (statement) MOV AX,12 • فرمانهای دستوری • مقدار قبلی حافظه تغییر می کند. • عبارت (expression) (x+5)/2 • موجودیت نحوی که ارزیابی می شود • دارای مقدار است، نیاز به تغییر حافظه ندارد • اگر انجام شود، دارای اثرات جانبی (side effect) است • اعلان (declaration) integer x • شناسه ی جدیدی معرفی می کند • ممکن است مقداری به شناسه اختصاص دهد یا نوع را مشخص نماید و غیره
عبارتهای تابعی • شکل (lambda ( parameters ) ( function_body ) ) • نحو مورد استفاده بر اساس محاسبات لامبدا است f. x. f (f x) (lambda (f) (lambda (x) (f (f x)))) • می توان بدین گونه تابعی بدون نام تعریف کرد ( (lambda (f) (lambda (x) (f (f x)))) (lambda (x) (+ 1 x))) )
مثال (define twice (lambda (f) (lambda (x) (f (f x)))) ) (define inc (lambda (x) (+ 1 x))) ((twice inc) 2) 4
عبارتهای شرطی در لیسپ • تعمیم یافته ی if-then-else (cond (p1 e1) (p2 e2) … (pn en) ) • شرطهای p1 … pn از چپ به راست ارزیابی می شوند • اگر شرط pi اولین شرط درست باشد ، ei ارزیابی می شود • مقدارei، مقدار عبارت است به نظر می رسد لیسپ اولین زبانی بوده که عبارتهای شرطی را معرفی کرده است
مثال (cond ((< 2 1) 2) ((< 1 2) 1)) has value 1 (cond ((< 2 1 ) 2) ((< 3 2) 3)) has no value (cond (diverge 1) (true 0)) no value, if expression diverge loops forever (cond (true 0) (diverge 1)) has value 0
صریح بودن (Strictness) • یک عملگر یا عبارت صریح است اگر تمام عملوندها یا عبارتهای تشکیل دهنده ی آن دارای مقدار باشند • در لیسپ cond صریح نیست ، اما جمع صریح است • (cond (true 1) (diverge 0)) • (+ e1 e2) توضیح: (define loop (lambda (x) (loop x))) diverge (loop ())
Address Atom Atom Atom Decrement A B C 0 مدل حافظه در لیسپ • سلولهای cons • اتمها و لیستها با سلولها نمایش داده می شوند ‘(A B C)
دستورات روی سلولها • Atom • اگر آرگومان اتم باشد true را برمی گرداند در غیر این صورت false • Eq • بررسی اینکه آرگومانها در یک مکان ذخیره شده یانه؟ • (cons x y): • سلول جدید c ایجاد می شود • قسمت آدرس c به x اشاره می کند • قسمت کاهشی به y اشاره می کند • اشاره گر به c برگشت داده می شود • (car x): محتوای قسمت آدرس X را برمی گرداند • (cdr x): محتوای قسمت کاهشی X را برمی گرداند c x y
A A A B B B اشتراک (a) (b) • هر دو ساختمان می توانند به صورت ((A .B) (A.B)) • کدام یک حاصل از ارزیابی عبارات زیر است؟ • (cons (cons 'A 'B) (cons 'A 'B)) • ((lambda (x) (cons x x))(cons 'A 'B))
زباله روبی (Garbage Collection) • زباله: در نقطه ای از اجرای برنامه ای مثل P ، مکانی از حافظه مثل m زباله است اگر هیچ اجرای کاملی از P از آن نقطه نتواند به مکان m دسترسی داشته باشد. • زباله روبی : • تشخیص زباله در حین اجرای برنامه • GC زمانی در خواست می شود که حافظه ی بیشتری مورد نیاز است • تصمیم گیری توسط سیستم زمان اجرا(run-time) انجام می شود و نه برنامه
مثال (car (cons ( e1) ( e2 ) )) سلولهایی که در موقع ارزیابی e2 ایجاد می شوند زباله هستند، مگر اینکه باe1 یا قسمتهای دیگر برنامه اشتراک داشته باشد
الگوریتم نشانه گذاری و جارو کردن (mark – and – sweep) • فرض می شود همراه هر داده ای یک بیت برچسب (tag) قرار دارد • الگوریتم: • تمام tag ها صفر می شوند • از هر مکانی که در برنامه استفاده شده شروع کرده ، تمام لینکهای آن دنبال شده و tag تمام سلولهایی که ملاقات می شوند 1 می شوند • تمام سلولهایی که tag آنها صفر است در لیست آزاد قرار می گیرند
برنامه به عنوان داده • برنامه ها و داده ها دارای نمایش یکسانی هستند • تابع eval برای ارزیابی محتوای لیست استفاده می شود • مثال: جانشین سازی x با y در z و ارزیابی آن: (define substitute (lambda (x y z) (cond ((null z) z) ((atom z) (cond ((eq z y) x ) (true z))) (true (cons (substitute x y (car z)) (substitute x y (cdr z))))))) (define substitute-and-eval (lambda (x y z) (eval (substitute x y z)))) (substitute-and-eval '3 'x '(+ x 1))
توابع بازگشتی • می خواهیم تابع زیر را بنویسیم f(x)=0 if x=0 else x+f(x-1) • حل: (lambda (x) (cond ((eq x 0) 0) (true (+ x (f (- x 1)))))) اما f دربدنه ی تابع قبلاً تعریف نشده • راه حل McCarthy در سال 1960: (label f (lambda (x) (cond ((eq x 0) 0) (true (+ x (f (- x 1 ))))))) • تعریف بازگشتی • (define f (lambda (x) (cond ((eq x 0) 0) (true (+ x (f (- x 1 )))))))
توابع مرتبه ی بالاتر • تابعی که • یک تابع به عنوان آرگومان می گیرد • یا تابعی را به عنوان نتیجه بر می گرداند • یا هر دو • مثال: ترکیب توابع (define compose (lambda (f g) (lambda (x) (f (g x))))) • مثال: maplist (define maplist (lambda (f x) (cond ((null x) ()) (true (cons (f (car x)) (maplist f(cdr x ) ))))))
مثال (define inc (lambda (x) (+ x 1))) (maplist inc '(1 2 3)) • (2 3 4) مدخل scheme: (define true #t) (define false #f) (define eq eq?) (define null null?)