c# 5 versus java 8... quand c++ 11 s'invite à la fête
TRANSCRIPT
C# 5 vs Java 8 … Quand C++ 11 s’invite à la fête
Fabrice JEAN-FRANCOIS – Novencia TS
EnvironnementJava, C#,C++ : Architectures, plateformes et évolutions
PrésentationJava, C#,C++ : Architectures et évolutions
MICROSOFT.NET
Depuis octobre 2013, Framework 4.5.1 : - surtout des fonctionnalités d’infrastructures (ASP.NET suspend state, amélioration Garbage Collect, …) et programmation en parallèle à VS 2013 - de nouveaux types et API à la marge
Microsoft.NET : vue d’ensemble
Sources Microsoft
.NET 4.5 vis-à-vis de .NET 4
Sources Microsoft
DLR : fonctionnement
Sources Microsoft
C++ et .NET dans la stratégie Microsoft (1/2)
Sources Microsoft
Coup d’œil dans le Windows StoreXAML, C++, WinJS
Sources Microsoft
C++ et .NET dans la stratégie Microsoft (2/2)
Même si HTML5/Javascript est proposée en véritable alternative et poussé par Microsoft… Windows est codé sur un noyau
C++/C/Assembleur… Idem pour WinRT WinRT est en réalité une évolution de COM C++/CX pour WinRT ou C++ et WRL C#, VB.NET, C++ ou C++/CLI pour applications
de bureau .NET Native pour compiler en natif via C# !! (En
preview pour le moment, pour le Windows Store)
PrésentationJava, C#,C++ : Architectures et évolutions
JAVA
Java JSE 8 : vue d’ensemble
Sources Oracle
JVM
JSE 8
Java JEE 7 : vue d’ensemble 1/2
Sources Oracle
Java JEE 7 : vue d’ensemble 2/2
Sources Oracle
Les évolutions de JEE
Sources Oracle
PrésentationJava, C#,C++ : Architectures et évolutions
C++
Normalisation du C++
C++ Standards Commitee Evolution 1998 C++ devient standard ISO (c++
98) 2003 : TC1 = Corrections C++ 98, notion
POD 2005 : TR1 = Librairie Technical Report 1 2008 : Drafts C++ Ox 2011 : Approbation du standard C++ Ox
qui devient C++ 11
Template meta-programming
Des macros et de goto !
C’est du C !
Un langage orienté objet compliqué !
Bas niveau !
Non sécurisée, dangereux !
Code dur à maintenir
Code crado mais je continue sur le même modèle…
Compliqué à apprendre !
cast
pointers
Un bon code
principes et techniques
Structure de données compactes et efficaces
le style C++ 11
gestion des erreurs
C++ : mythes et réalités
Sources Microsoft
Tourne à peu près partout (WOCA)… Il y a même un NDK Android !
Utilisé pour la création des OS (avec le C et
assembleur) V8 de Google est en C++ Chakra Engine de Microsoft codé en C++
Et surtout offre le plus de souplesse et puissance (mais exige un temps de développement plus long et des compétences langages accrues)
Surtout C++
C++ et ses librairies
Elles sont très nombreuses Multi-objectif : pas que du graphique Contrairement à ce que présupposent des développeurs non
C++, elles peuvent concurrencer sans encombre du JEE, .NET
ATLMFC
STLUNO
Les langagesJava 8, C# 5… C++11
Différences structurelles
C# compile le MSIL en binaire avant l’execution (précompilation via Ngen)
Plusieurs implémentations/profils de JVM : Hotspot, JRockit, etc. Java est résolument multiplateformes:
Write once, run everywhere /anywhere C++ se retrouve partout (woca) .NET est résolument multi-langages (les implémentations Mono, FreeBSD
n’ont pas de communes mesures avec l’implémentation Microsoft) C# est à mi-chemin entre C++ et Java:
Manipulation de pointeurs, surcharge d’opérateurs Delegate pour les pointeurs de fonctions Type signés/non signés Struct, etc Paramètre optionnels
La gestion des exceptions Java est plus fine Exceptions « Error » : problèmes liés à l’environnement (ex: OutOfMemoryError) RuntimeException : exceptions « unchecked »
Checked exception : ces exceptions doivent être traitées ou propagées.
Différences structurelles
C# n’est qu’un des langages de la plateforme .NET Par rapport à VB.NET:
▪ Structure With, Notion de ModuleEspace de nom Microsoft.VisualBasic ▪ XML Literal, Support du mot-clé When dans le bloc Catch ▪ Mot clés My (appel WMI, IO…) et MyClass (Me = this, MyBase = base) , etc.
Par rapport à F#:▪ Programmation fonctionnelle (non impérative)▪ LOP (Langage Oriented Programming)▪ Lexing et Parsing (FsLex et FxYacc) …
Par rapport à C++/CLI:▪ C++/CLI ne supporte pas LINQ▪ Mais il permet une interopérabilité totale avec C++
Ce petit monde est interopérable C# peut appeler des fonctions exportées binaires via P/Invoke C# peut appeler du C++ via C++/CLI Java peut appeler des fonctions exportées binaires via JNA Java peut appeler du C++ via JNI C++ peut appeler des composants .NET grâce à C++/CLI C++ peut appeler du Java via JNI
DEMO Java/ C#/C++
Mots clés – Les différences
C# Java
public public
protected
private private
internal Ne rien mettre
protected internal protected
Visibilité
C++ se contente de public/protected/private, n’a pas la notion de package/assembly mais offre énormément plus de possibilités au niveau conceptualisation POO (et donc visibilité)
Mots clés Les différences Java/C# (2/3)
C# Java C# Java C# Java
as X explicit X lock synchronized
base super extern native namespace
package
bool boolean fixed X object
byte/ushort/ulong…
± Java 8 foreach for operator X
checked X get X out X
const const goto goto override
decimal implicit X params …
delegate Java 8 in X partial X
event ± Java 8 is instanceof readonly finalMot « réservé » mais inexistant dans le langage
Géré par des interfaces, classes, annotation / attribute
C# Java C# Java C# Java
ref X uint, ulong, ushort
X : implements
sbyte/short/long…
byte/short/long…
unchecked X X strictfp
sealed final unsafe X X throws
set X using import transient
sizeof X value X X assert
stackalloc X virtual async X
string where extends await X
struct X yield X
typeof X : extendsMot « réservé » mais inexistant dans le langage
Géré par des interfaces, classes, annotation / attribute
Mots clés Les différences Java/C# (3/3)
Mots clés C++alignas (depuis C++11)alignof (depuis C++11)andand_eqasmauto(modification C++11)bitandbitorboolbreakcasecatchcharchar16_t (depuis C++11)char32_t (depuis C++11)classcomplconstconstexpr (depuis C++11)const_castcontinuedecltype (depuis C++11)default(modification C++11)delete(modification C++11)dodoubledynamic_castelse
enumexplicitexport(1)externfalsefloatforfriendgotoifinlineintlongmutablenamespacenewnoexcept (depuis C++11)notnot_eqnullptr (depuis C++11)operatororor_eqprivateprotectedpublicregisterreinterpret_cast
returnshortsignedsizeofstaticstatic_assert (depuis C++11)static_caststructswitchtemplatethisthread_local (depuis C++11)throwtruetrytypedeftypeidtypenameunionunsignedusing(modification C++11)virtualvoidvolatilewchar_twhilexorxor_eq
Evolution des langagesJava 8, C# 5… C++11
Les grandes orientations
Vers une simplification du code En minimisant les pertes de
performance En garantissant la stabilité Des concepts avancés
Covariance/Contravariance Lambdas Closure Generics (template)…
Parallélisme, threads Asynchronisme Interaction avec d’autres langages Renforcement des API
Pour appréhender closures/lambdas et POO avancée
Des concepts objets et C++ Pointeurs de fonction Foncteurs (Function Object) Prédicats, Unary Functions, etc Covariance Contravariance
Et un peu d’Assembleur pour redescendre sur terre !
DEMO C++/ASM
Lambda
Le lambda est juste une fonction anonyme : En clair : une fonction qui n’a pas nom Mais qui peut prendre des paramètres
Java possède le concept de classes anonymes depuis Java 1.1
C# possède des méthodes anonymes depuis C# 2 (mais possède des delegates depuis la version 1)
C++ (avant 0X, s’appuyait sur les foncteurs)
Closures
Une closure est n’importe quelle fonction qui capture l’environnement dans laquelle elle est déclarée !
Elle peut accéder aux variables qui ne sont pas dans sa liste de paramètre
Bonne nouvelle
Lambda et closures sont présentes dans Java 8, C# (depuis la version 3) et C++ 11 (depuis C++ 0X) Avec des syntaxes différentes Avec des possibilités différentes Avec plus ou moins de limitation
DEMO C#/C++/Java
Bonne nouvelle
Lambda et closures sont présentes dans Java 8, C# (depuis la version 3) et C++ 11 (depuis C++ 0X) Avec des syntaxes différentes Avec des possibilités différentes Avec plus ou moins de limitation
DEMO C#/C++/Java
Java 8
Les lacunes de Java 7
Oracle a racheté SUN Microsystems 2009 James Gosling a quitté Oracle Doug LEA a quitté la JCP Flottement sur l’avenir Java, MySQL, etc Java 7 prévoyait initialement quasiment
toutes les évolutions de Java 8 Java 7 a été « fractionné » en Java 7 et 8 !
On été supprimé :▪ Jigsaw (toujours pas là avec Java 8)▪ Lambda▪ Defender Methods
Les nouveautés du Langage Java 8
Nouveautés du Langage Interfaces fonctionnelles Lambdas Références de méthode Defender Methods (Méthodes par
défaut) Méthodes static dans les interfaces
DEMO
Les nouveautés de l’API
Stream et parallel StreamAPI java.timeAnnotations multiplesNashorn
DEMO
Ce que Java sait déjà faire
Throws▪ Une gestion d’erreur précise et impressionnante▪ Pas d’équivalent C#/C++▪ Mais jugé inutile par les architectes C#/C++
Instance initializer/ Double brace initialization▪ Pour faciliter l’instanciation
Covariance du type de retour▪ Comme en C++. Pas d’équivalent C#
Enum▪ Comme une classe, avec des méthodes▪ En C#, ReferenceType
nested class Type inference Local et anonymous Classes Final parameters et static import Generics (use-site variance) : Travail des pecs !!
DEMO
C# 5
Nouveautés C# 5
Mots clés async/await Attributs Caller Information
C#5 fait parti de l’évolution du framework Microsoft .NET 4.5 Evolution des API WPF, WCF, Entity
Framework, etc Windows 8 et 8.1… WinRT !!
DEMO
Astuce : VS 2012/13 et .NET 4namespace System.Runtime.CompilerServices{ [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] public sealed class CallerMemberNameAttribute : Attribute { public CallerMemberNameAttribute(); }
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)] public sealed class CallerFilePathAttribute : Attribute { public CallerFilePathAttribute(); }
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)] public sealed class CallerLineNumberAttribute : Attribute { public CallerLineNumberAttribute(); }}
Ce que C# savait déjà faire Indexer :
Faire un objet quelconque se comporter comme un tableau
Inférence de type Déterminer automatiquement le type d’un
objet La syntaxe Diamond de Java s’en rapproche
Type Nullable Gère le cas de figure Null A été créé pour les ValueTypes
Type « Struct » A l’image d’une structure C++ mais pas
complètement Attention à ce type
Ce que C# savait déjà faire Linq (sur objets, XML, SQL, Entity
Framework) A l’image de la nouvelle API Stream Java Mais plus puissant : peut réaliser des
arbres d’expression Classes partielles
Scinder une classe en 2 Pratique pour les frameworks Evite de se baser sur l’héritage,
implémentation d’interface seules
Ce que C# savait déjà faire
Méthodes d’extension Possibilité de rajouter des méthodes sur
n’importe quel type existant En java, possibilité de passer par l’AOP,
CDI (JEE 6 et 7) ou des frameworks spécifiques non dans la norme
Surcharge d’opérateurs La communauté Java ne veut en
majorité pas en entendre parlé S’avère pourtant bien pratique
Ce que C# savait déjà faire Définition d’opérateur de Cast (implicite
ou explicite) À l’image du C++ Permet de convertir n’importe quel type en en
autre sans notion de hiérarchie ou d’interface Renvoie sous forme d’itérateurs
(Enumerable, IEnumerator) Mot clé « yield » En Java, exige le respect de patterns (plus de
syntaxe)
Ce que C# savait déjà faire La DLR
Mot clé « dynamic » Possibilité de découvrir en runtime
méthodes/propriétés d’un objet Implémentation explicite d’interface
Possibilité de masquer les méthodes d’interface Pratique pour les frameworks, pour le cas où 2
interfaces implémentées possèdent la même méthode
En Java, nécessité de créer des wrappers (composition ou agrégation)
Démonstration C# au choix
Struct vs Class Out et ref Indexer, surcharge d’opérateur et
Implémentation explicite d’interface Explicit vs implicit cast Classes et méthodes partielles Nullable Delegate et Anonymous method Yield return Using (IDisposable.Dispose) Pointeurs
Démonstration C# au choix
DLRMéthodes d’extension Indexeur Inférence de typeLINQLambdasEntity FrameworkClasses partielles
Que fait ce code ? (C#4 vs C# 5)static void Main(string[] args) { var values = new List<int>() { 1, 2, 3, 4, 5 };
var funcs = new List<Func<int>>(); foreach (var v in values) { funcs.Add(() => v * 10); }
foreach (var f in funcs) {
Console.WriteLine(f()); }
}
DLR : un exemple
Appel statiqueCalculator calculator = GetCalculator();int sum = calculator.Add(10, 20);
Reflectionobject calculator = GetCalculator();Type calculatorType = calculator.GetType();object res = calculatorType.InvokeMember("Add",
BindingFlags.InvokeMethod, null, calculator, new object[] { 10, 20 });
int sum = Convert.ToInt32(res);
Javascript Object
ScriptObject calculator = GetCalculator();object res = calculator.Invoke("Add", 10, 20);int sum = Convert.ToInt32(res);
DLRdynamic calculator = GetCalculator();int sum = calculator.Add(10, 20);
C++ 11Le trouble fête
C++ versus C#
C++ « classique » C#CPolygon *Search(int x, int y){ CPoint pt(x,y); vector<CPolygon*> polys; ReadPolys(polys); CPolygon *ret = NULL; for (vector<CPolygon*>::iterator beg = polys.begin(); beg!=polys.end();++beg) { if ((*beg)->Contains(pt)) { ret = *beg; break; } } for (vector<CPolygon*>::iterator beg = polys.begin(); beg!=polys.end();++beg) if ((*beg) && (*bet != ret)) delete
*beg; return ret;}
Polygon Search(int x, int y){ Point pt = new Point(x,y); List<Polygon> polys = ReadPolys(); return polys.FirstOrDefault( p => p.Contains(pt));}
Sources Microsoft
TR1.. C++0x.. C++ 11
TR1 - Technical Report 1shared_ptr<T>
weak_ptr<T>
unique_ptr<T>
regex
tuple
array
…
C++ 0xlambdas
r-value reference
auto
decltype
static_assert
Thread
mutex
future<T>
vector<vector<int>>
variadic templates
…
Sources Microsoft
C++ 11
Sources Microsoft
Microsoft et C++11… vers C++ 14!
gcc est quasiment entièrement compatible c++ 11 !Manque Minimal support for GC & Reachability-based leak detection Sources Microsoft
C++ 11 versus C#
C++ 11 C#shared_ptr<CPolygon> Search(int x, int y){ CPoint pt(x,y); auto polys = ReadPolys(); auto found = find_if(begin(polys), end(polys), [pt](shared_ptr<CPolygon> pol) { return pol->Contains(pt); });
return (found != polys.end()) ? *found : nullptr;}
Polygon Search(int x, int y){ Point pt = new Point(x,y); List<Polygon> polys = ReadPolys(); return polys.FirstOrDefault( p => p.Contains(pt));}
Sources Microsoft
Les apports de C++ 11
OverrideEnumérations fortement typéesFonctions anonymes et fermetures Initialisation d’un pointeurMot clé autoNullptrGestion du temps Initialisateurs d’attributsEtc
C++ 11 Smart Pointers
auto_ptr deprecatedNouveaux types
unique_ptr shared_ptr / weak_ptr
Garbarge CollectionExpression idiomatique RAIIException Safe, STL SafeFonctionne avec des tableaux
Rvalue references
Gère les problématiques de move et création temporaire d’objets (Lvalue = expression relative à une localisation mémoire. Rvalue = le reste) int* p = &i; //i est une lvalue int* p1 = &foo(); //foo est une lvalue j = foobar(); //foobar est rvalue int c = a * b; //a*b est rvalue
Nouveau symbole syntaxique : &&
rvalues
En c++11, std::move pour convertir lvalue en rvalue
Move constructeurMove assignment operatorstd::swap pour les templates (utilise
en réalité std::move)
Thread class
Idiom RAII pour créer un ThreadCompatible avec boostSupport des atomics, mutexes, locksstd::async, futures, packaged_tasks
et promisesThread-local storageThread-safe Initialization (objects
w/static storage, std::call_once)
OpenMP/OpenACC/OpemAMP/CUDA
Non C++11 mais déjà opérationnelDu parallélisme, oui !!
Dans la 3D Pour accélérer les calculs :
▪ Scientifique ▪ Financier : cas de la VaR par exemple▪ Idéalement, utiliser les capacités des GPU
(GPGPU), APU
OpenMP/OpenACC/C++ AMP/CUDA
C++ AMP (Accelerated Massive Parallelism) Librairie sur DirectX crée par Microsoft Open Specification Orientée GPU Création de la fonctionnalité restrict(amp)
CUDA : Développé par NVIDIA
OpenACC Standard développé par PGI, Cray, NVIDIA… Directives pour GPU, APU, CPU
OpenMP/OpenACC/C++ AMP/CUDA
OpenMP (Open Multi-Processing) API de calcul parallèle sur mémoire
partagée Portable, scalaben supportée sur Unix,
Windows, HP, Mac, etc A base de pragma DEMO