Juliaにクラスが無い理由というのはあくまで個人の意見ですが,数値演算を高速に簡単に処理することが主目的に設計された言語だからだと思います。
ということは処理速度,メモリ効率を重視しているということで,その方向性とクラスは合わないと判断されたためでしょう。
クラスがあってオブジェクトを作成するとなると,愚直に実装するとすればたとえ使わないメソッドであってもオブジェクトを作成した数だけメモリにロードされる訳です。
実際にこんな実装になっていることはないと思いますが,同じクラスのオブジェクトを作成した時の例を次に示します。
それぞれのオブジェクトに対してメソッドがロードされます。
一方,Juliaの場合はクラスがないので,複合型(構造体)とそれを扱う二つの関数のモジュールをロードし三つのオブジェクトを作成したとします。
明らかにクラスの方がメソッドの分だけメモリを余分に食います。特に機能リッチなクラスに対してはこの差が顕著に表れることになると思います。
もちろん,実装方法によって改善されますが,それよりも開発陣はクラスを実装しないことを選択したということだろうと思います。
少し前まで処理速度アップのため廃止される関数や文法とかも多かったので,「速度ファースト」なのは間違いないと思います。
ただ,クラスが無いというのはGoやRustでも同じなので,Juliaが特別ということでもないかと思います。
Juliaの場合は多重ディスパッチという機能により同じ関数名でも引数の型によって別の関数として区別することができるので,オブジェクト指向っぽいことは可能です。
julia
1# hoge.jl
2
3struct 正方形
4 一辺::Float64
5end
6
7struct 長方形
8 辺1::Float64
9 辺2::Float64
10end
11
12struct 円
13 半径::Float64
14end
15
16function 面積(gr::正方形)
17 gr.一辺^2
18end
19
20function 面積(gr::長方形)
21 gr.辺1 * gr.辺2
22end
23
24function 面積(gr::円)
25 pi * gr.半径^2
26end
27
28
29function 外周(gr::正方形)
30 gr.一辺 * 4
31end
32
33function 外周(gr::長方形)
34 (gr.辺1 + gr.辺2) * 2
35end
36
37function 外周(gr::円)
38 2pi * gr.半径
39end
40
のような感じで実装し,
julia
1julia> include("hoge.jl")
2外周 (generic function with 3 methods)
3
4julia> rect=長方形(3, 4)
5長方形(3.0, 4.0)
6
7julia> 外周(rect)
814.0
9
10julia> 面積(rect)
1112.0
12
13julia> c=円(5)
14円(5.0)
15
16julia> 外周(c)
1731.41592653589793
18
19julia> 面積(c)
2078.53981633974483
21
22
のようなこともできる,ということです。