Документация Julia 1.4
Добро пожаловать в документацию для Julia 1.4.
Пожалуйста, ознакомьтесь с примечаниями к выпуску, чтобы узнать, что изменилось с момента последнего релиза.
Документация также доступна в формате PDF: julia-1.4.2.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–2020 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.4.2/