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

**گرووی**  زبان برنامه‌نویسی پویایی است که برای ماشین مجازی جاوا ایجاد شده‌است، و هم می‌تواند مفسر اجرا شود، یا اینکه کامپایل شود. این زبان از زبان‌هایی مانند روبی، پایتون، پرل، اسمال‌تاک، و همچنین جاوا تأثیر گرفته‌است.

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

## ویژگی‌های گرووی
### برنامه‌نویسی شی‌گرا
همه چیز در گرووی یک شی است. گرووی تمام عملگرها را به صورت فراخوانی تابع پیاده‌سازی می‌کند. این باعث می‌شود که کد زیر:

```groovy
1 + 1
```

به صورت زیر اجرا شود:

```groovy
1.plus(1)
```


این به معنی این است که می‌توان در گرووی عملگرها را رونویسی کرد. در زیر مثالی از رونویسی عملگر plus را مشاهده می‌کنید:


```groovy
class Score {
   int value;
   public Score plus (Score other) {
      return new Score(value: value + other.value)
   }
}

Score myScore = new Score(value: 88)
Score yourScore = new Score(value: 89)
Score totalScore = myScore + yourScore

assert totalScore == 177
```


### برنامه‌نویسی تابعی
برنامه‌نویسی تابعی سبکی از برنامه‌نویسی است که بر روی استفاده از توابع، بدون استفاده از متغیرهای حالت و گام‌های رویه‌ای، برای حل مسایل محاسباتی تأکید می‌کند.

توابع گرووی می‌توانند برای تعریف توابعی به کار روند که هیچ گام رویه‌ای ندارند. به عنوان مثال تابع فاکتوریل را می‌توان به صورت زیر پیاده‌سازی کرد:

```groovy
def fac(n) { n == 0 ? 1 : n * fac(n - 1) }
```


#### بستارها
یک بستار در گرووی تکه‌ای از کد است که تعریف می‌شود و در نکته‌ای دیگر اجرا می‌شود. بستارها می‌توانند به متغیرهای حوزه‌ای که بستار در آن تعریف شده دسترسی داشته باشد. به این متغیرها، متغیرهای آزاد می‌گویند. به نمونه زیر توجه کنید:


```groovy
def adder(n) {
   return { num -> num + n }
}

def add5 = adder(5)

println add5(7) // prints 12
```


### پویا بودن
در گرووی می‌توان ساختار کلاس‌های تعریف شده را در زمان اجرا تغییر داد. می‌توان در زمان به یک کلاس متغیر یا تابع جدید اضافه کرد.

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

```groovy
def someObject = "some value";
```


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

```java
GroovyObject someObject = "some value";
```


همچنین نوع‌گذاری قوی نیز در گرووی پشتیبانی می‌شود. به عنوان نمونه کد زیر نیز در گرووی مجاز است:

```groovy
String someObject = "some value";
```


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

کلاس تعریف شده در جاوا:

```java
public class AClassInJava {
    public static void main(String[] args) {
        new AClassInJava().printMessage();
        new AClassInGroovy().printMessage();
    }
    public void printMessage() {
       System.out.println("Hello from Java");
    }
}
```


و کلاس تعریف شده در گرووی:

```groovy
class AClassInGroovy{
    def printMessage() {
        println "Hello from Groovy"
    }
}
new AClassInJava().printMessage()
new AClassInGroovy().printMessage()
```


## منابع

## پیوند به بیرون
* وب‌گاه رسمی گرووی

رده:خانواده زبان برنامه‌نویسی جاوا
رده:زبان‌های اسکریپت‌نویسی
رده:زبان‌های برنامه‌نویسی ساخته‌شده در ۲۰۰۳ (میلادی)
رده:زبان‌های برنامه‌نویسی ساخته‌شده در دهه ۲۰۰۰ (میلادی)
رده:زبان‌های برنامه‌نویسی سطح بالا
رده:زبان‌های برنامه‌نویسی شیءگرا
رده:زبان‌های برنامه‌نویسی ماشین مجازی جاوا
رده:زبان‌های برنامه‌نویسی ماشینی پویا
رده:معرفی‌شده‌های ۲۰۰۳ (میلادی)
رده:نرم‌افزارهای آزاد چندسکویی
رده:نرم‌افزارهای چندسکویی
رده:نرم‌افزارهایی که از پروانه آپاچی استفاده می‌کنند