Machines virtuelles – quelques liens
Cette page est embryonnaire. Il y a beaucoup à écrire sur le sujet, et j'ai vraiment trop peu de temps...
Quelques liens d'ordre général :
- Un Wiki sur le sujet : http://en.wikipedia.org/wiki/Virtual_machine
- Le p-code, ou code pour une machine portable (typiquement, une
machine à pile) : http://en.wikipedia.org/wiki/P-Code_machine
- Réflexion de Neil McAllister en 2008 sur
les machines virtuelles génériques : http://www.infoworld.com/d/developer-world/virtual-machines-all-seasons-077
- En 2010, Matt Gallagher spécule sur l'inévitabilité
de l'avènement d'une machine virtuelle pour Cocoa, bien connu des programmeuses
et des programmeurs Objective-C : http://cocoawithlove.com/2010/07/is-virtual-machine-for-cocoa.html
- La machine virtuelle algorithmique, texte de Yosef Kreinin en
2008 : http://www.yosefk.com/blog/the-algorithmic-virtual-machine.html
- Réflexion sur les systèmes de
types, les langages de programmation, les machines virtuelles et la
capacité d'optimiser le code, par
Charles-Oliver Nutter en 2013 :
http://blog.headius.com/2013/05/on-languages-vms-optimization-and-way.html
- Comparatif de systèmes de fichiers de diverses machines virtuelles, par
Mitchell Hashimoto en 2014 :
http://mitchellh.com/comparing-filesystem-performance-in-virtual-machines
- Article technique de 2015 expliquant comment utiliser les « micro machines
virtuelles » en tant que fondation pour le développement de langages de
programmation, par Kunshan Wang et al. :
http://drops.dagstuhl.de/opus/volltexte/2015/5034/pdf/24.pdf
Faire votre propre machine virtuelle :
asm.js
La plateforme asm.js est un projet d'un grand intérêt, décrit sur
../Sujets/Web/JavaScript-Outils.html#asmjs
Alchemy
La plateforme Alchemy d'Adobe a pour objectif de supporter l'exécution
de code C et C++ sur
la machine virtuelle d'ActionScript..
CHIP-8
Une machine virtuelle qui a permis le développement de certains des
premiers (et des plus célèbres!) jeux vidéos.
Le
CLR de la plateforme .NET
Conçue de prime abord pour supporter plusieurs langages (mais favorisant
visiblement C# depuis le début), le Common
Language Runtime (CLR) de la plateforme .NET exécute des programmes compilés dans le langage
intermédiaire CIL (Common Intermediate
Language), autrefois nommé MSIL.
Plus d'informations à venir quand j'aurai un peu plus de temps.
Quelques liens pertinents :
- Introduction détaillée au CLR de
.NET, un document officiel maintenant que la plateforme est offerte à
code ouvert, par Vance Morrison en 2007 : https://github.com/dotnet/coreclr/blob/master/Documentation/intro-to-clr.md
- La section pour programmeurs du .NET Framework
Developer Center, qui regroupe plusieurs des textes clés décrivant
la plateforme .NET : http://msdn.microsoft.com/en-US/netframework/aa496165.aspx
- De manière plus spécifique, la section portant sur le CLR en tant que tel : http://msdn.microsoft.com/en-us/netframework/aa663296
- Un Wiki sur la plateforme .NET : http://en.wikipedia.org/wiki/.NET_Framework
- Un Wiki sur le CLR : http://en.wikipedia.org/wiki/Common_Language_Runtime
- Quelques textes de Sandro Magi :
- À propos du sens de readonly et de la confusion derrière IsReadOnly, par
Craig Gidney en 2012 :
http://twistedoakstudios.com/blog/?p=1473
- En 2013, Andrea Magnorsky avoue que, bien
qu'elle aime beaucoup C#,
elle est d'avis que la plateforme .NET est
mourante :
http://roundcrisis.com/2013/05/15/the-dying-platform-net/
- Un compilateur de
JavaScript à CIL :
http://jsil.org/
- Depuis 2014, il est possible de compiler du
code MSIL en format natif pour diverses
architectures :
- À propos de la difficulté de générer des projets .NET :
- Après un passage à vide, Christian Nagel fait état, dans ce texte de
2014, d'un regain de popularité de la plateforme .NET :
http://weblogs.thinktecture.com/cnagel/2014/04/dotnet.html
- IL2CPP, un compilateur AOT (Ahead of Time)
pour le code scripté d'Unity, décrit par Ralph Hauwert en 2014 :
http://blogs.unity3d.com/2014/05/20/the-future-of-scripting-in-unity/
- Migrer du code vers la version 4.5.2 du
Framework, texte de 2014 :
http://blogs.msdn.com/b/dotnet/archive/2014/08/07/moving-to-the-net-framework-4-5-2.aspx
- Gros coup en 2014 : la plateforme .NET est à code ouvert et pleinement disponible pour plusieurs
plateformes, incluant iOS et
Linux :
- To .NET or not to
.NET, telle est la question posée par ce texte d'Ofer Zelig en
2014 :
http://fullstack.info/to-dotnet-or-not-to-dotnet-that-is-the-question/
- À propos de l'importance de comprendre la disposition en mémoire des
objets .NET (même si le réflexe serait de ne pas
s'en préoccuper), texte de 2014 par Matt Warren :
http://mattwarren.org/2014/07/04/know-thy-net-object-memory-layout/
- L'évolution dans le proche futur pour la plateforme .NET, telle que relatée par Darryl K. Taft en
2015 :
http://www.eweek.com/developer/microsoft-counting-on-developers-to-follow-.net-to-the-cloud.html
- Utiliser la plateforme .NET comme outil de
scripting, par Dave Glick en 2015 :
http://www.daveaglick.com/posts/compiler-platform-scripting
- Un effort est en cours en 2016 pour accroître
la portabilité du code écrit pour la plateforme .NET :
https://github.com/dotnet/corefx/blob/master/Documentation/architecture/net-platform-standard.md
- En 2017, WordPress a migré vers la plateforme
.NET :
http://www.peachpie.io/2017/02/wordpress-announcement.html
Comparatifs :
Critiques :
La CVM
Le projet Coherent Virtual Machine, ou CVM,
est de développer une machine virtuelle à mémoire distribuée
sur plusieurs ordinateurs.
Le DGEE de la plateforme
DotGNU
Projet GNU d'une machine
virtuelle pour la plateforme .NET. Maintenant défunt, si on se
fie au site officiel.
On trouve une strate dynamique par-dessus le CLR
pour la plateforme .NET. Cette strate se nomme le Dynamic Language Runtime,
ou DLR, et permet de supporter des langages
dynamiques qui ne sont pas desservis efficacement de prime abord par le
CLR.
Pour en savoir plus :
ERTS
La machine virtuelle ERTS, pour
Erlang Runtime System, est celle qui
sous-tend l'exécution d'Erlang mais aussi de quelques autres
langages de
programmation, le plus connu de ces langages alternatifs étant Elixir.
Quelques langages destinés à ERTS :
HHVM
La Hip Hop Virtual Machine, utilisée en particulier chez Facebook pour les
langages Hack et
PHP.
IBNIZ
Projet expérimental de machine virtuelle audiovisuelle.
Texte de Ville-Matias Heikkilä en 2011 :
http://countercomplex.blogspot.ca/2011/12/ibniz-hardcore-audiovisual-virtual.html?m=1
La JVM
de la plateforme Java
Machine virtuelle traitant du bytecode, un
langage intermédiaire.
À l'origine conçue pour supporter le langage Java,
cette plateforme sert maintenant à titre de « machine »
hôte pour un grand nombre de langages. Il s'agit d'une plateforme d'une
grande maturité, qui a fait école et a constitué une sorte
de preuve qu'il était possible d'écrire des programmes destinés
à une machine virtuelle et offrant des caractéristiques de performance
acceptables.
Plus d'informations à venir quand j'aurai un peu plus de temps.
Quelques liens pertinents :
- Un Wiki sur le sujet : http://en.wikipedia.org/wiki/Java_virtual_machine
- La JVM de Java 7 :
https://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf
- La JVM de Java 8 :
https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf
- Un tour guidé de la JVM, par Alexey Zhebel :
https://anturis.com/blog/java-virtual-machine-the-essential-guide/
- Une liste d'implémentations existantes : http://en.wikipedia.org/wiki/List_of_Java_virtual_machines
- http://java.sun.com/docs/books/jvms/
- http://java.sun.com/products/hotspot/docs/whitepaper/Java_HotSpot_WP_Final_4_30_01.pdf
- http://www.theregister.co.uk/2010/11/06/oracle_dueling_jvms/
- Un ensemble de raffinements offerts par la JVM HotSpot
pour Java SE 7 :
- Présentation de 2011 par Brian Goetz
portant sur la co-évolution du langage Java,
de sa bibliothèque standard et de la JVM elle-même
pour Java 8 :
https://blogs.oracle.com/briangoetz/resource/devoxx-lang-lib-vm-co-evol.pdf
- De la documentation destinée aux développeurs de JVM ou sur la JVM :
- Texte de Brian Goetz en 2005 sur ce qu'il qualifie
de « légendes urbaines » quant aux performances
d'une JVM : http://www.ibm.com/developerworks/java/library/j-jtp09275/index.html
- Un rapport informel du sommet sur la JVM de
2008, alors qu'il commençait à y avoir plusieurs nouveaux
langages destinés à cette plateforme, le tout par Tim Bray (avec
quelques photos) : http://www.tbray.org/ongoing/When/200x/2008/09/25/JVM-Summit
- Discussion du rapport coûts/ bénéfices de la JVM, texte de 2009 : http://newartisans.com/2009/03/the-jvm-and-costs-vs-benefits/
- Comparatifs :
- L'outil VisualVM, pour mieux interagir avec la JVM
en période de développement : http://geeknizer.com/java-visualvm/
- Certains ont essayé de porter Perl 5
sur la JVM, mais ont abandonné.
Une discussion des raisons derrière cette décision est offerte
ici : http://www.nntp.perl.org/group/perl.perl5.porters/2009/08/msg150099.html
- Présentation fort intéressante de Cliff Click, en
2011, sur ce que fait, concrètement, une JVM : http://www.azulsystems.com/blog/wp-content/uploads/2011/03/2011_WhatDoesJVMDo.pdf
- Dans ce texte de 2011, Alexander J. Turner argumente
qu'il peut être pertinent de migrer des langages plus anciens vers un
environnement pris en charge comme la JVM :
http://nerds-central.blogspot.ca/2011/08/tackling-legacy-languages-with-jvm.html
- Une JVM en JavaScript
capable d'exécuter des programmes Java :
- Texte d'Eric Bruno en 2012 sur les langages
implémentés pour la JVM :
http://www.drdobbs.com/jvm/a-long-look-at-jvm-languages/240007765
- Détails internes d'une JVM, texte de Se Hoon
Park en 2012 :
http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals
- La JVM que Google déploie sur Android, Dalvik, décrite par Jim Huang en 2012 : http://fr.slideshare.net/jserv/understanding-the-dalvik-virtual-machine
- Présentation de Christian Wimmer et Chris Seaton en 2013, selon qui
la JVM est « la machine virtuelle pour les gouverner toutes » :
http://lafo.ssw.uni-linz.ac.at/papers/2013_JVMLanguageSummit_OneVMToRuleThemAll.pdf
- S'amuser avec le bytecode, un texte de Cory Li en
2014 :
http://cory.li/bytecode-hacking/
- Une JVM pour l'infonuagique, décrite par
Graeme Johnson et Michael Dawson en 2013 :
http://www.ibm.com/developerworks/java/library/j-multitenant-java/index.html?ca=drs-
- La PyJVM, une JVM en
Python :
http://pyjvm.org/
- Les types valeurs dans la JVM, par John Rose
en 2012 :
https://blogs.oracle.com/jrose/entry/value_types_in_the_vm
- À propos de Nashorn, une machine virtuelle
JavaScript
intégrée à Java 8
qui supporte les invocations dynamiques :
- Résautique « haute performance » pour la JVM,
présentation de Norman Maurer en 2014 :
http://normanmaurer.me/presentations/2013-jax-networking-on-jvm/#/
- Faire évoluer la JVM, présentation de John
Rose et Brian Goetz en 2014 :
http://cr.openjdk.java.net/~jrose/pres/201407-JVMEvolution.pdf
- Une JVM qui s'auto-guérit, par Nikita Salnikov-Tarnovski en
2014 :
https://plumbr.eu/blog/self-healing-jvm
- Compiler la JVM, texte de
2014 :
https://neomatrix369.wordpress.com/2014/12/20/how-is-java-jvm-built-adopt-openjdk-is-your-answer/
- Comment la JVM supporte d'autres langages que Java :
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/multiple-language-support.html
- Exécuter du code C
de manière
Type-Safe sur une JVM, article de Matthias Grimmer et al en
2015 :
http://chrisseaton.com/plas15/safec.pdf
Comparatifs :
Quelques langages destinés à la JVM :
LuaJIT
La machine virtuelle LuaJIT se veut une machine virtuelle à haute performance pour le
langage Lua.
Metascala
Projet de machine virtuelle métacirculaire en
Scala, avec les sources.
Parrot
La machine virtuelle Parrot est une machine virtuelle à registres ayant
entre autres la vocation de prendre en charge des programmes écrits dans
des langages dynamiques (bien qu'elle supporte plusieurs autres types de langages).
En particulier, elle est a été pensée pour exécuter
les programmes Perl 6.
Quelques liens :
Sol
Une toute petite machine virtuelle, à code ouvert.
Zend
La machine virtuelle supportant PHP 7.
Z-Machine
La machine virtuelle sur laquelle s'exécutait (entre autres) le jeu
Zork.
Série d'articles par
Eric
Lippert en 2016, alors qu'il expérimente avec
OCaml pour écrire sa propre version du jeu
Zork, destiné à s'exécuter
sur une Z-Machine :
Émulateurs
Une thématique connexe à celle des machines virtuelles est celle
des émulateurs, des programmes qui simulent un matériel existant
et offre une forme de virtualisation
pour, par exemple, permettre l'exécution de logiciels plus anciens sur
du matériel plus contemporain.
Quelques liens sur ce sujet :
MAME est un projet remarquable, qui sert en quelque sorte de musée de la connaissance en permettant aux oeuvres logicielles du passé de continuer à exister.
Ce projet est entre les mains de Miodrag Milanović au moment d'écrire ces lignes
- À propos de MAME :
- L'outil FCEUX, un émulateur de plusieurs
plateformes (dont la NES) : http://www.fceux.com/web/home.html
- Le produit n64js, un émulateur de Nintendo 64
en JavaScript :
- Produire un émulateur de NES en code natif à partir de
Go et de
LLVM,
texte d'Andrew Kelley en 2013 :
http://andrewkelley.me/post/jamulator.html
- Émulateur de Nintendo 64 s'exécutant sur
asm.js :
http://jquesnelle.github.io/mupen64plus-ui-console/
- Émulateur d'Oberon
en JavaScript :
http://schierlm.github.io/OberonEmulator/
- Émulateur de Commodore 64 écrit en
C#, par Mladen Janković en
2014 :
http://kataklinger.com/index.php/commodore-64-emulator/
- Émuler un processeur avec... TEX,
par Christian Dietrich en 2014 :
https://gitlab.brokenpipe.de/stettberger/avremu/tree/master#README
- Écrire un processeur virtuel en
C++, texte
de 2014 :
http://megalomaniacbore.blogspot.co.uk/2014/04/virtual-cpu-in-c-4001-cpu.html
- Un émulateur de NES écrit en
Go, par Michael Fogleman :
https://github.com/fogleman/nes
- Émuler un Linux MIPS aec
Perl, par Marc A. Lehmann en
2015 :
- Texte de 2015 qui explique la source de la
latence dans un émulateur :
http://byuu.org/articles/latency/
- En 2016,
Jeff Atwood
explique comment le Raspbery Pi a révolutionné le monde de l'émulation :
https://blog.codinghorror.com/the-raspberry-pi-has-revolutionized-emulation/
- Texte de 2017 relatant l'expérience de Andre Weissflog en
rédigeant un émulateur :
http://floooh.github.io/2017/02/04/yack-counters.html
- À propos de Dolphin, un émulateur de consoles de jeu Nintendo :
https://fr.dolphin-emu.org/. À
ce sujet :
Certaines entreprises n'apprécient pas que l'on écrive des émulateurs pour
leurs vieux binaires. À ce sujet :
Une pratique connexe à l'émulation est ce qu'on nomme en anglais
le Rehosting. Cette pratique va comme suit : à partir d'un
binaire, étudier les entrées et les sorties et comprendre le binaire
comme une boîte noire qu'il est possible d'intégrer à un
système plus complexe. Texte de 2003 par Peter Phillips et George Phillips
décrivant le Rehosting :
http://queue.acm.org/detail.cfm?id=945155