  Most modern software systems (operating systems like Linux or Android, Web
browsers like Firefox or Chrome, video encoders like ffmpeg, x264 or VLC,
mobile and cloud applications, etc.) are highly-configurable. Hundreds of
configuration options, features, or plugins can be combined, each potentially
with distinct functionality and effects on execution time, security, energy
consumption, etc. Due to the combinatorial explosion and the cost of executing
software, it is quickly impossible to exhaustively explore the whole
configuration space. Hence, numerous works have investigated the idea of
learning it from a small sample of configurations' measurements. The pattern
"sampling, measuring, learning" has emerged in the literature, with several
practical interests for both software developers and end-users of configurable
systems. In this survey, we report on the different application objectives
(e.g., performance prediction, configuration optimization, constraint mining),
use-cases, targeted software systems and application domains. We review the
various strategies employed to gather a representative and cost-effective
sample. We describe automated software techniques used to measure functional
and non-functional properties of configurations. We classify machine learning
algorithms and how they relate to the pursued application. Finally, we also
describe how researchers evaluate the quality of the learning process. The
findings from this systematic review show that the potential application
objective is important; there are a vast number of case studies reported in the
literature from the basis of several domains and software systems. Yet, the
huge variant space of configurable systems is still challenging and calls to
further investigate the synergies between artificial intelligence and software
engineering.
