موضوع مقاله: فالکن | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # فالکن | مقدمه: فالکُن یک زبان برنامه‌نویسی متن باز، ساده، سریع، قدرتمند و با یادگیری آسان است که از ۶ مدل برنامه‌نویسی امری، برنامه‌نویسی تابعی، برنامه‌نویسی شیءگرا، نمونه‌سازی اولیه، پیغام گرا و جدولی پشتیبانی می‌کند. | ## بخش 1: فالکن | __TOC__ تاریخچه یک پروژه کوچک به نام هست، که در سال ۲۰۰۲ به منظور ایجاد یک ماشین مجازی کوچک و سریع آغاز شد بعد از مدتی به طراحی و ساخت زبان برنامه‌نویسی فالکن منجر شد. جیانکارلو نیکولی، طراح فالکن، در مصاحبه‌ای می‌گوید: «من از زبان‌های زیادی از جمله C++، C، جاوا، اسمبلی، لیسپ، پرولوگ، کلیپر، دلفی، SQL «...» استفاده کرده‌ام؛ و نیاز به یک ابزار قابل انعطاف که نیازهای روزانه مرا در بر بگیرد و امکان بروز ایده‌های جدید را فراهم کند، را احساس کردم. زیرا که در دنیای واقع هنگامی که از تعداد زیادی روندها و مدل‌های حل بتوان استفاده کرد، راه حل‌های بهتری ایجاد می‌شوند. «...» بنابراین فالکن ایجاد شد با ایده دارا بودن امکانات یک زبان شئ‌گرا خالص در حالی که یک زبان شئ‌گرا نیست، دارا بودن امکانات یک زبان امری خالص در حالی که یک زبان امری نیست و دارا بودن ساختارهای تابعی در حالی که یک زبان تابعی نیست. «...» اگر یک چیز دربارهٔ این زبان باشد که من به آن افتخار کنم، این است که این زبان به دلایل خارجی ایجاد نشد. بلکه به منظور حل مشکل یکپارچه سازی و مدیریت دسترسی در برنامه‌های کاربردی بزرگ از یک سو و نیاز به حل مسئله‌های پیچیده منطقی و مسئله‌ها با تغییرپذیری بالا از سوی دیگر، ایجاد شد.» تایپ‌های داده‌ای Nil: یک کلمه کلیدی به معنای هیچ مقدار. MemBuf: جدول‌هایی از حافظه خام که هر خانه یک عدد صحیح بدون علامت ۱، ۲، ۳ یا ۴ بایتی است. Array: یک دنباله با طول متغیر از عناصر هم نوع که می‌توانند در هنگام اجرا اضافه، حذف یا تغییر کنند. هر عبارت elif یک عبارت شرطی را ارزیابی می‌کند و در صورت درست بودن، دستورات زیر آن اجرا می‌شود در غیر این صورت عبارت elif بعدی در صورت وجود یا عبارت else بررسی می‌شود. تنها محدودیت این ساختار این است که عبارتی که مقدار آن بررسی می‌شود، باید رشته یا عدد صحیح باشد. end عناصری که برای انتخاب در مقابل caseها قرار می‌گیرند می‌توانند عددهای صحیح، رشته‌های حرفی، بازه‌های عددی، نام متغیر یا nil باشند. این ساختار را می‌توان روی رشته کاراکترها هم اعمال کرد که در این صورت روی کاراکترها از ابتدا تا انتها عمل می‌کند. در ادامه نام تابع و دو پرانتز باز و بسته که می‌توانند شامل یک لیست از هیچ یا چند پارامتر باشند قرار می‌گیرد. پارامترها به صورت عادی انتقال با مقدار هستند اما می‌توان با عملگر ‘$’ که در ادامه توضیح داده می‌شود، انتقال با آدرس نیز انجام داد. در واقع توابعی که به صورت صریح مقداری برنمی‌گردانند مقدار nil برای آن‌ها در نظر گرفته می‌شود. قطعه‌ای از از برنامه که درون هیچ تابعی نیست به عنوان «برنامه اصلی» در نظر گرفته می‌شود. توابع به صورت جداگانه از برنامه اصلی نگه‌داری می‌شوند؛ بنابراین می‌توان توابع و برنامه اصلی را در هم آمیخت و قبل از تعریف یک تابع آن را صدا زد. با تعریف تابع درون تابع می‌توان دامنه‌های درونی‌تری تعریف کرد که دامنه پدرشان را به ارث می‌برند. | ## بخش 2: فالکن | متغیرهای محلی و سراسری هنگامی که یک متغیر برای اولین بار درون یک تابع مشخص می‌شود، آن اسم به صورت محلی در نظر گرفته می‌شود. یعنی حتی در صورت وجود یک متغیر با همان نام در برنامه اصلی، نسخه محلی آن در تابع استفاده می‌شود. با این روش از تغییر یک متغیر که ممکن است در جای دیگری استفاده شود، جلوگیری می‌شود. می‌توان به متغیرهای سراسری، درون توابع دسترسی داشت اما در حالت معمول نمی‌توان مقدار آن‌ها را تغییر داد. به عنوان مثال در قطعه برنامه زیر مقدار ۱٫۴۱ چاپ می‌شود اما تغییر مقدار sqr در خط بعد تنها توسط خود تابع، که آن را تغییر داده قابل رویت است و مقدار sqr استفاده شده در بیرون تابع هنوز همان ۱٫۴۱ است. زبان فالکن با استفاده از یک ساختار قدرتمند به نام "static initializer" این امکان را می‌دهد که متغیرهایی که درون این ساختار تعریف می‌شوند، تنها یک بار در اولین اجرای تابع مقدار دهی اولیه شوند و از آن پس در هر بار صدا زده شدن تابع، مقدار قبلی آن‌ها استفاده شود. یک عنصر با بیش از یک نام هر عنصری در زبان فالکن می‌تواند به صورت ایستا یا پویا، نام مستعار داشته باشد. نام مستعار در حالت ایستا (که به آن ارجاع هم گفته می‌شود) با استفاده از عملگر ‘$’ فراهم می‌شود. مانند مثال زیر: a = 0; b = $a >b //is 0 a++;>b //is 1 b++;>a //is 2 با استفاده از اسم مستعار ایستا (ارجاع) می‌توان به توابع پارامترهای از نوع آدرس انتقال داد که در نتیجه مقدار آن‌ها درون تابع قابل تغییر خواهد کرد. برنامه‌نویسی تابعی زبان فالکن یک موتور سنجش به نام sigma-reductor دارد که به برنامه نویسان اجازه می‌دهد برنامه‌هایی با مدل تابعی خالص بنویسند که تفاوتی با آنچه در زبان لیسپ دیده شده‌است، ندارد. اگر عنصر ابتدای یک آرایه خود قابل فراخوانی باشد، می‌توان آن آرایه را فراخوانی کرد. شیوه استفاده از مدل‌های برنامه‌نویسی مختلف این اجازه را می‌دهد که از مدل‌های دیگری مانند مدل امری و شئ‌گرا در دنباله‌های تابعی استفاده شود؛ یا بالعکس یعنی در مدل امری از مدل تابعی نیز استفاده شود. شئ‌گرا فالکن مدل برنامه‌نویسی شئ‌گرا را با در نظر گرفتن کلاسها، وراثت چندگانه، مقداردهی صفات و ساخت نمونه از کلاس‌ها فراهم می‌کند. اما با توجه به خصوصیت تابعی بودن فالکن، که به توابع به صورت یک گونه خاص از داده نگاه می‌کند، می‌توان به صفات یک نمونه از کلاس، یک داده ساده یا یک تابع مقداردهی کرد؛ بنابراین با مقداردهی یک صفت با دنباله تابعی، آن صفت یا خصوصیت برای آن نمونه، به صورت یک متد در می‌آید. از آنجا که ساخت یک نمونه از طریق صدا زدن نماد آن کلاس (نام کلاس) صورت می‌گیرد، اجرای یک دنباله تابعی که اولین عنصر آن نماد یک کلاس است، به ساخت یک نمونه از آن کلاس منجر می‌شود. نمونه‌سازی اولیه بر پایه شئ‌گرایی مدل برنامه‌نویسی نمونه‌سازی اولیه شئ‌گرا مانند مدل شئ‌گرا است با این تفاوت که از مفهوم کلاس استفاده نمی‌شود و نمونه‌ها متعلق به کلاس خاصی نیستند و ساختار نمونه‌ها به صورت پویا می‌باشد. یعنی ساخت یک نمونه به معنای ایجاد یک کپی از ساختار یک نمونه اولیه‌است اما این عمل به معنای محدود کردن ساختار نمونه جدید به ساختار اولیه، در تمام طول عمر آن نیست. به عنوان مثال آرایه‌ها می‌توانند نمونه‌ای از استفاده از مدل نمونه‌سازی اولیه باشند. | ## بخش 3: فالکن | قطعه برنامه زیر نشان می‌دهد که با استفاده از Binding می‌توان برای یک نمونه از آرایه یک تابع خاص را ایجاد کرد. در این صورت ترتیب دریافت پیام توسط شنونده‌ها اتفاقی است و شنونده‌ها می‌توانند برای دریافت پیغام با یکدیگر رقابت کنند و مانع از دسترسی سایر شنونده‌ها شوند. همچنین شنونده‌ها می‌توانند دارای اولویت باشند یعنی پیغام قبل از دریافت توسط شنونده‌ها با اولویت پایین‌تر حتماً توسط شنونده‌ها با اولویت بالاتر دریافت شده‌است. در این صورت شنونده‌ها می‌توانند در مراحل مرتب برای ساخت یک جواب مشترک با یکدیگر همکاری کنند. جدولی به برنامه‌نویسی مدل جدولی می‌توان به صورت گسترشی از مدل شئ‌گرا نگاه کرد؛ که در آن هر کلاس با یک جدول که ستون‌های آن خصوصیات و هر ریف یک نمونه از آن است نمایش داده می‌شود. علاوه بر در کنار هم آوردن همه نمونه‌ها، جهت کار با سایر نمونه‌های جدول، مدل جدولی این امکان را فراهم می‌آورد که هر تغییر در جدول اصلی، به صورت پویا در همه نمونه‌های آن جدول منعکس شود. در واقع هر جدول از تعدادی سطر که آرایه هستند و یک عنوان که معنای هر ستون را مشخص می‌کند، تشکیل شده‌است و داده‌های هر سطر می‌توانند هر عنصر زبان مانند یک جدول دیگر باشند. این آرایه‌ها می‌توانند از داده‌ها و منطق مشخص جدول استفاده کنند یا از طریق binding منطق خاص خود را داشته باشند. یعنی سطری از جدول که انتخاب شده‌است می‌تواند قابلیت‌های عملیاتی خاص خود را داشته باشد. توابع کتابخانه‌ای معمولاً نمونه‌هایی از کلاس Error یا کلاس‌هایی که از آن مشتق شده‌اند را پرتاب می‌کنند. کلاس‌هایی که توسط دستورات catch گرفته می‌شوند، معمولاً در یک سلسله مراتب قرار می‌گیرند. گسترش صریح رشته زبان فالکن دارای ‘@’ یک عملگر یگانی جهت گسترش صریح رشته‌های حرفی است. رشته‌های شامل کاراکتر ‘$’ که بعد از آن‌ها یک متغیر آمده‌است، با استفاده از این عمگر گسترش پیدا می‌کند. بارگذاری پویای یک ماژول فالکن امکان بارگذاری پویای ماژول‌ها را از دو طریق فراهم می‌کند. Threading: پشتیبانی از ساختارهای چند ریسه‌ای ZLib: واسط برای روش‌های ساده فشرده‌سازی پیاده‌سازی ماشین مجازی مرکزی و تمام ماژول‌های استاندارد با زبان برنامه‌نویسی ++C پیاده‌سازی شده‌اند. اما بعضی از ماژول‌های بسیار سطح پایین و عناصر موتور متنی با استفاده از زبان C و زبان اسمبلی نوشته شده‌اند. | ## جمع‌بندی | قابلیت استفاده زبان فالکن معمولاً پشتیبانی شده و در بین بخش‌های مختلف به روز نگه داشته می‌شود که در میان آن‌ها موارد زیر قرار دارند.