Juliaは動的で、型付けの強いプログラミング言語です。 プログラミングスタイルは主に関数型ですが、Haskellなどの言語よりも柔軟です。
強力で多彩な型システムがあり、これは後の概念で重要になってきます。 実際には、Juliaが文脈から適切な既定の型を推論してくれるのが普通です。
読みやすさを重視しているため、PythonやRubyのようなスクリプト言語に見えますが、Juliaのコードは実行前にコンパイルされます。 Just In Time(JIT)コンパイラーは、関数に出会うたびに高度に最適化されたコードを生成するため、実行速度が速くなります。
Juliaはオブジェクト指向言語ではなく、他の多くの言語で中心となるようなクラス階層もありません。
その代わりに*(これを読んでも慌てないでくださいね!)*、Juliaは次のものに依拠しています。
これらの少し紛らわしい用語も、シラバスを進めていくうちにはっきりしてくるはずです。
公式ドキュメントには、現在のリリースに関する価値ある情報がたくさん載っていますが、初心者には少し圧倒されるかもしれません。
動画には次のようなものがあります。
コードにコメントを書くことは、人間がコードを読み、その意図を理解するためにきわめて重要です。相手は他の人かもしれませんし、未来の自分かもしれません。 コンパイラーはコメントを(ほとんど)無視します。
Juliaでは2つの方法があります。
#で始まります。#=で始まり、=#で終わります。入れ子にすることもできます。# 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で名前付き関数を定義する一般的な方法は2つあります。
functionキーワードを使う
function muladd(x, y, z)
x * y + z
end
読みやすさのために4スペースでインデントするのが慣例ですが、コンパイラーはこれを無視します。
endキーワードは必須です。PythonよりもRubyに近い書き方です。
return x * y + zと書くこともできたことに注意してください。
しかし、Juliaの関数は常に最後に評価された式を返すので、returnキーワードは省略できます。
多くのプログラマーは、意図をより明確にするためにこれを書くことを好みます。
「代入形式」を使う
muladd(x, y, z) = x * y + z
これは、本体が単一の式である1行の関数定義や数学的な関数によく使われます。
代入形式では、returnキーワードは決して使いません。
2つの形式は等価で、まったく同じように使えるので、読みやすいほうを選んでください。
関数を呼び出すには、その名前を指定し、関数の各仮引数に引数を渡します。
# 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...
REPL、Pluto.jl、Juliaプラグインを入れたVS Codeなど、Juliaを理解しているエディターなら、これらの文字を簡単に入力できます。
πの場合は、\piと入力してから<Tab>を押します。入力した内容はギリシャ文字に置き換わります。
これについては、後の概念でもっと多くの例を見ていくことになります。
実は、バックスラッシュの略記はJuliaに固有のものではありません。 これらはLaTeXから取り入れられたものです。LaTeXは、多くの科学者やエンジニアが報告書を書くためにほぼ毎日のように使っている組版システムです。