سلام دوستان، در این مطلب با معرفی زبان برنامه نویسی لوا (Lua) در خدمت شما هستیم. Lua یک زبان برنامه نویسی سبُکوزن، بازتابنده و امری-تابعی است. زبان لوا با ساختار پردازه نویسی (برنامهنویسی اسکریپتی) و با هدف داشتن قابلیتهای گسترشپذیر طراحی شدهاست. معرفی کامل زبان برنامه نویسی Lua در ادامه مطلب، لطفا با ما همراه باشید…
معرفی زبان برنامه نویسی Lua از زبان یکی از کاربران
امروز با یه زبان جدید آشنا شدم که اسمش lua است. این زبان رو قبلا تو کانفیگ کردن nginx و جاهای دیگه هم دیده بودم. این زبان یک زبان مفصریه و یعنی کامپایلری نداره و زمان اجرا تفسیر و اجر میشه. این زبان به نسبت ساده است و با زبانهایی مثل javascript و scheme مقایسه میشه. چند روز پیش هم که داشتم توی اینترنت میگشتم دیدم که یکی از ویژگیهای این زبان اینه که شما میتونی توی یک برنامه دیگه از اون استفاده کنی. یعنی مفسرش به برنامه اضافه میشه و برنامت میتونه به با استفاده از lua برنامه ریزی بشه و مثلا plugin براش طراحی بشه.
کل مساله ای که من میخواستم حل کنم و به نظرم lua برای این کار مناسب اومد اینه که، قراره برنامهای نوشته بشه که بصورت داینامیک بشه منطق کسب و کار رو توش عوض کرد. یعنی اینکه تا دیروز براساس روند a عمل میشده و امروز روند b باید عمل بشه. راهحلهای زیادی برای این مساله وجود داره که در جامع ترین حالتش شما باید یه زبان توصیف مخصوص به خودت درست کنی و از اون استفاده کنی تا منطق کسب و کار رو پیادهسازی و تست بکنی. خب این روش الان توی تقریبا همهی سیستمهای مدیریت روندهای کسب و کار وجود داره ولی من به ذهنم رسید وقتی یه چیزی مثل lua وجود داره و به راحتی با برنامهی شما integrate میشه چرا بایستی من با تجربه و توان محدودم بخوام یه شبه زبان برنامه نویسی طراحی کنم. یه چیز دیگه که باعث شد به استفاده از lua فکر کنم این بود که مثلا یه بخش از برنامه رو توی یه زبان دیگه بنویسی و فقط توی lua از اون استفاده کنی. این باعث میشه کارهایی که نیاز به کارایی و این چیزا دارن در زبانه دیگه طراحی بشن و فقط lua اونها رو سر هم کنه.
بعد گشتم و سعی کردم شواهدی در اینترنت پیدا کنم که ایدهای که به ذهنم رسیده آیا درسته یا نه. دیدم که مثلا در طراحی بازی خیلی از این ویژگی استفاده وعملا lua یک زبان برنامهنویسی محبوب در بین توسعه دهندههای بازی هست. یا دیدم که نرمافزاری به نام freeswitch که برای راهکاری تلفنی مبتنی بر voip هست از lua به عنوان زبان طراحی روند تماس استفاده میکنه. یا با استفاده از lua شما میتونی nginx رو کنترل کنی. همچنین دیدم یه جایی مثل cisco برای سطوح دسترسی پویا از این زبان استفاده کرده. حتی lua یک سرور مثل node.js به نام luvit داره اما به اون مشهوری نیست.
معرفی زبان برنامه نویسی Lua (لوا)
Lua (لوا) یک زبان برنامه نویسی سبُکوزن، بازتابنده و امری-تابعی است. زبان لوا با ساختار پردازهنویسی (برنامهنویسی اسکریپتی) و با هدف داشتن قابلیتهای گسترشپذیر طراحی شدهاست. فلسفلهٔ اولیه ساخت این زبان، استفاده از آن به عنوان یک زبان عمومی و ساده پردازهنویسی بود. جامعه هدف لوا شامل کاربران نیمه حرفهای هم میشود.
در پردازهنویسی برای انجام توصیفات پیچیده از یک زبان نهفته شده در یک زبان دیگر استفاده میشود. به خاطر سبک بودن کتابخانه لوا، میتوان لوا را با تمام قابلیتها به عنوان یک زبان نهفته در سی استفاده نمود. حجم مفسر کامپایل شده حدود ۱۵۰KB است. در طراحی لوا سعی شدهاست از فرا ساز و کارها بیشتر استفاده شود تا در عین کوچکی، انعطافپذیری زبان افزایش یابد. دادهساختار جدول، داده ساختار اصلی مورد استفاده در این زبان است. لوا یک مفسر اصلی دارد که توسط طراحان اصلی زبان پیادهسازی شدهاست.
این مفسر دارای واسط سی نسبتاً سبک و سادهای است.[۱] هر دوی لوا و جاوااسکریپت از اشیاء نمونهپایه استفاده میکنند. آنها هر دو از شِما الگو گرفتهاند. بسیاری از مفاهیم مشترک میان آنها وجود دارد، گرچه تفاوتهای اساسی در نحو دارند. در طراحی لوا شبیه به آیکون است، شاید به این علت که هر دو از اسنوبال تأثیر پذیرفتهاند. زبان لوا در طول زمان تغییر میکند، قابلیتهایی از آن کاسته و قابلیتهایی بر آن افزوده میشوند. اکنون این زبان در نسخه ۵٫۳٫۲ قرار دارد (آذر ۱۳۹۴) لوا در صنعت بازیهای ویدئویی محبوبیت زیادی دارد. به جز بازیها لوا در کاربردهای بسیاری هم تجاری و هم غیرتجاری استفاده شدهاست. نام این زبان از کلمه پرتغالی lua به معنای «ماه» میآید.
کاربردهای زبان برنامه نویسی Lua
لوا در صنعت بازیهای ویدئویی محبوبیت زیادی دارد. در تعدادی از موتورهای بازی از زبان لوا برای توسعه و به عنوان اسکریپت استفاده میشود از جمله
- CryEngine
- Leadwerks Engine
- Corona SDK
از جملهٔ بازیهایی که از افزونبستههای (Plugin) لوا پشتیبانی میکنند میتوان به موارد زیر اشاره کرد
- Crysis
- BZFlag
- PlayStation Home
- Dawn of War
- World of Warcraft
- DeathStatue Game (بازی تندیس مرگ)
- cs2d
به جز بازیها لوا در کاربردهای بسیاری هم تجاری و هم غیرتجاری استفاده شدهاست از جمله
- Adobe Photoshop Lightroom
- Apache HTTP Server
- Damn Small Linux
- LuaTex
- nmap
- WireShark
نمونه کدهای برنامه نویسی Lua
کدهای این قسمت همگی کامل هستند و بدون هیچ تغییری تفسیر میشوند.
برنامهٔ نوشتن عبارت “Hello World” بر روی صفحه:
<span class="nb">print</span><span class="p">(</span><span class="s1">'Hello World'</span><span class="p">)</span> <span class="c1">-- this is a comment</span>
کامنتها با—مشخص میشوند.
جمع کردن دو عدد در ورودی:
<span class="n">a</span> <span class="o">=</span> <span class="nb">io.read</span><span class="p">()</span>
<span class="n">b</span> <span class="o">=</span> <span class="nb">io.read</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="p">)</span>
توصیف یک پنجره گرافیکی:
<span class="n">d</span> <span class="o">=</span> <span class="n">dialog</span> <span class="p">{</span>
<span class="n">hbox</span> <span class="p">{</span>
<span class="n">button</span><span class="p">{</span> <span class="n">label</span> <span class="o">=</span> <span class="s2">"ok"</span> <span class="p">},</span>
<span class="n">button</span><span class="p">{</span> <span class="n">label</span> <span class="o">=</span> <span class="s2">"cancel"</span> <span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
در این مثال dialog با یک جدول توصیف میشود.
تابع فاکتوریل نمونهای از یک تابع بازگشی در لوا است، که به دو روش پیادهسازی شده است
<span class="kr">function</span> <span class="nf">factorial</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
<span class="kr">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span>
<span class="kr">return</span> <span class="mi">1</span>
<span class="kr">else</span>
<span class="kr">return</span> <span class="n">n</span> <span class="o">*</span> <span class="n">factorial</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="kr">end</span>
<span class="kr">end</span>
<span class="kr">function</span> <span class="nf">factorial2</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="c1">-- Shorter equivalent of the above</span>
<span class="kr">return</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="mi">1</span> <span class="ow">or</span> <span class="n">n</span> <span class="o">*</span> <span class="n">factorial2</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
<span class="kr">end</span>
در تابع دوم از خصوصیت محاسبه کمینه عبارت بولی از چپ در زبان لوا استفاده شد. یعنی اینکه فقط اگر شرط n==0
برقرار نباشد محاسبه factorial2(n-1)
انجام میشود.
عوض کردن تابع print تعریف شده در لوا به گونهای که رفتار آن فقط به ازای حالت خاص ورودی “foo” تفاوت کند.
<span class="kr">do</span>
<span class="kd">local</span> <span class="n">oldprint</span> <span class="o">=</span> <span class="nb">print</span> <span class="c1">-- Store current print function as oldprint</span>
<span class="kr">function</span> <span class="nf">print</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="c1">-- Redefine print function</span>
<span class="kr">if</span> <span class="n">s</span> <span class="o">==</span> <span class="s2">"foo"</span> <span class="kr">then</span>
<span class="n">oldprint</span><span class="p">(</span><span class="s2">"bar"</span><span class="p">)</span>
<span class="kr">else</span>
<span class="n">oldprint</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="kr">end</span>
<span class="kr">end</span>
<span class="kr">end</span>
این مثال به خوبی نشان میدهد که توابع کتابخانه در لوا متغیرهای عمومی (یا سطح اول) هستند.
مبحث شیرین برنامه نویسی شیءگرا در لوا
شیءگرایی در لوا بهطور مستقیم وارد نشده است. شیءگرایی از طریق سازوکار فراجدولها قابل پیادهسازی است. نمونهای ساده از پیادهسازی شیءگرایی
<span class="n">a</span><span class="o">=</span><span class="p">{</span><span class="n">x</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">200</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s2">"red"</span><span class="p">}</span>
<span class="n">b</span><span class="o">=</span><span class="p">{</span><span class="n">x</span><span class="o">=</span><span class="mi">300</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="mi">400</span><span class="p">}</span>
<span class="nb">setmetatable</span><span class="p">(</span><span class="n">b</span><span class="p">,{</span> <span class="n">__index</span> <span class="o">=</span> <span class="n">a</span> <span class="p">})</span>
<span class="nb">print</span><span class="p">(</span><span class="n">b</span><span class="p">.</span><span class="n">color</span><span class="p">)</span> <span class="c1">--> red</span>
رابط برنامه نویسی لوا (API)
زبانهای پردازهنویسی درون یک زبان بزرگتر اجرا میشوند. این زبان باید با زبان پردازهنویسی داخلی از طریق یک لایه ارتباط برقرار کند، که آن رابط ربن (برنامه نویسی نرمافزار) است. در لوا از دو بخش هسته و کمکی تشکیل شدهاست. لایه ربن در لوا نسبتاً ساده است، چون برخلاف پایتون مدیریت ارجاع در آن نیاز نیست. ربن لوا همچون خود زبان کمینه است: عملکرد پیشرفتهتر توسط کتابخانهٔ کمکی پشتیبانی میشود، که شامل ماکروهای تعریف شده زیادی است که عملیات پیچیده جدولی را آسان میکند.
سرعت زبان برنامه نویسی Lua
مهمترین علت شهرت زبان Lua بخاطر کارایی آن است. آنطور که گفته شده است، سرعت دیگر زبانهای برنامه نویسی را با سرعت Lua میسنجند. بنچ مارکهای بسیاری درباره زبان Lua وجود دارد که معمولا به عنوان سریع ترین در حوزه اسکریپت امبددها ذکر شده است. یک کامپایر سریعتر برای Lua توسعه داده شده است به نام LuaJIT که یک کامپایلر just-in-time میباشد. زبان Lua از سینتکس بسیار ساده و در عین حال ساختار توصیف داده بسیار ساده بهره میبرد که بر اساس آرایههای داینامیک و زبان توصیفی میباشد.
منابع آموزش برنامه نویسی Lua (لوا)
- فیلم آموزش برنامه نویسی LUA به زبان اصلی
- دیگر مطالب آموزشی Lua (به زودی این بخش تکمیل می شود)
The post زبان برنامه نویسی Lua چیست؟ appeared first on آموزش برنامه نویسی.