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

Julia
Изображение логотипа
Класс языка объектно-ориентированный, язык функционального программирования, векторный язык программирования[вд], мультипарадигмальный, императивный и интерпретируемый
Появился в 23 августа 2009[2][3]
Автор Джефф Безансон[вд], Алан Эдельман[вд], Стефан Карпински[вд] и Вирал Шах[вд]
Разработчик Джефф Безансон[вд], Стефан Карпински[вд], Алан Эдельман[вд] и Вирал Шах[вд]
Расширение файлов .jl[4]
Выпуск
Испытал влияние MATLAB
Сайт julialang.org (англ.)
ОС Linux, Windows[5] и macOS[5]
Логотип Викисклада Медиафайлы на Викискладе

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

Язык является динамическим, при этом поддерживает JIT-компиляцию (JIT-компилятор на основе LLVM входит в стандартный комплект), благодаря чему, по утверждению авторов языка, приложения, полностью написанные на языке (без использование низкоуровневых библиотек и векторных операций) практически не уступают в производительности приложениям, написанным на статически компилируемых языках, таких как Си или C++[8]. Большая часть стандартной библиотеки языка написана на нём же[9].

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

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

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

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

Ключевые особенности языка

[править | править код]
  • мультиметод: обеспечивает возможность определять поведение функции в зависимости от типа передаваемых аргументов;
  • динамическая типизация (опциональная возможность явного указания типов);
  • производительность, сравнимая со статически типизированными языками, такими как Си;
  • встроенная система управления пакетами;
  • макросы и другие возможности метапрограммирования;
  • вызов Python-функций при помощи PyCall
  • вызов си-функций напрямую: без дополнительных надстроек и API;
  • богатые возможности для управления другими процессами;
  • поддержка параллельных и распределённых вычислений;
  • сопрограммы: легковесные зелёные потоки;
  • возможность определять дополнительные типы, не уступающие в скорости и удобстве встроенным;
  • удобные и расширяемые преобразования для числовых и других типов;
  • поддержка Юникода, включающая UTF-8 (но не ограничивающаяся им);
  • все библиотеки Julia — это модули, модули объединяют в пакеты (для управления пакетами есть модуль «Pkg»), для каждого пакета есть файл проекта «Project.toml» с описанием проекта и зависимостей в формате «.toml».

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

function mandel(z; maxiter = 80)     c = z     for n = 1:maxiter         abs(z) > 2 && return n-1         z = z^2 + c     end     maxiter end  function randmatstat(t)     n = 5     w = v = 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[12].

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

plot(sin, -pi, pi)  % или plot([0.0, 0.1, 0.4, 0.3, 0.4]) 

Julia Studio — первая настольная интегрированная среда разработки для Julia[13], впоследствии её заменила среда Juno[14], являющаяся надстройкой над текстовым редактором Atom. Поддерживают джулию также Geany, Jupyter, JuliaDT (Eclipse plugin) и др.

Примечания

[править | править код]
  1. Julia 1.11 Highlights (англ.) — 2024.
  2. LICENSE.md file in the JuliaLang/julia repositoryGitHub Inc..
  3. Безансон Д. JuliaLang/julia - commit eb256df: "beginning work on parser"GitHub Inc..
  4. http://fileformats.archiveteam.org/wiki/Julia
  5. 1 2 https://julialang.org/downloads/
  6. The Julia Language. Архивировано из оригинала 24 мая 2013 года.
  7. Bryant, Avi Matlab, R, and Julia: Languages for data analysis. O'Reilly Strata (Oct 2012). Дата обращения: 7 февраля 2013. Архивировано из оригинала 24 мая 2013 года.
  8. 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 года.)
  9. Julia: A Fast Dynamic Language for Technical Computing (PDF) (2012). Архивировано из оригинала 24 мая 2013 года.
  10. Why We Created Julia (Feb 2012). Дата обращения: 7 февраля 2013. Архивировано из оригинала 24 мая 2013 года.
  11. Mark, Gibbs Gear head. Network World (2013‐1‐9). Дата обращения: 7 февраля 2013. Архивировано из оригинала 24 мая 2013 года.
  12. 1 2 Stephan Boyer. A Graphical Front End for the Julia Programming Language (англ.). Массачусетский технологический институт (декабрь 2011). Дата обращения: 23 июля 2012. Архивировано из оригинала 13 сентября 2012 года.
  13. The Julia Studio. Архивировано из оригинала 24 мая 2013 года.
  14. Juno, the Interactive Development Environment. Дата обращения: 5 июля 2015. Архивировано 10 октября 2016 года.

Литература

[править | править код]
  • 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.