SlideShare a Scribd company logo
C++ CoreHard Spring 2018
25 years of C++ history flashed
in front of my eyes
Yauheni Akhotnikau
A few words about myself
Started programming somewhere in 1990.
C++ is the main tool since 1992 with a few short pauses.
Was a developer, team-lead, head of software development department.
Now a co-founder of small software startup.
A dictator behind OpenSource projects SObjectizer and RESTinio.
2
Why I'm doing this talk?
Some know me as a "C++ advocate". It's because:
don't bite the hand feeding you.
I've done some investments in C++ and want to protect them.
There are too many non-technical obstacles like myths and urban legends.
3
The question of life, universe and...
How and why
C++ became popular?
4
Fast growth of popularity
500 users in 1985
400 000 users in 1991
3 000 000+ users at the end of 1990s.
"According to IDC, out of 13.1 million developer seats worldwide in 1999,
Visual Basic had 7.2 million vs. 3.6 million C/C++ seats and 1.3 million Java
seats."
quote from Application Development Trends magazine (2001.05.29)
5
Why?
Three main factors
(very subjective)
6
OOP was a "silver bullet"
There is no "silver bullet" but every time something pretends to be it.
In 1980s it was OOP.
OOP is great technique and significantly simplifies some tasks.
7
Easy upgrade from plain C
Significant part of C is a subset of C++.
Powerful features of C++ can be added to a C program only when needed.
Existing C libraries can be easily used from C++.
8
Computers were weak
Jan 1987. IBM PS/2 Model 70: 16MHz CPU, 6MiB RAM.
Oct 1988. The first NeXT computer: 25MHz CPU, 8MiB RAM.
Jan 1989. DECstation 3100: 16.7MHz CPU, from 4MiB to 24MiB RAM.
Apr 1989. SPARCstation 1: 20MHz CPU, from 4MiB to 64MiB RAM.
9
http://pctimeline.info/workstation/work1987.htm,
https://en.wikipedia.org/wiki/DECstation,
https://en.wikipedia.org/wiki/SPARCstation_1,
http://www.computinghistory.org.uk/det/2586/ibm-ps-2-model-70/
As a consequence...
There was a strong need for:
● a highly expressive and powerful;
● a very efficient;
● a practical
programming language for masses.
C++ become that language.
10
And another important factor...
C++ in mid 1980s was significantly simpler than modern C++ ;)
11
Some examples from my own experience
How C++ caught myself
12
My way in early 1990s
Basic ⇒ Pascal ⇒ Turbo Pascal ⇒ C ⇒ C++
Pascal has such useful thing as set.
There wasn't such thing in C. And there wasn't a way to implement it.
There wasn't such thing in C++ (at 1991).
But there was a way to implement it.
13
My way in early 1990s
Basic ⇒ Pascal ⇒ Turbo Pascal ⇒ C ⇒ C++
Pascal has such useful thing as set.
There wasn't such thing in C. And there wasn't a way to implement it.
There wasn't such thing in C++ (at 1991).
But there was a way to implement it.
14
class int_set {
int * items_;
...
public:
int_set() : items_(new int[initial_capacity]) {...}
~int_set() { delete[] items_; }
...
};
int_set operator+(const int_set & a, const int_set & b) {...}
int_set operator-(const int_set & a, const int_set & b) {...}
int_set operator&(const int_set & a, const int_set & b) {...}
int_set received_items;
int_set checked_items;
...
int_set delayed_items = received_items - checked_items;
Linear algebra computations
There was a task of solving a system of linear equations.
A very special case: symmetric band matrix.
15
X1,1 X1,2 X1,3 X1,4 0 0 0 0
0 0 0 0 0 ...
X1,2 X2,2 X2,3 X2,4 X2,5 0 0 0
0 0 0 0 0 ...
X1,3 X2,3 X3,3 X3,4 X3,5 X3,6 0 0
0 0 0 0 0 ...
X1,4 X2,4 X3,4 X4,4 X4,5 X4,6 X4,7 0
0 0 0 0 0 ...
0 X2,5 X3,5 X4,5 X5,5 X5,6 X5,7
X5,8 0 0 0 0 0
...
0 0 X3,6 X4,6 X5,6 X6,6 X6,7
X6,8 X6,9 0 0 0 0
Linear algebra computations
There was a task of solving a system of linear equations.
A very special case: symmetric band matrix.
16
X1,1 X1,2 X1,3 X1,4 0 0 0 0
0 0 0 0 0 ...
X1,2 X2,2 X2,3 X2,4 X2,5 0 0 0
0 0 0 0 0 ...
X1,3 X2,3 X3,3 X3,4 X3,5 X3,6 0 0
0 0 0 0 0 ...
X1,4 X2,4 X3,4 X4,4 X4,5 X4,6 X4,7 0
0 0 0 0 0 ...
0 X2,5 X3,5 X4,5 X5,5 X5,6 X5,7
X5,8 0 0 0 0 0
...
0 0 X3,6 X4,6 X5,6 X6,6 X6,7
X6,8 X6,9 0 0 0 0
class BandMatrix;
class RowAccessor {
BandMatrix & matrix;
unsigned row_index;
public:
RowAccessor(BandMatrix & m, unsigned i);
float & operator[](unsigned j) {...}
};
class BandMatrix {
float * data;
public
BandMatrix(unsigned dimension, unsigned band_width) {...};
...
RowAccessor operator[](unsigned i) { return RowAccessor(*this, i); }
...
};
BandMatrix m;
...
m[i][j] = m[i][j-1] + m[i-1][j] + ...;
A bit of history...
30+ years of C++ evolution
in one slide
17
Just a brief overview
1980s: official release, very quick evolution.
1990s: become a mainstream, the first ISO standard (C++98), lot of
incompatible libraries.
2000s: still a mainstream, but the oblivion is started. C++03. Long-term
construction C++0x. Boost libraries. LLVM and clang.
2010s: a new hope. C++11, C++14, C++17. C++ Core Guidelines. C++20 on its
way...
18
Yet more history...
Some important notes about 1990s
19
1990s: life without the standard
A lot of incompatible "basic" libraries (some of them supplied with
compilers).
Every big and complex C++ project has its own "standard" library.
There could be several independent implementation of String class in one
project.
20
1990s: rising of C++ templates
STL shows the real power of C++ templates.
Java 1.0 in 1995 demonstrated how to "live" without templates/generics.
Template metaprogramming was accidentally discovered in 1994.
(http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06s04.html#Static-metaprogramming)
As consequence: Alexandrescu's "Modern C++ Design" in 2001.
C++ will never be the same anymore ;)
21
A picture is worth a thousand words
Show me the code!
22
C++ evolution in simple examples
By the help of a simple demo application:
● there is a collection of struct place (each struct contains name, price
and rating);
● sort this collection by rating, then by price, then by name. And then
print the collection after sorting;
● sort this collection by name, then print it.
23
Ancient C++ (pre-C++98)
struct place {
char * name_;
long price_;
int rating_;
place() : name_(0) {}
place(const char * name, long price, int rating)
: name_(copy_name(name)), price_(price), rating_(rating) {}
place(const place & o)
: name_(copy_name(o.name_)), price_(o.price_)
, rating_(o.rating_) {}
~place() { delete[] name_; }
place & operator=(const place & o) {
char * copy = copy_name(o.name_);
delete[] name_;
name_ = copy; price_ = o.price_; rating_ = o.rating_;
return *this;
}
24
static char * copy_name(const char * src) {
char * r = 0;
if(src) {
r = new char[strlen(src) + 1];
strcpy(r, src);
}
return r;
}
};
Ancient C++ (pre-C++98)
ostream & operator<<(ostream & to, const place & p) {
to << setw(20) << left << p.name_ << "[" << p.rating_ << "]"
<< setw(7) << right << p.price_;
return to;
}
void print(const place * places, size_t count) {
for(size_t i = 0; i != count; ++i)
cout << places[i] << endl;
cout << endl;
}
25
Ancient C++ (pre-C++98)
int compare_by_rating_price_name(const void * av, const void * bv) {
const place & a = *(const place *)av;
const place & b = *(const place *)bv;
int result;
if(a.rating_ < b.rating_) result = -1;
else {
if(a.rating_ == b.rating_) {
if(a.price_ < b.price_) result = -1;
else {
if(a.price_ == b.price_) result = strcmp(a.name_, b.name_);
else result = 1;
}
}
else result = 1;
}
return result;
}
26
Ancient C++ (pre-C++98)
int compare_by_name(const void * av, const void * bv) {
const place & a = *(const place *)av;
const place & b = *(const place *)bv;
return strcmp(a.name_, b.name_);
}
27
Ancient C++ (pre-C++98)
void get_places(place *& places, size_t & count) {
places = new place[7];
places[0] = place("Moscow", 1500, 3);
places[1] = place("St. Petersburg", 1300, 5);
places[2] = place("Minsk", 500, 4);
places[3] = place("Tokyo", 3500, 4);
places[4] = place("Sydney", 5000, 3);
places[5] = place("Paris", 3000, 5);
places[6] = place("London", 3500, 4);
count = 7;
}
28
Ancient C++ (pre-C++98)
int main() {
place * places;
size_t count;
get_places(places, count);
qsort(places, count, sizeof(place), compare_by_rating_price_name);
print(places, count);
qsort(places, count, sizeof(place), compare_by_name);
print(places, count);
delete[] places;
}
29
Old C++ (C++98/03)
using namespace std;
struct place {
string name_;
long price_;
int rating_;
place() {}
place(const char * name, float price, int rating)
: name_(name), price_(price), rating_(rating) {}
};
30
Old C++ (C++98/03)
ostream & operator<<(ostream & to, const place & p) {
to << setw(20) << left << p.name_ << "[" << p.rating_ << "]"
<< setw(7) << right << p.price_;
return to;
}
template<class C>
void print(const C & places) {
for(typename C::const_iterator i = places.begin(); i != places.end(); ++i)
cout << *i << endl;
cout << endl;
}
31
Old C++ (C++98/03)
bool compare_by_rating_price_name(const place & a, const place & b) {
bool result = false;
if(a.rating_ < b.rating_) result = true;
else if(a.rating_ == b.rating_) {
if(a.price_ < b.price_) result = true;
else if(a.price_ == b.price_) result = (a.name_ < b.name_);
}
return result;
}
bool compare_by_name(const place & a, const place & b) {
return a.name_ < b.name_;
}
32
Old C++ (C++98/03)
vector<place> get_places() {
vector<place> places;
places.push_back(place("Moscow", 1500, 3));
places.push_back(place("St. Petersburg", 1300, 5));
places.push_back(place("Minsk", 500, 4));
places.push_back(place("Tokyo", 3500, 4));
places.push_back(place("Sydney", 5000, 3));
places.push_back(place("Paris", 3000, 5));
places.push_back(place("London", 3500, 4));
return places;
}
33
Old C++ (C++98/03)
int main() {
vector<place> places = get_places();
sort(places.begin(), places.end(), compare_by_rating_price_name);
print(places);
sort(places.begin(), places.end(), compare_by_name);
print(places);
}
34
Modern C++ (C++17)
using namespace std;
struct place {
string name_;
long price_;
int rating_;
};
35
Modern C++ (C++17)
ostream & operator<<(ostream & to, const place & p) {
to << setw(20) << left << p.name_ << "[" << p.rating_ << "]"
<< setw(7) << right << p.price_;
return to;
}
template<class C>
void print(const C & places) {
for(const auto & p : places)
cout << p << endl;
cout << endl;
}
36
Modern C++ (C++17)
bool compare_by_rating_price_name(const place & a, const place & b) {
return tie(a.rating_, a.price_, a.name_) < tie(b.rating_, b.price_, b.name_);
}
bool compare_by_name(const place & a, const place & b) {
return a.name_ < b.name_;
}
37
Modern C++ (C++17)
vector<place> get_places() {
return {
{"Moscow", 1500, 3},
{"St. Petersburg", 1300, 5},
{"Minsk", 500, 4},
{"Tokyo", 3500, 4},
{"Sydney", 5000, 3},
{"Paris", 3000, 5},
{"London", 3500, 4}
};
}
38
Modern C++ (C++17)
int main() {
auto places = get_places();
sort(begin(places), end(places), compare_by_rating_price_name);
print(places);
sort(begin(places), end(places), compare_by_name);
print(places);
}
39
Full text of pre-C++98 example
40
Full text of C++98 example
41
Full text of C++17 example
42
30 years of C++ evolution in a picture
43
Nothing can last forever
How C++ lost its popularity?
44
Computers become strong
1997-1999. Cheap PCs with:
● Intel or AMD processors at 200, 266, 300, 350 and more MHz;
● dozens or even hundreds of MiB of RAMs.
10x growth of execution speed in 10 years.
New slogan: "CPU and memory is not a resource".
As a result: Java is not slow anymore
(you can use name of any safe language with GC instead of Java: Python, SmallTalk, Scheme and so on).
45
Programmer's productivity matters
C++ is not safe:
● no run-time checks;
● a lot of UB.
C++ requires an attention for a lot of details.
Manual memory management vs Garbage collection.
It's hard to support C++ in IDE.
No batteries included. No dependency manager. Incompatible libraries.
46
New "hot" niches
1980s and early 1990s: desktop & GUI applications.
Late 1990s and early 2000s: Internet/WWW + server-side.
Late 2000s and 2010s: mobile.
47
Free lunch is over or...
Is there a place for C++ today?
48
C++ is (and always was) a niche language
The niche for C++ is a software systems which are:
● complex enough to require a powerful and high level language and
● have strict requirements to performance and/or resource consumption.
Yet another feature of this niche:
● there is no place for quick-and-dirty solutions!
49
Where C++ can be used now?
High performance computing (weather forecasting, molecular modeling, physic
simulation, big-data, machine learning, ...)
Low resource consumption apps (mobile application, internet of things, ...)
System programming and around (OS kernels, drivers and utilities, middleware,
compilers, antiviruses, ...)
Real-time and embedded systems (SCADA, industrial internet of things, avionics,
automotive, finance, telecom, defense, ...)
Complex desktop applications (CADs, photoshop, AAA games, browsers, office apps, ...)
Cross-platform apps (app's kernel in C++ + GUI in native technology (Dropbox's jinie), ...)
50
Another important question
Why C++'s case is so unique?
51
There are not many similar examples
C++ is one of the few languages that:
● has many years history of history;
● has an international standard and several live and evolving compilers;
● has a legacy of enormous size;
● is still widely used;
● is still under the active development;
● has no single owner (or just big corporation behind it).
I can remember only Cobol, FORTRAN and Ada.
52
What does it mean?
You can't just stop using C++ and rewrite all C++ code in another modern
language.
You can't just throw out any part of the language.
You can't leave just one C++ compiler and kill all the other C++ compilers.
You can't force all C++ developers to use one "right" code style.
You can't force all C++ developers to use one set of "right" tools (like
libraries, dependency managers or build tools).
53
Just remember:
C++ is community driven language
54
That's all!
Thank you!
Yauheni Akhotnikau, StiffStream
https://stiffstream.com
eao197@stiffstream.com
55

More Related Content

What's hot

Translating Classic Arcade Games to JavaScript
Translating Classic Arcade Games to JavaScriptTranslating Classic Arcade Games to JavaScript
Translating Classic Arcade Games to JavaScript
norbert_kehrer
 
RedisConf18 - Lower Latency Graph Queries in Cypher with Redis Graph
RedisConf18 - Lower Latency Graph Queries in Cypher with Redis GraphRedisConf18 - Lower Latency Graph Queries in Cypher with Redis Graph
RedisConf18 - Lower Latency Graph Queries in Cypher with Redis Graph
Redis Labs
 
Sprint - Exciting Insights from Translating a Classic Car Racing Game to Java...
Sprint - Exciting Insights from Translating a Classic Car Racing Game to Java...Sprint - Exciting Insights from Translating a Classic Car Racing Game to Java...
Sprint - Exciting Insights from Translating a Classic Car Racing Game to Java...
norbert_kehrer
 
Rcpp: Seemless R and C++
Rcpp: Seemless R and C++Rcpp: Seemless R and C++
Rcpp: Seemless R and C++
Romain Francois
 
Happy To Use SIMD
Happy To Use SIMDHappy To Use SIMD
Happy To Use SIMD
Wei-Ta Wang
 
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)
changehee lee
 
PVS-Studio team experience: checking various open source projects, or mistake...
PVS-Studio team experience: checking various open source projects, or mistake...PVS-Studio team experience: checking various open source projects, or mistake...
PVS-Studio team experience: checking various open source projects, or mistake...
Andrey Karpov
 
PyCon APAC 2017: Page Layout Analysis of 19th Century Siamese Newspapers usin...
PyCon APAC 2017: Page Layout Analysis of 19th Century Siamese Newspapers usin...PyCon APAC 2017: Page Layout Analysis of 19th Century Siamese Newspapers usin...
PyCon APAC 2017: Page Layout Analysis of 19th Century Siamese Newspapers usin...
Mark Hollow
 
Coq for ML users
Coq for ML usersCoq for ML users
Coq for ML users
tmiya
 
Class 18: Measuring Cost
Class 18: Measuring CostClass 18: Measuring Cost
Class 18: Measuring Cost
David Evans
 
D言語をたまには真面目に紹介してみる
D言語をたまには真面目に紹介してみるD言語をたまには真面目に紹介してみる
D言語をたまには真面目に紹介してみる
N Masahiro
 
【論文紹介】Relay: A New IR for Machine Learning Frameworks
【論文紹介】Relay: A New IR for Machine Learning Frameworks【論文紹介】Relay: A New IR for Machine Learning Frameworks
【論文紹介】Relay: A New IR for Machine Learning Frameworks
Takeo Imai
 
4th Semester M Tech: VLSI Design and Embedded System (June-2016) Question Papers
4th Semester M Tech: VLSI Design and Embedded System (June-2016) Question Papers4th Semester M Tech: VLSI Design and Embedded System (June-2016) Question Papers
4th Semester M Tech: VLSI Design and Embedded System (June-2016) Question Papers
BGS Institute of Technology, Adichunchanagiri University (ACU)
 
Computer graphics lab manual
Computer graphics lab manualComputer graphics lab manual
Computer graphics lab manual
Uma mohan
 
Building Efficient and Highly Run-Time Adaptable Virtual Machines
Building Efficient and Highly Run-Time Adaptable Virtual MachinesBuilding Efficient and Highly Run-Time Adaptable Virtual Machines
Building Efficient and Highly Run-Time Adaptable Virtual Machines
Guido Chari
 
Minerva_lib - fuzzing tool
Minerva_lib - fuzzing toolMinerva_lib - fuzzing tool
Minerva_lib - fuzzing tool
Logicaltrust pl
 
Class 11: Deeper List Procedures
Class 11: Deeper List ProceduresClass 11: Deeper List Procedures
Class 11: Deeper List Procedures
David Evans
 

What's hot (17)

Translating Classic Arcade Games to JavaScript
Translating Classic Arcade Games to JavaScriptTranslating Classic Arcade Games to JavaScript
Translating Classic Arcade Games to JavaScript
 
RedisConf18 - Lower Latency Graph Queries in Cypher with Redis Graph
RedisConf18 - Lower Latency Graph Queries in Cypher with Redis GraphRedisConf18 - Lower Latency Graph Queries in Cypher with Redis Graph
RedisConf18 - Lower Latency Graph Queries in Cypher with Redis Graph
 
Sprint - Exciting Insights from Translating a Classic Car Racing Game to Java...
Sprint - Exciting Insights from Translating a Classic Car Racing Game to Java...Sprint - Exciting Insights from Translating a Classic Car Racing Game to Java...
Sprint - Exciting Insights from Translating a Classic Car Racing Game to Java...
 
Rcpp: Seemless R and C++
Rcpp: Seemless R and C++Rcpp: Seemless R and C++
Rcpp: Seemless R and C++
 
Happy To Use SIMD
Happy To Use SIMDHappy To Use SIMD
Happy To Use SIMD
 
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)
개발 과정 최적화 하기 내부툴로 더욱 강력한 개발하기 Stephen kennedy _(11시40분_103호)
 
PVS-Studio team experience: checking various open source projects, or mistake...
PVS-Studio team experience: checking various open source projects, or mistake...PVS-Studio team experience: checking various open source projects, or mistake...
PVS-Studio team experience: checking various open source projects, or mistake...
 
PyCon APAC 2017: Page Layout Analysis of 19th Century Siamese Newspapers usin...
PyCon APAC 2017: Page Layout Analysis of 19th Century Siamese Newspapers usin...PyCon APAC 2017: Page Layout Analysis of 19th Century Siamese Newspapers usin...
PyCon APAC 2017: Page Layout Analysis of 19th Century Siamese Newspapers usin...
 
Coq for ML users
Coq for ML usersCoq for ML users
Coq for ML users
 
Class 18: Measuring Cost
Class 18: Measuring CostClass 18: Measuring Cost
Class 18: Measuring Cost
 
D言語をたまには真面目に紹介してみる
D言語をたまには真面目に紹介してみるD言語をたまには真面目に紹介してみる
D言語をたまには真面目に紹介してみる
 
【論文紹介】Relay: A New IR for Machine Learning Frameworks
【論文紹介】Relay: A New IR for Machine Learning Frameworks【論文紹介】Relay: A New IR for Machine Learning Frameworks
【論文紹介】Relay: A New IR for Machine Learning Frameworks
 
4th Semester M Tech: VLSI Design and Embedded System (June-2016) Question Papers
4th Semester M Tech: VLSI Design and Embedded System (June-2016) Question Papers4th Semester M Tech: VLSI Design and Embedded System (June-2016) Question Papers
4th Semester M Tech: VLSI Design and Embedded System (June-2016) Question Papers
 
Computer graphics lab manual
Computer graphics lab manualComputer graphics lab manual
Computer graphics lab manual
 
Building Efficient and Highly Run-Time Adaptable Virtual Machines
Building Efficient and Highly Run-Time Adaptable Virtual MachinesBuilding Efficient and Highly Run-Time Adaptable Virtual Machines
Building Efficient and Highly Run-Time Adaptable Virtual Machines
 
Minerva_lib - fuzzing tool
Minerva_lib - fuzzing toolMinerva_lib - fuzzing tool
Minerva_lib - fuzzing tool
 
Class 11: Deeper List Procedures
Class 11: Deeper List ProceduresClass 11: Deeper List Procedures
Class 11: Deeper List Procedures
 

Similar to 25 лет истории C++, пролетевшей на моих глазах

breaking_dependencies_the_solid_principles__klaus_iglberger__cppcon_2020.pdf
breaking_dependencies_the_solid_principles__klaus_iglberger__cppcon_2020.pdfbreaking_dependencies_the_solid_principles__klaus_iglberger__cppcon_2020.pdf
breaking_dependencies_the_solid_principles__klaus_iglberger__cppcon_2020.pdf
VishalKumarJha10
 
Modern C++
Modern C++Modern C++
Modern C++
Michael Clark
 
C Programming Training in Ambala ! Batra Computer Centre
C Programming Training in Ambala ! Batra Computer CentreC Programming Training in Ambala ! Batra Computer Centre
C Programming Training in Ambala ! Batra Computer Centre
jatin batra
 
Return of c++
Return of c++Return of c++
Return of c++
Yongwei Wu
 
C++11 - A Change in Style - v2.0
C++11 - A Change in Style - v2.0C++11 - A Change in Style - v2.0
C++11 - A Change in Style - v2.0
Yaser Zhian
 
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
PROIDEA
 
C++: a fast tour of a fast language
C++: a fast tour of a fast languageC++: a fast tour of a fast language
C++: a fast tour of a fast language
Adrian Ostrowski
 
How to Adopt Modern C++17 into Your C++ Code
How to Adopt Modern C++17 into Your C++ CodeHow to Adopt Modern C++17 into Your C++ Code
How to Adopt Modern C++17 into Your C++ Code
Microsoft Tech Community
 
How to Adopt Modern C++17 into Your C++ Code
How to Adopt Modern C++17 into Your C++ CodeHow to Adopt Modern C++17 into Your C++ Code
How to Adopt Modern C++17 into Your C++ Code
Microsoft Tech Community
 
Rcpp: Seemless R and C++
Rcpp: Seemless R and C++Rcpp: Seemless R and C++
Rcpp: Seemless R and C++
Romain Francois
 
What has to be paid attention when reviewing code of the library you develop
What has to be paid attention when reviewing code of the library you developWhat has to be paid attention when reviewing code of the library you develop
What has to be paid attention when reviewing code of the library you develop
Andrey Karpov
 
C++ process new
C++ process newC++ process new
C++ process new
敬倫 林
 
ESL Anyone?
ESL Anyone? ESL Anyone?
ESL Anyone?
DVClub
 
C++ 11 Features
C++ 11 FeaturesC++ 11 Features
C++ 11 Features
Jan Rüegg
 
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Value Objects, Full Throttle (to be updated for spring TC39 meetings)Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Brendan Eich
 
Zarzadzanie pamiecia w .NET - WDI
Zarzadzanie pamiecia w .NET - WDIZarzadzanie pamiecia w .NET - WDI
Zarzadzanie pamiecia w .NET - WDI
Konrad Kokosa
 
Anomalies in X-Ray Engine
Anomalies in X-Ray EngineAnomalies in X-Ray Engine
Anomalies in X-Ray Engine
PVS-Studio
 
The Joy of ServerSide Swift Development
The Joy  of ServerSide Swift DevelopmentThe Joy  of ServerSide Swift Development
The Joy of ServerSide Swift Development
Giordano Scalzo
 
The Joy of Server Side Swift Development
The Joy  of Server Side Swift DevelopmentThe Joy  of Server Side Swift Development
The Joy of Server Side Swift Development
Giordano Scalzo
 
The Joy Of Server Side Swift Development
The Joy Of Server Side Swift DevelopmentThe Joy Of Server Side Swift Development
The Joy Of Server Side Swift Development
Giordano Scalzo
 

Similar to 25 лет истории C++, пролетевшей на моих глазах (20)

breaking_dependencies_the_solid_principles__klaus_iglberger__cppcon_2020.pdf
breaking_dependencies_the_solid_principles__klaus_iglberger__cppcon_2020.pdfbreaking_dependencies_the_solid_principles__klaus_iglberger__cppcon_2020.pdf
breaking_dependencies_the_solid_principles__klaus_iglberger__cppcon_2020.pdf
 
Modern C++
Modern C++Modern C++
Modern C++
 
C Programming Training in Ambala ! Batra Computer Centre
C Programming Training in Ambala ! Batra Computer CentreC Programming Training in Ambala ! Batra Computer Centre
C Programming Training in Ambala ! Batra Computer Centre
 
Return of c++
Return of c++Return of c++
Return of c++
 
C++11 - A Change in Style - v2.0
C++11 - A Change in Style - v2.0C++11 - A Change in Style - v2.0
C++11 - A Change in Style - v2.0
 
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
4Developers 2018: Ile (nie) wiesz o strukturach w .NET (Łukasz Pyrzyk)
 
C++: a fast tour of a fast language
C++: a fast tour of a fast languageC++: a fast tour of a fast language
C++: a fast tour of a fast language
 
How to Adopt Modern C++17 into Your C++ Code
How to Adopt Modern C++17 into Your C++ CodeHow to Adopt Modern C++17 into Your C++ Code
How to Adopt Modern C++17 into Your C++ Code
 
How to Adopt Modern C++17 into Your C++ Code
How to Adopt Modern C++17 into Your C++ CodeHow to Adopt Modern C++17 into Your C++ Code
How to Adopt Modern C++17 into Your C++ Code
 
Rcpp: Seemless R and C++
Rcpp: Seemless R and C++Rcpp: Seemless R and C++
Rcpp: Seemless R and C++
 
What has to be paid attention when reviewing code of the library you develop
What has to be paid attention when reviewing code of the library you developWhat has to be paid attention when reviewing code of the library you develop
What has to be paid attention when reviewing code of the library you develop
 
C++ process new
C++ process newC++ process new
C++ process new
 
ESL Anyone?
ESL Anyone? ESL Anyone?
ESL Anyone?
 
C++ 11 Features
C++ 11 FeaturesC++ 11 Features
C++ 11 Features
 
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Value Objects, Full Throttle (to be updated for spring TC39 meetings)Value Objects, Full Throttle (to be updated for spring TC39 meetings)
Value Objects, Full Throttle (to be updated for spring TC39 meetings)
 
Zarzadzanie pamiecia w .NET - WDI
Zarzadzanie pamiecia w .NET - WDIZarzadzanie pamiecia w .NET - WDI
Zarzadzanie pamiecia w .NET - WDI
 
Anomalies in X-Ray Engine
Anomalies in X-Ray EngineAnomalies in X-Ray Engine
Anomalies in X-Ray Engine
 
The Joy of ServerSide Swift Development
The Joy  of ServerSide Swift DevelopmentThe Joy  of ServerSide Swift Development
The Joy of ServerSide Swift Development
 
The Joy of Server Side Swift Development
The Joy  of Server Side Swift DevelopmentThe Joy  of Server Side Swift Development
The Joy of Server Side Swift Development
 
The Joy Of Server Side Swift Development
The Joy Of Server Side Swift DevelopmentThe Joy Of Server Side Swift Development
The Joy Of Server Side Swift Development
 

More from corehard_by

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
corehard_by
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
corehard_by
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
corehard_by
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
corehard_by
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
corehard_by
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
corehard_by
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
corehard_by
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
corehard_by
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
corehard_by
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
corehard_by
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
corehard_by
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
corehard_by
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
corehard_by
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
corehard_by
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
corehard_by
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
corehard_by
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
corehard_by
 

More from corehard_by (20)

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 

Recently uploaded

Choosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptxChoosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptx
Brandon Minnick, MBA
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
AstuteBusiness
 
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing InstancesEnergy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Alpen-Adria-Universität
 
Y-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PPY-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PP
c5vrf27qcz
 
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
Jason Yip
 
Apps Break Data
Apps Break DataApps Break Data
Apps Break Data
Ivo Velitchkov
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
saastr
 
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
Alex Pruden
 
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
Edge AI and Vision Alliance
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
MichaelKnudsen27
 
What is an RPA CoE? Session 1 – CoE Vision
What is an RPA CoE?  Session 1 – CoE VisionWhat is an RPA CoE?  Session 1 – CoE Vision
What is an RPA CoE? Session 1 – CoE Vision
DianaGray10
 
Serial Arm Control in Real Time Presentation
Serial Arm Control in Real Time PresentationSerial Arm Control in Real Time Presentation
Serial Arm Control in Real Time Presentation
tolgahangng
 
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their MainframeDigital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Precisely
 
Public CyberSecurity Awareness Presentation 2024.pptx
Public CyberSecurity Awareness Presentation 2024.pptxPublic CyberSecurity Awareness Presentation 2024.pptx
Public CyberSecurity Awareness Presentation 2024.pptx
marufrahmanstratejm
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Safe Software
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc
 
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-EfficiencyFreshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
ScyllaDB
 
Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
Pixlogix Infotech
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Wask
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
akankshawande
 

Recently uploaded (20)

Choosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptxChoosing The Best AWS Service For Your Website + API.pptx
Choosing The Best AWS Service For Your Website + API.pptx
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
 
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing InstancesEnergy Efficient Video Encoding for Cloud and Edge Computing Instances
Energy Efficient Video Encoding for Cloud and Edge Computing Instances
 
Y-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PPY-Combinator seed pitch deck template PP
Y-Combinator seed pitch deck template PP
 
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
[OReilly Superstream] Occupy the Space: A grassroots guide to engineering (an...
 
Apps Break Data
Apps Break DataApps Break Data
Apps Break Data
 
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
Deep Dive: AI-Powered Marketing to Get More Leads and Customers with HyperGro...
 
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
 
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
 
Nordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptxNordic Marketo Engage User Group_June 13_ 2024.pptx
Nordic Marketo Engage User Group_June 13_ 2024.pptx
 
What is an RPA CoE? Session 1 – CoE Vision
What is an RPA CoE?  Session 1 – CoE VisionWhat is an RPA CoE?  Session 1 – CoE Vision
What is an RPA CoE? Session 1 – CoE Vision
 
Serial Arm Control in Real Time Presentation
Serial Arm Control in Real Time PresentationSerial Arm Control in Real Time Presentation
Serial Arm Control in Real Time Presentation
 
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their MainframeDigital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
Digital Banking in the Cloud: How Citizens Bank Unlocked Their Mainframe
 
Public CyberSecurity Awareness Presentation 2024.pptx
Public CyberSecurity Awareness Presentation 2024.pptxPublic CyberSecurity Awareness Presentation 2024.pptx
Public CyberSecurity Awareness Presentation 2024.pptx
 
Driving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success StoryDriving Business Innovation: Latest Generative AI Advancements & Success Story
Driving Business Innovation: Latest Generative AI Advancements & Success Story
 
TrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy SurveyTrustArc Webinar - 2024 Global Privacy Survey
TrustArc Webinar - 2024 Global Privacy Survey
 
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-EfficiencyFreshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
 
Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
 
Digital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying AheadDigital Marketing Trends in 2024 | Guide for Staying Ahead
Digital Marketing Trends in 2024 | Guide for Staying Ahead
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
 

25 лет истории C++, пролетевшей на моих глазах

  • 1. C++ CoreHard Spring 2018 25 years of C++ history flashed in front of my eyes Yauheni Akhotnikau
  • 2. A few words about myself Started programming somewhere in 1990. C++ is the main tool since 1992 with a few short pauses. Was a developer, team-lead, head of software development department. Now a co-founder of small software startup. A dictator behind OpenSource projects SObjectizer and RESTinio. 2
  • 3. Why I'm doing this talk? Some know me as a "C++ advocate". It's because: don't bite the hand feeding you. I've done some investments in C++ and want to protect them. There are too many non-technical obstacles like myths and urban legends. 3
  • 4. The question of life, universe and... How and why C++ became popular? 4
  • 5. Fast growth of popularity 500 users in 1985 400 000 users in 1991 3 000 000+ users at the end of 1990s. "According to IDC, out of 13.1 million developer seats worldwide in 1999, Visual Basic had 7.2 million vs. 3.6 million C/C++ seats and 1.3 million Java seats." quote from Application Development Trends magazine (2001.05.29) 5
  • 7. OOP was a "silver bullet" There is no "silver bullet" but every time something pretends to be it. In 1980s it was OOP. OOP is great technique and significantly simplifies some tasks. 7
  • 8. Easy upgrade from plain C Significant part of C is a subset of C++. Powerful features of C++ can be added to a C program only when needed. Existing C libraries can be easily used from C++. 8
  • 9. Computers were weak Jan 1987. IBM PS/2 Model 70: 16MHz CPU, 6MiB RAM. Oct 1988. The first NeXT computer: 25MHz CPU, 8MiB RAM. Jan 1989. DECstation 3100: 16.7MHz CPU, from 4MiB to 24MiB RAM. Apr 1989. SPARCstation 1: 20MHz CPU, from 4MiB to 64MiB RAM. 9 http://pctimeline.info/workstation/work1987.htm, https://en.wikipedia.org/wiki/DECstation, https://en.wikipedia.org/wiki/SPARCstation_1, http://www.computinghistory.org.uk/det/2586/ibm-ps-2-model-70/
  • 10. As a consequence... There was a strong need for: ● a highly expressive and powerful; ● a very efficient; ● a practical programming language for masses. C++ become that language. 10
  • 11. And another important factor... C++ in mid 1980s was significantly simpler than modern C++ ;) 11
  • 12. Some examples from my own experience How C++ caught myself 12
  • 13. My way in early 1990s Basic ⇒ Pascal ⇒ Turbo Pascal ⇒ C ⇒ C++ Pascal has such useful thing as set. There wasn't such thing in C. And there wasn't a way to implement it. There wasn't such thing in C++ (at 1991). But there was a way to implement it. 13
  • 14. My way in early 1990s Basic ⇒ Pascal ⇒ Turbo Pascal ⇒ C ⇒ C++ Pascal has such useful thing as set. There wasn't such thing in C. And there wasn't a way to implement it. There wasn't such thing in C++ (at 1991). But there was a way to implement it. 14 class int_set { int * items_; ... public: int_set() : items_(new int[initial_capacity]) {...} ~int_set() { delete[] items_; } ... }; int_set operator+(const int_set & a, const int_set & b) {...} int_set operator-(const int_set & a, const int_set & b) {...} int_set operator&(const int_set & a, const int_set & b) {...} int_set received_items; int_set checked_items; ... int_set delayed_items = received_items - checked_items;
  • 15. Linear algebra computations There was a task of solving a system of linear equations. A very special case: symmetric band matrix. 15 X1,1 X1,2 X1,3 X1,4 0 0 0 0 0 0 0 0 0 ... X1,2 X2,2 X2,3 X2,4 X2,5 0 0 0 0 0 0 0 0 ... X1,3 X2,3 X3,3 X3,4 X3,5 X3,6 0 0 0 0 0 0 0 ... X1,4 X2,4 X3,4 X4,4 X4,5 X4,6 X4,7 0 0 0 0 0 0 ... 0 X2,5 X3,5 X4,5 X5,5 X5,6 X5,7 X5,8 0 0 0 0 0 ... 0 0 X3,6 X4,6 X5,6 X6,6 X6,7 X6,8 X6,9 0 0 0 0
  • 16. Linear algebra computations There was a task of solving a system of linear equations. A very special case: symmetric band matrix. 16 X1,1 X1,2 X1,3 X1,4 0 0 0 0 0 0 0 0 0 ... X1,2 X2,2 X2,3 X2,4 X2,5 0 0 0 0 0 0 0 0 ... X1,3 X2,3 X3,3 X3,4 X3,5 X3,6 0 0 0 0 0 0 0 ... X1,4 X2,4 X3,4 X4,4 X4,5 X4,6 X4,7 0 0 0 0 0 0 ... 0 X2,5 X3,5 X4,5 X5,5 X5,6 X5,7 X5,8 0 0 0 0 0 ... 0 0 X3,6 X4,6 X5,6 X6,6 X6,7 X6,8 X6,9 0 0 0 0 class BandMatrix; class RowAccessor { BandMatrix & matrix; unsigned row_index; public: RowAccessor(BandMatrix & m, unsigned i); float & operator[](unsigned j) {...} }; class BandMatrix { float * data; public BandMatrix(unsigned dimension, unsigned band_width) {...}; ... RowAccessor operator[](unsigned i) { return RowAccessor(*this, i); } ... }; BandMatrix m; ... m[i][j] = m[i][j-1] + m[i-1][j] + ...;
  • 17. A bit of history... 30+ years of C++ evolution in one slide 17
  • 18. Just a brief overview 1980s: official release, very quick evolution. 1990s: become a mainstream, the first ISO standard (C++98), lot of incompatible libraries. 2000s: still a mainstream, but the oblivion is started. C++03. Long-term construction C++0x. Boost libraries. LLVM and clang. 2010s: a new hope. C++11, C++14, C++17. C++ Core Guidelines. C++20 on its way... 18
  • 19. Yet more history... Some important notes about 1990s 19
  • 20. 1990s: life without the standard A lot of incompatible "basic" libraries (some of them supplied with compilers). Every big and complex C++ project has its own "standard" library. There could be several independent implementation of String class in one project. 20
  • 21. 1990s: rising of C++ templates STL shows the real power of C++ templates. Java 1.0 in 1995 demonstrated how to "live" without templates/generics. Template metaprogramming was accidentally discovered in 1994. (http://aszt.inf.elte.hu/~gsd/halado_cpp/ch06s04.html#Static-metaprogramming) As consequence: Alexandrescu's "Modern C++ Design" in 2001. C++ will never be the same anymore ;) 21
  • 22. A picture is worth a thousand words Show me the code! 22
  • 23. C++ evolution in simple examples By the help of a simple demo application: ● there is a collection of struct place (each struct contains name, price and rating); ● sort this collection by rating, then by price, then by name. And then print the collection after sorting; ● sort this collection by name, then print it. 23
  • 24. Ancient C++ (pre-C++98) struct place { char * name_; long price_; int rating_; place() : name_(0) {} place(const char * name, long price, int rating) : name_(copy_name(name)), price_(price), rating_(rating) {} place(const place & o) : name_(copy_name(o.name_)), price_(o.price_) , rating_(o.rating_) {} ~place() { delete[] name_; } place & operator=(const place & o) { char * copy = copy_name(o.name_); delete[] name_; name_ = copy; price_ = o.price_; rating_ = o.rating_; return *this; } 24 static char * copy_name(const char * src) { char * r = 0; if(src) { r = new char[strlen(src) + 1]; strcpy(r, src); } return r; } };
  • 25. Ancient C++ (pre-C++98) ostream & operator<<(ostream & to, const place & p) { to << setw(20) << left << p.name_ << "[" << p.rating_ << "]" << setw(7) << right << p.price_; return to; } void print(const place * places, size_t count) { for(size_t i = 0; i != count; ++i) cout << places[i] << endl; cout << endl; } 25
  • 26. Ancient C++ (pre-C++98) int compare_by_rating_price_name(const void * av, const void * bv) { const place & a = *(const place *)av; const place & b = *(const place *)bv; int result; if(a.rating_ < b.rating_) result = -1; else { if(a.rating_ == b.rating_) { if(a.price_ < b.price_) result = -1; else { if(a.price_ == b.price_) result = strcmp(a.name_, b.name_); else result = 1; } } else result = 1; } return result; } 26
  • 27. Ancient C++ (pre-C++98) int compare_by_name(const void * av, const void * bv) { const place & a = *(const place *)av; const place & b = *(const place *)bv; return strcmp(a.name_, b.name_); } 27
  • 28. Ancient C++ (pre-C++98) void get_places(place *& places, size_t & count) { places = new place[7]; places[0] = place("Moscow", 1500, 3); places[1] = place("St. Petersburg", 1300, 5); places[2] = place("Minsk", 500, 4); places[3] = place("Tokyo", 3500, 4); places[4] = place("Sydney", 5000, 3); places[5] = place("Paris", 3000, 5); places[6] = place("London", 3500, 4); count = 7; } 28
  • 29. Ancient C++ (pre-C++98) int main() { place * places; size_t count; get_places(places, count); qsort(places, count, sizeof(place), compare_by_rating_price_name); print(places, count); qsort(places, count, sizeof(place), compare_by_name); print(places, count); delete[] places; } 29
  • 30. Old C++ (C++98/03) using namespace std; struct place { string name_; long price_; int rating_; place() {} place(const char * name, float price, int rating) : name_(name), price_(price), rating_(rating) {} }; 30
  • 31. Old C++ (C++98/03) ostream & operator<<(ostream & to, const place & p) { to << setw(20) << left << p.name_ << "[" << p.rating_ << "]" << setw(7) << right << p.price_; return to; } template<class C> void print(const C & places) { for(typename C::const_iterator i = places.begin(); i != places.end(); ++i) cout << *i << endl; cout << endl; } 31
  • 32. Old C++ (C++98/03) bool compare_by_rating_price_name(const place & a, const place & b) { bool result = false; if(a.rating_ < b.rating_) result = true; else if(a.rating_ == b.rating_) { if(a.price_ < b.price_) result = true; else if(a.price_ == b.price_) result = (a.name_ < b.name_); } return result; } bool compare_by_name(const place & a, const place & b) { return a.name_ < b.name_; } 32
  • 33. Old C++ (C++98/03) vector<place> get_places() { vector<place> places; places.push_back(place("Moscow", 1500, 3)); places.push_back(place("St. Petersburg", 1300, 5)); places.push_back(place("Minsk", 500, 4)); places.push_back(place("Tokyo", 3500, 4)); places.push_back(place("Sydney", 5000, 3)); places.push_back(place("Paris", 3000, 5)); places.push_back(place("London", 3500, 4)); return places; } 33
  • 34. Old C++ (C++98/03) int main() { vector<place> places = get_places(); sort(places.begin(), places.end(), compare_by_rating_price_name); print(places); sort(places.begin(), places.end(), compare_by_name); print(places); } 34
  • 35. Modern C++ (C++17) using namespace std; struct place { string name_; long price_; int rating_; }; 35
  • 36. Modern C++ (C++17) ostream & operator<<(ostream & to, const place & p) { to << setw(20) << left << p.name_ << "[" << p.rating_ << "]" << setw(7) << right << p.price_; return to; } template<class C> void print(const C & places) { for(const auto & p : places) cout << p << endl; cout << endl; } 36
  • 37. Modern C++ (C++17) bool compare_by_rating_price_name(const place & a, const place & b) { return tie(a.rating_, a.price_, a.name_) < tie(b.rating_, b.price_, b.name_); } bool compare_by_name(const place & a, const place & b) { return a.name_ < b.name_; } 37
  • 38. Modern C++ (C++17) vector<place> get_places() { return { {"Moscow", 1500, 3}, {"St. Petersburg", 1300, 5}, {"Minsk", 500, 4}, {"Tokyo", 3500, 4}, {"Sydney", 5000, 3}, {"Paris", 3000, 5}, {"London", 3500, 4} }; } 38
  • 39. Modern C++ (C++17) int main() { auto places = get_places(); sort(begin(places), end(places), compare_by_rating_price_name); print(places); sort(begin(places), end(places), compare_by_name); print(places); } 39
  • 40. Full text of pre-C++98 example 40
  • 41. Full text of C++98 example 41
  • 42. Full text of C++17 example 42
  • 43. 30 years of C++ evolution in a picture 43
  • 44. Nothing can last forever How C++ lost its popularity? 44
  • 45. Computers become strong 1997-1999. Cheap PCs with: ● Intel or AMD processors at 200, 266, 300, 350 and more MHz; ● dozens or even hundreds of MiB of RAMs. 10x growth of execution speed in 10 years. New slogan: "CPU and memory is not a resource". As a result: Java is not slow anymore (you can use name of any safe language with GC instead of Java: Python, SmallTalk, Scheme and so on). 45
  • 46. Programmer's productivity matters C++ is not safe: ● no run-time checks; ● a lot of UB. C++ requires an attention for a lot of details. Manual memory management vs Garbage collection. It's hard to support C++ in IDE. No batteries included. No dependency manager. Incompatible libraries. 46
  • 47. New "hot" niches 1980s and early 1990s: desktop & GUI applications. Late 1990s and early 2000s: Internet/WWW + server-side. Late 2000s and 2010s: mobile. 47
  • 48. Free lunch is over or... Is there a place for C++ today? 48
  • 49. C++ is (and always was) a niche language The niche for C++ is a software systems which are: ● complex enough to require a powerful and high level language and ● have strict requirements to performance and/or resource consumption. Yet another feature of this niche: ● there is no place for quick-and-dirty solutions! 49
  • 50. Where C++ can be used now? High performance computing (weather forecasting, molecular modeling, physic simulation, big-data, machine learning, ...) Low resource consumption apps (mobile application, internet of things, ...) System programming and around (OS kernels, drivers and utilities, middleware, compilers, antiviruses, ...) Real-time and embedded systems (SCADA, industrial internet of things, avionics, automotive, finance, telecom, defense, ...) Complex desktop applications (CADs, photoshop, AAA games, browsers, office apps, ...) Cross-platform apps (app's kernel in C++ + GUI in native technology (Dropbox's jinie), ...) 50
  • 51. Another important question Why C++'s case is so unique? 51
  • 52. There are not many similar examples C++ is one of the few languages that: ● has many years history of history; ● has an international standard and several live and evolving compilers; ● has a legacy of enormous size; ● is still widely used; ● is still under the active development; ● has no single owner (or just big corporation behind it). I can remember only Cobol, FORTRAN and Ada. 52
  • 53. What does it mean? You can't just stop using C++ and rewrite all C++ code in another modern language. You can't just throw out any part of the language. You can't leave just one C++ compiler and kill all the other C++ compilers. You can't force all C++ developers to use one "right" code style. You can't force all C++ developers to use one set of "right" tools (like libraries, dependency managers or build tools). 53
  • 54. Just remember: C++ is community driven language 54
  • 55. That's all! Thank you! Yauheni Akhotnikau, StiffStream https://stiffstream.com eao197@stiffstream.com 55