Hello,
R version 3.1.0 was released yesterday, and as always is welcome with great pleasure. One
of the features that is of particular interest to me is the support for C++11.
I would encourage you to read
[Writing R Extensions](http://cran.r-project.org/doc/manuals/r-devel/R-exts.html#Using-C_002b_002b11-code)
to familiarize yourself with
what this supports means and how to take advantage of it. C++11 is a major
upgrade of the C++ standard, making C++ more expressive, more efficient, more
fun to use and teach. It almost feels like a new language if you embrace it fully.
The standards committee has done a great job of maintaining compatibility, which means
that code written with older standard will still compile and work.
However, with C++11 code you write today and tomorrow will not be the same as code
you used to write with C++98.
To get the best of what C++11 has to offer, I'm releasing Rcpp11 today. Rcpp11
is a complete redesign of Rcpp, focused on C++11. Rcpp11 is a header only
C++ library, distributed as an R package on CRAN, that facilitates embedding
C++ code in R packages.
I'll try to keep this announcement short. More details will follow on dedicated
channels. I will just highlight a few aspects of Rcpp11 that are high level
enough for such an annoucement.
Header Only
===========
Rcpp11 is header only -- it consists only of a set of `.h` files. Rcpp11 has no
`.cpp` files, and no R functions. This eliminates many problems inherent to
binary compatibility that Rcpp has been fighting with for years.
The recommended way to use Rcpp11 is to have these lines in the `DESCRIPTION` file
of your package:
```
LinkingTo: Rcpp11
SystemRequirements: C++11
```
Modernized code base
====================
Many features of the original Rcpp code base are the consequence of my
learning C++ and the internal API of R. After a few years of experience, I can
now admit that mistakes were made while designing it. Unfortunately for reasons
outside of my control, it is not possible to fix these mistakes under the umbrella
of the Rcpp package.
Things are radically different for Rcpp11, which I will maintain. Over the past
few months, I have considered many features of the code base and either decided
to abandon them or upgrade them to the level of expectation we should have for a
modern R/C++ interface.
API
---
Most of what is usually called the API has been retained. I do not guarantee
low level compatibililty, but there is conceptual compatibility. For example,
Rcpp11 contains all the classes we would expect: `NumericVector`, `List`, ...
I'm not going into details about what the individual differences are. Instead I
will start documenting how to use the API provided by Rcpp11.
Attributes
----------
Attributes is probably the best feature that has ever been contributed to Rcpp. It
gives a mechanism for decorating C++ functions, parsing these decorations and generating
scaffolding code around them.
This feature has not been retained in Rcpp11, but instead has been moved into a
new package called [attributes](https://github.com/Rcpp11/attributes),
which is being developed and will be released later.
It is worth mentioning that code generated by Rcpp's `compileAttributes` function
should be compilable against Rcpp11. When attributes becomes available it will
provide a more flexible approach, and provide facilities for package authors to
implement and use their own attributes.
Modules
-------
Rcpp modules was not retained as part of Rcpp11. This was a hard decision, because
I invested a lot of time developing the original code behind Rcpp modules. However
modules have significant problems which make them hard to maintain. Modules are
also very demanding on the compiler.
However, I still believe that the promise of Rcpp modules -- exposing C++ classes
at the R level -- is very worthwhile. My plan is to redesign it using a different
approach, more oriented towards code generation, à la attributes.
Time and Date classes
---------------------
I decided to abandon the classes responsible to handling dates and times. Better
classes might be introduced when I'm comfortable with the design. Design
documents and pull requests are welcome.
Further discussion
==================
Please consider subscribing to the R and C++ mailing list that was created a few
days ago: https://groups.google.com/forum/#!forum/r-and-cpp
The scope of the mailing list is broader, the intention is to discuss all things
R and C++. Questions about Rcpp11, Rcpp or anything related to using C++ and R
are welcome. As of today, 37 participants are registered. Please consider
replying to this annoucement email through the mailing list.
Rcpp11 is developed through the Rcpp11 organisation on github. Feel free
to report issues and submit pull requests. https://github.com/Rcpp11/Rcpp11
Versioning
==========
The pattern that has been decided for versions of Rcpp11 is to use the same
number as the mininum version of R required. Therefore this initial version
is Rcpp11 3.1.0 and interim releases might be called 3.1.0.1, 3.1.0.2, etc ...
Documentation
=============
There is no documentation yet. I personally find the heterogeneous sources
of documentation for Rcpp to be confusing. I have three goals in terms of
documentation for Rcpp11:
- An article is being written. This will be a casual introduction to
interesting features of C++11 and Rcpp11.
- API documentation. My goal is to have a website that will make easy to
browse internal documentation (what to do with a NumericVector, ...) similar
to cplusplus.com or something.
- I have started working on a R and C++ book. As I personally consider that
C++ = C++11 from now on, the book will mainly cover uses cases of Rcpp11.
I hope to that between now and useR this year, I will make progress on the 2 first
items of the previous list.
Licensing
=========
Rcpp11 is licensed under the MIT license.
Future
======
This is the first release, it has required a lot of time and effort from me and
Kevin Ushey who has stepped in as a regular contributor to the package.
This sets us with a new foundation for interfacing R and C++ for years to come.
Many features of C++11 such as regular expressions and threads have not been
leveraged yet with this initial release.
C++ is more alive than ever, a new minor update of the standard is likely to
be released this year and supported at day 0 by popular compilers. At this point
I do not anticipate to start working on a Rcpp14 package.
In a few years (the ETA is currently 2017), a new major version of the C++ standard
will be released. It is too soon to say if it will be worthwhile to have a Rcpp17,
but from a casual reading of the expected features, I'd say it is likely.
I sincerely hope you will enjoy working with Rcpp11.
Romain