MILAN 21.11.2015 - Marco Arena Perché nel 2015 parliamo ancora di C++? Marco Arena - Webshell MILAN 21.11.2015 - Marco Arena
Apr 15, 2017
MILAN 21.11.2015 - Marco Arena
Perché nel 2015 parliamo ancora di C++?
Marco Arena - Webshell
MILAN 21.11.2015 - Marco Arena
MILAN 21.11.2015 - Marco Arena
Chi sono
• 28 anni, romano, laureato in Ingegneria Informatica
•Da 4+ anni sviluppo software per una Scuderia di F1 italiana
•Nel 2013 ho fondato ++it, la comunità italiana dedicata al C++
https://marcoarena.wordpress.com/
MILAN 21.11.2015 - Marco Arena
++it -> Italian C++ Community
Social e Gruppi di
Discussione
Spazio per i
principianti
Risorse Consigliate
News e
Newsletter Mensile
Offerte di Lavoro
Meetup, Eventi e
Partecipazioni
Piattaforma per
pubblicare articoliwww.italiancpp.org
MILAN 21.11.2015 - Marco Arena
Perché nel 2015 parliamo ancora di C++?
MILAN 21.11.2015 - Marco Arena
Riassunto delle puntate precedenti
Anni ’70, Bell Labs: Nasce il C, l‘assembly portabile
MILAN 21.11.2015 - Marco Arena
Riassunto delle puntate precedenti
Anni ’80, Bell Labs: nasce il C++ e dominerà gli anni ‘90
MILAN 21.11.2015 - Marco Arena
Riassunto delle puntate precedenti
Anni 2000: il C++ non è la risposta allo sviluppo Web
MILAN 21.11.2015 - Marco Arena
Riassunto delle puntate precedenti
RETURN C++
A long time ago, on a
compiler far far away…
OF
THE
MILAN 21.11.2015 - Marco Arena
Riassunto delle puntate precedenti
MILAN 21.11.2015 - Marco Arena
Top 100 Android Playstore Apps (U.S.)
Non posso pubblicare questi dati!
Puoi trovarli presso la fonte ufficiale (slide 15):
https://github.com/CppCon/CppCon2015/tree/master/Presentations/What's%20New%20In%20VS2015
MILAN 21.11.2015 - Marco Arena
Riassunto delle puntate precedenti
11
MILAN 21.11.2015 - Marco Arena
http://cpp-lang.io/30-years-of-cpp-bjarne-stroustrup/
MILAN 21.11.2015 - Marco Arena
Perché nel 2015 parliamo ancora di C++?
MILAN 21.11.2015 - Marco Arena
Segreto #0: È molto polare
Fon
te: ww
w.tio
be.co
m/in
dex.p
hp
/con
tent/p
aperin
fo/tp
ci/ind
ex.htm
l
Fonte: http://www.stroustrup.com/applications.html
MILAN 21.11.2015 - Marco Arena
Segreto #0: È molto popolare
Fonte: http://stackoverflow.com/research/developer-survey-2015
MILAN 21.11.2015 - Marco Arena
Segreto #1: È compatibile con il C
Rea
lizza
to t
ram
ite
htt
p:/
/jib
jab
.co
m
MILAN 21.11.2015 - Marco Arena
Segreto #2: Si preoccupa del passato
MILAN 21.11.2015 - Marco Arena
“So just as C++ ‘won’ in the 90s because of its own
strengths plus its C compatibility, C++11 is being adopted
because of its own strengths plus its C++98 compatibility.”
Herb Sutter
Segreto #2: Si preoccupa del passato
MILAN 21.11.2015 - Marco Arena
Segreto #2: Si preoccupa del passato
"Semplificazione tramite aggiunta di complessità"
vector<Foo> v;
for(vector<Foo>::iterator it = v.begin(); it != v.end(); ++it) { // C++98// use *it
}
for (auto it = begin(v); it != end(v); ++it) { // C++11// use *it
}
for(const auto& i : v) { // Modern C++// use i
}
MILAN 21.11.2015 - Marco Arena
Segreto #3: Non è garbage collected
MILAN 21.11.2015 - Marco Arena
Segreto #3: Non è garbage collected
• Di default il lifetime di oggetti/variabili è scoped ((de)allocazione automatica)
• ~distruttore() = meccanismo di UNDO general-purpose(e.g. acquisizione/rilascio di risorse – RAII)
{
ifstream file{"hello.txt"};
// ...
} // file.close(); automatico
MILAN 21.11.2015 - Marco Arena
Segreto #3: Non è garbage collected
• Di default il lifetime di oggetti/variabili è scoped ((de)allocazione automatica)
• ~distruttore() = meccanismo di UNDO general-purpose(e.g. acquisizione/rilascio di risorse – RAII)
class widget { gadget g;
};
void do_work() { auto x = …;
auto y = …;
}
Finalizzazione Deterministica:
• A prova di eccezione
• Generazione automatica (member-wise)
• In ordine (inverso a quello di definizione)
// fatto in automatico
~widget() {
g.~gadget();
}~y();
~x();
MILAN 21.11.2015 - Marco Arena
Segreto #3: Non è garbage collected
• Di default il lifetime di oggetti/variabili è scoped ((de)allocazione automatica)
• ~distruttore() = meccanismo di UNDO general-purpose(e.g. acquisizione/rilascio di risorse – RAII)
class widget { gadget g;
};
void do_work() { auto x = …;
auto y = …;
}
Finalizzazione Deterministica:
• A prova di eccezione
• Generazione automatica (member-wise)
• In ordine (inverso a quello di definizione)
MILAN 21.11.2015 - Marco Arena
Segreto #3: Non è garbage collectedIn alcuni casi il Garbage Collector può complicarti la vita, esempi:
• Sistemi latency-critical (e.g. non vuoi che il GC salti fuori senza controllo)
• Il rilascio di risorse dev’essere deterministico (e.g. files & threads)
http://samsaffron.com/archive/2011/10/28/in-managed-code-we-trust-our-recent-battles-with-
the-net-garbage-collector
Una storia vera:Stack Overflow vs .NET Garbage Collector
MILAN 21.11.2015 - Marco Arena
Segreto #4: È indipendente dal paradigma
Il miglior combattente non è un pugile, un
karateka o un judoka. Il miglior combattente è
qualcuno che si può adattare a qualsiasi stile
di combattimento.
Bruce Lee
MILAN 21.11.2015 - Marco Arena
void rotate_and_draw(vector<Shape*>& vs, int r){
for_each(vs.begin(), vs.end(), [](Shape* p) {p->rotate(r);
});
for (Shape* p : vs)p->draw();
}
Segreto #4: È indipendente dal paradigma
MILAN 21.11.2015 - Marco Arena
void rotate_and_draw(vector<Shape*>& vs, int r){
for_each(vs.begin(), vs.end(), [](Shape* p) {p->rotate(r);
});
for (Shape* p : vs)p->draw();
}
Segreto #4: È indipendente dal paradigma
Object-Oriented
Generic Funzionale(una specie )
Procedurale
MILAN 21.11.2015 - Marco Arena
Segreto #4: È indipendente dal paradigma
int sum = accumulate(ints(1)
| transform([](int i){ return i*i; })| take(10), 0);
Fonte (range V3 di Eric Niebler): https://ericniebler.github.io/range-v3/
MILAN 21.11.2015 - Marco Arena
Fonte: http://www.agileday.it/front/sessioni-2014/#iop_vs_oop
public void CatchExceptions_IF(){
var promocode = new PromocodeStatusIF();try{
promocode.Apply("g128g7d2g");}catch (AlreadyUsedPromocodeException){
Assert.Pass("Already used");}catch (ExpiredPromocodeException){
Assert.Pass("Expired");} catch (NotValidPromocodeException){
Assert.Pass("Not valid");}Assert.Fail("no exception");
}
public void RemoveCatchExceptionsAndUseMessages_NOIF(){
var promocode = new PromocodeStatus();promocode
.AlreadyUsed(() = > Assert.Pass("Already used"))
.Expired(() = > Assert.Pass("Expired"))
.NotValid(() = > Assert.Pass("Not valid"))
.Apply("g128g7d2g");
Assert.Fail("cannot handle this promocode");}
int main(){
PromocodeStatus{}.AlreadyUsed([] { Assert::Pass("Already used"); }).Expired([] { Assert::Pass("Expired"); }).NotValid([] {Assert::Pass("NotValid"); }).Apply("g128g7d2g");
Assert::Fail("cannot handle this promocode");}
Bonus: Anti-IF in C#
Fonte: http://www.italiancpp.org/2014/11/23/anti-if-idioms-in-cpp/
MILAN 21.11.2015 - Marco Arena
// Go
func SomeFuntion()
{
defer func() {
Log("SomeFunction executed")
}
... Anything ...
}
Segreto #4: È indipendente dal paradigma – Go’s defer
MILAN 21.11.2015 - Marco Arena
// C++
void SomeFuntion()
{
defer d { [] {
Log("SomeFunction executed");
}};
... Anything ...
}
Segreto #4: È indipendente dal paradigma – Go’s defer
Implementazione: http://www.italiancpp.org/2013/07/16/defer-con-raii-lambda/
MILAN 21.11.2015 - Marco Arena
Segreto #5: È adatto alla Systems Programming
MILAN 21.11.2015 - Marco Arena
Segreto #5: È adatto alla Systems Programming
Di default:•Buone/ottime prestazioni ("You don’t pay, at runtime, for what you don’t use" - 0-overhead principle)
•Allocazione su stack & move semantics
• Finalizzazione deterministica
• Contiguità
• Cross-platform
MILAN 21.11.2015 - Marco Arena
stackheapstackheap
ptrptrptr
stack heap
Fonte: http://channel9.msdn.com/Events/Build/2014/2-661
Segreto #5: È adatto alla Systems Programming - Contiguità
MILAN 21.11.2015 - Marco Arena
Segreto #5: È adatto alla Systems Programming
Di default:•Buone/ottime prestazioni ("You don’t pay, at runtime, for what you don’t use" - 0-overhead principle)
•Allocazione su stack & move semantics
• Finalizzazione deterministica
• Contiguità
• Cross-platform
MILAN 21.11.2015 - Marco Arena
Cross-Platform: C++ come denominatore comune
• Riuso• Performance• Sicurezza
MILAN 21.11.2015 - Marco Arena
Segreto #5: È adatto alla Systems Programming
Di default:•Buone/ottime prestazioni ("You don’t pay, at runtime, for what you don’t use" - 0-overhead principle)
•Allocazione su stack & move semantics
• Finalizzazione deterministica
• Contiguità
• Cross-platform
Se serve, controllo efficiente e completo di:• Lifetime dei tuoi oggetti (copy, move, …)
• Hardware e risorse del SO (non sempre portabile)
• Data Layout (PODs, …)
• Program size
• In generale: "Fine tuning"
MILAN 21.11.2015 - Marco Arena
Segreto #6: Sta crescendo in fretta
MILAN 21.11.2015 - Marco Arena
Segreto #6: Sta crescendo in fretta
MILAN 21.11.2015 - Marco Arena
L’evoluzione non si ferma al linguaggio:
•Compilatori (VC++, Clang, GCC, …)
•Tools (VAssistX, Clang Refactoring, …)
•Librerie (boost, POCO, Qt, …)
•Risorse (Stroustrup, Meyers, …)
•…
Segreto #6: Sta crescendo in fretta
MILAN 21.11.2015 - Marco Arena
Il C++ è complicato?
MILAN 21.11.2015 - Marco Arena
No.
MILAN 21.11.2015 - Marco Arena
Il C++ è molto complicato.
MILAN 21.11.2015 - Marco Arena
Il C++ è molto complicato
MILAN 21.11.2015 - Marco Arena
Troppo spesso viene "aperto il cofano" quando non serve
Il C++ è molto complicato
MILAN 21.11.2015 - Marco Arena
Non è un linguaggio che si impara su Stack Overflow
Il C++ è molto complicato
MILAN 21.11.2015 - Marco Arena
Il C++ è molto complicato
C++11
language
C# 3.0 (2008)Java 7 (2011)
C++11
library
Fonte: http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/C-11-VC-11-and-Beyond
MILAN 21.11.2015 - Marco Arena
WG21
Fonte: http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/C-11-VC-11-and-Beyond
Il C++ è molto complicato
MILAN 21.11.2015 - Marco Arena
Standardizzare tutto quello che il C++ si è perso negli ultimi 10 anni
(Concorrenza, Parallelismo, Networking, Reflection, …)
Migliorare/arricchire/uniformare aspetti e strumenti propri del linguaggio
(Concepts, Moduli, Ranges, …)
Promuovere e «formalizzare»la diffusione di Guidelines sul «buon» C++
(https://github.com/isocpp/CppCoreGuidelines)
Cosa ci riserva il futuro?
MILAN 21.11.2015 - Marco Arena
Segreto #7: Ha un ecosistema straordinario
++it Meetup Bologna (Novembre 2014)
CppCon 2014 (Settembre 2014)
MILAN 21.11.2015 - Marco Arena
Segreto #7: Ha un ecosistema straordinario
MILAN 21.11.2015 - Marco Arena
Segreto #7: Ha un ecosistema straordinario
isocpp.orgcppcon.org
MILAN 21.11.2015 - Marco Arena
Quindi perché nel 2015 parliamo ancora di C++?
MILAN 21.11.2015 - Marco Arena
Perché nel 2015 parliamo ancora di C++?
È molto popolare
È compatibile con il C
Si preoccupa del passato
Non è garbage collected
È indipendente dal paradigma
È adatto alla Systems Programming
Sta crescendo in fretta
Ha un ecosistema straordinario
MILAN 21.11.2015 - Marco Arena
A general-purpose programming language with a bias towards
systems programming that is:
• a better C
• supports data abstraction
• supports object-oriented programming
• supports generic programming
It is defined by an ISO standard, offers stability over decades, and has a large and lively user community.
Bonus: Cos’è il C++?
Bjarne Stroustruphttp://www.stroustrup.com/bs_faq.html#what-is
MILAN 21.11.2015 - Marco Arena
Leave your feedback on Joind.in!
https://m.joind.in/event/codemotion-milan-2015
MILAN 21.11.2015 - Marco Arena
MILAN 21.11.2015 - Marco Arena
Grazie!