Документация Engee

Руководство пользователя

Введение

Для научных вычислений традиционно требовалась высочайшая производительность, однако в своей повседневной работе прикладные специалисты стали часто полагаться на более медленные динамические языки. Мы уверены, что выбор в пользу динамических языков вполне обоснован, и не ожидаем сокращения их использования. К счастью, методики организации современных языков и компиляторов позволяют свести потери производительности к минимуму и обеспечить единую среду, которая достаточно эффективна для прототипирования и развертывания приложений, требовательных к производительности. Язык программирования Julia служит этой цели: это гибкий динамический язык, который подходит для научных и числовых вычислений и производительность которого сопоставима с традиционными языками со статической типизацией.

Так как компилятор Julia отличается от интерпретаторов, применяемых в таких языках, как Python или R, поначалу могут возникнуть проблемы с пониманием производительности Julia. Если код работает слишком медленно, настоятельно рекомендуем в первую очередь ознакомиться с разделом Советы по производительности. Когда вы поймете, как работает Julia, вы сможете легко писать код, который работает почти так же быстро, как код на C.

Особенностями Julia являются необязательная типизация, множественная диспетчеризация и высокая производительность, которая достигается за счет вывода типов и JIT-компиляции, реализованной с помощью LLVM. Это многопарадигматический язык программирования, совмещающий в себе черты императивного, функционального и объектно-ориентированного программирования. Julia позволяет легко и выразительно программировать высокоуровневые числовые вычисления, так же как языки R, MATLAB или Python, но в то же время поддерживает и общие методы программирования. Для этого Julia использует богатое наследие математических языков программирования, одновременно заимствуя многое из популярных динамических языков, включая Lisp, Perl, Python, Lua и Ruby.

Вот главные отличия Julia от типичных динамических языков:

  • основа языка очень лаконичная; модуль Base и стандартная библиотека написаны на самом языке Julia, включая примитивные операции, такие как арифметические операции с целыми числами;

  • широкий набор типов для создания и описания объектов, который также можно использовать для объявления типов;

  • возможность определения поведения функций с различными сочетаниями типов аргументов посредством множественной диспетчеризации;

  • автоматическое создание эффективного, специализированного кода для различных типов аргументов;

  • высокая производительность, близкая к производительности языков со статической компиляцией, таких как C.

Хотя динамические языки иногда называют языками без типизации, это, безусловно, неверно: каждый объект, будь то примитивный или определенный пользователем, имеет тип. Однако отсутствие объявлений типов в большинстве динамических языков означает, что компилятору нельзя сообщить типы значений, а зачастую типы вообще не определяются явным образом. С другой стороны, хотя в статических языках типы можно — и обычно требуется — аннотировать для компилятора, обычно они существуют только во время компиляции, и ими нельзя манипулировать во время выполнения. В Julia типы сами по себе являются объектами времени выполнения, но их также можно использовать для предоставления информации компилятору.

Хотя рядовому программисту не требуется явным образом использовать типы или множественную диспетчеризацию, они лежат в основе языка Julia: функции определяются для различных сочетаний типов аргументов и применяются путем выбора наиболее специфичного подходящего определения. Такая модель хорошо подходит для математического программирования, где операция не должна быть привязана к первому аргументу, как при традиционной объектно-ориентированной диспетчеризации. Операторы — это просто функции с особой нотацией: для реализации операции сложения для новых пользовательских типов данных достаточно определить новые методы для функции +. После этого можно спокойно применять существующий код к новым типам данных.

Отчасти по причине вывода типов во время выполнения (дополненного необязательными аннотациями типов), а отчасти из-за серьезного внимания, уделяемого производительности с самого начала проекта, по вычислительной эффективности Julia превосходит другие динамические языки и даже соперничает с языками со статической компиляцией. Для решения объемных числовых задач скорость всегда была и, вероятно, всегда будет важнейшим приоритетом: последние десятилетия объем обрабатываемых данных рос, вполне подчиняясь закону Мура.

Целью создания языка Julia было обеспечить беспрецедентное сочетание простоты использования, функциональности и эффективности. В дополнение к вышесказанному, у Julia есть еще ряд преимуществ перед аналогами:

  • бесплатный язык с открытым исходным кодом (распространяется по лицензии MIT);

  • пользовательские типы могут быть такими же лаконичными и быстрыми, как и встроенные;

  • нет необходимости векторизировать код для повышения производительности; невекторизированный код выполняется достаточно быстро;

  • поддерживает параллелизм и распределенные вычисления;

  • легковесные «зеленые» потоки (сопрограммы);

  • скрытая, однако развитая система типов;

  • элегантные расширяемые преобразования и продвижения числовых и других типов;

  • эффективная поддержка Юникода, включая, помимо прочего, UTF-8;

  • прямой вызов функций на C (без оболочек или специальных API);

  • эффективные возможности для управления другими процессами с помощью средств наподобие оболочек;

  • макросы наподобие используемых в Лиспе и другие средства метапрограммирования.

Структура раздела