Julia (язык программирования)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Julia
Julia Programming Language Logo.svg
Класс языка мультипарадигмальный: процедурный, на основе мультиметодов, функциональный, мета
Тип исполнения компилируемый (JIT)
Появился в 23 августа 2009[1][2]
Автор Стефан Карпински,
Джефф Безансон,
Вирал Шах
Разработчик см. Julia. GitHub.
Расширение файлов .jl[3]
Выпуск 1.5.2
Система типов динамический с опциональными аннотациями типов[en] и выводом типов
Испытал влияние Си, Fortran, NumPy, Matlab, Lua, R, Scheme, Lisp, Python, Perl, Ruby
Сайт julialang.org​ (англ.)
ОС Linux, Microsoft Windows[4] и macOS[4]
Commons-logo.svg Медиафайлы на Викискладе

Julia — высокоуровневый высокопроизводительный свободный язык программирования с динамической типизацией, созданный для математических вычислений. Эффективен также и для написания программ общего назначения.[5][6][7] Синтаксис языка схож с синтаксисом других математических языков (например, MATLAB и Octave), однако имеет некоторые существенные отличия. Julia написан на Си, C++ и Scheme. В стандартный комплект входит JIT-компилятор на основе LLVM, благодаря чему, по утверждению авторов языка, приложения, полностью написанные на языке, практически не уступают в производительности приложениям, написанным на статически компилируемых языках вроде Си или C++[7]. Большая часть стандартной библиотеки языка написана на нём же.[8] Также язык имеет встроенную поддержку большого числа команд для распределенных вычислений.

Описание языка[править | править код]

Язык является динамическим, однако использует JIT-компиляцию. Благодаря этому достигается высокая скорость работы приложений, написанных на «чистом» языке, без использования низкоуровневых библиотек и векторных операций. Поддерживается перегрузка функций и операторов (которые фактически также являются функциями), при этом опционально можно указывать тип для аргументов функции, чего обычно нет в динамически типизируемых языках. Это позволяет создавать специализированные варианты функций и операторов для ускорения вычислений. Наиболее подходящий вариант функции выбирается автоматически в процессе выполнения. Также благодаря перегрузке операторов можно создавать новые типы данных, которые ведут себя подобно встроенным типам.

Одним из приоритетных направлений в развитии языка является поддержка распределённых вычислений. Присутствует большое количество стандартных конструкций для распараллеливания кода.

История создания[править | править код]

Обсуждение необходимости создания нового языка началось в августе 2009 года. Стефан Карпински, к тому времени поработавший с математическим пакетом Matlab и языком программирования R, испытывал неудовлетворённость их ограничениями. И после того, как Вирал Шах познакомил его с Джеффом Безансоном, все трое принялись обсуждать концепцию нового языка. Для выбора женского имени в качестве названия языка, как пояснял в интервью ведущий разработчик языка Стефан Карпински, «особой причины не было», разработчикам просто «понравилось это имя»[7]. Первая открытая версия была опубликована в феврале 2012.[9][10]

Идеология[править | править код]

Основной задачей при создании была разработка универсального языка, способного работать с большим объёмом вычислений и при этом гарантировать максимальную производительность. Поскольку большой объём вычислений выполняется именно в облачных средах, то в языке была сразу реализована поддержка облаков и параллельного программирования как замена механизму MPI[7].

В языке была изначально реализована модель построения больших параллельных приложений, основанная на глобальном распределенном адресном пространстве. Такая модель подразумевает возможность производить операции (в том числе и их передачу между машинами) со ссылкой на объект, расположенный на другой машине, также участвующей в вычислениях. Этот механизм позволяет отслеживать, какие вычисления на каких системах выполняются, а также подключать к производимым вычислениям новые машины[7].

Возможности Julia[править | править код]

Согласно официальному сайту, основные возможности языка:

Примеры кода[править | править код]

Пример функции:

function mandel(z)
    c = z
    maxiter = 80
    for n = 1:maxiter
        if abs(z) > 2
            return n-1
        end
        z = z^2 + c
    end
    return maxiter
end

function randmatstat(t)
    n = 5
    v = zeros(t)
    w = zeros(t)
    for i = 1:t
        a = randn(n,n)
        b = randn(n,n)
        c = randn(n,n)
        d = randn(n,n)
        P = [a b c d]
        Q = [a b; c d]
        v[i] = trace((P.'*P)^4)
        w[i] = trace((Q.'*Q)^4)
    end
    std(v)/mean(v), std(w)/mean(w)
end

Пример параллельного вычисления 100.000.000 результатов случайного подбрасывания монеты:

nheads = @parallel (+) for i=1:100000000
  randbit()
end

Графическая реализация[править | править код]

В декабре 2011 года Стефан Бойер предложил идею графической реализации языка, которая облегчит работу с ним математикам и другим учёным, не обладающими навыками программирования и работы в UNIX-средах. Идея Бойера заключалась в переходе от отправки команд вычислительному кластеру к простой работе с браузером. При этом, клиентская часть, реализующая в том числе и графический интерфейс и платформу для построения графиков, может быть реализована при помощи таких современных (на тот момент) технологий как HTML5, SVG и AJAX[11].

Для реализации своей идеи Бойер использовал серверную часть, написанную на языке Julia, которая при помощи специального менеджера сессий протокола SCGI взаимодействует с веб-сервером на базе lighttpd. Подобный подход позволил довольно несложным путём реализовать концепцию REPL, обладающую следующими возможностями: построение графиков на основе вычислений функций, одномерных массивов и наборов точек любого числового типа; удобство работы со средой (автоматическое определение размера окон и т. д.); расширяемость и кросс-платформенность между браузерами. Функции для построения графиков в такой среде могут задаваться несколькими способами:

plot(sin, -pi, pi)

или

plot([0.0, 0.1, 0.4, 0.3, 0.4])

[11].

Инструменты[править | править код]

Julia Studio — это интегрированная среда разработки для Julia.[12] В настоящее время её заменила среда Juno[13], являющаяся надстройкой над Atom.

Примечания[править | править код]

  1. LICENSE.md file in the JuliaLang/julia repositoryGitHub Inc..
  2. Безансон Д. JuliaLang/julia - commit eb256df: "beginning work on parser"GitHub Inc..
  3. http://fileformats.archiveteam.org/wiki/Julia
  4. 1 2 https://julialang.org/downloads/
  5. The Julia Language. Архивировано 24 мая 2013 года.
  6. Bryant, Avi Matlab, R, and Julia: Languages for data analysis. O'Reilly Strata (Oct 2012). Дата обращения: 7 февраля 2013. Архивировано 24 мая 2013 года.
  7. 1 2 3 4 5 Пол Крил. Учёным предлагается альтернатива Си — язык Julia. «Открытые системы» (27 апреля 2012). Дата обращения: 27 апреля 2012. Архивировано 13 сентября 2012 года. (оригинал Krill, Paul New Julia language seeks to be the C for scientists. InfoWorld. Дата обращения: 7 февраля 2013. Архивировано 24 мая 2013 года.)
  8. Julia: A Fast Dynamic Language for Technical Computing (PDF) (2012). Архивировано 24 мая 2013 года.
  9. Why We Created Julia (Feb 2012). Дата обращения: 7 февраля 2013. Архивировано 24 мая 2013 года.
  10. Mark, Gibbs Gear head. Network World (2013‐1‐9). Дата обращения: 7 февраля 2013. Архивировано 24 мая 2013 года.
  11. 1 2 Stephan Boyer. A Graphical Front End for the Julia Programming Language (англ.). Массачусетский технологический институт (December 2011). Дата обращения: 23 июля 2012. Архивировано 13 сентября 2012 года.
  12. The Julia Studio. Архивировано 24 мая 2013 года.
  13. Juno, the Interactive Development Environment

Литература[править | править код]

  • Bruce Tate, Fred Daoud, Jack Moffitt, Ian Dees. Julia // Seven More Languages in Seven Weeks. Languages That Are Shaping the Future. — The Pragmatic Bookshelf, 2015. — С. 171—207. — 320 с. — ISBN 978-1941222157.

Ссылки[править | править код]