ساخت زبان برنامه نویسی — آموزش کامل به زبان ساده
افراد بسیاری با یک یا چند زبان برنامه نویسی آشنایی دارند و ممکن است این ایده به ذهنشان خطور کند که چطور میتوان زبان برنامه نویسی اختصاصی خود را ساخت؟ زبان برنامه نویسی در واقع به هر مجموعهای از قوانینی گفته میشود که براساس آنها رشتهها به انواع مختلفی از خروجی به صورت کدهای ماشین تبدیل میشوند. بنابراین میتوان با پیادهسازی چنین ساز و کاری، نسبت به ساخت زبان برنامه نویسی دلخواه خود اقدام کرد. در این مطلب سعی شده است بهطور جامع به این پرسش پاسخ داده شود که چگونه زبان برنامه نویسی بسازیم و تا حد امکان تلاش داشتهایم تا تمام زوایای ساخت زبان برنامه نویسی را پوشش دهیم.
پیش از آنکه به شرح نحوه ساخت زبان برنامه نویسی بپردازیم و به این پرسش پاسخ دهیم که چگونه زبان برنامه نویسی بسازیم ، ابتدا لازم است بدانیم زبان برنامه نویسی چیست. البته پیشتر بهطور جامع، این سوال در نوشتهای مجزا پاسخ داده شده است. بنابراین در این مطلب وارد جزئیات نمیشویم و هر چه خلاصهتر از مقدمه عبور میکنیم.
زبان برنامه نویسی چیست ؟
بهطور خلاصه، به مجموعهای از قوانین از پیش تعریف شده زبان برنامه نویسی میگویند. برای اینکه بتوان از این مجموعه قوانین از پیش تعریف شده بهره برد، لازم است موجودیتی وجود داشته باشد که بتواند آن قوانین را درک کند. چنین موجودیتی در واقع همان کامپایلرها (Compiler)، مفسرها (Interpreter) و سایر موارد هستند. با توجه اینکه مشخص شد ساز و کار زبان برنامه نویسی به چه ترتیب است، حالا میتوان به این سوال پاسخ داد که چگونه زبان برنامه نویسی بسازیم و لذا در ادامه به این بحث پرداختهایم.
چگونه زبان برنامه نویسی بسازیم ؟
برای ساخت زبان برنامه نویسی ابتدا لازم است مجموعه قوانین زبان مورد نظر خود را تعریف و مشخص کنیم و بعد برای اینکه امکان استفاده از این قوانین فراهم شود، میتوان به وسیله یکی از زبانهای برنامه نویسی فعلی، برنامهای را ساخت که بتواند آن قوانین را درک کند و این همان مفسر ما خواهد بود.
در ادامه بهطور خلاصه به شرح مفهوم کامپایلر و مفسر پرداخته شده است. اگرچه به منظور تبدیل کدهای سطح بالا به زبان ماشین، برای هر یک از این دو روش پیشتر مقالههایی جامع در مجله تم آف منتشر شدهاند.
کامپایلر چیست ؟
کامپایلر کدهای سطح بالا را به کدهای زبان ماشین تبدیل میکند و با این کار پردازنده میتواند کدهای ماشین را اجرا کند. کامپایلر C++ نمونه و مثالی از یک کامپایلر به حساب میآید.
کامپایلر چیست و چکار می کند ؟ — برنامه نویسی به زبان ساده
مفسر چیست ؟
مفسر خط به خط در طول برنامه پیش میرود و هر دستور را اجرا میکند.
مفسر در برنامه نویسی چیست؟ — Interpreter به زبان ساده
برای درک بهتر اینکه چگونه زبان برنامه نویسی بسازیم در ادامه به آموزش نحوه ساخت یک زبان برنامه نویسی ساده پرداخته شده است.
معرفی فیلم های آموزش برنامه نویسی
یکی از بهترین شیوههای یادگیری مهارتهای برنامه نویسی استفاده از دورههای آموزش آنلاین است. با استفاده از فیلمهای آنلاین آموزش برنامه نویسی میتوان در هر مکان و هر زمانی به یادگیری ادامه داد. در وب سایت تم آف، یکی از جامعترین و کاربردیترین مجموعه دورههای آموزش برنامه نویسی تهیه و گردآوری شده است. علاقهمندان میتوانند هر یک از دورههای مجموعه برنامه نویسی فراردس را براساس نیاز خود و حوزهای از برنامه نویسی انتخاب که قصد فعالیت در آن را دارند.
در مجموعه آموزش برنامه نویسی تم آف دورههای آموزشی کاربردی و جامعی برای بسیاری از بهترین زبانهای برنامه نویسی مختلف موجود است. در اکثر این دورهها، آموزش زبانهای برنامه نویسی از سطح مقدماتی و از صفر آغاز میشود و تا سطوح بالاتر ادامه پیدا میکند؛ تا جایی که دانشجویان میتوانند پروژهای آزمایشی را با استفاده از آن زبان پیادهسازی کنند. در تصویر فوق تنها تعدادی از دورههای موجود در مجموعه آموزش برنامه نویسی تم آف به عنوان نمونه نشان داده شدهاند.
- برای شروع یادگیری برنامه نویسی و دسترسی به همه فیلم های آموزش برنامه نویسی تم آف + اینجا کلیک کنید.
آموزش ساخت زبان برنامه نویسی بسیار ساده
در این بخش به شرح نحوه ساخت زبان برنامه نویسی بسیار سادهای پرداخته شده است که خروجیهای سُرخابی رنگی را در کنسول چاپ میکند. چون به انگلیسی سرخابی، «Magenta» نامیده میشود، بنابراین، به نظر، نام Magenta برای این زبان برنامه نویسی ساده، برازنده است.
در ساخت این زبان برنامه نویسی ساده، متغیری به نام codes
ایجاد میشود. این متغیر حاوی متنی است که در کنسول با استفاده از این زبان برنامه نویسی جدید به نام Magneta چاپ خواهد شد.
مراحل ساخت زبان برنامه نویسی ساده Magneta
در این بخش برای ساخت زبان برنامه نویسی ساده به نام فرضی Magneta از Node.js (جاوا اسکریپت) استفاده شده است، اما میتوان با همین روش از هر زبان برنامه نویسی دیگری هم استفاده کرد. ابتدا باید فایلی با نام index.js را ساخته و تنظیمات لازم را در آن ذخیره کرد.
class Magenta {
constructor(codes) {
this.codes = codes
}
run() {
console.log(this.codes)
}
}
// For now, we are storing codes in a string variable called `codes`
// Later, we will read codes from a file
const codes =
`print "hello world"
print "hello again"`
const magenta = new Magenta(codes)
magenta.run()
کاری که اینجا انجام شده این است که کلاسی به نام Magneta
اعلان یا تعریف شده است. این کلاس شیئی را تعریف و مقداردهی اولیه میکند که مسئولیت ثبت متنهایی را در کنسول بر عهده دارد که برنامه نویس با استفاده از متغیری به نام codes
برایش فراهم میکند. فعلاً بهطور موقت متغیر codes
مستقیماً در فایلی تعریف شده است که داخلش تعدادی پیام «Hello» وجود دارد.
اگر کدهایی که تا اینجا نوشته شده است را اجرا کنیم، متن ذخیره شده در متغیر codes
در داخل کنسول نوشته میشود. حالا باید چیزی را ساخت که به آن Lexer میگویند.
Lexer چیست ؟
برای پاسخ به این پرسش، بهتر است ابتدا لحظهای به زبان انگلیسی رجوع شود. مثلاً میتوان عبارت زیر را در زبان انگلیسی در نظر گرفت:
How are you?
در جمله یا عبارت فوق، کلمه «How» یک قید به حساب میآید و «you» ضمیر است. علاوهبر این، یک علامت سوال (؟) هم در انتها وجود دارد. در جاوا اسکریپت میتوان هر جمله یا عبارتی مثل عبارت فوق را به تعداد زیادی از اجزای گرامری تقسیم کرد. یک راه دیگر برای تشخیص این بخشها این است که آنها را به توکنهای (نشانه | علامت) کوچکی تقسیم کنیم. برنامهای که متن را به توکنها تقسیم میکند Lexer نامیده میشود.
با توجه به اینکه زبان برنامه نویسی ساخته شده در این بخش از این مطلب بسیار کوچک و خلاصه است، تنها ۲ نوع توکن بیشتر تخواهیم داشت که هر یک دارای ۲ مقدار زیر است:
- keyword
(کلمه کلیدی)
- string
(رشته)
این امکان وجود داشت که از «عبارت منظم» (Regular Expression) برای استخراج توکنها از رشته codes
استفاده کنیم، اما در این صورت، عملکرد برنامه بسیار کند میشد. یک رویکرد بهتر این است که پیمایش در هر یک از کاراکترهای رشته code
با استفاده از حلقه انجام شود و توکنها استخراج شوند. بنابراین لازم است متدی با نام فرضی tokenize
در کلاس Magenta
ایجاد شود که به عنوان Lexer عمل خواهد کرد. تمام کدهای کلاس Magneta
در ادامه آمده است:
class Magenta {
constructor(codes) {
this.codes = codes
}
tokenize() {
const length = this.codes.length
// pos keeps track of current position/index
let pos = 0
let tokens = []
const BUILT_IN_KEYWORDS = ["print"]
// allowed characters for variable/keyword
const varChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_'
while (pos
اگر کدها را در یک ترمینال با دستور node index.js
اجرا کنیم، باید فهرستی از توکنها در کنسول چاپ شوند.
تعریف قوانین و سینتکس ها در ساخت زبان برنامه نویسی
در ساخت زبان برنامه نویسی لازم است بررسی شود آیا ترتیب کدهای نوشته شده از نوعی قاعده نحوی یا سینتکس تبعیت میکند یا خیر، اما ابتدا باید آن قوانین و سینتکسها تعریف شوند. چون زبان Magneta زبان خیلی کوچکی است، تنها یک سینتکس یا قاعده نحوی ساده دارد که آن همه کلمه کلیدی print
است که به دنبال آن یک رشته میآید.
keyword:print string
حالا لازم است متدی با نام فرضی parse
ایجاد شود که با استفاده از حلقه در توکنها پیمایش میکند تا تعیین کند آیا سینتکس معتبری شکل گرفته است یا خیر. اگر این چنین باشد، اقدامات لازم انجام خواهند شد.
class Magenta {
constructor(codes) {
this.codes = codes
}
tokenize(){
/* previous codes for tokenizer */
}
parse(tokens){
const len = tokens.length
let pos = 0
while(pos
به این ترتیب اکنون ساخت زبان برنامه نویسی به اتمام رسیده است و این زبان به درستی کار میکند.
تا اینجا همه چیز روبهراه است، اما اینکه بخواهیم کدها را در یک متغیر رشتهای داشته باشیم، چندان جذاب و جالب نیست. بنابراین، بهتر است کدهای زبان برنامه نویسی Magneta را در فایلی به نام code.m.
ذخیره کنیم. با این کار میتوان کدهای Magneta را از منطق کامپایلر جدا کرد.
از عبارت « .m
» به عنوان پسوند فایل استفاده میکنیم تا مشخص شود که این فایل حاوی کدهای مربوط به زبان برنامه نویسی ساخته شدهی ما است. کدهای مربوط به این فایل در ادامه آمده است.
// importing file system module
const fs = require('fs')
//importing path module for convenient path joining
const path = require('path')
class Magenta{
constructor(codes){
this.codes = codes
}
tokenize(){
/* previous codes for tokenizer */
}
parse(tokens){
/* previous codes for parse method */
}
run(){
/* previous codes for run method */
}
}
// Reading code.m file
// Some text editors use rn for new line instead of n, so we are removing r
const codes = fs.readFileSync(path.join(__dirname, 'code.m'), 'utf8').toString().replace(/r/g, "")
const magenta = new Magenta(codes)
magenta.run()
جمعبندی ساخت زبان Magneta
در این بخش از این مطلب، ساخت زبان برنامه نویسی کوچکی به نام Magneta از صفر تا انتها با موفقیت انجام شد. مشخص شد که ساخت زبان برنامه نویسی میتواند به سادگی زبانی باشد که تنها میتواند یک وظیفه ساده را انجام دهد. البته بسیار غیر محتمل است که زبان بسیار ساده و ابتدایی مثل Magneta به اندازه کافی کاربردی و مفید باشد تا بتوان از آن در یک فریمورک توسعه نرمافزار یا چیزی شبیه به آن استفاده کرد. اما با ساخت Magneta تقریباً مشخص شد که برای ساخت زبان برنامه نویسی چه مراحلی باید طی شوند.
ساخت زبان برنامه نویسی هیچ حد و مرزی ندارد و اگر قصد دارید در این زمینه بیشتر بدانید و وارد این حوزه شوید، میتوانید از دوره آموزشی زیر استفاده کنید و آشنایی بیشتری با طراحی و پیادهسازی زبانهای برنامه نویسی بدست آورید.
برای ساخت زبان برنامه نویسی چه چیزهایی را باید یاد بگیریم؟
بسیاری از افراد در خصوص زبان برنامه نویسی مورد استفاده خود دچار چالشها و مشکلاتی میشوند. برخی میخواهند در سطح انتزاع بالاتری کدنویسی کنند، برخی از سایر افراد هم از پیادهسازی ویژگیها و قابلیتهایی ناخشنود هستند که استاندارد نیستند و ترجیح میدهند این امکانات به صورت استانداردسازی شده در دسترس آنها قرار داشته باشند.
چه فردی یک متخصص IT باشد یا تنها به عنوان سرگرمی در زمینه برنامه نویسی فعالیت میکند، در بسیاری از مواقع افراد تصمیم میگیرند ساخت زبان برنامه نویسی جدیدی را شروع کنند. بنابراین در این بخش به مواردی اشاره شده است که برای ساخت زبان برنامه نویسی مورد نظر خود باید یاد بگیریم و انجام دهیم.
- آشنایی با فناوری کامپیوتر: اگر ندانیم چطور از کامپیوتر استفاده کنیم، قطعاً امکان ساخت زبان برنامه نویسی خود را هم نخواهیم داشت.
- آشنایی با اصطلاحات مربوط به ساخت زبان برنامه نویسی: سازندگان کامپایلر اغلب از اصطلاحات ناآشنایی استفاده میکنند. بنابراین بهتر است پیش از شروع ساخت زبان برنامه نویسی در خصوص کامپایلرها مطالعه کافی انجام شود و باید مطمئن شویم همه آنچه لازم است را میدانیم.
- مشخص کردن اینکه با ساخت زبان برنامه نویسی مورد نظر چه مشکل و مسئلهای قرار است حل شود؟ آیا زبان برنامه نویسی مربوطه مسئلهای مختص حوزهای خاص را هدف قرار میدهد؟ یا اینکه زبان برنامه نویسی که میخواهیم بسازیم زبانی همهمنظوره به حساب میآید و در حوزهها و زمینههای بسیاری قابل استفاده است؟
- تفکر پیرامون معناشناسی زبان برنامه نویسی که میخواهیم بسازیم و مفاهیم آن
- تفکر راجع به برخی از وظایف خاصی که یک فرد ممکن است بخواهد با زبان برنامه نویسی ساخته شده اجرا کند: مثلاً ممکن است فردی بخواهد رباتی را برای دنبال کردن خطوط هدایت کند یا ممکن است فرد دیگری بخواهد با زبان ساخته شده برنامه دسکتاپ قابل حملی را بسازد یا با آن برنامههای کاربردی تحت وب بسازد.
- فعالیت و آزمون و خطا در زمینه ایدههای مرتبط با سینتکس برای هر یک از مثالهایی که در مورد قبل به آنها اشاره شد.
- نوشتن گرامر رسمی برای سینتکس زبان برنامه نویسی که میخواهیم بسازیم.
- تصمیمگیری در خصوص اینکه آیا زبان برنامه نویسی ما قرار است مفسری باشد یا کامپایلری؟ این یعنی در دنیای مفسرها، برنامه نویس معمولاً برنامه را در یک کد ادیتور ویرایش و سپس آن را مستقیماً در یک مفسر اجرا میکند؛ این در حالی است که در دنیای کامپایلرها، برنامه نویس برنامه را ویرایش میکند، پس از آن کامپایل برنامه را انجام میدهد و فایل اجرایی حاصل شده در جایی ذخیره و سپس اجرا میشود.
- نوشتن اسکنر فرانتاند و تجزیهگر (Parser) یا پیدا کردن ابزاری برای کمک به این کار: همچنین لازم است برای چگونگی هشدار دادن کامپایلر/مفسر به برنامه نویس راجع به برنامههای خطادار و اشتباهات سینتکسی هم چارهای اندیشیده شود.
- استفاده از اطلاعات تجزیهگر برای نوشتن کدهای شی یا ایجاد بازنمایی و نمایشی حد واسط: باید با استفاده از تجزیهگر یک AST (درخت سینتکس انتزاعی) ساخته شود، سپس باید کدهای شی خود را از روی AST با استفاده از کدهای آدرس یا برادر بزرگتر آن، SSA بسازیم؛ پس از آن لازم است جدول نمادها برای تعریف توابع، متغیرهای سراسری و سایر موارد ایجاد شود.
- همچنین، بسته به ویژگیها و قابلیتهای زبان برنامه نویسی خود، ممکن است بخواهیم جدولهای اشارهگر مجازی یا جدولهای اطلاعات را برای کلاسهای خود بسازیم (با هدف پشتیبانی از بازتاب یا RTTI).
- نوشتن اجرا کننده یا تولید کننده کد که همه چیز را با یکدیگر ترکیب خواهد کرد.
- نوشتن چندین برنامه آزمایشی برای تست کردن زبان برنامه نویسی ساخته شده:
- باید برنامههایی را با زبان برنامه نویسی جدید بسازیم که بر گرامر رسمی زبان ما تاکید کنند تا مشخص شود آیا کامپایلر هر چیزی را میپذیرد که در تعریف وجود دارد و هر چیزی که خارج از آن است را رد می کند یا خیر.
- باید در نظر بگیریم که برنامه نویس چگونه قرار است برنامه خودش را دیباگ (عیبیابی) کند.
- نوشتن کتابخانه استاندارد در صورتی که نیاز باشد زبان برنامه نویسی که میخواهیم بسازیم از آن استفاده کند؛ همچنین در صورت لزوم نیاز به ساخت «بازیافتکننده زباله» (Garbage Collector) یا سایر قابلیتها و ویژگیهای زمان اجرا نیز وجود دارد.
- خصوصاً اگر کامپایلر مینویسیم، به کدهایی نیاز خواهیم داشت که سیستمعامل آنها را برای شروع اجرای کدهای برنامه نویس اجرا خواهد کرد (مثلاً کدهایی که برای تخصیص تمام متغیرهای سراسری مورد نیاز هستند).
- انتشار زبان برنامه نویسی خود به همراه مشخصههای آن و ارائه برخی مثالهایی از آنچه میتوان در آن انجام داد.
- نباید فراموش کرد که چگونه میتوان با کتابخانهها و زبانهای فعلی ادغامسازی انجام داد و اینکه چگونه از قابلیتهای «زمان اجرا» (Runtime) و کتابخانه استاندارد بهره برد.
برای ساخت زبان برنامه نویسی در خصوص معناشناسی یا Semantics باید چه مواردی را در نظر بگیریم؟
در بخش قبل در پاسخ به این سوال که چگونه زبان برنامه نویسی بسازیم به این مسئله اشاره شد که در ساخت زبان برنامه نویسی لازم است راجع به معناشناسی زبان خود و مفاهیم آن بیاندیشیم و تدابیر لازم را برای آن اتخاذ کنیم. برخی از این موارد در ادامه فهرست شدهاند:
- آیا قرار است امکان دسترسی مستقیم اشارهگر فراهم شود یا خیر؟
- انواع داده زبان برنامه نویسی ما چه خواهند بود؟
- آیا قرار است زبانی با تخصیص و تعیین نوع ایستا بسازیم یا پویا؟
- مدل مدیریت حافظه به چه شکل خواهد بود؟ آیا قرار است از بازیافت زباله استفاده شود یا مدیریت حافظه به صورت دستی انجام خواهد شد؟ (اگر از جمعآوری زباله استفاده شود، باید آماده نوشتن آن باشیم یا میتوان از بازیافت زباله آمادهای که قبلاً نوشته شده استفاده کرد).
- «همزمانی» (Concurrency) چگونه قرار است مدیریت شود؟ آیا قرار است از مدل نخبندی/قفل کردن یا چیزی پیچیدهتر از آن مثل Linda یا مدل actor استفاده شود؟ (چون امروزه کامپیوترها دارای چندین هسته هستند)
- آیا قرار است تابعهای اصلی و اولیه در زبان ما وجود داشته باشد یا همه چیز از طریق کتابخانه قابل استفاده خواهد بود؟
- رویکرد یا پارادایم زبان برنامه نویسی که میخواهیم بسازیم چیست؟ آیا زبان برنامه نویسی ما تابعی خواهد بود یا شیگرا؟ آیا مثل جاوا اسکریپت مبتنی بر پیشنمونه (Prototype) است؟ آیا زبانی جنبهگرا (Aspect Oriented) خواهد بود؟ آیا قالبمحور (Template-Oriented) است یا پارادایم کاملاً جدیدی را ارائه خواهد کرد؟
- زبان برنامه نویسی مربوطه چگونه قرار است با کتابخانهها و زبانهای فعلی (مثلاً زبان C) ارتباط بگیرد؟ این نکته خصوصاً زمانی بیشتر اهمیت پیدا میکند که قصد ساخت «زبان برنامه نویسی مختص دامنه» (Domain Specific Language) وجود داشته باشد.
معرفی انواع زبان های برنامه نویسی + کاربرد، مزایا و معایب هر یک
مراحل ساخت زبان برنامه نویسی چیست؟
بهتر است زبانی که با آن زبان جدیدی میسازیم شیگرا باشد. ساخت هر زبان برنامه نویسی مراحل و گامهای متعددی را از کدهای منبع گرفته تا فایل اجرایی نهایی شامل میشود. در هر یک از این مراحل، دادههای دریافتی به روش خاصی قالببندی میشوند که در ادامه به این روشها پرداخته شده است:
- تجزیه و تحلیل لغوی (lexical Analysis): به بیان ساده به تقسیم کدهای منبع در قالب توکنها گفته میشود. هر توکن میتواند حاوی واژگان متفاوتی باشد:
- کلمه کلیدی
- شناساگر/متغیر
- عملگری با مقدار متناظرش
- سایر موارد
- تحلیلگر سینتکس یا تجزیه-تحلیل تجزیه کننده (Parser) فهرستی از توکنهای ورودی را به درخت سینتکس انتزاعی (Abstract Syntax Tree) یا همان AST تبدیل میکند که به این وسیله امکان ارائه قوانین زبان ما فراهم خواهد شد. این فرایند به خودی خود نسبتاً آسان است، چرا که میتوان آن را در نگاه اول دید، اما با افزایش ساختارهای زبانی (Language Construction) این این روند میتواند بسیار پیچیدهتر شود.
- پس از آنکه AST ساخته شد، میتوان کدها را تولید کرد. کدها معمولاً به صورت بازگشتی با استفاده از یک درخت سینتکس انتزاعی تولید میشوند. در طول تجزیه و تحلیل نحوی، کامپایلر گزارههایی (عبارتهایی | Statement) را به منظور سادگی تولید خواهد کرد.
تحلیل نحوی (Syntax Analysis) در طراحی کامپایلر — راهنمای جامع
در ساخت یک زبان برنامه نویسی ساده چه قابلیت هایی تعبیه خواهند شد؟
در ادامه هر یک از قابلیتهایی فهرست شدهاند که برای ساخت زبان برنامه نویسی ساده باید پیادهسازی شوند:
- تخصیصدهی متغیرها (عددی، منطقی و متنی)
- اعلان و تعریف ساختارها (Structures)، ایجاد «نمونهها» (Instance) و فیلدهای دسترسی
- اجرای عملیات ساده ریاضی (مثل جمع، تفریق و NOT)
- چاپ متغیرها، مقادیر و عبارتهای پیچیدهتر با عملگرهای ریاضی
- خواندن مقادیر عددی، منطقی و متنی از کنسول
- اجرای عبارتهای if-then
مثالی از کدهای یک زبان برنامه نویسی ساخته شده با جاوا
در این زیربخش، مثالی از کدهای آن ارائه شده است. سینتکس این زبان، ترکیبی از سینتکس پایتون و روبی است.
struct Person
arg name
arg experience
arg is_developer
end
input your_name
input your_experience_in_years
input do_you_like_programming
person = new Person [your_name your_experience_in_years do_you_like_programming == "yes"]
print person
if person :: is_developer then
person_name = person :: name
print "hey " + person_name + "!"
experience = person :: experience
if experience > 0 then
started_in = 2022 - experience
print "you had started your career in " + started_in
end
end
جمعبندی
در این نوشته به این موضوع پرداخته شد که چگونه زبان برنامه نویسی بسازیم و نحوه ساخت زبان برنامه نویسی بهطور جامع شرح داده شد. آموزش ساخت یک زبان برنامه نویسی ساده با جاوا اسکریپت (Node.js) نیز در این مطلب ارائه شد و سایر نکات مهم پیرامون ساخت زبان برنامه نویسی نیز شرح داده شدند. امید است این مقاله مفید واقع شود.