8 ms·
it's cool that gleam emits typespecs. After tooling around implementing type analysis in Elixir, I do have a personal take that dialyzer typespecs are broken,
by dnautics 6y ago
it's cool that gleam emits typespecs. After tooling around implementing type analysis in Elixir, I do have a personal take that dialyzer typespecs are broken, maybe we should convene a group in the erlef to coordinate towards improving the typesystem.
- lpil 6y agoThe limitations of Dialyzer and typespecs were a big motivator for creating Gleam. They were not reliable or fast enough for my taste. There is some work being done towards better types for Erlang, as well as sharing types between languages on the BEAM. I'm excited to see what comes in future.
- rubyn00bie 6y agoDo you have any links where I could read up on the work being done for type sharing? Sounds awesome to me.
- lpil 6y agoI don't think anything has been published yet. It's very much in the early ideas stage, but there's a couple private mailing lists with some discussion going on.
- dnautics 6y agoI don't know if this counts as "publishing" but I've made several videos on my personal gripes (warning, super wonky, super BEAM-specific), with accompanying code for a type system that 'fixes' the problems. https://www.youtube.com/watch?v=_XSRsYSwNpQ https://www.youtube.com/watch?v=_XSRsYSwNpQ https://youtu.be/VynXxiXPmG8 https://youtu.be/VynXxiXPmG8 https://youtu.be/2ooSWOCBTPQ https://youtu.be/2ooSWOCBTPQ https://youtu.be/qv-GR4sEsd4 https://youtu.be/qv-GR4sEsd4
- lpil 6y agoThis is the first time I've come across your work! Very cool stuff.
- dnautics 6y agothanks! work on my typechecker has slowed recently due to excitement with nerves + zig, and then nx + zig, so my plan is to do a bit more work with the typesystem starting next week.
- sitkack 6y agoI see where you are going with Zig, and I don't want to dissuade you, but consider adding lumen https://github.com/lumen/lumen https://github.com/lumen/lumen to our train set.
- dnautics 6y agoI think lumen (and especially rust) is the wrong way to go for a BEAM reimplementation. For starters, if you look at the BEAM vm, there are, what, 10 different allocators? This is a use case that screams out "use zig". Sure, you can tell rust to use no_std, but if you start pulling in libraries from cargo, there's no guarantee that they will respect you, and you can define a global custom allocator for collections in std, but wrangling more than one global allocator (presumably by making a single flexible global allocator and using macros to select branches of it) is going to be tiresome, and a very easy way to wind up with critical logic errors. Moreover it's far easier to safe, highly performant things in zig. https://www.youtube.com/watch?v=UaF6-5BmX2I&t=1h10m https://www.youtube.com/watch?v=UaF6-5BmX2I&t=1h10m benchmarks of go, rust, and zig at 1h13m
- sitkack 6y agoI do think there are some things that Rust can learn from Zig. One of the biggest wins for the BEAM is that each process has its own heap, so GC pauses only impact a process and they are often short lived, so another reason it is less of an issue. I see what you are saying, but in a way, coordinated groups of Wasm envs can also bring many of the same qualities. I have no experience with allocators in Rust, that is definitely a gap for me. I'd love to a see a Zigification of BEAM, Python, etc. That Zig can load header files directly and includes a C compiler is so damn nice.
- jaegerpicker 6y agoAgreed, I loved working in Elixir but hated the typespecs. Felt like it was a lot of work for only a little benefit. It's not typing that I don't like but the way it's implemented in Elixir felt like it was very hard to get correct quickly. Very fiddly and time consuming. About the 10th time Dialyzer broke the build for no easily discernible reason, I wanted to scrap it.
- dnautics 6y agoI wouldn't go so far as to say they aren't useful. I find dialyzer is not awful at finding mistakes that I make. I have thought about this a lot (I'm writing a static typechecking library for Elixir) and really the problem is the dialyzer typesystem. Almost all of the problems stem from the root fact that there isn't a granular concept of how to treat functions in the type system. What does `(int, int) -> int` mean? Dialyzer does not have a good answer for that question. Mind you I am not a "PL theory" type of guy, I do have a math degree, but my PhD is in the sciences, so I am more approaching this issue from a "discovering what would be truly useful" perspective more than "applying an existing typesystem to the BEAM", which is I think in line with the traditional pragmatism of the BEAM ecosystem.
- lpil 6y ago> What does `(int, int) -> int` mean? This is an interesting question. Do you have any thoughts on what a better answer to that question might mean? Or languages you think do better here? Thank you
- dnautics 6y agoHere's my thought: let's go with a simpler one: int -> int "I guarantee that if you send me an int then i will return you an int without crashing" In elixirland: `IO.inspect/1` would satisfy this, as would `Kernel.-/1`. The interesting thing is that `any -> int` is then a subtype of `int -> int` and we need a new type `_ -> int` which is "any one-arity function that emits int". Then types become a statement of "resistance to crashing" in the BEAM vm, which I think is the useful thing that people are looking for. I don't have answers to everything; I don't know how to deal with a function that generates random numbers from 1 to 20 and crashes on 13, for example. We should have a discussion about this! I'll reach out on another channel.
- kuiro5 6y agoThere's an effort currently being led by Facebook to create a gradual type system for Erlang call Gradualizer, which should also make its way over to Elixir. https://github.com/josefs/Gradualizer https://github.com/josefs/Gradualizer https://github.com/OvermindDL1/gradualixir https://github.com/OvermindDL1/gradualixir