2013年6月23日日曜日

30分で分かる最先端プログラミング言語Julia

やっぴー、きむりんだよ☆
今日は新しい言語の紹介をします。Julia言語 http://julialang.org/と言う言語です。
LLVMを使ったJIT Compilersを装備していて、インタプリタ形式で実行することが
できます。

詳しい解説は先ほどのURLに譲ります。速度の面でもC++に迫るものがある、という
ことが書かれておりますー。今日はJulia言語のドキュメント(英文)をもとに、
Julia言語入門を書いてみたいと思います。

では、WindowsにJuliaをインストールして、あんなことやこんなことをしてみましょ
う。Juliaの30分スペシャルツアー、始まるよー☆

1. インストール
とりあえず、さっきのURLから、downloadsのページに飛びます。 http://julialang.org/downloads/
そこに、google codeのページが書かれていますので、さらに飛びます。えいっ。
https://code.google.com/p/julialang/downloads/list

幾つかWinという単語のついたzipがあると思いますが、次のファイルをお薦めします。

一つ目(2013/07/23時点):
julia-0.2pre-dbac83fb44-WINNT-i686.zip

もし一つ目がダメだったら:
julia0.1.2-WINNT-i686+Git.zip

Julia言語はデフォでGitを使ってファイルをダウンロードするので、
長期的にはGitの入っている配布物がいいでしょう。

zipを展開して、適当な場所にファイルを置きます。
julia.batというファイルがありますので、ダブルクリックしてください。
1回目は色々コンパイルするので時間がかかります。

プロンプトが出て、めでたしめでたしです。(多分)

使い方はpythonなどのように、REPLで使うか、
> julia.bat file1.jl file2.jl ...
のようにファイルを指定して使います。Julia言語ファイルは拡張子.jlです。

LinuxやMacでも配布物あります。ただLinuxは最新のUbuntu以外はgit使ってソースコードからビルドになると思います。詳しくはGitHubのReadme.mdを参考にしてください。
コンパイルにgfortranとか必要です。多分自分のマシンにLinux入れてる人なら自分で
ビルドできると思うのであまり心配してません(こら)


2. まずはこんにちは世界

              _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "help()" to list help topics
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.0.0+107211096.rba9e.dirty
 _/ |\__'_|_|_|\__'_|  |  Commit ba9eb0a653 (2013-01-14 19:30:42)*
|__/                   |

julia>

ちょっとロゴがつぶれちゃいましたが、こんな感じでjulia>ってロゴが出てくるので、
まずはREPLから色々やってみましょう。

julia> println("Hello Julia!")
Hello Julia!

末尾のセミコロンは要りません。付けてもいいですが、普通は付けないで
書きます。pythonやrubyみたいですね。

3. 数値

julia> 1
1

julia> 100000
100000

julia> 1000000000000000000000000000
syntax error: invalid numeric constant 1000000000000000000000000000

julia> 100000000000000000000
syntax error: invalid numeric constant 100000000000000000000

julia> int128("100000000000000000000000000000000")
100000000000000000000000000000000

あまりに長い数はエラーになります。
int128という関数で128bit整数を作れるのですが、そいつに文字列として
数字を喰わせてあげると、128bit整数となります。

julia> typeof(int128("100000000000000000000000000000000"))
Int128

julia> typeof(Int)
BitsKind

julia> Int
Int64

julia> Int32
Int32

julia> 

0xを付けて16進数にすると、unsignedな型になります。


julia> typeof(0x88)
Uint8

julia> typeof(0x8888)
Uint16

julia> typeof(0x88888888)
Uint32

julia> typeof(0x88888888777777776666666655555555)
syntax error: invalid numeric constant 0x88888888777777776666666655555555

julia> typeof(uint128("0x88888888777777776666666655555555"))
ArgumentError("'x' is not a valid digit (in \"0x88888888777777776666666655555555\")")
 in parse_int at string.jl:1132
 in uint128 at string.jl:1185

julia> typeof(uint128("88888888777777776666666655555555"))
Uint128

julia> 

長過ぎる数は例によって、コンストラクタ(ここではuint128)を
使って作ってください。

typeof関数で、数値や文字列などのデータがどのような型を持つか
が分かります。windows版は現在32bit版だけで、
IntがInt32となります。上記例は64bit Mac OSXでの実行例
なので、Int64となっております。ここ注意です。

4. 数値型

本来は最初に説明すべきでした。
次のような数値型があります。

• Integer types: 
  – Int8 — signed 8-bit integers ranging from -2^7 to 2^7 - 1.
  – Uint8 — unsigned 8-bit integers ranging from 0 to 2^8 - 1.
  – Int16 — signed 16-bit integers ranging from -2^15 to 2^15 - 1.
  – Uint16 — unsigned 16-bit integers ranging from 0 to 2^16 - 1.
  – Int32 — signed 32-bit integers ranging from -2^31 to 2^31 - 1.
  – Uint32 — unsigned 32-bit integers ranging from 0 to 2^32 - 1.
  – Int64 — signed 64-bit integers ranging from -2^63 to 2^63 - 1.
  – Uint64 — unsigned 64-bit integers ranging from 0 to 2^64 - 1.
  – Int128 - signed 128-bit integers ranging from -2^127 to 2^127 - 1.
  – Uint128 - unsigned 128-bit integers ranging from 0 to 2^128 - 1.
  – Bool — either true or false, which correspond numerically to 1 and 0.
  – Char — a 32-bit numeric type representing a Unicode character (see Strings for more details).
• Floating-point types:
  – Float32 — IEEE 754 32-bit floating-point numbers.
  – Float64 — IEEE 754 64-bit floating-point numbers.

128bitの型があるのが面白いですね。浮動点少数については、32bit, 64bitが
あります。デフォルトではFloat64という型になります。

型の名前に対応した、コンストラクタが存在します。そうです、さっき出て来た
uint128()などです。
型名を先頭文字だけ小文字にすれば、コンストラクタとなります。

5. BigInt, BigFloat

pythonの整数みたいに、多倍長整数/実数を扱えます。
あまり使うことはないと思いますが。。。

julia> BigInt(1000)
1000

見た目は変わりませんが、BigIntになっています。あたまが大文字なのに
注意してくださいね。

6. 数学関数群

一通りあります。詳しくはマニュアルどぞ。

julia> sin(0.4)
0.3894183423086505

7. その他新しい機能

分数と、複素数が扱えます。


julia> sqrt(1 + 2im)
1.272019649514069 + 0.7861513777574233im

虚数部はimで表現します。

julia> 12//34 * 56//78
56//221

a//bでb分のaになります。演算が可能です。
気になる型は、Rational{Int32}です。JavaのGenericみたいですね。


8.文字列

Unicodeを扱うため、文字列は少し面白い仕様です。

str = "Hello, Julia!¥n"

のように、C言語のような扱いが可能ですが、

str[0], str[1]とアクセスすると、たまにUnicodeの文字があると
例外が出ます。

どうすればいいかと云うと、

for c in s
    println(c)
end

のように、for...in文で廻すと、cにUnicode文字が入ります。

9. 正規表現

割愛(ぉぃ PCREが使えます。

10. 関数

関数定義はMatLabに近いです。

function f(x,y)
  x + y
end


Juliaではループや関数の最後はendキーワードで終わります。
基本インデントしますが、pythonのような字下げで意味が変わる仕組みは
ありません。

この関数では返す値をreturnキーワードを用いずに書いています。
LISPと同じで、最後に書いた式が返り値となります。

returnキーワードも使えます。制御構造により異なる返り値が返るとき、
途中で値を返したいときにreturnキーワードを使います。

function f(x,y)
  if  x > 0
    return x+y
  else
    return x*y
  end
end

11. 無名関数


julia> x -> x^2 + 2x - 1
 #<function>

所謂ラムダ式です。
別件バウアーですが、
2xって書くと、2*xを計算してくれます(λ式以外でも使用可能)




今日はこんなところかなぁ、、、
(力尽きた)