Русская Википедия:Julia (язык программирования)
Шаблон:Другие значения Шаблон:Карточка языка программирования Julia — высокоуровневый высокопроизводительный свободный язык программирования с динамической типизацией, созданный для математических вычислений. Эффективен также и для написания программ общего назначения.[1][2][3] Синтаксис языка схож с синтаксисом других математических языков (например, MATLAB и Octave), однако имеет некоторые существенные отличия. Julia написан на Си, C++ и Scheme. Имеет встроенную поддержку многопоточности и распределённых вычислений, реализованные в том числе в стандартных конструкциях.
Язык является динамическим, при этом поддерживает JIT-компиляцию (JIT-компилятор на основе LLVM входит в стандартный комплект), благодаря чему, по утверждению авторов языка, приложения, полностью написанные на языке (без использование низкоуровневых библиотек и векторных операций) практически не уступают в производительности приложениям, написанным на статически компилируемых языках, таких как Си или C++[3]. Большая часть стандартной библиотеки языка написана на нём же[4].
Поддерживается перегрузка функций и операторов (которые фактически также являются функциями), при этом опционально можно указывать тип для аргументов функции, чего обычно нет в динамически типизируемых языках. Это позволяет создавать специализированные варианты функций и операторов для ускорения вычислений. Наиболее подходящий вариант функции выбирается автоматически в процессе выполнения. Также благодаря перегрузке операторов можно создавать новые типы данных, которые ведут себя подобно встроенным типам.
История
Обсуждение необходимости создания нового языка началось в августе 2009 года. Стефан Карпински, к тому времени поработавший с математическим пакетом Matlab и языком программирования R, испытывал неудовлетворённость их ограничениями. И после того, как Вирал Шах познакомил его с Джеффом Безансоном, все трое принялись обсуждать концепцию нового языка. Для выбора женского имени в качестве названия языка, как пояснял в интервью ведущий разработчик языка Стефан Карпински, «особой причины не было», разработчикам просто «понравилось это имя»[3]. Первая открытая версия была опубликована в феврале 2012[5][6].
Идеология
Основной задачей при создании была разработка универсального языка, способного работать с большим объёмом вычислений и при этом гарантировать максимальную производительность. Поскольку большой объём вычислений выполняется именно в облачных средах, то в языке была сразу реализована поддержка облаков и параллельного программирования как замена механизму MPI[3].
В языке была изначально реализована модель построения больших параллельных приложений, основанная на глобальном распределенном адресном пространстве. Такая модель подразумевает возможность производить операции (в том числе и их передачу между машинами) со ссылкой на объект, расположенный на другой машине, также участвующей в вычислениях. Этот механизм позволяет отслеживать, какие вычисления на каких системах выполняются, а также подключать к производимым вычислениям новые машины[3].
Согласно официальному сайту, основные возможности языка:
- мультиметод: обеспечивает возможность определять поведение функции в зависимости от типа передаваемых аргументов;
- динамическая типизация;
- производительность, сравнимая со статически типизированными языками, такими как Си;
- встроенная система управления пакетами;
- макросы и другие возможности метапрограммирования;
- вызов Python-функций при помощи PyCall
- вызов си-функций напрямую: без дополнительных надстроек и API;
- богатые возможности для управления другими процессами;
- поддержка параллельных и распределённых вычислений;
- сопрограммы: легковесные зелёные потоки;
- возможность определять дополнительные типы, не уступающие в скорости и удобстве встроенным;
- удобные и расширяемые преобразования для числовых и других типов;
- поддержка Юникода, включающая UTF-8 (но не ограничивающаяся им).
Примеры
Пример функции:
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[7].
Для реализации своей идеи Бойер использовал серверную часть, написанную на языке Julia, которая при помощи специального менеджера сессий протокола SCGI взаимодействует с веб-сервером на базе lighttpd. Подобный подход позволил довольно несложным путём реализовать концепцию REPL, обладающую следующими возможностями: построение графиков на основе вычислений функций, одномерных массивов и наборов точек любого числового типа; удобство работы со средой (автоматическое определение размера окон и так далее); расширяемость и кросс-платформенность между браузерами. Функции для построения графиков в такой среде могут задаваться несколькими способами:
plot(sin, -pi, pi)
или
plot([0.0, 0.1, 0.4, 0.3, 0.4])
[7].
Julia Studio — первая настольная интегрированная среда разработки для Julia[8], впоследствии её заменила среда Juno[9], являющаяся надстройкой над текстовым редактором Atom.
Примечания
Литература
Ссылки
Шаблон:Вс Шаблон:Системы компьютерной алгебры Шаблон:Математическое ПО Шаблон:Языки программирования Шаблон:Rq
- Страницы, использующие устаревший тег source
- Русская Википедия
- Программы математического моделирования
- Программное обеспечение для macOS
- Программное обеспечение для Windows
- Программное обеспечение для Linux
- Предметно-ориентированные языки программирования
- Системы компьютерной алгебры
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Википедия
- Статья из Википедии
- Статья из Русской Википедии