Руководство пользователя
Введение
Научные вычисления традиционно требуют максимальной производительности, однако эксперты в данной области в основном перешли на более медленные динамические языки для повседневной работы. Мы считаем, что есть много веских причин предпочитать динамические языки для этих приложений, и не ожидаем, что их использование сократится. К счастью, современные методы проектирования языков и компиляторов позволяют практически устранить компромисс между производительностью и обеспечить единую среду, достаточно продуктивную для прототипирования и достаточно эффективную для развертывания приложений с высокими требованиями к производительности. Язык программирования Julia выполняет эту роль: это гибкий динамический язык, подходящий для научных и численных вычислений, с производительностью, сопоставимой с традиционными статически типизированными языками.
Так как компилятор Julia отличается от интерпретаторов, применяемых в таких языках, как Python или R, поначалу могут возникнуть проблемы с пониманием производительности Julia. Если код работает слишком медленно, настоятельно рекомендуем в первую очередь ознакомиться с разделом Советы по производительности. Когда вы поймете, как работает Julia, вы сможете легко писать код, который работает почти так же быстро, как код на C.
Julia Compared to Other Languages
Julia отличается опциональной типизацией, множественной диспетчеризацией и хорошей производительностью, достигаемой за счет вывода типов и компиляции «just-in-time» (JIT) (а также опциональной компиляции ahead-of-time), реализованной с помощью LLVM. Это мультипарадигмальный язык, сочетающий в себе особенности императивного, функционального и объектно-ориентированного программирования. Julia обеспечивает простоту и выразительность для высокоуровневых численных вычислений, аналогично таким языкам, как R, MATLAB и Python, но также поддерживает общее программирование. Для достижения этой цели Julia опирается на традиции математических языков программирования, но также заимствует многое из популярных динамических языков, включая Lisp, Perl, Python, Lua и Ruby.
Наиболее значительные отличия Julia от типичных динамических языков:
-
Ядро языка накладывает очень мало ограничений; Julia Base и стандартная библиотека написаны на самом языке Julia, включая примитивные операции, такие как арифметика целых чисел
-
Богатый язык типов для построения и описания объектов, который также может быть опционально использован для объявления типов
-
Возможность определять поведение функций для многих комбинаций типов аргументов с помощью мультиметода
-
Автоматическая генерация эффективного специализированного кода для различных типов аргументов
-
Хорошая производительность, приближающаяся к производительности статически компилируемых языков, таких как C
Хотя динамические языки иногда называют языками без типизации, это, безусловно, неверно: каждый объект, будь то примитивный или определенный пользователем, имеет тип. Однако отсутствие объявлений типов в большинстве динамических языков означает, что компилятору нельзя сообщить типы значений, а зачастую типы вообще не определяются явным образом. С другой стороны, хотя в статических языках типы можно — и обычно требуется ---- аннотировать для компилятора, обычно они существуют только во время компиляции, и ими нельзя манипулировать во время выполнения. В Julia типы сами по себе являются объектами времени выполнения, но их также можно использовать для предоставления информации компилятору.
Каковы ключевые особенности Julia?
Хотя рядовому программисту не требуется явным образом использовать типы или множественную диспетчеризацию, они лежат в основе языка Julia: функции определяются для различных сочетаний типов аргументов и применяются путем выбора наиболее специфичного подходящего определения. Такая модель хорошо подходит для математического программирования, где операция не должна быть привязана к первому аргументу, как при традиционной объектно-ориентированной диспетчеризации. Операторы ---- это просто функции с особой нотацией: для реализации операции сложения для новых пользовательских типов данных достаточно определить новые методы для функции +. После этого можно спокойно применять существующий код к новым типам данных.
Отчасти по причине вывода типов во время выполнения (дополненного необязательными аннотациями типов), а отчасти из-за серьезного внимания, уделяемого производительности с самого начала проекта, по вычислительной эффективности Julia превосходит другие динамические языки и даже соперничает с языками со статической компиляцией. Для решения объемных числовых задач скорость всегда была и, вероятно, всегда будет важнейшим приоритетом: последние десятилетия объем обрабатываемых данных рос, вполне подчиняясь закону Мура.
Преимущества Julia
Целью создания языка Julia было обеспечить беспрецедентное сочетание простоты использования, функциональности и эффективности. В дополнение к вышесказанному, у Julia есть еще ряд преимуществ перед аналогами:
-
Бесплатный и с открытым исходным кодом (лицензия MIT)
-
Пользовательские типы так же быстры и компактны, как и встроенные
-
Нет необходимости векторизировать код для повышения производительности; девекторизованный код работает быстро
-
Разработан для параллелизма и распределенных вычислений
-
Легкий «зеленый» многопоточность (корутины)
-
Ненавязчивая, но мощная система типов.
-
Элегантные и расширяемые преобразования и продвижения для числовых и других типов.
-
Эффективная поддержка Unicode, включая, но не ограничиваясь UTF-8.
-
Прямой вызов функций C (без оберток или специальных API)
-
Мощные возможности, подобные оболочке, для управления другими процессами
-
Макросы, подобные Lisp, и другие средства метапрограммирования