V (زبان برنامه نویسی)

**V** که به عنوان **vlang** نیز شناخته میشود یک زبان برنامه نویسی ایستا و کامپایل شونده  است که توسط  Alexander Medvednikov در اوایل ۲۰۱۹ ایجاد شد . این زبان از زبان Goالهام گرفته شده و زبان های  Oberon,Swift و Rust بر آن تاثیر داشتند  .این زبان  آزاد و منبع باز است که تحت مجوز &nbsp;MIT  منتشر شده و در حال حاضر در نسخه ی بتاست . 

اهداف V شامل سهولت استفاده ، خوانایی بهتر کد و قابلیت نگه داشت است  

## تاریخچه
به گفته یکی از توسعه دهندگان ، این زبان جدید در نتیجه ی ناامیدی از زبان های موجود در جهت استفاده در پروژه های شخصی ایجاد شده است .  این زبان در اصل برای استفاده شخصی در نظر گرفته شده بود ، اما پس از اینکه در انظار از ان نام برده شد و شهرت کسب کرد ، تصمیم به انتشار عمومی ان گرفته شد . V در ابتدا به منظور توسعه یک کلاینت پیام رسانی دسکتاپ به نام Voltایجاد شد. پس از انتشار عمومی ، کامپایلری به زبان Vنوشته شد و زبان میتوانست خود را کامپایل کند . اهداف کلیدی طراحی پشتیبان ایجاد زبان V عبارت اند از : یادگیری آسان و سریع ، خوانایی بالاتر ، کامپایل سریع ، افزایش امینت ، توسعه کارآمد ، قابلیت استفاده بین پلتفرم های مختلف ، تعامل پذیری بهتر با زبان C، مدیریت بهتر خطاها ،‌ویژگی های مدرن و نرم افزاری با قابلیت نگه داری بیشتر. 

زبان Vاز طریق گیت هاب منتشر و توسعه میابد و توسط توسعه دهندگان و مشارکت کنندگان جامعه گیت نگه داری و بروزرسانی میشود. 

## ویژگی ها

### امنیت
V سیایت هایی برای بهبود امنیت حافظه ، سرعت و کد امن در نظر گرفته .  . از جمله ی این ویژگی های امنیتی پیش فرض عبارت اند از :‌ ۱) استفاده از ویژگی بررسی نقص ها. ۲) استفاده از گزینه/نتیجه. ۳) بررسی الزامی خطاها . ۴) متغیر ها به طور پیش فرض غیرقابل تغییرند . ۵) ساختار ها به طور پیش فرض تغییرناپذیرند. ۶) تابع ()args به طور پیش فرض غیر قابل تغییر است . ۷) عدم استفاده از مقادیری که تعیرف نشده اند . ۸)‌ عدم ابهام متغیر ها . ۹) عدم استفاده از مقدار null (مگر اینکه در کد به عنوان ناامن مشخص شده باشد.) ۱۰) عدم استفاده از متغیر های سراسری (مگر اینکه از طریق پرچم (flag) فعال شده باشد) . 

### کارایی
V از نوع های مقداری و بافر های رشته ای برای کاهش تخصیص حافظه استفاده می کند.  

### مدیریت حافظه
۴ مورد پشتیبانی شده توسط این زبان برای مدیریت حافظه به شرح زیر است : 

۱. استفاده از یک بازیافت حافظه  اختیاری (که میتواند غیرفعال شود) برای مدیریت تخصیص ها که به صورت پیش فرض است . 

۲. مدیریت دستی حافظه از طریق غیر فعال کردن بازیافت حافظ `(gc none).` 

۳. Autofree که اکثر اشیا را از طریق free call insertionمدیریت میکند و سپس درصد باقی مانده توسط بازیافت حافظه ازاد میشود (<code>-autofree</code>).

۴. خزینه حافظه (`-prealloc`).

### مترجم کد مبدا
زبان V از کامپایل مبدا به مبدا (transpilar) پشتیبانی میکند و میتواند کد C را به کد V ترجمه کند . 

مترجم هایی نیز برای ترجمه زبان ها Go ، JavaScript و WebAssembly در دست توسعه هستند . 

## قواعد نحوی

### سلام دنیا
برنامه ی "سلام دنیا" در زبان V :  
```v
fn main(){
    println('Hello World!')
    }
```

```v
fn main() {
	println('Hello, World!')
}
```


### متغیر ها
متغیر ها به طور پیش فرض تغییر ناپذیرند و با استفاده از" =: "و یک مقدار تعریف میشوند . از کلمه ی کلیدی mut برای تغییرپذیر کردن انها استفاده میشود . متغیر  های تغییرپذیر را میتوان با "=" مقدار دهی کرد: 
```v
a := 1
mut b := 2
b = 3
```
تعریف مجدد یک متغیر چه در یک بازه ی داخلی و چه در همان بازه مجاز نیست : 
```v
a := 1
{
    a := 3 // error: redefinition of a
}
a := 2 // error: redefinition of a
```


### ساختار ها
مثالی از ساختار: 
```v
struct Point {
	x int
	y int
}

mut p := Point {
	x: 10
	y: 20
}
println(p.x) // Struct fields are accessed using a dot
// Alternative literal syntax for structs with 3 fields or fewer
p = Point{10, 20}
assert p.x == 10
```


### ساختار های درخت هیپ
ساختار ها به طور پیش فرض بر روی پشته قرار میگیرند . برای قرار دادن یک ساختار روی درخت هیپ و  دریافت نشانگر ارجاع به ان ، میتوان از پیشوند "&" استفاده کرد:
```v
struct Point {
	x int
	y int
}

p := &Point{10, 10}
// References have the same syntax for accessing fields
println(p.x)
```


### متد ها
متد ها در زبان V توابعی هستند که با آرگومان های ورودی تعریف میشوند. ورودی ها بین لیست آرگومان های خود  و با کلمه ی کلیدی "fn" و نام متد ظاهر میشوند. متد ها باید در همان ماژول هایی باشند که نوع ورودی قرار دارد . 

متد is_registerd یک ورودی از نوع User به نام u دارد . قرداد این است که از نام هایی مانند self و this برای ورودی استفاده نشود و ترجیح بر یک نام کوتاه است . برای مثال: 


```v
struct User {
	age int
}

fn (u User) is_registered() bool {
	return u.age > 16
}

user := User{
	age: 10
}
println(user.is_registered()) // "false"
user2 := User{
	age: 20
}
println(user2.is_registered()) // "true"
```


### مدیریت خطا ها
نوع اختیاری(Optional type) برای نوع هایی به کار می رورد  که ممکن است نوع داده انها none باشد . نوع نتیجه (Result type)می تواند نمایانگر یک خطا که از یک تابع بازگردانده شده است باشد .

نوع اختیاری با قرار دادن "?" در ابتدای نوع متغیر مشخص میشود (Type?). نوع نتیجه از "!" در ابتدای نوع متغیر استفاده میکند (Type!) 


```v
fn do_something(s string) !string {
	if s == 'foo' {
		return 'foo'
	}
	return error('invalid string')
}

a := do_something('foo') or { 'default' } // a will be 'foo'
b := do_something('bar') or { 'default' } // b will be 'default'
c := do_something('bar') or { panic("{err}") } // exits with error 'invalid string' and a traceback

println(a)
println(b)
```


## همچنین ببینید

* مقایسه زبان ها برنامه نویسی 
* تاریخچه زبان های برنامه نویسی 
* فهرست زبان های برنامه نویسی
* فهرست زبان های برنامه نویسی بر اساس نوع 

## منابع


## مطالعه بیشتر

* 
* 
* 
* 
* 

## پیوند ها

* وب سایت رسمی 
* 
* مستندات
* ماژول ها
رده:خطاهای بدون هدف Harv و Sfn
رده:زبان‌های برنامه‌نویسی ایستا
رده:زبان‌های برنامه‌نویسی رویه‌ای
رده:زبان‌های برنامه‌نویسی ساخته‌شده در ۲۰۱۹ (میلادی)
رده:زبان‌های برنامه‌نویسی سیستمی
رده:زبان‌های برنامه‌نویسی هم‌روند
رده:زبان‌های برنامه‌نویسی
رده:زبان‌های تابعی
رده:کامپایلرها و مفسرهای آزاد
رده:کامپایلرهای کد منبع به کد منبع
رده:نرم‌افزارهای ۲۰۱۹ (میلادی)
رده:نرم‌افزارهای آزاد چندسکویی
رده:نرم‌افزارهای چندسکویی
رده:نرم‌افزارهای دارای اجازه‌نامه ام‌آی‌تی