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

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

ویژگی‌های گرووی
---------------

### برنامه‌نویسی شی‌گرا

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

```
1 + 1

```

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

```
1.plus(1)

```

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

```
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

```

### برنامه‌نویسی تابعی

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

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

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

```

#### بستارها

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

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

def add5 = adder(5)

println add5(7) // prints 12

```

### پویا بودن

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

### نوع‌گذاری قوی و نوع‌گذاری شل

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

```
def someObject = "some value";

```

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

```
GroovyObject someObject = "some value";

```

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

```
String someObject = "some value";

```

### یکپارچه‌سازی مستقیم با جاوا

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

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

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

```

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

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

```

منابع
-----

1. 1 2  کتاب Beginning Groovy and Grails, From Novice to Professional
2. ↑  «نوار کناری وب‌گاه رسمی گرووی». بایگانی‌شده از اصلی در ۱۳ فوریه ۲۰۱۲. دریافت‌شده در ۲۸ اکتبر ۲۰۱۲.
3. 1 2 3 4 5  کتاب Grails 1.1 Web Application Development
4. ↑  «مستندات گرووی - برنامه‌نویسی تابعی». بایگانی‌شده از اصلی در ۸ اکتبر ۲۰۱۲. دریافت‌شده در ۲۸ اکتبر ۲۰۱۲.
5. ↑  «مستندات گرووی - بستارها». بایگانی‌شده از اصلی در ۲۲ مه ۲۰۱۲. دریافت‌شده در ۲۸ اکتبر ۲۰۱۲.

پیوند به بیرون
--------------

* وب‌گاه رسمی گرووی