OCamlはじめの一歩 First Step to OCaml 小笠原 啓 (有)ITプランニング

Slides:



Advertisements
Similar presentations
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
Advertisements

2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
(Rubyistのための) 超音速:ML入門
情報理工学部 情報システム工学科 ラシキアゼミ 3年 H 井奈波 和也
ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006.
プログラミング言語としてのR 情報知能学科 白井 英俊.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
Javaのための暗黙的に型定義される構造体
第13回構造体.
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
第12回構造体.
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
haXeでオリジナルコンポーネント作り WCAN mini Vol 小笠原
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
条件式 (Conditional Expressions)
~sumii/class/proenb2010/ml4/
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
PHPの基礎と開発手法 Based on PHP5
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング言語入門 手続き型言語としてのJava
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
暗黙的に型付けされる構造体の Java言語への導入
関数の定義.
プログラミング応用 printfと変数.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
国立情報学研究所 ソフトウェア研究系 助教授/
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
コンパイラ演習 第11回 2006/1/19 大山 恵弘 佐藤 秀明.
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
C言語 はじめに 2016年 吉田研究室.
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
~sumii/class/proenb2009/ml4/
アルゴリズムとデータ構造1 2009年6月15日
高度プログラミング演習 (11).
2006/7/18(通信コース)2006/7/26(情報コース) 住井
情報処理Ⅱ 第7回 2004年11月16日(火).
~sumii/class/proenb2010/ml5/
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
プログラミング 4 文字列.
アルゴリズムとデータ構造 2010年6月17日
PROGRAMMING IN HASKELL
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
関数と再帰 教科書13章 電子1(木曜クラス) 2005/06/22(Thu.).
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
第3回簡単なデータの入出力.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
第10回 関数と再帰.
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
情報処理Ⅱ 小テスト 2005年2月1日(火).
C言語講座第5回 2017 構造体.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

OCamlはじめの一歩 First Step to OCaml 小笠原 啓 (有)ITプランニング

デモンストレーション DownDown(graphicsモジュールを使った簡単なプログラム) Amthing(2Dベクトル描画ライブラリCairoを呼び出しています) Unison(lablgtkを使っています) ChartNaviPrime(サーバーサイドでOCaml製CGIやデーモンが24H356Dで動いて います。) Page 2

Objective Camlってどんな言語? λ計算を基礎にした静的で強い型付け言語。副作用が許されていて、正格評価。 先進の型理論が応用されており、型安全でありながら柔軟な型付けが可能。 9種類のCPUアーキテクチャをサポートしたコンパイラ。高速で効率のよいコードを 出力してくれます。 フランスのINRIA研究所にて開発されています。 Qライセンスの元でソースコードが公開されています。 メインコントリビューター Xavier Leroy氏 Page 3

OCamlの歴史 元はエディンバラ大学で開発されたML(Meta Language)由来。 1987年、最初はCaml(Category Abstruct Machine Language)としてスタート。 1996年にObjective Camlとしてリリース。 以来長年に渡り改良が続けられています。 2000年 ラベル機能、多相バリアント追加 2003年 再帰モジュール追加 2005年 camlp4刷新 2008年 lazyパターンの導入 Page 4

Hello World! トップレベルと呼ばれる インタープリタ。 一行ずつプログラムを 実行して結果を表示して くれます。 # print_string “Hello World!”;; Hello World! - : unit = () # Page 5

OCamlの基礎[1] リテラル # 1234;; (* 整数 *) - : int = 1234 # 1234;; (* 整数 *) - : int = 1234 # 3.141592 (* 浮動小数 *) - : float = 3.141592 # “OCaml Meeting in Tokyo 2009”;; (* 文字列。ASCIIコード以外もOK *) - : string = “OCaml Meeting in Tokyo 2009” # ‘A’;; (* 文字 *) - : char = 'A' Page 6

OCamlの基礎[2] リテラル # [1; 2; 3; 4] ;; (* リスト *) # [1; 2; 3; 4] ;; (* リスト *) - : int list = [1; 2; 3; 4] # [| 1; 2; 3; 4 |];; (* 配列 *) - : int array = [|1; 2; 3; 4|] # (“ogasawara”, 33);; (* タプル *) - : string * int = ("ogasawara", 33) Page 7

OCamlの基礎[3] 変数 # let age = 33; (* 変数定義。バインディングと呼ぶ *) val age : int = 33 # let x;; (* 変数だけ宣言することはできない。Nullが入った変数は存在しない *) Characters 5-7: let x;; ^^ Error: Syntax error Page 8

OCamlの基礎[4] 関数 # let birthday = fun age -> age + 1;; (* 関数定義。 *) val birthday : int -> int = <fun> # let birthday age = age + 1;; (* こう書いても上と同じ。 *) # let distance x y = sqrt( x *. x +. y *. y );; (* 二引数は引数を並べる *) val distance : float -> float -> float = <fun> # distance 3. 4.;; (* 関数呼び出し *) - : float = 5. Page 9

OCamlの基礎[5] 制御構造(if式) # if age >= 20 then “adult” else “child”;; (* if式 *) - : string = "adult" # 式なので、if式全体で値になります。 三項演算子?のようなものです。 ! NOTICE 制御構造としてはfor文、while文もありますが、 あえて紹介しません。滅多に使いません。 Page 10

OCamlの基礎[6] 新しい型の定義/バリアント # type card = Number of int | Jack | Queen | King | Joker;; type card = Number of int | Jack | Queen | King | Joker # card型は、Number of intかJackかQueenかKingかJokerのどれかで あると定義しました。Number, Jack, Queen, King, Jokerの事を “コンストラクタ”と呼びます。Number of intのintはコンストラクタの引数です。 # Jack;; (* Jackはcard型の値です。*) - : card = Jack # Number 9;; (* Number 9もcard型の値です。*) - : card = Number 9 Page 11

OCamlの基礎[7]新しい型の定義/レコード # type preson = { name : string; age : int };; type person = { name : string; age : int; } # let p1 = { name = “ogasawara”; age = 33; };; (* person型の値をp1にバインドしました *) val p1 : person = {name = “ogasawara”; age = 33} # p1.name;; (* ドットで各要素にアクセスできます *) - : string = “ogasawara” person型はnameとageという要素を持つものと定義しました。要するに構造体です。 Page 12

OCamlの基礎[8] パターンマッチ # match [1; 2; 3] with [] -> “” [] -> “” | hd :: tl -> string_of_int hd;; (* ::演算子でリスト全体を先頭とそれ以降とで分けて表現。先頭の要素hdをstring_of_int関数に適用。 *) - string = “1” Switch文のようなものです。 数字、文字列、リスト、タプル、バリアントなど、何でも場合わけできます。 Page 13

OCamlの基礎[9] パターンマッチの応用例 # let home = try Some (Unix.getenv “HOME”) with _ -> None;; val home : string option = None # match home with Some path -> print_string path | None -> “there is no HOME environment variable.”;; HOME環境変数を取り出します。ただし、それが定義されていなければNone、あればSomeにします。option型と呼ばれています。 Page 14

OCamlの基礎[10] モジュール # module Counter = struct type t = int let make = 0 let increment t = t + 1 let show t = string_of_int t end;; module Counter : sig val make : int val increment : int -> int val show : int -> string end モジュールは、複数の型や値をセットにしてひとまとまりの空間として分離できる機能。 シグネチャーによる型や値の抽象化・隠蔽が可能で、プログラムにの構造を導入できます。 また、分割コンパイルの単位でもあります。 Page 15

OCamlの基礎[11] さらに詳しくは OCamlチュートリアル http://www.ocaml-tutorial.org/ja Objective Caml 入門 (by 五十嵐先生) http://www.sato.kuis.kyoto- u.ac.jp/~igarashi/class/isle4/mltext/ocaml.html 日本語の書籍 Page 16

標準ライブラリの構成 Pervasivesモジュール 基礎的な関数を集めたモジュール。デフォルトオープン。ファイル操作なども可能。 データ構造 List, Array, Queue, Hashtbl, Stack, Map, Set, Streamなど。 Printfモジュール 文字列のフォーマットを型安全に扱える。Formatモジュールも便利。 Marshalモジュール 値のマーシャリング(バイト列への変換)と読み込み。 GC関連 Gc, Weak Page 17

付属ライブラリの構成 Unixライブラリ プロセス制御、シグナル、IO、ファイル操作、ソケット、ターミナル制御など。 Numライブラリ 任意制度演算。 Strライブラリ 正規表現と文字列操作。若干物足りない。 Threadsライブラリ スレッドの作成と同期的メッセージパッシングによる通信 Graphicsライブラリ ウィンドウの作成とグラフィックの描画。 Page 18

便利ライブラリの紹介 正規表現ライブラリ pcre-ocaml http://www.ocaml.info/home/ocaml_sources.html#toc12 拡張ライブラリ Core http://ocaml.janestcapital.com/?q=node/13 Unicodeライブラリ Camomile http://camomile.sourceforge.net/index.html.ja.jis データベースアクセス、Webフレームワークなど色々あり。 postgres-ocaml, ocaml-mysql, CamlGI, ocamlnet2, eliom… Page 19

GUIツールキットもあります! LablGtk2ほぼ一択。Gladeも利用可能。 let main () =  let window = GWindow.window ~border_width:10 () in  window#event#connect#delete ~callback:delete_event;  window#connect#destroy ~callback:destroy;  let button = GButton.button ~label:"Hello World" ~packing:window#add () in  button#connect#clicked ~callback:hello;  button#connect#clicked ~callback:window#destroy;  window#show ();  GMain.Main.main () let _ = main () Page 20

開発環境 Emacs + tuareg-mode + TAGS + camlspotterパッチ + flymake Vimの人は、ocaml.vim(もしくはomlet.vim?) OcaIDE Eclipseプラグイン http://ocaml.eclipse.ortsa.com:8480/ocaide/index.html Page 21

パッケージ環境 Mac portsに含まれるocaml関連のライブラリなど caml-pgocaml @1.1 (devel, ocaml) caml-postgresql @1.8.2 (devel, ml) caml-sexplib @4.2.11 (devel, ml) caml-sqlite3 @1.5.1 (devel, ml, databases) caml-type-conv @1.6.8 (devel, ml) camlp5 @5.12 (lang) ocaml @3.11.1 (lang, ml) ocaml-bitstring @2.0.0 (devel, ocaml) ocaml-mode.el @3.05 (lang, editors, ml) ocamlgsl @0.6.0 (math, science) ocamlsdl @0.7.2 (devel, multimedia) tuareg-mode.el @1.45.6 (lang, editors) xml-light @2.2 (devel, textproc) caml-batteries @20090405 (devel, ml) caml-calendar @2.0.4 (devel, ml) caml-camlzip @1.04 (devel, ml) caml-camomile @0.7.2 (devel, ml) caml-csv @1.1.6 (devel, ml) caml-extlib @1.5.1 (devel, ml) caml-findlib @1.2.4 (devel, ml) caml-json-static @0.9.6 (devel, ml) caml-json-wheel @1.0.6 (devel, ml) caml-ocamldbi @0.9.11 (devel, ocaml) caml-ocamlnet @2.2.9 (devel, ml) caml-ounit @1.0.3 (devel, ml) caml-pcre @5.15.0 (devel, ml) Page 22

開発事例 クライアント側はJava Applet サーバーサイドはOCaml CGIで為替データを応答 リアルタイムなレートをデーモンが配信 バックで24H365Dのデータベース処理デーモンが稼動。 Page 23

まとめ OCamlはλ計算を基礎とし、柔軟な型付けができ、実行効率のいいコードをはける コンパイラ。 基礎的な文法やチュートリアルはWebや書籍を参照できます。 開発環境、ライブラリ、パッケージなど必要なものは結構揃っています。 研究室を飛び出し、現場のシステム開発にも応用されてきています。 Page 24

OCamlで快適なシステム開発を! ご清聴ありがとうございました。 Web Site: www.itpl.co.jp Email: info@itpl.co.jp Page 25