La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Tour de Smalltalk en 100 diapos. Noury Bouraqadi Ecole des Mines de Douai.

Présentations similaires


Présentation au sujet: "Tour de Smalltalk en 100 diapos. Noury Bouraqadi Ecole des Mines de Douai."— Transcription de la présentation:

1 Tour de Smalltalk en 100 diapos. Noury Bouraqadi Ecole des Mines de Douai

2 2 Historique Naissance au prestigieux Xerox PARC Un langage rôdé première version en 1972 bases définitives en 1980 Premier langage à objets moderne Utilisation industrielle Outils de développement en équipe depuis les années 80 Première version libre en 1997 Open source depuis son origine

3 3 Un langage simple à apprendre - 1 Syntaxe simple proche du langage naturel (anglais) mots et caractères spéciaux = 1 transparent permet de focaliser sur les concepts et la conception Typage dynamique pas de type à saisir contrôle de type à l'exécution Tous les sources sont disponibles y compris les bibliothèques de base

4 4 Un langage simple à apprendre - 2 Peu de concepts Objet, Classe, Message, Variable Toute méthode retourne une valeur Règles de visibilité fixes Classes et Méthodes accessibles par tout le monde Champs visibles uniquement pour leur propriétaire Uniformité (sans exception) Tout est objet nombres, outils, compilateur, … 1 action = 1 message y compris la création d'objets

5 5 Un langage très puissant - 1 Bibliothèque riche copiée collections, streams, … Langage ouvert : multiples capacités réflexives Nombreux éléments/concepts du langage accessibles Langage : Classe, méthode, … Exécution : Pile d'exécution, Contrôle de type, … Outils : Compilateur, Débugger, … Extensible Code des éléments et concept du langage disponible Possibilité de le modifier/étendre

6 6 Un langage très puissant – 2 Quelques outils usuels de Smalltalk Navigation/Codage Browsers: System, Hierarchy, Class, Category, Refactoring, … Method Implementors, Method Finder, Message Senders, … Test et Débogue Debugger, Inspector, … Test Runner (SUnit), Workspace, … Gestion de code Project, Change Set, Change Sorter, … Gestion de version automatique fileIn/fileOut, FileList …

7 7 La suite … Prise de contact Eléments de base Un peu plus loin avec Smalltalk Test & Debug Programmation web avec Seaside Conclusion

8 Prise de contact

9 9 Modèle d'exécution Smalltalk 4 fichiers fondamentaux Machine virtuelle (.exe) Image mémoire (.image) changements effectués (.change) code source des bibliothèques de base (.source) Gestion automatique de la mémoire Garbage collector Tout se passe à l'exécution Développement incrémental Sauvegarde automatique des changements (.change) Perte de code quasi-impossible

10 10 4 fichiers fondamentaux Machine virtuelle (.exe) Unique fichier spécifique à la plateforme (Mac, Linux, Windows, …) Fichier sources de base Lecture seule Fichier image mémoire (.image) Lecture automatique + enregistrement à la demande "Photographie" de la mémoire à l'instant de la sauvegarde Possibilité d'avoir plusieurs fichiers images Fichier des changements effectués (.change) 1 fichier.change par fichier image (même nom) Enregistrement automatique + Lecture à la demande Sauvegarde de toutes les opérations réalisées !! Récupération manuelle en cas d'arrêt intempestif

11 11 Packaging et install. dapplications Packaging 1.Lancez l'interface de votre application Agencez/initialisez comme elle doit être pour le client 2.Supprimez (ou masquez) les classes inutiles Outils de développement et leurs menus 3.Sauvegardez l'image et quittez Smalltalk 4.Préparez votre lanceur (script, icône) 5.Gravez votre CD 3 fichiers fondamentaux : Lanceur, VM, Image Installation 1.Copiez les fichiers de votre CD 2.Lancez votre application

12 12 Squeak 3.7 au premier démarrage

13 13 Accès aux outils

14 14 Menu "World"

15 15 Browser - 1

16 16 Browser - 2 Découpage logique Catégories de classes Catégories de méthodes Compilation Transparente à la volée Incrémentale versions des méthodes Utilisation du menu "accept"

17 17 Exemple de création d'une classe

18 18 Exemple de création d'une classe - 2 Object subclass: #BankAccount instanceVariableNames: 'number balance' classVariableNames: 'CreatedAccounts' poolDictionaries: '' category: 'Examples'

19 19 Exemple de définition d'une méthode

20 20 Exemple de définition d'une méthode - 2 deposit: amount "Ajoute un montant positif uniquement" amount > 0 ifFalse: [ ^self notify: 'Amount should be positive']. balance := balance + amount

21 21 Exemple de messages Smalltalk |myAccount yourAccount| "creates a new account" yourAccount := BankAccount new. yourAccount deposit: myAccount := BankAccount new. yourAccount transfer: 1500 to: myAccount.

22 22 Transcript = "Console"

23 23 Workspace : exécuter, afficher, inspecter…

24 24 Inspecteur & explorateur Donne accès à la structure d'un objet Ouverture par message menu Zones de travail

25 25 File List : Gestionnaire de fichier

26 26 Télécharger des projets depuis et vers le web via SqueakMap/Monticello

27 Eléments de base

28 28 Mots et caractères réservés Mots réservés nil objet indéfini (valeur par défaut des champs et variables) true, false objets booléens self (l'objet lui-même) super (l'objet dans le contexte de la superclasse) thisContext partie de la pile d'exécution représentant la méthode courante Caractères réservés := (ou ) affectation ^ (ou ) = return | varTemp1 varTemp2 varTemp3 | $ caractère # littéral. termine toute expression ; cascade de messages ( ) précédence [ ] bloc de code " commentaire" ' chaîne de caractère '

29 29 Conditionnelle (le "if") Booléens = objets true et false Conditionnels = messages destinés aux booléens 3 formes = 3 méthodes (expressionBooléenne) ifTrue: ["bloc de code"] (expressionBooléenne) ifFalse: ["bloc de code"] (expressionBooléenne) ifTrue: ["bloc de code"] ifFalse: ["bloc alternatif"]

30 30 Boucles Boucles = Messages "for" 1 to: 10 do: [ :i | "traitement boucle"] 15 timesRepeatDo: ["bloc de code répété"] "while" ["expression booléenne"] whileTrue: ["bloc de code"] ["expression booléenne"] whileFalse: ["bloc de code"]

31 31 Collections Collection Notion plus générale que "tableau" Objet qui référence un nombre arbitraire d'objets Ces objets sont appelés éléments de de la collection Différents classes de collections Collections ordonnées ou pas Nombre d'éléments extensible ou fixe Différentes façons d'accéder aux éléments Par indice Avec une clé (dictionnaires) Par parcours seulement (ensembles)

32 32 Quelques classes de collections Collections ordonnées Taille fixe : Array, … Taille variable : OrderedCollection, SortedCollection (éléments triés automatiquement) Collections non-ordonnées (taille variable) Ensembles Set (Deux éléments ne peuvent pas être égaux) IdentitySet (Un élément apparaît une seule fois) Dictionnaires (table de correspondance clé-valeur) Dictionary (Deux clés ne peuvent pas être égales) IdentityDictionary (Une clé est utilisée une seule fois)

33 33 Accès aux collections à taille variable (ordonnées ou non) add: unObjet Ajoute unObjet à la collection addAll: autreCollection Ajoute tous les éléments appartenant à autreCollection remove: unObjet ifAbsent: ["traitements"] Retire unObjet de la collection Exécute le bloc de traitements si unObjet est absent remove: unObjet Erreur si unObjet n'appartient pas à la collection removeAll: autreCollection Retire tous les éléments appartenant à autreCollection

34 34 Accès aux collections ordonnées (de taille fixe ou variable) first Retourne le premier élément last Retourne le dernier élément at: indice Retourne l'élément dont la position correspond à indice Erreur si indice est hors des limites de la collection premier indice = 1 dernier indice = taille de la collection at: indice put: unObjet Stocke unObjet à la cellule dont le numéro est indice

35 35 Parcours des collections (boucles) - 1 do: [:element| "traitements"] element = variable qui référence successivement les différents éléments de la collection Les traitements définis dans le bloc sont exécutés successivement pour chaque élément de la collection. select: [:element| "expression booléenne"] Retourne les éléments pour lesquels l'expression booléenne est vraie (true) reject: [:element| "expression booléenne " ] inverse de select

36 36 Parcours des collections (boucles) - 2 collect: [:element| "traitements"] Retourne une collection du même type que celle parcourue avec les résultats des traitements pour chaque élément detect: [:element | "expression booléenne"] ifNone: ["traitements alternatifs"] Retourne le 1er élément pour lequel l'expression booléenne est vraie Exécute le bloc de traitements alternatifs si l'expression booléenne est fausse pour tous les éléments detect: [:element | "expression booléenne"] Provoque une erreur si aucun élément n'est trouvé (expression booléen est toujours fausse)

37 37 Exemple de parcours d'une collection |notes total moyenne notesCorrectes noteEliminatoire | notes := Set new. notes add: 12. notes add: 6.5. notes add: 15. total = 0 notes do: [:uneNote| total := total + uneNote]. moyenne := total / (notes size). notesCorrectes := notes select: [:uneNote| uneNote >= 12]. noteEliminatoire := notes detect: [:uneNote| uneNote < 8] ifNone: [nil].

38 38 Manipulation des dictionnaires at: clé put: valeur valeur référence un objet quelconque clé référence n'importe quel objet associe valeur à clé Si la clé est déjà utilisée, l'ancienne valeur est remplacée at: clé retourne la valeur (l'élément) associé à la clé at: clé ifAbsent: ["traitements"] Exécute les traitements du bloc si la clé n'est pas utilisée removeKey: clé retire la clé et la valeur correspondante

39 39 Parcours des dictionnaires (boucles) keysAndValuesDo: [:clé :valeur| "traitements"] parcourt le dictionnaire exécute les traitements pour chaque couple clé-valeur keysDo: [:clé | "traitements"] Exécute les traitements pour chaque clé do: [:valeur| "traitements"] Exécute les traitements pour chaque valeur collect: [:valeur| "traitements"] Retourne un ensemble (Set) avec les résultats des traitements pour chaque valeur

40 40 Dictionnaires - Exemple |notesPromo| notesPromo := Dictionnaire new. notesPromo at: 'Marie' put: 14. notesPromo at: 'Rémy' put: 12. notePromo at: 'Didier' put: 16. notesPromo keysAndValuesDo: [:nom :note| Transcript cr. Transcript show: nom. Transcript tab. trascript show: (note printString)]

41 41 Collections - Autres messages utiles Taille size isEmpty Conversion asArray asOrderedCollection asSet Copie copyWith: unObjet Retourne une collection du même type avec tous les éléments + unObjet copyWithout: unObjet Retourne une collection du même type avec tous les éléments sauf unObjet

42 42 Envoi de message Receveur = destinataire d'un message Toute méthode retourne un résultat Par défaut c'est l'objet lui-même (self) Si la méthode ne se termine pas par un retour le compilateur insère ^self automatiquement Cascade de message Plusieurs messages destinés au même receveur Receveur écrit une seule fois Messages séparés par des point-virgules compte deposit: 200 ; deposit: 50 ; withdraw: 100

43 43 Méthodes et messages - 1 Différents types Unaire message sans argument uneCollection size Binaire le sélecteur inclus un symbole non-alpha-numérique Avec (1 ou plusieurs) mot-clés Set new: 100 votreCompte transferer: 50 vers: monCompte

44 44 Méthodes et messages - 2 Précédence : de gauche à droite messages unaires, puis binaires et enfin à mot-clé Sélecteur identifiant unique instance de la classe Symbol Exemple de sélecteurs size + new: transferer:vers:

45 Un peu plus loin avec Smalltalk

46 46 Héritage Héritage simple Interdiction de redéfinir les champs hérités Possibilité de redéfinir les méthodes des superclasses Appel par envoi de message à super Classe racine : Object définit les méthodes communes à tous les objets Liaison (message-methode) dynamique la méthode à évaluer en réponse à un message est recherché à lexécution dans la classe et les superclasses Si absente exécution de la méthode doesNotUnderstand: 1 paramètre = message réifié implantation par défaut : levée dexception

47 47 Exemple dhéritage Hiérarchie de classes Personne nomPrenom dateNaissance nomPrenom nomPrenom: uneChaine dateNaissance: uneDate age Prof matieresEnseignees ajouteMatiere: nomMatiere enseigneMatiere: nomMatiere Eleve notes note: unReel matiere: nomMatiere note: nomMatiere moyenne

48 48 Exemple dhéritage Définition de la super-classe Personne Object subclass: #Personne instanceVariableNames: 'nomPrenom dateNaissance' classVariableNames: '' poolDictionaries: '' category: 'Exemple'

49 49 Exemple dhéritage Définition des sous-classes Prof et Eleve Personne subclass: #Prof instanceVariableNames: 'matieresEnseignees' classVariableNames: '' poolDictionaries: '' category: 'Exemple' Personne subclass: #Eleve instanceVariableNames: 'notes' classVariableNames: '' poolDictionaries: '' category: 'Exemple'

50 50 Variables d'instance, de classe, de pool Variables d'instance champs spécifiques à chaque instance Variables de classe partagées entre les instances de la classe et… avec les instances des sous-classes (héritables !) Variables de pool partagées entre des instances de classes différentes organisés en dictionnaires

51 51 Variables d'instance, de classe, de pool Exemple de déclaration Object subclass: #CompteBancaire instanceVariableNames: 'solde numero' classVariableNames: 'NombreComptesCrees' poolDictionaries: 'TauxChange' category: 'Exemple'

52 52 Quelques méthodes fondamentales Représentation textuelle printOn: aStream (A redéfinitir) printString (Ne pas redéfinir. Utiliser seulement) Comparaison == Teste l'identité. Ne pas redéfinir. = Teste l'égalité. A redéfinir. besoin de redéfinir aussi la méthode hash Copie shallowCopy (A redéfinir) deepCopy (A redéfinir)

53 53 Représentation textuelle des profs printString |str| str := Stream… self printOn: str. … printOn: aStream aStream nextPutAll: self nomPrenom. printOn: aStream super printOn: aStream. aStream nextPutAll: ', Prof' Object printOn: aStream printString Personne nomPrenom dateNaissance printOn: aStream nomPrenom … Prof matieresEnseignees printOn: aStream ajouteMatiere: nomMatiere enseigneMatiere: nomMatiere

54 54 Méthodes de classe Les classes sont des objets Peuvent recevoir des messages Méthodes de classe : sont exécutées suite aux envois de messages à à la classe sont définies en mode "class" du browser respectent les mêmes règles que les méthodes d'instance Masquage, redéfinition, … Exemples : new méthode de création d'instances subclass:instanceVariableNames:… méthode de création des sous-classes

55 55 Browser en mode instance

56 56 Browser en mode class

57 57 Création d'instances - 1 Objets littéraux : écriture = création Nombres : 2, 3.14, … Lettres $a, $z, … Chaînes de caractères : 'Hello' 'l''oiseau' –double apostrophe = une apostrophe dans la chaîne de caractères Symboles : #toto #abcd, … tableaux de littéraux (instances de Array): #(2 $a 'Hello' #bidule) Tableau dobjets quelconques {expression1. expression2. expression3}

58 58 Création d'instances - 2 Autres objets = Par envoi de message aux classes Les classes sont des objets Message à la classe Point new OrderedCollection with: 2 with: $a with: 'Hello' Crée une collection ordonnée avec les éléments : –2 –$a –'Hello' Message à d'autres objets 480 Crée une instance de Point d'abscisse 640 et d'ordonnée 480 'Hello', ' World!' Concaténation = Crée la chaîne de cractères : 'Hello World!'

59 59 La méthode de classe new Crée une nouvelle instance Retourne un nouvel objet initialisé envoi du message initialize au nouvel objet Object dispose de la méthode initialize méthode vide Redéfinition de initialize dans les sous-classes Les champs non-initialisés référencent nil Exemple : Lampe>>initialize super initialize. self estAllumee: false. self couleur: (Color yellow)

60 60 Méthodes de création spécifiques Quand la redéfinition de new ne suffit pas Besoin davoir différentes méthodes de création Besoin de fournir des paramètres dinitialisation Solution : Définir une méthode d'instance qui fait l'initialisation Prend des paramètres si nécessaire Définir une méthode de classe qui crée une nouvelle instance (utilisation de new par ex.) envoie le message d'initialisation à la nouvelle instance retourne la nouvelle instance

61 61 Création d'instances initialisées Tous les champs d'un nouvel objet référencent nil Besoin de leur donner une valeur par défaut Solution : Définir une méthode d'instance pour chaque valeur par défaut Possibilité de redéfinition dans les sous-classes Définir une méthode d'instance qui fait l'initialisation Envoi de message pour obtenir les valeur par défaut Définir une méthode de classe qui crée une nouvelle instance envoie le message d'initialisation à la nouvelle instance retourne la nouvelle instance

62 62 Création dinstances initialisées Exemple - classe et méthodes dinstance Object subclass: #Compte instanceVariableNames: numero solde classVariableNames: DernierNumero poolDictionaries: category: #Application Bancaire Compte>>numero: unNumero solde: soldeInitial numero := unNumero. solde := soldeInitiale

63 63 Création dinstances initialisées Exemple - méthodes de classe Compte class>>nouveauCompte: soldInit |nouveauCompte nouveauNum| nouveauNum := DernierNumero + 1. DernierNumero := nouveauNum. nouveauCompte := self new. nouveauCompte numero: nouveauNum solde: soldInit. ^nouveauCompte Compte class>>initialize "Compte initialize" DernierNumero := 0

64 64 Initialisation paresseuse Intérêt : un champ n'est initialisé que s'il est utilisé Initialisation réalisée dans les méthodes d'accès en lecture aux champs Exemple : Lampe>>couleur couleur ifNil: [self couleur: (Color yellow)]. ^couleur Lampe>>estAllumee estAllumee ifNil: [self estAllumee: false]. ^estAllumee

65 65 Blocs de code Un bloc est un objet peut être référencé dans une variable ou transmis comme argument ou valeur de retour Analogie avec Lambda-expression des langages fonctionnels Peuvent avoir des paramètres [:p1 :p2| "plusieurs lignes de code"] Evaluation retardée value value: value:ifError: valueWithArguments: Très utiles Boucles, Conditionnelles, Exceptions, Concurrence

66 66 Exceptions Sous-classes de Exception Levée d'exception : signal et signal: texteException Capture d'exception A l'aide des blocs bloc on: classException do: [:ex| "traitement exception"] bloc ensure: ["A executer toujours"]

67 67 Réflexion Tout est objet instance de classes modifiables Classes, méthodes, blocs, processus, "scheduler", nombres… Compilateur, arbres syntaxiques, outils de développement … Contrôle de l'exécution Pile d'exécution Objet accessible via la pseudo-variable thisContext Echange de références d'objets Méthodes become: et becomeForward: Contrôle de type : Méthode doesNotUnderstand: Dictionnaires des méthodes des classes …

68 Test et debug

69 69 Débogueur Point d'arrêt = self hal

70 70 Débogueur– Ouverture

71 71 Le Débogueur !

72 72 eXtreme Programing (XP) Méthode "agile" de gestion de projets informatiques Indépendante du langage (objet ou pas d'ailleurs) Objectifs : Tenir les délais & Garantir la qualité Quelques Règles : scénarios client Identifier les priorités du client Estimation des délais Travail en équipe Programmation en binôme (changeant) Tout le monde partage le code Tests réutilisables et automatisables (framework xUnit) Itérations planification-codage (2 à 3 semaines) Plus sur

73 73 Des Tests Réutilisables et Automatiques Exprimer le "cahier des charges" Vérifier que le contrat est rempli Mesurer l'avancement du projet Ecrire le code le plus simple Qualité croissante Eviter la répétition d'un bug Permettre l'amélioration "fiable" du code Simplifier l'intégration Intégration quotidienne Identifier les bugs introduits par l'intégration

74 74 Un cas à tester dans SUnit Une sous-classe de TestCase champs avec données initiale de test 2 méthodes de gestion des ressources initialisation : setUp libération : tearDow "n" méthodes de test : nom commençant par "test" Sans paramètres Exécution de tests pour chaque méthode de test testX: 3 messages envoyés àsur une instance de la classe 1.setUp 2.testQuelqueChose 3.tearDown

75 75 Support à l'écriture de méthodes de test Utilisation de méthodes de TestCase : assert: expressionBooléenne vérifie que l'expressionBoolèenne == true deny: expressionBooléenne vérifie que l'expressionBoolèenne == false should: bloc raise: classeException vérifie que l'exécution du bloc de code lève une exception du type que représente classeException shouldnt: bloc raise: classeException vérifie que l'exécution du bloc de code ne lève pas une exception du type que représente classeException

76 76 Outil d'exécution de test : TestRunner

77 77 Réalisation d'une classe testée - 1 1) Poser les spécifications Ensemble Quatre propriétés 1.Un élément ajouté appartient à l'ensemble 2.Un élément ajouté plusieurs fois apparaît une seule fois 3.Un élément supprimé n'appartient plus à l'ensemble 4.Pas d'erreur si suppression d'un élément inexistant 2) Créer une sous-classe de TestCase Un champ = ensemble la méthode d'initialisation (setUp) : crée l'ensemble 4 méthodes de test

78 78 Réalisation d'une classe testée - 2 3) Concevoir et Implanter la classe demandée Ensemble 4) Exécuter les tests automatique avec TestRunner 5) Modifiez votre code Relancer les tests Recommencez jusqu'au succès de tous les tests

79 79 Exemple de test - 1 TestCase subclass: #TestEnsemble instanceVariableNames: 'ensemble' classVariableNames: '' poolDictionaries: '' category: 'Exemple-Test' setUp ensemble := Ensemble new testAjout ensemble ajouter: 123. self assert: (ensemble contient: 123)

80 80 Exemple de test - 2 testAjoutRepete ensemble ajouter: 123. self assert: (ensemble taille == 1) testSuppression ensemble ajouter: 123. ensemble supprimer: 123. self deny: (ensemble contient: 123) testSuppressionElementInexistant self shouldnt: [ensemble supprimer: 123] raise: Exception

81 Applications Web Dynamique avec Seaside

82 82 Présentation Masque au maximum le code html Description des pages html générées en Smalltalk Découple les traitements de l'interface html Méthode spécifique pour produire l'html (renderOn:) Simplifie la construction de pages Imbrication d'éléments Support automatique des sessions Outils de test/déboguage en ligne

83 83 Exemple du compteur : Code - 1 WAComponent subclass: #Compteur instanceVariableNames: 'valeur' … increment valeur := valeur + 1 decrement valeur := valuer - 1 initialize super initialize. valeur := 0

84 84 Exemple du compteur : Code - 2 renderOn: html "html est une instance de WAHtmlRenderer" "Afficher la valeur en grand" html heading: valeur. html form: [ "Bouton pour incrémenter" html submitButtonWithAction: [self increment] text: 'Incrémenter'. "Bouton pour décrémenter" html submitButtonWithAction: [self decrement] text: 'Décrémenter'. ]

85 85 Exemple du compteur : Résultat

86 86 Créer des pages par imbrication Exemple de liste de compteur - 1 WAComponent subclass: ListeCompteurs instanceVariableNames: 'compteurs'… initialize super initialize. compteurs := OrderedCollection new addCompteur compteurs add: (Compteur parent: self)

87 87 Créer des pages par imbrication Exemple de liste de compteur - 2 renderOn: html |titre| titre := 'Nbre de compteurs ', compteurs size printString. html heading: titre. html form: [ html submitButtonWithAction: [self addCompteur] ext: 'Ajouter un compteur']]. html horizontalRule. compteurs do: [:compt| html horizontalRule. compt renderOn: html]

88 88 Créer des pages par imbrication Exemple de liste de compteur - 3

89 89 Une application Seaside Un nom Casse prise en compte Une classe de démarrage sous-classe de WAComponent Instanciée à chaque session Une configuration (possible en ligne) Type de session (simple, avec authentification, …) Afficher/Masquer les outils de déboguage

90 90 Installer/Configurer une application

91 91 Tester/Déboguer une application

92 92 Inspecter l'objet courant

93 93 Consulter/Modifier le code

94 94 Evaluer les performances

95 Conclusion

96 96 Smalltalk c'est… Un langage à objets de référence Classes Héritage simple Typage dynamique Machine Virtuelle Allocation dynamique de la mémoire Ramasse-miette Support d'applications "entreprise" Concurrence, SGBD, Distribution, Web, … Utilisé dans de grands projets : MMA, Thalès, AMD, JP Morgan, …

97 97 Quelques inconvénients Syntaxe non conventionnelle Proche langage naturel (anglais) Différents dialectes (commerciaux ou libres) IDE différents Mais noyaux identiques N'est pas leader du marché, mais des passerelles vers C et C++, Microsoft.Net : Connexion VM Smalltalk.Net Compilateur Smalltalk.Net CL Java : Techno. d'une Startup Française (Bird Technology)

98 98 De nombreux atouts Simplicité du langage Syntaxe restreinte et uniforme Modèle uniforme : Peu de concepts appliqués partout Typage dynamique Déploiement simple Concept d'image mémoire Un langage très puissant Ecrit en lui-même Accès à tous les sources Capacités réflexives très poussées Notion d'image : pas de problème de fichier et chemin Toujours en avance par rapport aux autres langages !

99 99 Biblio/Webo-graphie Livres Squeak – X. Briffault et S. Ducasse (en français !) Smalltalk, Objects and Design – C. Liu Smalltalk with Style – S. Skublics Smalltalk Best Practice Patterns – K. Beck Sites Web European Smalltalk Users Group Why Smalltalk Communauté Smalltalk francophone Smalltalk Industry Coucil

100 100 Attention DANGER !!! "Smalltalk is dangerous. It is a drug. My advice to you would be don't try it. It could ruin your life." Andy Bower OO Expert


Télécharger ppt "Tour de Smalltalk en 100 diapos. Noury Bouraqadi Ecole des Mines de Douai."

Présentations similaires


Annonces Google