Ос

Основи у Julia

2 вправи

Про концепцію Основи

Julia - динамічна мова програмування зі строгою типізацією. Стиль програмування переважно функціональний, хоча й гнучкіший, ніж у таких мовах, як Haskell.

Тут є потужна й універсальна система типів, яка стане важливою в наступних концепціях. На практиці Julia зазвичай виводить потрібне типове значення з контексту.

Попри наголос на читабельності, який робить її схожою на скриптову мову, як-от Python чи Ruby, код Julia компілюється перед запуском. Компілятор Just In Time (JIT) генерує високооптимізований код для кожної функції, щойно вона зустрічається, що забезпечує високу швидкість виконання.

Julia не є обʼєктно-орієнтованою мовою, і в ній немає такої ієрархії класів, яка відіграє центральну роль у багатьох інших мовах.

Натомість (і, будь ласка, не панікуймо, читаючи це!) Julia спирається на:

  • Ієрархію типів.
  • Компоновані функції (створені так, щоб легко поєднуватися, у різноманітні й потужні способи).
  • Множинну диспетчеризацію: функції можна викликати з різною кількістю та типами аргументів.

Ці доволі заплутані терміни стануть зрозумілішими в міру того, як ми будемо просуватися силабусом.

В офіційній документації багато цінної інформації про поточний випуск, хоча для початківців вона може бути трохи завеликою.

Також є відео:

Коментарі

Коментарі в коді надзвичайно важливі, щоб допомогти людям читати наш код і розуміти наші наміри: можливо, іншим людям, а також нам самим у майбутньому. Компілятор їх (переважно) ігнорує.

У Julia можливі два варіанти:

  • Однорядкові коментарі починаються з #
  • Багаторядкові коментарі починаються з #= і закінчуються на =#. Вкладення дозволене.
# This is a single-line comment

x = 3  # This is an inline comment

#=
	Multi-line comments can be used for longer explanations.

	They are especially useful to comment out blocks of code during debugging.
=#

Змінні та присвоєння

Щоб створити змінну, просто присвоюємо їй значення:

julia> myvar = 42  # an integer (in fact, Int64)
42

julia> bigint = 1_234_567_890  # optionally use underscore as digit separator, for readability
1234567890

julia> name = "Maria"  # strings are surrounded by double-quotes ""
"Maria"

Присвоєння "звʼязує" значення зі змінною.

Вказувати тип необовʼязково, і здебільшого Julia виведе потрібне типове значення з контексту.

Типи відіграють у Julia важливу роль. Ми розглянемо їх докладніше в наступних концепціях. Наразі краще про них не хвилюватися.

На відміну від багатьох функціональних мов, у Julia змінні можна присвоювати повторно, і ми вільні змінювати як значення, так і тип, звʼязані зі змінною:

julia> myvar = 3
3

julia> myvar = "now a string"
"now a string"

Константи

Глобальні змінні, створені поза будь-якою функцією:

  • Дозволені.
  • Іноді необхідні.
  • Зазвичай небажані (хоча це стосується лише файлів *.jl; REPL працює інакше).

Якщо значення має бути доступним у всій програмі, але не повинно змінюватися, краще використати константу.

Якщо поставити перед присвоєнням ключове слово const, компілятор зможе генерувати ефективніший код.

Спроба випадково змінити значення const призведе до попередження:

julia> const answer = 42
42

julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24

Арифметичні оператори

Арифметика переважно працює звичним чином:

2 + 3  # 5 (addition)
2 - 3  # -1 (subtraction)
2 * 3  # 6 (multiplication)
8 / 2  # 4.0 (division)
8 % 3  # 2 (remainder)
2 ^ 3  # 8 (exponentiation)

Зауважмо, що ділення з / завжди дає число з плаваючою комою.

Ми повернемося до цього в наступних концепціях, де йтиметься про цілочисельне ділення за допомогою div() або ÷, щоб відкинути дробову частину, та //, щоб отримати раціональне число.

Функції

Для найкращої швидкодії під час виконання більшу частину коду краще розмістити всередині функцій. Мати багато маленьких функцій цілком нормально, на відміну від деяких інших мов.

Існують два поширені способи визначити іменовану функцію в Julia:

  1. За допомогою ключового слова function

    function muladd(x, y, z)
        x * y + z
    end
    

    Відступ у 4 пробіли заведено робити для читабельності, але компілятор його не враховує. Ключове слово end обовʼязкове: це радше як у Ruby, ніж у Python.

    Зауважмо, що ми могли б написати return x * y + z. Однак функції Julia завжди повертають останній обчислений вираз, тому ключове слово return необовʼязкове. Багато програмістів вважають за краще вказувати його, щоб наміри були очевиднішими.

  2. За допомогою «форми присвоєння»

    muladd(x, y, z) = x * y + z
    

    Найчастіше це використовують для однорядкових визначень функцій або математичних функцій, де тіло функції складається з одного виразу. У формі присвоєння ключове слово return ніколи не використовують.

Обидві форми рівнозначні й використовуються абсолютно однаково, тож обираймо ту, яка зрозуміліша.

Щоб викликати функцію, треба вказати її назву й передати аргументи для кожного з параметрів функції:

# invoking a function
muladd(10, 5, 1)

# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)

З того, що ми називаємо їх «іменованими» функціями, можна здогадатися, що існують також «анонімні» функції. Про них ітиметься в одній із наступних концепцій.

Правила найменування

Як і багато мов, Julia вимагає, щоб назви (змінних, функцій і багатьох інших речей) починалися з літери, після якої йде будь-яка комбінація літер, цифр і символів підкреслення.

За домовленістю назви змінних, констант і функцій пишуть малими літерами, а підкреслення уникають, крім випадків, коли без нього виникає плутанина.

Однак Julia всюди використовує Unicode, тому «літеру» тлумачать досить вільно.

Підтримуються не лише англійська, а й інші мови, а також емодзі (хоча, будь ласка, добираймо їх зі смаком і доречно).

Зокрема, доступні всі грецькі літери, які так люблять математики (а кілька корисних значень визначено заздалегідь):

julia> π   # a built-in constant
π = 3.1415926535897...

Редактори, які розуміють Julia, зокрема REPL, Pluto.jl і VS Code з плагіном Julia, дають змогу легко вводити ці символи.

Для π наберімо \pi, а потім натиснімо <Tab>. Набраний текст заміниться на грецький символ.

Багато інших прикладів цього ми побачимо в наступних концепціях.

Насправді скорочення зі зворотною скісною рискою не є чимось властивим лише Julia. Вони походять із LaTeX, системи верстання, яку багато науковців та інженерів використовують майже щодня для написання звітів.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Основи