Skip Navigation

Why do they keep making new languages

Why are there so many programming languages? And why are there still being so many made? I would think you would try to perfect what you have instead of making new ones all the time. I understand you need new languages sometimes like quantumcomputing or some newer tech like that. But for pc you would think there would be some kind of universal language. I'm learning java btw. I like programming languages. But was just wondering.

121 comments
  • Different programming languages have different types of strengths. C is good for bare-metal performance and hardware interactions, Python is good at versatile interactions with all kinds of software and systems, Node.JS is good for asynchronous operations, and so on. Some esoteric languages aim to make things easy (or make them possible in the first place), or make things faster, or more secure, or etc. The things you can write in one language don't always translate to another, and sometimes people create a new language that makes things possible that didn't used to be possible. Machine learning wouldn't be where it is if everyone who's currently using Pytorch was still using C and doing all their own memory management. I'm currently working on a project in Node that would be much more difficult in Java, because Node's approach to asynchronous operations matches this problem way better than do the primitives that Java's runtime makes available. And so on.

    Is any given language that gets created going to be the next Python? Probably not. But everyone who makes one has some kind of idea that there's something unique and wonderful within it, and you can't tell if they're right unless you let it happen and see how it plays out.

    Edit: Okay lemme clarify: Node.JS is good for a particular type of (generally I/O bound) asynchronous operations. It makes simple things easy and fast, at the cost of making some complex things pretty much impossible, so there are a bunch of problems it's not good for. Better with the caveat maybe?

    • If you have time (and the inclination!), would you mind explaining why Java's primitives aren't as good as Node visa vie Async ops?

      • It's not a matter of better or worse (in this particular case -- there is such a thing as languages that are just plain bad). In my opinion, it's just what you're trying to do:

        So Node uses a multiprocessing model where your program won't be interrupted in unpredictable spots -- there are very specific places where a function might pause waiting for something to happen, and give way to another function, but during ordinary ("synchronous") operations you can be guaranteed that the program won't be interrupted. That makes things hugely simpler because in general, you don't have to mutex-protect your data structures, you don't have as many weird subtle bugs that only crop up during certain thread interactions that are extremely difficult to debug. That's the upside. The main downside is that because it's a single-threaded model, which means (a) you can't easily scale up your program to multiple CPUs and (b) if you have a long CPU-bound operation, it'll happily block the whole rest of your program from executing no matter how many problems that causes. It's excellent for network-I/O-bound workloads, because you're probably not heavy on computation and it's simpler to program and more robust than using multithreading in that case. Although, you do have to learn some new primitives and make sure to be careful with CPU-heavy operations. Then there are a lot of workloads where it's awkward to try to use.

        Java tried to do multithreading all the way from the ground up, to make everything thread-safe (which is actually pretty unusual for a full-featured runtime environment, because it's a lot to take on). The upside is that if you need that, it's gold; you can write your normal application and then run it on a 64-core processor and all of a sudden (relatively speaking) everything just works, which is great for massive-within-a-single-process scalability. The downside is that (a) you will get people who disagree vehemently with you on whether within-a-single-process scalability is worth the complexity cost you pay, and (b) if you're just trying to write some code where you don't care about threads, guess what? You have to care about threads. You need mutexes, you have subtle bugs and deadlocks, you have lots of extra testing headaches, or else: You can sort of close your eyes and run your Java application single-threaded, which defeats some of the purpose, and also God help you if later on you ever want to try to make it multi-threaded.

        Neither one I would say is right or wrong. There's a whole third way, which is actually what most environments do, which is that you say that a lot of things in the runtime aren't thread-safe, and so if you want heavy scalability you do it with multiple processes, and if you need threads you need to take on the responsibility of tiptoeing around the non-thread-safe stuff. That's sort of a mess, which is why both Java and Node take different more coherent approaches to it.

      • There isn't one, java is excellent for async and multithreading and it does it properly unlike node that fakes it by running on a single clever event loop or stealthily launches a bunch of node instances in the background depending on implementation.

  • Think of a programming language as a crutch for the human brain. Processors don’t need it: they don’t have to think about the code, they just execute it. Our mushy human brains need a lot of help, however.

    We need to think about things on our own terms. Different programming languages, different APIs that do the same thing, different object models, these all help people tackle new problems, or even just implement solutions in new ways.

    Some new languages have a completely different model of execution you may not be familiar with. Imperative languages are what we traditionally think of, because they work most similarly to how processors execute code: the major pattern used to make progress, do work, is to create variables and assign values to them. C, COBOL, BASIC, Pascal, C# (my personal favorite), Javascript, even Rust, are all imperative languages.

    But there are also functional languages, like ML or F#. (The latter, I keep installing with Visual Studio but never ever use) The main pattern there is function application. Functions themselves are first order data, and not in a hacky implementation-specific way like you’re passing machine code around. (I’ve only ever used this for grad school homework, never professionally, sadly.)

    And declarative languages like Prolog helped give IBM’s Watson its legendary open question answering ability on national TV. When you need a system to be really, actually smart, not just create smart-sounding text convincingly like a generative AI, why not use a language that lets you declare fact tables? (Again, only grad school homework use for me here)

    Programming is all about solving problems, and there are so many kinds of problems and so many ways to think about them. I know my own personal pile of gray mush needs all the help it can get.

  • Think about this: Why are there so many automobiles? And why are so many new models still being made? I would think you would try to perfect what you have instead of making new ones all the time. I understand you need new automobiles sometimes, like construction equipment trucks or some treaded military tanks. But for average daily driver you would think there would be some kind of universal automobile. I drive a Corolla btw. I like automobiles. But was just wondering.

    I’m not here to mock you, just providing an analogy. You can deliver just about anything in one language that you can with another. However, like the car, you might need a different type if you want more performance. Maybe you want a fast car. High performance cars often need a lot of attention, they need that premium gas, the mechanics demand higher pay! What if you only care about getting from point A to point B, and you’re more concerned with driving a car that’s cheaper to maintain, maybe there are just more car mechanics for that type of car, and the cost to pay them is cheaper.

    A C application that is very well tuned to manage memory and threads in the name of perfect performance will require more time and computer science knowledge to create when compared to a Python script that does the same thing, but in the most basic possible way running on a single CPU, running hundreds of time slower.

    Sometimes you need the performance, and often you don’t. Sometimes you need a treaded tank, sometimes you need a NASCAR, and most days the Corolla does just fine, it’ll even let you miss a few oil changes before things get bad.

    As to why we don’t perfect what we have now instead of creating more: technology changes, easier to work with abstractions come about, some people enjoy the hobby of creating a language, or maybe a niche language comes about with very specific trade offs for a very specific purpose, no one wants to break backwards compatibility by adding new features and syntax to their language - I’m sure there’s tons more reasons to list.

  • Well I guess I am part of "they" since I have my own programming language pet project. Why did I create it? Because I wanted to, mostly. Sure, there are also some finer language design choices I wanted to choose differently for my preference, but mainly I just wanted to learn how.

  • I know a handful of languages and I think of them as tools. For example, a flathead screwdriver will work on a phillips screw head (In most cases with some outliers), but a phillips screwdriver might just be better for the job. Same with a wrench and a socket with a ratchet, etc.

    When it comes to programming or scripting I approach it in the same way. If I am at work, and I need to automate something quick and dirty, no end user will need to use it, and it is just adjusting data or spitting data back at me, I am probably going to write it in Python.

    Or, if I need to make something that an end user is going to interact with, I am probably going to spin up a web server and use the MERN stack to create that.

    If I am working at home on a TUI for my favorite application, I am going to use Rust or Python

    And if I working on a project that requires me to work with embedded systems, I am probably going to reach for C, maybe C++ depending on the support, and I have in a couple of instances needed to use Assembly.

    All this to say, I think that if I had to use Python for all of these, I would be in trouble. Same as if I had to use C++ to accomplish all of the above. Could it be done? Sure. Do I want to do that? Not at all.

  • For various reasons.

    Different languages take different approaches and models to do stuff. Thus making each one better or worse for different challenges.

    For example, python is easy and quick to get up and running. Bug it's slow and unsuited for low level programming (like OSes, drivers, and embedded stuff). On the other hand, C is very fast and very low level, allowing you to make both high performance programs and low level stuff, but it's a nightmare to use and you will run into all sorts of problems that an easier language, like python would avoid. All of this is mostly due to python being interpreted (instead of compiled) and c having manual memory management.

    But they might also take a different approach at computation, like for functional languages (opposed to imperative languages) which try to solve problems in a more "mathematical" and declarative way, instead of defining a sequence of instructions. Or, even more, logic programming languages, in which you define a series of logical statements and the language tries to find solution and draw conclusions from them.

    And some languages are designed around some particular concept that they think is beneficial and worth exploring, maybe taken from various other languages and put together, like rust which is designed around the RAII design pattern and takes large inspiration from functional languages, while still being and imperative procedural language (like C, so not object oriented). Or java which was designed to be a portanle but performante object oriented language, with support for low powered embedded system, full of features but simpler than c++, etc... all stuff that now is nothing special, but remember that java us very old. Or kotlin which tries to be java (they are interoperable), but modern and better and more "pure" or "consistent". Or c++ that started as an object oriented superset of c, but then started adding every single feature of every other imperative language, and never giving up on older stuff, to the point of becoming very hard to use correctly while making it very easy to screw yourself in the most intricate ways.

    And of course there are domain specific languages (opposed to general purpose languages). Which aren't even necessarily Turing complete. They are designed for one purpose only, and they do that better than general purpose languages. For example AWK for text processing, or SQL for databases, or matlab for scientific calculations, or TeX for typesetting, or GLSL for shaders, or coq for theorem proving. And here imagination truly is the limit.

    So, the point is, every language is more suited then other for some kind of work. And when people stumble across some problem that is hard to tackle and come up with some approach to solve it, or when they grow fed up with the issues of some older languages, they often like to make a new language around that. And some times this leads to entirely new paradigms which are worth exploring.

    P.s.: I like languages:)

    • How do you know which language to use? And how do you know if you should stick to a language that you already know or if you should learn a new one?

      Sorry if this is a dumb question I only just finished my first year of being a comp sci major

      • It's not a dumb question. The answer is "it depends", it's mostly a choice. The general rule is that when yo start a project, you choose the language that you think will help you the most, whether that is because you already know the language, or because you have to work with stuff that already use that language, or because the language is better at doing that.

        Regarding whether to stick to a language or learn a new one, in general your CS teachers will tell you (and they are correct) that you should not "learn to program in a language" but just "learn to program" and then apply that knowledge to whatever language you need. So, you should always learn languages that are different from the ones you already know in order to learn new paradigms, and then when you need a specific language, just learn the details about it. BUT, even if this way you will be able to use most languages, you will not be "good" at most, so you should also have some languages that you know really well and are experienced in. And for that you should choose the ones that are more useful to you (or maybe useful for your job) or the ones that you like.

      • Generally the most supported language on the tool/platform you want to target is the best one. Like SQL on databases, JS/ES in browsers, python in data science related stuff, etc. If multiple are heavily supported then just pick the one that's the most comfortable.

  • Technology advances. Both theory of programming languages as well as their practical implementations are large fields of research with many people working on it.

    Software is so much at the core of everything today that making its development cheaper is extremely lucrative.

  • they should have stopped after x86 ASM 😔

      • Real programmers code in C!
      • NO! Real programmers code in Fortran77!
      • NO! Real programmers code in ASM!
      • NO! Real programmers code in binary!
      • NO! Real programmers build their own hardware!
      • NO! Real programmer code using bacteria DNA!
      • Sounds like a XKCD.

        • NO! Real programmers move each bit on the disk surface!
  • What might compel someone to make their own language? Typically, it's because they've already used some languages, they have some criticisms of it, and they want to make something better. Now, for languages that are open source and accept community contributions, that is an option. However, keep in mind that each language already has its own core maintainer(s), with their own vision, as well as a whole host of other people who would have to be convinced that your idea (whatever improvements you want to make) are a good fit for that language. Some changes can be quite drastic — especially if you want to improve one language by bringing in insights you've gained from another. So sometimes (not often, but sometimes), people say "fuck it, I'm making my own language, with blackjack and hookers".

    The thing about software is, it's really easy to play around with. You don't need a workshop or parts or anything — you just need your computer. As a result, you have lots of people tinkering with stuff like making their own programming language, whether just for fun or more tangible reasons.

    And we've been in this cycle of innovation for decades, and it's how we've gone from punch cards to assembly to C, Python, and all the rest.

    But surely we don't need any more innovation? Like, why can't we all just use one language for everything?

    Well, it's true that nowadays we have a whole bunch of general-purpose, multi-paradigm languages. The analogy people like to make is "different tools in your toolbox". But, to clarify, it's not that some of them are hammers and others are screwdrivers; they're all the same kind of tool ("programming language"), so really it's more like different screwdrivers, of varying sizes, with differently shaped bits at the end.

    With screwdrivers it's clear why you might need one with this shape or the other: Otherwise it won't match the screw. With languages it's a little more subtle. You see, when you design a language (or almost anything else, ever), you inevitably make a series of tradeoffs. Is the language compiled or interpreted? Does it have a garbage collector? Does it have a strict type system? How does it do async? Does it support higher-order functions? There's a million questions, and you're going to get a different combination of answers for each language you look at. And that's before you evaluate other (potentially very important) things, like "is this language fast enough for my use case?", or "I need a library for such-and-such, has someone made that in this language?", or "does the language have a solid enough community that I can reliably search the answers to my questions?".

    Technically, any of the major languages — Java, Python, C, C++, C#, Javascript, Go, Rust, etc etc — can be used as a one-size-fits-all, universal programming language. There's actually a joke "law" that goes "anything that can be written in Javascript, will eventually be written in Javascript". But they each have their own unique combination of design decisions, so in practice different ones will be easier to use for this kind of project or that (one major factor is third-party libraries, like python's numpy or pandas, that may not have equivalents in other languages). There are also situations where, for a given platform, you have to use that language. For example, for Microsoft's .NET stuff, I don't think you can substitute C# for something like C++ (someone correct me if I'm wrong please). Or, if you're working on the Linux kernel, you're pretty much just using C (I think they were considering adopting Rust, but idk if that's still going on). And, of course, the dominant programming language for anything on the internet is Javascript (although WebAssembly has made huge strides in roughly the past decade, so you can actually use other languages as long as they can compile to WebAssembly).

    Finally, to wrap up this already way-too-long comment: a lot of these languages are very similar to one another. They're all procedural, heavily inspired by C, and for the most part they're either compiled and statically typed, or they're interpreted and dynamically typed. There are also a whole bunch of other languages, called functional languages, that are designed based on entirely different principles (the principles aren't harder to learn than what you're having to learn for Java, they're just different). But if you are looking for a universal programming language, I think the closest you're going to get is either C, C++, Python, or Javascript. In addition to Java, I would strongly recommend you learn C and Python (C has a bit more of a learning curve, but it teaches you a lot about memory management, which is a lesson you'll carry with you to any other language).

  • 01001010 01110101 01110011 01110100 00100000 01100011 01101111 01100100 01100101 00100000 01101001 01101110 00100000 01100010 01101001 01101110 01100001 01110010 01111001 00100000

  • Especially if one of them is based off the other.

    Rust is based off of C/C++
    Ruby is based off of Perl, Smalltalk, Eiffel, Ada, BASIC, Java, and Lisp

    Just a couple of examples. Quite frankly, it's dependent on what system, what infrastructure .etc that'll be the call for a specific programming language. Nothing wrong with just picking one or two and sticking to them.

    And I think that's what a lot of beginners in wanting to study programming languages can fall into, they want to be the jack of all trades in programming. But there's this problem of a new language coming in all of the time and it can get very wiry trying to remember them all.

121 comments