The Standup with ThePrimeagen - 2 Language Creators vs 2 Idiots

Episode Date: August 18, 2025

When traffic spikes, Neon’s serverless Postgres autoscales to meet demand, without all that extra ops work. Get the free plan at https://neon.com https://twitch.tv/ThePrimeagen - I Stream 5 days a... Week https://twitter.com/terminaldotshop - Want to order coffee over SSH? ssh terminal.shop Become Backend Dev: https://boot.dev/prime (plus i make courses for them) This is also the best way to support me is to support yourself becoming a better backend engineer. Great News? Want me to research and create video????: https://www.reddit.com/r/ThePrimeagen Kinesis Advantage 360: https://bit.ly/Prime-Kinesis 00:00:00 - Intro 00:02:13 - neon.com #ad 00:03:23 - Why Functional Programming Failed? 00:10:20 - Erlang is Functional AND OOP 00:15:00 - The Ruby to Rust Pipeline 00:26:00 - Ginger Bill Rust Rant 00:29:53 - Are Macros Good or Evil? 00:43:30 - Printing in Rust VS Odin 00:48:00 - Mechanism Not Policy 00:57:45 - LSP Hater VS LSP Lover 01:04:20 - are Package Managers required? 01:21:10 - Advice to Future Language Creators

Transcript
Discussion (0)
Starting point is 00:00:01 Oh, nice. Oh, hey. Oh, hey, I'm here. Hello. Wow. On time. Like, right on the dot. That's incredible.
Starting point is 00:00:10 You know, there's a first time for everything. Welcome to the standout. So I haven't eaten anything all day yet. That's good. We got all time. It's the standup. We can eat. No, you cannot.
Starting point is 00:00:23 The last time I did stand up, I used to eat like toast and stuff in the mornings. It was great. That sounds very British. It's been like seven years ago. Yeah. We eat toast in America, too. No, no, no, only we eat toast. Don't you know this?
Starting point is 00:00:36 We invented the concert of toast. No, he didn't, TJ. And basted eggs. No, it's lies. TJ's just trying to fit in. Don't listen to him. Drew. Sorry.
Starting point is 00:00:45 I've never had toast before. I just wanted to be part of something. Yep. Okay. It's okay. Don't worry. Yeah, yeah, yeah. Yeah.
Starting point is 00:00:55 Yeah. Anyway, sorry. All right. Today on the stand-up we have with us, Jose Valim, and Ginger Bill, creators of Elixir and Odin, respectively. Today, the stand-up, which is streamed every day, Wednesday at 11, and Friday at 11 a.m. Montana time. That's the best time, right?
Starting point is 00:01:14 We are now, let's see. What is the topic again? Oh, yeah. Why didn't functional programming take off? And we brought on two of the greatest language experts that I could possibly convince to come on to this show to tell us why this did not happen. So obviously, Jose,
Starting point is 00:01:31 You probably have a slightly different perspective even on that statement, considering the whole elixir thing going on and probably the community you're surrounded by, makes it feel like functional programming is quite successful, if that is true. But I guess- Is that implying it's not? I mean, he just won. Hey, he's in top three most loved languages, prime. That's true.
Starting point is 00:01:53 Neil Vim's number one most loved editor, it doesn't mean it's popular. Well, it was popular, though, anyways, but that's fine. Sorry, I couldn't hear you over Gingerbill typing. What is this a stand-up, Ginger Bill? Yes, it is. It's a stand-up. I was just typing. Sorry, just a friend on Discord. That was all. So, shoot.
Starting point is 00:02:08 Just tell them, just go away. Hands left. Teach, teach, teach, I've got a billion-dollar idea. I've got a billion-dollar idea. I'm listening. What if we use state-of-the-art GPT rappers to monitor live streams for ATIQ keys being leaked? Isn't that a little too niche?
Starting point is 00:02:26 It's pronounced niche. And of course not, according to my lived experience. It's very common to leak API. I just need you to set up a database that can handle my scale. All right, all right. I'll use Neon so you can scale up in cases happens. On the rare chance you don't get any traffic, it'll scale down so it doesn't cost you a fortune.
Starting point is 00:02:44 Oh, we'll need scale. Hey, Teach, uh, you know that site we made about protecting API keys? Yeah, dude, you were totally right. We didn't need to have a database that could handle your scale. Um, people are using that to seal API keys. Wait, Prime. I didn't notice you were live. I'm not live. I'm not lies.
Starting point is 00:03:03 Yeah, yeah, yeah, yeah, a special deal only for today. For every bit you buy, I'll pay you back two bits. On the plus side, your database is still up. When traffic spikes, Neon's serverless Postgres auto scales to meet demands. Without all that extra ops work, get the free plan at neon.com. Curious, like, why didn't, why do we have, like, as the mainstream JavaScript is kind of like seems like number one, why isn't it more of a functional approach? All right. So I do have some opinions on this. And if you were like, well, so there are many thoughts. So one of the thoughts, so the first thing I'm going to say, like, if you were part of the functional programming community or kind of listening involved over the last, you know, decade or even more, very frequently you would hear that functional programming one,
Starting point is 00:04:06 because, for example, Java would get streams, or Java would get lambdas, or languages would bring more type inference, right? A lot of ideas that I'm not sure, I'm not, I'm not going to use the word pioneered, but very popular, very widespread in functional programming cycles for a long time ago, right? And so a lot of the ideas,
Starting point is 00:04:31 in functional programming, they became mainstream, right? So in that way, I would say that if we look at functional programming as a collection of ideas, as we look at object orientation, as a collection of ideas, with time, we look at those things, and then usually we say object orientation, each person that you ask, you get a completely different definition, Alan Kay, I believe he's the one who came with the word object orientation. And it's like, well, when I was not thinking, when I said object orientation, I was not thinking about what C++ has. Right. So I think what we did is that we looked at those things.
Starting point is 00:05:20 We absorbed a lot of concepts and a lot of ideas from them. Many of those concepts and those ideas, they became mainstream. And then some parts of it did not become as mainstream as everything else. Right. So that's one of the things that I think about. Like, well, we got a lot from functional programming. But the other thing that I think about, so I was even mentioning to Ginger Bill, like just before we were chatting a little bit, getting to each other, that I'm actually, I'm not sure, like, the term function
Starting point is 00:05:57 programming, like saying elixir is a functional programming language is that quite useful today. It's like, and there is like a technical discussion, a marketing discussion that we can jump into it. But yeah, I think I think we learned a lot of the lessons that we had to learn. And then if you look at Go or Rust, those are not object-oriented languages. But they are not, they don't say they are functional programming languages either. So, like, we're having those more recent languages that are fine with, like, oh, we can say it's systems programming, but C++ is systems programming, but they say object.
Starting point is 00:06:43 Like, so there are new languages that are fine, like, not necessarily putting a label on them, on the side of functional and object that oriented. And so, and that comes back to me like, well, maybe in 2025, Elixir maybe doesn't have to put the label. it is functional as well. And then if we don't put that label, what it is? So I'll shut up for now. I'm interested to know, because I agree with I think a lot of ideas from functional
Starting point is 00:07:13 programming are just very mainstream ideas now that lots of people think like, oh yeah, of course every language has, whatever that might be. I'd be interested to know from both of you. What? Saying what ideas? Yeah, every language has. No, not every language. That was what I was, that's what I wanted to ask, though.
Starting point is 00:07:33 Because there are some great ones that don't have all the functional tropes inside of them. Yes. That's a setup. Yeah, but I was interested to know, like, from each of you, what are, what are some, like, ideas from functional programming that you're happy got, like, are sort of catching, like, popularity? And some that you are surprised haven't yet. Ginger Bill. Ginger Bill, you first. Right.
Starting point is 00:08:02 I have to first define what I mean by functional programming, right? Great. That's hard problem. So again, as Jose was kind of saying, functional programming is not really a very useful term. You could always use the joke definition where like most people think first functional, they go, oh, it's pure functional programming where you must have stateless and no side effects. And the reason why it has never caught on is because when I push a button, that's a side effect. So therefore, functional programming useless, right?
Starting point is 00:08:27 That's the joke answer. But the thing is, the functional thing is like, does it mean declarative programming that's like also oriented around like functions? Functions is a first class thing. You can pass functions around all you like. And those functions also may have state associated with. So the closures and such. So is it like, oh, is that what is functional programming fundamentally? And if that's the case, all object-oriented programming languages are functional.
Starting point is 00:08:56 Right? Because what is an, what is it? Actually, what is the closure? Closure is an object, right? It's got state and an operation. I'm not trying to say that is the case. I'm just kind of saying, like, this term functional is getting a bit weird. But again, many people just think it's Haskell.
Starting point is 00:09:10 And I don't know if some people would agree, but there's a reason why Haskell never took off. Why? It is effective. It's effectively a research project at the end of the day. It is mostly a pure functional language. And as the joke kind of suggests, it is kind of difficult if you want to do anything mutating date.
Starting point is 00:09:27 and a lot you take in state. And a lot of programs are fundamentally want to do that. And also Haskell is kind of research projects who has everything in it, including the kitchen sink and your mother's dress. Or I don't know everything in it. And it's just, it does too much. So it's really sometimes hard to read it. And the people who enjoy it are usually so high IQ. I'm like, I don't understand anything you've just written.
Starting point is 00:09:50 I'm sorry. It's too complicated. So it's kind of, okay. What features do I think? place. Well, I already think closures are everywhere, right? Every single language has got closures. But, and then there's also obviously the immutability aspect, which I don't necessarily think is good or bad. It is, depends on what you're doing. Right? But to pass it on Jose again, yeah. So you, before, you said that Erling is your favorite functional programming language.
Starting point is 00:10:24 Yeah. So what do you like about Erling? I think that's a good, and I'm asking it because I would love to see if the parts that you like are they what people would classify as a functional part or, you know, yeah. There's another way of phrasing this. Erlang is also my favorite Oop language, which is going to sound bizarre. But the reason why I'm saying that is Erlang has clearly got its concurrency model is better describes like CSP, right? you've got processes CSP for people know it's called
Starting point is 00:10:57 communication sequential processing so you have processes which is just thinking of a generalized thread green threads is another way of calling them this is what go routines are in Go at the same thing right at the end of the day and then you communicate them by sending messages
Starting point is 00:11:11 cross them so in Go they have channels in Erlang you got like the send and receive kind of operations and the same with Elixir as well don't you got the send off the functions and then the irresceive blocks and such. And that kind of aspect there is very, and then everything's immutable by default as well.
Starting point is 00:11:30 So when everything is passing all the messages, there is immutability and also memory safety on a per process basis. So this is kind of a very nice way of dealing with things. A lot of other functional languages who are trying to deal with ideas of concurrency and such, try and do other approaches and I personally don't like them that much, those kind of models. I do like the CSP style and while like Go does. The only problem is it requires a very heavy runtime and it doesn't really scale if you want to start then doing manual memory management like in Odin. So then you have to think, damn it, I can't have that luxury. Yeah. So to me, the beautiful thing about Erling is that, so we are talking about those things about, well, you know, like a functional, well, so if you take a
Starting point is 00:12:26 functional programming language, there are a couple of things. Some people are going to say that a type system is kind of a requirement, like having a hinder, munier or a similar type system is a requirement for being functional. It's a separate discussion. But if you get like the things that make a programming language functional, like immutability pattern matching, when they were designing air laying, they didn't start with that. They didn't say, look, we want pattern matching. We want immutability. What they started was, well, we have to build a concurrent, distributed, reliable system. And then they realized that, well, if we have, if we have, so far concurrency, we need to have many things running at the same time, processes, right? So you have all those
Starting point is 00:13:13 process, which for those who are not familiar, when we say process in Erlang is lightweight threads of executions like go routines, right? So we have millions of those all running at the same time. And then they realize that, well, if those things, they have shared state, if one of them break down, maybe it broke down, maybe something went wrong while it was mutating this shared state, which means that now you have polluted state in your system and which may break all the other process. So they were like, well, shared state in this case is going to get in the way of building a fault tolerance system because if you have a failure, you can no longer trust that shared state. So it's one of the things that keep going back like to discussions with the
Starting point is 00:14:00 Leng team, like people are like, oh, were you trying to do like function or like no, they're like, no, we want to build a resilient, robust system. And it just turned out. that for the kind of system we wanted to build, immutability was really essential. And that's why it's immutable. And people, and for me, like, I had the opposite kind of introduction where I wanted to build concurrent software. And I was doing Ruby running into a lot of mutability issues. And then I learned functional programming.
Starting point is 00:14:32 And then I was like, oh, immutability. So for me, like, for me, the thing that defines functional programming, is immutability. That's my interpretation, right? Because that's what attracted me. And then I ended up with Erlang, but they did not add immutability to be functional. So I think those discussions are very interesting.
Starting point is 00:14:55 So could an object-oriented style language like old Java, if it just was immutable, like everything you passed around was copied wholesale, would that be considered functional then? Well, so, okay, a couple of things. Did you know, I'm going to regret saying this. The first version of Elixir, which is on GitHub, was actually object-oriented. I was trying to build, like, I was, like, coming from this object-oriented world.
Starting point is 00:15:25 Like, well, what if I can have all those things? It was not good for many reasons, right? But to your question, to me, it's like, would it be a functional programming language? Well, according to my criteria, it would, it would, it would, it would be if that's my only criteria, right? But here is what I think about this. So why do I like immutability? For two reasons. It makes the code easier to understand.
Starting point is 00:15:53 For me, it's like, well, if I'm calling something and I know that that thing is not going to change somewhere in memory far away, right? I know that anything it needs, if I have a piece of code and everything, that it needs to function, I give it as an input and it returns as output. That code is clear to understand. I know, you know, like Joe Armstrong, one of the creators of Erlang, he was just to say, like, object orientation is like, you think you are holding a banana, but then you are holding the gorilla that is, you're also holding the gorilla that is holding the banana, and then the whole forest that the gorilla is in, because, you know, you can call something, but that thing can connect to the whole world, and you just don't know. So, so to me, that's one of the big benefits.
Starting point is 00:16:36 And the other one was concurrency, right? If you have concurrency, if you're building a concurrent system and you're not changing the same place in memory, all the data races disappear. And then there are languages like Russ that already gives those benefits, right, through the type system where you can kind of like track the mutations. And so, you know, according to my criteria,
Starting point is 00:16:56 I wouldn't say that Rust is functional, but according to the criteria that I set for myself of I like immutability and what are the properties I get from it, I should be happy with Rust and what Rust is offering because it's offering those similar properties but through different mechanism. I wanted to ask actually about Rust
Starting point is 00:17:16 because I know a lot of like Jose, you came from the Ruby community and there was kind of, I feel like kind of a big you know, like parting of ways for some people stayed in Ruby, some people went Elixir, and some people went Rust. Like I'm interested to hear a little bit about
Starting point is 00:17:33 like your perspective from as that was happening and like your thoughts on Rust as a community where it's going. If you want to share it and then Ginger Bill, I want to hear you rant about Rust too. I would love both. I love both of these things. Yeah, honestly, I don't have a lot of opinions, to be very honest. Nobody's listening.
Starting point is 00:17:52 Nobody's listening. You can tell us the truth. You can tell us the truth here. No, I'm not, I'm not trying to, to, I just, I have very limited experience. Don't follow it. So I think we can jump straight to the. Brent. Wait, hold on.
Starting point is 00:18:07 Before we do that, why, why was the Ruby to Rust pipeline even a thing? Because I've heard about this, too, that a bunch of Rubyists went from Ruby to Rust. Like, why? Because they don't strike me as super similar languages. Ruby seems fairly productive and. Russ. And so it's like, I don't quite understand like that. Like, it just seems like a very bizarre pipeline, right?
Starting point is 00:18:28 Like, I totally get C++ to Rust because you're like, I hate that language, right? And then you go and you do something different. And you're like, this fixes everything. I hate about it or you claim to fix everything you hate about it. I get that. But I just, I've never understood the Ruby thing. I would have just said the Ruby people just hated Python that much that they went, I'll try anything but Python.
Starting point is 00:18:47 Oh, okay. That's reasonable. Yeah, that's my guess, actually, right? Because, yeah, that's usually what I find out when people like, oh, big Ruby fans are going, no, no, I hate Python so much and vice versa, right? Oh, so it's not that they're Ruby fans. They're just anti-Python fans. Yes, I think that's the case, yeah.
Starting point is 00:19:05 So, okay, so let me ask kind of, I don't know if this is true. And then you hear it, right? So I heard that a lot of people went from Python to Go, for example. Yeah, I saw that. So why would you think that happened? And I'm just wondering if you have any thoughts, because I don't think it's as drastic as going. I think Python and Go are definitely closer than Ruby and Rust. And I think most would agree with that.
Starting point is 00:19:34 But why would think somebody who is programming in Python are like, okay, I'm going to do goal now? I actually have a pretty good answer for that one. But, Ginger, I do want to hear yours first just because you're much interesting. My answer is probably similar to yours. Mine was like Rob Pike was, Rob Pike and Ken Thompson and Robert Grismer, who all created a go, mostly Robert Greas's main person, not Rob Pike. But they all made it because they were making sports autonomy. And they thought that they were going to attract those people.
Starting point is 00:20:01 And then they were really surprised when the Python people and stuff were coming to go. I think it's mainly because people wanted backends and their servers, and they wanted something that was simple language and compiled and type, statically typed as well, pretty much. And if when you actually narrow that down, you actually just get Go or Java. Java is not compiled, you know, but I mean, like, there's two options. And I bet many of them also have been bit in the ass by using Java before. So they went, okay, Go is.
Starting point is 00:20:31 Actually, so my store is pretty similar. or we went from a Python shop to a Go shop in 2012. And a huge amount of it was just because we're doing interning or string interning on the server. And Python just stinks at that whole thing. So we're just like, boom, use Go. And so to me, it was all about the fact that back then, Gay was really, really popular, Google App Engine. So like either you're going from Gay Python to GayGo. And like that was the big move there.
Starting point is 00:21:03 and it was for free, practically. You could have all the same data stores. You could have all the same libraries. You could have everything. You could just transfer straight. I just always wanted to say that. But you could transfer straight across with just go. And you could go from Python to go.
Starting point is 00:21:17 And it was like, it was actually super amazing. I also said interning, which is not the correct term. In my brain, I'm just thinking interns. But that is not the, uh, well, string interning. I think like you just don't make any multiple copies of the string. So you can then just keep bringing the back. No, no, no.
Starting point is 00:21:33 I meant kerning in my head. Oh, curding. String, curning. He was so excited to make the second joke that he literally did a plus track. I fumbled the bag for the gay python. I just always wanted to say that. I have had no reason to say Google App Engine in the last 10 years, okay? I even forgot that even existed until you wrote it.
Starting point is 00:21:53 Yes, and so Google, to me, that's actually where a lot of these Python shops went from. Is they're like, oh, I could have all, like, I could literally have everything for free that I already have, but just use Go instead. So let's do it. And also Go had a brilliant, again, at the time, a brilliant, just like web server built in straight away, done. And he just worked. And it just worked.
Starting point is 00:22:15 And scaled well as well. It was like much better than Python. So everything like, oh, Python pigeros, oh, we just have to learn about a bit static typing. And then off the races, you're there. So I can understand it. Completely understand why. But I find it still funny that the Go creators were surprised that they attracted Python people and not the CNC plus.
Starting point is 00:22:32 programmers. Yeah. I'm surprised that they thought that was surprising I meant. Yeah. So I would say, going back to the original question, I would say, I would imagine that a lot of that was like the Ruby, what Bill said, you know, like, you know, maybe you're doing Ruby and every programming language has its pitfalls, right? And then at some point you're like, well, I want, I don't want to be beaten by those kind
Starting point is 00:22:59 of bugs. I want better performance, right? And then I think community also plays a big factor. You can see like the Ruby community was always like very grassroots. Like one of my favorite events in general, programming language events is like Irruco, where the way it works is that every year they present, the conference happens in a different European city. And then at that event, people, and most often people who have never organized an event in
Starting point is 00:23:32 their entire life, they say, hey, next year it should come, it should happen at my city. So they go, they do a five minutes presentation, people vote, and then you have these people, they have a gong that they always pass between events. So it always felt like, yeah. So it's very nice, like very grassroots, very community involved. So I think all those things, like, so technically may not be different, right, but like in terms of community, there may be a lot of similarities. and people who wanted something different, wanted other types of guarantees, they would,
Starting point is 00:24:07 they would, you know, just try something else. And I don't know, like, because I've been, like, mostly part of, like, two communities, like really part of two communities in my life. One was the Ruby one, and then the other one was the Erleng and Alexer one. And it's kind of hard for me to assess what is the, what is the Alexer community?
Starting point is 00:24:30 because I play an important role in there, so I don't know if I can do that job, right? But for Ruby, at the time when I was involved, and it was 15 years ago, it was a very open community to ideas. Like any kind of idea people would try it out, and sometimes that can be a negative, right? Like sometimes you need to have a filter, right,
Starting point is 00:24:57 and not just try everything. But very open to ideas. especially when it came up, like everything that was happening, agile at the time, right? Like people moving away from Java. So all that led to a community of people who just want to experiment and try out. And I think all those things led to,
Starting point is 00:25:15 well, like a lot of people go into elixir, going to Russ, because I feel like a lot of them, they are movers, you know, they are early adopters. They are going to move anyway. It was never necessarily meant to be a long stay. we're still missing that ginger bill rant about rust you have anything you want to say was just going to say that i'm like you're not getting out of this yeah what am i what am i ranting about again exactly about rust here anything anything you want
Starting point is 00:25:44 to say it's the standout i mean i don't have to run you know what i'm going to be polite to russ programmers so i'll try my best not to be too insulting but i was if we go talk about the topic try and keep it on topic right um i would actually say rust is an mL in disguise pretending to be a C plus plus, right? True. Because if you look at it how its semantics works, you've got all, again, ignoring like the ownership of semantics and lifetime semantics,
Starting point is 00:26:10 getting ownership of semantics being, and I find some sort of cruel type system, right? There's the nerdy shit, just to get out there, so apologize to my language. And, well, it's got all there. Many semantics are there, you got all the pattern matching, all that. It's very ML-like, and then they've just gave it curly braces
Starting point is 00:26:23 to make it feel more at home for the people who are used to the C-Bus+, and in many ways, as you know, the creation of Rust is because of the people who are using like modern C++1 is something better because unfortunately with modern C++ you've got all the backwards compatibility of C and the other C++ stuff. So Rust is fundamentally in my view the an incarnation of what modern C++ tries to be plus all of the functional aspects of it as well. My issue, that's the reason why I don't like Rust either. I absolutely hate modern C++. I went through my phase of
Starting point is 00:26:59 modern C++ plus 11 was coming at and just before that as well. And I went through that entire phase. Can we, can I just interrupt you? Is it even fair to call C++11 modern C++? No, that was modern C++ plus compared to before, right? Okay, okay. Right, because you got to remember C++ plus before that they had the next time with like C++ plus 03 and stuff like that.
Starting point is 00:27:24 And C++ 11 was like the big change at the time, right? showing all the brand new features. They had all the ownership semantics. They're better into template improvements. The S-Fenay improvements. The new like smart pointers, the, all these new features which made it modern, if you know what I mean, right? Quote, quote, unquote, modern. So in that sense, that's what I would, again, saying C-Bus plus is modern. Very hard to say. But you know what I mean? That's what they were trying to say. But this thing is, that's the reason why I don't like Ross. It's fundamentally, it feels like that and that's made, I don't want to ever go back to that style of programming because I was
Starting point is 00:28:03 actually typing more than I needed. It was less productive. It just wasn't, I wasn't getting stuff done. It's the best way of putting it. So you're saying there's a lot of ceremony in the rust in the rust in the rust world. Yeah, yeah, exactly. Yeah, a lot of ceremony. There's a lot of, pardon for my language, but I like using the phrase because it's the best way of explaining it, but type masturbation. Yep, I love that. Um, um, um, we can, we, we can, we, we can, we, we, we can, Because it's literally you're doing something and you're not actually getting anything out of it. Now, it's not as bad as sometimes the typescript stuff I've seen with the LLM generated stuff. Oh my God, that's horrific.
Starting point is 00:28:36 But the rust stuff is kind of like that's where people are going down the line. And then you've got also the macros on top in Rust. And it makes me laugh because the very first thing you ever write in Rust is like, Hello World, right? And the first thing you have to do when you do a print is a macro. You don't know it at the time, but there's weird exclamation mark. And then is anyone ever actually looked at how the print, macro works in rust, just go look at it and then tell me you are sane after reading it. It's one of those where it's like, I think they've got a problem here.
Starting point is 00:29:11 And if they think this is sane, just to make a print, but then people say, no, no, we need it to be this case. And I'm like, look, I'm pragmatic. I would just add all that into the compiler directly. I would have just said, not make a generic macro. Just do the thing. That's like, that's very common. If your type system isn't clever enough, don't make a macro.
Starting point is 00:29:29 for it, please. But I think that's just my main criticism. Like, I'm not criticizing people who use it. If it's great for you, great. I just do not like using it at all. Okay, so I have so many questions. It's hard to just put them all together because I want to get Jose in here
Starting point is 00:29:47 because you also, in Elixir, there's also some macro magic that you can kind of get on. And so why macros? Why macros? But I'm coming back for you, Bill, with some Russ questions. I want to go to Bill and ask about macros first and then we can go back to Elixir.
Starting point is 00:30:05 So tell me more like, I think I already got part of your criticism about about macros and if I understand correctly part of it is well, the reason why it has to be a macro is because of the type system and you have to make the type system satisfied.
Starting point is 00:30:23 One of the ways you basically have two options you make that print thing a special property of the language that the type system is going to be aware you special case it that's one way they went the macro route but is there anything else like when you're thinking about
Starting point is 00:30:39 macros there are you like do you think there can be good macros you are there's the same right necessarily against macros per se is there implementation of macros
Starting point is 00:30:53 like yeah i'm just saying if you have a macro system you shouldn't do rust is not the way of the rust should do it. I know Elix has got it, especially you've got the ST modification stuff, which again, which is in an O-Lang, obviously. But I'm trying to weigh a phrase in this. Macros are usually, if you're having to use macros,
Starting point is 00:31:14 it's usually, not always, usually a sign of a deficiency in the language itself. Like there's something missing in the language. Like if you keep going to using this macro all the time, it's like, hmm, there's something missing in this language that I'm actually compensating with. The same with C, right? The reason why C has lasted over 50 years
Starting point is 00:31:32 is because of the macrosus, the preprocessor. If you didn't have that, C, I don't think C would be used anymore. Like, it's there because it gets around the deficiencies of language. It gets me to do bodges and makes you fix things that are missing and all this lot.
Starting point is 00:31:49 And I'm not saying that's a good thing or a bad thing. It's just more of a sign of there's something missing. I know. I love that. And the reason why I love that. So, for one, there is that saying, which is every programming language has at least one flaw. Either they have macros or they don't have macros, right?
Starting point is 00:32:08 It's at least, right? So the reason I really like what you said is because in Elixir is the reason why we have macros is because I was like, look, I have to build this programming language. And yes, a programming language is a bunch of spreadsheets. special definitions, like, you know, a bunch of keywords. So I was like, well, instead of hard coding all those things as part of my compiler, I want to come up with these smaller subset of syntax and compiler code and have that as my foundation.
Starting point is 00:32:45 So macros are there. So in Elixir, we have very few keywords, like death module, death. None of those things are keywords. Those are regular macros. And that was the design principle. So like and and I'm not saying like you're wrong, but I'm just like, you know, like it's very interesting. Say it. Tell me.
Starting point is 00:33:04 Come on. I want it. Yeah. No, I'm just like like this ying yang like you know like and I think like both can be true. Right. It's like it depends a lot of like. So so for me it's like it's very fascinating because yeah for us it's meant to be a feature. Right.
Starting point is 00:33:23 There is also the other aspect, right? And this is the issue with, like, a lot of metaprogramming in general, is how do I debug those macros? Macro compile time print statements. Next question. Yes, tracing. I can't put them into a debugger. This is actually something that's changed my mind because when I was creating Odin, I was going to have some form of, like, compile time execution so I could then inspect, like, the S.T. And all this, do all the magical stuff, similar to what, like, what Jonathan Blow was doing with his language.
Starting point is 00:33:52 And then as I came on, I never implemented it because I kept finding, like, I never kind of really needed it. But then as I was realizing when I didn't need it, it was very much like when I was set down, okay, I'm going to do this. And then it was literally the first thing before I even type to went, wait a minute, how am I going to put this to a debugger? Because I'm like, live my life in a debugger, really. And the answer is, oh, yeah, that's going to be difficult. Because this is actually the hot. This is really the biggest issue. A lot of people love all this fancy compound execution.
Starting point is 00:34:20 And they forget, you know, you can just write a program that writes a program, right? And you can just debug that meta program like any other program. Yes, it's not as all one unified thing makes it all feel magical. But also, you know, that metaprogram usually has to be ran once in a blue moon and then you can carry on. It doesn't have to be run every single time like other metaprogramming tools usually are. And then they usually have to rely on caching, if they've got caching and all this. And it's just, I find it funny because a lot of people saying you just brought the printfd debugging thing as a joke. But I think a lot of people just only do printfd debugging.
Starting point is 00:34:53 Like that's all they do. They don't even know that you can open up at like a debugger. Like, again, RadD debugger is a brand new one. You can add that or MDBG or Visual Studio or any of these visual ones. I hate just GDP so much. But I look like I am a printf debugger and I'm happy. I'm proud. Yeah.
Starting point is 00:35:12 Yeah, this is the thing. But I'm like, I don't even know how my program, other people's programs work. And like how are you not just stepping through the like the statements or the instructions and going like, that's how it works? I know how it works now because I've just seen how the state is a evolving. I understand the print-teph. Like, I do tracing as well, right? Tracing is useful when you work in a compiler because you've got all these flows and you want to know how it goes through the flows. And that tracing is a brilliant thing. But if you're not kind of doing compiler work really like that, maybe it works. I'm in a debugger all the time. Yeah. And that's, there you go.
Starting point is 00:35:44 There's my little rant. Yeah. So the thing about like macro execution and how you're going to debug macros. And that's going to be different per programming language. Maybe we can talk later about Zieg comp time. I don't know if you have thoughts. My criticism applied the same as that. It's the same problem. Okay. Yeah. So, but in Elixir, like, there is really no difference between compile time and runtime. So literally everything that you can use to debug a program at runtime, you can also do it at compile time. Yes. And so there is no distinction. So, you know.
Starting point is 00:36:27 That's the benefit. What my complaint is made with compiled static languages rather than a dynamic language rang on like a VM like beam, obviously. But there's, because in those languages, when you're in a more dynamic language, again, in a VM language, you have these abilities to introspect at runtime and insert code. And if it's, again, the beam is effectively ingitted it's set effectively. So everything is, you've got that beauty that you can use the same. tools because there is no real distinction between this compile time state and the
Starting point is 00:36:56 runtime state anymore it's all runtime as you say and the compile time state is mainly the very very basics if you know what I mean the basic type checking before it goes run yep and that's so my rant still kind of applies but it is the question of okay how if you were doing all this fancy meta programming how do you debug it and it is the question of tooling which a lot of people just, especially when the designing languages, forget. And it's like, do you not actually work on projects where you have to be in a debugger or do work on really complicated things?
Starting point is 00:37:30 And again, this is kind of one of the beauty things is those sort of dynamic languages do work. It's just the compiled ones they kind of forget. And that's why I, again, rust, rust macros, macro expressions, pro macros, whatever, whichever ones you want to use. It's hell. It's hell. And just reading them, let alone debugging them is, it's not pearl levels of, headache inducing, but it's close.
Starting point is 00:37:54 Hold on, Jose, I have to ask this question because I don't know how much all the macros throughout Elixir slowdown compile time, but if you were to go back today, would you put, say, the if statement in deaf modules, if you just had unlimited time, would you put those as actual language constructs as opposed to macros,
Starting point is 00:38:12 or are you happy and you actually would want them to stick as macros? So, unlimited time. You could, unlimited time, No, I wouldn't, that part I wouldn't change. So there are a lot of things that, so there are a lot of criticism to macros. And I think, and I think there are like some misconceptions. I don't know if we started doing Phoenix. So some people say like, Phoenix is mostly macros.
Starting point is 00:38:36 And I'm like, no, that's like. It kind of feels that way. Right. Yeah. But like, I was like, that's, I'm like, that's objectively a lie. Like I can. Yeah, Prime. Yeah.
Starting point is 00:38:47 Yeah, Prime. Dump. Liar. Lyer. Give me any, like, give me any metric that you want to measure, like invocations, definitions, API size, macros are going to be like 5%. The thingful is that the entry point of Phoenix, the router, it's basically macros. And then we can talk about why it's macros there, right? And but, and I think that gives the impression.
Starting point is 00:39:14 But then when you are in your controllers, when you are in your templates, when you are in your live views, it's just regular. code. So the entry point. But wait, what was the question again? If you had the unlimited amount of time and you could change anything, would you bring in any of the macro stuff you've built throughout the language? Like if statements. Any of those things, would you bring them in?
Starting point is 00:39:35 So they are yes. So I would not. I wouldn't change that part of the language. I think it's so essential for what elixir is. Like, well, the goal of the language was to be a small, extensible language. So you can
Starting point is 00:39:50 go and do whatever the heck you want with it, right? And building the language in itself with its constructs. Like, I have to say, like, me as a, my perspective is that me as the language alter, I cannot cheat. I cannot add a construct that is just for me because I decided so. So it's like no cheating rule. Like the rules that I have to create the language are the rules that you have to extend the language.
Starting point is 00:40:19 That's it. right? And I do my best to not cheat, right? I should not be doing that. And it's such an essential part of the lineage that I think, like, if you remove that, it's no longer lexer. It's going to be something else. But on the point of macros, I don't think they slow compile time. I think the issue and, and so, okay, so, so when I decide I'm going to have macros, the other thing that I had is how do I make macros sane, right? Like, because depending on how you design the macro system, it can be something that is impossibly hard to debug.
Starting point is 00:40:59 So when designing elixir, I was like, okay, because I'm having macros, it means that I'm not going to have a bunch of other features, like a global injection of code. That's not a thing that you can have in Elixir. Compile time discovery of modules. So there are other kinds of metaprogramming that other programming language have because I said, look, I'm having macros.
Starting point is 00:41:22 I'm saying no to all this stuff in order to keep the language simple, right? And again, like, the no cheating rule also means that, because I could say no cheating and then I could bloat the language and add a thousand different things because I'm like, okay, right? So all those things, they act as balance.
Starting point is 00:41:43 And, yeah, and I wouldn't change it. But one thing that is very interesting There are two topics that I want, it's going through my head as we are discussing those things. And one of them, like going back to types is, so I had like this no cheating rule kind of thing. And it has worked out well so far, but now we're working on type system for Elixir.
Starting point is 00:42:07 And it happens that the type system throws a huge range at the no cheating rule. Exactly because what Bill said, So if you think about a type system, the thing that you can express in a type signature, like what you can put in a type signature is actually just a subset of what the type system can actually do. The type system can actually do more, but the type theory just does not know how to express those things in the type system, which means that now I have a dilemma in that I'm typing elixir,
Starting point is 00:42:41 and then we have all these features that we have used for a decade, right? And I cannot put a type signature in them, but I can special case them in the type system. And then it will work in the type system. So that's kind of like the, and I think it goes back to what we were saying. Well, if you're designing a programming language and you want to do print LN,
Starting point is 00:43:04 the type system doesn't know how to deal with that, right? So which side, which trade-off are going to make? And that's ultimately like the thing, like you have to make all those decisions, all of those trade-offs, right? And make sure that at the, the end of the day, you don't have like the Frankenstein monster coming out of it, right? Yeah, but to explain like the print F one, I probably skipped over that too much.
Starting point is 00:43:26 But like when I made Odin, one of the first things I kind of wanted to add into language was runtime type introspection. Now, many people make something this. What this means is at runtime, you can actually say, hey, this is the type of the thing. Like, can you give the information about the type? And in Odin, it's really dumb. It's just a basic lookup table. Like, oh, this is a struct. This has got the fields.
Starting point is 00:43:46 Here's the names. Here's the types, here's the tags, here's, whatever, or other properties of the field doesn't instruct. It's that simple, because it's the dumbest one you want to do, and it's ones that pretty much people want. The thing is, is that that's one approach to do in a print statement. The other one is obviously the compile time one, if you do it a compile time language, right? Where it will generate a new print procedure, print function every time with the arguments you put into it. And that's kind of what the Rust approach is doing. Now, there are arguments for both, and how do I explain this?
Starting point is 00:44:15 The rust one sounds great because it's like, oh, you only meet the code for the own generate the code for the code you actually need to print for those types. Great. Yeah, that's combatorial explosion. That's like n factorial that can be as bad as because you've got all these different things. And then your executable size gets worse. You know, compile times get worse. And it's like you've gone screwed up. While the runtime type information approach, like which Odin does, it's a giant fixed cost.
Starting point is 00:44:42 But it's a fixed cost. I say it's giant, it's tiny. but it's like it's a fixed cost and you have one procedure that handles everything, but then you have this giant lookup table. So then you have these different things. So the compile times is faster, the co-generation is faster, and then actually you've only got one thing as well, so it's actually easier to deal with.
Starting point is 00:44:58 So it's kind of like, this is why having like, I know this problem from C++ Plus, other languages that do this kind of like compile time-based printing stings have the, will hit, and they will hit this problem of comatoll and explosion very, very quickly. And it's going to be, this is why you got tradeoffs when you have to think about it, because you have to understand which tradeoffs you take when you're doing design. So that's kind of a thing like when you do a print thing,
Starting point is 00:45:22 because there's multiple options. You can do it the generic ways, which is like runtime or compile time generation. Or you could just have, hey, we have built-in language. Like, if anyone's used Go, they have a bootstrapping built-in procedure called Printline, like Lockees or Printline. That's their bootstrapping thing. So when they were making the compiler, they kept that in to do stuff. They recommend never using it for anything.
Starting point is 00:45:42 But it's like, okay, that's kind of useful. but then eventually they want you to use the fumped package for everything and and the annoying thing about those things is that they are just going to bite you later on when people are actually using the language and they have large projects and it's like well now the the explosions in your face like all the combinatorials yeah it's a problem with language design that that rust creates a separate function kind of like some sort of templating style function for every single print statement you do. From what I understand, if I can remember correctly, yeah, I think that's the case. Now, please, if the chat must correct me, please tell me I'm wrong. I don't mind being wrong. But I think that's kind of how it works for the general prints. It might be a bit clever in how it can reduce everything, but I thought that's how it kind of worked.
Starting point is 00:46:34 Okay. Wow. And also, Jose, just to, when you say cheating, is this cheating in the same way, like Make is cheating and go? where it actually is generic when we don't have access to that level of generics and go for a long time, where, like, they get the special one, but you don't get the special one. Yes. Every time there is a language feature where, like, oh, can I implement this myself? Which is all languages they are going to have, right?
Starting point is 00:47:01 Like, there is always cheating, right? Like, there is always, well, but exactly things like that. That's what I want to minimize. And Elixir allows us to minimize this considerably, because, because we are bootstrapping ourselves on top of the Arlington virtual machine and a runtime, right? So we can really keep the amount of cheating low. But like, for example, places where elixir cheats is, well, data types, right? Like we have our data types, our lists, the posts, that come from our land.
Starting point is 00:47:34 You can't create a data type like that one that is going to work on pattern matching and all of that, right? But when it comes to language constructs, right, like control flow, all this sort of things, in Elixir, they are very few. They are very few. And everything is built on top of that. It kind of reminds me of like in Lua, they have this idea of mechanisms over policies, right? So Brazil mentioned. Shout out Brazil. You got to talk all the Brazil languages.
Starting point is 00:48:04 Right. But it's this idea that like instead of adding this huge set. of language features and then figuring out how all of them interplay, like, Lou is like, no, we're just going to have, like, oh, error handling, that's just a function call. You do P-call, and you get a result, whether there was an error or not, right? It's like, oh, it's all just, it's just functions. Oh, what are files?
Starting point is 00:48:25 They're just, they're just thunks, right? Like, everything is still just functions all the way down for Lua, right? And, like, how do we store data? Oh, it's tables all the way down. Which I think is a really nice, like, idea. In Lua, there's, like, not a lot of cheating from the language either, right? Like, it kind of does the same thing there. Yeah, I feel like Odin is cheating a lot then if you're using this definition.
Starting point is 00:48:49 Tell us more. I don't class it as cheating. This is the thing. Oh. It's fine when you do it. I see how it is okay. I know. I think it's great because I don't feel I'm cheating in this because I make up the rules of the game in my language.
Starting point is 00:49:01 So, therefore, it's not cheating. Oh, house rules. Oh, Gingerbills play. All right. Okay, so why is it not cheating? Or, oh, let me rephrase the question. Why is it good for a language author to have constructs only they control and allowing users to use it but not control it or create them themselves? So I'm going to phrase it slightly differently and then answer your question if it makes any sense.
Starting point is 00:49:29 So the first thing is when I approach language design in general, I'm coming very pragmatic. I'm literally asking what do the general things that people want and then I implement that. Right? Like in Odin we have a built in string type. We have a built in slice array type. to slices array programming as well. You can just add two arrays together and they'll do element-wise operations.
Starting point is 00:49:50 We've got matrices built into language. We've got dynamic arrays built in. We've got a hash map built in, as in its syntax level. It's not just thing. Now, the thing is, I added all these features because this is what people want when they're trying to use more high-level things.
Starting point is 00:50:04 Like when they try and use that in C-Pus+, operate overloading. Well, most of the cases of operator-overloading that they use are to create all of those things I've just listed. Or if they're trying to do... And this is the kind of the thing. It's not that I don't want to give people loads of power.
Starting point is 00:50:22 Is that if you... Or it is actually, if you give people loads of power, they will abuse it, right? But it's also... You don't need to give them the power. You can just give them the tools. Like the direct things, and they'll be polished. They'll have better semantics,
Starting point is 00:50:36 better error messages, better everything. This is kind of thing why I'm saying, I don't think it is cheating. But here's the thing. Odin doesn't have macro, so you can't even produce even further. You can't, don't have operator loading. And when you do need all these fancy things, you're just using basic data types and procedures. And that's it. So you now know where the, the base language is and then the custom stuff.
Starting point is 00:50:56 It's not merged into one. It's not trying to be hidden. And it's like some people are like, oh, I'd really like to have this fancy syntax. And I'm like, no. And that's a very common answer I give most people is, no. Yeah. I agree with that. I think that's exactly the trade-off. And I think going back, I think like everything chips and they don't cheat to certain extent.
Starting point is 00:51:23 It's like what the language chooses as an extensibility mechanism, like operator overloading. Are you going to have those things? Or are you not going to have those things? And I think the problem is when a language has too many constructs. I feel like there is a line in there. where the language has too many constructs that only the language can do. And when a developer has to build a library, they cannot build something that feels like that language that's, that's, you know, like sticks out like a sore thumb. That's when you know you, that's where the friction appears and that's when people feel frustrated.
Starting point is 00:52:04 But if the thing, so you can do a lot of cheating, right, like where to my definition. Yeah. But if at the end of the day, you have the mechanism where people can go. well, maybe somebody wants to do a red-black tree and it feels just as good as the hash maps in the language. It doesn't feel like very dissonant from the rest of the language.
Starting point is 00:52:23 Or you apply that to other things and they're going to be happy, right? Even though they are not going to get all the way, but if they get like 80%, 9% of the way, then they'll be happy. They'll feel like, okay, I feel like I'm expanding, I am contributing, I am
Starting point is 00:52:40 extending the thing that use every day. Yeah, it's just, just for me, I've been seen so much abuse of like operative legend, for example. I've seen so much to the point where I'm like, yeah, you're not having it. I can't even trust myself with it, lelow and others. Like, seriously, um, I've seen people who have overloaded insane stuff and then other languages now allow custom operators. I guess I'm looking at you, Swift. Um, and oh my God, it's actual hell. It's hell and you're in making it worse for everybody, man. It's like, I'm now looking at, what am I looking at? This, this soup of punctuation everywhere. And I don't know what it does. I'm like, can you just have a nice procedure or
Starting point is 00:53:20 function call that just has a very long name that tells you what it is? Just say, this is the thing that bakes the chicken. Just have that. It would be wonderful. Rather than having the percent sign that tells you, actually, this is doing the fancy baking the shing for you. I'm like, of course, it was so obvious. No, no, it wasn't. I have actually seen some really horrific operator overloading and yeah that's why i just no no so that's why i implemented the things that people 99% of use cases even probably higher than 9% and just added them and then most people are now happy yeah those are two things set but yeah operator overloading custom operator those are two things that we like we're strongly agree with i'm like yeah like if you feel need those there's probably
Starting point is 00:54:04 something wrong somewhere right it's like but how can i have job security without those Like I'm gonna write them in and then I'm the only one that can maintain this library. Good question. Ginger Bill, you're stealing my job, dude. If you say that job security, until someone tells you manage it, they've done that, and they're going, oh shit, we need to get rid of this guy now, quick. It's too late by then. It's too late.
Starting point is 00:54:27 I know, it's like, damn. We're gonna have to slowly, it's like, gone, the time just, what is it, the garden time is going to be a very long time. All right, so speaking of too many features in a language, I actually wanted to go back. to Ginger Bill on Rust here. Do you think Rust ultimately will go in the same direction
Starting point is 00:54:47 of C++ where it just feels like every feature in the universe is weighing it down. Do you think it that is crossed this line? I think it did it pretty much years ago. Ooh, really? Yeah. Yeah.
Starting point is 00:54:59 Do you think that's a downfall in the language or do you think that it's a good sign? No, it's a downfall from the start. But again, as I said, I hated modern C++ plus and Rust is kind of the next step in that thing. And it already does all that. There's also these other aspects where I'd be very careful what I mean by this statement. You don't have to be careful.
Starting point is 00:55:22 It's just the four of us. No, no, no, no. It's just the four of us. No, I have to be careful because I know the internet and they'll misinterpret me no matter what I say and how clear it is. Like, I still get people saying, oh, don't you hate LSP's? And I'm like, I made a, I was like, I even caveated for that. And like, no, I just don't use them. If you're using me, whatever.
Starting point is 00:55:39 Right, this is the internet for you, right? What I mean is I think Rust as an idea should have been tested at a smaller scale. Like they should have had all of the ownership semantics, lifetime semantics, which are mathematically prudent, obviously. And then just had them in a very small C-light language with none of the actual other features. And then they should have gone, okay, how do we make this effectively more ergonomic? And then start thinking, okay, we need to add this, then add this, and then add this. But they didn't. They started effectively in the middle and went, right, we're going to do all this.
Starting point is 00:56:09 We need all of the trait system. We need all of the macrosystem. They just started there and then that's what we want. And they didn't start from like, okay, where can we get? Because to me, Rust isn't that ergonomic. I know it's for many people, but like, the thing is a lot of language design. A lot of languages aren't that ergonomic.
Starting point is 00:56:25 Alex is quite ergonomic, actually. That's a fun thing I'll praise about it. But it's like Rust isn't. Rust is also fighting things. And I'm not saying the Borough Checker I'm fighting. I'm usually fighting the lifetime system. Correct. And I think.
Starting point is 00:56:39 think that's a lot of the times people think. Like, I actually want to, I don't want to define my lifetimes based on a value most time, which is how the whole rust thing wants. I usually want to do it with control flow. Like, hey, this value, this value is actually bound to a loop effectively. So when the loop resets, the lifetime is dead. Now, I know he can do that with ghost cells and such kind of, so you can get around those tricks now, the magical invention of a go cell. But even then, it's still a bit of not really what I want, if that makes any sense. I get it. Sometimes you just want, like, I want this thing to live for a function.
Starting point is 00:57:11 It's going to live for a function. It's going to, I'm going to hit some A-Sinks in here. It's just, it's here for this function. That's all I want, stopping annoying. I'm going to pass it around. It's alive for this much. That's it. That's it, people.
Starting point is 00:57:22 I want to specify that. And then doing that is hard. Yes. Yeah. You're saying, though, you don't want the value to define a lifetime. You want to define the lifetime of value. of Ginger Bill. Correct.
Starting point is 00:57:35 Indeed. Put that one on a t-shirt. I'm not going, okay? I'm not God. Okay, I've got a quick question. Gingerbill, since you're well-known for hating LSP's, and Jose,
Starting point is 00:57:51 you're well-known for loving them, and that's why Elixir has three. I'd love to hear what all of your opinions are on LSP in the modern landscape. TJ, how long have you been sitting on that one? I wrote that one. before we got here, boys, and when Ginger Bill mentioned LSPO was like, it's my top shot, boys. I love it.
Starting point is 00:58:15 I love it. I could not wait for that you love him so much. There's three. That better be a short. One unofficial one at the moment. I should think technically is going to get, there's two unofficial ones in Odin as well. Like, this is an IntelliJ one as well, I think. But not official in Odin, that's all, because official would mean I'd have to work on it.
Starting point is 00:58:36 That's about, yeah. And that's the, is that the main thing for you? You're just like, I don't want to spend any time on it. I don't want to ship it with the language. I actually have a main job to deal with at Djangra effects. So, yeah. Let's say I was a super big Odin fan. And I had a company, you know, Rangra effects.
Starting point is 00:58:56 And I was like, hey, we want an LSP super bad. I can donate either an engineer's time, full time, ad infinitum for the next, for however long, or the amount of money that you would require to implement it. Would you say yes to that as an Odin first class LSP? Or would you still say, nah, deal with the community. This isn't where I'm going to be. We don't do that here. Depends on the price, and I'm not even joking.
Starting point is 00:59:21 I'm not saying I'm being bought. I'm just saying it's more of like, okay, if you're going to do this, what I would have to do for Odin's, I'm going to rewrite the actual compiler completely. So then it's going to be built up from the scrowned up to the compiler and the LSP are the same thing. There is no separation. So you've got that there. Now, when I wrote the compiler, I wasn't even thinking about it. It's one of those regrets where I should have made the compiler be a library as well.
Starting point is 00:59:45 Like it should have been designed to be acted as a library. I just wrote it to be a single thing that runs chutes off and be as fast as possible. It is quite bodgy. It's all interconnected. It's not a library-based thing. But it's fast-ish. There's still slow bits in it and LLVM really slows it down. But that's the thing.
Starting point is 01:00:01 So if I was going to do the LSP route, I would just rewrite the compiler so I could use it as a library so then you can get the LSP aspects and you've got. all of that, especially a lot of it. That's what I'd do. And I, but that's the thing is next time I write the compiler, we'll probably try and design it so we've got the LSP. I know a friend of mine who wants to write new Odin compiler, calling it Thor, obviously, because it's the son of Odin.
Starting point is 01:00:22 And then, um, very cute. And he wants to work on that. And I'm like, sure, but he doesn't have any time. Because of course, he works at Djangrafx as well. So we have, it's called lack of time. So that's half the problem. Yeah, people bring up like LSPs, right? It's like, oh, why can't you have a good LSP, right?
Starting point is 01:00:42 And then they usually, yeah, they would usually mention like TypeScript or something from Microsoft. And they're like, oh, like, why can't you have it? And I'm like, oh, are you telling me that I should out of nowhere just do this project that Microsoft spent millions on because they had to restructure the whole compiler and redo a bunch of things to support it, right? Like, that's the thing that people means. Like, it's actually a complex problem, right?
Starting point is 01:01:10 And, um, I love that they picked TypeScript, the one that, like, everyone has to restart constantly, doesn't scale the big projects. It's terrible. Categorically, the worst known LSP, also the inventor of the LSP. Yeah, this is also the other thing about LSP. Like, this is actually like implementation detail. I actually dislike about them. They were designed by Microsoft, obviously, and it's a protocol over JSON. It was JSON op.
Starting point is 01:01:34 PC or whatever it is. I can't remember what the exact thing is, but they're sending a JSON packets to send all this information. And they've got a borderline like saying, hey, this is a this is kind of the general idea we think all most languages work on. And it's kind of like, great. So if your language doesn't fit in that category very well, you're a bit screwed. Or you want to do something else. It doesn't work. But this is Microsoft. So they kind of standardize it. It said it worked for all these different languages we kind of test it on. It's like, great, great. Or if you don't use Unicode 16, which is definitely the most popular recording it is it is the best utf 16 is the best because of course Microsoft have been using it
Starting point is 01:02:09 for the past 30 years hold on a little bit longer hey javascript was originally all utf 16 okay buddy so is python that's why yeah yeah someone's like that i don't think that's the reason why for javascript what is javascript i i think the reason why utf 16 is used is because um for most languages, you can then index it and get the right code point. However, that's dangerous as hell, because that means that's for code points. Okay, I'll explain this. I'm going to explain you in code. Okay, but here, Gingerbill, though. I got a question. So, like, 16's bigger than eight. Yeah, explain that one. Gingerbill. Checkmate, Gingerbill. I know that's mean, man. It's bigger. Unicode version 8 through, Unicode version 16.
Starting point is 01:02:59 32. What about 32, man? Yeah, we should be using that. You know what? Registered, aligned Unicode. We should get Unicode 64 and just start reading them like that. That would be the true superiority. UDF 64. Microsoft, we're ready for it. It's a little bit wasteful, man. Come on, come on.
Starting point is 01:03:20 And also, we now, nowadays we can just have even bigger registers. Like, how big are the biggest things? 512 is the biggest register we have on some machines now, right? So that's a little great. Well, if you think how many emoji we can have. That's what I was just going to say. There's so many emojis left in the world. You don't have to have all of the different things like the Fitzpatrick color modifies and the family modifies and all that.
Starting point is 01:03:40 You could just have one giant emoji. You have them all. I think we solved it. We did. You're welcome, Microsoft. Yeah. I'll set my bill. We're going to be charging you one Microsoft salary for that.
Starting point is 01:03:54 Oh, I'd like that, thank you. By the way, no problem. It would have to be a distinguished engineer because, Only a distinguished engineer could come up with a with a plan this good. Oh, yeah. All right, Bill, I'm glad that I'm glad to hear that you also have feelings about Unicode. I'm glad to just see that spark, spark happiness within you. Speaking of feelings that you have, Ginger, Bill, let's talk package managers.
Starting point is 01:04:19 Oh, yeah. Okay. Okay, okay. This is my last question that I had prepared. So we can, we can end. That's fine. That's fine. That's fine.
Starting point is 01:04:26 I don't know if Jose is going to hate me or not for this Well I figured if it goes bad Well I just cut this from the end of the episode And then we No no no we turn it to a clip and we put it on the clips channel There we go And I'd be really serious voice Looking into the camera going
Starting point is 01:04:42 Yeah Yeah Yeah whatever yeah You won't believe what Ginger Bill said about package manager Even worse than the LSP's No I actually think LSP's a fine I actually hate, I think, how do I put this? I'm going to use real words of languages.
Starting point is 01:04:58 Straight to the camera. Package managers are evil. Oh, that's so crazy. Let's hear more. That's why it's called Hex. I didn't put two tunes together, but yeah. I think we discovered something big, Chad. All right, Ginger Bill.
Starting point is 01:05:21 Tell us a little more. I want to hear you and Jose talk about it. To explain what I mean, I need to make some distinctions again. because, of course, I like making distinctions. I like Aristotle. So the distinctions here, I was like, you need to make a distinction what are packages, the package manager, package repository,
Starting point is 01:05:37 and the build system. These are all separate, and in fact, you can have them all be separate and have no relation to each other, pretty much, right? So I have nothing wrong with packages whatsoever. In fact, Odin has packages built into the language. I have nothing wrong with repositories
Starting point is 01:05:51 because that's how a lot of people find discover new packages. It's effective just a search engine, right? there's nothing yet search engine. I use Ducklergo every day and Google and many of the search engines because they're all pretty bad now, so I have to keep swapping between them all. The other aspect is I don't build systems. That's usually like again, that's language dependent. If we're talking about languages here, obviously.
Starting point is 01:06:14 So in Odin, I try and make it minimize the need for a build system entirely. Like Odin build dot will compile even those complicated stuff for Djangrafx because we define all the linking stuff in the source code itself. So in the language itself, like it's not. separate and if we don't use it doesn't get linked against and so and so forth. So that leads package managers. What do they do separately? Well package manager effectively downloads the stuff from a repository and then handles the dependencies and tries to fix them around and everything like that and downloads its dependencies and it's dependencies and you can probably see where my criticism's going. This is
Starting point is 01:06:51 automation of dependency hell and the problem is is I've said this before, I even said this before on a stream here before, like not everything needs to be automated, especially hell. And dependency hell is a real thing that I think many, if any people said I'd been on a large project before, they'll be, been in before, right? You've got literal thousands of tens of thousands of dependencies. And you don't know if any of them work properly.
Starting point is 01:07:19 You don't even know what the bugs are. You don't know how it's all going to be handling. And it's awful. And it's just like, this is the wrong thing to automate. if you actually had to do it manually, it doesn't stop me getting into hell. You can put yourself into hell. That's really easy.
Starting point is 01:07:32 Actually, everyone puts themselves into hell. You do that voluntarily. But the thing is, it's more to do with how quickly you can get there and also makes you have to think. If you download it manually, you start thinking, maybe I don't want this or maybe I actually can do this and merge this. And then when you update, you just have to be very careful and do it independently and that stuff.
Starting point is 01:07:53 That's why general criticism is like is automation up for that problem. And this is why if you look, MPM, it's awful. The other problem is also packet managers, is a lot of package managers actually have to find what a package is because the language they're dealing with doesn't have a well-defined concept for a package either. NPM is the best cost, a good example of this, because also there's multiple of the package managers for Node that I can never remember. Because that now means you have to have a package manager manager. That's apt. That's apt.
Starting point is 01:08:23 That's apt. Paru are the package manager managers. This is where things get like, because you haven't got a well-defined concept of what packages in the language, that happens. Now, luckily, Elixir has a well-defined concept of what a package is. So Elixir doesn't suffer from that problem. But loads of languages don't have a well-defined one, and it really, really shows. Yeah. And this is why I'm saying it's evil in the sense that it will send you to hell quicker.
Starting point is 01:08:50 Hold on. Before you jump in there, Jose, I have a quick question for this one with Go. go just seems to have this weird thing where I don't seem to need a lot of packages does go having a package manager but not seeming to like the entrance to hell seems far and hard to get to is there something special about go that never quite arrived there because like I don't have 400 dependencies when I do a go project yeah so go has a really good core library it's not a library right that's it has the batteries included like that's what I tried to do with odin like when you download in you can start doing pretty much anything in it right I just
Starting point is 01:09:21 want to be able to download and here's the difficult go is like that. That's why if you want to make a web server, you pretty much don't need any third-party libraries if you just want to make a HTTP server and you're done. You can even write a whole LSP. Like I wrote an LSP. Yeah. Do you just write it from scratch? No compilers. Yeah. So the Go standard library has a Go compiler in it. In fact, it has two go compilers. Mm, backup. Well, it has the actual Go compiler and then it has like the high level one that
Starting point is 01:09:50 you can use. Yeah, it's kind of, in the sense, it is kind of a backup. It's just like one's The Klingon of the French. Oh, God, that's a, that's a so nerdy joke, man. And it's so bad that I know that joke. All right. Sorry, Jose. You're bit. I want to hear the response.
Starting point is 01:10:07 Klingon-on-a-physiology. I can't remember the one. Is that one? No, no, I, that's pretty good. I agree with a lot of that. I like to say that the word dependency, like, lost all of its meaning to developers, Like in life, if you say, like, you have a dependency. It usually means like something you are response, which is exactly what it means in programming, right?
Starting point is 01:10:30 But in life, like you have a dependency. Yes. Like something that, you are responsible, right? If that thing do something wrong, like you may potentially end up in jail. Like, it's a thing. It's a thing where you should worry about. You have to take care about it every day. And package dependencies, they are kind of pretty much the same thing.
Starting point is 01:10:53 right so and and we don't we're just like oh I'm just going to add a dependency I don't know what it I don't know what it does it's just like this thing based on trust with no verification yeah and yeah and the package managers they they do automate that right so if you yeah I I agree like you have to if you're going to have like a package manager you have to have counterbalances for this thing. You need to have or a culture. I don't know, but you have or like discussions where you balance those things.
Starting point is 01:11:29 So when I'm starting a project, I'm not automatically bringing 1,000 potential like attacks into my, into my app or, you know, 10,000, 100,000 lines of code that I am kind of now on the hook to maintain it, right? If something goes wrong, you know. It's not even security things. So people say it always bring up security, like, of security risks. I'm like, they're not even the biggest worries.
Starting point is 01:11:58 Like at work, we use SDL2 for window handling and input stuff. And the amount of bugs that we have found, and we absolutely hate it to the point where we're actually, I'm actually going to probably write it in the next couple of months, just writing our own window handling map from scratch. Because then at least it's our code. We can depend on it and we can trivly fix it. And we're not relying on an extra dependency, right? I know many people are, but SDL is great.
Starting point is 01:12:19 It's used by millions of different things. I'm like, yeah, but we keep hitting all. the books. But it's great, but it's great, though. It's great, though. And it's like SDL3 might fix it all, but it's like great. But the time to integrate SDL3,
Starting point is 01:12:34 in the same time, I could just write it from scratch. And that's fine. And this, in some sense, I'm not saying I should I advocate everything that were written from scratch. I wish there were just libraries that just worked. But still, I have to depend on them. And they're a liability.
Starting point is 01:12:49 And not necessarily security liabilities. but it's just bulk liability. Yeah, liability. Agree. So liability. OTP helps a lot in elixir. Just like there's a lot of things that come with the air laying, like runtime and everything that creates more of a culture.
Starting point is 01:13:09 Like, I mean, when I'm doing elixir stuff, I'm using Phoenix a lot. So like, and Phoenix is a wide-ranging, large scope thing. You know, you do a lot of stuff with it. But it doesn't feel like it's, you know, infinite to pay. dependencies, right? It does feel like, well, after I get my first round of Phoenix ones, I'm not adding tons of dependencies every week to like mix those around. So it seems like there is kind of a culture in Elixir not to install a trillion things. I don't know. Yeah. I think I mean, I think part of it is exactly like I know I have this opinion. The Alexer Corps team has this opinion. Chris has this opinion. So we are very careful. We are not creating. a bunch of dependencies, right? And that ends up reflecting on the initial experience of a lot of people and they end up like propagating it.
Starting point is 01:14:03 But regarding dependencies, one of the things that I tell people is like, look, whenever you are going to add a dependency to your project, go and read the source code. Like just read the source code. Go through the thing. Like the amount of times I think, oh, I needed this dependency. And then I'm like, oh, actually, I just, if I get one third of three modules, I have the whole thing in my app, in my tests,
Starting point is 01:14:31 in a way that I can control without bringing all that other bloat. And then if the thing is good, you read it. And they're like, okay, I actually, I can actually trust this. This is good code. Or you're going to learn something. So a lot of my initial open source career came from that, came from looking at dependencies, seeing how it's done and say, actually, actually. I can just do something smaller and I'm going to publish that instead or oh I I don't like
Starting point is 01:14:59 the way this is implemented I can do something completely different which I think is going to work on these better ways and yeah just from reading dependency code I always read whenever I add something as a dependency I'm like that's my like that's my self-imposed tax you know it's like I have to read it if I'm going to add it I have to read it yeah if that's assuming you've got source otherwise you have to reverse engineer it. And I've done that a few times. But yeah, that is the problem. But if you, this is the point, people don't vet their code in general as well.
Starting point is 01:15:36 They don't check to see if it's good or bad. They just assume it works. There's this problem and it's a societal issue. Program is a very high trusting. In a place which is you should have the least amount of trust possible. But is this because, to put it bluntly, a lot of programmers are coming from very developed countries, which are very high trust for the most part, and their cultures are like that. So they're going to replying that to the rest of their world and stuff like that, and it hopefully works.
Starting point is 01:16:05 And I'm like, it's right, great. So you only need one person to do something malicious and everything, these millions of people who depend on one thing, you're screwed. And that's not necessarily a security thing. When I say malicious, they could just make a funny book, where if you click one pixel on the screen, it just now has Rick rolling you. But it could be... Next to a release. Next elixir.
Starting point is 01:16:25 Think about it. I know. I like that. Think about it. But no, I would actually argue, so I'm going to put a separate argument for why I think that it, why I think that exists. I think we've had a couple things. One, we've had a explosion of engineers over the last 10 years that are all coming into this, just at the advent of really package managers coming out in all these languages, right,
Starting point is 01:16:46 all at the same time. And so programming felt very daunting, right? Like when you don't know how something works, it feels very daunting, especially when you when you first start out. Like you don't know a lot about programming, so things feel very daunting. But the thing that I think is really confusing, at least this high trust argument you make,
Starting point is 01:17:01 is that there's this weird, it's almost like, gentlemen's amnesia, if you've ever read this, you go to a magazine, you read about horses, and you're like, oh, man, I know all these facts about horses. You flip to the next page,
Starting point is 01:17:11 it's about JavaScript, and you're like, man, they got everything wrong about JavaScript. You go to the next page, it's about something else. You're like, man, I know a lot about Beatles. But then you're like, you just forgot that they were super wrong on the thing you understood,
Starting point is 01:17:21 but you think everything else is completely correct. And so engineers, like you will never find an engineer that doesn't go like this. Oh, my coworkers, dude, some of them are so horrible.
Starting point is 01:17:31 Hey, here, let me download this library off the internet. This is going to be awesome, right? It's like, it's crazy. It's like they just, they look and go,
Starting point is 01:17:37 oh, wow, yeah, like one third of our staff can't program anything. Also, I'm going to trust every open source package I've ever downloaded. And so there's like, definitely like a gentleman amnesia
Starting point is 01:17:44 for programming code that I think we just put on that people who do open source or open things are the best of the engineers, which there's no, you know, there's no gate there's no gate there. It's just a thing. It's because they're assuming programming as like any other industry,
Starting point is 01:17:59 like engineering that's been around for thousands of years or science, which in modern compilance has been around, what, for 500 years. Again, like Gellman Murray explained in there, he was a particle physicist, right? He is the guy who came up with and then came up with quarks, these somatomal particles that make up like protons and neutrons and such. And the guy who came up with his name. You can have to make stuff up to make your point, Ginger Bill. Ginger Bill, stop trying to sound smart, okay?
Starting point is 01:18:24 Yeah, okay, come on. Stick the programming. Stay in your lane, buddy. More fancy, because I know where the story comes from. I know. You meant quite a lot? Those crystals? No, no, the crystals.
Starting point is 01:18:35 Oh, so now we're... Okay, now crystals have power, Gingerbill. Okay. Okay. They had power. It must be true, okay? Look, he was a smart dude. He was also a wrestler, so you want to want to mess with him.
Starting point is 01:18:48 So, um, but no. Yeah. But this kind of thing. thing is like this is a it was Michael Crichton did it you know the guy made like West World or Jurassic Park he said he was friends with him and he was like he knows the show business this guy knows physics and when you read the newspaper they talk about it's oh this is bad and they all believe everything else and it's like yeah you do because you trust people you believe because I know this is my expert like this would go
Starting point is 01:19:10 back to my old Monarchie Plus Plus ram I was doing it because I was kind of trusting who I perceived to be the experts because they were all telling me this like on the internet you go on all these articles and conference videos and books, they all kind of tell you this. And I'm like, even at the time, I was like, this seems a bit weird. But hey, they might be right, because it might be as a scale on and as I go, this will benefit me as I go along. Because I was just kind of trusting this, what I perceive to be wisdom. But then as I've now gotten through more programming, I'm realizing there's no wisdom in this industry.
Starting point is 01:19:41 Non, well, the very, very little wisdom I would put. And that were in so many days. And it makes sense because as I've gotten older, I've gotten more knowledgeable about certain things. I'm like, there's no evolutionary selection pressure. This industry is probably 70 years old, 75 years at max. So it's like, this is not old enough to get rid of all the literally bad things. We haven't evolved quick enough. We'll find out in probably a few hundred years.
Starting point is 01:20:04 I mean hundreds. We'll find out where the good stuff is. And at the moment, I don't know if we know any really good ones. Like, I think the only kind of law that we have in programming, like Casey would say, is like Conway's Law, which is like the structure of an organization will effectively maps itself on how they structure their code
Starting point is 01:20:26 and their projects. But that's about it. Does that make sense? I got one last question to end. I can't believe you didn't say this. Ginger Bill. Books, you shouldn't read books. That's what he just said.
Starting point is 01:20:44 Books are for stupid people. Well known, LSP, and book, hater. Ginger Bill. Books. What are those things? I don't know. Just don't kill a tree.
Starting point is 01:20:56 Don't read books. You're killing trees, man. You hate the environments, Marr. I always quote the Simpsons meme. I'm here to lead, not to read. That's a great one. That's a classic.
Starting point is 01:21:08 Okay, my last question. Short, short answer. Think you got to boil it down to one sentence for each. If you're giving advice to someone making their own programming language today. What's the one piece of advice you'd give them? Don't do it. You can't say don't, Ginger Bill, because I know that's the first thought. I don't know. I wasn't saying that.
Starting point is 01:21:25 I was never going to it. Jose actually beat you to it. He was already like, don't, don't do it. All right, one sentence. Ginger Bill and then Jose. Learn the basics of how to do tokenization, passing, and when you do in passing, you only want recursive descent and Pratt passing pretty much, and then you start learning types of stuff. Start with a very, and the very, and, and, start with a very basic language. that, and I mean, when I say basic, I mean, can it do arithmetic? Nothing else. Don't try and recreate Python.
Starting point is 01:21:58 Start even smaller than that. Okay, so you said tokenization. So start with a crypto coin. Got it. Jose, you're up. Listen to Bill. Great answer. Damn, that is a good answer.
Starting point is 01:22:11 Good answer. Good answer. Good answer. Also, Ginger Bill, I did catch that CS Lewis quote in there. You know, all people choose hell one. You're welcome. in there. I thought, I was like, look at that guy. Hey, yeah. I love. Oh, God. I love that book, the books in general. But, uh, all right. I, I know, I, I technically don't have any more questions. I think, I do actually
Starting point is 01:22:32 have, I have so many questions in some sense, but I don't know if we should, uh, keep going or call today because we're actually, I have to go. Yeah, you have to go. I have to go. We'll come back. We'll let you guys back on again, and you can argue some more. Yeah. I mean, uh, talk. Yeah. It was very fun. Yeah, that was good. All right. Are you going to close the episode?
Starting point is 01:22:55 I'm going to close. I never closed the episode. I always forget. Hey, thanks for watching the stand-up with me today. Was T.J. was a Jose Valim, creator of Elixir and Ginger Bill creator of Odin. Soon to be Thor. You're about that. You're about to be a granddad.
Starting point is 01:23:13 Is that a thing? Can you be a granddad in languages? Maybe. Joe Armstrong, the creator of Erling, he considered, you know, he would say elixir, it's like his grandchild. He's a grandfather now. I mean, at this point, if that's also, I mean, Nicolas Xavier, the creator of Pascal and also worked on Al Gore and all a lot. So Algoal, pretty much the stemming of every single, like, that imperative language from now on. Yeah, at that point, he's not a grandfather.
Starting point is 01:23:44 He's like, great, great, great, great, great, great, great, great. He's Adam, right? Adam and Eve, yeah. He's the Patriot. Yeah, he's Adam. Now the question, who is Eve? Obviously, Fortran. She's a little older. I know on the next episode of the stand-down.
Starting point is 01:23:57 Yeah, there we go, Fortran. Now, that is, yeah, there we go, Fortran. All right. Thank you very much for watching this. This was another episode of the stand-up. I've never actually closed it. The stand-in-law. I don't know if you were going to say anything.
Starting point is 01:24:10 Oh, okay. Bye. Bye. on my screen Terminal coffee And hair

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.