لینوکس، عشق، برنامه نویسی

لینوکس، عشق، برنامه نویسی

در این وبلاگ مطالبی درباره سیستم عامل لینوکس و همچنین درمورد برنامه نویسی و کامپیوتر مینویسم.

دوشنبه, ۹ فروردين ۱۴۰۰، ۱۲:۴۷ ق.ظ

 

آموزش زبان برنامه نویسی vala والا

 

 

 

فصل ۱: مقدمه

فصل ۲: انواع متغیر ها در والا

فصل ۳: دستورات کنترلی (if     if else     switch)

فصل ۴: حلقه های تکرار (for loop, while loop, for each)

فصل ۵: ارایه ها

فصل ۶: کلاس و آبجکت و مباحث مربوطه

فصل ۷: مدیریت خطاها (exception management) با استفاده از ساختار try catch

 

 

 

 

 

فصل ۱: مقدمه

 

سلام. به این آموزش متنی خوش اومدید. امیدوارم که آموزش خوبی برای این زبان برنامه نویسی باشه. فعلا طبق همین سرفصل هایی که نوشتم میریم جلو ولی ممکنه هم سرفصل ها و هم مطالب تغییر کنن و چیزایی بهشون اضافه یا کم بشه، حتما واسم کامنت بزارید و نظرتونو بگیدwink

 

  • vala چیست و چرا آن را دوست دارم

والا (vala) یک زبان برنامه نویسی آبجکت اورینتد، و اوپن سورس هست که توسط دو نفر از توسعه دهندگان تیم گنوم در سال ۲۰۰۶ ساخته شده و تا به امروز توسعه اش ادامه داره. همین اول اموزش بزارید چندتا حقیقت رو درباره والا بگم تا کیف کنید :)

۱- سینتکس والا تا حدود ۹۹ درصد شبیه سی شارپ هست (و همچنین جاوا)، پس بنابراین اگر شما سی شارپ و یا جاوا رو بلد هستید میشه گفت که vala رو هم بلدید :)

۲- vala یک زبان compiled language هست و بنابراین سرعت اجرای برنامه هایی که باهاش نوشته میشه زیاده
۳- vala یک زبان اوپن سورس هست و کامپایلرش بصورت اوپن سورس منتشر شده
۴- vala رو تیم گنوم توسعه میده (همون تیمی که دسکتاپ گنوم رو برای لینوکس ساختن)

۵- تیم المنتری او اس (elementary os) که یکی از زیباترین توزیع های لینوکسی هست، والا رو به عنوان زبان اصلیش برای توسعه ی دسکتاپش و همچنین نرم افزار هاش انتخاب کرده و برنامه هاشو با والا مینویسه
۶- سورس کد والا به راحتی به سورس کد زبان C تبدیل میشه و سپس کامپایلر C میاد و برنامه رو کامپایل میکنه، انگار که برنامه اصلا به زبان سی نوشته شده! (پایین تر درباره این مساله بیشتر توضیح میدم smiley)

 

  • مزیت vala نسبت به سی شارپ و جاوا

برنامه هایی که با سی شارپ و جاوا نوشته میشن برای اجرا شدن اصطلاحا به ویرچوال ماشین نیاز دارن. برنامه های سی شارپ برای اجرا شدن به دات نت و برنامه های جاوا به جاوا ویرچوال ماشین نیاز دارن و همین دلیل باعث میشه که سرعت اجرای برنامه های سی شارپ و جاوا کم باشه. اما vala یک زبان compiled language هست ینی سورس کدی که با زبان والا نوشته میشه مستقیم به کدهای ماشین کامپایل میشه و همین باعث میشه سرعت اجرای اونها زیاد باشه، انگار که برنامه با زبان سی نوشته شده!! در پایین فرایند کامپایل برنامه های والا رو توضیح میدم.

 

  • فرآیند کامپایل برنامه هایی که به زبان vala نوشته میشن

۱- شما برنامتون رو به زبان والا (که سینتکسش شبیه سی شارپ و جاوا هست) می نویسید.
۲- کامپایلر vala میاد و سورس شمارو تبدیل به سورس C میکنه
۳- کامپایلر C میاد و سورس سی رو تبدیل به زبان ماشین میکنه و فایل اجرایی تحویل میده(یعنی کامپایلر vala میاد و کامپایلر C رو فراخوانی میکنه و کامپایلر C ادامه ی کار رو پیش میبره)


همه ی این سه مرحله ای که گفتم درواقع باهم و در یک مرحله اتفاق میفته و من برای اینکه شما متوجه بشید اونارو جدا نوشتم. پس وقتی با vala برنامه مینوسید در اصل به زبان سی برنامه نوشتید. خیلی جالبه نه؟smiley vala سینتکس سی شارپ(جاوا) و سرعت زبان C رو همزمان در اختیار شما قرار میده smiley چی از این بهتر؟

 

  • شباهت ها و تفاوت های (java)#C و vala

والا و سی شارپ(جاوا) شباهت های خیلی زیادی با هم دارن، تقریبا ۹۹ درصد شبیه هم هستن، جوری که اگه سورس کد والا رو ببینید فک میکنید سی شارپه (یا جاواست). اما یه تفاوت های هم با هم دارن. از جمله اینکه در سی شارپ(و جاوا) شما method overloading دارید. ینی میتونید دوتا متد با نام یکسان بسازید که فقط ارگومان هاش با هم فرق دارن ولی vala اجازه ی متد اورلودینگ رو نمیده.
در سی شارپ(و جاوا) نام کلاس باید با نام فایل دقیقا یکی باشه، ولی در vala اجباری برای اینکار نیست. در سی شارپ(و جاوا) داخل یک فایل فقط یک کلاس میشه تعریف کرد ولی در والا در داخل یک فایل میتونید چندین کلاس تعریف کنید. در کل اگه میخاید به تفاوت های والا و سی شارپ و جاوا پی ببرید میتونید به اینجا و اینجا مراجعه کنید.

 

  • نصب کامپایلر vala در لینوکس

همونطور که گفتم، کامپایلر والا اوپن سورس هست بنابراین در مخازن اکثر توزیع ها باید موجود باشه و براحتی نصب میشه. اگه از توزیع آرچ و آرچ بیس ها (مثل مانجارو) استفاده میکنید، میتونید با دستور


sudo pacman -S vala

نصبش کنید. اگه هم از توزیع دبین و دبین بیس ها (مثل اوبونتو و مینت و ...) استفاده میکنید با دستور

 
sudo apt-get install vala
 

نصب کنید. برای اینکه مطمعن بشیم نصب شده میتونیم با دستور

 
vala --version
 


ورژن کامپایلر رو ببینیم . مال من 0.50.4 هست :) خب حالا که کامپایلر نصب شد بریم سراغ نوشتن اولین برنامه در والا ینی hello world smiley

 

  • نوشتن و کامپایل برنامه ی Hello World در والا

اول یک فایل متنی روی دسکتاپ (یا هر جا که دوس داشتید) درست میکنیم و اسم فایل رو میزاریم hello.vala و سورس کدمون رو داخلش مینویسم. دقت کنید که پسوند فایل رو حتما بزارید. ( سورس کد والا حتما باید داخل فایل های vala. باشن)

حالا سورس زیر رو کپی میکنیم داخل فایل و ذخیره میکنیم.

  
int main (string[] args) {     

stdout.printf ("Hello world! \n"); 

return 0; 

}
 

حالا میریم سراغ کامپایل. دستور زیر رو در ترمینال میزنیم تا برنامه کامپایل بشه و فایل اجرایی ساخته بشه. (دقت کنید که مسیر ترمینال دقیقا همون جایی باشه که سورس شما هست. (مال من روی دسکتاپه. پس بنابراین ابتدا در ترمینال میزنم cd Desktop تا برم روی دسکتاپ و سپس برنامم رو کامپایل میکنم)

 

  
valac hello.vala
  

و تمااامsmiley تبریک میگمsmiley همونطور که می بینید، فایل اجرایی با نام hello برای ما ساخته شد. دستور زیر رو میزنیم تا فایل اجرا بشه و پیام hello world رو صفحه چاپ بشهsmiley

 
./hello 
 

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

 

  • تبدیل سورس کد vala به سورس کد C

در بالا هم اشاره کردم که کامپایلر valac ابتدا سورس والا رو به سورس C تبدیل میکنه. برای اینکه به سورس C تبدیلش کنید کافیه C- رو بهش بدید (دقت کنید که C با حرف بزرگ نوشته شده). اگه اینو بهش بدید دیگه برنامه کامپایل نمیشه و فقط سورس سی رو بهتون میده. اینجوری:
 

 
valac -C hello.vala
 

 

دوستان، من که وقتی اولین بار با زبان vala اشنا شدم عاشقش شدم ولی با کمال تاسف این زبان رو در ایران خیلی کم میشناسن و اموزش های زیادی به زبان فارسی براش وجود نداره (میتونید تو گوگل به فارسی سرچ کنید "اموزش vala"، می بینید که هیچی نمیاره به جز یه اموزش ویدیویی که اقای علیرضا تیموریان سال ۱۳۹۵ زحمتش رو کشیده. به جز اون دیگه چیز خاصی درباره والا پیدا نمیکنید. امیدوارم من با این آموزشم بتونم اندکی این زبان رو بیشتر بشناسونم

 

 

 

 

 

 

 

فصل ۲: انواع متغیر ها در والا

 

سلام. در این فصل می خوایم ببینم چند نوع متغیر در والا وجود داره. بدون اتلاف وقت بریم سراغ اموزش. در این بخش خیلی مطلب میشه گفت ولی من خلاصه وار میگم که سردرگم نشیم.

مهمترین مطلبی که باید در همین ابتدا به شما بگم اینه که همونطور که در بالا هم گفتم، سورس کد والا ابتدا به سورس زبان C تبدیل میشه، پس متغیر هایی که در والا هستن در واقع متغیر هایی هستن که در زبان C داریم. در بالا بهتون گفتم که چجوری سورس والا رو تبدیل به سورس C بکنید. اینجوری میتونید برای راستی ازمایی، یک متغیر توی والا تعریف کنید و تبدیلش کنید به سورس C و ببینید معادل کدوم متغیر در C هست.

 

ما در والا چندین نوع متغیر داریم:

 

۱- متغیر از نوع string برای ذخیره رشته

خب استفاده از این متغیر خیلی راحته . در زیر یک سورس کدی رو مینویسم که از متغیر استرینگ استفاده میکنه. (این متغیر به char array در C تبدیل میشه موقع کامپایل)

 
public static int main (string[] args) {

		string myText = "hello world \n";
		stdout.printf(myText);
		return 0;
	}

 

در کد بالا یک متغیر به نام myText از نوع رشته ساختیم و روی صفحه چاپش کردیم. کافیه این سورس کد رو در یک فایل متنی به نام v.vala ذخیره کنید و دستور valac v.vala رو بزنید تا کامپایل بشه. درمورد استرینگ ها بازم نکاتی هست که بعد ها میگم.

 

۲- متغیر از نوع بولین boolean

این متغیر هم در همه زبان های برنامه نویسی هست و مقادیر true و false رو ذخیره میکنه. در سورس زیر یه مثال زدم.

 
public static int main(string[] args) {

    bool ready = true;

    if (ready == true) {
        stdout.printf("ready is true \n");
    } else {
        stdout.printf("ready is false \n");
    }

    return 0;
}
 

فک کنم سورس کاملا واضح هست و نیازی به توضیحات اضافه نداره

 

۳- متغیر های عددی

 متغیر های عددی شامل دو گروه عمده میشن.

 

۱- integral-type 

۲- floating-point-type

 

۱- integral-type یا همون متغیر های از نوع اینتیجر، برای ذخیره اعداد صحیح بکار می روند. انواع متغیر اینتیجر رو در زیر اوردم که می بینید. در این متغیر ها ما فقط میتونیم عدد صحیح ذخیره کنیم

 
char  // درباره چار پایین تر توضیح میدم
uchar
unichar
short
ushort
int
uint
long
ulong
size_t
ssize_t
int8
uint8
int16
uint16
int32
uint32
int64
uint64
 

 

 

۲- floating-point-type یا همون متغیر های از نوع فلوت، می تونن اعداد اعشاری رو در خودشون نگه دارن. انواع متغیر های فلوت رو در زیر اوردم.


float
double

خب در اینجا چندتا چیز رو من باید توضیح بدم.

اول اینکه اون حرف u در ابتدای بعضیاشون چیه؟
و دوم اینکه چرا متغیر های از نوع char در زیرمجموعه متغیر های عددی اومده؟
و سوم اینکه سایز بعضی از این متغیر ها روی ماشین های مختلف ممکنه فرق داشته باشه

 

  • حرف u که در ابتدای برخی از اونها اومده مخفف کلمه ی unsigned هست. در زبان c و همچنین والا، متغیری که unsigned باشه فقط میتونه مقادیر مثبت رو در خودش ذخیره کنه، ولی اگر unsigned نباشه، میتونه هم مقادیر مثبت و هم مقادیر منفی رو ذخیره کنه. یک مثال میزنم. متغیر int رو در نظر بگیرید، این متغیر میتونه اعداد صحیح مثب و منفی رو در خودش ذخیره کنه، برای مثال میتونید هم عدد 1400- و هم عدد 1400 رو در یک متغیر int ذخیره کنید. اما متغیر uint فقط میتونه مقادیر مثبت رو نگه داره که در مثالی که زدم، فقط مقدار 1400 رو میتونه در خودش ذخیره کنه.

 

  • چرا متغیر char زیر مجوعه متغیر های عددی اومده؟
    علتش برمی گرده به نحوه ی کار کامپیوتر ها و تاریخچه پیدایش کامپیوتر. کامپیوتر ها فقط عدد رو میفهمن. زمانی که کامپیوتر تو امریکا ساخته شد، اومدن و برای هر کاراکتر یک عدد مشخص کردن، مثلا به کاراکتر a عدد 97 رو اختصاص دادن و به کاراکتر b عدد 98 و به کاراکتر c عدد 99 و همینجوری تا اخر رفتن جلو و به هر کاراکتری یه عدد اختصاص دادن. حالا وقتی کامپیوتر عدد 97 رو میخونه، روی صفحه نمایش کاراکتر a رو نشون میده. و برای همین وقتی شما توی برنامه نویسی یه متغیر از نوع char تعریف میکنید در واقع دارید یه متغیر عددی تعریف میکنید چون اون کاراکتر تبدیل به عدد میشه

 

  • سایز این متغیر ها روی پلتفرم های مختلف متفاوت هست، به جز اون متغیر های که توشون عدد هست. مثلا سایز این متغیر ها در همه ماشین ها یکسان هست ( int8   uint8   int16   uint16 int32   uint32   int64   uint64 ) اما متغیر هایی مثل int، short، long سایزشون وابسته به پلتفرم هست و در همه جا ثابت نیست.

 

 

 

 

 

 

فصل ۳: دستورات کنترلی (if,  if else,  switch)

 

سلام. این فصل خیلی ساده هست. ساختارهای کنترلی if و switch در والا دقیقا مثل جاوا و سی شارپ هست. فقط  چندتا سورس رو به عنوان نمونه براتون میزارم و بعدش میریم فصل بعدی.

 

     
 public static int main(string[] args) {
     
      int a = 5;
      
      if (a > 0) {
    
        stdout.printf("a is greater than 0\n");
        
      } else if (a < 0) {
    
        stdout.printf("a is less than 0\n");
    
      } else {
    
        stdout.printf("a is equal to 0\n");
    
      }
    
      return 0;
      
 }
  

 

 

     
 public static int main(string[] args) {
    
      string name = "vala";
    
      switch (name) {
          
         case "C":
           stdout.printf("Your choice is C\n");
           break;
        
         case "Java":
           stdout.printf("Your choice is Java\n");
           break;
      
         case "C#":
           stdout.printf("Your choice is C#\n");
           break;
        
         default:
           stdout.printf("Vala is the best\n");
           break;
      }
    
      return 0;
 }
     

این فصل راحت بود و چیز خاصی نداشت. فقط موقع کد زدن به بزرگی یا کوچکی حروف دقت کنید چون والا مثل زبان C اصطلاحا case sensitive هست. اگر توی کیس دوم بجای java، Java (اولش با حرف کوچک) بنویسید، شرط درست از اب در نمیاد و دستور پرینت اجرا نمیشه.

 

 

 

 

 

 

 

 

فصل ۴: حلقه های تکرار

 

سلام. خب رسیدیم به فصل چهار، حلقه های تکرار. حلقه های تکرار توی همه ی زبان های برنامه نویسی موجود هستن و مطمعن هستم که شما هم باهاش خوب اشنا هستید. در زبان vala ما چهار تا ساختار برای حلقه های تکرار داریم

 

for

foreach

while

do while

 

حلقه های تکرار در زبان vala مانند جاوا و سی شارپ هستش. بنابراین فقط چند نمونه کد میزارم و این فصل رو هم تموم میکنیم :)

 

ساختار for

  
 int main()
 {

   for (int i = 0; i < 10; i++)
    {
      stdout.printf("test %d\n", i);
    }
   return 0;
 }

 

 

ساختار foreach

ساختار foreach برای لوپ کردن در طول یک لیست یا ارایه استفاده میشه و ساختارش مثل foreach در زبان جاوا  و سی شارپ هست.

 

 
 int main()
 {
    int[] foo = {1,2,3};

    string result = "";

    foreach (int i in foo) {

        result += i.to_string ();
    }
 
   return 0;
 }

 

ساختار while

  
 int main() 
 {
   int a = 5;
   int b = 10;
   
   while ( a < b) {

   stdout.printf("a is " + a.to_string() + "\n");
   a ++;
 }

   return 0;

 }

 

ساختار do while

 
 int main() 
 {
   int a = 5;
   int b = 10;
   
   do {

     stdout.printf("a is " + a.to_string() + "\n");
     a++;

   } while (a < b);

   return 0;

 }
 

درباره این ساختار های تکرار، هم در جاوا هم در سی شارپ و هم در والا نکات ریز دیگه ای هم وجود داره که کشف اون با خودتون cheeky

 

خب فصل ۴ هم تموم شد smiley

 

 

 

 

 

 

فصل ۵: ارایه ها

 

خب، امیدوارم مطالبی که تا اینجا براتون نوشته بودم مفید واقع شده باشه. خب بریم سراغ مبحث ارایه ها در زبان برنامه نویسی والا و چند تا نمونه کد ببینیم. ارایه ها در vala درست مثل سی شارپ و جاوا هستن و با استفاده از کلید واژه ی new باید تعریف بشن. در زیر یک قطعه کد برای نمونه می بینید.

 

مثال:

 
int main()
 {
  
   int[] a = new int[10];

// int[] b = { 2, 4, 6, 8 };  ارایه رو به این صورت هم می تونیم تعریف کنیم

   string lenghOfa = a.length.to_string();  

   stdout.printf("the lengh of a is: " + lenghOfa  + "\n");

   stdout.printf("value at a[9] is: " + a[9].to_string()  + "\n");
   
   return 0;
   
 }
 

 

 

اسلایس کردن slice

در والا میتونیم ارایه هارو اصطلاحا slice کنیم. اینجوری  [start:end]   ولی در سی شارپ و جاوا تا اونجایی که من اطلاع دارم نمیشه. slice یعنی تکه تکه کردن، درست مثل اینکه سوسیس رو تکه تکه کنیم. یه مثال میزنم دقت کنید.
 

مثال:

 
int main()
 {
 
  int[] b = { 2, 4, 6, 8 };

  int[] c = b[1:3];     // => { 4, 6 }
   
   return 0;
   
 }
 

در کد بالا ما یک ارایه جدید ساختیم به نام c که مقادیرش رو از ارایه b گرفته. خب این هم از بحث اسلایس کردن

 

 

در پایین یه قطعه کد نسبتا طولانی میزام. با بررسی اون میتونید چیزای جالب دیگه ای درباره آرایه ها در والا بدست بیارید

مثال:

 
 
// main method is at the end of these codes.

// If a in b
void if_a_in_b ( string a, string[] b, string b_name )  {
    if (a in b) {
        stdout.printf("Found %s in %s\n", a, b_name);
    }
    else {
        stdout.printf("%s not Found in %s\n", a, b_name);
    }
    return;
}

// One way to print an array
void print1 (string[] a, string a_name) {
    stdout.printf("Array %s: ", a_name);
    foreach (string item in a) {
        stdout.printf("%s, ", item);
    }
    stdout.printf("\n");
    return;
}

// Another way to print an array
void print2 (string[] a, string a_name) {
    string a_string = string.joinv(", ", a);
    stdout.printf("Array %s : %s\n", a_name, a_string);
    return;
}

// Index of an item in an array
void index_array (string[] a, string a_name, string match) {
    // Record the index of all matches
    int[] indexes = {};
    int i;
    for (i = 0; i < a.length; i++) {
        if (a[i] == match) {
            indexes += i;
        }
    }
    // Print the results
    if (indexes.length == 0) {
        stdout.printf("Indexing %s: %s not found\n", a_name, match);
    }
    else if (indexes.length == 1) {
        stdout.printf("Indexing %s: %s found at position %d\n",
        a_name, match, indexes[0]);        
    }
    else if (indexes.length == 2) {
        stdout.printf("Indexing %s: %s found at positions %d and %d\n",
        a_name, match, indexes[0], indexes[1]);        
    }
    else {
        stdout.printf("Indexing %s: %s found at positions ",
        a_name, match);
        // Convert ints to a strings
        int j;
        for (j = 0; j < indexes.length; j++) {
            if ( j < (indexes.length - 1)) {
                stdout.printf("%d, ", indexes[j]);
            }
            else {
                stdout.printf("and %d.\n", indexes[j]);
            }
        }
    }
    return;
}


void arrays () {
    // Create two string arrays
    string[] orange = { "fred", "joe", "allen", "steve" };
    string[] blue   = { "jane", "sam", "ellie", "terri" };

    // Test contents of each array
    if_a_in_b ("fred", orange, "Orange");
    if_a_in_b ("fred", blue, "Blue");

    // Length of an array
    stdout.printf("List length: %i\n", orange.length);

    // Item from an array
    stdout.printf("Orange item #2: %s\n", orange[1]);

    // Replace one string in an array
    blue[2] = "pamela";

    // Determine the index (location) of a string in an array
    index_array(blue, "blue", "pamela");

    // Append one string to an array
    blue += "stacy";

    // Print an array
    print1(orange, "orange");
    print2(blue, "blue");

    return;
}

// Main
public static void main() {
    arrays ();
    stdout.printf("Hello, World\n");
    return;
    }
 
 

 

 

آرایه های چند بعدی (Multi-dimensional arrays)

در والا هم درست مثل جاوا و سی شارپ میتونید از ارایه های چند بعدی استفاده کنید. در زیر یه نمونه کد میزارم.

 

 
int[,] c = new int[3,4];

int[,] d = { {2, 4, 6, 8},
             {3, 5, 7, 9},
             {1, 3, 5, 7}  };

d[2,3] = 42;
 

درباره آرایه های چند بعدی، تو سایت خود گنوم مطالب زیادی گفته شده، دیگه من نمیخام همش رو اینجا ریز به ریز توضیح بدم. فقط خواستم چند قطعه کد کوچیک جهت اشنایی بزارم. اگر میخاید درباره ارایه های دوبعدی در والا نکات بیشتری بدونید برید به این ادرس

 

 

 

فصل ۶: کلاس و آبجکت و مباحث مربوطه

 

 

 

 

 

این آموزش در دست تکمیل است ( کی تکمیل خواهد شد خدا میدونه cheeky )

 

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی