SlideShare a Scribd company logo
1 of 55
Download to read offline
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 ...
0 0 0 X4,7
X5,7
X6,7
X7,7
X7,8
X7,9
X7,10
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 ...
0 0 0 X4,7
X5,7
X6,7
X7,7
X7,8
X7,9
X8,10
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

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
 
Solved exercise boolean-algebra
Solved exercise boolean-algebraSolved exercise boolean-algebra
Solved exercise boolean-algebrashardapatel
 
Class 18: Measuring Cost
Class 18: Measuring CostClass 18: Measuring Cost
Class 18: Measuring CostDavid Evans
 
79ecb3d9 65f4-4161-b97d-63711df5d6c5
79ecb3d9 65f4-4161-b97d-63711df5d6c579ecb3d9 65f4-4161-b97d-63711df5d6c5
79ecb3d9 65f4-4161-b97d-63711df5d6c5spoider
 
Game modeling
Game modelingGame modeling
Game modelingpriyank09
 
Coq for ML users
Coq for ML usersCoq for ML users
Coq for ML userstmiya
 
12X1 T01 03 integrating derivative on function
12X1 T01 03 integrating derivative on function12X1 T01 03 integrating derivative on function
12X1 T01 03 integrating derivative on functionNigel Simmons
 
Fractal Rendering in Developer C++ - 2012-11-06
Fractal Rendering in Developer C++ - 2012-11-06Fractal Rendering in Developer C++ - 2012-11-06
Fractal Rendering in Developer C++ - 2012-11-06Aritra Sarkar
 
Faster Practical Block Compression for Rank/Select Dictionaries
Faster Practical Block Compression for Rank/Select DictionariesFaster Practical Block Compression for Rank/Select Dictionaries
Faster Practical Block Compression for Rank/Select DictionariesRakuten Group, Inc.
 
MiamiJS - The Future of JavaScript
MiamiJS - The Future of JavaScriptMiamiJS - The Future of JavaScript
MiamiJS - The Future of JavaScriptCaridy Patino
 
Fast Identification of Heavy Hitters by Cached and Packed Group Testing
Fast Identification of Heavy Hitters by Cached and Packed Group TestingFast Identification of Heavy Hitters by Cached and Packed Group Testing
Fast Identification of Heavy Hitters by Cached and Packed Group TestingRakuten Group, Inc.
 

What's hot (17)

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...
 
Solved exercise boolean-algebra
Solved exercise boolean-algebraSolved exercise boolean-algebra
Solved exercise boolean-algebra
 
Class 18: Measuring Cost
Class 18: Measuring CostClass 18: Measuring Cost
Class 18: Measuring Cost
 
6th Semester (December; January-2014 and 2015) Computer Science and Informati...
6th Semester (December; January-2014 and 2015) Computer Science and Informati...6th Semester (December; January-2014 and 2015) Computer Science and Informati...
6th Semester (December; January-2014 and 2015) Computer Science and Informati...
 
79ecb3d9 65f4-4161-b97d-63711df5d6c5
79ecb3d9 65f4-4161-b97d-63711df5d6c579ecb3d9 65f4-4161-b97d-63711df5d6c5
79ecb3d9 65f4-4161-b97d-63711df5d6c5
 
MATHS SYMBOLS - #8 - LOGARITHMS, CHANGE of BASE - PROOFS
MATHS SYMBOLS - #8 - LOGARITHMS, CHANGE of BASE - PROOFSMATHS SYMBOLS - #8 - LOGARITHMS, CHANGE of BASE - PROOFS
MATHS SYMBOLS - #8 - LOGARITHMS, CHANGE of BASE - PROOFS
 
Game modeling
Game modelingGame modeling
Game modeling
 
Coq for ML users
Coq for ML usersCoq for ML users
Coq for ML users
 
6th Semester (Dec-2015; Jan-2016) Computer Science and Information Science En...
6th Semester (Dec-2015; Jan-2016) Computer Science and Information Science En...6th Semester (Dec-2015; Jan-2016) Computer Science and Information Science En...
6th Semester (Dec-2015; Jan-2016) Computer Science and Information Science En...
 
12X1 T01 03 integrating derivative on function
12X1 T01 03 integrating derivative on function12X1 T01 03 integrating derivative on function
12X1 T01 03 integrating derivative on function
 
4th Semester (Dec-2015; Jan-2016) Computer Science and Information Science En...
4th Semester (Dec-2015; Jan-2016) Computer Science and Information Science En...4th Semester (Dec-2015; Jan-2016) Computer Science and Information Science En...
4th Semester (Dec-2015; Jan-2016) Computer Science and Information Science En...
 
Fractal Rendering in Developer C++ - 2012-11-06
Fractal Rendering in Developer C++ - 2012-11-06Fractal Rendering in Developer C++ - 2012-11-06
Fractal Rendering in Developer C++ - 2012-11-06
 
Faster Practical Block Compression for Rank/Select Dictionaries
Faster Practical Block Compression for Rank/Select DictionariesFaster Practical Block Compression for Rank/Select Dictionaries
Faster Practical Block Compression for Rank/Select Dictionaries
 
MiamiJS - The Future of JavaScript
MiamiJS - The Future of JavaScriptMiamiJS - The Future of JavaScript
MiamiJS - The Future of JavaScript
 
6th Semester (June; July-2014) Computer Science and Information Science Engin...
6th Semester (June; July-2014) Computer Science and Information Science Engin...6th Semester (June; July-2014) Computer Science and Information Science Engin...
6th Semester (June; July-2014) Computer Science and Information Science Engin...
 
6th semester Computer Science and Information Science Engg (2013 December) Qu...
6th semester Computer Science and Information Science Engg (2013 December) Qu...6th semester Computer Science and Information Science Engg (2013 December) Qu...
6th semester Computer Science and Information Science Engg (2013 December) Qu...
 
Fast Identification of Heavy Hitters by Cached and Packed Group Testing
Fast Identification of Heavy Hitters by Cached and Packed Group TestingFast Identification of Heavy Hitters by Cached and Packed Group Testing
Fast Identification of Heavy Hitters by Cached and Packed Group Testing
 

Similar to 25 Years of C++ History Flashed in Front of My Eyes

GECon2017_Cpp a monster that no one likes but that will outlast them all _Ya...
GECon2017_Cpp  a monster that no one likes but that will outlast them all _Ya...GECon2017_Cpp  a monster that no one likes but that will outlast them all _Ya...
GECon2017_Cpp a monster that no one likes but that will outlast them all _Ya...GECon_Org Team
 
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them allGECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them allYauheni Akhotnikau
 
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 Centrejatin batra
 
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
 
ESL Anyone?
ESL Anyone? ESL Anyone?
ESL Anyone? DVClub
 
Project seminar ppt_steelcasting
Project seminar ppt_steelcastingProject seminar ppt_steelcasting
Project seminar ppt_steelcastingRudra Narayan Paul
 
Anomalies in X-Ray Engine
Anomalies in X-Ray EngineAnomalies in X-Ray Engine
Anomalies in X-Ray EnginePVS-Studio
 
Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...
Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...
Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...Igalia
 
Language Language Models (in 2023) - OpenAI
Language Language Models (in 2023) - OpenAILanguage Language Models (in 2023) - OpenAI
Language Language Models (in 2023) - OpenAISamuelButler15
 
Tiramisu をちょっと、味見してみました。
Tiramisu をちょっと、味見してみました。Tiramisu をちょっと、味見してみました。
Tiramisu をちょっと、味見してみました。Mr. Vengineer
 
Introduction to Coding
Introduction to CodingIntroduction to Coding
Introduction to CodingFabio506452
 
Machine Learning and Go. Go!
Machine Learning and Go. Go!Machine Learning and Go. Go!
Machine Learning and Go. Go!Diana Ortega
 
The Joy of ServerSide Swift Development
The Joy  of ServerSide Swift DevelopmentThe Joy  of ServerSide Swift Development
The Joy of ServerSide Swift DevelopmentGiordano 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 DevelopmentGiordano 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 DevelopmentGiordano Scalzo
 
Task based Programming with OmpSs and its Application
Task based Programming with OmpSs and its ApplicationTask based Programming with OmpSs and its Application
Task based Programming with OmpSs and its ApplicationFacultad de Informática UCM
 

Similar to 25 Years of C++ History Flashed in Front of My Eyes (20)

GECon2017_Cpp a monster that no one likes but that will outlast them all _Ya...
GECon2017_Cpp  a monster that no one likes but that will outlast them all _Ya...GECon2017_Cpp  a monster that no one likes but that will outlast them all _Ya...
GECon2017_Cpp a monster that no one likes but that will outlast them all _Ya...
 
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them allGECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
 
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
 
Modern C++
Modern C++Modern C++
Modern C++
 
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)
 
Return of c++
Return of c++Return of c++
Return of c++
 
ESL Anyone?
ESL Anyone? ESL Anyone?
ESL Anyone?
 
01_intro-cpp.ppt
01_intro-cpp.ppt01_intro-cpp.ppt
01_intro-cpp.ppt
 
01_intro-cpp.ppt
01_intro-cpp.ppt01_intro-cpp.ppt
01_intro-cpp.ppt
 
Project seminar ppt_steelcasting
Project seminar ppt_steelcastingProject seminar ppt_steelcasting
Project seminar ppt_steelcasting
 
Anomalies in X-Ray Engine
Anomalies in X-Ray EngineAnomalies in X-Ray Engine
Anomalies in X-Ray Engine
 
Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...
Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...
Community-driven Language Design at TC39 on the JavaScript Pipeline Operator ...
 
Language Language Models (in 2023) - OpenAI
Language Language Models (in 2023) - OpenAILanguage Language Models (in 2023) - OpenAI
Language Language Models (in 2023) - OpenAI
 
Tiramisu をちょっと、味見してみました。
Tiramisu をちょっと、味見してみました。Tiramisu をちょっと、味見してみました。
Tiramisu をちょっと、味見してみました。
 
Introduction to Coding
Introduction to CodingIntroduction to Coding
Introduction to Coding
 
Machine Learning and Go. Go!
Machine Learning and Go. Go!Machine Learning and Go. Go!
Machine Learning and Go. Go!
 
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
 
Task based Programming with OmpSs and its Application
Task based Programming with OmpSs and its ApplicationTask based Programming with OmpSs and its Application
Task based Programming with OmpSs and its Application
 

More from Yauheni Akhotnikau

arataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world examplearataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world exampleYauheni Akhotnikau
 
Actor Model and C++: what, why and how? (March 2020 Edition)
Actor Model and C++: what, why and how? (March 2020 Edition)Actor Model and C++: what, why and how? (March 2020 Edition)
Actor Model and C++: what, why and how? (March 2020 Edition)Yauheni Akhotnikau
 
What is SObjectizer 5.7 (at v.5.7.0)
What is SObjectizer 5.7 (at v.5.7.0)What is SObjectizer 5.7 (at v.5.7.0)
What is SObjectizer 5.7 (at v.5.7.0)Yauheni Akhotnikau
 
What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)Yauheni Akhotnikau
 
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...Yauheni Akhotnikau
 
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...Yauheni Akhotnikau
 
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...Yauheni Akhotnikau
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Yauheni Akhotnikau
 
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesDive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesYauheni Akhotnikau
 
Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?Yauheni Akhotnikau
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Yauheni Akhotnikau
 
Dive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsDive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: DispatchersDive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: DispatchersYauheni Akhotnikau
 
What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9Yauheni Akhotnikau
 
Dive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message LimitsDive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message LimitsYauheni Akhotnikau
 
Dive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous InteractionDive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous InteractionYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: TimersDive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: TimersYauheni Akhotnikau
 
What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8Yauheni Akhotnikau
 

More from Yauheni Akhotnikau (20)

arataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world examplearataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world example
 
Actor Model and C++: what, why and how? (March 2020 Edition)
Actor Model and C++: what, why and how? (March 2020 Edition)Actor Model and C++: what, why and how? (March 2020 Edition)
Actor Model and C++: what, why and how? (March 2020 Edition)
 
What is SObjectizer 5.7 (at v.5.7.0)
What is SObjectizer 5.7 (at v.5.7.0)What is SObjectizer 5.7 (at v.5.7.0)
What is SObjectizer 5.7 (at v.5.7.0)
 
What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)
 
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
 
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
 
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesDive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
 
Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?
 
Dive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsDive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message Chains
 
Dive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: DispatchersDive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: Dispatchers
 
What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9
 
Dive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message LimitsDive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message Limits
 
Dive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous InteractionDive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous Interaction
 
Dive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: TimersDive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: Timers
 
What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8
 

Recently uploaded

EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作qr0udbr0
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Natan Silnitsky
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfLivetecs LLC
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Matt Ray
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...Technogeeks
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfStefano Stabellini
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noidabntitsolutionsrishis
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 

Recently uploaded (20)

EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdf
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdf
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
 

25 Years of C++ History Flashed in Front of My Eyes

  • 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 ... 0 0 0 X4,7 X5,7 X6,7 X7,7 X7,8 X7,9 X7,10 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 ... 0 0 0 X4,7 X5,7 X6,7 X7,7 X7,8 X7,9 X8,10 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