annotate src/capnproto-0.6.0/doc/_posts/2014-12-15-capnproto-0.5-generics-msvc-java-csharp.md @ 148:b4bfdf10c4b3

Update Win64 capnp builds to v0.6
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 22 May 2017 18:56:49 +0100
parents 45360b968bf4
children
rev   line source
cannam@147 1 ---
cannam@147 2 layout: post
cannam@147 3 title: "Cap'n Proto 0.5: Generics, Visual C++, Java, C#, Sandstorm.io"
cannam@147 4 author: kentonv
cannam@147 5 ---
cannam@147 6
cannam@147 7 Today we're releasing Cap'n Proto 0.5. We've added lots of goodies!
cannam@147 8
cannam@147 9 ### Finally: Visual Studio
cannam@147 10
cannam@147 11 Microsoft Visual Studio 2015 (currently in "preview") finally supports enough C++11 to get Cap'n
cannam@147 12 Proto working, and we've duly added official support for it!
cannam@147 13
cannam@147 14 Not all features are supported yet. The core serialization functionality sufficient for 90% of users
cannam@147 15 is available, but reflection and RPC APIs are not. We will turn on these APIs as soon as Visual C++
cannam@147 16 is ready (the main blocker is incomplete `constexpr` support).
cannam@147 17
cannam@147 18 As part of this, we now support CMake as a build system, and it can be used on Unix as well.
cannam@147 19
cannam@147 20 In related news, for Windows users not interested in C++ but who need the Cap'n Proto tools for
cannam@147 21 other languages, we now provide precompiled Windows binaries. See
cannam@147 22 [the installation page]({{site.baseurl}}install.html).
cannam@147 23
cannam@147 24 I'd like to thank [Bryan Boreham](https://github.com/bboreham),
cannam@147 25 [Joshua Warner](https://github.com/joshuawarner32), and [Phillip Quinn](https://github.com/pqu) for
cannam@147 26 their help in getting this working.
cannam@147 27
cannam@147 28 ### C#, Java
cannam@147 29
cannam@147 30 While not strictly part of this release, our two biggest missing languages recently gained support
cannam@147 31 for Cap'n Proto:
cannam@147 32
cannam@147 33 * [Marc Gravell](https://github.com/mgravell) -- the man responsible for the most popular C#
cannam@147 34 implementation of Protobufs -- has now implemented
cannam@147 35 [Cap'n Proto in C#](https://github.com/mgravell/capnproto-net).
cannam@147 36 * [David Renshaw](https://github.com/dwrensha), author of our existing Rust implementation and
cannam@147 37 [Sandstorm.io](https://sandstorm.io) core developer, has implemented
cannam@147 38 [Cap'n Proto in Java](https://github.com/dwrensha/capnproto-java).
cannam@147 39
cannam@147 40 ### Generics
cannam@147 41
cannam@147 42 Cap'n Proto now supports [generics]({{site.baseurl}}language.html#generic-types),
cannam@147 43 in the sense of Java generics or C++ templates. While working on
cannam@147 44 [Sandstorm.io](https://sandstorm.io) we frequently found that we wanted this, and it turned out
cannam@147 45 to be easy to support.
cannam@147 46
cannam@147 47 This is a feature which Protocol Buffers does not support and likely never will. Cap'n Proto has a
cannam@147 48 much easier time supporting exotic language features because the generated code is so simple. In
cannam@147 49 C++, nearly all Cap'n Proto generated code is inline accessor methods, which can easily become
cannam@147 50 templates. Protocol Buffers, in contrast, has generated parse and serialize functions and a host
cannam@147 51 of other auxiliary stuff, which is too complex to inline and thus would need to be adapted to
cannam@147 52 generics without using C++ templates. This would get ugly fast.
cannam@147 53
cannam@147 54 Generics are not yet supported by all Cap'n Proto language implementations, but where they are not
cannam@147 55 supported, things degrade gracefully: all type parameters simply become `AnyPointer`. You can still
cannam@147 56 use generics in your schemas as documentation. Meanwhile, at least our C++, Java, and Python
cannam@147 57 implementations have already been updated to support generics, and other implementations that
cannam@147 58 wrap the C++ reflection API are likely to work too.
cannam@147 59
cannam@147 60 ### Canonicalization
cannam@147 61
cannam@147 62 0.5 introduces a (backwards-compatible) change in
cannam@147 63 [the way struct lists should be encoded]({{site.baseurl}}encoding.html#lists), in
cannam@147 64 order to support [canonicalization]({{site.baseurl}}encoding.html#canonicalization).
cannam@147 65 We believe this will make Cap'n Proto more appropriate for use in cryptographic protocols. If
cannam@147 66 you've implemented Cap'n Proto in another language, please update your code!
cannam@147 67
cannam@147 68 ### Sandstorm and Capability Systems
cannam@147 69
cannam@147 70 [Sandstorm.io](https://sandstorm.io) is Cap'n Proto's parent project: a platform for personal
cannam@147 71 servers that is radically easier and more secure.
cannam@147 72
cannam@147 73 Cap'n Proto RPC is the underlying communications layer powering Sandstorm. Sandstorm is a
cannam@147 74 [capability system](http://www.erights.org/elib/capability/overview.html): applications can send
cannam@147 75 each other object references and address messages to those objects. Messages can themselves contain
cannam@147 76 new object references, and the recipient implicitly gains permission to use any object reference
cannam@147 77 they receive. Essentially, Sandstorm allows the interfaces between two apps, or between and app
cannam@147 78 and the platform, to be designed using the same vocabulary as interfaces between objects or
cannam@147 79 libraries in an object-oriented programming language (but
cannam@147 80 [without the mistakes of CORBA or DCOM]({{site.baseurl}}rpc.html#distributed-objects)).
cannam@147 81 Cap'n Proto RPC is at the core of this.
cannam@147 82
cannam@147 83 This has powerful implications: Consider the case of service discovery. On Sandstorm, all
cannam@147 84 applications start out isolated from each other in secure containers. However, applications can
cannam@147 85 (or, will be able to) publish Cap'n Proto object references to the system representing APIs they
cannam@147 86 support. Then, another app can make a request to the system, saying "I need an object that
cannam@147 87 implements interface Foo". At this point, the system can display a picker UI to the user,
cannam@147 88 presenting all objects the user owns that satisfy the requirement. However, the requesting app only
cannam@147 89 ever receives a reference to the object the user chooses; all others remain hidden. Thus, security
cannam@147 90 becomes "automatic". The user does not have to edit an ACL on the providing app, nor copy around
cannam@147 91 credentials, nor even answer any security question at all; it all derives automatically and
cannam@147 92 naturally from the user's choices. We call this interface "The Powerbox".
cannam@147 93
cannam@147 94 Moreover, because Sandstorm is fully aware of the object references held by every app, it will
cannam@147 95 be able to display a visualization of these connections, allowing a user to quickly see which of
cannam@147 96 their apps have access to each other and even revoke connections that are no longer desired with
cannam@147 97 a mouse click.
cannam@147 98
cannam@147 99 Cap'n Proto 0.5 introduces primitives to support "persistent" capabilities -- that is, the ability
cannam@147 100 to "save" an object reference to disk and then restore it later, on a different connection.
cannam@147 101 Obviously, the features described above totally depend on this feature.
cannam@147 102
cannam@147 103 The next release of Cap'n Proto is likely to include another feature essential for Sandstorm: the
cannam@147 104 ability to pass capabilities from machine to machine and have Cap'n Proto automatically form direct
cannam@147 105 connections when you do. This allows servers running on different machines to interact with each
cannam@147 106 other in a completely object-oriented way. Instead of passing around URLs (which necessitate a
cannam@147 107 global namespace, lifetime management, firewall traversal, and all sorts of other obstacles), you
cannam@147 108 can pass around capabilities and not worry about it. This will be central to Sandstorm's strategies
cannam@147 109 for federation and cluster management.
cannam@147 110
cannam@147 111 ### Other notes
cannam@147 112
cannam@147 113 * The C++ RPC code now uses `epoll` on Linux.
cannam@147 114 * We now test Cap'n Proto on Android and MinGW, in addition to Linux, Mac OSX, Cygwin, and Visual
cannam@147 115 Studio. (iOS and FreeBSD are also reported to work, though are not yet part of our testing
cannam@147 116 process.)