**کولا** زبان برنامه نویسی شبیه به جاوا و سی شارپ با برخی از ویژگی‌های سطح بالاتر از پرل و روبی از جمله عبارات منظم طبقه اول است. می‌تواند توسطMicrosoft .NET CLR یا Parrot virtual machine کامپایل شود
کولا یک زبان کامپایل شده با بررسی نوع ایستاست، اما طراح برخی از ویژگی‌های عام تر زبان‌های اسکریپت نویسی مانند پرل و روبی را با آن آمیخته است. بر طبق آنچه نویسنده بیان کرده‌است، بعد از سال‌ها استفاده از جاوا و سی پلاس پلاس برای پروژه‌های بزرگ و پرل برای پروژه‌های کوچک تا متوسط به نظر می‌رسید هیچ زبانی فاصله بین این دو را پر نخواهد کرد. کولا بیشتر ترکیبی از چند زبان قدرتمند با در نظر گرفتن اصول کلیدی زیر است تا طراحی یک زبان جدید:
با داشتن براکت‌ها و سمی کالن در کولا، برنامه نویسان سی پلاس پلاس، جاوا و پرل باید راحت باشند و فضای سفید هیچ تأثیری روی نحو ندارد.
کنوانسیون بر کد - مطالبی که قرار دادیند نیاز به اعلان صریح ندارند.

نسبت بالای سیگنال بر نویز
-------------------------

از قرارداد کد برای کاهش در هم ریختگی کلمه کلیدی و افزایش خوانایی استفاده کنید. بیان یک ایده و اجرای ان را با هم اشتباه نکنید.
جاوا و C# این را به صورت یک انتخاب ضعیف از حوزه پیش‌فرض دسترسی به زمینه هاو توابع نمایش می‌دهند که تضمین می‌کنند بهره‌وری فایل‌های منبع با حوزه دسترسی کلمات کلیدی غربال می‌شود. برای مثال استفاده از کلمه کلیدی publicبر اساس آنالیز کد منبع نمونه‌های واقعی، بر گرامر C#و جاوا غلبه می‌کند. کولا پیش فرض‌های متفاوتی را ایجاد می‌کند، به علاوه از سبک بخش‌های حوزه دسترسی C++ که نباید به ازای هر عضو یک کلمه کلیدی داشت پشتیبانی می‌کند.

. رشته‌ها و پردازش متن اولین اولویت هستند—بیشتر برنامه‌ها شامل رشته‌ها و دستکاری متن می‌باشند. حمایت از عبارت منظم به طرز چشمگیری قدرت زبان را افزایش می‌دهد، اما نحو داخلی برای عبارات منظم خوانایی را افزایش می‌دهد و ترکیب این دو عملکرد برنامه را ارتقاء می‌دهد. در شرایط مقداردهی یا استفاده از یک متغیرغیر رشته‌ای دررشته، یا متون مبهم، کولا در صورت امکان متغیر را به رشته تبدیل می‌کند، به جای آن که باعث یک تبدیل نوع خارجی شود.
سوئیچ کامپایلری می‌تواند حالت خطا یا هشدار در مورد تبدیل نوع خودکار را فعال کند.

برنامه Hello World! به سه روش زیر نوشته می‌شود:

```
// C/Perl-style without classes
// Cola package/global methods are static by default, void by default
```

```
string mesg = "Hello world\n";
main() {
 print(mesg);
}
```

```
// Cola OO-style
// classes, methods and constructors public by default, fields private by default
class Hello {
 string mesg;
 new() { mesg = "Hello world\n"; }
 static void main() {
 print(mesg);
 }
}
```

```
// Cola OO-style, explicit scope access (C++ style)
// classes, methods and constructors public by default, fields private by default
class Hello {
 protected:
 string mesg;
 public:
 new() { mesg = "Hello world\n"; }
 static void main() {
 print(mesg);
 }
}
```

به جای استفاده از سازنده‌های اسمی متناظر با نام کلاس در زبان‌های سنتی C++ / جاوا / C#، کولا از new , delete به عنوان سازنده و مخرب به منظور ساده‌سازی ظاهر کد و ارتقای عملکرد چینش و الصاق استفاده می‌کند.

کولا هر دو حالت پیشوندی و پسوندی و هر دو حالت ایستا و پویا برای تعریف ابعاد یک آرایه را ارائه می‌کند. این یک امکان کاربردی برای برنامه نویس است که به راحتی از پیشینه برنامه نویسی خود استفاده کند و آرایه‌های ایستا را کاهش دهد.

```
int[] arr = new int[12];    // prefix, dynamic
int arr[] = new int[12];    // postfix, dynamic
int[12] arr;                // prefix, static auto-allocated
int arr[12];                // postfix, static auto-allocated
```

یک مثال از پشتیبانی کولا از عبارات منظم و تطابق در زیر آمده‌است. ابتدا یک مثال معمولی که ظاهر Perl را باز تولید می‌کند.

```
// implicit match backreference
if(mesg =~ /(yes)(madam)/) {
 print("In string: "+ $۰);
 print("we matched: "+ $۱ + ", "+ $۲);
}
```

کولا شامل یک علامت گذاری متن بسیار قوی برای تطابق با نام match aliasing می‌شود. به عبارت ساده، هر عبارت تطابقی می‌تواند به عنوان یک شی از نوع match تعریف می‌شود. به سادگی این شی را به عنوان بخشی از عبارت قرار دهید. (مشابه با اساس تعریف یک تکرارکننده دارای نام در C++ و جاوا در یک حلقه for)

```
// explicit named match example
if(str =~ /foo(bar)/ as match1) {
   // default is matchA
 print(match1. $۱);
}
```

برای حوزه عبارت if،match1 در حوزه است و می‌تواند برای وضوح به کار رود. مزیت match aliasing هنگامی که ما تطابق‌های لانه‌ای متعدد داریم بیشتر مشهود است.
if(str =~ /foo(bar)/ as match1) {

```
  // We can use a backreference in a new match expression
  // $1 refers to match1 until a new match expression, after which
  // it refers to the new match in immediate scope. To refer back
  // we use match1 alias (match1. $۱)
 if($۱ =~ /b(ar)/ as match2) {
 print(match1. $۱);    // match1 still in scope
 print(match2. $۱);    // match2 now in scope, and the default
 print($۱);           // same as match2. $۱
 }
}
```

کولا چند استنتاج نوع ایستا با استفاده از کلمه کلیدی var(مشابه C#) یا یک دستور new دارد که نوع از سمت راست استنتاج می‌شود.

```
// equivalent
var s = new Dog();
Dog s = new;
```

همچنین از سازنده موازی برای ساخت یک شی از شی دیگر پشتیبانی می‌شود.

```
Animal a = new Dog();
Animal b = a.new();
var v = a.new();  // v will be of the Animal type, but receives a Dog
```

کولا شامل یک عبارت foreach()نیز می‌شود که در حال حاضر روی آرایه‌ها و انواع داده‌ای داخلی دات نت موجود در system.collections و هر کلاسی که دارای تابع IEnumerator GetEnumerator()"" باشد را پشتیبانی می‌کند. foreach در کولامشابه با C# است که کد تکرار آرایه را هنگام استفاده از آرایه تولید می‌کند یا از واسط IEnumerator خروجی GetEnumeratorاستفاده می‌کند.

```
 // Uses .NET System.Collections
 var list = new System.Collections.ArrayList();   // note the inferred type
 list.Add("LITTLEDOG");
 list.Add("BIGDOG");
 list.Add("LITTLECAT");
 list.Add("BIGCAT");
 foreach(string s in list) {
    // Nested named matching
 if(s =~ /(LITTLE|BIG)/ as size) {
 if(s =~ /(DOG|CAT)/ as animal)
 print("Animal is a "+ size. $1 + "" + animal. $۱);
 }
 }
```

استفاده از بسیاری از کتابخانه‌های CLR دات نت ممکن است.

```
// System.IO.File sample
main() {
 foreach(var line in System.IO.File.ReadAllLines("flintstones.txt"))
 if(line =~ /FRED/)
 print(line);
}
// .NET System.Xml Example
main() {
 var doc = new System.Xml.XmlDocument();
 doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5' misc='sale item'>" +
 "<title>The Handmaid's Tale</title>" +
 "<price>14.95</price>" +
 "</book>");
 var myElement = doc.get_DocumentElement();
 print(myElement.ToString());
 print(myElement.get_InnerXml());
}
// Oracle.DataAccess sample
main() {
 string first, last;
 var conn = new Oracle.DataAccess.Client.OracleConnection("Data Source=DEV;User Id=scott;Password=tiger;");
 conn.Open();
 var cmd = new Oracle.DataAccess.Client.OracleCommand("select first_name, last_name from doctor", conn);
 var reader = cmd.ExecuteReader();
 while(reader.Read()) {
 first = reader.GetString(0);
 last = reader.GetString(1);
 print(first + "" + last);
 conn.Close();
}
```

منابع
-----

ویکی‌پدیای انگلیسی