زبان برنامه نویسی کربن چیست؟ — همه چیز درباره کربن گوگل

۴۰۰ بازدید
آخرین به‌روزرسانی: ۲۶ اردیبهشت ۱۴۰۲
زمان مطالعه: ۱۰ دقیقه
زبان برنامه نویسی کربن چیست؟ — همه چیز درباره کربن گوگل

زبان برنامه نویسی کربن (Carbon Programming Language) یکی از جدیدترین زبان‌هایی به حساب می‌آید که اخیراً توسط شرکت گوگل معرفی شده است. این شرکت به‌صورت مداوم به ارائه پلتفرم‌ها و زبان‌های برنامه نویسی جدید با قابلیت‌ها و ابزارهای نوین و کارامد می‌پردازد. زبان کربن گوگل، جایگزینی برای زبان برنامه نویسی C++‎ محسوب می‌شود. مقاله حاضر، با محوریت پاسخ به این پرسش که «زبان برنامه نویسی کربن چیست» و به منظور ارائه دلیل ظهور این زبان و شرح ویژگی‌های آن نوشته شده است و دستورات مقدماتی این زبان برنامه نویسی به همراه مثال توضیح داده می‌شوند.

زبان برنامه نویسی کربن چیست ؟

توسعه دهندگان گوگل، زبان برنامه نویسی آزمایشی جدیدی را با نام «کربن» (Carbon) ارائه کرده‌اند. این زبان می‌تواند به عنوان زبانی جایگزین برای زبان برنامه نویسی C++‎ محسوب شود که از امکانات جدیدی نظیر امنیت حافظه و «برنامه نویسی همگانی» (Generic) پشتیبانی می‌کند.

زبان‌های برنامه نویسی جایگزین زبان‌های جاوا اسکریپت، جاوا و C++‎
زبان‌های برنامه نویسی جایگزین زبان‌های جاوا اسکریپت، جاوا و C++‎

زبان کربن گوگل مانند زبان‌های برنامه نویسی Typescript و Kotlin است که به منظور به‌روزرسانی و افزایش قابلیت‌های زبان‌های جاوا اسکریپت و جاوا ارائه شدند. این زبان اخیراً (در سال 2022) برای نخستین بار در کنفرانس CCP North تورنتو توسط «چندلر کاروث» (Chandler Carruth) معرفی شد. در ادامه، به نقاط ضعف زبان برنامه نویسی C++‎ و اهداف زبان جایگزین آن، یعنی زبان کربن، پرداخته می‌شود.

نقطه ضعف زبان برنامه نویسی C++‌‎ چیست ؟

زبان برنامه نویسی C++‎ در سال 1982 ساخته شد و در سال 1985 در دسترس عموم قرار گرفت. این زبان، به عنوان یکی از زبان‌های همه‌منظوره تلقی می‌شود که دارای ویژگی‌های مختلفی مانند حساس بودن به حروف بزرگ و کوچک و «اشاره‌گرها» (Pointers) است و از شی‌گرایی پشتیبانی می‌کند. همچنین، این زبان دارای انواع مختلفی از کتابخانه‌ها است که با استفاده از آن‌ها می‌توان عملیات مختلفی را بر روی داده‌ها اعمال کرد.

زبان C++‎ جایگزین زبان C
زبان C++‎ جایگزین زبان C

زبان C++‎ به عنوان جایگزینی برای زبان برنامه نویسی C محسوب می‌شود. این زبان یکی از زبان‌های پرکاربرد برای توسعه پروژه‌های نرم‌افزاری است و اهدافی به منظور بهبود این زبان در نظر گرفته شده است که عبارت‌اند از:

  • تحول و تغییر در ساختار زبان و شیوه طراحی نرم‌افزار
  • خواندن، نوشتن و درک قطعه‌ کدها به شیوه‌ای آسان
  • تعریف سازوکار جدید برای تست و امنیت برنامه‌ها
  • توسعه سریع برنامه‌ها و مقیاس‌پذیر بودن آن‌ها
  • پشتیبانی از پلتفرم‌های جدید سیستم‌عامل‌ها، محیط‌ها و معماری‌های سخت‌افزاری

با این حال، در مسیر توسعه زبان C++‌‎، مشکلات جدی وجود دارد. یکی از مهم‌ترین مسائل چالش‌برانگیز این زبان، «بدهی‌های فنی» (Technical Debts) است که در طی سالیان بسیار بر روی هم انباشه شده‌اند. بدهی‌های فنی شامل مجموعه اقداماتی هستند که تیم برنامه نویسی به منظور طراحی برنامه یا بخشی از پروژه انجام می‌دهند تا محصول هر چه سریع‌تر در اختیار کاربران و مشتریان قرار گیرد، اما اغلب باید این اقدامات در بازه‌ زمانی دیگری اصلاح ‌یا به‌روزرسانی شوند.

همچنین، در طی دورانی که زبان C++‎ مورد استفاده عموم قرار گرفت، ویژگی‌ها و قابلیت‌های جدیدی به این زبان اضافه شد. بخشی از این ویژگی‌ها باید جایگزین قابلیت‌های قبلی این زبان می‌شد. با این حال، ویژگی‌ها و قابلیت‌های قبلی از این زبان حذف نشده‌اند و در حال حاضر، ویژگی‌های ناقص و تکراری در این زبان وجود دارند.

اهداف زبان کربن گوگل چیست ؟

تیم برنامه نویسی زبان کربن زمان بسیاری را صرف طراحی این زبان کرده‌اند تا مشکلات موجود در زبان برنامه نویسی C++‎ را در این زبان حل کنند. به عبارتی، زبان برنامه نویسی کربن به منظور ایجاد تحول در قابلیت‌های برنامه نویسی و توسعه نرم‌افزار به وجود آمد. هدف برنامه نویسان این زبان، ارائه زبانی با «نحو | سینتکس» (Syntax) ساده است، به گونه‌ای که نوشتن و خواندن قطعه کدهای برنامه به شکل ساده انجام شود.

زبان برنامه نویسی کربن به عنوان جایگزین زبان C++‎
زبان برنامه نویسی کربن به عنوان جایگزین زبان C++‎

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

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

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

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

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

قابلیت های زبان برنامه نویسی کربن گوگل چیست ؟

زبان برنامه نویسی کربن سازوکار امنی را برای انجام تست برنامه‌های نرم‌افزاری فراهم کرده که همین امر ساختار برنامه نویسی را بهبود بخشیده است. افزون‌براین، می‌توان قطعه‌کدهای زبان C++‎ را در این زبان اجرا کرد. همچنین زبان برنامه نویسی کربن از ابزارها، پردازش‌ها و اصول برنامه نویسی به‌صورت «دسترسی باز» (Open Source) پشتیبانی می‌کند و دارای «ساختار حاکمیت» (Governance Structure) شفافی برای توسعه زبان برنامه نویسی است.

به‌علاوه، این زبان همانند سایر زبان‌های برنامه نویسی دارای ابزارهایی مانند «محیط توسعه یکپارچه» (Integrated Development Environment | IDE)، کتابخانه‌های استاندارد و کامپایلر است. نحو زبان کربن گوگل ویژگی‌های مختلفی دارد که در ادامه به برخی از مهم‌ترین آن‌ها اشاره شده است:

  • زبان برنامه نویسی کربن دارای کلمات کلیدی خاصی برای معرفی اجزای مختلف برنامه نویسی نظیر var  برای اعلان متغیرها و fn  برای اعلان توابع است.
  • پارامترهای ورودی توابع را نمی‌توان تغییر داد و صرفاً آن‌ها را می‌توان خواند.
  • زبان کربن گوگل دارای ویژگی «اشاره‌گر» (Pointer) است که امکان ایجاد دسترسی غیرمستقیم به متغیرها را فراهم می‌کند.
  • «فضای نام» (Namespace) در زبان برنامه نویسی کربن به‌صورت محلی استفاده می‌شود.

ابزارهای زبان کربن گوگل

به منظور آشنایی مقدماتی با زبان برنامه نویسی کربن گوگل می‌توان به برخی از ابزارها و قابلیت‌های این زبان به‌طور کلی اشاره کرد. این زبان دارای ابزارهای مختلفی است که قابلیت‌های مختلفی را در اختیار برنامه نویسان می‌گذارند. برخی از این ابزارها در ادامه فهرست شده‌اند:

  • ابزار Homebrew: این ابزار به عنوان مدیر «بسته‌های» (Packages) زبان برنامه نویسی کربن محسوب می‌شود که پس از نصب زبان کربن بر روی کامپیوتر، می‌توان از آن استفاده کرد. با دستور brew --version  می‌توان نسخه نصب شده این ابزار را نیز بررسی کرد.
  • ابزار Bazel: از این ابزار به منظور تست برنامه و ساخت پروژه با دسترسی باز استفاده می‌شود. می‌توان این ابزار را با دستور brew install bazelisk  بر روی کامپیوتر نصب کرد.
  • ابزار LLVM: از ابزار LLVM به منظور کامپایل کردن قطعه کدهای زبان برنامه نویسی کربن استفاده می‌شود. برای نصب این ابزار بر روی کامپیوتر می‌توان از دستور brew install llvm  استفاده کرد. برای استفاده از ابزار LLVM در سیستم‌عامل‌های مک OS باید path  را با دستور زیر به‌روزرسانی کرد:
1export PATH="$(brew --prefix llvm)/bin:${PATH}"
  • دستور Clone: با استفاده از دستور Clone می‌توان برنامه نوشته شده به زبان کربن گوگل را بر روی سیستم دانلود و از آن استفاده کرد:
1$ git clone <a class="au mf" href="https://github.com/carbon-language/carbon-lang" target="_blank" rel="noopener ugc nofollow">https://github.com/carbon-language/carbon-lang</a>
2$ cd carbon-lang
  • دستور Run: با استفاده از دستور Run می‌توان فایل حاوی دستورات زبان برنامه نویسی کربن را اجرا کرد. چنانچه فایلی با نام format_only.carbon  وجود داشته باشد که شامل دستوری برای چاپ عبارت Hello World!  در خروجی باشد، می‌توان این فایل را با دستور زیر اجرا کرد:
1$ bazel run //explorer -- ./explorer/testdata/print/format_only.carbon

در نهایت خروجی قطعه کد به صورت زیر مشاهده می‌شود:

زبان برنامه نویسی کربن

دستورات زبان برنامه نویسی کربن

در حال حاضر، نسخه آزمایشی زبان برنامه نویسی کربن‌ را می‌توان استفاده کرد و نسخه رسمی و اولیه آن در دسترس قرار نگرفته است. با این حال، می‌توان به توضیح قطعه کدهای ساده‌ای از این زبان پرداخت و دستورات ساده آن را بررسی کرد. فایلی که در مثال قبل با نام format_only.carbon به منظور چاپ عبارت Hello World! مورد استفاده قرار گرفت، حاوی قطعه کد زیر است:

1package ExplorerTest api;
2fn Main() -> i32 {
3  var s: auto = "Hello world!";
4  Print(s);
5  return 0;
6}
  • در این مثال، کلمه کلیدی package  برای اعلان «بسته» (Package) کاربرد دارد.
  • کلمه کلیدی fn  نیز برای تعریف تابعی با عنوان Main()  استفاده می‌شود.
  • عبارت i32  نیز نوع خروجی تابع Main() را مشخص می‌کند که در این مثال، خروجی تابع از نوع عددی است.
  • کلمه کلیدی var  نیز برای تعریف متغیر کاربرد دارد.
  • با استفاده از علامت :  می‌توان نوع متغیر را بعد از نام متغیر تعیین کرد.
  • در انتهای هر خط از قطعه کد نیز از علامت ;  استفاده می‌شود.
  • از کلمه کلیدی let  می‌توان برای تعریف «ثابت‌ها» (Constants) استفاده کرد.
  • علامت //  نیز توضیحات را مشخص می‌کند.
  • نوع داده‌ها در زبان برنامه نویسی کربن عبارت‌اند از:
    • نوع Boolean: از این نوع داده می‌توان به منظور ذخیره‌سازی مقادیر True و False استفاده کرد.
    • نوع Integer: این نوع داده برای ذخیره‌سازی مقادیر عددی استفاده می‌شود. نوع Integer شامل دو دسته هستند که دسته اول برای ذخیره کردن اعداد علامت‌دار و دسته دوم برای ذخیره‌سازی اعداد بدون علامت استفاده می‌شوند. دسته نخست شامل انواع i8 ،i16 ،i32 ،i64 ،i128 و i256 هستند و دسته دوم انواع u8 ،u16 ،u32 ،u64 ،u128 و u256 را شامل می‌شود.
    • نوع Float: از این نوع داده برای ذخیره‌سازی مقادیر اعشاری استفاده می‌شود که شامل f16 ،f3 ،f64 و f128 است.
    • نوع String: از این نوع داده به منظور ذخیره‌سازی مقادیر رشته‌ای استفاده می‌شود. رشته‌ها در بین علامت ""  قرار می‌گیرند.

دستورات شرطی در زبان برنامه نویسی کربن

دستورات شرطی زبان برنامه نویسی کربن مشابه با دستورات شرطی در سایر زبان‌های برنامه نویسی به خصوص زبان C++‎ هستند. در این زبان، قطعه کدهای بدنه دستورات شرطی در بین دو علامت {}  قرار می‌گیرند. در ادامه، نمونه‌ای از دستورات شرطی در زبان برنامه نویسی کربن گوگل ملاحظه می‌شود.

1fn AgeLogger(var age: i32) {
2  if(age == 0){
3   Print("Carbon is {0} years old", age);
4  } else {
5   Print("Carbon is not {0} years old", age);
6  }  
7}

حلقه While در زبان کربن گوگل

کاربرد حلقه While در زبان کربن نیز مانند کاربرد این حلقه در سایر زبان‌های برنامه نویسی است. تا زمانی که مقدار عبارت مقابل این دستور برابر با True باشد، دستورات داخل حلقه اجرا خواهند شد. در ادامه، مثالی از این حلقه در زبان کربن ملاحظه می‌شود.

1var x: i32 = 0;
2while (not (x == 3)) {
3    Print("I am number {0}", x);
4    x = x + 1;
5}
6Print("Done!");

خروجی قطعه کد فوق به شکل زیر است:

زبان برنامه نویسی کربن

حلقه For در زبان برنامه نویسی کربن گوگل

در زبان برنامه نویسی کربن، از حلقه For‌ نیز همانند سایر زبان‌های برنامه نویسی به منظور تکرار یک سری از دستورات به تعداد دفعات معین استفاده می‌شود. در مثال زیر، نحوه استفاده از این حلقه در زبان کربن گوگل ملاحظه می‌شود.

1var names: [String;3] = ("str1", "str2", "str3");
2  for (var name: String in names) {
3    Print(name);
4  }

لازم به ذکر است که درون حلقه‌ها می‌توان از دو دستور continue  و break  استفاده کرد. دستور continue باعث می‌شود گام بعدی حلقه اجرا شود و اجرای حلقه یک واحد پیش برود. از دستور break نیز به منظور متوقف کردن اجرای حلقه استفاده می‌شود.

دستور Match در زبان کربن گوگل

دستور Match به منظور بررسی چندین حالت یک عبارت استفاده می‌شود. در ادامه، نحوه کاربرد این دستور در قالب مثال ارائه شده است.

1fn TheMatcher() -> String {
2  Print("I am here");
3  var x: i32 = 2;
4  match (x) {
5    case (0) => {
6      return "Matching zero";
7    }
8    case (1) => {
9      return "Matching one";
10    }
11    case (2) => {
12      return "Matching two";
13    }
14    default => {
15      return "Matching none";
16    }
17  }
18}

در مثال بالا مقدار متغیر x  توسط هر یک از دستورات مقابل هاcase  -ها مورد بررسی قرار می‌گیرد و چنانچه مقدار این متغیر برابر با مقدار مقابل دستور case  باشد، قطعه کد مربوط به بدنه آن case  اجرا می‌شود. بخش default  نیز زمانی اجرا می‌شود که مقدار متغیر x برابر با هیچ یک از عبارات مقابل دستورات case نباشد.

ساختارهای داده در زبان کربن گوگل

زبان کربن گوگل مانند سایر زبان‌های برنامه نویسی از انواع ساختار داده به منظور ذخیره‌سازی داده‌ها استفاده می‌کند. در زیر، فهرستی از ساختارهای داده این زبان ملاحظه می‌شود:

ساختارهای داده در زبان برنامه نویسی کربن
ساختارهای داده در زبان برنامه نویسی کربن

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

تاپل در زبان کربن

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

در قطعه کد زیر، مثالی از تاپل در زبان کربن گوگل ملاحظه می‌شود. در این مثال، به متغیری با نام x  ساختار داده‌ تاپل با مقادیر (0, 1, 2, "omega")  تخصیص داده شده است.

1fn UseStruct() {
2  var data: auto = {.x_var = 3, .b_var = 2, .m_slope = 7};
3  var y: i32 = data.m_slope * data.x_var + data.b_var;
4  Print("y: {0}", y);
5}
6
7
8// output: 
9y: 23

آرایه در زبان کربن

در زبان کربن از ساختار داده آرایه نیز به منظور ذخیره مقادیر با نوع یکسان استفاده می‌شود. به منظور تعریف آرایه از ساختار [type, number of values]  استفاده می‌شود. type  نوع آرایه و number of values  تعداد آیتم‌های درون آرایه را مشخص می‌کنند. با استفاده از اندیس نیز می‌توان به مقادیر درون آرایه دسترسی داشت. در ادامه، مثالی از تعریف آرایه در زبان برنامه نویسی کربن ملاحظه می‌شود.

1var array: [i32; 4] = (0, 1, 2, 3);
2// It is possible to omit the number of values 
3// when the size of the array can be inferred
4var array: [i32;] = (0, 1, 2, 3);
5// access elements using square brakets
6Print(array[0]);

 

ساختمان در زبان کربن

این نوع ساختار امکان ذخیره‌سازی مقادیر را به نحوی فراهم می‌کند که بتوان به جای اندیس، با استفاده از نام به مقادیر دسترسی داشت. دو نوع ساختمان در زبان برنامه نویسی کربن وجود دارند:

  • «ساختمان نوع» (Struct Type): با استفاده از این ساختمان می‌توان مقادیری از انواع داده به صورت {.name: String, .count: i32}  تعریف کرد.
  • «ساختمان مقادیر» (Struct Value): با استفاده از این ساختمان می‌توان مقادیر مختلفی برای یک سری ویژگی‌ها تعریف کرد. در مثال زیر x_var  ، b_var  و m_slope   ویژگی‌های تعریف شده‌ای هستند که مقادیر 3، 2 و 7 به آن‌ها تخصیص داده شده است.
1fn UseStruct() {
2  var data: auto = {.x_var = 3, .b_var = 2, .m_slope = 7};
3  var y: i32 = data.m_slope * data.x_var + data.b_var;
4  Print("y: {0}", y);
5}
6
7// output: 
8y: 23

کلاس در زبان کربن

در زبان کربن می‌توان با استفاده از کلمه کلیدی class  ، کلاس جدیدی را ایجاد کرد. متغیرها و توابع جدیدی می‌توانند درون کلاس تعریف شوند. در ادامه، مثالی از کلاس در زبان برنامه نویسی کربن ملاحظه می‌شود.

1class Widget {
2  var x: i32;
3  var y: i32;
4  var payload: String;
5  
6  fn Sum[me: Self]() -> i32 {
7      var total: i32 = me.x + me.y;
8      return total;
9  }
10}

در قطعه کد زیر نیز مثالی از نحوه تعریف شی جدید با نام coolWidget  از کلاس Widget  در زبان کربن گوگل ملاحظه می‌شود.

1fn Main() -> i32 {
2  var coolWidget: Widget = {.x = 6, .y = 7, .payload = "load"};
3  var total: i32 = coolWidget.Sum();
4  Print("Total sum {0}" , total);
5  return 0;
6}
7// output:
8Total sum 13

ژنریک در زبان کربن

زبان برنامه نویسی کربن مانند سایر زبان‌های برنامه نویسی از توابع و کلاس‌های همگانی یا ژنریک پشتیبانی می‌کنند. نوع پارامترهای این توابع و کلاس‌ها در زمان اجرای برنامه مشخص می‌شوند.

در زبان کربن گوگل به منظور تعریف پارامتری از نوع همگانی یا ژنریک، از عبارت کلیدی T  استفاده می‌شود. در مثال زیر نمونه‌ای از یک تابع با پارامتر همگانی x  و y  ملاحظه می‌شود که کوچکترین مقدار را برمی‌گرداند. می‌توان به این پارامترها، مقادیری با نوع داده متفاوت تخصیص داد.

1fn Min[T:! Ordered](x: T, y: T) -> T {
2  return if x <= y then x else y;
3}

به عنوان مثال، می‌توان به پارامترهای تابع Min  مقادیر عددی به شکل زیر تخصیص داد:

1var a: i32 = 1;
2var b: i32 = 2;
3Assert(Min(a, b) == 1);

همچنین، می‌توان به تابع Min  مقادیری از نوع رشته ارسال کرد که در نهایت کوچکترین رشته را در خروجی بازگرداند:

1var a: String = "abc";
2var b: String = "xyz";
3Assert(Min(a , b) == "abc");

جمع‌بندی

زبان برنامه نویسی کربن، جدیدترین زبان ارائه شده توسط گوگل است که به عنوان جایگزینی برای زبان برنامه نویسی C++‎ محسوب می‌شود. این زبان با هدف رفع چالش‌ها و مشکلات زبان C++‎ تولید شده است. در مطلب حاضر، به معرفی اجمالی این زبان برنامه نویسی پرداخته شد و نقاط ضعف زبان C++‎ و دلایل تولید زبان کربن مورد بررسی قرار گرفتند. همچنین، در انتهای مطلب حاضر به دستورات ساده این زبان به همراه مثال پرداخته شد.

بر اساس رای ۱۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
mediumbetterprogrammingLevel Up
نظر شما چیست؟

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