modules for c++ · scanner parser semantic analyzer optimizer code generator assembler token stream...

44
C++ Modules for Daveed Vandevoorde 1

Upload: others

Post on 07-Jul-2020

26 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

C++Modules for

Daveed Vandevoorde

1

Page 2: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

C++Modules for

2

Page 3: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

C++

3

Page 4: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

C++

4

Page 5: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

C++ Libraries

5

Page 6: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Libraries

6

Page 7: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

7

Page 8: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

export MyLib:public: typedef decltype(sizeof(1)) IndexType; ...private: int select(IndexType x) { ... }

import MyLib;

void select(IndexType x) { ...}

8

Page 9: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

export M1:public: typedef int I1;

import MM;I1 i1; // Okay.I2 i2; // Error. I2 is not declared.

export M2:public: typedef int I2;

export MM:public: import M1;private: import M2;

9

Page 10: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

export MyLib::Basics:public: namespace MyLib { typedef decltype(sizeof(1)) IndexType; ...

import MyLib::Basics;

void select(MyLib::IndexType x) { ...}

10

Page 11: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

export MyLib.basics:public: namespace MyLib { typedef decltype(sizeof(1)) IndexType;private: void helper() { ...

export MyLib.select: import MyLib.basics;public: namespace MyLib { void select(IndexType x) { ... helper(); ...

11

Page 12: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

export MyLib:public: struct S { void f(long x) { this->f((long long)x); } private: void f(long long x); }; void S::f(long long x) { ... }

import MyLib;

void g(S x) { x.f(42); // Unambiguous.}

12

Page 13: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

export MyLib:public: class B { virtual void f(); };

import MyLib;

struct D: B { override void f(); // Does find B::f!};

13

Page 14: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

export MyLib:private: import { extern ″C″ int printf(char const*, ...); }public: void warning(char const *msg) { printf(″%s″, msg); }

#ifndef MYLIB_H#define MYLIB_H

import MyLib;

#endif /* ifndef MYLIB_H */

14

Page 15: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

So what?

15

Page 16: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Macros

16

Page 17: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Macros

17

Page 18: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Fast Builds

18

Page 19: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Explicit Dependencies

19

Page 20: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Initialization Order

20

Page 21: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Cross-TU Optimizations

21

Page 22: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

22

Page 23: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Scanner

Parser

Semantic Analyzer

Optimizer

Code Generator

Assembler

Token Stream

Parse Tree

IR

Optimized IR

Low-Level Code

Character Stream

Object Code

Front End

Back End

23

Page 24: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Scanner

Parser

Semantic Analyzer

Optimizer

Code Generator

Assembler

Token Stream

Parse Tree

IR

Optimized IR

Low-Level Code

Character Stream

Object Code

Front End

Back End

module filesheader files

object files

24

Page 25: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Scanner

Parser

Semantic Analyzer

Optimizer

Code Generator

Assembler

Token Stream

Parse Tree

IR

Optimized IR

Low-Level Code

Character Stream

Object Code

Front End

Back End

module files

header files

object files

25

Page 26: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Scanner

Parser

Semantic Analyzer

Token Stream

Parse Tree

Character Stream

Front End

module files

header files

• Compiler dependent• Version dependent• Human readable?

26

Page 27: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Scanner

Parser

Semantic Analyzer

Token Stream

Parse Tree

Character Stream

Front End

module files

• Compiler independent• Version independent• Human readable

precompiledmodules

27

Page 28: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Modules

28

Page 29: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Clang Modules

29

Page 30: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

.h.h

.h

.h

ModuleMap File(module.map)

precompiledmodules

#include ″lib_part.h″

void select(MyLib::IndexType x) { ...}

30

Page 31: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

// module.mapmodule std { module stdio { header ″stdio.h″ } module vector { require cplusplus header ″vector″ } ... explicit module iostream { require cplusplus header ″iostream″ export std.locale } ...}

31

Page 32: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Strengths & Weaknesses

32

Page 33: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Availability

33

Page 34: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Ease of Transition

34

Page 35: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Ease of Programming

35

Page 36: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Visibility Control

36

Page 37: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Initialization Ordering

37

Page 38: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Cross-TU Properties

38

Page 39: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Unifiable?

39

Page 40: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

// module.mapmodule std { module stdio { header ″stdio.h″ } module vector { require cplusplus header ″vector″ } ... explicit module iostream { require cplusplus header ″iostream″ export std.locale } ...}

40

Page 41: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

// std.mppexport [[mapincludes]] std: export [[macros]] .stdio {# include ″stdio.h″ } export [[cplusplus]] .vector {# include ″vector″ } ... export [[cplusplus, separate]] .iostream {# include ″iostream″ public: import std.locale; } ...}

41

Page 42: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

Want more?

42

Page 43: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

SG-2

43

Page 44: Modules for C++ · Scanner Parser Semantic Analyzer Optimizer Code Generator Assembler Token Stream Parse Tree IR Optimized IR Low-Level Code Character Stream Object Code Front End

ENDThe

44