Введение
Научное вычисление традиционно требовало высокой производительности, однако специалисты в области предметных областей в основном перешли к более медленным динамическим языкам для повседневной работы. Мы считаем, что есть много веских причин предпочитать динамические языки для этих задач, и мы не ожидаем, что их использование уменьшится. К счастью, современный дизайн языков и методы компиляции позволяют в основном устранить разницу в производительности и предоставить единую среду, достаточно продуктивную для прототипирования и достаточно эффективную для развертывания ресурсоемких приложений. Язык программирования Julia выполняет эту роль: это гибкий динамический язык, подходящий для научных и численных вычислений, с производительностью, сопоставимой с традиционными статически типизированными языками.
Поскольку компилятор Julia отличается от интерпретаторов, используемых для языков, таких как Python или R, вы можете обнаружить, что производительность Julia на первый взгляд неинтуитивна. Если вы обнаружите, что что-то работает медленно, настоятельно рекомендуем ознакомиться с разделом Рекомендации по производительности прежде чем пробовать что-либо еще. После того, как вы поймете, как работает Julia, вы легко сможете написать код, почти такой же быстрый, как на C.
Julia имеет необязательную типизацию, множественное диспетчерирование и хорошую производительность, достигнутые с использованием вывода типов и компиляции Just-in-time (JIT), реализованной с использованием LLVM. Это язык множественных парадигм, сочетающий в себе черты императивного, функционального и объектно-ориентированного программирования. Julia обеспечивает простоту и выразительность для высокоуровневых численных вычислений, аналогично языкам, таким как R, MATLAB и Python, но также поддерживает общее программирование. Для достижения этого Julia опирается на наследие языков математического программирования, а также заимствует многое из популярных динамических языков, включая Lisp, Perl, Python, Lua и Ruby.
Наиболее существенные отличия Julia от типичных динамических языков:
- Базовый язык накладывает очень мало ограничений; стандартная библиотека написана на самом языке Julia, включая примитивные операции, такие как арифметика целых чисел
- Богатый язык типов для построения и описания объектов, который также может быть необязательно использован для объявления типов
- Возможность определения поведения функции для многих комбинаций типов аргументов с помощью множественного диспетчерирования
- Автоматическое создание эффективного специализированного кода для разных типов аргументов
- Хорошая производительность, приближающаяся к производительности статически скомпилированных языков, таких как C
Хотя иногда динамические языки называют «бестиповыми», это определенно не так: каждый объект, будь то примитивный или пользовательский, имеет тип. Однако отсутствие объявлений типов в большинстве динамических языков означает, что нельзя указать компилятору типы значений и часто нельзя говорить о типах явно. В статических языках, с другой стороны, хотя можно и обычно нужно добавлять аннотации типов для компилятора, типы существуют только во время компиляции и не могут быть изменены или выражены во время выполнения. В Julia типы сами являются объектами во время выполнения и также могут быть использованы для передачи информации компилятору.
Хотя обычному программисту не нужно явно использовать типы или множественное диспетчерирование, они являются основными объединяющими особенностями Julia: функции определяются для различных комбинаций типов аргументов и применяются путем диспетчеризации к наиболее точному совпадающему определению. Эта модель хорошо подходит для математического программирования, где нелогично, чтобы первый аргумент «владел» операцией, как в традиционном объектно-ориентированном диспетчерировании. Операторы — это просто функции со специальной нотацией — чтобы расширить сложение до новых пользовательских типов данных, вы определяете новые методы для функции +. Существующий код беспрепятственно применяется к новым типам данных.
Отчасти благодаря выводу типа во время выполнения (дополненному необязательными аннотациями типов), а отчасти благодаря сильному фокусу на производительности с момента начала проекта, вычислительная эффективность Julia превосходит эффективность других динамических языков и даже соревнуется со статически скомпилированными языками. Для больших численных задач скорость всегда была, остается и, вероятно, всегда будет важной: объем обрабатываемых данных легко соответствовал закону Мура на протяжении последних десятилетий.
Julia стремится создать беспрецедентное сочетание простоты использования, мощности и эффективности в одном языке. Кроме того, некоторые преимущества Julia по сравнению с аналогичными системами включают:
- Бесплатное и открытое программное обеспечение (лицензия MIT)
- Пользовательские типы данных так же быстры и компактны, как и встроенные
- Нет необходимости векторизировать код для повышения производительности; невекторизованный код работает быстро
- Разработан для параллелизма и распределенных вычислений
- Легковесные «зеленые» потоки (корутины)
- Ненавязчивая, но мощная система типов
- Элегантные и расширяемые преобразования и повышения для числовых и других типов
- Эффективная поддержка Unicode, включая, но не ограничиваясь UTF-8
- Прямой вызов функций C (не нужны обертки или специальные API)
- Мощные возможности оболочки для управления другими процессами
- Макросы в стиле Lisp и другие средства метапрограммирования
© 2009–2016 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/release-0.5/manual/introduction/