22 ms·
Pony – High Performance Actor Programming
- hitekker 11y agoI didn't see it from going through your website, but may I ask why it's called "Pony"?
- n3otec 11y agohttp://www.urbandictionary.com/define.php?term=I%20want%20a%20pony http://www.urbandictionary.com/define.php?term=I%20want%20a%... :)
- n3otec 11y agohttp://blog.codinghorror.com/and-a-pony/ http://blog.codinghorror.com/and-a-pony/
- kolektiv 11y agoNot the only meaning though - people in the UK (especially some parts) may have different reaction: http://www.urbandictionary.com/define.php?term=Pony&defid=92721 http://www.urbandictionary.com/define.php?term=Pony&defid=92... :)
- ShaneWilton 11y agoThis is incredibly cool. I read through the whole tutorial, and I love what I see, but I recommend putting some code samples on the front page. Syntax may be less important than a language's features, but it isn't until the 4th page of the tutorial that I even have an inkling of what code in Pony looks like. I'm excited to give this a try!
- partisan 11y agoAgreed. Seems interesting and the website is generally well designed, but it wouldn't hurt to have a code sample or two on the front page.
- barrelrider 11y agoYes you're right, we will put some code samples in earlier on. Thanks for the feedback.
- bittytang 11y agoWhat is your planned version 1.0 release date? What milestones are you facing in the release process? What will future support for the language look like?
- olivier1664 11y agoAgreed too. Here my user experience with the presentation. Once I've understand it was a new language (cool name btw), I've look for the Hello-world example to see if the language was easy enough for me. I've found the link after reading the HN comment: http://tutorial.ponylang.org/getting-started/helloworld/ http://tutorial.ponylang.org/getting-started/helloworld/ Then, I've quickly read the part on concurrent programming. But I've not understood how it is easier with Pony. It's very frustrating. So far, my understanding is there is class (called actor) that can discuss together by sending each other immutable object. I would like to see some code in the tutorial that show how concurrency is easily done in Pony.
- phamilton 11y ago"Among these, Pony is the only language that concurrently garbage collects actors." I must not be understanding that claim correctly. Erlang does garbage collection on a per actor basis (at least that's my understanding). If the claim is that multiple actors can garbage collect simultaneously, then I guess that means Erlang only GCs one actor at a time. If so, why can't Erlang GC multiple actors at a time? It does full SMP for actor execution.
- rdtsc 11y ago> If so, why can't Erlang GC multiple actors at a time? It does full SMP for actor execution. It does. The article is incorrect. Erlang has a fully concurrent garbage collector among actors. One actor's GC running on one CPU scheduler will not interfere with execution of actors running in other CPU schedulers.
- 0cachecoherency 11y agoThere's a difference between GC'ing the memory reachable from an actor and GC'ing the actors themselves. Erlang requires a "poison pill" message to kill actors. The research paper is here: http://ponylang.org/papers/opsla237-clebsch.pdf http://ponylang.org/papers/opsla237-clebsch.pdf
- istvan__ 11y agoAlso, looking at the white paper I see really weird numbers. This section in particular: Benchmarks and preliminary comparisons with Erlang, Scala, Akka, and libccpa Table1 & Table2 It seems that you have the exact same numbers for Erlang and Scala in table2, this is very hard to believe. You either accidentally put down the same number twice or you measured the performance of your benchmarking tool, otherwise it is extremely unlikely that two entirely different systems give the the same exact measurement. Similar story in table1. maybe I am missing something terribly obvious but this looks off to me.
- pedrocr 11y ago
- M8 11y agoIt looks good, but is language alone enough these days? Reminds me of Axum C# research dialect. Microsoft decided to implement it as a framework in the end - Orleans. So did Scala. And wouldn't F# + Akka.NET be just as safe?
- SnowyOwl 11y agoIn Akka, message arguments have to be immutable objects - similarly for Erlang; Pony can pass isolated references which can be mutated and passed on, while still being data-race free. Scala is based on Java, and thus it is not data-race free - unless the program has been crafted very carefully.
- ramigb 11y agoLooks very promising, hopefully there will be a strong community around it, imho communities make or break a language or a framework no matter how good the syntax or the features are.
- panic 11y agoThis looks awesome! Two questions: 1. How does process failure and recovery work? 2. Are there any plans to add binary patterns? That's one thing I'm sure I'd miss from Erlang if I wanted to write a server in this language.
- 0cachecoherency 11y ago1. Because Pony is both type and exception safe, actors (the Pony equivalent of an Erlang process) don't fail in the catastrophic sense. Right now, if an actor wants to report that it can't go on to some other actor, it just sends out messages. Obviously, we are big fans of Erlang, and big fans of the Erlang supervisor pattern, so we'll be writing a Pony package that puts a nice interface around this. 2. Yes! Pony has first class pattern matching already (along with algebraic data types, i.e. tuple types, union types, and intersection types, to make pattern matching really useful). It allows matching both on type and on standard or programmer defined structural equality. As I mentioned, we're big Erlang fans, so we definitely won't ignore stuff like this.
- al2o3cr 11y ago"actors don't fail in the catastrophic sense" Bonus: if this language thing doesn't work out you can just pivot to selling the unlimited-resource and failure-free hardware and operating system you've invented... Snark aside, a system that always assumes "clean shutdown" is going to massively simpler to design. It's also going to be unusable in real-world environments.
- vortico 11y agoThere is no documentation yet for calling C libraries or calling Pony from C. Does anyone have resources on how to do this?
- 0cachecoherency 11y agoSorry about that, we'll get more docs up as soon as we can. For now, check out some of the included packages, like net/ssl. That calls C extensively (libressl, or openssl if you like). Or regex, which uses PCRE2.
- Nycto 11y agoQuick link for anyone that is curious, as I was: https://github.com/CausalityLtd/ponyc/blob/master/packages/net/ssl/ssl.pony https://github.com/CausalityLtd/ponyc/blob/master/packages/n...
- lmz 11y agoClick commercial support. It goes to a parked domain page.
- decklebench 11y agoWe are just emerging from stealth mode... sorry. The web site is up and running now (modulo DNS update)
- bsaul 11y agoI couldn't find any information about the authors of this language. It seems like a fairly accomplished yet complex project, so it would be quite good to know who are the people working on it.
- decklebench 11y agohttp://www.causality.io/#team http://www.causality.io/#team
- rdtsc 11y agoFrom benchmarks. I see this label: "Erlang OTP 6.1" Anyone know what version 6.1 is refering to? Latest Erlang OTP version is 17.5. Version 11 was released sometimes 10 years ago.
- istvan__ 11y agoI think he is mixing up OTP with erts... Erlang/OTP 17 [erts-6.4]
- stefantalpalaru 11y agoInteresting language. The "philosophy" wiki page is worth reading: https://github.com/CausalityLtd/ponyc/wiki/Philosophy https://github.com/CausalityLtd/ponyc/wiki/Philosophy
- nordicway 11y agoHow does the "your concurrent program can never have data races" claim go along with Actor model indeterminism and message interleaving?
- 0cachecoherency 11y agoData races are a subset of all race conditions. We don't claim that it's impossible to wait on a network message that never arrives, of course! However, Pony makes a messaging order guarantee that's much stronger than is typical for the actor model. It guarantees causal messaging. That is, any message that is a "cause" of another message (i.e. was sent or received by an actor prior to the message in question) is guaranteed to arrive before the "effect" if they have the same destination. That guarantee is achieved with no runtime cost, which is pretty fun. Pony still allows unbounded non-determinism, of course, but causal messaging gives a very comfortable guarantee to the programmer.
- xjia 11y agoAny research paper or documentation on "That guarantee is achieved with no runtime cost"?
- lostcolony 11y agoEspecially if they're trying to include distribution (per a comment elsewhere). Pretty sure you can't have linearalizable messages between nodes without additional runtime cost compared to the non-linearalized case.
- AnkhMorporkian 11y agoDistribution probably (almost definitely) kills the runtime cost, I can't imagine how it couldn't. I'm much more interested in the causality guarantee in the context of the distributed systems.
- lostcolony 11y ago
- lobster_johnson 11y agoLooks very interesting. Any examples of Erlang-style distributed actors?
- n3otec 11y agoWe have been working on distribution support. We should get it into the runtime soon!
- xjia 11y agoFrom the benchmark results, this is not much faster than Erlang. Also the graphs only cover 12 cores, while it claims that "Applications can run on a virtually infinite processor count and on arbitrarily large clusters". I would love to see how it scales on thousands of cores.
- SnowyOwl 11y agoWe will have more benchmarks soon. Pony is between 2 and 3 times faster than Erlang on these benchmarks.
- k__ 11y agoI saw there are no ends in function and class definitions used, are they optional in if and for too?
- SnowyOwl 11y agoDo you mean whether Pony requires/allows braces to delimit functions, or class definitions? If so, the answer is no, as they are superfluous.
- k__ 11y agoI saw function and class definitions were delimited by their indentation but if and for used "end". I wanted to know if these "end"s are optional (I can write it like Python) or strictly needed (I have to write it like Ruby).
- a0 11y agoI don't think so. The language is (almost) whitespace insensitive so the only way to know where a certain control statement terminates is by having the `end` token. It is unnecessary on the top-level though, since the top-level expression will end where the next one begins. Which means you probably can't have nested class/function definitions. This technique is not new and is used in OCaml, for example.
- k__ 11y agoAh I see. Didn't no such a mix was common :)
- barrelrider 11y agoThis is correct, classes and functions are not dependent on indentation, they just don't need an end. And yes, there are no nested classes and functions (other than in object literals).
- fallat 11y agoI'm not seeing anyone here answering the important question: What makes Pony different from other languages?
- SnowyOwl 11y agoActor based; type safe; data-race free; copy-less message passing; easy to write fast programs; non-null types; algebraic data types; ... Is there a specific language you would like to compare with?
- panic 11y agoThe capabilities system in particular is unique to Pony: http://tutorial.ponylang.org/capabilities/introduction/ http://tutorial.ponylang.org/capabilities/introduction/
- jack9 11y agoA recognizable syntax is a big win, for starters. Do people still cling to the idea that it doesn't matter? How many tens of thousands of "gotchas" and "good parts" do we need to hear about from languages that have poor syntactic choices, from the viewpoint of the average programmer?
- teamhappy 11y ago"The language doesn't even have the concept of null!" <-> is_null [1] [1]: https://github.com/CausalityLtd/ponyc/search?utf8=%E2%9C%93&q=is_null https://github.com/CausalityLtd/ponyc/search?utf8=%E2%9C%93&... Also, your 3-clause BSD license only has two clauses.
- barrelrider 11y agoOne class having a method called "is_null" doesn't mean that the language has null built into it or any inherant concept of what that means. Just like having a method called "is_functional" doesn't mean it's a functional language.
- thinkpad20 11y agoLooks like the `handle` in question there in the File module is an instance of a Pointer, which presumably is some sort of wrapper around a raw pointer. It has null in the sense that the pointer can be null; this isn't the same thing as how nulls are traditionally used (e.g. an "empty object" which can appear in the place of where an actual object might be). So it's not a language level concept.
- Nycto 11y agoHmm. This feels a bit pedantic to me. The `is_null` check looks relegated to the FFI: https://github.com/CausalityLtd/ponyc/blob/975d9f6c60553030e623a7eb27f1caa6eebb80ec/packages/builtin/pointer.pony https://github.com/CausalityLtd/ponyc/blob/975d9f6c60553030e... Obviously, I have never written anything in Pony, but this absolutely seems like an advanced use case. It exists because 'C' has a concept of null, so it needs to be handled. The manual even admits that all bets are off when dealing with the FFI.
- ShaneWilton 11y agoIt's also worth noting that the language does have a None primitive, but the distinction from nil or null is that the concept of "nothing" is wrapped in it's own type entirely. This means that it would be a type violation for a method of return type String to ever return a None. Instead, a method that you expect to return a String or a None would need to have a union return type of (None | String). It's analogous to Maybe, in Haskell.
- kentonv 11y agoThis language claims to be "capabilities-secure", which I assumed meant that it uses capability-based security and is an object-capability language. This got me excited -- my work on Sandstorm.io and Cap'n Proto uses capability-based security heavily, and a high-performance object-capability language would be awesome to have (the existing ones are mostly dynamically-typed and slow, though you can use capability-based design without using a capability-based language, as many programs and most OS's actually do to some extent). Unfortunately, it turns out they have simply coopted the term to mean something completely different. According to the documentation: "Pony capabilities are completely new, no other language has them."[0] Please think of a new word for this; don't redefine one (or a pair) that is widely-used already. [0] http://tutorial.ponylang.org/capabilities/introduction/ http://tutorial.ponylang.org/capabilities/introduction/
- decklebench 11y agoThe term "capability” is much older than Pony, and the concept was proposed in the 60s. We would have loved to use a different word, but there are not enough different recognisable words in the English language. We use capabilities in Pony to statically avoid data races - not for security. But we believe that Pony's capabilities can also be developed further to support security - would be great to try and program Sandstorm’s security with them.
- kentonv 11y ago> The term "capability” is much older than Pony, and the concept was proposed in the 60s. Right, capability-based security (my definition) originated in the 60s and has been in continual use ever since. Pony's definition is new, AFAIK (and according to the documentation). > We would have loved to use a different word, but there are not enough different recognisable words in the English language. I think "type qualifiers" is the correct term. The Pony docs already describe capabilities as being similar to C++'s "const" and "volatile" type qualifiers, and this term will help people understand that the concept is similar (but more advanced). The Pony docs spend a whole paragraph explaining that its capabilities are not the same thing as any other "capabilities" I may have heard of, e.g. "You may have heard of capabilities somewhere else, but these are not the same thing." The fact that you need this paragraph suggests that you've heard this objection a number of times, which should be demonstration enough that you really ought to choose a different term. People don't usually need disclaimers like this. English is a language that has entirely too many words -- there are plenty available. Or, consider making one up. :) > But we believe that Pony's capabilities can also be developed further to support security Yes, it's very likely that your "capabilities" would compose well with object capabilities in order to effect security. But that's just all the more reason they shouldn't use the same word, since it will be incredibly confusing to anyone who is trying to use both.
- bc2002yahoo 11y agoAfter reading the doc, I am curious if the language has type constructor/support higher kinder type.
- deleted 11y ago[deleted]
- taktoa 11y agoI'm guessing the capabilities correspond to polarized substructural types plus additional structure for who can read/write to a given area of memory (http://www.cs.cmu.edu/~fp/papers/fossacs15.pdf http://www.cs.cmu.edu/~fp/papers/fossacs15.pdf). i.e.: iso = linear, val = affine, ref = unrestricted, box = readable, trn = readable/writeable, tag = uniqueness? Capability defaulting seems a little dangerous (not that it's not type safe, but it having such information be implicit seems like a good way to encourage people to forget about it; on the other hand, if the compiler is good enough about warning people it shouldn't be a problem). I'm not sure subtyping is worthwhile for this language (since it complicates the type system without much of a gain wrt constrained polymorphism).
- kibwen 11y agoFrom the philosophy page: https://github.com/CausalityLtd/ponyc/wiki/Philosophy https://github.com/CausalityLtd/ponyc/wiki/Philosophy > No loadable code. Everything is known to the compiler. What does "loadable" mean here? Does it imply no dynamic linking?
- n3otec 11y agoNo. Dynamic linking is possible, for example with C libraries. 'No loadable code' means that a programs code is not modified during runtime, nor extended with new code (for example like java applets or RMI applications). We have been looking into hot code loading though.
- tcard 11y agoI found interesting what Rust's Graydon Hoare had to say about it: "It's very similar to earlier versions of rust. In terms of actor local GC, language provided scheduling of actors, separated function and async invocation system, mixed structural and nominal types, and an overabundance of language supported reference qualifiers. I think they did a good job at it, certainly much better than I did, but I'd be nervous about the cognitive load of the reference qualifiers (capabilities). See this page for example, or the previous few in the tutorial. We had that sort of cognitive load on variables early on and people basically rejected the language because of it, as well as associated compositionality problems. The many years of design iteration had a lot do to with factoring that space into fewer, more essential and general qualifiers. Slow, tedious, world breaking refactoring work. I hope for pony's sake this doesn't happen to them too -- it looks really nice -- but that's my biggest worry for it." http://www.reddit.com/r/rust/comments/34rszb/pony_type_and_memory_safe_language/cqxkmm8 http://www.reddit.com/r/rust/comments/34rszb/pony_type_and_m...
- SnowyOwl 11y agoIndeed, the type system when explained in detail is not that simple. Nevertheless, we believe that it can be used without detailed knowledge. In our experience, programmers can pick up the system fast (e.g. after a 2 hour discussion). Similarly, programmers can easily write programs which type-check, even if they do not have a deep understanding of the type system (e.g. they need not memorise the table you mentioned). Type-checking is enough - given the guarantees by the type system, (data-race freedom and atomicity). The use of defaults reduces the annotation burden - typically to only 10%-20% of locations which allow them.
- decklebench 11y agoThanks for the positive tone! Regarding annotations, the "Fast & Cheap" paper contains the following: The language uses carefully chosen default capabilities to minimise the required annotations. In addition, the compiler guides the programmer as to which annotations should be used, infers annotations locally, and performs automatic recovery in some circumstances. As a result, when implementing LINPACK GUPS (in app. F) we require just 8 capability annotations and 3 uses of recover in 249 LOC. In approximately 10k LOC in the standard library, 89.3% of types required no annotation.
- Radle 11y agoI am goind to sound very stupid: Under http://tutorial.ponylang.org/getting-started/installation/ http://tutorial.ponylang.org/getting-started/installation/ I just cannot find something to click on, download and install it, even though the site really looks as if that was the case. What the hell am I missing?
- joseraul 11y agoAn unusual little feature is that assignment returns the old value of the target, e.g. a = b returns the old value of a, so that a = b = a just swaps the contents of a and b.
- Lethalman 11y agoStopped being interested after reading "It's deadlock free!", "because Pony has no locks at all"... yeah but actor X waiting for actor Y which waits for actor X is a deadlock. It's not a matter of lock primitives, it's a matter of software. (yes, x-comment from reddit)
- n3otec 11y agoNo. If actor X is waiting for actor Y and Y for X and neither of the two has messages to process, they are potentially subject to GC. The question is, what does X is waiting for Y mean? 'Waiting' would imply that there are language constructs to actually wait. Pony doesn't have that. An actor that is blocked (i.e. has no messages) and that satisfies necessary RC invariants will be collected.
- Lethalman 11y agoSo I haven't seen yet in the website a code sample showing how a simple ping-pong actors would communicate, so I can't even test quickly if this is possible with the language. If the program can implement a lock between the two actors, then your language is not deadlock free. Even a loop by checking if some variable has changed by the other actor (if possible in this language, I still don't even know by the deep lack of examples), and the other actor doing the same thing, that can be claimed as deadlock.
- tright 11y agoThe lack of actor examples in the documentation for an actor-based language is really surprising. Anyway, there is only a send construct (essentially a remote procedure call that returns no value) but no receive construct. Here's an example of passing data in a ring: https://github.com/CausalityLtd/ponyc/blob/master/examples/ring/main.pony https://github.com/CausalityLtd/ponyc/blob/master/examples/r... As there is no blocking receive, no immediate way of breaking this came to my mind, although I had the same initial thought.
- scott_s 11y agoCan you put up some example applications? The tutorial only has code snippets. I don't want to look at individual features in isolation, I want to get a feel for how one solves problems in the language.
- n3otec 11y agoYes we are working on this. In the meantime, https://github.com/CausalityLtd/ponyc/tree/master/examples https://github.com/CausalityLtd/ponyc/tree/master/examples might be a good start!
- Merkur 11y agoSounds interesting. I like that algebra types are available in an OO Language. http://tutorial.ponylang.org/capabilities/introduction/ http://tutorial.ponylang.org/capabilities/introduction/ is the best concise description why concurrency is hard I read until now.
- n3otec 11y agoThank you! :-)