Как вы можете использовать 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 очень трудно написать, да и времени это занимает уйму и программисты стоят недешево.