I don't want a community - I want a programming language. Preferably one that doesn't throw away billions of lines of existing code just because.

Python 2 code was absolutely not "thrown away just because". Nobody made your interpreter stop working; it was never on a cloud service or anything like that. It just stopped receiving bugfixes from core team (it's open source so everyone was and is free to take over maintenance) and third-party tool and infrastructure support (notably, PyPI) doesn't take it into consideration any more.

Further, the changes were made for very good reasons, such as allowing beginners to accept user input on day 1 without opening ACE exploits in their programs, and having plain double-quoted string literals actually produce a string rather than an immutable byte buffer that vaguely assumes a generic code-page encoding, except for the contexts where it will complain if it's not plain ASCII (admittedly, this is still an improvement over trying to handle text in C with only the standard library), and making sure that decoding operations don't produce encoding errors and vice-versa, and making `isinstance(1<<64, int)` give the expected `True` result, and making `except` syntax make sense, and making sure there aren't two fundamentally different kinds of user-defined class.

And by making these changes, we actually got Python 3 in about 2.5 years (4.5 if you allow for the first couple of releases having some issues figuring out the string literal transition and other such details — I agree they were premature) and were able to offer another 11 (9) for everyone to migrate. Whereas with Raku the entire 13.5 (more like 15.5) year period was spent on design and implementation, and now there hasn't been a new stable release for almost 5 years.

> it's open source so everyone was and is free to take over maintenance

Open source implementations are fine, though the "if you don't like it fork/make your own" argument is, typically a way of sidestepping criticism rather than a practical solution.

But one of Python's greatest weaknesses is that there is no formal language specification. All you have are implementations and their documentation.

From my perspective (suffering through the python 3 transition and living with ongoing changes in 3.x), compatibility was - and is - poorly handled. Many things can and should be done to ease the maintenance burden - things like intelligent defaults, compatibility features and libraries, and not doing stupid things like ripping out the print statement (which could have coexisted with a print() function) with no recourse.

Unfortunately, python's developers seem to have demonstrated tremendous contempt for the users of the language, and for existing code bases.

Other languages (though not all.... <cough, swift>) have actual language specifications and standards (that even keep working as runtime systems evolve), and are not so keen on throwing users and their code off a cliff.

Platforms should absorb pain so that their users don't have to, and avoid introducing breaking changes that multiply pain across an entire user base.

Apple (also known for arrogance combined with contempt for their developers) also gets this wrong, and routinely breaks iOS and swift apps every year.

> things like intelligent defaults

Can you give a concrete example of a problem you encountered while porting 2->3 code caused by a poorly chosen default in 3?

> compatibility features and libraries

You mean like `lib2to3`? Or all the backports 2.7 got, e.g. what's listed at https://wiki.python.org/moin/StandardLibraryBackports ? Or the `__future__` system? Or third-party support like `six` (still immensely popular, though presumably only in CI)?

> the print statement (which could have coexisted with a print() function)

No, it absolutely could not have. Not with the same name, and making the name refer to the function was the point. The print statement syntax was inelegant, quirky and confusing. For example, parentheses can affect the meaning in unusual ways:

  $ py2.7 -c 'print (1,); print 2'
  (1,)
  2
  $ py2.7 -c 'print 1,; print 2'
  1 2
Besides which, outputting text has no more logical reason to use a dedicated statement form than inputting text.

> python's developers seem to have demonstrated tremendous contempt for the users

I don't understand how you have come to infer such an attitude. Any suspicion that they are introducing breaking changes on a whim will be immediately quashed by reading the discussion behind any of those breaking changes. (Not to mention what happens with the rejected proposals.)

> and avoid introducing breaking changes that multiply pain across an entire user base.

What breaking change was introduced in Python 3.x during your history of using it that caused a nontrivial problem for you? How many years do you believe you were given to account for it?

There are countless dead programming languages without communities you can pick then.

Ruby and Perl are great examples of massively popular languages that withered because the language/platform outpaced the community.

If the first question you’re asking yourself looking at a code base is “what version is this/do I know this version” then that language is not facilitating you.

The successful languages are ones where “the community” prioritises backward compatibility. Java, C, Python have backward compatibility spanning decades. There’s a few discontinuities (lambdas in Java 8, Python 3, C++) but in most cases there’s a clear mapping back to the original. Python 3 is an exception to this but the migration window was something like 15 years…

Busy engineers, scientists and academics have little interest in keeping up to date with language features. A computer and a programming language are a tool for a job and the source code is just an intermediate artifact. These are your “community”, and the stakeholders in your success.

Have you used them? Perl has version tags in source code and everything is feature gated including the stdlib. Python does none of that. The stdlib changes constantly and just looking at source code gives you no indication if you can run it with your installed python version.

> Perl has version tags in source code and everything is feature gated including the stdlib. Python does none of that.

  from __future__ import annotations
> just looking at source code gives you no indication if you can run it with your installed python version

  requires-python = ">=3.9"

I prefer Perl's approach for both:

    use v5.40;

    ....

That's explicit, tied to a specific version, and executable code which can be scoped to a single source file.

(I'd argued for that feature for years with my `Modern::Perl` feature bundle; glad to see that can be deprecated now.)

I don't believe that "from __future__" is the future-proofing you think it is, they just named it that way to be cute - a hypothetical 3.19 version couldn't even use it, since it's just a normal python import

  $ python3.13 -c 'from __future__ import awesome_feature'
    File "<string>", line 1
  SyntaxError: future feature awesome_feature is not defined
the very idea of "future feature is not defined" is insaneo

Anyway, I'd guess what they intend is

  try:
    from __future__ import fever_dream
  except SyntaxError:
    fever_dream = None
because python really gets off on conditional imports

I was responding to the "Python does none of that" by pointing out that Python does indeed have features to help introduce new capabilities in a thoughtful way - I know it's not the same thing as something like conditional imports.

Not sure that >= is going to age well.

Perl have almost perfect backward compatibility, but small community and bad renown are not so good.

Backwards compatibility is terrible if what you're being backwards compatible with is terrible.

Isn’t the actual “platform” itself fragmented these days? Different language versions, different libraries, different “engine”?

I dunno it was 20 years ago I jumped ship when they tried shoehorning object oriented semantics into it. Eugh.

I do not really know which event you mentioned. But if you use the current version of perl interpreter. It still work for most of old versions. And new features keep safe for old perl.

Perl doesn't have "perfect backward compatibility" in the normal sense of the word. There is only Perl 5 which is perfectly compatible since it hasn't changed for 25+ years (which is how they achieved "compatibility" -- by not changing), and there's Perl 6 which isn't backward compatible and nobody really uses it.

> Perl 5 ... hasn't changed for 25+ years.

A major new version of Perl ships regularly. A few weeks ago the latest major new version shipped. From the 2025 changes document:

> Perl 5.42.0 represents approximately 13 months of development since Perl 5.40.0 and contains approximately 280,000 lines of changes across 1,600 files from 65 authors.

Skipping back 5 major new versions (to 2020):

> Perl 5.32.0 represents approximately 13 months of development since Perl 5.30.0 and contains approximately 220,000 lines of changes across 1,800 files from 89 authors.

2015:

> Perl 5.22.0 represents approximately 12 months of development since Perl 5.20.0 and contains approximately 590,000 lines of changes across 2,400 files from 94 authors.

2010:

> Perl 5.16.0 represents approximately 12 months of development since Perl 5.14.0 and contains approximately 590,000 lines of changes across 2,500 files from 139 authors.

There's been well over 10 million lines of code changed in just the core Perl codebase over the last 25 years reflecting huge changes in Perl.

----

Perl 6 ... isn't backward compatible

Raku runs around 80% of CPAN (Perl modules), including ones that use XS (poking into the guts of the Perl 5 binary) without requiring any change whatsoever.

(The remaining 20% are so Perl 5 specific as to be meaningless in Raku. For example, source filters which convert Perl 5 code into different Perl 5 code.)

----

But you are right about one thing; no one you know cares about backwards compatibility, otherwise you'd know the difference between what you think you know, and what is actually true.

> But you are right about one thing; no one you know cares about backwards compatibility, otherwise you'd know the difference between what you think you know, and what is actually true.

What the hell is this? Even if nobody I know cares about backwards compatibility, how does this relate to whether my knowledge is true or not?

Apologies for trivializing perl5's progress in the past 25 years, but come on, chill out dude.

I know people don't like Perl, I just want to add some info here. The Perl 5 Porters have restarted adding new features at 15 years ago. It has progressed from version 5.20 to 5.42. Although the speed is slower than popular languages, they are maintaining backward compatibility while adding new features.

Perl6 had been renamed to new language, Raku.

How have they withered? Does every programming language have to compete for world domination via cancerous growth? I thought that only applied to VC backed startups and public companies if the startups survive...

They’re not actively used in any circles I move in. The fact that your back is up suggests you have something invested in these antiquated niche tools.

Seriously? I tried Perl only once ever in my life time and I've never done Ruby.

Doesn't mean I have to deny them the right to exist because they don't have a "community*".

* more like a religion for some programming languages.

They have a right to exist. But there is strength in community. Successful platforms facilitate this and provide a means for participants to exceed the sum of there parts.

This can in turn fuel development of the platform therefore helping keep it relevant.

In recent times we call this “the network effect” and it applies to more than just social media.

[deleted]

What makes you think Ruby withered? It has been stagnant, but not withered.

The community withered. 10-15 years ago the cries of “Ruby” “Ruby” “Ruby” were deafening. I used Ruby and I really enjoyed and I thought I would leave Python behind but it but it never went anywhere from there. Somewhere around 3.x I think there were a load of breaking changes introduced and I imagine lots of people like myself just went back to using more stable platforms.

The great thing is that you don't have to join any community. Python is my favorite language and ever since I got flamed for asking a technical question in their subreddit I stopped going there.

There are hardly any non-toxic programming communities out there. And if you value backward compatibility over everything else you can look at C and C++.

Java also has a pretty good compatibility story. I still use python for some applications, but it has created a lot of headaches, and also has the problem of being really slow. YMMV, but usually if you were to rewrite your c++ code in python, you would find that you need 10x as many servers (or likely more) to get the same performance.

Java community is strangely nice. Bog standard enterprise software developers are nearly always polite.

Only if you use CPython. I use PyPy3 most of the time and I get the same performance as Java and Go.

C++ is still faster than PyPy3, but not 10x faster. That is good enough for me to not deal with the messy C++ syntax.

Unfortunately, a programming language without a community is nothing, because more than anything programming languages are languages, and a language is dead without a community that speaks it.

Exactly, that’s why Bjarne Strousoup says there are only 2 types of languages, one that people complain about, and one nobody uses

that's what Delphi said