هاربر، دی‌کامپایلر ساده‌‌ای که خودمان آن را ساختیم

07 دی 1398 هاربر، دی‌کامپایلر ساده‌‌ای که خودمان آن را ساختیم

روابط عمومی شرکت ایدکو (توزیع کننده محصولات کسپرسکی در ایران)؛ هر چند وقت یکبار درخواستی دریافت می‌کنیم که ما را به فکر فرو می‌دارد. ابزارهای موجود معمولاً کفاف این نوع درخواست‌ها را نمی‌دهد و درست در همین نقطه است که باید برای حل این «مشکل» ابزارهای سفارشی و مخصوص به خود را بسازیم. یکی از همین درخواست‌هایی که خدمتتان گفتیم برایمان اوایل سال 2018 پیش آمد، وقتی که یکی از مشتریان‌مان –یک مؤسسه‌ی مالی- از ما خواست تا برایش نمونه‌ای را تحلیل کنیم. این مسئله به خودیِ خود چیز نامعمولی نیست- ما همیشه درخواست‌هایی از این قِسم دریافت می‌کنیم- اما آنچه در مورد این درخواستِ بخصوص عجیب بود این بود که نمونه‌ی مذکور مبتنی بر هاربر[1] (Harbour) نوشته شده بود.

هاربر در حقیقت یک زبان برنامه‌نویسی طراحی‌شده توسط آنتونیو لینارز است که اولین بار در سال 1999 عرضه شد. این زبان برنامه‌نویسی بر اساس سیستم قدیمی Clipper بوده و در اصل به منظور ساخت برنامه‌های پایگاه اطلاعاتی مورد استفاده قرار می‌گیرد.

درک داخلی‌های هاربر

بگذارید از تست‌های مخزن هاربر عبارت «سلام، دنیا» یا همان Hello, world را به عنوان نمونه‌ای مد نظر قرار دهیم- hello.prg. 

 

 هاربر، پیام Hello, world را به داخلی پرینت می‌کند. برای انجام این کار شما می‌بایست جهت اجرای کد یک باینری هاربر بسازید (همچنین راه‌های دیگری هم برای اجرای آن بدون ساخت باینری وجود دارد اما ما این روش را از این جهت برگزیریم چون نمونه‌ی دریافت‌شده‌ی یک فایل قابل‌اجرا بود).

کامپایل کردن درست مثل تماس گرفتن آسان است:

hbmk2.exe hello.prg

این فرمان کد C را تولید و کد C را در فایل قابل‌اجرای نهایی کامپایل خواهد کرد. کد C تولید شده برای hello.prg را می‌توان در شکل 2 یافت. 

 

 

شما می‌توانید مشاهده کنید که تابع MAIN تابع ماشین مجازی هاربر (HVM) را با این پارامتر‌ها شروع کرده است: یکی pcode، دیگری کد از پیش کامپایل‌شده‌ی هاربر و در ادامه نمادها که توسط ماکرویی متفاوت بالای تابع MAIN تعریف شده‌اند. همانطور که می‌توانید تصور کنید، pcode (کد پرتابل) حاوی دستوراتی است که HVM تفسیرشان می‌کند. شما می‌توانید در لینک زیر توضیح رسمی این pcode را پیدا کنید.

https://github.com/harbour/core/blob/master/doc/pcode.txt

بعد از اینکه برنامه‌ی C کامپایل شد (در اینجا این برنامه توسط MINGW انجام شده است)، ما تقریباً همان ساختارها را در داخلش نیز پیدا می‌کنیم: جدول نماد و  pcode (شکل 3 و 4 به ترتیب). 

 

 

 

 

پروسه‌ی دی‌کامپایل[2]

بیایید برگردیم به نمونه‌مان. اکنون می‌دانیم که باید در فایل قابل‌اجرا به دنبال pcode‌ها و نمادها باشیم و ببینیم کدام opcodeها به کدام دستور تعلق دارد. اگر این کار را انجام دهیم، می‌توانیم تا حدی ساز و کار این برنامه را درک کنیم. همانطور که ممکن است حدسش را زده باشید تا به حال ابزاری با چنین کارایی به این راحتی‌ها قابل‌دسترسی نبوده است. بنابراین، ما خود برای ساخت آن آستین بالا زدیم.

هدف دی‌کامپایلرِ ما این است که bytecode بتواند به دست انسان‌ خوانده شود. ما انتخاب‌مان این بود که شبه‌کدِ حاصله را در همگذار[3] با C ترکیب شود (هنوز این خوانش در بعضی‌جاها سخت می‌شود اما برای مقاصدی که مدنظر داشتیم قابل‌خواندن بود).

 

 

 

شکل شماره 5 هم نشان می‌دهد هاربری کامپایلر مبتنی بر ماشین پشته‌ای[4] است.

اولین آرگومان فشار[5]، نام تابع است که بعدِ آن متغیرها با فشار جاگذاری شده و به تعاقب‌شان نیز فرمان call 1 می‌آید. درست در همینجاست که 1 می‌شود عددِ تابع پارامترهایی که قرار است پاپ‌آپ شوند.

بنابراین خطوط فوق می‌توانند در شبه‌کد C اینچنین تفسیر شوند:

QOUT("Hello, world!"); 

امیدواریم این دی‌کامپایلر تحلیل نمونه‌هایی که به زبان هاربر نوشته شده‌اند را کمی آسان‌تر کرده باشد.

 

[1] هاربر در واقع یک نرم‌افزار رایگان و باز چند پلت‌فرمه، چند رشته‌ای، اوبژه-محور و یک زبان برنامه‌نویسیِ قابل اسکریپت کردن است که به طور وارونه‌ای با زبان‌های xBase سازگاری دارد. هاربر شامل یک کامپایلر و آرشیوهای ران‌تایم (زمان اجرا) به همراه رابط کاربری چندگانه، پایگاه اطلاعات و یک‌اندهای I/O، سیستم سازه‌ای خودش و نیز مجموعه‌ای از آرشیوها و بایندینگ‌ها (برای API‌های محبوب) می‌شود.

[2] Decompiler، کد برنامه را که در سطح پایینی از انتزاع قرار دارد (معمولاً طراحی شده‌اند که رایانه آن را بخواند) را به شکلی تبدیل می‌کند تا سطح بالایی از انتزاع داشته باشد (معمولاً طراحی شده‌اند که انسان آن را بخواند).

[3] assembler

[4] Stack machine، یک کامپیوتر واقعی یا شبیه‌سازی شده‌است که به جای استفاده از ثبات‌های تکی، از یک پشته برای ارزیابی زیردستورها در برنامه استفاده می‌کند.

[5] push argument

 

منبع: کسپرسکی آنلاین (ایدکو)

کسپرسکی اسم یکی از بزرگترین شرکتهای امنیتی و سازنده آنتی ویروس است که برخی از کاربران اشتباهاً این شرکت و محصولات آنتی ویروس آن را با عناوینی نظیر کسپرسکای،کاسپرسکی، کسپراسکای، کسپراسکای، و یا کاسپراسکای نیز می‌شناسد. همچنین لازم به ذکر است مدیرعامل این شرکت نیز یوجین کسپرسکي نام دارد.

محصولات مرتبط

  • Kaspersky Internet Security for Android

    امنیت پیشرفته‌ای که همیشه همراه شماست بخش مهمی از زندگی اکثر ما اکنون روی گوشی‌ها و تبلت‌هاست- پس به امنیت موبایلی نیاز دارید که شما را همیشه امن نگه ...

    7,080,750 ریال
    خرید
  • Kaspersky Cloud Password Manager

    Kaspersky Cloud Password Manager ابزار مدیریت کلمه عبور ابری کسپرسکی (KCPM) ضمن ذخیره ایمن تمامی کلمات عبور مورد استفاده شما برای وبسایت‌ها، اپلیکیشن‌ها، و شبکه‌های اجتماعی آنها را در تمامی ...

    10,624,500 ریال
    خرید
  • Kaspersky Safe Kids

    شما می توانید بر ارتباطات اینترنتی کودکان از قبیل فعالیتهای عمومی در فیسبوک، کنترل تماسها و پیامها از طریق دستگاههای اندرویدی نظارت داشته باشید. کمک شما به کودکان بهترین راهنمایی برای آنها ...

    10,624,500 ریال
    خرید
  • Kaspersky Small Office Security

    محافظت در حین کار Kaspersky Small Office Security به طور خاص برای سازمان‌هایی طراحی شده است که 5 تا 50 دستگاه کامپیوتر در خود جای داده‌اند. نصب آن بسیار آسان است؛ مدیریت آن ...

    25,515,000 ریال
    خرید
  • Kaspersky Security Cloud Personal

    تمام اپ‌های امنیتیِ ما در دستانتان. به کل خانواده‌ی اپ‌های ما برای دسکتاپ و موبایل دسترسی پیدا کنید. از آنتی‌ویروس گرفته تا ابزارهای حریم خصوصی و اجرایی، هر کدام را به میل ...

    70,868,250 ریال
    خرید
  • Kaspersky Standard

    سیستم امنیتی بهبودیافته به همراه تقویت‌کننده عمکرد دستگاه طرح امنیتی استاندارد ما، نه تنها سیستم امنیتی قدرتمندی را برای انواع ویروس‌ها، بدفزارها و باج‌افزارها ارائه می‌دهد ...

    20,047,500 ریال
    خرید
  • Kaspersky Plus

    امنیت. کارایی. حریم خصوصی. همه در یک برنامه با کاربری آسان کسپرسکی پلاس با ارائه امنیت سایبری نسل بعد، شما در برابر ویروس‌ها، باج‌افزارها و بدافزارهای جدید محافظت کند - بدون ...

    28,748,250 ریال
    خرید
  • Kaspersky Premium

    حفاظت کامل از دستگاه ها، حریم خصوصی و هویت شما با محصول Kaspersky Premium تمام نیازهای امنیتی خود و خانواده‌تان را پوشش دهید. حفاظت پیشرفته ...

    30,753,000 ریال
    خرید

نظر خودتان را ارسال کنید


کاربر گرامی چنانچه تمایل دارید، نقد یا نظر شما به نام خودتان در سایت ثبت شود، لطفاً وارد سایت شوید.
*نظر
کلیه حقوق مادی و معنوی این سایت محفوظ و متعلق به شرکت گسترش خدمات تجارت الکترونیک ایرانیان است و هر گونه کپی برداری از آن پیگرد قانونی دارد