Введение
Научные вычисления традиционно требовали максимальной производительности, но специалисты в области предметной области в основном перешли на более медленные динамические языки для повседневной работы. Мы считаем, что существуют много веских причин для предпочтения динамических языков в этих приложениях, и мы не ожидаем, что их использование уменьшится. К счастью, современный дизайн языков программирования и методы компиляции позволяют в основном устранить компромисс в производительности и предоставить единую среду, достаточно продуктивную для прототипирования и достаточно эффективную для развертывания ресурсоемких приложений. Язык программирования Julia выполняет эту роль: это гибкий динамический язык, подходящий для научных и числовых вычислений, с производительностью, сопоставимой с традиционными статически типизированными языками.
Поскольку компилятор Julia отличается от интерпретаторов, используемых для языков, таких как Python или R, вы можете обнаружить, что производительность Julia на первый взгляд кажется неинтуитивной. Если вы обнаружите, что что-то работает медленно, мы настоятельно рекомендуем ознакомиться с разделом Рекомендации по производительности, прежде чем пробовать что-либо другое. После того, как вы поймете, как работает Julia, вы сможете писать код, скорость которого практически равна скорости кода на C.
Julia имеет необязательную типизацию, множественное диспетчерирование и хорошую производительность, достигнутую с помощью вывода типов и компиляции в реальном времени (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.6/manual/introduction/