gura プログラミング言語の紹介

48
Guraプログラミング言語の紹介 www.gura-lang.org Copyright © 2014 [email protected] LL Diver on Aug 23, 2014

Upload: yutaka-saito

Post on 11-Jan-2015

1.785 views

Category:

Software


5 download

DESCRIPTION

Introduction to Gura programming language. English version is available here: http://www.slideshare.net/ypsitau/gura-introductione

TRANSCRIPT

Page 1: Gura プログラミング言語の紹介

Guraプログラミング言語の紹介www.gura-lang.org

Copyright © 2014 [email protected]

LL Diver on Aug 23, 2014

Page 2: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 2/49

自己紹介

名前 斉藤 寛 (ゆたか)

開発経験 組込ファームウェア から GUI まで

職歴 電機メーカ・米半導体メーカ・ベンチャ

現職 フリー というか無職

使用言語 C++, Gura

Gura 開発に専念中

Page 3: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 3/49

拡張モジュール

イテレータ処理

基本的な仕様

Guraとはなにか

Agenda

Guraとはなにか

Page 4: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 4/49

Guraとはなにか

プログラム中で頻繁に出てくる 繰返し処理

for (i = 0; i < 10; i++) {}

people.each do |person|end

for x in range(10):hoge

冗長な制御構文なしで処理できないか?

Page 5: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 5/49

ケーススタディ (1)

数値列 -3, -2, -1, 0, 1, 2, 3 があります。二乗した値を求めてリストにしてください

あなたの好きな言語で考えて …

x

y

Page 6: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 6/49

Gura ならこう書く (1)

x = [-3, -2, -1, 0, 1, 2, 3]y = x * x

Page 7: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 7/49

Gura ならこう書く (1)

x = [-3, -2, -1, 0, 1, 2, 3]y = x * x

要素をかけ算するイテレータ生成イテレータ

イテレータを評価してリスト生成

イテレータ イテレータ リストからイテレータ生成1

2

3評価

リスト リスト

リスト

Page 8: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 8/49

ケーススタディ (2)

テキストファイルを読み込み、行番号つきで画面に表示するプログラムをつくってください

Think it with yourfavorite language …

1: #include <std2: int main()3: {4: printf(“H5: }

Page 9: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 9/49

Gura ならこう書く (2)

printf('%d: %s',1.., readlines('hello.c'))

Page 10: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 10/49

Gura ならこう書く (2)

printf('%d: %s',1.., readlines('hello.c'))

イテレータ イテレータ

イテレータ 要素ごとに関数 printf を実行するイテレータ生成

イテレータを評価した後、破棄

1

評価2

Page 11: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 11/49

つまり Gura とは

イテレータ

イテレータイテレータ

イテレータ

イテレータイテレータ

イテレータ

評価

イテレータから新たなイテレータを生成し、演算・評価できる言語

Guraにおいて、この操作を「マッピング」と呼ぶ

Page 12: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 12/49

期待できること

繰り返し処理を簡潔に書ける

並列処理が容易になる かも

1

2

Page 13: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 13/49

並列処理のアイデア

イテレータ

イテレータイテレータ

イテレータ

イテレータイテレータ

イテレータ

評価

最終的に生成したイテレータの要素

イテレータ生成の負荷は軽い

負荷が重いのは評価の段階

処理系に要素を分配して評価 評価 評価 評価

Page 14: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 14/49

拡張モジュール

イテレータ処理

基本的な仕様

Guraとはなにか

Agenda

基本的な仕様

Page 15: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 15/49

基本的な仕様

関数

制御構文

オブジェクト指向

コレクション

スコープ管理

Page 16: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 16/49

基本的な仕様(1) 関数

x = f(a => 3, b => 4)

f(a:number, b:number) = {a * a + b * b

}

x = f(3, 4)

関数定義 (1)

呼出し例

引数の型を指定できる

名前つき引数指定

Page 17: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 17/49

基本的な仕様(1) 関数

f(3) // a=3, b=[]f(3, 1) // a=3, b=[1]f(3, 1, 4, 1) // a=3, b=[1,4,1]

f(a, b*) = {// any job

}

呼出し例

関数定義 (2) 0 個以上の値をとる可変長引数b+ なら 1 個以上の指定になる

Page 18: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 18/49

基本的な仕様(1) 関数

my_loop(n) {block} = {while (n > 0) {

block()n -= 1

}}

my_loop(3) {println('hello')

}

関数定義 (3)

呼出し例

ブロック式を関数オブジェクトで受取る{block?} ならオプショナルなブロック

Page 19: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 19/49

基本的な仕様(2) 制御構文

if (…) {

} elsif (…) {

} elsif (…) {

} else {

}

try {

} catch (…) {

} catch (…) {

}

for (…) {

}

repeat (…) {

}

while (…) {

}

繰返し処理 条件分岐 例外処理

cross (…) {

}

Page 20: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 20/49

基本的な仕様(3) オブジェクト指向

Fruit = class {__init__(name:string, price:number) = {

this.name = namethis.price = price

}Print() = {

printf('%s %d\n', this.name, this.price)}

}

fruit = Fruit('Orange', 90)fruit.Print()

クラス定義

インスタンス生成・メソッド呼出し

コンストラクタ

Page 21: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 21/49

基本的な仕様(3) オブジェクト指向

A = class {__init__(x, y) = {

// any jobs}

}

B = class(A) {__init__(x, y, z) = {|x, y|

// any jobs}

}

継承

ベースクラスコンストラクタへの引数

Page 22: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 22/49

基本的な仕様(4) コレクション

a = [3, 1, 4, 1, 5, 9]b = ['zero', 'one', 2, 3, 'four', 5]

c = %{ `a => 3, `b => 1, `c => 4 }d = %{

'いぬ' => 'dog', 'ねこ' => 'cat'}

リスト

辞書

Page 23: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 23/49

基本的な仕様(5) スコープ管理

create_counter(n:number) = {function {

n -= 1}

}

c = create_counter(4)c() // returns 3c() // returns 2c() // returns 1

クロージャ

関数内はレキシカルスコープ

Page 24: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 24/49

拡張モジュール

イテレータ処理

基本的な仕様

Guraとはなにか

Agenda

イテレータ処理

Page 25: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 25/49

イテレータ処理

暗黙的マッピング

メンバマッピング

関数繰返し制御構文

マッピング

生成

イテレータ

イテレータイテレータ

イテレータ

イテレータ

イテレータ処理: マッピングと生成

Page 26: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 26/49

Gura における リストとイテレータリスト

イテレータ

['apple', 'orange', 'grape']

('apple', 'orange', 'grape')

要素がすべてメモリ上に用意されている

要素をひとつずつ生成する

ランダムアクセスが可能

評価しないと次の要素は分からない

Page 27: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 27/49

Gura における リストとイテレータ

イテレータ

リスト 評価

生成

Page 28: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 28/49

イテレータ処理(1) 暗黙的マッピング

関数または演算子操作を行うイテレータを生成

イテレータ

イテレータ

イテレータ

イテレータ

関数or

演算子

引数 戻り値

暗黙的マッピング

Page 29: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 29/49

イテレータ処理(1) 暗黙的マッピング

f(a:number, b:number) = {a * b

}

普通の関数

f(a:number, b:number):map = {a * b

}

マッピング対応関数 アトリビュート :map をつける

Page 30: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 30/49

イテレータ処理(1) 暗黙的マッピング

f(3, 4)数値答: 12

f([2, 3, 4], [3, 4, 5])リスト答: [6, 12, 20]

f((2, 3, 4), (3, 4, 5))イテレータ答: (6, 12, 20)

f(5, (3, 4, 5))数値とイテレータ

答: (15, 20, 25)

Page 31: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 31/49

イテレータ処理(1) 暗黙的マッピング

リスト

スカラー

イテレータ

リスト

イテレータ・リスト以外

マッピング適用は引数のデータ型によって異なる

イテレータデータ型を大別

マッピング適用 3 つのルール

Page 32: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 32/49

イテレータ処理(1) 暗黙的マッピング

リスト

スカラー

イテレータ

イテレータイテレータ

引数にイテレータがあればイテレータを生成

イテレータイテレータ

イテレータイテレータ

ルール 1

Page 33: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 33/49

イテレータ処理(1) 暗黙的マッピング

リスト

引数にイテレータがなく、リストがあればリストを生成

リスト

リスト

スカラー

リスト

リスト

ルール 2

Page 34: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 34/49

イテレータ処理(1) 暗黙的マッピング

引数にスカラーのみがあればスカラーを生成

スカラー

スカラースカラー

ルール 3

Page 35: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 35/49

イテレータ処理(2) メンバマッピング

メンバマッピング

fruits[0] fruits[1] fruits[2]

name name name

Print() Print() Print()

price price price

インスタンスのリスト

メンバアクセスをするイテレータを生成する機能

Page 36: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 36/49

イテレータ処理(2) メンバマッピング

メンバマッピング

fruits[0] fruits[1] fruits[2]

name name name

Print() Print() Print()

price price price

イテレータ

メンバアクセスをするイテレータを生成する機能

fruits:*name

fruits:*price

fruits:*Print()

インスタンスのリスト

Page 37: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 37/49

イテレータ処理(2) メンバマッピング

sum = 0for (fruit in fruits) {

sum += fruit.price}println(sum)

println(fruits:*price.sum())

Fruit インスタンスのメンバ price の合計を表示する例題

解法1

解法2

繰返し構文を使う

メンバマッピングを使う

Page 38: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 38/49

イテレータ処理(3) 関数

イテレータ関数 関数がデータ列を返す場合はリストではなくイテレータで返す

rtn = readlines('hello.c')

rtn = range(10)

行ごとの文字列を返すイテレータ

0 から 9 までの数値を返すイテレータ

設計ポリシー

Page 39: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 39/49

イテレータ処理(3) 関数

イテレータ関数

rtn = readlines('hello.c'):list

rtn = range(10):list

行ごとの文字列を含むリスト

0 から 9 までの数値を含むリスト

リストリストがほしいときはアトリビュート :list をつけて呼び出し

Page 40: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 40/49

イテレータ処理(4) 繰返し制御構文

繰返し制御構文からイテレータを生成イテレータ

繰返し制御構文

生成値

繰返し処理

x = for (…):iter {

}

繰返し処理の評価値がイテレータの要素値になる

アトリビュート :iter をつける

for

repeat

while

cross

Page 41: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 41/49

イテレータ処理(4) 制御構文イテレータ

n = 0x = for (i in 0..5):iter {

n += i}

この時点では何も実行しない

println(x)

結果を表示: 0 1 3 6 10 15

制御構文イテレータの使用例

Page 42: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 42/49

イテレータ処理(4) 制御構文イテレータ

prime() = {p = []for (n in 2..):xiter {

if (!(n % p.each() == 0).or()) {p.add(n)n

}}

}

primes = prime()

素数(2, 3, 5, 7..)を返すイテレータ

素数を生成するイテレータ

Page 43: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 43/49

拡張モジュール

イテレータ処理

基本的な仕様

Guraとはなにか

Agenda

拡張モジュール

Page 44: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 44/49

拡張モジュール

設計ポリシー

Gura インタープリタ本体は OS 特有の機能やライブラリにできるだけ依存しないモジュールを import して機能拡張する

Guraインタープリタ

モジュールモジュールモジュール

モジュールモジュールモジュール

Page 45: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 45/49

おもなモジュール

GUIwxWidgets Tk SDL

グラフィック描画Cairo OpenGL FreeType

イメージデータJPEG PNG GIF BMP

ICO XPM PPM TIFF

ネットワークcURL サーバ機能

テキスト処理

正規表現yamlXMLCSV

markdown

アーカイブ・圧縮TAR ZIP GZIP BZIP

Page 46: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 46/49

モジュール間連携

Gura インタープリタ

JPEG PNG GIF BMP ICO XPM PPM TIFF

Cairo OpenGL FreeType wxWidgets Tk SDL

image

グラフィック描画ディスプレイ出力

イメージデータ読み書き

Page 47: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 47/49

こういうアプリができます「おうちで証明写真 Gura Shot」

デジカメ画像から顔を抽出して証明写真を作成結果を PDF や JPEG で出力

JPEG image Cairo image JPEG

wxWidgets

ファイル読込み 画像構成 ファイル書き込み

ディスプレイ出力

Page 48: Gura プログラミング言語の紹介

Copyright (C) 2014 ypsitau 48/49

ありがとうございました

www.gura-lang.org