annotate src/capnproto-0.6.0/doc/otherlang.md @ 147:45360b968bf4

Cap'n Proto v0.6 + build for OSX
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 22 May 2017 10:01:37 +0100
parents
children
rev   line source
cannam@147 1 ---
cannam@147 2 layout: page
cannam@147 3 title: Other Languages
cannam@147 4 ---
cannam@147 5
cannam@147 6 # Other Languages
cannam@147 7
cannam@147 8 Cap'n Proto's reference implementation is in C++. Implementations in other languages are
cannam@147 9 maintained by respective authors and have not been reviewed by me
cannam@147 10 ([@kentonv](https://github.com/kentonv)). Below are the implementations I'm aware
cannam@147 11 of. Some of these projects are more "ready" than others; please consult each
cannam@147 12 project's documentation for details.
cannam@147 13
cannam@147 14 ##### Serialization + RPC
cannam@147 15
cannam@147 16 * [C++](cxx.html) by [@kentonv](https://github.com/kentonv)
cannam@147 17 * [Erlang](http://ecapnp.astekk.se/) by [@kaos](https://github.com/kaos)
cannam@147 18 * [Go](https://github.com/zombiezen/go-capnproto2) by [@zombiezen](https://github.com/zombiezen) (forked from [@glycerine](https://github.com/glycerine)'s serialization-only version, below)
cannam@147 19 * [Javascript (Node.js only)](https://github.com/kentonv/node-capnp) by [@kentonv](https://github.com/kentonv)
cannam@147 20 * [Python](http://jparyani.github.io/pycapnp/) by [@jparyani](https://github.com/jparyani)
cannam@147 21 * [Rust](https://github.com/dwrensha/capnproto-rust) by [@dwrensha](https://github.com/dwrensha)
cannam@147 22
cannam@147 23 ##### Serialization only
cannam@147 24
cannam@147 25 * [C](https://github.com/opensourcerouting/c-capnproto) by [OpenSourceRouting](https://www.opensourcerouting.org/) / [@eqvinox](https://github.com/eqvinox) (originally by [@jmckaskill](https://github.com/jmckaskill))
cannam@147 26 * [C#](https://github.com/mgravell/capnproto-net) by [@mgravell](https://github.com/mgravell)
cannam@147 27 * [Go](https://github.com/glycerine/go-capnproto) by [@glycerine](https://github.com/glycerine) (originally by [@jmckaskill](https://github.com/jmckaskill))
cannam@147 28 * [Java](https://github.com/dwrensha/capnproto-java/) by [@dwrensha](https://github.com/dwrensha)
cannam@147 29 * [Javascript](https://github.com/popham/capnp-js-base) by [@popham](https://github.com/popham)
cannam@147 30 * [Javascript](https://github.com/jscheid/capnproto-js) (older, abandoned) by [@jscheid](https://github.com/jscheid)
cannam@147 31 * [Lua](https://github.com/cloudflare/lua-capnproto) by [CloudFlare](http://www.cloudflare.com/) / [@calio](https://github.com/calio)
cannam@147 32 * [Nim](https://github.com/zielmicha/capnp.nim) by [@zielmicha](https://github.com/zielmicha)
cannam@147 33 * [OCaml](https://github.com/pelzlpj/capnp-ocaml) by [@pelzlpj](https://github.com/pelzlpj)
cannam@147 34 * [Ruby](https://github.com/cstrahan/capnp-ruby) by [@cstrahan](https://github.com/cstrahan)
cannam@147 35 * [Scala](https://github.com/katis/capnp-scala) by [@katis](https://github.com/katis)
cannam@147 36
cannam@147 37 ##### Tools
cannam@147 38
cannam@147 39 These are other misc projects related to Cap'n Proto that are not actually implementations in
cannam@147 40 new languages.
cannam@147 41
cannam@147 42 * [Common Test Framework](https://github.com/kaos/capnp_test) by [@kaos](https://github.com/kaos)
cannam@147 43 * [Sublime Syntax Highlighting](https://github.com/joshuawarner32/capnproto-sublime) by
cannam@147 44 [@joshuawarner32](https://github.com/joshuawarner32)
cannam@147 45 * [Vim Syntax Highlighting](https://github.com/peter-edge/vim-capnp) by [@peter-edge](https://github.com/peter-edge)
cannam@147 46 (originally by [@cstrahan](https://github.com/cstrahan))
cannam@147 47 * [Wireshark Dissector Plugin](https://github.com/kaos/wireshark-plugins) by [@kaos](https://github.com/kaos)
cannam@147 48
cannam@147 49 ## Contribute Your Own!
cannam@147 50
cannam@147 51 We'd like to support many more languages in the future!
cannam@147 52
cannam@147 53 If you'd like to own the implementation of Cap'n Proto in some particular language,
cannam@147 54 [let us know](https://groups.google.com/group/capnproto)!
cannam@147 55
cannam@147 56 **You should e-mail the list _before_ you start hacking.** We don't bite, and we'll probably have
cannam@147 57 useful tips that will save you time. :)
cannam@147 58
cannam@147 59 **Do not implement your own schema parser.** The schema language is more complicated than it
cannam@147 60 looks, and the algorithm to determine offsets of fields is subtle. If you reuse the official
cannam@147 61 parser, you won't risk getting these wrong, and you won't have to spend time keeping your parser
cannam@147 62 up-to-date. In fact, you can still write your code generator in any language you want, using
cannam@147 63 compiler plugins!
cannam@147 64
cannam@147 65 ### How to Write Compiler Plugins
cannam@147 66
cannam@147 67 The Cap'n Proto tool, `capnp`, does not actually know how to generate code. It only parses schemas,
cannam@147 68 then hands the parse tree off to another binary -- known as a "plugin" -- which generates the code.
cannam@147 69 Plugins are independent executables (written in any language) which read a description of the
cannam@147 70 schema from standard input and then generate the necessary code. The description is itself a
cannam@147 71 Cap'n Proto message, defined by
cannam@147 72 [schema.capnp](https://github.com/sandstorm-io/capnproto/blob/master/c%2B%2B/src/capnp/schema.capnp).
cannam@147 73 Specifically, the plugin receives a `CodeGeneratorRequest`, using
cannam@147 74 [standard serialization](encoding.html#serialization-over-a-stream)
cannam@147 75 (not packed). (Note that installing the C++ runtime causes schema.capnp to be placed in
cannam@147 76 `$PREFIX/include/capnp` -- `/usr/local/include/capnp` by default).
cannam@147 77
cannam@147 78 Of course, because the input to a plugin is itself in Cap'n Proto format, if you write your
cannam@147 79 plugin directly in the language you wish to support, you may have a bootstrapping problem: you
cannam@147 80 somehow need to generate code for `schema.capnp` before you write your code generator. Luckily,
cannam@147 81 because of the simplicity of the Cap'n Proto format, it is generally not too hard to do this by
cannam@147 82 hand. Remember that you can use `capnp compile -ocapnp schema.capnp` to get a dump of the sizes
cannam@147 83 and offsets of all structs and fields defined in the file.
cannam@147 84
cannam@147 85 `capnp compile` normally looks for plugins in `$PATH` with the name `capnpc-[language]`, e.g.
cannam@147 86 `capnpc-c++` or `capnpc-capnp`. However, if the language name given on the command line contains
cannam@147 87 a slash character, `capnp` assumes that it is an exact path to the plugin executable, and does not
cannam@147 88 search `$PATH`. Examples:
cannam@147 89
cannam@147 90 # Searches $PATH for executable "capnpc-mylang".
cannam@147 91 capnp compile -o mylang addressbook.capnp
cannam@147 92
cannam@147 93 # Uses plugin executable "myplugin" from the current directory.
cannam@147 94 capnp compile -o ./myplugin addressbook.capnp
cannam@147 95
cannam@147 96 If the user specifies an output directory, the compiler will run the plugin with that directory
cannam@147 97 as the working directory, so you do not need to worry about this.
cannam@147 98
cannam@147 99 For examples of plugins, take a look at
cannam@147 100 [capnpc-capnp](https://github.com/sandstorm-io/capnproto/blob/master/c%2B%2B/src/capnp/compiler/capnpc-capnp.c%2B%2B)
cannam@147 101 or [capnpc-c++](https://github.com/sandstorm-io/capnproto/blob/master/c%2B%2B/src/capnp/compiler/capnpc-c%2B%2B.c%2B%2B).
cannam@147 102
cannam@147 103 ### Supporting Dynamic Languages
cannam@147 104
cannam@147 105 Dynamic languages have no compile step. This makes it difficult to work `capnp compile` into the
cannam@147 106 workflow for such languages. Additionally, dynamic languages are often scripting languages that do
cannam@147 107 not support pointer arithmetic or any reasonably-performant alternative.
cannam@147 108
cannam@147 109 Fortunately, dynamic languages usually have facilities for calling native code. The best way to
cannam@147 110 support Cap'n Proto in a dynamic language, then, is to wrap the C++ library, in particular the
cannam@147 111 [C++ dynamic API](cxx.html#dynamic-reflection). This way you get reasonable performance while
cannam@147 112 still avoiding the need to generate any code specific to each schema.
cannam@147 113
cannam@147 114 To parse the schema files, use the `capnp::SchemaParser` class (defined in `capnp/schema-parser.h`).
cannam@147 115 This way, schemas are loaded at the same time as all the rest of the program's code -- at startup.
cannam@147 116 An advanced implementation might consider caching the compiled schemas in binary format, then
cannam@147 117 loading the cached version using `capnp::SchemaLoader`, similar to the way e.g. Python caches
cannam@147 118 compiled source files as `.pyc` bytecode, but that's up to you.
cannam@147 119
cannam@147 120 ### Testing Your Implementation
cannam@147 121
cannam@147 122 The easiest way to test that you've implemented the spec correctly is to use the `capnp` tool
cannam@147 123 to [encode](capnp-tool.html#encoding-messages) test inputs and
cannam@147 124 [decode](capnp-tool.html#decoding-messages) outputs.