C# 5 versus Java 8... Quand C++ 11 s'invite à la fête

Post on 08-Aug-2015

261 views 0 download

Transcript of C# 5 versus Java 8... Quand C++ 11 s'invite à la fête

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