Premiers pas avec Scala - 7 septembre 2010
Je me suis enfin mis à Scala ! (depuis deux semaines à peu près)
Ça faisait un moment que je voulais m'y mettre. J'ai atteint un niveau décent en Java, et je voulais explorer un langage un peu plus souple, n'ayant jamais apprécié les classes anonymes, surcharges de méthodes pour gérer les paramètres optionnels et autres lourdeurs de Java. Sans parler des incohérences hérités du C.
J'ai balancé un moment entre Groovy et Scala (Clojure : pas fana de Lisp, même si j'ai appris Scheme pour faire des scripts dans Gimp ; JRuby : ressemble trop à Perl ! Jython : pourquoi pas, mais plus tard). J'ai fini par basculer vers Scala !
La syntaxe de Groovy semblait plus facilement assimilable ; j'avoue que j'avais été effrayé par des lignes de Scala du style def cfor[@specialized T](zero: T, okay: T => Boolean, inc: T => T)(act: T => Unit)
quelque peu obscures pour le non initié...
Des codeurs agitaient aussi le spectre de la programmation fonctionnelle (« trop difficile ! ») mais du fait de ma fréquentation de la mailing list de Lua (où j'ai découvert le concept...), du codage en JavaScript et maintenant en JavaFX, cela ne me faisait pas trop peur...
J'ai laissé tomber Groovy qui semble assez lent, et un peu plus bricolé que Scala qui a de solides fondations théoriques. Et certains autres fragments de Scala semblaient finalement relativement lisibles...
Pour l'instant, c'est un hobby, je profite d'une baisse d'activité dans le monde JavaFX (blogs et forums sont fort calmes, je ne parle même pas de Oracle !) pour m'y mettre. Je n'espère pas de débouchés professionnels immédiats : j'ai visité l'Apec pour renouveler mon inscription et j'en ai profité pour faire une recherche sur Scala (et JavaFX). Zéro résultats en Île-de-France (et en France, si je me souviens bien). J'ai cherché Python pour vérifier que je faisais correctement ma recherche, et j'ai eu des résultats...
Bah, je suppose que EDF Trading (EDFT) ou Mimesis Republic ont déjà fait le plein de développeurs Scala... (ils sont listés dans Scala in the Enterprise). Dommage, je me serai bien vu coder des jeux en Scala, j'ai vu qu'il était utilisé avec Piccolo2D et qu'il y a même une implémentation de Box2D en Scala.
Disons que je fais ça surtout pour le fun, et pour rester à niveau dans un métier qui nécessite une formation permanente. Qui sait à quoi ressemblera le marché du travail dans quelques années ? D'autant plus qu'apparemment on est bon pour travailler encore un bon bout de temps... (il y a grève aujourd'hui, contre la réforme des retraites...).
Scala a été conçu par Martin Odersky (et son équipe de EPFL, une école polytechnique suisse). Ce professeur en informatique a, évidemment, un solide bagage théorique sur les langages de programmation, étant un chercheur dans ce domaine, mais aussi une bonne expérience de la programmation, notamment dans l'écriture de compilateurs (Modula-2, Generic Java...). Il a d'ailleurs conçu les bases des types génériques de Java 1.5.
C'est donc à la fois un langage excitant parce qu'il mélange plein de bonnes idées empruntées à divers langages, tout en maintenant une forte cohérence dans sa conception et bénéficiant d'un solide squelette théorique. Et en même temps, il reste très pragmatique, maintenant la compatibilité avec Java (permettant l'usage de son énorme écosystème) et optimisant le compilateur pour produire du code efficace.
Par exemple, tout est objet, comme en Ruby, même un simple nombre litéral comme 2. Mais contrairement à Ruby, il l'a l'intelligence d'utiliser en arrière-plan les types primitifs de Java, nettement plus efficaces en terme de mémoire et de vitesse. On peut écrire 2.mult(5)
mais il convertira en 2 * 5
(je simplifie...).
Ce qui est sympa, c'est qu'après avoir vu quelques tutoriels présentant en passant quelques « sucreries syntaxiques » (syntax sugar), comme les appels de fonctions sans paramètres (foo = random.nextInt
) ou les appels de méthodes sans parenthèses ni points (bar = obj process "Stuff"
), ce qui permet de faire des
C'est ainsi que tout est objet, comme j'ai dit, des valeurs littérales aux instances de classes (ben oui...), des fonctions elles-mêmes aux blocs de code.
De plus, le langage permet d'écrire des identifiants (noms de variables, de fonctions, etc.) avec presque n'importe quel caractères Ascii (et même Unicode, en UTF-8). En excluant les délimiteurs (parenthèses de toutes formes, guillemets et apostrophes, point, virgule et point-virgule), et en suivant quelques règles, quand même.
Ce qui fait qu'en fait, les opérateurs sont en fait de simples fonctions avec des noms exotiques. C'est un concept puissant que j'avais découvert, et apprécié en Scheme. Contrairement au C++, on ne surcharge pas les opérateurs, on les utilise (en créant ceux qu'on veut) en tant que fonctions. Avec le sucre syntaxique évoqué, de même qu'on peut écrire x.do(y)
en x do y
(sympa mais pas vital), on peut écrire x.+(y)
sous la forme x + y
(nettement plus intéressant !).
J'apprécie aussi le système complet de types (Scala est (fortement) typé statiquement mais devine, en général, les types, on n'a souvent pas besoin de les écrire explicitement), conçu pour la conception de composants génériques, réutilisables (un serpent de mer en informatique...). C'est rassurant que savoir que c'est là, mais il n'est pas indispensable de maîtriser tout le système pour coder en Scala. Ce qui est heureux, vu la relative complexité de la chose... ^_^
Bref, je n'ai pas l'intention de faire un cours complet sur Scala, il y a des gens bien plus compétents que moi sur le sujet... Je voulais juste partager mon enthousiasme sur ce monde excitant.
J'ai mentionné JavaFX, c'est amusant, je vois maintenant qu'ils ont emprunté beaucoup à Scala. Ou, peut-être, à leurs racines communes...
Soit dit en passant, le langage est beaucoup plus riche que celui de JavaFX. Donc plus dur à maîtriser (mais plus expressif). C'est bien pour tous les deux : JavaFX vise à être simple à utiliser (et a gardé quelques bonnes idées, comme les closures (fermetures ?)), alors que Scala a un objectif beaucoup plus large.
Dernière remarque : j'ai fait un lexer Scala pour Scintilla (et donc SciTE), étant fatigué des limitations du lexer CPP utilisé pour ça. J'en parlerai plus en détail dans un autre billet.