بررسی مهمترین پروتکلهای زبان برنامهنویسی کلوژر (Clojure)
زبانهای برنامهنویسی متفاوتی در دنیا وجود دارند. پیشرفتهای امروز تکنولوژی، مدیون برنامهنویسانی است که بهگونهای متفاوت به دنیا نگاه میکردند. در این مقاله باهم در مورد زبان برنامهنویسی کلوژر و پروتکلهای آن صحبت میکنیم.
کلوژر چیست؟
کلوژر (Clojure) گویشی از زبان برنامهنویسی لیسپ (Lisp) است که توسط ریچ هیکی (Rich Hickey) ایجادشده است. این زبان، یک زبان همهمنظوره تابعی است. کد کلوژر به بایتکد (Bytecode) ماشین مجازی جاوا (Java Virtual Machine, JVM) کامپایل میشود. بنابراین میتواند از کتابخانههای جاوا استفاده کند.
مفهوم کامپایلر: کامپایلر (compiler) برنامه یا مجموعهای از برنامههای کامپیوتری است که متنی از زبان برنامهنویسی سطح بالا (زبان مبدا) را به زبانی سطح پایین (زبان مقصد) مثل زبان سطح ماشین، تبدیل میکند. کامپایلر این کار را بدون تغییر در رفتار کد، انجام میدهد. خروجی این فرایند یا بهصورت برنامهای است که توسط برنامههای دیگر پردازش میشود یا یک فایل متنی قابلخواندن توسط انسان است. به مجموعه کارهایی که یک کامپایلر برای تبدیل کدهای برنامهنویسی به کدهای اجرایی انجام میدهد، کامپایل کردن گفته میشود. دریکی از مهمترین پروسههای این تبدیل، کامپایلر وجود خطا در برنامه مبدا را گزارش میدهد.
کلوژر بدون ریسمان!
اکثر زبانهای برنامهنویسی ویژگیهای پایهای همروندی، یعنی ریسمانها و قفلها را در اختیاردارند. زبانهایی مانند جاوا، تعدادی کتابخانه کمکی نیز برای کنترل همروندی اضافه میکنند ولی تغییری اساسی در چگونگی طراحی برنامههای همروند ایجاد نکرده و تنها میزان کد موردنیاز را کم میکنند. کلوژر بهصورت اساسی و از همه نظر فرق میکند. مدلهای برنامهنویسی همروند در کلوژر کاملاً متفاوت هستند بهطوریکه نیازی به ریسمان و قفل نیست.
پروتکل چیست؟
در علوم رایانه و ارتباطات، پروتکل (Protocol) عبارت است از استاندارد یا قراردادی که برای ارتباط میان دو گروه، برقرار میشود. پروتکل در سادهترین حالت میتواند بهعنوان قوانین اداره منطق، ترکیب و همزمانی ارتباطات در نظر گرفته شود. گاهی پروتکلها در سختافزار، نرمافزار یا ترکیبی از این دو پیادهسازی میشوند. نقش پروتکل در کامپیوتر مانند نقش زبان برای انسان است. برای مطالعه یک کتاب نوشتهشده به زبان فارسی، خواننده باید شناخت مناسبی از زبان فارسی داشته باشد. برای ارتباط موفقیتآمیز دو برنامه یا دو دستگاه نیز، باید هر دو از یک پروتکل یکسان استفاده کنند.
مزایای پروتکلهای کلوژر
مزیت ۱- فراهم کردن عملکرد بالای ساختار پلیمورفيسم (Polymorphism) یا چندشکلی پویا بهعنوان یک جایگزین برای اینترفیس.
مفهوم پلیمورفيسم: Polymorphism در لغتنامه به معنی «چندریختی» یا «چندشکلی» است. در زبانهای برنامهنویسی هم با همین مفهوم تعریفشده است. پلیمورفیسم در بسیاری از زبانها مانند خانواده C و همچنین زبانهای متنبازی مانند جاوا (java) و پیاچپی (php) نیز پیادهسازی شده است. به این مثال توجه کنید: کلاسی به نام «lamp» تعریف میکنیم که دارای 2 متد به نامهای «on» و «off» است. این لامپ ممکن است لامپ کممصرف یا ریسه نئونی ضد آب باشد! گرچه هیچ ارتباطی با یکدیگر ندارند اما هردو رفتاری به نامهای روشن و خاموش شدن را انجام میدهند. حالا ما کلاسی تعریف میکنیم و آن را از کلاس lamp ارثبری میکنیم. کلاس جدید ما باید دو متد on و off را داشته باشد، اما ممکن است پیادهسازی کاری که متدها انجام میدهند، در کلاسهای مختلف، متفاوت باشد.
مفهوم اینترفیس: به هر نوع سختافزار یا نرمافزاری که نقش میانجی یا واسطه را میان رایانه و یک دستگاه یا دو برنامه بر عهده دارد در اصطلاح اینترفیس (interfaces) میگویند.
مزیت ۲- فقط مشخصات، بدون پیادهسازی
مزیت ۳- پروتکلهای کلوژر، مکانیسمی برای عملکرد پلیمورفیسم هستند.
مزیت ۴- پروتکلهای کلوژر برای تعریف پلیمورفیسم یک مرز خارجی، مانند رابط کاربری به یک سرویس، مفید هستند. بنابراین، میتوان در آن سرویسهای مختلف را جایگزین یا از آن برای آزمایش خدمات فکری (Mock object) استفاده کرد.
مفهوم اشیای فکری: در برنامهنویسی شی گرا، اشیای فکری (Mock object)، اشیا شبیهسازیشدهای هستند که رفتار اشیای واقعی را در شیوههای کنترلشده تقلید میکنند. بهطورمعمول، برنامهنویسان یک شی آزمایشی را برای تست رفتار اشیای دیگر ایجاد میکند. درست همانطور که یک طراح خودرو با استفاده از یک ماکت انسان، رفتار او را هنگام برخورد با یک خودروی دیگر بررسی میکند.
مزیت ۵- یک پروتکل، مجموعهای از روشها است. هر روش دارای نام، یک یا چند بردار استدلال و یک رشته مستندات اختیاری است. هیچگونه پیادهسازی یا کد واقعی وجود ندارد.
مزیت ۶- تفاوت مهم بین پروتکلها و اینترفیسها در این است که پروتکلها هیچ ارثی ندارند. شما نمیتوانید ساب پروتکلی (subprotocols) مانند ساب اینترفیسهای جاوا ایجاد کنید.
نکته ساباینترفیس (sub interface) جزو اینترفیسهای غیر فیزیکی است که ازلحاظ ابعاد وجودی، میتوان به آنها اینترفیسهای مجازی گفت.
مزیت ۷- یک دیتاتایپ (datatype) برای ارائه پیادهسازی به هیچ روش، پروتکل یا اینترفیسی نیاز ندارد. هنگامیکه نمونههایی از آن دیتاتایپ را فراخوانی میکنید، فقدان روشها باعث پیادهسازی AbstractMethodError میشود.
مفهوم AbstractMethodError: در برنامه نویسی AbstractMethodError یک خطای برنامهنویسی است. این خطا زمانی رخ میدهد که برنامهنویس برای فراخوانی برنامه از یک روش انتزاعی استفاده کند. بهطور معمول، این خطا توسط کامپایلر گرفتار میشود.
فرض کنید برنامهای وجود دارد که شما در آن قادر به تغییر کد منبع نیستید. در این حالت برای ایجاد یک پروتکل جدید که روی دیتاتایپ موجود عمل کند باید پروتکلها را گسترش دهید.
گسترش (Extend) نام دیتاتایپ را به دنبال هر شماره از نقشه پروتکل یا روش میگیرد. منظور از نقشه یک نقشه معمولی از نام متدها است که بهعنوان کلمات کلیدی به پیادهسازی آنها داده میشود. وقتی میخواهید چندین پروتکل را برای یک دیتاتایپ اجرا کنید از extension-type و برای اجرای همان پروتکل در چندین دیتاتایپ از extend-protocol استفاده کنید.
چگونه پروتکلها مشکل بیان را حل میکنند؟
مشکل بیان (expression problem) یک اصطلاح است که در بحث نقاط قوت و ضعف پارادایمها و زبانهای برنامهنویسی مختلف استفاده میشود. اولین بار، فیلیپ وادلر (Philip Wadler) در واکنش به گفتگو با تیم زبان برنامهنویسی پیالتی (Programming Languages Team, PLT) دانشگاه رایس (Rice University) این اصطلاح را بهکاربرد:
«مشکل بیان، نامی جدید برای یک مشکل قدیمی است. هدف، تعریف یک دیتاتایپ بهگونهای است که در آن با اضافه کردن دادهها و عملکردهای جدید، کدهای موجود حفظ شوند.»
مشکل اساسی توسعهپذیری، دستکاری دیتاتایپها بهوسیله عملیات انجامشده در برنامهها است. همانطور که برنامهها در حال تکامل هستند باید عملیات و دیتاتایپهای جدید، گسترش پیدا کنند. نکته مهم این است که برنامهنویس باید بتواند عملیات جدیدی را که با انواع دیتاتایپهای موجود کار میکند و دادههای جدیدی که با انواع عملیات موجود کار میکنند به برنامهاش اضافه کند. منظور ما، یک گسترش واقعی است یعنی گسترشی که در آن برنامه موجود، اصلاح نشود.
هدف اصلی در توسعه پروتکلها، حفظ انتزاعهای موجود، وجود افزونهها در ماژولها (modules) یا فضای نام (namespaces)، کامپایل، استقرار و بررسی جداگانه برنامههای افزودنی است. در حال حاضر، چند روشی (Multimethods) به حل مشکل بیان کمک میکند. اصلیترین پروتکل ارائهشده در Multimethods گروهبندی است.
چرا زمانی که چند روشی یا Multimethods را در اختیار داریم از پروتکلها استفاده کنیم؟
زمانی که شما کلوژر را برای اجرای یک پلتفرم آماده میکنید (JVM، CLI، ECMAScript، Objective-C) پشتیبانی ویژه تخصصی برای اعزام، شما را محدود به ارسال نوع خاص خود در اولین استدلال میکنند. بهعبارتدیگر، خاصیت چند روشی در کلوژر، تمام استدلالها را به خواص دلخواه شما ارسال میکند.
جایی که عملکرد ذخیره روی کاربر و آیتم جدید کار نمیکند، ذخیرهسازی را مانند یک عملکرد عادی انجام دهید:
این پروتکل برای هر شی که قصد ذخیرهسازی آن را دارید، قابلاجرا است.
اگر تمایل به مطالعه بیشتر در مورد این موضوعات را داشته باشید؛ شاید آموزش های زیر نیز برای شما مفید باشند:
#