Java для торговых приложений? Вполне!

Как вы можете использовать Java для финансовых торговых приложений? Ведь Java тормозная, жрёт много памяти, сборщик мусора останавливает приложение, когда захочет. Разве Java годится для low-latency? Для этого непременно нужно писать на C, C++, а еще лучше на Verilog и использовать FPGA, не меньше! Java для high-frequency trading? Да вы шутите!? Java для алгоритмической торговли? Не смешите мои тапки!

Так или примерно так реагируют некоторые разработчики на использование Java в финансовых приложениях, где критичны скорость работы и высоки требования к latency.

Уверяю вас Java вполне подходит для финансовых торговых приложений и вот несколько причин почему.

Почему Java?

В Java решены многие проблемы на уровне платформы, которые программистам на C/C++ приходится решать самостоятельно или полагаться на сторонние библиотеки. Главная трудность — работа с памятью. В каждой C/C++ торговой программе непременно программист пишет свой код для работы памятью именно из-за того, что чем-то стороння библиотека его не устраивает. В Java аллоцирование и очистку памяти и проверку ссылок на объекты вы получаете «из коробки». Выделение памяти в Java реализовано даже быстрее, чем в C/C++, путем простого перемещения указателя. Если писать Java-код правильно и обдуманно, использовать определенные хитрости и главное не пихать в хип мусор, то проблем со сборкой мусора и остановкой для этого всего приложения можно избежать.

Хороших Java-программистов больше, чем хороших C/C++ программистов. И уж поверьте для написания приложения, которому с легким сердцем можно доверить оперировать суммами в миллионы долларов, вам понадобятся очень-очень-очень хорошие C/C++ программисты. Эти программисты напишут очень хороший код, отладят его и оттестируют, но такие программисты стоят очень дорого и даже они не застрахованы от ошибки, которая приведет к segmentation fault, core dump или полному краху операционной системы. Java и JVM более благосклонны к ошибкам программистов, Null Pointer Exception все еще возможны, но они в большей части случаев не приведут к краху всей JVM и краху операционной системы.

Многоплатформенность Java также играет на руку. Программистам для разработки и базового тестирования кода достаточно настольной машины. Java байт-код одинаков для исполнения на любой платформе. Если вы перешли со SPARC на Intel, ваш код будет работать. Если вы перешли с Intel на AMD, ваш код будет работать. Если у вас вместо двух процессоров на машине стало восемь процессоров, ваш код будет работать. Если вы перешли с RHEL5 на RHEL7, ваш Java-код будет работать без перекомпиляции. Принцип Write-once-run-everywhere очень помогает. Есть, конечно, и тут определенные косяки и ловушки, но их меньше, чем с кодом на C/C++.

Поистине жемчужиной в Java/JVM является динамическая компиляция кода, когда код в процессе работы оптимизируется встроенным JIT-компилятором, причем неоднократно с постоянными проверками и перекомпиляциями с еще большими оптимизациями. В результате через определенное время ваше Java-приложение оптимизируется даже лучше, чем это может сделать C/C++компилятор при статической компиляции.

Вывод

На Java пишутся реальные боевые торговые системы. В чем-то Java лучше, в чём-то C/C++. Java не является идеальной платформой для этого, но вполне способной конкурировать с C/C++. И на С++ и на Java можно достичь latency до 10 микросекунд, только на Java это сделать легче и быстрее.

Как насчет других языков?

Scala? Увы, слишком много создает мусора и значит сборщик мусора будет постоянно вам мешать. Для проектов, где latency некритична, Scala подходит и ею пользуются в инвестиционных банках например для Back Office.

Go? А какие преимущества он дает против Java?

Python? Увы нет. Может быть в отдаленном будущем.

Verilog и FPGA? Да, есть случаи, где они используются. Но полноценные гибкие торговые приложения на Verilog очень трудно написать, да и времени это занимает уйму и программисты стоят недешево.

Ссылки по теме:

Оставьте комментарий