Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

3,882 views

Published on

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

Published in: Software

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

  1. 1. Guraプログラミング言語の紹介 www.gura-lang.org Copyright © 2014 ypsitau@nifty.com LL Diver on Aug 23, 2014
  2. 2. 自己紹介 名前斉藤 寛 (ゆたか) 開発経験組込ファームウェア から GUI まで 使用言語C++, Gura 職歴電機メーカ・米半導体メーカ・ベンチャ 現職フリー というか無職 Gura 開発に専念中 Copyright (C) 2014 ypsitau 2/49
  3. 3. Agenda Guraとはなにか 基本的な仕様 イテレータ処理 拡張モジュール Copyright (C) 2014 ypsitau 3/49
  4. 4. Guraとはなにか プログラム中で頻繁に出てくる 繰返し処理 for (i = 0; i < 10; i++) { } for x in range(10): people.each do |person| end hoge 冗長な制御構文なしで処理できないか? Copyright (C) 2014 ypsitau 4/49
  5. 5. ケーススタディ (1) 数値列 -3, -2, -1, 0, 1, 2, 3 があります。 二乗した値を求めてリストにしてください あなたの好きな 言語で考えて … Copyright (C) 2014 ypsitau 5/49 x y
  6. 6. Gura ならこう書く (1) x = [-3, -2, -1, 0, 1, 2, 3] y = x * x Copyright (C) 2014 ypsitau 6/49
  7. 7. Gura ならこう書く (1) x = [-3, -2, -1, 0, 1, 2, 3] y = x * x イテレータイテレータ1 リストからイテレータ生成 イテレータ要素をかけ算するイテレータ生成 イテレータを評価してリスト生成 2 評価3 Copyright (C) 2014 ypsitau 7/49 リストリスト リスト
  8. 8. ケーススタディ (2) テキストファイルを読み込み、行番号つきで 画面に表示するプログラムをつくってください Think it with your favorite language … 1: #include <std 2: int main() 3: { 4: printf(“H 5: } Copyright (C) 2014 ypsitau 8/49
  9. 9. Gura ならこう書く (2) printf('%d: %s', 1.., readlines('hello.c')) Copyright (C) 2014 ypsitau 9/49
  10. 10. Gura ならこう書く (2) printf('%d: %s', 1.., readlines('hello.c')) イテレータイテレータ イテレータ要素ごとに関数 printf を 実行するイテレータ生成 イテレータを評価した後、破棄 1 Copyright (C) 2014 ypsitau 10/49 評価 2
  11. 11. つまり Gura とは イテレータから新たなイテレータを生成し、 イテレータ Copyright (C) 2014 ypsitau 11/49 イテレータ イテレータ イテレータ イテレータ イテレータ イテレータ 評価 演算・評価できる言語 Guraにおいて、この操作を「マッピング」と呼ぶ
  12. 12. 期待できること 繰り返し処理を簡潔に書ける 並列処理が容易になる かも Copyright (C) 2014 ypsitau 12/49 1 2
  13. 13. 並列処理のアイデア イテレータ生成の 負荷は軽い イテレータ 負荷が重いのは 評価の段階 Copyright (C) 2014 ypsitau 13/49 イテレータ イテレータ イテレータ イテレータ イテレータ イテレータ 評価 最終的に生成したイテレータの要素 処理系に要素を 分配して評価評価評価評価
  14. 14. Agenda Guraとはなにか 基本的な仕様 イテレータ処理 拡張モジュール Copyright (C) 2014 ypsitau 14/49
  15. 15. 基本的な仕様 関数 制御構文 オブジェクト指向 コレクション スコープ管理 Copyright (C) 2014 ypsitau 15/49
  16. 16. 基本的な仕様(1) 関数 関数定義 (1) f(a:number, b:number) = { a * a + b * b 呼出し例 x = f(a => 3, b => 4) Copyright (C) 2014 ypsitau 16/49 } x = f(3, 4) 引数の型を指定できる 名前つき引数指定
  17. 17. 基本的な仕様(1) 関数 関数定義 (2) 0 個以上の値をとる可変長引数 f(3) // a=3, b=[] f(3, 1) // a=3, b=[1] f(3, 1, 4, 1) // a=3, b=[1,4,1] Copyright (C) 2014 ypsitau 17/49 f(a, b*) = { // any job } 呼出し例 b+ なら 1 個以上の指定になる
  18. 18. 基本的な仕様(1) 関数 関数定義 (3) my_loop(n) {block} = { while (n > 0) { Copyright (C) 2014 ypsitau 18/49 block() n -= 1 } } 呼出し例 my_loop(3) { println('hello') } ブロック式を関数オブジェクトで受取る {block?} ならオプショナルなブロック
  19. 19. 基本的な仕様(2) 制御構文 繰返し処理条件分岐例外処理 if (…) { } elsif (…) { } elsif (…) { } else { } try { } catch (…) { } catch (…) { } Copyright (C) 2014 ypsitau 19/49 for (…) { } repeat (…) { } while (…) { } cross (…) { }
  20. 20. 基本的な仕様(3) オブジェクト指向 コンストラクタ インスタンス生成・メソッド呼出し Copyright (C) 2014 ypsitau 20/49 クラス定義 Fruit = class { __init__(name:string, price:number) = { this.name = name this.price = price } Print() = { printf('%s %dn', this.name, this.price) } } fruit = Fruit('Orange', 90) fruit.Print()
  21. 21. 基本的な仕様(3) オブジェクト指向 Copyright (C) 2014 ypsitau 21/49 継承 A = class { __init__(x, y) = { // any jobs } } B = class(A) { __init__(x, y, z) = {|x, y| // any jobs } } ベースクラス コンストラクタへの引数
  22. 22. 基本的な仕様(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' Copyright (C) 2014 ypsitau 22/49 }
  23. 23. 基本的な仕様(5) スコープ管理 クロージャ create_counter(n:number) = { Copyright (C) 2014 ypsitau 23/49 function { n -= 1 } } c = create_counter(4) c() // returns 3 c() // returns 2 c() // returns 1 関数内はレキシカルスコープ
  24. 24. Agenda Guraとはなにか 基本的な仕様 イテレータ処理 拡張モジュール Copyright (C) 2014 ypsitau 24/49
  25. 25. イテレータ処理 イテレータ処理: マッピングと生成 暗黙的マッピング メンバマッピング 関数 繰返し制御構文 イテレータ イテレータイテレータ イテレータ Copyright (C) 2014 ypsitau 25/49 マッピング 生成 イテレータ
  26. 26. Gura における リストとイテレータ 要素がすべてメモリ上に用意されている ['apple', 'orange', 'grape'] ランダムアクセスが可能 要素をひとつずつ生成する Copyright (C) 2014 ypsitau 26/49 リスト イテレータ ('apple', 'orange', 'grape') 評価しないと次の要素は分からない
  27. 27. Gura における リストとイテレータ イテレータ リスト評価 Copyright (C) 2014 ypsitau 27/49 生成
  28. 28. イテレータ処理(1) 暗黙的マッピング 関数または演算子操作を行うイテレータを生成 引数戻り値 Copyright (C) 2014 ypsitau 28/49 イテレータ イテレータ イテレータ イテレータ 関数 or 演算子 暗黙的マッピング
  29. 29. イテレータ処理(1) 暗黙的マッピング 普通の関数 f(a:number, b:number) = { マッピング対応関数アトリビュート :map をつける Copyright (C) 2014 ypsitau 29/49 a * b } f(a:number, b:number):map = { a * b }
  30. 30. イテレータ処理(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) Copyright (C) 2014 ypsitau 30/49
  31. 31. イテレータ処理(1) 暗黙的マッピング マッピング適用は引数のデータ型によって異なる イテレータ リスト スカラー イテレータ リスト イテレータ・リスト以外 Copyright (C) 2014 ypsitau 31/49 データ型 を大別 マッピング適用 3 つのルール
  32. 32. イテレータ処理(1) 暗黙的マッピング 引数にイテレータがあればイテレータを生成 Copyright (C) 2014 ypsitau 32/49 イテレータ イテレータ リスト スカラー イテレータ イテレータ イテレータ イテレータ イテレータ ルール 1
  33. 33. イテレータ処理(1) 暗黙的マッピング 引数にイテレータがなく、 Copyright (C) 2014 ypsitau 33/49 リスト リストがあればリストを生成 リスト リスト スカラー リスト リスト ルール 2
  34. 34. イテレータ処理(1) 暗黙的マッピング 引数にスカラーのみがあればスカラーを生成 Copyright (C) 2014 ypsitau 34/49 スカラー スカラー スカラー ルール 3
  35. 35. イテレータ処理(2) メンバマッピング メンバアクセスをするイテレータを生成する機能 price price price Copyright (C) 2014 ypsitau 35/49 メンバマッピング fruits[0] fruits[1] fruits[2] name name name Print() Print() Print() インスタンスのリスト
  36. 36. イテレータ処理(2) メンバマッピング メンバアクセスをするイテレータを生成する機能 price price price Copyright (C) 2014 ypsitau 36/49 メンバマッピング fruits[0] fruits[1] fruits[2] name name name Print() Print() Print() イテレータ fruits:*name fruits:*price fruits:*Print() インスタンスのリスト
  37. 37. イテレータ処理(2) メンバマッピング 例題Fruit インスタンスのメンバ price の合計を表示する 解法1 繰返し構文を使う sum = 0 for (fruit in fruits) { sum += fruit.price メンバマッピングを使う Copyright (C) 2014 ypsitau 37/49 } println(sum) 解法2 println(fruits:*price.sum())
  38. 38. イテレータ処理(3) 関数 設計ポリシー 関数イテレータ関数がデータ列を返す場合は リストではなくイテレータで返す rtn = readlines('hello.c') 行ごとの文字列を返すイテレータ Copyright (C) 2014 ypsitau 38/49 rtn = range(10) 0 から 9 までの数値を返すイテレータ
  39. 39. イテレータ処理(3) 関数 リスト リストがほしいときは アトリビュート :list を つけて呼び出し 行ごとの文字列を含むリスト Copyright (C) 2014 ypsitau 39/49 関数イテレータ rtn = readlines('hello.c'):list rtn = range(10):list 0 から 9 までの数値を含むリスト
  40. 40. イテレータ処理(4) 繰返し制御構文 繰返し制御構文から イテレータイテレータを生成 x = for (…):iter { アトリビュート :iter をつける Copyright (C) 2014 ypsitau 40/49 繰返し制御構文 生成値 繰返し処理 } 繰返し処理の評価値が イテレータの要素値になる for repeat while cross
  41. 41. イテレータ処理(4) 制御構文イテレータ 制御構文イテレータの使用例 n = 0 x = for (i in 0..5):iter { Copyright (C) 2014 ypsitau 41/49 n += i } この時点では何も実行しない println(x) 結果を表示: 0 1 3 6 10 15
  42. 42. イテレータ処理(4) 制御構文イテレータ 素数を生成するイテレータ Copyright (C) 2014 ypsitau 42/49 prime() = { p = [] for (n in 2..):xiter { if (!(n % p.each() == 0).or()) { p.add(n) n } } } primes = prime() 素数(2, 3, 5, 7..)を返すイテレータ
  43. 43. Agenda Guraとはなにか 基本的な仕様 イテレータ処理 拡張モジュール Copyright (C) 2014 ypsitau 43/49
  44. 44. 拡張モジュール 設計ポリシー Gura インタープリタ本体は OS 特有の機能や ライブラリにできるだけ依存しない モジュールを import して機能拡張する モジュール モジュールモジュール Guraインタープリタ モジュールモジュールモジュール Copyright (C) 2014 ypsitau 44/49
  45. 45. おもなモジュール テキスト処理 CSV XML yaml 正規表現 markdown アーカイブ・圧縮 TAR ZIP GZIP BZIP Copyright (C) 2014 ypsitau 45/49 GUI wxWidgets Tk SDL グラフィック描画 Cairo OpenGL FreeType イメージデータ JPEG PNG GIF BMP ICO XPM PPM TIFF ネットワーク cURL サーバ機能
  46. 46. モジュール間連携 JPEG PNG GIF BMP ICO XPM PPM TIFF イメージデータ読み書き image ディスプレイ出力 Copyright (C) 2014 ypsitau 46/49 Gura インタープリタ グラフィック描画 Cairo OpenGL FreeType wxWidgets Tk SDL
  47. 47. こういうアプリができます 「おうちで証明写真 Gura Shot」 デジカメ画像から顔を抽出して 証明写真を作成 結果を PDF や JPEG で出力 ファイル読込み画像構成ファイル書き込み JPEG image Cairo image JPEG ディスプレイ出力 wxWidgets Copyright (C) 2014 ypsitau 47/49
  48. 48. ありがとうございました www.gura-lang.org Copyright (C) 2014 ypsitau 48/49

×