This is great. I'm going to play around with it for an Elixir project.
I'd just like to say I found the homepage did a very good job of explaining the product. Good screenshots and well written summaries of each feature/benefit.
Edit: seconding the call for documentation. Also maybe a link to Getting Started at the top, that's seems like where I'd start vs downloading a .tar.gz without instructions.
This looks very pretty from the screenshots and kudos for throwing out out there so apparently soon in its development; I might check it out (Erlanger here) but I would really like a better idea of what this thing does or some actual docs?
Download link is a .gz and the getting started page goes nowhere really?
When you make tools for developers, the really important bit is communicating why this thing is useful, and then how to use it right?
Love to see Erlanger tools and I'll be following you, but this seems a smidge immature....
How does it work out network use? Does it depend on certain behaviours? Does it simply make pretty things from trace?
Thank you for the feedback! Looking at all the comments here, we will definitely look into improving documentation.
As for network traffic, we use net_kernel module which allows to track throughput between nodes in the cluster. It doesn't rely on specifics you system.
I wish someone would port Python to BEAM. I'm actually surprised there isn't a project out there, except some really old stale project called beam.py I found on github, which hasn't been worked on since 2010.
The gains you get for free using otp and the beam vm depend heavily around language integration of vm features. Porting python to a vm it would work slowly on and would be unable to use most of, if not all of, the benefits without changing the language would give you what exactly?
"Mochi is a dynamically typed programming language for functional programming and actor-style programming. Its interpreter is written in Python3. The interpreter translates a program written in Mochi to Python3's AST / bytecode."
What couldn't you do, say by making BEAM/OTP -specific features be a library you import in Python, and by mapping Python language features to however Erlang does them?
I get there will likely be problems, but what specific problems would you run in to?
I'm not going to get too into this as I hope most readers understand why this couldn't work without needing much depth....
Python has no concept of a process like Erlang does. The standard library does even know about, let alone is able to deal with, the difference between cast and call messages. It can't do messages even. There is no way to translate monitors vs links. What's a node? .....
You could implement python syntax maybe, but python will never make sense on beam.
> Python has no concept of a process like Erlang does. The standard library does even know about, let alone is able to deal with, the difference between cast and call messages. It can't do messages even. There is no way to translate monitors vs links. What's a node?
I don't know that Python on the beam is a good idea / worth the work, but I don't think there's a fundamental issue here:
A process is more or less a thread, which Python already knows about.
Cast is just sending a message, which is erlang:msg(Dest, Msg); call is send a message plus selective receive. General receive is easy, call a function (not already available) and return the message. Selective receive is trickier, because python doesn't have a construct for matching like Erlang, so you'd have to figure out how to specify the possible message signatures you'd like to receive; plus extra work to get the make_ref mailbox marking optimization.
Monitors and links are just calling functions, and maybe being killed or getting specific messages later -- it's a VM feature, not a language feature. Same with a node.
You would have to make some hard decisions about any pythonic state though. It would be more functionally pure to pass that around as a function argument, but it might feel more like python if it was stuffed into the process dictionary. Python state shared between multiple processes/threads would be forbidden, of course. Mutability would also need some soul searching to fit into Beam's garbage collection.
EDIT to add: of course, you would need to restrict I/O to message passing -- anything with file descriptors should be rewritten to be message passing with beam ports.
Well, I was a bit dishonest there and you've called it.
Monitor/Link and Cast/Call are all built ontop of the regular message passing functionality of the language. The point I 'whitehat fibbed' to make stands though, python might be feasable as a syntax implementation but there's a _MASSIVE_ difference in the architecture of helloworld as a flask app and the same under cowboy; trying to get one to behave as the other makes no sense to me.
Implementing a python on beam makes no sense as to actually benefit from beam you'd need to write a lot of libraries to actually play with the environment and why would anyone bother?
And sorry but no, processes are not more or less threads. My laptop can do this:
3> processes:max(250000).
Max allowed processes: 262144
Process spawn time=3.408 (15.644) microseconds
Process teardown time=3.156 (1.552) microseconds
That created 250k procs then stored the pids of each in a list, then iterated though that list and killed those processes; I don't think you can do that with threads..
Yes, I know processes are different than threads, but the basic idea is similar -- a process is an execution context with its own stack and program counter and etc; so is a thread, but the etc differs. That python knows how to run in threads means it's at least got some of the basics that might enable it to run in multiple contexts, was my only point.
I agree that it would be a lot different architecture than a normal python application; but where there could be value, is if you wanted to write a distributed thing in python with all the nice properties you get from an erlang system, your choices now are either drop python (my preference!); write dist/otp yourself, but in python (hard, because how do you bolt on monitors, etc); write just enough erlang to coordinate python running as port commands (probably doable, but could be fragile).
I personally would love to run a little bit of perl on the beam, but i know it's crazy, so I don't mention it very often ;)
The "etc" is absolutely critical as it is shared memory: BEAM works the way it does specifically because it does not want to model shared memory, which means any implementation of threads over it will be an incredibly painful and certainly ludicrously slow simulation, and there is nothing in Python that really maps to the primitive BEAM offers.
You can't accomplish all of that by making users import a library to use those things, like I said? Or at least enough of it to make it reasonably useful as a Python?
Not really. Erlang/OTP applications get the advantages they have by being what they are and that's not really something you can import as a library to a language which doesn't even have primitives those systems speak.
If it sounds like a good idea to do that when you are solving something horrible, then your better bet is to write that functionality in a beam language instead of trying to play beam in a language which can't do it.
This is a bit of a different world than most of us are used to. Porting python to the jvm or making it run on v8 are different goals than making something play in the beam space.
You could run single node python with a port to beam, but there would be no advantages to doing it. It would be slower and no one would use it. Beam langauges only get you something when you're doing distributed things really and python isn't equipped for playing those natively.
You could wrap it in some libs maybe, sure. But why would you?
BEAM is for distributed systems and MySQL is for databases. Porting Python to run on BEAM like Erlang does is like porting Python to run on MySQL like SQL does: Possible, but slightly surrealistic.
It's really not that hard to learn a new language. I love Python, it was the first language I truly loved, but now after over a year of writing a project in Elixir, I find the latter equally impressive, and even more elegant.
It would be amazing if we can have this for Akka as well! I realise Akka doesn't have the benefit of beam/otp, but the data itself should be pretty easy to come by.
On a side note: One thing that always annoyed me about Erlanger is it's lackluster documentation, specifically browsing the docs. Amy efforts to improve that?
I'd just like to say I found the homepage did a very good job of explaining the product. Good screenshots and well written summaries of each feature/benefit.
Edit: seconding the call for documentation. Also maybe a link to Getting Started at the top, that's seems like where I'd start vs downloading a .tar.gz without instructions.