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.

Pythonを含む多くのプログラミング言語を扱う処理フレームワークとパターン、鷲崎弘宜、PyConJP 2016 招待講演

3,520 views

Published on

鷲崎弘宜、"Pythonを含む多くのプログラミング言語を扱う処理フレームワークとパターン"、PyCon JP 2016、招待講演、2016年9月21日、早稲田大学

Published in: Software
  • Be the first to comment

Pythonを含む多くのプログラミング言語を扱う処理フレームワークとパターン、鷲崎弘宜、PyConJP 2016 招待講演

  1. 1. Pythonを含む多くのプログラミング言語を 2016年9月21日 PyCon JP 2016 招待講演 Pythonを含む多くのプログラミング言語を 扱う処理フレームワークとパターン扱う処理フレームワークとパターン 鷲崎 弘宜 わしざき ひろのり 鷲崎 弘宜 早稲田大学グローバルソフトウェアエンジニアリング研究所長・教授 国立情報学研究所 客員教授、株式会社 システム情報 社外取締役 ISO/IEC/JTC1/SC7/WG20 Convenor, SEMAT Japan Chapter ChairISO/IEC/JTC1/SC7/WG20 Convenor, SEMAT Japan Chapter Chair IEEE CS Japan Chapter Secretary http://www.washi.cs.waseda.ac.jp/ 研究遂行・資料協力: 坂本一憲、李 菊花ほか研究遂行・資料協力: 坂本一憲、李 菊花ほか
  2. 2. 目次目次 • エンジニアリングと再利用 • 多言語時代のコード処理フレームワーク• 多言語時代のコード処理フレームワーク • フレームワークからデザインパターンへ• フレームワークからデザインパターンへ • まとめ• まとめ 2
  3. 3. 正統なエンジニアリングとは 職業人が果たす判断,職業人が果たす判断, 行為,助言が,社会で 実質的な価値を形成実質的な価値を形成 コミュニティで妥当と確コミュニティで妥当と確 認される知識が科学的 基盤に基づく 知識・適格性の妥当 性をコミュニティで性をコミュニティで 判定できる環境 3 松本吉弘, “エンジニアリング基礎知識体系とISO標準”, ITSCJ Newsletter, No.88, 2010. Paul Star, “The Social Transformation of American Medicine,” Basic Books, 1982.
  4. 4. 知識の島々知識の島々 知識 プロフェッショナリズム知識 プロフェッショナリズム ベストプラクティ 体系上のパ ベストプラクティ スに裏打ちさ れた能力 ターンや手法 れた能力 知識の体系 経験、ガイド 知識の島々 カバレッジ UML 経験、ガイドカバレッジ UML Java, C#, Python アジャイル 参考 I. Jacobson, et al.: Tutorial: Essence - Kernel and Language for Software Engineering Practices, ICSE'13 4
  5. 5. Guide to the Software Engineering Body of Knowledge (SWEBOK) http://www.swebok.org/ http://swebokwiki.org/ 要求 構築設計 テスティング 保守 設計原則 (SWEBOK) http://www.swebok.org/ http://swebokwiki.org/ 要求 構築設計 テスティング 保守 要求の基礎 要求プロセス 設計の基礎 設計の主要問題 構築の基礎 構築の管理 テストの基礎 テストレベル 保守の基礎 保守の主要問題要求プロセス 要求抽出 要求分析 要求仕様 要求妥当性確認 設計の主要問題 構造とアーキテクチャ ユーザインタフェース設計 設計品質の分析評価 設計の表記 構築の管理 実践上の考慮事項 構築技法 構築ツール テストレベル テスト技法 テスト関連計量尺度 テストプロセス テストツール 保守の主要問題 保守プロセス 保守技法 保守ツール 要求妥当性確認 実践上の考慮事項 設計の表記 設計戦略・手法 設計ツール テストツール デザインパターン フレームワークフレームワーク 再利用 マネジメント プロセス構成管理 モデル・手法 品質 SCMプロセスのマネ 開始と範囲定義 プロセス定義 モデリング 品質の基礎SCMプロセスのマネ ジメント 構成の識別 構成制御 構成状態記録・報告 開始と範囲定義 プロジェクト計画 プロジェクト実施 レビュー・評価 終結 プロセス定義 ライフサイクル プロセス 査定・改善 計量 モデリング モデル種別 モデルの分析 開発手法 品質の基礎 品質マネジメントプ ロセス 実践上の考慮事項 品質ツール構成状態記録・報告 構成監査 リリース管理・配布 構成管理ツール 終結 計量 マネジメントツール 計量 プロセスツール 品質ツール 5経済 プロフェッショナル 実践 計算基礎 数学基礎 エンジニアリング 基礎
  6. 6. 再利用の技術と期待 • 60%再利用すれば生産性2-10倍、信頼性2-3倍 [Marciniak94] – 潜在的に再利用可能な部分は15-85% [McClure92] サブシステムサブシステム クラス メソッド* * * * – 15-85% [McClure92] – 国内企業の再利用への取り組み 40% [@IT02] サブシステムサブシステム /パッケージ クラス (ファイル) 属性 メソッド (関数)/属性 システムシステムドメイン * * * * 全体 部分全体 部分 抽象的 (汎用) 設計原則(根本指針) たいてい アーキテクチャアーキテクチャ (汎用) 設計原則(根本指針) たいてい 使える パターン アーキテクチャ パターン デザインパターン 使えるかも使えるかも フレームワーク(半完成の実装) あてはまれ 使えるかも 特定の場合に 使えるかも プロダクトラインプロダクトライン 6クラス・関数ライブラリ 具体的 (特化) あてはまれ ば使える 特定の場合に 限り使える
  7. 7. 目次目次 • エンジニアリングと再利用 • 多言語時代のコード処理フレームワーク• 多言語時代のコード処理フレームワーク • フレームワークからデザインパターンへ• フレームワークからデザインパターンへ • まとめ• まとめ 7
  8. 8. 多プログラミング言語時代多プログラミング言語時代 • 環境や要求の多様化に伴い言語数増大• 環境や要求の多様化に伴い言語数増大 – TIOBE Index上位15言語シェア: 86%(‘12) 70%(‘15) – 開発者によっては1プロジェクト4言語以上– 開発者によっては1プロジェクト4言語以上 [Karus11] • 多言語時代のツールフレームワーク 1. テストカバレッジ測定フレームワーク Open Code1. テストカバレッジ測定フレームワーク Open Code Coverage Framework (OCCF) [Sakamoto11] 2. 汎用コード処理フレームワーク UNIfied Source COde2. 汎用コード処理フレームワーク UNIfied Source COde ENgineering framework (UNICOEN) [坂本13] TIOBE Index http://www.tiobe.com/ [Karus11] S. Karus, et al., A study of language usage evolution in open source software, MSR,2011 [Sakamoto11] Kazunori Sakamoto, Fuyuki Ishikawa, Hironori Washizaki, and Yoshiaki Fukazawa, “Open Code Coverage Framework: A Framework for Consistent, Flexible and Complete Measurement of Test Coverage Supporting Multiple 8 Framework: A Framework for Consistent, Flexible and Complete Measurement of Test Coverage Supporting Multiple Programming Languages,” IEICE Transactions on Information and Systems, Vol.E94-D, No.12, pp.2418-2430, 2011. [坂本13] 坂本 一憲, 大橋 昭, 太田 大地, 鷲崎 弘宜, 深澤 良彰, “UNICOEN: 複数プログラミング言語対応のソースコー ド処理フレームワーク”, 情報処理学会論文誌, Vol.54(No.2), pp.945-960, 2013
  9. 9. 1. 問題と解決:コストと統一性 フレームワークによる支援 1. • 開発と保守コストが大きい – 新言語への対応が困難 フレームワークによる支援 共通処理の再利用 – 新言語への対応が困難 • カバレッジの種類がばらばら カバレッジ種類数の統一 柔軟な機能拡張• カバレッジの種類がばらばら – 複数言語での開発が困難 柔軟な機能拡張 コード埋め込みによる測定 実装の簡略化対応するカバレッジ 種類の差異 カバレッジ種類 数の統一 実装の簡略化 (Cobertura) (Statement 共通処理 Java Python 機能追加 Java (Cobertura) (COVTOOL) Python (Statement Coverage) 共通処理 Java C Python 9 (Cobertura) C (COVTOOL) Python (Statement Coverage) OCCF (COVTOOL) [Sakamoto11] Kazunori Sakamoto, Fuyuki Ishikawa, Hironori Washizaki, and Yoshiaki Fukazawa, “Open Code Coverage Framework: A Framework for Consistent, Flexible and Complete Measurement of Test Coverage Supporting Multiple Programming Languages,” IEICE Transactions on Information and Systems, Vol.E94-D, No.12, pp.2418-2430, 2011.
  10. 10. 1. OCCFの構成 テストカバレッジ :外部プログラム(ライブラリなど) :言語固有処理(.NETかスクリプト言語) カバレッジ テストカバレッジ 測定用コード :外部プログラム(ライブラリなど) :フレームワーク(.NET言語で実装) カバレッジ データソースコード ソースコード コ ー ド 埋 実 行 部 カ バ レ ッ ジ~~~~ ~~~~ ~~~~ 0101 0001 埋 め 込 み 実 行 部 ( 処 理 系 カ バ レ ッ ジ 表 示 部 ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ ~~~~ 測定結果 0001 1110 1010 み 部 処 理 系 ) 表 示 部 測定結果 AST AST AST ソースコードソースコード コ ー ド ソースコード ~~~~ ~~~~ ~~~~ ~~~~ ソースコード ~~~~ ~~~~ ~~~~ AST 生 成 部 AST 整 形 部 AST 操 作 部 コ ー ド 生 成 部 10 ~~~~ ~~~~ 生 成 部 整 形 部 操 作 部 生 成 部 10 [Sakamoto11] Kazunori Sakamoto, Fuyuki Ishikawa, Hironori Washizaki, and Yoshiaki Fukazawa, “Open Code Coverage Framework: A Framework for Consistent, Flexible and Complete Measurement of Test Coverage Supporting Multiple Programming Languages,” IEICE Transactions on Information and Systems, Vol.E94-D, No.12, pp.2418-2430, 2011.
  11. 11. 1. カバレッジ測定用コードの埋め込み1. カバレッジ測定用コードの埋め込み int func(int a) { int func(int a) {int func(int a) { if (a == 0) { printf("a == 0"); } int func(int a) { if (a == 0) { stmt_cov(0); printf("a == 0");} else { printf("a != 0"); printf("a == 0"); } else {printf("a != 0"); } } else { stmt_cov(1); printf("a != 0"); }} }Function int func(int a) • 自動的に挿入 Statement Statement • 副作用なし • カバレッジ情報 をファイルに出力 printf("a == 0") printf("a != 0") Statement stmt_cov(0) stmt_cov(1) Statement Statement Statement をファイルに出力 11 stmt_cov(0) stmt_cov(1) [Sakamoto11] Kazunori Sakamoto, Fuyuki Ishikawa, Hironori Washizaki, and Yoshiaki Fukazawa, “Open Code Coverage Framework: A Framework for Consistent, Flexible and Complete Measurement of Test Coverage Supporting Multiple Programming Languages,” IEICE Transactions on Information and Systems, Vol.E94-D, No.12, pp.2418-2430, 2011.
  12. 12. 2. UNICOEN: 汎用の多言語対応処理FW (Java, JavaScript, C#, C, Python, Ruby, VB)(Java, JavaScript, C#, C, Python, Ruby, VB) 言語変換 コード補完 特化API バグ検出 品質測定 ツール開発者向け汎用API バグ検出 品質測定 対応言語拡張者向けAPI ツール開発者向け汎用API 対応言語拡張者向けAPI C Java RubyC Java Ruby コンパイラコ ンパイラ利用 オ ブ ジ ェ ク ト 2000~3000行 12ソースコード C If文 統合コード モデル 構 文 解 析 部 オ ブ ジ ェ ク ト 生 成 部 C 条件式 True処理 False処理 モデル 構 文 解 析 部 オ ブ ジ ェ ク ト 生 成 部
  13. 13. 2. 統合コードモデル(メタモデル)2. 統合コードモデル(メタモデル) if (a == 0) Java 統合コードモデルif (a == 0) puts(“a == 0“); Java If文 統合コードモデル puts(“a == 0“); else puts(“a != 0“); 条件式 True Falseputs(“a != 0“); Ruby 条件式 True False class IfStatement { Expression Condition; if a == 0 puts “a == 0“ Ruby Expression Condition; Block TrueProcess; Block FalseProcess; puts “a == 0“ else } Block FalseProcess; }puts “a != 0“ end 13 end [坂本13] 坂本 一憲, 大橋 昭, 太田 大地, 鷲崎 弘宜, 深澤 良彰, “UNICOEN: 複数プログラミング言語対応のソースコー ド処理フレームワーク”, 情報処理学会論文誌, Vol.54(No.2), pp.945-960, 2013
  14. 14. 2. 例: 1分で複雑度測定ツール 14[坂本13] 坂本 一憲, 大橋 昭, 太田 大地, 鷲崎 弘宜, 深澤 良彰, “UNICOEN: 複数プログラミング言語対応のソースコー ド処理フレームワーク”, 情報処理学会論文誌, Vol.54(No.2), pp.945-960, 2013
  15. 15. 2. 例: 翻訳による言語学習2. 例: 翻訳による言語学習 (Translation-based Lang. Learning) 15 Juhua Li, Kazunori Sakamoto, Hironori Washizaki, Yoshiaki Fukazawa, “Promotion of Educational Effectiveness by Translation-based Programming Language Learning Using Java and Swift,” 50th Annual Hawaii International Conference on System Sciences (HICSS- 50), Waikoloa, Hawaii, Jan 4-7, 2017.
  16. 16. 目次目次 • エンジニアリングと再利用 • 多言語時代のコード処理フレームワーク• 多言語時代のコード処理フレームワーク • フレームワークからデザインパターンへ• フレームワークからデザインパターンへ • まとめ• まとめ 16
  17. 17. フレームワークとデザインパターン 17 フレームワークとデザインパターン • 再利用、拡張実現の定石がデザインパターン – ホットスポット&コールドスポット– ホットスポット&コールドスポット – 制御の逆転、ハリウッドの原則 (Don’t Call us) – パターンを理解することでフレームワークの理解促進– パターンを理解することでフレームワークの理解促進 • デザインパターン: 設計の特定状況下で頻出の問題&解決 – 変更や再利用のための設計– 変更や再利用のための設計 – 共通言語、共通指針 – Gang of Four(GoF) デザインパターン [GoF00]– Gang of Four(GoF) デザインパターン [GoF00] ユーザソフトウェア フレームワーク ライブラリ ユーザソフトウェア [GOF00] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides(著), 本位田真一, 吉田和樹 (監訳), “オブジェクト 指向における再利用のためのデザインパターン改訂版", ソフトバンクパブリッシング, 2000.
  18. 18. OCCFにおける命令網羅のPython用実装OCCFにおける命令網羅のPython用実装 public class フレームワーク AtomicStatementSelectorForPython : AtomicStatementSelector {{ protected override bool IsStatementElement(XElement e) {{ return e.Name.LocalName == "simple_stmt"; }} protected override bool IsStatementSepartor(XElement e) { return e.Name.LocalName == "SEMI";== "SEMI"; } } Pythonの実装例 18 言語固有の処理Pythonの実装例 Kazunori Sakamoto, Hironori Washizaki, Yoshiaki Fukazawa, “Reporting the Implementation of a Framework for Measuring Test Coverage based on Design Patterns”, Proc. 3rd International Workshop on Software Patterns and Quality (SPAQu’09)
  19. 19. Template Methodパターン [GoF00]より 19 Template Methodパターン [GoF00] • 問題: アルゴリズムの構造を変えずに、場合によっ て処理内容を変更したい • :• 解決:以下の構成・協調動作として設計 テンプレートメソッド TemplateMethod(){ ホットスポットTemplateMethod(){ ・・・ PrimitiveOperation1() ・・・ ホットスポット フックメソッドを定義・・・ PrimitiveOperation2() } フックメソッドを定義 フックメソッドの実装は、 サブクラスで実施
  20. 20. Command + Composite = Macroパターン if( a == b ) { ... }if( a == b ) { ... } 20Kazunori Sakamoto, Hironori Washizaki, Yoshiaki Fukazawa, “Reporting the Implementation of a Framework for Measuring Test Coverage based on Design Patterns”, Proc. 3rd International Workshop on Software Patterns and Quality (SPAQu’09)
  21. 21. 21何を実現しているでしょう?[Joshua05]改変 interface MessageStrategy { public class Main {interface MessageStrategy { public class Main { public void sendMessage(); public static void main(String[] args) { } MessageBody mb = new MessageBody(); abstract class AbstractStrategyFactory { mb.configure(“Hello World!”); public abstract MessageStrategy AbstractStrategyFactory asf =public abstract MessageStrategy AbstractStrategyFactory asf = createStrategy(MessageBody mb); DefaultFactory.getInstance(); } MessageStrategy strategy class MessageBody { = asf.createStrategy(mb); object payload; mb.send(strategy); public Object getPayload() { } object payload; mb.send(strategy); public Object getPayload() { } return payload; } } public void configure(Object obj) { payload obj; } payload obj; } public void send(MessageStrategy ms) { ms.sendMessage(); } } class DefaultFactory extends AbstractStrategyFactory { } class DefaultFactory extends AbstractStrategyFactory { private DefaultFactory() {} static DefaultFactory instance; public static AbstractStrategyFactory getInstance() { if(instance == null) instance = new DefaultFactory();if(instance == null) instance = new DefaultFactory(); return instance; } public MessageStrategy createStrategy(final MessageBody mb) { return new MessageStrategy() { MessageBody body = mb;MessageBody body = mb; public void sendMessage() { Object obj = body.getPayload(); System.out.println(obj); } }; } } [Joshua05] Joshua Kerievsky著,小黒直樹 他訳: パターン指向リファクタリ ング入門~ソフトウエア設計を改善する27の作法, 日経BP社, 2005.
  22. 22. 22デザインパターンの落とし穴 • 「解決を知っておけばよい」• 「解決を知っておけばよい」 – 解決はパターンの一部にすぎない。 「問題」の本質 を捉えよう– • 「とにかく使えばOK」 を捉えよう 品質との関係を• 「とにかく使えばOK」 – 複雑なパターンは欠陥率 増大 [Vokac] – 知識不足で作業時間 増大 [Prechelt] 品質との関係を 抑えよう – 知識不足で作業時間 増大 [Prechelt] • 「そのまま使わなければならない」 設計原則を抑え る(例: 開放閉鎖、置換)• 「そのまま使わなければならない」 – 書かれた構造は一例に過ぎない。 リファクタリング る(例: 開放閉鎖、置換) [鷲崎07] • 「最初から使わなければならない」 – リファクタリング していこう [Kerievsky] – 未来は誰にもわからない していこう [Kerievsky] Marek Vokac, Defect Frequency and Design Patterns: An Empirical Study of Industrial Code, TSE 30(12), 2004 Lutz Prechelt, et al. Two Controlled Experiments Assessing the Usefulness of Design Pattern Documentation inLutz Prechelt, et al. Two Controlled Experiments Assessing the Usefulness of Design Pattern Documentation in Program Maintenancem, TSE 28(6), 2002 鷲崎、丸山、山本、久保: ソフトウェアパターン- パターン指向の実践ソフトウェア開発. 近代科学社, 2007. Joshua Kerievsky著: パターン指向リファクタリング入門~ソフトウエア設計を改善する27の作法, 日経BP社, 2005.
  23. 23. PythonとデザインパターンPythonとデザインパターン • GoF デザインパターンのPython実装+α• GoF デザインパターンのPython実装+α – doloopwhile, “Pythonによるデザインパターン http://doloopwhile.hatenablog.com/entry/20110207/12http://doloopwhile.hatenablog.com/entry/20110207/12 97068455 – Bruce Eckel, “Python 3 Patterns, Recipes and Idioms” http://www.mindviewinc.com/Books/Python3Patterns/http://www.mindviewinc.com/Books/Python3Patterns/ – Gennadiy Zlobin, “Learning Python Design Patterns” • 言語特性に留意• 言語特性に留意 – ダックタイピング、メタプログラミング・・・– ダックタイピング、メタプログラミング・・・ – よりシンプルな記述、不要な可能性、新パターン(例: Borg)Borg) 23
  24. 24. 目次目次 • エンジニアリングと再利用 • 多言語時代のコード処理フレームワーク• 多言語時代のコード処理フレームワーク • フレームワークからデザインパターンへ• フレームワークからデザインパターンへ • まとめ• まとめ 24
  25. 25. 再掲: SWEBOK V3 (2014): 15の知識領域 設計原則 要求 構築設計 テスティング 保守 設計原則 要求 構築設計 テスティング 保守 要求の基礎 要求プロセス 要求抽出 設計の基礎 設計の主要問題 構造とアーキテクチャ 構築の基礎 構築の管理 実践上の考慮事項 テストの基礎 テストレベル テスト技法 保守の基礎 保守の主要問題 保守プロセス要求抽出 要求分析 要求仕様 要求妥当性確認 実践上の考慮事項 構造とアーキテクチャ ユーザインタフェース設計 設計品質の分析評価 設計の表記 設計戦略・手法 実践上の考慮事項 構築技法 構築ツール テスト技法 テスト関連計量尺度 テストプロセス テストツール 保守プロセス 保守技法 保守ツール デザインパターン実践上の考慮事項 設計戦略・手法 設計ツール デザインパターン フレームワークフレームワーク 再利用 マネジメント プロセス構成管理 モデル・手法 品質 SCMプロセスのマネ 開始と範囲定義 プロセス定義 モデリング 品質の基礎SCMプロセスのマネ ジメント 構成の識別 構成制御 構成状態記録・報告 開始と範囲定義 プロジェクト計画 プロジェクト実施 レビュー・評価 終結 プロセス定義 ライフサイクル プロセス 査定・改善 計量 モデリング モデル種別 モデルの分析 開発手法 品質の基礎 品質マネジメントプ ロセス 実践上の考慮事項 品質ツール構成状態記録・報告 構成監査 リリース管理・配布 構成管理ツール 終結 計量 マネジメントツール 計量 プロセスツール 品質ツール 25経済 プロフェッショナル 実践 計算基礎 数学基礎 エンジニアリング 基礎
  26. 26. まとめ&告知 • 正当なエンジニアリングであるために – SWEBOK&プロフェッショナリズム– SWEBOK&プロフェッショナリズム • 多言語時代のフレームワーク – テストカバレッジ測定、汎用のコード処理– テストカバレッジ測定、汎用のコード処理 – 抽象構文木の操作、統一メタモデル • デザインパターン: フレームワークの設計を起源• デザインパターン: フレームワークの設計を起源 – 共通性と可変性、「落とし穴」に注意!– 10th IEEE International Conference on Software Testing, Verification and Validation IPSJ International AI Programming Contest Mar 13-18 (due Sep 2016) 26 samuraicoding.infoMar 13-18 (due Sep 2016) aster.or.jp/conference/icst2017/

×