گروه فنی مهندسی آرتوان متخصص در طراحی و ساخت سیستمهای پردازشی-کنترلی ( مبحث رپر Wrapper چیست )
موضوع Wrapper در برنامه نویسی
بخش اول
مفهوم Wrapper چیست ؟
در بخش اول از بحث Wrapper ابتدا سراغ کلیات و مفاهیم می رویم.
معنای لغوی Wrapper چیست ؟
معنای لغوی Wrapper که از فعل Wrap می آید، پوشنده یا پیچنده می باشد.
یعنی شیئی که شیء دیگری را در خود فرامی گیرد و به دور آن می پیچید.
به طور مثال در زبان انگلیسی به پوسته شکلات و آب نبات Candy Wrapper میگویند.
معنای اصطلاحی Wrapper چیست ؟
وقتی در برنانه نویسی از این اصطلاح استفاده می کنیم منظورمان یک سابروتین است که دربرگیرنده یک سابروتین دیگر یا یک فراخوانی سیستمی درون خود باشد، با این هدف که برنامه ی نوشته شده به کمک Wrapper روان تر و ساده تر باشد. روان تر و ساده تر به چه معنا و با چه متر و معیاری؟
پیش از پاسخ به سوال اخیر، بد نیست معنای “فراخوانی سیستمی” که پیشتر به آن اشاره شد را به اختصار بیان کنیم.
فراخوانی های سیستمی یا همان System Call ها چه میباشند؟
هر برنامه ای که در آن درخواست یک سرویس مثلا دسترسی به حافظه،
به کرنل سیستم عامل داده شود، “فراخوانی سیستمی” گفته می شود.
به طور مثال دستوراتی مانند Open، Read ، Close و … در زمره دستوراتی هستند
که در صورت وجود در یک برنامه نیاز به دسترسی به حافظه رو ضروری می سازد.
دسترسی به حافظه در برنامه در اصل یک سرویس است که از کرنل سیستم عامل درخواست می شود؛
پس Open یک “فرواخوانی سیستمی” است.
عملا در برنامه های بزرگ صدها فرواخوانی سیستمی از سیستم عامل وجود دارد
که به وسیله ابزار مشخصی توسط سیستم عامل هندل می شود.
خوب برگردیم سر بحث قبل؛ چرا گفته می شود استفاده از Wrapper در برنامه نویسی به ساده و روان شدن آن کمک می کند؟
اگر بخواهم خیلی خودمانی جواب این سوال را بدهم، این طور می توانم بگویم
که شما به عنوان برنامه نویس به کمک رپر Wrapper می توانید توابع (فعلا با فرض برنامه نویسی به زبان C) موجود در کتابخانه ها را به نحو مدنظر خود ‘سفارشی سازی’ کنید.
این توصیف خودمانی نیاز به توضیح بیشتری دارد.
تذکر: فعلا پا را از زبان C فراتر نگذاشته ام.
مواردی که در ارتباط با رپر Wrapper در حال بیان آن هستم،
به Wrapper بین دو زبان برنامه نویسی ارتباط نداشته و در سطح توابع در زبان C می باشد؛
هر جا که درباره انواع پیشرفته تر Wrapper خواستم صحبت کنم،
به زبان برنامه نویسی مربوط به آن اشاره خواهم کرد و اگر اصطلاح یا عبارت جدیدی وجود داشته باشد،
اجمالا توضیح خواهم داد.
در نهایت به دسته بندی پایانی و جمع بندی خواهم پرداخت.
در زبان برنامه نویسی C Wrapper چیست ؟
اکنون بحث را با یک مثال ساده پیش می برم.
فرض کنید می خواهیم برنامه ای بنویسیم که در هنگام اجرا، در کامند پرامت،
پیش از هر چیز دیگری، داریکتوری و اسم فایل exe برنامه را نمایش دهد.
مضاف بر این، با بررسی آرگومان های کامند لاین، اگر هیچ آرگومان اضافی وجود نداشت یک پیغام دهد
و اگر آرگومان اضافی وجود داشت، اولی را پرینت کند.
دربرنامهای که در تصویر بالا کد آن را مشاهده میکنید، یک تابع کاستومایز شده به اسم myprintf داریم.
این تابع دو رشته (آرایهای از کارکترها که به صورت پوینتر در آرگومان ورودی این تابع تعریف شدهاند.)
را به عنوان ورودی دریافت کند. یک شرط if را چک میکند و بر اساس آن، دو شاخه در برنامه ایجاد میکند:
۱-مقدار ۱ را برمیگرداند و یک پیام از نوع رشته (یا آرایهای از کارکترها) با این محتوا Command line argument is empty را داخل آرگومان error کپی میکند.
۲-مقدار ۰ را برمیگرداند و آرگومان از نوع رشته (یا آرایهای از کارکترها) به اسم str را پرینت میکند.
در ادامه خروجی این برنامه را مشاهده میکنید.
برای آشنایی با آرگومانهای به کار رفته در تابع main کد C موجود در تصویر فوق که مربوط به کامند لاین میباشند، به این لینک از دانشگاه واترلو مراجعه کنید.
ذکر چند نکته در تکمیل بخش اول از بحث Wrapper در برنامه نویسی
۱-آن چه در این پست در ارتباط با Wrapper در زبان C مطرح شد،
مستقیماً ابزاری برای تعریف Wrapper نیست.
به کمک این مثال بیشتر “مفهوم” Wrapper در زبان C بیان گردید.
۲-از یک منظر کاربردی در برنامهنویسی، توابع کتابخانهای C را،
میتوان به نوعی یک جور Wrapper برای “فراخوانیهای سیستمی” در نظر گرفت.
در اصل این توابع با ایجاد یک واسط ابسترکشن، توابعی را در اختیار برنامهنویسان قرار میدهند.
در دل توابع بالادستی، توابع سطح پایینتر و “فراخوانیهای سیستمی” وجود دارد.
پس با این رویکرد میتوان این چنین نتیجه گرفت..
مفهوم Wrapper بدون آنکه ما به عنوان برنامهنویس به آن توجه کامل و دقیق داشته باشیم، در کل کار ما وجود دارد.
ما برنامهنویسها در عمل در حال استفاده از کانسپت Wrapper در برنامههای خود هستیم. البته این رویکرد خیلی مفهومی است.
۳-یکی از موارد بسیار مهم Wrapper آن جایی است
که طراح برنامه میخواهد از API های C در قلب برنامهی ++C خود استفاده کند.
میدانیم زبان C یک زبان شیءگرا نمیباشد اما زبان ++C یک زبان شیءگرا است.
فرض کنید برنامهی اصلی که قرار است به زبان ++C نوشته شود.
میتوان به کمک چند کلاس بخشهایی از برنامه که قرار است به زبان C باشد (سابروتینهایی نوشته شده به زبان C) را در اصطلاح Wrap نمود.
۴-در این پست اصلاً بحثی از Wrap کردن یک سابروتین از یک زبان برنامهنویسی در یک برنامه به زبان برنامهنویسی دیگر صحبت نکردهایم.
در پست های بعد در این ارتباط صحبت خواهیم نمود.
جمع بندی بحث های اولیه درباره ی Wrapper
خوب تا این جا با مفاهیم اولیه درباره ی رپر Wrapper آشنا شدیم.
احساسی که باید در ما به عنوان برنامه نویس از رپر Wrapper ایجاد شود، مهمتر از نگاه ابزاری به آن است.
اگر بخواهیم برای جمع بندی موارد مطرح شده در این پست، به دسته بندی انواع Wrapper در برنامه نویسی بپردازیم، به موارد زیر باید اشاره کنیم.
- همان طور که در بالا اشاره شد، Wrapper یک مفهوم برنامه نویسی است. در مثال ما یک سابروتین در دل برنامه ی اصلی به صورت Wrapped یعنی پوشیده شده مورد استفاده قرار گرفته است.
- یکی از موارد کاربرد رپر Wrapper که در بالا هم به آن اشاره شده است؛ توابع کتابخانهای استاندارد زبان C هستند. چنانچه طرح گردید، این توابع بین توابع سطح پایینتر و فراخوانیهای سیستمی که التزام به دسترسی به کرنل سیستم عامل را ایجاب میکنند، با بدنهی برنامه، یک ابسترکشن ایجاد میکنند.
- یکی دیگر از کاربردهای رپر Wrapper، استفاده از API های C در برنامههای ++C است. این موضوع به این دلیل اهمیت دارد که C شیءگرا نیست اما ++C شیءگرا میباشد.
- کابرد دیگر رپر Wrapper در زبانهای برنامه نویسی شیءگرا مثل JAVA است. البته در این مورد قرار نیست بخشی از سابروتین Wrap شده در دل برنامهی اصلی که مثلاً به زبان JAVA نوشته شده است، از یک زبان دیگر باشد. در این مورد منظور ما از سابروتین Wrap شده بخشی از برنامه است که به کمک Class های موسوم به Wrapper پوشیده شده است. در این باره در پست های آتی بیشتر صحبت میکنیم.
- موارد حرفهای تری که….
برای دریافت فایل برنامه به زبان C عضو کانال تلگرام ما به نشانی آی دی LabVIEW_Workshop@ شوید.
در صورت علاقه به مشاهده ی آموزش های تصویری لب ویو در این سایت ، عضو سایت شوید تا از دهها آموزش استفاده کنید.
سلام چطور میتونم یه کد که به زبان پایتون و با کتابخانه هایی مثل numpy نوشته شده را در java فراخوانی کنم؟ با رپر میشه این کار را انجام داد؟ چطور میشه پردازش هاییی را در پایتون انجام داد و نتایج را با جاوا نشان داد؟
سلام رپر به معنای عام یک مفهوم هست، یعنی اینکه داخل یک بخش از برنامه، بتوان به زبان دیگری کد نوشت و از قابلیتهای آن زبان استفاده کرد. من تلاش کردم در توضیحات خودم، این مفهوم رو تا جای ممکن توضیح بدهم. از اینکه بگذریم، در مورد سؤال شما که مربوط به دو زبان برنامهنویسی Java و Python هست باید بگم، روشهای مختلفی وجود دارد؛ اما در این بین بنده میتونم به Jython اشاره داشته باشم. ذر همین ارتباط میتونید به سایت ِ https://www.jython.org/ سر بزنید. با اینکه Jython در واقع بستری برای پیادهسازی پاتون در جاوا است، اما ممکن… Read more »
خواهش میکنم