مقدمه‌ای بر زبان آقای هاشمی

زبان آقای هاشمی تلاشی است برای تولید یک زبان برنامه‌نویسی بومی، مناسب برای کسانی که قصد شروع برنامه نویسی را دارند.

اولین بار در تاریخ ۲۸ آذر ۱۳۹۸ در توییتی از طرف خالق این زبان به وجود آمدن آن به اطلاع عموم رسید. دلیل انتخاب نام آقای هاشمی برای این زبان، علاقه شدید خالق زبان به شخصیت‌های کتاب تعلیمات اجتماعی دبستان، که با نام خانواده آقای هاشمی شناخته می‌شوند، عنوان شده.

هر چند به نظر می‌اید که فعالیت آقای هاشمی در اداره پست ایران نیز تاثیر بسزایی در انتخاب نامش برای این زبان را ایفا کرده است!

در بخش‌های بعدی این مستندات با خود زبان و ویژگی‌های منحصر به فردی که آقای هاشمی در اختیار قرار می‌دهد آشنا خواهیم شد.

تصویری از زندگی خصوصی آقای هاشمی

شروع کار با زبان آقای هاشمی

.نصب آقای هاشمی بسیار ساده است، شما تنها نیاز دارید که فایل اجرایی آخرین نسخه را از گیتهاب آقای هاشمی دانلود .کنید

لطفا توجه داشته باشید که به طور پیش فرض این فایل اجازه اجرا ندارد. پس اولین مرحله اجازه اجرا دادن به این فایل خواهد بود.

chmod +x hashem

برنامه‌های قابل اجرا توسط این زبان باید در فایل‌هایی با پسوند file_name.hashem ذخیره شده باشند.

حالا میتونیم با هم برنامه درود جهان‌ را با این زبان بنویسیم تا بیشتر با سینتکس این زبان آشنا بشیم. ابتدا فایلی با نام dorood-jahan.hashem ایجاد کنید که حاوی کدی که در پایین آمده باشد.

bebin azinja() {
  bechap("Dorood Jahan");
}

همانطور که مشاهده می‌کنید ساختار زبان آقای هاشمی بسیار مشابه با زبان‌های شبه C است.

برای اجرای برنامه بالا تنها کافی است آدرس فایل را به ‍‍‍‍‍‍hashem بدهید.

hashem dorood-jahan.hashem

اگر در اجرای مراحل بالا مشکلی داشتید حتما برای آقای هاشمی ایشو بسازید تا بتونیم زودتر مشکلات رو حل کنیم.

تعریف متغیر

برای تعریف متغیر تنها کافی است که نام متغیر را نوشته و سپس آن را مقداردهی کنیم.

nam = "Mr ";
famil = "Hashemi";  
tedadeBache = 3;  
moteahel = 1==1;
mabda = "Kazeroon";  
maghsad = "Neishaboor";
  
bechap("Aghaye "+nam+famil+", "+tedadeBache+" farzand darad.");
// => ke chap khahad kard "Aghaye Mr Hashemi, 3 farzand darad."  

برای افزودن کامنت در این زبان از دو شیوه استفاده می‌گردد. یا استفاده از دو اسلش برای افزودن جزئیات (مانند نتیجه بچاپ در کد بالا) یا خط مورب و یک ستاره برای یک فضای کامنت شده. توجه: قسمت های کامنت شده تنها برای مطالعه انسان و غیر قابل پردازش برای زبان آقای هاشمی هستند

از خط مورب و دو ستاره برای تولید مستندات استفاده می‌شود.

// yek comment   
/*
in teke az code pardazesh nakhahad shod   
*/
/**  
 * baraye neveshtan e mostanadat  
 */

نظارت بر جریان برنامه

با استفاده از دستوراتی همچون اگر age و تا ta می‌توانیم بر جریان برنامه نظارت داشته باشیم.

contron flow

به شکل نمونه در برنامه زیر در صورت درست بودن شرط متن چاپ شده خروجی doroste خواهد بود ولی در صورت نادرست بودن dorost nist, ye fekri barash bokon چاپ خواهد شد

    age (1==1) bood {  
        bechap("doroste");  
        } na? {  
        bechap("dorost nist, ye fekri barash bokon");  
    }  
// => ke chap khahad kard "doroste"    

با استفاده از کلیدواژه تا تا زمانی که شرط ما صحیح باشد خطوط نوشته شده در داخل حلقه اجرا خواهد شد. در حلقه زیر اعداد از یک تا ۱۰ با یکدیگر جمع شده و نتیجه در یک متغیر ذخیره می‌گردد.

adadeMan = 0;  
majmoo = 0;  
  
ta (adadeMan<11) bood {  
    majmoo = majmoo + adadeMan;  
    adadeMan = adadeMan + 1;  
}  
  
bechap("majmoo barabar ast ba: "+majmoo);  

تعریف تابع

توابع در زبان برنامه‌نویسی آقای هاشمی با bebin تعریف می‌شوند. در ادامه ساختار یک تابع را مشاهده می‌کنید. پس از کلمه‌کلیدی bebin نام تابع، در اینجا esme_functione_bebin نوشته شده است. سپس ورودی‌های مورد نظر برای تابع را داخل پرانتز مشخص می‌کنیم. توجه داشته باشید که مقادیری که درون پرانتز تعریف شده است، برای اسکوپ داخلی تابع، قابل دسترسی هستند و اصطلاحا local هستند.

bebin esme_functione_bebin(voroodi) {
    khorooji = voroodi; 
    //    دستورهای مورد نظر برای این تابع تا 
    //    پیش از رسیدن به دستور «بده» نوشته می‌شود
    bede khorooji;
}

تعریف تابع، مشابه چیزی که در بالا مشاهده می‌کنید،‌به خودی خود قرار نیست نتیجه‌ای در بر داشته باشد. بنابرین، می‌بایست تابع مورد نظر «صدا زده شود» یا «call» بشود. به این ترتیب ما خواهیم توانست بارها از قابلیت تابع در کدهای خودمان استفاده کنیم بدون آن‌که مجبور شویم تمام دستورات را بنویسم. فقط کافی است تابع صدا زده شود.

تابع azinja

در زبان برنامه‌نویسی آقای هاشمی، یک تابع خاص وجود دارد به نام azinja و این نام برای شروع برنامه‌ها رزرو شده است. به عبارت دیگر، azinja زمانی که یک فایل .hashem را در خط فرمان سیستم عامل خودتان اجرا می‌کنید، هسته‌ی زبان آقای هاشمی باید نقطه‌ی شروعی را انتخاب کند و به اجرای برنامه بپردازد. این سوال که هسته زبان آقای هاشمی ازکجا شروع می‌کند پاسخش bebin azinja است.

مثال

یک نمونه تابع برای جمع دو عدد. این کد در فایلی با نام jam_adad_ha.hashem ذخیره می‌کنیم.

bebin jam(alef, be) {
    javab = alef + be; 
    // هر بار جواب مورد نظر به بیرون از تابع فرستاده می‌شود
    bede javab;
}

bebin azinja() {
    ye_adad = 100;
    ye_adad_dige = 200;
    natije = jam(ye_adad, ye_adad_dige);
    bechap(natije);
}

اجرای همین قطعه کد زبان هاشمی و نتیجه آن را در ادامه می‌بینید.

user@hashemi-lang-pc $ hashemi ./jam_adad_ha.hashem
300
user@hashemi-lang-pc $

توابع بازگشتی

توابع بازگشتی یا recursive به توابعی گفته می‌شود که خودشان را صدا می‌زنند. در ریاضیات از این حالت برای تعریف تابع فاکتوریل و یا برای نمایش سری فیبوناچی استفاده می‌شود.

n! := 1             (if n := 0)
n! = n * (n-1)!     (otherwise)

پیاده سازی کد بازگشتی فاکتوریل در زبان برنامه نویسی آقای هاشمی :

bebin factorial(n) {
   age (n < 1) bood {
      bede 1;
   }
   bede factorial(n-1) * n;
}

bebin azinja() {
    f = factorial(10);
    bechap(f);
}

خروجی:

user@hashemi-lang-pc $ hashemi ./factorial.hashem
3628800
user@hashemi-lang-pc $

استفاده حرفه‌ای تر از توابع

برای محاسبه ترکیب ریاضی و محاسبه تعداد حالت های ممکن برای انخاب k عضو از یک مجموعه n عضوی فرمول زیر را به کار می‌بریم

image

اما در این فرمول سه بار از فاکتوریل استفاده شده است و ما در یک تابع جدید، تنها کافی است سه بار تابع factorial مثال قبلی را فراخوانی کنیم

bebin factorial(n) {
   age (n < 1) bood {
      bede 1;
   }
   bede factorial(n-1) * n;
}

bebin tarkib(k, n) {
    soorat = factorial(n);
    makhraj = factorial(k) * factorial(n-k);
    javab = soorat / makhraj;
    bede javab;
}

bebin azinja() {
    f = tarkib(5, 2);
    bechap(f);
}

تعریف رشته‌های متنی

تعریف رشته‌ها

برای تعریف کردن یک رشته متنی (string) می‌توان از علامت " استفاده کرد. شروع و پایان یک رشته متنی می‌بایست با کاراکتر نقل قول (کوتیشن مارک یا " مشخص شود). رشته‌های متنی در زبان برنامه نویسی آقای هاشمی، از استاندارد utf-8 پشتیبانی می‌کنند. به عنوان نمونه، نحوه کار با رشته‌ها را در نمونه کد زیر مشاهده می کنید:

// این فایل را با اسم strings_basic.hashem ذخیره می‌کنیم
bebin azinja() {
    payam = "درود جهان";
    bechap(payam);

    matn = "dorood jahan";
    bechap(matn);
}

خروجی

user@hashemi-lang-pc $ hashem ./strings_basic.hashem
درود جهان
dorood jahan
user@hashemi-lang-pc $

کاراکتر‌های خاص

در صورتی که بخواهیم داخل رشته، از کاراکترهای خاص استفاده کنیم، این کاراکتر‌ها را با علامت فرار (اسکیپ، خط مورب رو به عقب، و یا بک-اسلش \) نمایش می‌دهیم. در مثال زیر، بین کاراکترهای درود و جهان یک کاراکتر \n مشاهده می‌کنید. این کاراکتر به معنای خط جدید بوده (new line) و در خروجی نیز بخش دوم در خط جدید نمایش داده شده است.

// این فایل را با اسم strings_scapes.hashem ذخیره می‌کنیم
bebin azinja() {
    payam = "درود\nجهان";
    bechap(payam);

    matn = "1\tdoroodjahan";
    bechap(matn);
}

خروجی

user@hashemi-lang-pc $ hashem ./strings_scapes.hashem
درود
جهان
1   dorood jahan

چند نمونه از کاراکتر‌هایی که با علامت فرار \ نمایش داده می‌شوند را در جدول زیر مشاهده می‌نمایید.

توضیح      کاراکتر
======== =================
 \n         خط جدید
 \t           tab

تعریف بلوک متنی

در صورتی که بخواهیم متن طولانی‌ای در قالب رشته بنویسیم، اضافه کردن \n از خوانایی هاشمی‌اسکریپت های نوشته شده می‌کاهد. بنابرین، راهکار جایگزین می تواند استفاده از سه علامت نقل قول در آغاز و پایان رشته باشد ("""). در این حالت قادر خواهیم بود داخل متن خط جدید تعریف کنیم (کلید Enter بزنیم)

// این فایل را با اسم textarea.hashem ذخیره می‌کنیم

bebin azinja() {
  matn_toolani = """شعر از مولانا
خنک آن قمار بازی که بباخت آنچه بودش
بنماند هیچش الا هوس قمار دیگر
  """;
  bechap(matn_toolani); 
}

خروجی

user@hashemi-lang-pc $ hashem ./textarea.hashem
شعر از مولانا
خنک آن قمار بازی که بباخت آنچه بودش
بنماند هیچش الا هوس قمار دیگر
  

jfarzand در زبان آقای هاشمی

تعریف jfarzand

قبل از jfarzand به معرفی مختصری درباره json بپردازیم. جی‌سان (به انگلیسی: JSON) مخفف JavaScript Object Notation (نشانه‌گذاری شیء جاوااسکریپت)، یک استاندارد باز متنیِ سبک برای انتقال داده‌ها است به گونه‌ای که برای انسان نیز خوانا باشد. جی‌سان از زبان اسکریپت‌نویسی جاوااسکریپت در نشان‌دادن ساختمان داده‌های ساده و آرایه‌های انجمنی مشتق شده‌است. با وجود ارتباط عمیقی که با جاوااسکریپت دارد، جی‌سان مستقل از زبان است و مفسرهایش تقریباً برای هر زبانی موجود هستند.

در زبان آقای هاشمی، با تاکید بر نفی سکسیزم و جنسیت زدگی، کلمه son که منحصرا به فرزند ذکور اشاره می‌کند، حذف گردیده و farzand جایگزین آن شده است.

استفاده از jfarzand

// این فایل را با اسم jfarzand_usage.hashem ذخیره می‌کنیم
bebin azinja() {
    object = jfarzand("""{"name":"Mr.Hashemi"}""");
    bechap(object.name);
    bechap(object.x);
}

خروجی

user@hashemi-lang-pc $ hashem ./jfarzand_usage.hashem
Mr.Hashemi
POOCH

همان‌طور که مشاهده می‌کنید، استفاده از jfarzand از طریق فضای نام نیز ممکن است. چنان چه به کلیدی از یک شئ jfarzand اشاره شود،‌در حالی که کلید مذکور پیش‌تر تعریف نشده باشد، خروجی POOCH خواهد بود.

Boolean در زبان آقای هاشمی

نوع داده Boolean

زبان برنامه‌نویسی آقای هاشمی اجازه تعریف expression‌هایی که نتیجه آنها مقداری Boolean است را به برنامه‌نویسان می‌دهد. اما تا به این لحظه چون لیترالی برای نمایش مقدار نیافته بودیم، امکان انتساب مقدار به صورت مستقیم وجود نداشت.

تیم طراحی زبان برنامه‌نویسی آقای هاشمی به این نتیجه رسیده که مانند بقیه زبان‌ها از کلمه کلید false استفاده کند و جایگزینی برای آن مشخص نکند ولی مقدار true در زبان برنامه‌نویسی آقای هاشمی وجود نخواهد داشت، چرا که این لیترال بیانگر این حقیقت نیست که مقدار قطعیت ۱۰۰ درصدی دارد. به همین دلیل تصمیم گرفته شد این کلمه کلیدی با کلمه کلیدی zirsakht جایگزین شود.

دلیل انتخاب کلمه zirsakht

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

از این روی تصمیم گرفتیم به پاس تقدیر از زحمات شبانه‌روز کارمندان این شرکت، و با کمال میل، از لیترال zirsakht برای نمایش مقدار درست در زبان برنامه‌نویسی آقای هاشمی استفاده کنیم.

مثالی از استفاده از زیرساخت در کد