زبان برنامه نویسی Charm

Charm یک زبان برنامه نویسی کامپیوتری است که در اوایل ۱۹۹۰ ابداع شده‌است و شباهت‌هایی به زبان‌های RTL/2،  Pascal و C دارد و علاوه بر آن ویژگی‌های منحصر به فرد خود را نیز دارد. زبان Charm توسط یک دستور زبان مستقل از متن تعریف می‌شود که می‌تواند توسط تجزیه کننده کاهشی بازگشتی پردازش شود، همانطوری که در کتاب‌های اصلی طراحی کامپایلر توضیح داده شده‌است.

مجموعه‌ای از ابزارهای Charm شامل یک کامپایلر، اسمبلر و پیوند دهنده برای پلتفرم سیستم عامل Acorns's RISC در دسترس قرار گرفت. جذابیت بازسازی شده برای پلتفرم‌های سیستم عامل RISC متعاقباً در مجله Archive بررسی شد.

زبان برنامه‌نویسی Charm بیش‌تر در کتاب الکترونیکی Programming in Charm on the Raspberry Pi توضیح داده شده‌است.

گرامر 

تعریف دستور زبان Charm در ساختار Backus-Naur به همراه نمونه‌های توصیفی از ساختارهای Charm در صفحه زبان Charm تعریف شده‌است.

زبان دارای ساختار بلاکی است و هر بلاک با یک کلمه کلیدی زبان معرفی می‌شود که توصیفی از اعمال انجام شده در بلاک است، به عنوان نمونه.for ,while ,repeat (تکرار)،case ,if (انتخاب). هر بلاک توسط جداکننده‌های "{" و "}" محصور شده‌است. علاوه بر این، خطوط زبان در یک بلاک معمولاً برای وضوح، دارای تو رفتگی هستند، اگرچه این مورد نیاز نیست زیرا فضای خالی (space) نادیده گرفته می‌شود.

هر متن منطبق با گرامری، مجموعه‌ای از کدهای اجرایی و داده‌های مرتبط را نشان می‌دهد که می‌تواند توسط مجموعه ابزار Charm به عنوان مولفه‌ای هنگام تولید یک برنامه، که می‌تواند تحت یک سیستم عامل اجرا شود و از خدماتی که برای انجام کارهای مفیدی مانند پردازش داده‌ها یا تعامل با کاربران از طریق رابط کاربری گرافیکی (GUI) ارائه می‌دهد، استفاده کند.

انواع داده‌ها 
Charm یک زبان با تایپ قوی است، اما برخی از تبدیل‌های ضمنی بین انواع عددی و ممیز شناور را امکان‌پذیر می‌کند. انواع متغیرهای اساسی زیر پشتیبانی می‌شوند:

int – اعداد صحیح
char –کاراکترها
boolean – مقادیر بولین (صحیح و غلط)
real – اعداد ممیز شناور

انبوه‌های داده از همان نوع ممکن است با استفاده از عبارت اعلام شده و به صورت استاتیکی به کمک کلمه کلیدی array مقدار دهی اولیه شوند و حتی ممکن است چند بعدی باشند. انواع مختلف ممکن است با استفاده از کلمه کلیدی record اعلان شوند و برای چنین اعلانی مجاز است که یک union از فیلدهای record را تعریف کند که از نظر تخصیص ذخیره‌سازی روی یکدیگر قرار دارند. ماژول‌ها همچنین ممکن است ترکیبی از اعضای داده ایستا و پویا را جمع‌آوری کنند. نمونه‌هایی از رکوردها و ماژول‌ها (فقط محتوای پویا) می‌توانند در پشته یا روی هرم از طریقnew operator مقداردهی اولیه شوند. ماژول‌ها همچنین ممکن است یک تابع سازنده (constructor) را تعریف کنند (~new برای مقداردهی اولیه داده‌های پویا و متناظر ~delete deconstructor برای انتشار منابع به روشی مشابه زبان C++).

ارجاع دادن 
داده‌ها یا رویه‌های موجود در محدوده یک ماژول ممکن است در اپلیکیشن نهایی global باشند که این امر به کمک کلمه کلیدی export انجام‌پذیر است. اگر یک ماژول بخواهد از یک رویه یا داده از ماژول دیگر Charm ارجاع شود، این کار را با استفاده از کلمه کلیدی import صورت می‌گیرد. ماژول‌ها ممکن است حاوی متغیرهای عضو مبتنی بر نمونه باشند که از طریق رویه‌های اعلام شده با آن قابل دسترسی هستند که در این صورت با کلمه کلیدی dynamic از طریق پارامتر اول ضمنی اشاره گر this مشخص می‌شوند.

ارجاع به ساختارها و رویه‌های داده، ممکن است با استفاده ازکلمه کلیدی ref صورت گیرد. اینها را می‌توان با استفاده ازکلمه کلیدی val غیر ارجاع شوند. هنگام استفاده از متغیرهای مرجع، عملگرهای مقایسه در دسترس هستند تا بررسی کنند که آیا دو متغیر مرجع به یک مورد از داده‌ها اشاره دارند یا خیر (:=:) یا اینکه اصلاً داده‌هایی که به آن اشاره می‌کنند یکسان است (=).

مثال

برنامه کلاسیک اورجینال Hello world ای که در Charm نوشته شده باشد عبارت است از:ext proc write_string (ref array char);
module hello;
ent proc start ();
write_string ("Hello world"); 
end_proc;
end_module;و آخرین نسخه معادل به دنبال تغییرهای سینتکس تکاملی زبان عبارت است از:import lib.Out;
module Hello {
export proc ~start (){
Out.vdu.str("Hello world").
nl();
    }
}

مجموعه ابزار 
مجموعه ابزاری که در پیاده‌سازی انتظار می‌رود که فراهم کنند، یک کامپایلر و یک اسمبلر برای تولید فایل‌های شی از کد منبع Charm و کد منبع اسمبلر است که سپس می‌توانند به همراه فایل‌های پشتیبانی کتابخانه و زمان اجرا به یکدیگر پیوند داده شوند تا یک برنامه اجرایی تولید کنند.

در زمان نگارش تنها یک مجموعه ابزار نصب Charm (رایگان) برای دانلود موجود است. ابزارها خودشان به زبان Charm نوشته شده‌اند و کد منبع تحت شرایط مجوز عمومی عموم (GNU) در دسترس است. آنها بر روی کامپیوترهای شخصی سیستم عامل RISC و پلتفرم‌های دارای پردازنده‌های ARM (مانند Raspberry Pi) و شبیه‌سازهای سیستم عامل RISC که بر روی پلتفرم‌های ویندوز یا لینوکس (مانند RPCEmu) میزبانی می‌شوند، اجرا می‌شوند. تولید کد برای عمل‌های مربوط به ممیز شناور با دقت مضاغف به کمک سخت‌افزار برای پلتفرم‌های مبتنی بر تراشه‌های ARM که از معماری همکاری پردازنده VFP نسخه ۲ پشتیبانی می‌کنند، پشتیبانی می‌شود.

کامپایلر 
کامپایلر Charm یک کامپایلر بازگشتی است که کد منبع Charm را برای تولید چهار برابر فرم نتیجه تجزیه می‌کند. (: = lhs op rhs) در یک زبان میانی که از اعمال حسابی، منطقی و کنترل جریان پشتیبانی می‌کند. داده‌ها به صورت موقت ذخیره می‌شوند که به رجیسترها و مکان‌های حافظه در back end کامپایلر اختصاص داده می‌شوند. دوback end درحال حاضر وجود دارند، یکی زبان اسمبلی موتورولا ۶۸۰۰۰ و دیگری معماری ARM را تولید می‌کند.

خروجی چهارگانه از مثال hello world به صورت زیر است:param l1$

call write_string[proc (ref array char) void]و خروجی اسمبلر:string "hello"

xdef _start

align

_start

xref _write_string

stmfd sp!,{rp} adr r0,_l1$

bl _write_string

ldmfd sp!,{pc}

address

align

_l1$

string "Hello world"

direct

endدر اغلب نسخه‌های اخیر Charm، رویه‌های I/O به ماژول‌های داخل و خارج تقسیم شده‌اند. سایر رویه‌های استاندارد کتابخانه در مجموعه‌ای از رکوردها با ارجاع‌های رویه به عنوان فیلدها سازماندهی شده‌اند. به عنوان بخشی از این سازماندهی مجدد، روش write_string اکنون از طریق ماژول کتابخانه زمان اجرا Out، از طریق مرجع عضو استاتیک .vdu به عنوان روش str، فراخوانی می‌شود، یعنی در مثال hello world بالا، عبارتwrite_string ("Hello world")، تبدیل به Out.vdu.str ("Hello world")می‌شود.

اسمبلر 
اسمبلر یادداشت‌های دستورها، اعلان‌های داده و دستورالعمل‌ها را می‌پذیرد و یک فایل شی، ای می‌سازد که حاوی اطلاعاتی است که به راحتی توسط CPU پردازنده هدف قابل درک است، به ویژه دستورالعمل‌های کد کد گذاری شده به صورت باینری (دودویی).

پیوند دهنده 

تنها و فقط ماژول‌هایی از Charm که برای تشکیل یک برنامه اجرایی پیوند داده شده‌اند باید دارای رویهای باشد که با یکی از امضاها مطابقت داشته باشد:export proc ~start ()

export proc ~start (int argc, ref array ref array char argv)این مشابه تابع اصلی در زبان های C و جاوا است. دراینجا argc شامل تعداد پارامتر های ارسال‌شده در خط فرمان است و argv دارای ارجاع به آرایه‌ای از رشته های argc + 1 می‌باشد (یک رشته به ازای هر پارامتر موقعیتی به ترتیب و یک پایان nil داراست).

علاوه بر این، ماژول‌ ها ممکن است به صورت اختیاری دارای رویه‌های راه‌اندازی و خاموش‌شدن باشند که در هنگام راه‌اندازی و خاموش شدن برنامه فراخوانی شده‌اند که با آثار مطابقت داشته باشند:export proc ~startup ()

export proc ~shutdown ()پیونددهنده هر گونه اطلاعات لازم header که مورد نیاز سیستم عامل است را برای اجرای برنامه اضافه می‌کند و مطمئن می‌شود که کد پشتیبانی اسمبلر کتابخانه زمان اجرا، اجرا می شود که محیط زمان اجرا (اشاره‌گرهای داده و پشته) را تنظیم می کند و کنترل را به رویه ی آغازین برنامه منتقل می‌کند.

یک فایل راهنما (نقشه) که نام همه ماژول‌های مرتبط برای تشکیل برنامه را به همراه داده‌های global و مراجع کد نشان می‌دهد به‌صورت اختیاری تولید می‌شود که می‌تواند توسط دیباگرها (Debuggers) و profilers استفاده شود.

منابع 
 ISBN D-201-10073-8 Aho, Ullman Principles of Compiler Design
 ISBN D-201-10194-7 Aho, Sethi, Ullman Compilers Principles, Techniques and Tools
 Wade, Stephen (June 1996). "Charm or trinket?". Acorn User. pp. 50–51. Retrieved 28 August 2021.
 Wraith, Gavin (January 2012). "The Charm language: a review". Archive. Vol. 23, no. 4. p. 13. Retrieved 2021-08-28.
 June 2013 Kindle e-book Charm Programming on the Raspberry Pi
 Charm RISC OS, language page
 ISBN 0-9512579-0-0 Peter Cockerell ARM Assembly Language Programming

لینک های خارجی 

Charm for RISC OS

Risc PC Emulator

ARM Information Center
زبان‌های برنامه‌نویسی