Миф о Java

Про языки с автоматическим управлением памятью в целом и про Java в частности существует один довольно забавный миф – приложения с автоматическим управлением памяти не текут или текут редко. Бугагашеньки.

Берем известное и крайне популярное среди Java-разарботчиков приложение Intellij IDEA. Открываем в этом приложении большой проект (на мелком не так в глаза бросается) и работаем. Ближе к концу второго-третьего дня работы приложения, объем используемой памяти вырастает с изначальных 300 мегабайт до 700 и IDEA начинает ощутимо тормозить. Полагаю, что дальше будет только больше, лично мне на 700 это дело надоело, и я перезапустил приложение.

Что вобщем-то и требовалось доказать, напортачить можно даже на том языке, где создатели выдали тебе специальный не снимаемый памперс – было бы желание.

var VS val

В Scala существуют два типа переменных, константные и изменяемые. На фоне большинства мэйнстрим языков, подход выглядит довольно странно: константные “переменные” декларируются посредства ключевого слова val, для создания изменяемых переменных используется ключевое слово var.

Столкнувшись с таким подходом, первый заинтересовавший меня вопрос был “есть ли какая-то разница на уровне JVM в var и val?”. Возьмем простейший пример:

    val str1 : String = "String1";
    var str2 : String = "String2";

Что будет скомпилированно в:

   0:   ldc #23; //String String1
   2:   astore_2
   3:   ldc #25; //String String2
   5:   astore_3

Итого: как и ожидалось, никакой разницы нет, просто проверка на этапе компиляции.

И еще пара моментов. Параметр функции всегда константа:

  def fn(arg : String) {
//    arg = "Test"; // error: reassignment to val
  }

В отличие от параметров конструктора, которые могут быть как константными, так и изменяемыми переменными. Для получения изменяемого параметра, необходимо явно это указать при помощи var.

class TestClass(v1 : String,  var v2 : String) {
//  v1 = "NewVal" // error: reassignment to val
  v2 = "NewVal"
}

На мой взгляд, поход довольно запутанный и не очень удобный, различать константа/не константа по одной букве довольно затруднительно. Но, что есть – то есть.

В поисках альтернатив C++

В связи со своим вынужденным переходом в разработчики Java я получил довольно интересную возможность посмотреть на C и C++ со стороны. В целом, мне нравится то что я вижу глядя на C++ с позиции Java разработчика, но, само собой, нашлось одно «но», которое, если быть честным, мне и раньше не давало покоя: C++ совершенно не подходит для быстрого прототипирования. По большому счету это единственный недостаток который я отмечаю на данный момент.

Если говорить про Java, то с быстрым прототипированием тут все нормально, в то время как скорость разработки приложений приблизительно такая же•• как и в случае с C++, ну может на 10% быстрее. При этом язык крайне ограниченный, практически до убогости, что после 10 лет разработки на C++ вызывает довольно ощутимое отторжение.

Понимая, что так дело не пойдет, я взялся за поиск приличной альтернативы C++. Изначально подумывал про Erlang, ведь в основном я пишу что-то сетевое, но в итоге от этого варианта решил отказаться, потому как за пределами сетей Erlang мягко говоря бесполезен, а в самих сетях, зачастую, ограничен в плане набора доступных библиотек. В результате довольно долгих поисков выбор остановился на JVM, ведь JVM — это действительно кроссплатформенное решение (в отличие от того же CLR) с большой базой библиотек под нормальными лицензиями (MIT, BSD и, в худшем случае, LGPL). Плюс, в JDK, начиная с 7-й версии, появилась поддержка асинхронного ввода/вывода, т.е. возникла вполне реальная возможность писать не тормозящие где попало сетевые приложения.

К основным языкам базирующимся на JVM, само собой за исключением самой Java, относятся Clojure, Groovy и Scala. Clojure — Lisp-подобный язык, так что отмел его сразу. Да, я к Lisp отношусь хорошо, но вот куча народу вокруг — нет, так что никакой возможности реально использовать что-то Lisp-подобное я не вижу. Groovy — хороший язык, но без чего-то действительно цепляющего. А вот Scala… Да, Scala — это язык с довольно крутой кривой вхождения, при этом богатым синтаксисом и отличными возможностями.

У всех разные способы оценить пригодность языка для своих нужд. Кто-то первым делом реализует быструю сортировку, кто-то пишет Hello World. А я, обычно, пишу Echo-сервер с клиентом. Continue reading