زبانهای برنامهنویسی زیادی مبتنی بر سیستمعاملها و بسترهای آزاد/متنباز طراحی شده و گسترش یافتهاند. یکی از زبانهای برنامه نویسی Cross-Platform (چند سکویی) و Object-Oriented (شیء گرا) که از سال ۲۰۰۶ شروع به انتشار کرد، زبان Vala است که توسط Jürg Billeter و Raffaele Sandrini تحت حمایت بنیاد GNOME و با حق امتیاز LGPL شروع به فعالیت کرد.
Vala یک زبان برنامهنویسی در حال توسعه است و جای پیشرفت بسیاری دارد که میتوان از تغییرات متعددی که در هر نسخه ارائه میشود به این موضوع پی برد. مقالهای که در حال مطالعه آن هستید یک آموزش کلی بر برنامهنویسی به زبان Vala خواهد بود که در آن بصورت کلی تکنیکهای استفاده از این زبان را توضیح خواهیم داد. این آموزش بر اساس راهنمای رسمی بنیاد گنوم با مقداری تغییر و اقتباس ارائه خواهد شد و همزمان بر روی ویکی پروژههای لینوکس ریویو به آدرس wiki.linuxreview.ir قرار خواهد گرفت.
Vala چیست؟
Vala یک زبان برنامهنویسی جدید است که میتوان به وسیلهی آن برنامههایی نوشت که بر روی کتابخانههای GNOME Run-time ( عموما Glib و GObject) کار کند. این پلتفرم بستر وسیع و نسبتا کاملی برای خصوصیاتی مانند Dynamic Type System (منظور متغیرهای پویا) و Management Assisted Memory (منظور مدیریت اختصاص حافظه) است. قبل از Vala تنها راه برای برنامه، استفاده از API های C بود، که بصورت پیشفرض در ماشین وجود داشتند (منظور وجود APIهایی به زبان C است که بصورت Native در کامپیوتر وجود دارند)؛ که اکثرا دارای اطلاعات اضافی زیادی بودند. همچنین زبانهای سطح بالایی مانند پایتون یا Mono C# نیز از طریق ساخت یک Virtual Machine این کار را انجام میدادند.
اما شیوهی Vala از تمامی این تکنیکها جداست!
خروجی Vala به زبان C است، که میتواند بدون هیچگونه اطلاعات و کتابخانه اضافی بر روی محیط GNOME اجرا شود. اما چند نکته:
- کارایی برنامههایی که به زبان Vala نوشته شدهاند از بسیاری جهات مشابه برنامههای نوشته شده بر روی زبان C میباشد اما بسیار راحتتر و سریعتر نوشته و نگهداری میشوند.
- Vala امکانات و ابزارهای زیادی نسبت به C دارد که نوشتن هر کدام از آنها در C، سخت و زمانبر است.
این مقاله برای چه کسانی نوشته شده است؟
این مقاله یک توضیح کلی دربارهی برنامهنویسی به زبان Vala است و توضیحات زیادی درباره مبانی برنامهنویسی ارائه نمیکند؛ اما سعی میکنیم در ادامه کمی به OOP و مفاهیم آن نیز بپردازیم. برای درک مفاهیم و مبانی پایهای برنامه نویسی این لینک میتواند شروع خوبی باشد.
اجازه دهید به سراغ اولین برنامه به زبان Vala برویم… Hello world ! مطمئنا قابل پیشبینی بود!
class Demo.HelloWorld : GLib.Object {
public static int main(string[] args) {
stdout.printf(“Hello, World\\n”);
return 0;
}
}
بهتر است کمی به سبک کتابهای Deitel & Deitel توضیحات خود را پیش ببریم…
خط اول: این خط class Demo.HelloWorld : GLib.Object همانطور که پیداست طرز تعریف یک کلاس در Vala را نمایش میدهد. تعریف کلاس در Vala بسیار شبیه به مفاهیم تعریف کلاس در دیگر زبانهاست. یک کلاس بطور پایهای سازندهی یک شیء در برنامه خواهد بود. پیادهسازی کلاس در زبان Vala از طریق کتابخانهی gobject صورت میپذیرد اما دانستن اطلاعات دقیق دربارهی چگونگی این امر برای انجام اکثر کارها مهم نیست.
نکتهای که اینجا مهم هست این است که این کلاس به عنوان یک Subclass از کلاس Glib.Object ایجاد شده است. در حقیقت در Vala برای انجام بسیاری از کارها نیاز دارید کلاس Glib.Object را بعنوان Superclass برای کلاس خود در نظر بگیرید.
این قست از کد نشان دهندهی قاعدهی کلی تعریف متدها در Vala است. متد نوعی تابع است که از طریق یک شیء قابلیت اجرا مییابد. متد ایستا یعنی اشارهگر مرتبط با شیء وجود ندارد و پشته فقط شامل آرگومانها است. در حقیقت در Vala مانند C متد main آغازگاه برنامه است.
متد main نباید در یک کلاس تعریف بشود؛ در این صورت باید حتما کلاس مورد نظر از نوع static باشد (public بودن یا private بودن مهم نیست). نوع متغیر بازگشتی میتواند از نوع int یا void باشد. برنامه هنگام خروج در صورت void بودن، با دستور exit 0 بسته میشود.
stdout یک شیء در داخل Glib است. این خط، Vala رو موظف میکند که متد printf (از آبجکت stdout) را با ورود رشته (منظور Hello, World) فراخوانی کند. در Vala این سیاقِ نحوی (Syntax) معمولا سبک فراخوانی یک متد از یک شیء است. n/ هم ادامهی برنامه رو در خط بعدی چاپ می کند.
return یعنی برگرداندن یک متغیر به فراخوان و اتمام اجرای برنامهی main. مقدار خروجی متد main به عنوان کد خروجی برنامه محسوب میشود. خط آخر هم نشان دهندهی اتمام کلاس است.
کامپایل و اجرا
Vala را با دستور زیر (در اوبونتو) دانلود و نصب کنید:
بعد از نصب، برای کامپایل و اجرای برنامهی نوشته شده به زبان Vala میتوانید از دستورات زیر استفاده کنید.
./hello
Valac یک کامپایلر زبان Vala است که کد شما را به خروجی باینری تبدیل میکند. خروجی برنامه دقیقا هم اسم با برنامه و در کنار برنامه تولید میشود.
مفاهیم پایه ای
سورس فایلها و کامپایل کردن
تمام سورس فایلهایهای Vala از طریق دستور valac و flagهای ورودی اجرا میشوند. این دستور شبیه دستور کامپایل Java است، برای مثال:
که یک باینری به اسم compiler ایجاد میکند که به پکیج libvala لینک شده است. اگر نیاز دارید اسم باینری خروجی برنامهی شما با اسم سورس فایل شما تفاوت داشته باشد و یا اگر برای ساخت باینری نیاز به کامپایل چند سورس فایل دارید میتوانید از سوییچ -o استفاده کنید.:
./myprogram
اگر نیاز دارید کد Vala را به C تبدیل کنید نیز میتوانید از طریق اضافه کردن سوییچ c- به دستور کامپایل، خروجی ++C داشته باشید؛ این بدان معناست که شما میتوانید با valac یک کد متوسط C از Vala استخراج کنید. valac هر فایل vala. را به یک فایل جداگانه (در اینجا فایلهای source1.vala و source2.vala) به زبان C (با نام source1.c و source2.c) تبدیل میکند. همچنین نگاهی به ساختار تعریف کلاس در فایل خروجی از Vala نشان میدهد که تعریف یک کلاس در Vala مانند تعریف آن در C میباشد (البته با کمی اختصار).
اگر نیاز دارید یک فایل Header داشته باشید میتوانید از سوییچ -H استفاده کنید:
امیدواریم از بخش اول استفاده لازم را برده باشید و در ادامه ما را همراهی کنید.
در قسمت بعد، به بررسی قواعد برنامه نویسی، رشتهها، آرایهها و ارجاعها در برنامهنویسی Vala خواهیم پرداخت.
برای بحث و رفع اشکال در مورد این سری آموزشی و زبان Vala به انجمنهای تخصصی LinuxReview مراجعه نمایید.
23 دیدگاه برای این نوشته:
امیر حسین:
۰۶ خرداد ۱۳۹۱
این لینک که توی متن دادین کار نمی کنه!:http://linuxreview.ir/1391/03/vala-programming-tutorial-part1/cplusplus.com/doc/tutorial/با تشکر! :)
مسعود آموزگار:
۰۷ خرداد ۱۳۹۱
بله حق با شماست. داریم درستش میکنیم. :)
لینک صحیح اینه :
http://cplusplus.com/doc/tutorial/مسعود آموزگار:
۰۷ خرداد ۱۳۹۱
تشکر سامان جان، کار بزرگی رو شروع کردی. تکمیل بشه توی ویکی خروجیش یه کتاب 200-400 صفحهای خواهد بود. پروژه خیلی خوبی از طرف لینوکس ریویو هست.
اینجا هم توضیحات خوبی به زبان فارسی موجوده در مورد والا که اگر کسی خواست یه نگاه بهش بندازه بد نیست :
http://pc2st.wordpress.com/2010/08/24/the-vala-programming-language/کیارش کیانی:
۰۷ خرداد ۱۳۹۱
باز هم پایتون رو ترجیح می دم-خب شما گفتید \”خروجی Vala به زبان C است، که میتواند بدون هیچگونه اطلاعات و کتابخانه اضافی بر روی محیط GNOME اجرا شود\” حرف شما درست اما بگفته خود شما : \”یکی از زبانهای برنامه نویسی Cross-Platform\” خارج از گنوم چی؟ اونوقت باز هم این مزیت پابرجاست؟
-سیسنتکسش شبیه C هست و اصلا سینتکس C قشنگ نیست. این فقط وقتی مزیت هست که برنامه نویس مسلط به یکی از خانواده های C بخواد این زبان رو یاد بگیره ولی سینتکس c نسبت به پایتون حداقل برای یک تازه وارد سخت تره.
-پایتون محبوبیت خوبی داره و همچنین طرفدار های زیادی این باعث می شه تا شما در حین یادگیری کلی مثال و سورس هم دم دست داشته باشی و تعداد زیادتری هستن که بتونن مشکل شما رو حل کنن.
سامان اسمعیل:
۰۷ خرداد ۱۳۹۱
خارج از گنوم، مثلا در محیط ویندوز، کامپایلر مخصوص به Vala وجود دارد که مانند VS عمل میکنه، یعنی خروجی بهتون میده و میتونین اجراش کنید.
پایتون زبان بسیار عالی و خوبی هست، که کتابخونه های بسیار خوبی هم براش هست، مسلما Vala در بعضی موارد هنوز قابلیت رقابت با پایتون رو نداره. هر زبان در جایگاه خود زیباست.
و فرمودید C سینتکس زیبایی نداره، نکته اینجاست که فکر میکنم این یه چیز سلیقه ای هست. نسبتا برنامه نویس های خانواده های C قابلیت یادگیری زبان های بیشتری مانند PHP رو دارند و سینتکس زبان C رو ترجیح میدن. البته باز هم میگم، این یه چیز سلیقه ای هست. :)سامان اسمعیل:
۰۷ خرداد ۱۳۹۱
برای اطلاعات بیشتر بر روی ویندوز میتونین به اینجا مراجعه کنید:
http://live.gnome.org/Vala/ValaOnWindowsکیارش کیانی:
۰۷ خرداد ۱۳۹۱
منظورم این نبود که خارج از گنوم چطوری می شه ازش استفاده کرد منظورم اینه که خارج از گنوم دیگه \”بدون احتیاج به هیچ اطلاعات یا کتابخانه اضافی\” برقرار نیست و دیگه رو این مزیت نام برده شده نمی شه تاکید کرد.کیارش کیانی:
۰۷ خرداد ۱۳۹۱
در مورد سینتکس هم من سلیقه ای صحبت نمی کنم مثلا hello world پایتون رو با همین مقایسه کنید چقدر سریعتر به نتیجه می رسین؟ یا من فکر نمی کنم کسی دوست نداشته باشه خلاصه بنویسه و تا می تونه از تایپ بیهوده جلوگیری کنهeMan:
۰۷ خرداد ۱۳۹۱
ممنون سامان جان
این پستهای آموزشی واقعا ارزش زیادی دارندمسعود آموزگار:
۰۷ خرداد ۱۳۹۱
دوست خوبم اگر اینطور بود که شما میگی که همه زبانها میمردن و اونی که جمع و جورتره میموند. تبدیل کد به سی یه مزیت خیلی بزرگه برای این زبان. درسته این هم سطح بالا هست ولی میتونه مزیت های یه زبون سطح پایین رو منتقل کنه. سینتکس بسیار مشابهی هم با سی شارپ داره (صرفا سینتکس منظورم بود). از نظر امکانات هم با توجه به اینکه هنوز به نسخه 1 هم نرسیده وضعیت مطلوبی داره. مسلما پیشرفت خواهد کرد.
در مجموع همیشه در شرایط گوناگون استفاده از زبانهای مناسب اون شرایط منطقیتره. :) کسی که لازمه با C و GObject برنامه بنویسه مسلما استفاده از Vala براش خیلی بهتر خواهد بود.مسعود آموزگار:
۰۷ خرداد ۱۳۹۱
این لینک سرعت نهایی برنامهای که با والا نوشته شده رو با برنامه نوشته شده با پایتون مقایسه کرده :
http://compsci.ca/v3/viewtopic.php?t=26633تفاوتش خیلی بالاست! توی این نمونه برنامه والا 60 برابر سریعتره…
شاهین آزاد:
۰۷ خرداد ۱۳۹۱
ممنون سامان جان، پست خوبی بود!
در ادامهی بحث کامنتها یک نکته رو متذکر میشم که پایتون یک زبان تفسیری و در واقع مناسب اسکریپت نویسی است ولی والا یا Cعه بد سینتکس (جدی میگی؟) یک زبان کامپایل شدنی و خیلی خیلی نزدیکتر به زبان ماشین! مقایسهی این دو خیلی بیهودهست!مخصوصا مقایسه توی سرعت اجراشون! هر کدوم برای هدف متفاوتی ساخته شده! والا رو میشه مثلا با C# مقایسه کرد یا حتی بیسیک! پایتون هم با پرل یا PHP!
کیارش کیانی:
۰۷ خرداد ۱۳۹۱
مقایسه اصلا کار بیهوده ای نیست اگه مقایسه نکنیم نمی تونیم یه زبان رو انتخاب کنیم اما باید با هدف خاصی مقایسه کنیم و مقایسه کلی درست نیست
من گفتم : \”باز هم پایتون رو ترجیح می دم\” این یعنی بسته به استفاده و خواسته ی من پایتون بهترین می تونه باشه
من به عنوان یه اپلیکشن نویس باید با یه زبان cross-platform طرف باشم ولا رو نمی دونم اما توی سی شما احتیاج دارین که برای هر سیستم عامل با همون سیستم عامل از برنامتون خروجی بگیرید که پایتون اینطوری نیست.توی اپلیکیشن نویسی لازمه که اون زبان و کتابخانه و تکنولوژی های لازم توسط توسعه دهنده های او سیستم عامل حداقل تا حدودی ساپورت بشه تا نتیجه مطلوب بدست بیاد و کاربر رو در گیر تنضیمات اضافی نکنه که پایتون باز هم فکر می کنم بهتر عمل می کنه
پایتون رو هم می شه کامپایل کرد و خروجی .pyc گرفت.
سینتکس c برای کسی که به c یا خانواده هاش مسلط هست یک مزیت هست اما برای کسی که اشنایی نداره پایتون راحتتر هست حتی خود من هم که objective c کار کردم بازم با پایتون راحتتر هستم.
نب
در حال حاضر تعداد برنامه نویسای پایتون خیلی بیشتر از والا هست برای همین اگه خواستید یه امکان جدید به برنامتون اضافه کنید و بلد نبودید خیلی زودتر به نتیجه می رسین.یه جمله هم به دوست عزیز مسعود اموزگار : شما می گین که :\”از نظر امکانات هم با توجه به اینکه هنوز به نسخه ۱ هم نرسیده وضعیت مطلوبی داره. مسلما پیشرفت خواهد کرد.\” اجازه بدید فرض کنیم که در اینده خیلی بهتر از این باشه و مشکلی براش پیش نیاد این منطقی نیست که بخاطر اینکه در اینده ممکنه بهتر بشه از حالا این زبان رو ادم شروع کنه تازه بعد در نسخه بعدی دوباره وقت صرف کنه و تغییرات رو یاد بگیره بهتر هر وقت به قدرت مطلوب و مد نظر رسید روش وقت بزاریم و یاد بگیریم
من اولین باری هست که نام این زبان رو می شنوم و فکر نمی کنم تا به حال تعداد زیادی به اون روی اورده باشن به هر حال این زبان هم با اهداف خاصی ساخته شده اما مهم اینه که ایا این اهداف و قابلیت ها اونقدر ازش دارن که ما به سمت یک زبان تازه وارد بریم ؟ php تونست تا حد زیادی asp رو کنار بزنه و امار رو ارقام موفقیت اون رو ثابت می کنن چون مزایایی داشت که واقعا یه توسعه دهنده به اون نیاز داشت.
ShayanH:
۰۷ خرداد ۱۳۹۱
کسی که به C تسلط کامل داشته باشه نمیاد دوباره وقتش رو واسه یه زبان دیگه بذاره.مسعود آموزگار:
۰۷ خرداد ۱۳۹۱
منم همینطور فکر میکردم ولی یه سرچ کوچولو بزنید متوجه تعداد زیاد دولپرها میشید که بجای سی از والا استفاده میکنن. اغلب برنامههای گنوم به والا پورت شدن…
خیلی از برنامهنویسهای پایتون هم توی جاهایی که سرعت مهمه از والا استفاده میکنن. :)Ehsan Tork:
۰۸ خرداد ۱۳۹۱
پایتون فقط برای استفاده برای اسکریپت نویسی نیست و درسته که تفسیریه اما قابلیت کامپایل هم داره. همچنین پایتون با هر نوع Toolkitای قابل استفاده است و از نظر سرعت به نظر من چیزی از بقیه کم نداره. برنامههای زیادی هستن تو گنولینوکس که با پایتون نوشته شدن مثل گیمپ.C به عنوان یک زبان سطح میانی و نوشتن برنامههای سیستمی و .. خیلی به درد می خوره و بحثش جداست. اگر Vala رو با C++/Qt مقایسه کنیم هیچ حرفی برای گفتن نداره! و یه سوال Vala چه قابلیتهایی داره که C/GTK یا C++/GTK و حتی C++/GTK نداره؟
مسعود آموزگار:
۰۸ خرداد ۱۳۹۱
خوب هرکسی بنا بر شرایط میسنجه و زبان مورد نظر رو انتخاب میکنه. حتی شما هم وقتی یه جا سرعت فاکتور اصلی باشه نمیری سراغ پایتون مگه اینکه شخص چیز دیگهای بلد نباشه. بنابراین برنامه نویس هایی که بصورت حرفه ای کار میکنن همیشه چند تا زبان رو بلد هستن و در شرایط مختلف استفاده میکنن :)
منظورم از اون بخش هم این بود که به نظرم نباید بدبین باشیم و وجود این زبان رو بیهوده فرض کنیم.
الان اغلب برنامههای گنوم به والا پورت شدن و همینطور برنامههایی که برای گنوم با پایتون نوشته شده بودن هم دارن به والا پورت میشن. نمونه :
http://seilo.geekyogre.com/2011/11/zeitgeist-from-python-to-vala/pygtk هم وضعیت مساعدی نداره توسعهش و این روند رو تسریع کرده.
مجموعا حرف های شما هم درسته و کامنت من رو فرض بر مخالفت یا پاسخی به حرفهاتون نگیرید. بلکه فقط جهت دید متفاوتی به قضیه داریم :)مسعود آموزگار:
۰۸ خرداد ۱۳۹۱
بحث کیوت که جداست… والا برای گنوم خالص بیشتر استفاده میشه.
ویژگی های والا نسبت به سی که مشخصه و گفته شد مزایاش. سی++ خیلی پیچیدهتره و یادگیریش هم سخت تره… گمونم خود سازندهش هم کامل ازش سر در نمیاره!!
هرکدوم از اینا برای شرایط خاصی هستند.Ehsan Tork:
۰۸ خرداد ۱۳۹۱
C++ و از مفاهیم خیلی سرراستی بهره میبره مثلا استفاده از اشاره گرها، کلاسها تابع ها و … توس C++ خیلی سر راست هست.
این یک مثال از یه برنامه کوچیک با C++/Qt که هیچ اصن! پیچیده نیست!#include \”WordPad.h\”
#include
#include
#include
#include
#includeWordPad::WordPad()
{
QLineEdit* text = new QLineEdit( this );
setCentralWidget(text);
text->setText(\”Hello World\”);
QAction* a = new QAction(this);
a->setText( \”Quit\” );
connect(a, SIGNAL(triggered()), SLOT(close()) );
menuBar()->addMenu( \”File\” )->addAction( a );
}WordPad::~WordPad()
{}#include \”WordPad.moc\”
برنامه ی بالا یه فرم باز میکنه که توش یه منو هست با File->Quit و یه تکست که توش Hello World هست و با زدن دکمهی quit برنامه میبنده! با C++/GTK هم می شه همچین چیزی رو با یه مقدار تفاوت درست کرد!
تازه اگر از KDevelop استفاده بشه که کلی گزینههای گوناگون برای راهنمایی داره!
کاکیلیک:
۱۴ خرداد ۱۳۹۱
گپ بین والا و پایتون رو میتونید با Genie پر کنید.
https://live.gnome.org/Genie
برنامههاش هم با کمپایلر والا میشه کمپایل کرد.
خوش باشیدبیژن:
۱۶ خرداد ۱۳۹۱
خیلی پست مفیدی بود امیدوارم ادامه پیدا کندسروش:
۱۶ خرداد ۱۳۹۱
بحث جالبی هست
من شخصاً والا رو امتحان نکردم، اما چند تا چیز به ذهنم میرسه.اولین و مهمترین چیزی که کسی هم بهش اشاره نکرده اینه که مکانیسم کامپایل و لینک در والا چطوری هست؟ لینکر والا میتونه میتونه با باینریهای سی++ و سی متصل بشه؟
۲. تئوری زبان چطور هست؟ دقیقاً چه ساختارهایی رو پشتیبانی میکنه؟ این خیلی مهمه! باید آدم بدونه که زبان انواع دادهٔ زبان استاتیک هستند یا نه. یا این که data binding ها زمان اجرا انجام میشه یا زمان کامپایل.
۳. در نظر اول سینتکس زبان به شدت شبیه سیشارپ هست. از نظر من این خیلی خجالتآور هست و یک ضعف بزرگ محسوب میشه.
۴. در ویکی نوشته شده که والا از بعضی ویژگیهای زبانهای جدید برنامهنویسی مثل reference counting استفاده میکنه. این بهنظر من خیلی بده.در آخر این که بهنظر من یک زبان برنامهنویسی اگر در دنیای آکادمی طراحی نشده باشه به جایی نمیرسه. همونطور که سیشارپ و جاوا طراحیهای افتضاح دارند و به هیچ دردی نمیخورند.
سروش:
۱۶ خرداد ۱۳۹۱
Rather than being compiled directly to assembler or to another intermediate language, Vala is source-to-source compiled to C which is then compiled with a platform\’s standard C compiler, such as gcc.از این تیکه خیلی خوشم اومد. اشتباه بزرگی رو که توی سیشارپ، جاوا، و مونو انجام شده، اینجا تکرار نکردن. عوض ساخت یک runtime library نشستن کد تولید کردن. کدی که به کد ماشین خالص ترجمه خواهد شد. و این خیلی بهتر از اینه که یک مفسر بخواد سورس رو اجرا کنه.
و این این جواب سؤال اول رو هم میده. در واقع هیچ لینکری وجود نداره. یک کامپایلر هست که کد والا رو به کد سی/جیآبجکت تبدیل میکنه. پس هر چیزی که gcc بتونه با C/GObject کامپایلش کنه و ld هم بتونه بتونه بهش لینک بده، والا میتونه ازش استفاده کنه.