c run time representation
play

C++ Run-Time Representation Point object Point vtable Code for - PowerPoint PPT Presentation

12/9/15 C++ Run-Time Representation Point object Point vtable Code for move vptr OO: optimizing with static types, x 2 code-sharing mechanisms y 3 1. Prelude: C++-style


  1. 12/9/15 C++ ¡Run-­‑Time ¡Representation Point ¡object Point ¡vtable Code ¡for ¡move vptr OO: ¡optimizing ¡with ¡static ¡types, ¡ x 2 code-­‑sharing ¡mechanisms y 3 1. Prelude: ¡ C++-­‑style ¡ representation 2. Multiple ¡inheritance 3. Interfaces 4. T raits/mixins Uses ¡slides ¡by ¡Steve ¡Freund C++ ¡Run-­‑Time ¡Representation Contrast ¡with ¡Smalltalk ¡representation Point ¡class Template Point ¡object Point ¡vtable Code ¡for ¡move Point ¡object Method ¡dictionary x vptr newX:Y: y x 2 2 ... draw y 3 3 moveDx:Dy: ... ColorPoint ¡object ColorPoint ¡vtable Code ¡for ¡move ColorPoint ¡class Template ColorPoint ¡object vptr Method ¡dictionary x x 4 newX:Y:C: Code ¡for ¡darken y y 5 4 color color c red 5 draw red Data ¡at ¡same ¡offset Function ¡pointers ¡at ¡same ¡offset 1

  2. 12/9/15 C++ ¡goals Single ¡v. ¡Multiple ¡Inheritance A • Single ¡inheritance: ¡tree • Zero-­‑cost ¡abstraction • one ¡superclass B C D • Pay ¡as ¡you ¡go • Linear ¡code ¡reuse • … E • High ¡level ¡of ¡control ¡over ¡ representation/performance. X • Multiple ¡inheritance: ¡DAG W V • multiple ¡ superclasses • Compositional ¡code ¡reuse Z Y 8 Multiple ¡Inheritance ¡ Multiple ¡Inheritance ¡ SerialImage *si = new SerialImage(); class Image { vptr si -> show(); I::show int x,y; si -> write(); x virtual void show(); si -> read(); y }; Image *i = si; i -> show(); class Serializable { string file; Serializable *s = si; vptr S::write virtual void write(); s -> write(); file virtual void read(); s -> read(); S::read }; class SerialImage: public Image, public Serializable { vptr I::show virtual void write(); x si virtual void show(); SI::write }; y S::read i? ¡s? file 2

  3. 12/9/15 X Downside: ¡too ¡many ¡choices ArtistCowboys W V class PocketWearer { Z var pocket … If ¡ V and ¡ Z both ¡define ¡method ¡ m , ¡what ¡does ¡ Y inherit? } What ¡does ¡ super mean? Y class Artist extends PocketWearer { def draw(): Unit = What ¡if ¡ X defines ¡a ¡method ¡ m that ¡ Z but ¡ not ¡ V overrides? … // get brush from pocket and draw with it } class Cowboy extends PocketWearer { If ¡ X defines ¡ fields, ¡should ¡ Y have ¡one ¡or ¡tow ¡ f s? Is ¡the ¡answer ¡different ¡ if ¡V ¡and ¡W ¡both ¡ define ¡field ¡ g ? def draw(): Unit = … // draw pistol from pocket and aim } ... class ArtistCowboy extends Artist, Cowboy { // not Scala! C++ ¡approach: ¡ support ¡ all ¡combinations ¡ of ¡possibilities! ¡ } new ArtistCowboy.draw // ?????????? 11 12 Java ¡Interfaces KeyListener MouseListener Panel Interfaces ¡vs. ¡Multiple ¡Inheritance interface KeyListener { void keyPressed(KeyEvent e); T extEditor void keyReleased(KeyEvent e); class DefaultKeyListener { void keyTyped(KeyEvent e); // default is to do nothing } void keyPressed(KeyEvent e) { } void keyReleased(KeyEvent e) { } interface MouseListener { void keyTyped(KeyEvent e) { } } void buttonClicked(MouseEvent e); } class TextField : public Panel, DefaultKeyListener { void keyTyped(KeyEvent e) { /* code here */ } class TextEditor extends Panel ... implements KeyListener,MouseListener { } void keyPressed(KeyEvent e) { /* code */ } void keyReleased(KeyEvent e) { /* code */ } class TerminalWindow : public Panel, DefaultKeyListener { void keyTyped(KeyEvent e) { /* code */ } void keyTyped(KeyEvent e) { /* code here */ } void buttonClicked(MouseEvent e) { /* code */ } ... } } 3

  4. 12/9/15 Interfaces ¡vs. ¡Multiple ¡Inheritance Dispatching ¡interface ¡method ¡calls? Point ¡object Point ¡vtable interface KeyListener { getX void keyPressed(KeyEvent e); vptr void keyReleased(KeyEvent e); x 2 move void keyTyped(KeyEvent e); ... y 3 } class TextField extends Panel implements KeyListener { void keyPressed(KeyEvent e) { } ColorPoint ¡object ColorPoint ¡vtable void keyTyped(KeyEvent e) { /* code here */ } getX void keyReleased(KeyEvent e) { } vptr } 2 x move ... y 3 class TerminalWindow extends Panel implements KeyListener { c red void keyPressed(KeyEvent e) { } getColor ... void keyTyped(KeyEvent e) { /* code here */ } void keyReleased(KeyEvent e) { } } Scala ¡Traits Scala ¡Traits • Completely ¡ Abstract trait CountingIterator[T] extends AbsIterator[T] { var count = 0; trait AbsIterator[T] { AbsItr abstract override def next(): T = { def hasNext(): boolean; count = count + 1; def next(): T; super.next(); } } StringItr RichItr CountItr def count() = count; • Partially ¡ Implemented } FancyStringItr trait RichIterator[T] extends AbsIterator[T] { def foreach(f: T => Unit): Unit = { class FancyStringIterator(s: String) while (hasNext()) f(next()) extends StringIterator(s) } with RichIterator[Char] } with CountingIterator[Char] { ... } 4

  5. 12/9/15 Name ¡Resolution ¡via ¡ A Scala ¡Traits Linearization trait CountingIterator[T] extends AbsIterator[T] { B C var count = 0; AbsItr abstract override def next(): T = { trait A { } count = count + 1; trait B extends A { } super.next(); D trait C extends A { } } StringItr RichItr CountItr class D extends B with C { } def count() = count; } FancyStringItr class FancyStringIterator(s: String) Right-­‑first ¡depth-­‑first ¡search: [D,C,A,B,A] extends StringIterator(s) Eliminate ¡all ¡but ¡last ¡occurrence: [D,C,B,A] with RichIterator[Char] with CountingIterator[Char] { ... } http://en.wikipedia.org/wiki/Mixin 5

Recommend


More recommend