Thanks for this breakdown; a lot of what you're saying about Transit is stuff I had inferred from prior announcements, but it's still enlightening to see an explicit comparison to Edn and Fressian.
On Sunday, March 15, 2015 at 7:51:55 PM UTC-7, Alex Miller wrote: > > Hi Ryan, > > To answer the big question, all of these data formats are in active use at > Cognitect and while I make no promises, I expect them all to be alive and > active for the knowable future. Each of them targets a different niche but > all of them share the qualities of transmitting extensible typed values. > > edn is the best choice for human-readable data. It is however, less > efficient to transmit and depends on writing a high-performance parser - > this is a high bar in some language environments. edn is most attractive > right now to Clojure users b/c of its proximity to Clojure itself. While it > has many advantages as an extensible readable literal data format, it's an > uphill battle to sell that against other data formats that already have > greater mindshare and tooling in other language communities. > > fressian is the highest performance option - it takes full advantage of a > number of compression tricks and has support for arbitrary user-extensible > caching. Again, it requires a fair amount of effort to write a fressian > library though so it's probably best for JVM-oriented endpoints right now. > By seeking greatest performance, fressian also makes tradeoffs that narrow > its range of use and interest group. > > transit is a pragmatic midpoint between these two. It focuses, like > fressian, on program-to-program data transmission however, the data can be > made readable (like edn) via the json-verbose mode. Like fressian, transit > contains caching capabilities but they are more limited and not > user-extensible. transit is designed primarily to have the most > high-quality implementations per lowest effort - effectively shooting for > greater reach than either edn or fressian by lower the bar to > implementation. The bar is lowered by reusing high-performance parser for > either JSON or messagepack which exist in a large number of languages. Of > particular importance is leveraging the very high performance JSON parsers > available in JavaScript runtimes, making transit viable as a browser-side > endpoint for a fraction of the effort required to write a high performance > edn or fressian endpoint. As transit explicitly seeks reach and > portability, it is naturally the format with the broadest potential usage. > > Hopefully that lays out the landscape a bit more. With respect to support, > all of these formats are supported by Cognitect. Like everyone else, we're > managing priorities across a large number of projects. Filing issues is > great, voting on issues is great, reports like this are great. External > tooling is welcome (like pretty printers, etc). Because we use these > projects inside internal Cognitect projects and products, we do not > currently have a community contribution model for most of these as there > may be impacts that are not publicly visible. That could change in the > future. > > I am not an expert on everything you mention below but at a glance it > looks like on-point feedback and I will raise it with the appropriate > people and we can follow back here or on the relevant issues as needed. > > Thanks, > Alex > > On Sunday, March 15, 2015 at 8:40:21 PM UTC-5, Ryan Schmitt wrote: >> >> I'm the author of dynamic-object >> <https://github.com/rschmitt/dynamic-object>, an open source library >> that makes Clojure's data modeling power available to Java programmers. >> This includes features like serialization and deserialization. I'll copy >> this small usage example from the README to give you a sense of how it >> works: >> >> public interface Album extends DynamicObject<Album> { >> @Key(":artist") String getArtist(); >> @Key(":album") String getAlbum(); >> @Key(":tracks") int getTracks(); >> @Key(":year") int getYear(); >> } >> >> >> String edn = "{:artist \"Meshuggah\", :album \"Chaosphere\", :tracks 8, >> :year 1998}";Album album = DynamicObject.deserialize(edn, Album.class); >> album.getArtist(); // => "Meshuggah" >> >> >> dynamic-object has always been opinionated about using Edn as the primary >> data language on the wire, for a number of reasons. For a long time, I also >> thought about adding Fressian support to dynamic-object, and I've recently >> done so on an experimental basis. (It looks like this >> <https://github.com/rschmitt/dynamic-object/blob/440ecd2f385d1cec80496ba7007bd0755023b19c/src/test/java/com/github/rschmitt/dynamicobject/FressianTest.java>.) >> >> Some time after I initially released dynamic-object, Transit was also >> released, with support for various encodings (JSON, JSON-Verbose, >> MessagePack). >> >> In working (to different extents) with these data languages, I've had >> some apprehensions about all of them. >> >> - There is a lack of tooling available for Edn, such as validators >> and pretty-printers. I spent a while looking for an Edn equivalent of >> python -mjson.tool and never found one. Clojure's built-in pprint >> function >> does not work out-of-the-box to pretty print arbitrary values, and also >> appears to handle some data structures, such as records, incorrectly. >> (pprint omits reader tags when printing records.) pprint's underlying >> implementation, cl-format, is extremely powerful and could almost >> certainly >> be used to build a validating Edn pretty-printer, but it would have an >> unacceptably long startup time. >> - There is a lack of high-quality Edn implementations for different >> languages. Because the Edn spec is not very formal or complete, there >> seems >> to be some uncertainty regarding what constitutes an Edn implementation >> in >> the first place. For instance, clojure.edn parses the Ratio type as a >> builtin, even though it is mentioned nowhere in the spec. (Issue >> <https://github.com/edn-format/edn/issues/64>.) There are also >> oddities such as the recommended C++ implementation >> <https://github.com/shaunxcode/edn-cpp> describing itself as >> "experimental." >> - Fressian's reference Java implementation is almost totally >> undocumented. This is a problem, because I'm writing a library that >> targets >> Java developers; they won't be going through the Clojure bindings (which >> are decently documented). Fressian's source code is outstanding, but it's >> still not documentation. >> - Due to the lack of documentation, it's not clear which parts of >> Fressian are actually stable. Stuart Halloway's data.fressian talk >> included >> some parentheticals about the extension points being subject to change, >> which so far they haven't, but that might only be because of the >> following >> point... >> - Fressian does not seem to have gotten any attention since the >> initial launch. People have submitted GitHub issues >> <https://github.com/Datomic/fressian/issues>, including one >> surprisingly high-quality bug report, but they have all been ignored. The >> JIRA is mostly tumbleweeds. >> - The Clojure bindings for Fressian, namely data.fressian, are >> essentially incomplete. With the exception of maps, Clojure collection >> types do not round trip, and in at least one case (vectors) that is >> because >> of a blocking issue <http://dev.clojure.org/jira/browse/DFRS-1> in >> the underlying Fressian implementation. >> - There are no documented best practices for the use of Fressian or >> some of its more advanced features like chunking. It is not clear how to >> read and write Fressian in a way that facilitates (for instance) ranged >> reads from the middle of a resource. It is not clear when checksums >> should >> be used and how they should be validated. It is not clear whether tags >> should be namespaced, or how. The only namespaced tag in data.fressian is >> for IRecord; none of the other type tags are namespaced. It's not clear >> whether this is due to bugwards compatibility. >> - Transit is advertised >> <https://github.com/cognitect/transit-format#implementations> as a >> work-in-progress. This is the main reason I haven't seriously considered >> adding Transit support to dynamic-object. >> - However, what happens when Transit is stabilized (if that ever >> happens)? Since Transit offers a msgpack encoding, will Fressian then be >> irrelevant (except for legacy use cases)? There's a FUD aspect here--I >> like >> Fressian and I want dynamic-object to support it, but I don't want to >> back >> the wrong pony and end up having to support HD-DVD and Betamax for all >> time >> (so to speak). >> - Can these formats be unified? Can Edn and Fressian encodings for >> Transit be offered? Would that even accomplish anything? >> >> I realize that none of these data languages will have the same extent of >> support and tooling as JSON or XML, but I want to ensure that >> dynamic-object's supported data languages all have attentive stewardship >> and bright futures. It's distressing that a lot of the issues with Edn and >> Fressian have not gotten much traction. Are these languages still actively >> being supported and fostered? If so, how much development activity is >> taking place on internal forks? Are any public updates planned for these >> languages any time soon? >> > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.