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