Кратко ръководство за езиците JVM

1. Въведение

Освен Java, на виртуалната машина Java могат да работят и други езици като Scala, Kotlin, Groovy, Clojure.

В следващите раздели ще разгледаме най-популярните езици на JVM на високо ниво.

Разбира се, ще започнем с предшественика на JVM езиците - Java.

2. Java

2.1. Общ преглед

Java е език за програмиране с общо предназначение, обхващащ обектно-ориентираната парадигма.

Основна характеристика на езика е междуплатформената преносимост , което означава, че програмите, написани на една платформа, могат да бъдат изпълними на всяка комбинация от софтуер и хардуер с адекватна поддръжка по време на работа. Това се постига чрез компилиране на код първо в байт код, вместо директно в специфичен за платформа машинен код.

Инструкциите за байт код на Java са аналогични на машинния код, но се интерпретират от Java Virtual Machine (JVM), специфична за хост операционната система и хардуерната комбинация.

Въпреки че първоначално е обектно-ориентиран език, Java започва да възприема концепции от други парадигми за програмиране като функционално програмиране.

Нека да разгледаме набързо някои от основните характеристики на Java:

  • Обектно-ориентирана
  • Силно статично напечатан
  • Независим от платформата
  • Събирани боклуци
  • Многонишков

2.2. Примери

Нека да видим как едно просто „Здравей, Свят!“ пример изглежда така:

public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }

В този пример създадохме клас на име HelloWorld и дефинирахме основния метод, който отпечатва съобщение на конзолата.

След това ще използваме командата javac, за да генерираме байт кода, който може да бъде изпълнен на JVM:

javac HelloWorld.java

И накрая, на Java команда изпълнява генерирания байткод на JVM:

java HelloWorld

За повече примери за Java вижте нашия списък с уроци.

3. Скала

3.1. Общ преглед

Scala означава „мащабируем език“. Scala е статично типизиран език, който съчетава две важни програмни парадигми, а именно обектно-ориентирано и функционално програмиране.

Езикът възниква през 2004 г., но става по-популярен през последните години.

Scala е чист обектно-ориентиран език, тъй като не поддържа примитиви . Scala предоставя възможност за дефиниране на класове, обекти, методи, заедно с функционални функции за програмиране като черти, алгебрични типове данни или класове типове.

Няколко важни характеристики на Scala са:

  • Функционален, обектно-ориентиран
  • Силно статично напечатан
  • Алгебрични типове данни
  • Съвпадащ модел
  • Подобрена поддръжка на неизменност
  • Мързеливо изчисление
  • Многонишков

3.2. Примери

Първо, нека да разгледаме същото „Здравей, Свят!“ пример както преди, този път в Scala:

object HelloWorld { def main(args: Array[String]): Unit = println("Hello, world!") }

В този пример създадохме единичен обект на име HelloWorld и основния метод.

След това, за да компилираме това, можем да използваме scalac :

scalac HelloWorld.scala

Командата scala изпълнява генерирания байт код на JVM:

scala HelloWorld

4. Котлин

4.1. Общ преглед

Kotlin е статично типизиран език с общо предназначение с отворен код, разработен от екипа на JetBrains , който обединява обектно-ориентираните и функционални парадигми.

Основният фокус при разработването на Kotlin беше оперативната съвместимост на Java, безопасността (обработка на изключения), сбитостта и по-добрата поддръжка на инструментите.

След излизането на Android Studio 3.0, Kotlin е напълно поддържан език за програмиране от Google на платформата Android. Той също е включен в пакета IDE на Android Studio като алтернатива на стандартния Java компилатор.

Някои важни характеристики на Kotlin:

  • Обектно-ориентиран + Функционален
  • Силно статично напечатан
  • Кратко
  • Оперативна съвместимост с Java

Нашето въведение в Kotlin също съдържа повече подробности за характеристиките.

4.2. Примери

Нека да видим „Здравей, Свят!“ пример в Kotlin:

fun main(args: Array) { println("Hello, World!") }

Можем да напишем кода по-горе в нов файл, наречен helloWorld.kt.

След това ще използваме командата kotlinc, за да компилираме това и генерира байт код, който може да бъде изпълнен на JVM:

kotlinc helloWorld.kt -include-runtime -d helloWorld.jar

Опцията -d се използва за обозначаване на изходния файл за файлове с класове или име на .jar файл. Опцията -include-runtime прави получения файл .jar самостоятелен и изпълним, като включва библиотеката за изпълнение на Kotlin в него.

След това командата java изпълнява генерирания байт код на JVM:

java -jar helloWorld.jar

Нека видим и друг пример за отпечатване на списък с елементи с помощта на цикъл for :

fun main(args: Array) { val items = listOf(1, 2, 3, 4) for (i in items) println(i) }

5. Groovy

5.1. Общ преглед

Groovy е обектно-ориентиран, незадължителен тип, динамичен специфичен за домейна език (DSL) , с поддръжка за статично въвеждане и статично компилиране. Целта му е да подобри производителността на разработчиците, с лесен за научаване синтаксис.

Groovy се интегрира лесно с всяка програма на Java и веднага добавя мощни функции, като скриптове, метапрограмиране и функционално програмиране по време на изпълнение и компилация.

Нека да подчертаем няколко важни характеристики:

  • Обектно-ориентиран с функционални характеристики като функции от по-висок ред, къриране, затваряне
  • Набиране - динамично, статично, силно, патица
  • Език, специфичен за домейн
  • Оперативна съвместимост с Java
  • Производителност чрез лаконичност
  • Претоварване на оператора

5.2. Примери

Първо, нека видим нашето „Здравей, Свят!“ пример в Groovy:

println("Hello world")

Написахме горния код в нов файл, наречен HelloWorld.groovy . Сега можем да стартираме този код по два начина: чрез компилиране и изпълнение или просто стартиране на некомпилиран код.

Можем да компилираме .groovy файл, използвайки командата groovyc, както следва:

groovyc HelloWorld.groovy

След това ще използваме командата java за изпълнение на грууви код:

java -cp \embeddable\groovy-all-.jar;. HelloWorld

Например командата по-горе може да изглежда така:

java -cp C:\utils\groovy-1.8.1\embeddable\groovy-all-1.8.1.jar;. HelloWorld

Нека също да видим как можем да използваме командата groovy за изпълнение на .groovy файла, без да компилираме:

groovy HelloWorld.groovy

И накрая, ето още един пример за отпечатване на списък с елементи с индекса:

list = [1, 2, 3, 4, 5, 6, 7, 8, 9] list.eachWithIndex { it, i -> println "$i: $it"}

Разгледайте още примери на Groovy в нашата статия за въвеждане.

6. Clojure

6.1. Общ преглед

Clojure е език за функционално програмиране с общо предназначение. Езикът работи на JVM, както и на Common Language Runtime на Microsoft. Clojure е компилиран език все още, той остава динамичен, тъй като неговите функции се поддържат по време на изпълнение.

Дизайнерите на Clojure искаха да проектират модерен Lisp, който може да работи на JVM. Ето защо е известен и като диалект на езика за програмиране Lisp. Подобно на Lisps, Clojure третира кода като данни и има макросистема.

Някои важни характеристики на Clojure:

  • Функционални
  • Писане - динамично, силно, наскоро започна да поддържа постепенно писане
  • Проектиран за едновременност
  • Полиморфизъм по време на изпълнение

6.2. Примери

За разлика от другите езици на JVM, не е толкова лесно да се създаде просто „Здравей, Свят!“ програма в Clojure.

Ще използваме инструмента Leiningen за стартиране на нашия пример.

Първо ще създадем прост проект със шаблон по подразбиране, като използваме следната команда:

lein new hello-world

Проектът ще бъде създаден със следната файлова структура:

./project.clj ./src ./src/hello-world ./src/hello-world/core.clj

Сега трябва да актуализираме файла ./project.ctj със следното съдържание, за да зададем основния изходен файл:

(defproject hello-world "0.1.0-SNAPSHOT" :main hello-world.core :dependencies [[org.clojure/clojure "1.5.1"]])

Сега сме готови да актуализираме нашия код, за да отпечатаме „Здравей, Свят!“ в ./src/hello-world/core. clj файл:

(ns hello-world.core) (defn -main [& args] (println "Hello, World!"))

И накрая, ще използваме командата lein, за да изпълним кода по-горе, след като се преместим в основната директория на проекта:

cd hello-world lein run

7. Други JVM езици

7.1. Jython

Jython е реализацията на Java платформа на Python, която работи на JVM.

Този език първоначално е проектиран така, че да позволява писане на високопроизводителни приложения, без да се жертва интерактивността. Jython е обектно-ориентиран, многонишкови и използва събирача на боклук на Java за ефективно почистване на паметта.

Jython включва повечето модули, които са част от езика Python. Той може също да импортира и използва всякакви класове от библиотеките на Java.

Нека видим едно бързо „Здравей, Свят!“ пример:

print "Hello, world!"

7.2. JRuby

JRuby е реализация на езика за програмиране Ruby, който да работи на Java Virtual Machine.

Езикът JRuby е с висока производителност и многонишков, с голямо разнообразие от налични библиотеки от Java и Ruby. Също така той комбинира функции от двата езика като обектно-ориентирано програмиране и въвеждане на патици.

Нека отпечатаме „Здравей, Свят!“ в JRuby:

require "java" stringHello= "Hello World" puts "#{stringHello.to_s}"

8. Заключение

В тази статия изучихме много популярни JVM езици заедно с основни примери за код. Тези езици изпълняват различни парадигми за програмиране като обектно-ориентирано, функционално, статично въвеждане, динамично въвеждане.

Досега това показва, че дори и с JVM от 1995 г., той все още стои като изключително подходяща и убедителна платформа за съвременните езици за програмиране.