کولا (زبان برنامه‌نویسی)

کولا زبان برنامه نویسی شبیه به جاوا و سی شارپ با برخی از ویژگی‌های سطح بالاتر از پرل و روبی از جمله عبارات منظم طبقه اول است. می‌تواند توسط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("" +
  "The Handmaid's Tale" +
  "14.95" +
  "");
  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();
 }

منابع 

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

زبان‌های برنامه‌نویسی دات‌نت
زبان‌های برنامه‌نویسی ساخته‌شده در ۲۰۰۹ (میلادی)
ویکی‌سازی رباتیک