C++ むかしばなし episthmh わんくま同盟 Microsoft MVP for

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

Item 1:View C++ as a federation of languages. C++ はただの ”C のクラスがあるバージョン ” ではない → 例外安全 (29 項 ) 、テンプレート (41 項 ) 、オーバーロード等の導入によりデザインや目指すコードが 変化している プログラミング言語はあくまで言語.
知能情報工学演習 I 第 12 回( C 言語第6 回) 課題の回答 岩村雅一
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
わんくま同盟 東京勉強会 #10 オブジェクト指向 #1 Windows メッセージを使いこな す -Windows 流オブジェクト指向 - とっちゃん 高萩 俊行 Microsoft MVP for Windows SDK 2005/ /09.
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
初年次セミナー 第8回 データの入力.
コンパイラ 2011年11月14日
自社製ミドルウエアをDalvikと連携させることが可能になる
プログラミング基礎I(再) 山元進.
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
第2章 数値の入力と変数 scanfと変数をやります.
アルゴリズムとデータ構造1 2007年6月12日
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
構造体.
MSBuild 色々出来るよ 2011/04/02 お だ.
マスタリング バベル Boost.勉強会 #2 ( ).
プログラミング言語論 第10回 オブジェクト指向 情報工学科 篠埜 功.
社会人学習講座 「Javaプログラミング概論」
発表者 2011/01/08 楽しい256バイトイントロの 世界 発表者 2011/01/08.
C#とC++とオブジェクト指向 上甲 健史.
アルゴリズムとデータ構造 2011年6月20日
補足説明.
第7回 条件による繰り返し.
コンパイラの解析 (2) GCJのデータ構造 - 1.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
ソフトウェア工学 知能情報学部 新田直也.
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
R流・C#マルチスレッドの復讐 2009年05月16日 R・田中一郎
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
WinUnit お気楽お手軽 UnitTest
WinUnit お気楽お手軽 UnitTest
TDDとメソッドの外部設計 テストファーストの秘訣 2009/08 biac.
第7回 条件による繰り返し.
プログラミング言語論 第12回 オブジェクト指向 情報工学科 篠埜 功.
プログラミング言語論 第13回 オブジェクト指向 情報工学科 篠埜 功.
ゲームプログラミング講習  第3章 ゲーム作成 ブロック崩しを作ります ゲームプログラミング講習 第3章 ゲーム作成.
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
Java8について 2014/03/07.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
関数への道.
C++/CLI カクテル・レシピ episthmh (゚Д゚)ウマー Microsoft MVP, Visual C++
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
TDD ってどんな感じ? FizzBuzz を作ってみる 2010/01/22 biac 1.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
Boostのスマートなポインタを使ってみる
サブゼミ第7回 実装編① オブジェクト型とキャスト.
nativeの基礎知識 「ポインタ」てなによ!?
プログラム分散化のための アスペクト指向言語
アルゴリズムとデータ構造 2012年6月21日
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
1.2 言語処理の諸観点 (1)言語処理の利用分野
C++ むかしばなし episthmh わんくま同盟 Microsoft MVP for
C++ むかしばなし episthmh わんくま同盟 Microsoft MVP for
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

C++ むかしばなし episthmh わんくま同盟 Microsoft MVP for  Visual Developer - Visual C++ episthmh episteme@wankuma.com

AT&T , Bjarne Stroustrup シミュレーションの研究にSimulaを利用 めさめさ重たい! → えれー迷惑 二十数年前のある日… AT&T , Bjarne Stroustrup シミュレーションの研究にSimulaを利用 めさめさ重たい! → えれー迷惑 新たに言語を作っちまえ! Cで書けば速いのが手っ取り早く   作れんでね? 前提 : 今あるコンパイラ/リンカをそのまま使う!

インタプリタ と トランスレータ S LによるSのインタプリタ L S D LによるS→Dトランスレータ L

2’ 2’’ 2 2 1 1’ C++ C C++ C C++ C C M C C++ C++ C M C M M C++ M

ここで疑問 なぜ Cで書かなかったのでしょぉ? C++ C これコンパイルすればあっちゅーまにできるやん! C

Munch(Bunch)と呼ばれるツール グローバルインスタンスを何時コンストラクト? グローバルインスタンスを何時デストラクト? コンストラクタ/デストラクタ・チェインを作り mainの直前/直後にチェインをたどる グローバルインスタンスはリンクするまで未定 リンカは従来の(C用)を使うので… リンク後にパッチをあてる    ↑これがMunch

仮想関数テーブルはヘッダを#includeした すべてのコンパイル・ユニットにstaticで展開 → でけー!唯一ひとつにできんもんかね。 仮想関数テーブルの在り処 昔のコンパイラ(fcront1.2あたり)   仮想関数テーブルはヘッダを#includeした   すべてのコンパイル・ユニットにstaticで展開   → でけー!唯一ひとつにできんもんかね。 Cfront2.0の頃改良   仮想関数のうち、最初に宣言されてるもの   を実装しているコンパイル・ユニットに展開

Child* を Mother* にキャストするとズレる! 多重継承はメンドクセー FatherとChildのメソッド を呼ぶときのthis class Father { … }; class Mother { class Child : Father, Mother { ゲ タ Motherのメソッド を呼ぶときのthis Childのメモリ・レイアウト Child* を Mother* にキャストするとズレる! → テキトーに(Father分だけ)ゲタを履かさにゃならんのです

→ name2(Stack,declare)(int) → Stackdeclare(int) implement(Stack,int) マクロによるtemplateもどき Generic.h (抜粋) #define name2(a,b) a\ b #define declare(a,t) name2(a,declare)(t) #define implement(a,t) name2(a,implement)(t) 継続行 declare(Stack,int)  → name2(Stack,declare)(int)  → Stackdeclare(int) implement(Stack,int)  → names(Stack,implement)(int)  → Stackimplement(int)

マクロによるtemplateもどき #define Stack(type) name2(Stack,type) #define Stackdeclare(T) \ class Stack(T) {\ T data[16];\ int top; \ public: \ Stack(T)() { \ top = 0; \ } \ … \ }; #define Stackimplement(T) \ Stack(T)::Stack(T)() { \ … Stack(T)のヘッダ :    stack.h

マクロによるtemplateもどき #include “stack.h” 使うときのオマジナイ declare(Stack,int) implement(Stack.int) int main() { Stack(int) s; s.push(1); s.push(2); … } 使うときのオマジナイ どこかに一箇所書くべし

コンパイル・ユニットそれぞれに展開される なので生成コードがデカい リンカが重複コードをまとめる templateの実現方法(1) Inclusion-model   実装をヘッダに書く。   現実装系の多くが採用   コンパイル・ユニットそれぞれに展開される   なので生成コードがデカい   リンカが重複コードをまとめる

ヘッダと同じディレクトリに同一basenameで 実装を用意しておき、 1. コンパイル(実装コードは無い) templateの実現方法(2) separation-model   実装をヘッダと分離する   ヘッダと同じディレクトリに同一basenameで   実装を用意しておき、   1. コンパイル(実装コードは無い)   2. 仮リンク → 未定義関数一覧が手に入る   3. それを手がかりに実装をコンパイル   4. 改めてリンクして完成