منوی برگه ها
TwitterRssFacebook
منوی دسته ها

نوشته شده توسط در خرد 6, 1391 در بخش برنامه‌/اسکریپت نویسی متن‌باز | 25 دیدگاه

برنامه نویسی به زبان Vala – قسمت اول

زبان‌های برنامه‌نویسی زیادی مبتنی بر سیستم‌عامل‌ها و بسترهای آزاد/متن‌باز طراحی شده و گسترش یافته‌اند. یکی از زبان‌های برنامه نویسی Cross-Platform (چند سکویی) و Object-Oriented (شی‌ء گرا) که از سال 2006 شروع به انتشار کرد، زبان 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 اجرا شود. اما چند نکته:

  1. کارایی برنامه‌هایی که به زبان Vala نوشته شده‌اند از بسیاری جهات مشابه برنامه‌های نوشته شده بر روی زبان C می‌باشد اما بسیار راحت‌تر و سریع‌تر نوشته و نگهداری می‌شوند.
  2. 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 برای کلاس خود در نظر بگیرید.

public static int main(string[] args) {

این قست از کد نشان دهنده‌ی قاعده‌ی کلی تعریف متدها در Vala است. متد نوعی تابع است که از طریق یک شیء قابلیت اجرا می‌یابد. متد ایستا یعنی اشاره‌گر مرتبط با شیء وجود ندارد و پشته فقط شامل آرگومان‌ها است. در حقیقت در Vala مانند C متد main آغازگاه برنامه است.

متد main نباید در یک کلاس تعریف بشود؛ در این صورت باید حتما کلاس مورد نظر از نوع static باشد (public بودن یا private بودن مهم نیست). نوع متغیر بازگشتی می‌تواند از نوع int یا void باشد. برنامه هنگام خروج در صورت void بودن، با دستور exit 0 بسته می‌شود.

stdout.printf(“Hello, World\n”);

stdout یک شیء در داخل Glib است. این خط، Vala رو موظف می‌کند که متد printf (از آبجکت stdout) را با ورود رشته (منظور Hello, World) فراخوانی کند. در Vala این سیاقِ نحوی (Syntax) معمولا سبک فراخوانی یک متد از یک شیء است. n/ هم ادامه‌ی برنامه رو در خط بعدی چاپ می کند.

return 0;

return یعنی برگرداندن یک متغیر به فراخوان و اتمام اجرای برنامه‌ی main. مقدار خروجی متد main به عنوان کد خروجی برنامه محسوب می‌شود. خط آخر هم نشان دهنده‌ی اتمام کلاس است.

کامپایل و اجرا

Vala را با دستور زیر (در اوبونتو) دانلود و نصب کنید:

sudo apt-get install valac

بعد از نصب، برای کامپایل و اجرای برنامه‌ی نوشته شده به زبان Vala می‌توانید از دستورات زیر استفاده کنید.

valac hello.vala
./hello

Valac یک کامپایلر زبان Vala است که کد شما را به خروجی باینری تبدیل می‌کند. خروجی برنامه دقیقا هم اسم با برنامه و در کنار برنامه تولید می‌شود.

مفاهیم پایه ای

سورس فایل‌ها و کامپایل کردن

تمام سورس فایل‌های‌های Vala از طریق دستور valac و flagهای ورودی اجرا می‌شوند. این دستور شبیه دستور کامپایل Java است، برای مثال:

valac compiler.vala –pkg libvala

که یک باینری به اسم compiler ایجاد می‌کند که به پکیج libvala لینک شده است. اگر نیاز دارید اسم باینری خروجی برنامه‌ی شما با اسم سورس فایل شما تفاوت داشته باشد و یا اگر برای ساخت باینری نیاز به کامپایل چند سورس فایل دارید می‌توانید از سوییچ -o استفاده کنید.:

valac source1.vala source2.vala -o myprogram
./myprogram

اگر نیاز دارید کد Vala را به C تبدیل کنید نیز می‌توانید از طریق اضافه کردن سوییچ c- به دستور کامپایل، خروجی ++C داشته باشید؛ این بدان معناست که شما می‌توانید با valac یک کد متوسط C از Vala استخراج کنید. valac هر فایل vala. را به یک فایل جداگانه (در اینجا فایل‌های source1.vala و source2.vala) به زبان C (با نام source1.c و source2.c) تبدیل می‌کند. همچنین نگاهی به ساختار تعریف کلاس در فایل خروجی از Vala نشان می‌دهد که تعریف یک کلاس در Vala مانند تعریف آن در C می‌باشد (البته با کمی اختصار).

اگر نیاز دارید یک فایل Header داشته باشید می‌توانید از سوییچ -H استفاده کنید:

valac hello.vala -C -H hello.h

امیدواریم از بخش اول استفاده لازم را برده باشید و در ادامه ما را همراهی کنید.

در قسمت بعد، به بررسی قواعد برنامه نویسی، رشته‌ها، آرایه‌ها و ارجاع‌ها در برنامه‌نویسی Vala خواهیم پرداخت.

برای بحث و رفع اشکال در مورد این سری آموزشی و زبان Vala به انجمن‌های تخصصی LinuxReview مراجعه نمایید.

به این پست امتیاز دهید

25 دیدگاه

  1. تشکر سامان جان، کار بزرگی رو شروع کردی. تکمیل بشه توی ویکی خروجیش یه کتاب 200-400 صفحه‌ای خواهد بود. پروژه خیلی خوبی از طرف لینوکس ریویو هست.
    اینجا هم توضیحات خوبی به زبان فارسی موجوده در مورد والا که اگر کسی خواست یه نگاه بهش بندازه بد نیست :
    http://pc2st.wordpress.com/2010/08/24/the-vala-programming-language/

  2. باز هم پایتون رو ترجیح می دم

    -خب شما گفتید “خروجی Vala به زبان C است، که می‌تواند بدون هیچگونه اطلاعات و کتابخانه اضافی بر روی محیط GNOME اجرا شود” حرف شما درست اما بگفته خود شما : “یکی از زبان‌های برنامه نویسی Cross-Platform” خارج از گنوم چی؟ اونوقت باز هم این مزیت پابرجاست؟

    -سیسنتکسش شبیه C هست و اصلا سینتکس C قشنگ نیست. این فقط وقتی مزیت هست که برنامه نویس مسلط به یکی از خانواده های C بخواد این زبان رو یاد بگیره ولی سینتکس c نسبت به پایتون حداقل برای یک تازه وارد سخت تره.

    -پایتون محبوبیت خوبی داره و همچنین طرفدار های زیادی این باعث می شه تا شما در حین یادگیری کلی مثال و سورس هم دم دست داشته باشی و تعداد زیادتری هستن که بتونن مشکل شما رو حل کنن.

    • خارج از گنوم، مثلا در محیط ویندوز، کامپایلر مخصوص به Vala وجود دارد که مانند VS عمل میکنه، یعنی خروجی بهتون میده و میتونین اجراش کنید.
      پایتون زبان بسیار عالی و خوبی هست، که کتابخونه های بسیار خوبی هم براش هست، مسلما Vala در بعضی موارد هنوز قابلیت رقابت با پایتون رو نداره. هر زبان در جایگاه خود زیباست.
      و فرمودید C سینتکس زیبایی نداره، نکته اینجاست که فکر میکنم این یه چیز سلیقه ای هست. نسبتا برنامه نویس های خانواده های C قابلیت یادگیری زبان های بیشتری مانند PHP رو دارند و سینتکس زبان C رو ترجیح میدن. البته باز هم میگم، این یه چیز سلیقه ای هست. :)

        • در مورد سينتكس هم من سليقه اي صحبت نمي كنم مثلا hello world پايتون رو با همين مقايسه كنيد چقدر سريعتر به نتيجه مي رسين؟ يا من فكر نمي كنم كسي دوست نداشته باشه خلاصه بنويسه و تا مي تونه از تايپ بيهوده جلوگيري كنه

        • دوست خوبم اگر اینطور بود که شما میگی که همه زبان‌ها میمردن و اونی که جمع و جورتره میموند. تبدیل کد به سی یه مزیت خیلی بزرگه برای این زبان. درسته این هم سطح بالا هست ولی میتونه مزیت های یه زبون سطح پایین رو منتقل کنه. سینتکس بسیار مشابهی هم با سی شارپ داره (صرفا سینتکس منظورم بود). از نظر امکانات هم با توجه به اینکه هنوز به نسخه 1 هم نرسیده وضعیت مطلوبی داره. مسلما پیشرفت خواهد کرد.
          در مجموع همیشه در شرایط گوناگون استفاده از زبان‌های مناسب اون شرایط منطقی‌تره. :) کسی که لازمه با C و GObject برنامه بنویسه مسلما استفاده از Vala براش خیلی بهتر خواهد بود.

      • منظورم اين نبود كه خارج از گنوم چطوري مي شه ازش استفاده كرد منظورم اينه كه خارج از گنوم ديگه “بدون احتياج به هيچ اطلاعات يا كتابخانه اضافي” برقرار نيست و ديگه رو اين مزيت نام برده شده نمي شه تاكيد كرد.

  3. ممنون سامان جان
    این پست‌های آموزشی واقعا ارزش زیادی دارند

  4. این لینک سرعت نهایی برنامه‌ای که با والا نوشته شده رو با برنامه نوشته شده با پایتون مقایسه کرده :
    http://compsci.ca/v3/viewtopic.php?t=26633

    تفاوتش خیلی بالاست! توی این نمونه برنامه والا 60 برابر سریع‌تره…

  5. ممنون سامان جان‌، پست خوبی بود‌!
    در ادامه‌ی بحث کامنت‌ها یک نکته رو متذکر می‌شم که پایتون یک زبان تفسیری و در واقع مناسب اسکریپت نویسی است ولی والا یا Cعه بد سینتکس (جدی می‌گی؟) یک زبان کامپایل شدنی و خیلی خیلی نزدیک‌تر به زبان ماشین‌! مقایسه‌ی این دو خیلی بیهوده‌ست‌!

    مخصوصا مقایسه توی سرعت اجراشون‌! هر کدوم برای هدف متفاوتی ساخته شده‌! والا رو می‌شه مثلا با C# مقایسه کرد یا حتی بیسیک‌! پایتون هم با پرل یا PHP!

    • مقايسه اصلا كار بيهوده اي نيست اگه مقايسه نكنيم نمي تونيم يه زبان رو انتخاب كنيم اما بايد با هدف خاصي مقايسه كنيم و مقايسه كلي درست نيست
      من گفتم : “باز هم پايتون رو ترجيح مي دم” اين يعني بسته به استفاده و خواسته ي من پايتون بهترين مي تونه باشه
      من به عنوان يه اپليكشن نويس بايد با يه زبان cross-platform طرف باشم ولا رو نمي دونم اما توي سي شما احتياج دارين كه براي هر سيستم عامل با همون سيستم عامل از برنامتون خروجي بگيريد كه پايتون اينطوري نيست.

      توي اپليكيشن نويسي لازمه كه اون زبان و كتابخانه و تكنولوژي هاي لازم توسط توسعه دهنده هاي او سيستم عامل حداقل تا حدودي ساپورت بشه تا نتيجه مطلوب بدست بياد و كاربر رو در گير تنضيمات اضافي نكنه كه پايتون باز هم فكر مي كنم بهتر عمل مي كنه

      پايتون رو هم مي شه كامپايل كرد و خروجي .pyc گرفت.

      سينتكس c براي كسي كه به c يا خانواده هاش مسلط هست يك مزيت هست اما براي كسي كه اشنايي نداره پايتون راحتتر هست حتي خود من هم كه objective c كار كردم بازم با پايتون راحتتر هستم.
      نب
      در حال حاضر تعداد برنامه نويساي پايتون خيلي بيشتر از والا هست براي همين اگه خواستيد يه امكان جديد به برنامتون اضافه كنيد و بلد نبوديد خيلي زودتر به نتيجه مي رسين.

      يه جمله هم به دوست عزيز مسعود اموزگار : شما مي گين كه :”از نظر امکانات هم با توجه به اینکه هنوز به نسخه ۱ هم نرسیده وضعیت مطلوبی داره. مسلما پیشرفت خواهد کرد.” اجازه بديد فرض كنيم كه در اينده خيلي بهتر از اين باشه و مشكلي براش پيش نياد اين منطقي نيست كه بخاطر اينكه در اينده ممكنه بهتر بشه از حالا اين زبان رو ادم شروع كنه تازه بعد در نسخه بعدي دوباره وقت صرف كنه و تغييرات رو ياد بگيره بهتر هر وقت به قدرت مطلوب و مد نظر رسيد روش وقت بزاريم و ياد بگيريم

      من اولين باري هست كه نام اين زبان رو مي شنوم و فكر نمي كنم تا به حال تعداد زيادي به اون روي اورده باشن به هر حال اين زبان هم با اهداف خاصي ساخته شده اما مهم اينه كه ايا اين اهداف و قابليت ها اونقدر ازش دارن كه ما به سمت يك زبان تازه وارد بريم ؟ php تونست تا حد زيادي asp رو كنار بزنه و امار رو ارقام موفقيت اون رو ثابت مي كنن چون مزايايي داشت كه واقعا يه توسعه دهنده به اون نياز داشت.

      • خوب هرکسی بنا بر شرایط میسنجه و زبان مورد نظر رو انتخاب میکنه. حتی شما هم وقتی یه جا سرعت فاکتور اصلی باشه نمیری سراغ پایتون مگه اینکه شخص چیز دیگه‌ای بلد نباشه. بنابراین برنامه نویس هایی که بصورت حرفه ای کار میکنن همیشه چند تا زبان رو بلد هستن و در شرایط مختلف استفاده میکنن :)
        منظورم از اون بخش هم این بود که به نظرم نباید بدبین باشیم و وجود این زبان رو بیهوده فرض کنیم.
        الان اغلب برنامه‌های گنوم به والا پورت شدن و همینطور برنامه‌هایی که برای گنوم با پایتون نوشته شده بودن هم دارن به والا پورت میشن. نمونه :
        http://seilo.geekyogre.com/2011/11/zeitgeist-from-python-to-vala/

        pygtk هم وضعیت مساعدی نداره توسعه‌ش و این روند رو تسریع کرده.
        مجموعا حرف های شما هم درسته و کامنت من رو فرض بر مخالفت یا پاسخی به حرف‌هاتون نگیرید. بلکه فقط جهت دید متفاوتی به قضیه داریم :)

    • پایتون فقط برای استفاده برای اسکریپت نویسی نیست و درسته که تفسیریه اما قابلیت کامپایل هم داره. همچنین پایتون با هر نوع Toolkit‌ای قابل استفاده است و از نظر سرعت به نظر من چیزی از بقیه کم نداره. برنامه‌های زیادی هستن تو گنولینوکس که با پایتون نوشته شدن مثل گیمپ.

      C به عنوان یک زبان سطح میانی و نوشتن برنامه‌های سیستمی و .. خیلی به درد می خوره و بحثش جداست. اگر Vala رو با C++/Qt مقایسه کنیم هیچ حرفی برای گفتن نداره! و یه سوال Vala چه قابلیت‌هایی داره که C/GTK یا C++/GTK و حتی C++/GTK نداره؟

      • بحث کیوت که جداست… والا برای گنوم خالص بیشتر استفاده میشه.
        ویژگی های والا نسبت به سی که مشخصه و گفته شد مزایاش. سی++ خیلی پیچیده‌تره و یادگیریش هم سخت تره… گمونم خود سازنده‌ش هم کامل ازش سر در نمیاره!!
        هرکدوم از اینا برای شرایط خاصی هستند.

        • C++ و از مفاهیم خیلی سرراستی بهره می‌بره مثلا استفاده از اشاره گر‌ها، کلاسها تابع ها و … توس C++ خیلی سر راست هست.
          این یک مثال از یه برنامه کوچیک با C++/Qt که هیچ اصن! پیچیده نیست!

          #include “WordPad.h”

          #include
          #include
          #include
          #include
          #include

          WordPad::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 استفاده بشه که کلی گزینه‌های گوناگون برای راهنمایی داره!

  6. کسی که به C تسلط کامل داشته باشه نمیاد دوباره وقتش رو واسه یه زبان دیگه بذاره.

    • منم همینطور فکر میکردم ولی یه سرچ کوچولو بزنید متوجه تعداد زیاد دولپرها میشید که بجای سی از والا استفاده میکنن. اغلب برنامه‌های گنوم به والا پورت شدن…
      خیلی از برنامه‌نویس‌های پایتون هم توی جاهایی که سرعت مهمه از والا استفاده میکنن. :)

  7. گپ بین والا و پایتون رو می‌تونید با Genie پر کنید.
    https://live.gnome.org/Genie
    برنامه‌هاش هم با کمپایلر والا می‌شه کمپایل کرد.
    خوش باشید

  8. خیلی پست مفیدی بود امیدوارم ادامه پیدا کند

  9. بحث جالبی هست
    من شخصاً والا رو امتحان نکردم، اما چند تا چیز به ذهنم می‌رسه.

    اولین و مهم‌ترین چیزی که کسی هم بهش اشاره نکرده اینه که مکانیسم کامپایل و لینک در والا چطوری هست؟ لینکر والا می‌تونه می‌تونه با باینری‌های سی++ و سی متصل بشه؟
    ۲. تئوری زبان چطور هست؟ دقیقاً چه ساختارهایی رو پشتیبانی می‌کنه؟ این خیلی مهمه! باید آدم بدونه که زبان انواع دادهٔ زبان استاتیک هستند یا نه. یا این که data binding ها زمان اجرا انجام میشه یا زمان کامپایل.
    ۳. در نظر اول سینتکس زبان به شدت شبیه سی‌شارپ هست. از نظر من این خیلی خجالت‌آور هست و یک ضعف بزرگ محسوب میشه.
    ۴. در ویکی نوشته شده که والا از بعضی ویژگی‌های زبان‌های جدید برنامه‌نویسی مثل reference counting استفاده می‌کنه. این به‌نظر من خیلی بده.

    در آخر این که به‌نظر من یک زبان برنامه‌نویسی اگر در دنیای آکادمی طراحی نشده باشه به جایی نمی‌رسه. همونطور که سی‌شارپ و جاوا طراحی‌های افتضاح دارند و به هیچ دردی نمی‌خورند.

  10. ‏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 هم بتونه بتونه بهش لینک بده، والا میتونه ازش استفاده کنه.

  11. فقط c++ و qt و php رو عشقه.

ارسال یک پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

مرا از دیدگاه‌های پس از این، به وسیله‌ی ایمیل آگاه کن. شما همچنین می‌توانید بدون گذاشتن دیدگاه مشترک شوید.