Документация Julia 1.3
Добро пожаловать в документацию Julia 1.3.
Пожалуйста, ознакомьтесь с примечаниями к релизу, чтобы узнать о изменениях с момента последнего релиза.
Документация также доступна в формате PDF: julia-1.3.1.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.3.1/