It had some neat ideas, some alright ideas that were reasonable in the context it was created for, and some absolute nightmare fuel.
rybosome 15 hours ago [-]
Quite agree.
Some very novel ideas for the time. I’m not a PL historian but can’t think of an earlier language with such a complex runtime to support it.
But, woof - no thanks to the stringly typing. The article under discussion treats this as a positive, saying it eliminates conversion and having to worry about it. I don’t believe that’s possible, and would bet my life savings that MUMPS interpreting a string as a number when the programmer didn’t intend it, or vice-versa, is a reasonably common class of bugs in MUMPS programs.
The tutorial seems really good, but I’m frustrated with parts like that (or the explanation on a lack of operator precedence) which try to frame a bad thing as a good thing.
In this sense it reads like the autobiography of a presidential candidate; written in a calculated way to minimize flaws.
Rochus 13 hours ago [-]
My intention was to present the MUMPS 76 standard so it can be appreciated by today's software engineers; it should be obvious that this is a historical treatise, not a guide for today's systems; as mentioned elsewhere, MUMPS 76 was designed to work on PDP machines with 8K to 24K of core memory. Your coercion concerns apply to any dynamically/weakly typed language, and the same coercion-class bugs are rampant in JavaScript, Perl, PHP, and shell scripting, all of which survived and thrived. MUMPS made deliberate simplicity trade-offs to be usable in 4K of memory in the 1960s. Many early languages made the same choice. And I appreciate that you regard me as presidential candidate.
rybosome 11 hours ago [-]
Thanks for the reply!
I agree with your points about weak typing and coercion being prevalent. Having had direct negative experience with it across 3 of the 4 languages you named, I was prepared to marshal an argument about it most definitely being a source of bugs.
> it should be obvious that this is a historical treatise
It wasn’t obvious to me. Might I suggest amending it to make that more clear?
I do appreciate the tutorial and your commentary though, it gave me a new perspective on MUMPS.
benj111 4 hours ago [-]
> the explanation on a lack of operator precedence) which try to frame a bad thing as a good thing.
Is it a bad thing? Or is it different?
I literally spray brackets about because Im not sure of the precedence.
Explicit over implicit is generally regarded as a good thing. Why is there a blind spot when this comes to operator precedence?
I don't know mumps very well, but this seems pretty straightforward if you put the primer next to it, and I am troubled by your (common!) reaction to alien technology...
> Stringly typed with literally no other types? Uh…
like this example here; SQLite made this choice too. Everyone knows about SQLite by now, right?
All types are strings when the user types them in, whether you are talking source code text, or the patient's weight in kilograms. Pretending you can have other types is something the source code of your application (or the language your application is written in) does.
This is something that makes total sense when you are thinking about things the right way (whatever that means), so when something makes you go "uh" try inverting this equation, and ask yourself, in what way (or under what circumstances) would this decision make sense?
That sort of thinking will get you the right ideas to understand everything else in the software world, and make you less avoidant about filling in the gaps in your own abilities.
> It had some neat ideas
Has. Multiuser support is still almost nonexistent in mainstream programming (and just recently starting to actually show up in SQL implementations!). And besides SQL, the most popular language with global variables you've might have heard of is perl. Understanding these ideas is still in the future.
Putting the ideas in the past, and framing them with such harsh judgement -- especially the ideas like this that you don't fully understand yet -- keeps them out of your mind, and denies you access to what these ideas can do for you.
As an example: A lot of people make a "users" table in SQL for the users of their application. Of course most SQL implementations have "users" of their own, and have a robust implementation that is already there, and yet almost nobody uses it and chooses to make their own rather than learn how to use the one SQL gives them.
Now: SQL exfiltrations are only possible because of this, and when you fully understand why that is you'll probably never make another users table again.
> and some absolute nightmare fuel.
but nightmares? Seriously? There was nothing in that example code that I am going to have nightmares about. It seems very well thought out (unlike say, Python's). It's even Y2K compliant. There is even a few ideas in there I'm going to steal for my own parser.
For the curious, newer versions of MUMPS are still used as the core database framework by a lot of electronic health records companies. Most notably, it’s the backbone of Epic Systems, the largest EHR company in the US.
p_l 3 hours ago [-]
It has also a presence in the financial world (under brand name "InterSystems Caché"), though mainly as no-sql database until Java and other foreign wrappers stop being enough, and suddenly you're writing stored procedures (or at least their equivalent) in MUMPS
dmd 13 hours ago [-]
I interviewed at Epic in 2011. Got through a couple rounds - enough to see how weird and culty the place was.
I was alone in a room with one of my interviewers, who seemed pretty sharp. I asked him "do you like working here?"
He looked at me, glanced at the closed door, leaned forward and said in a low voice "nobody likes working here. If you have another option, take it."
I thanked him and left and I'm very glad I did.
NetMageSCW 19 hours ago [-]
That was very disappointing to read. We might be migrating from an old M system (Meditech Magic) to a new M system (Epic).
At least the front end is much more modern.
18 hours ago [-]
Rochus 20 hours ago [-]
Do they really use MUMPS? Not something like ObjectScript?
fortuitous-frog 14 hours ago [-]
I can’t speak for other companies, but I worked at Epic for a few years (left last year), and indeed MUMPS is still their bread and butter. In fact, I had not even heard about ObjectScript until reading this thread.
A few years ago, they _did_ develop a TypeScript wrapper framework (which was transpiled down into MUMPS). They heavily encouraged newer application code to use this, but it never caught on, was quietly abandoned after a bit.
Internally, MUMPS was often criticized or laughed at, but I doubt it’s going anywhere anytime soon.
Rochus 13 hours ago [-]
Thanks for this interesting insight. Since they are apparently using Intersystems backends, I thought that ObjectScript might be a consequent choice; from my perspective it is rather comparable to JavaScript, so the TypeScript idea might have been stronger, but on the other hand might cause issues with (dynamically typed) globals.
giardini 15 hours ago [-]
Bad news! My medical co.uses EPIC! Scheissurger!
quink 24 hours ago [-]
I did most of Advent of Code last year code golfing in MUMPS (running on Caché), with the additional challenge on up to and including day 7 doing without literals - that's to say no numbers and no strings. It was good fun - https://github.com/dominique-m-aoc/aoc-2025/blob/main/day03p... for day three part 1 for example. Or day 7 part 2 where the alphanumeric chars spell a story with only two nonsense words, with almost all the chars being on their own: https://github.com/dominique-m-aoc/aoc-2025/blob/main/day07p... It is a neat language but even more so a neat overall system and bag of concepts that I feel annoyed we haven't seen more of...
cduzz 21 hours ago [-]
How do you think your code would do in GT.M or Yottadb? I understand both are open source (vs Cache).
quink 16 hours ago [-]
Not having literal strings in the source code, I do need to get a capital “R” somewhere and the name of the system being “IRIS” in system variable $ZV makes that easy and terse. Apart from that one trick I think it’ll be more or less just fine.
Rochus 24 hours ago [-]
That's cool; amazing you indeed coded in MUMPS and not in ObjectScript ;-) Caché is (was) a great technology; ironically they tried to look like a relational database in the nineties, and then eventually came the NoSql boom. How did you get to MUMPS?
quink 24 hours ago [-]
First job out of university and stuck around with it for the next dozen years, probably longer than sensible... in the context of maintaining a bag of software that got put together in the mid-80s, a substantial module of which continued to enjoy some moderate success to this day.
Also, the marketing term was post-relational if I recall correctly, the funny thing about that being that it was really pre-relational at first. Also, I forgot, it was IRIS this AOC stuff runs on - the $ZV actually needs that "R" in IRIS so it knows what label to jump to... and what file mode to use... it's wonderfully cursed ;P
One thing I miss about Caché/Ensemble/IRIS is the three different paradigms for manipulating the same bits of data - the whole object layer, SQL (with pre-compiled embedded SQL an option), and the raw global access.
Agreed, I just wanted to point out that it is still around!
killjoywashere 8 hours ago [-]
In case anyone is wondering why anyone should give a shit about this language, the relevance of MUMPS is that the largest market share holder of EHR systems is Epic, and their core database still runs on MUMPS.
You life, quite literally if you find yourself in a hospital, depends on MUMPS.
The second largest competitor, Cerner/Oracle Millenium, runs on MSFT SQL, and it's on life support. Last I heard, Oracle was looking to unload it.
emj 8 hours ago [-]
Millennium has a streak of failed implementations lately, VA in the US, two here in Sweden. It is not just Millennium I believe health care providers are pretty bad at tech.
Suppafly 6 hours ago [-]
There are several other EHRs that use MUMPS too.
benj111 4 hours ago [-]
>on life support
Intentional?
iloveoof 21 hours ago [-]
MUMPS’ bad reputation is totally unearned. Most examples online (the wiki page, the awful Case of the MUMPS article) are examples of MUMPS code from the 60s-70s when storage was a premium and enterprise-size programs had to fit in a handful of megabytes, so there was no room for readability.
MUMPS code is more readable than most languages, it’s very simple and procedural. And the ability to interact directly with durable data the same as you do local data is very nice. I don’t know why no modern languages try to do something similar.
theamk 14 hours ago [-]
Interacting with durable data storage is actually pretty common.
Perl is modern (-ish? Definitely modern compared to MUMPS) and had "tie" for database access forever [0]
Python's dbm interface also looks like a regular dict [1]. I am sure there are many others, I know we had one "magic dict" in one of my work projects.
It's just that transparent access has some limitations, like lack of transactions, unexpected latency, lack of strong types, inability to only change a single value.
ABL is structurally much closer to Oracle PL/SQL than to MUMPS.
manoDev 20 hours ago [-]
It’s always useful to look at prior art and review capabilities we might have missed. Innovation can happen by mixing the “good parts” of different old ideas.
Rochus 1 days ago [-]
I’ve been working on a project to celebrate the anniversary of MUMPS and its first standard.
For those unfamiliar, MUMPS is an imperative language famously born at Massachusetts General Hospital in 1966. Its defining characteristic is that the language and the database are deeply integrated, acting as an early NoSQL database decades before the term existed.
There are pre-compiled versions of my MUMPS 76 interpreter in case you want to play with it.
NetMageSCW 19 hours ago [-]
I protest the characterization of Smalltalk as legacy. Seeing Cedar mentioned was very cool - Cedar/Mesa along with Trellis/Owl were environments
I was very interested in during my late high school / early college days, though I had no access to either. I do have a lot of Trellis documentation lying around somewhere someone at DEC kindly sent me when I wrote them about it.
Trellis/Owl had interesting ideas, though I spent more time with Modula-3.
BiraIgnacio 18 hours ago [-]
I remember when I got into programming, when the thing to use was basic on a TRS-80, a friend was showing me how MUMPS was as much better language than basic.
Well, try to run C++, C# or Java on a PDP-7 or PDP-9.
In 1976, the year of the first standard, massive hospitals with thousands of patients run on MUMPS, on PDP machines with 8K to 24K of core memory and many concurrent users.
sgerenser 23 hours ago [-]
I don't think anyone is really blaming MUMPS for the limitations it had to work with 1970s tech. The story was more about how terrible it is to work with in the 2000s and the surprising fact that it's still in use today in certain niches.
Rochus 22 hours ago [-]
My project and the referenced primer are about the 1976 standard.
But many MUMPS based systems are still in operation and maintenance today; and not many significant systems in IT reach a 50 year lifetime.
A modern JavaScript, PHP or Python system (languages with similar limitations for large-scale software engineering as MUMPS) written five years ago hardly works today because dependencies significantly changed or are no longer available. In 50 years (or even in 10) it will be astronomically expensive to keep a current Node.js system alive. But you still can run an unmodified 1985 MUMPS system on a current InterSystems IRIS server.
The main problem with critical MUMPS systems today is less technical, but mostly staff shortage. The same applies to COBOL, or Ada, or even Java.
cduzz 21 hours ago [-]
What about running that same codebase on open source versions of mumps such as GT.M or Yottadb?
23 hours ago [-]
iloveoof 21 hours ago [-]
This article is terrible and I hate that people always bring it up whenever MUMPS is mentioned here.
MUMPS is easy to read, understand and maintain when written well.
These examples (and the Wikipedia ones) are from code written when hospitals needed to run their whole EMR with extreme storage constraints, so more terse code was necessary to fit more on the disk. Of course they aren’t readable by modern standards.
orthoxerox 18 hours ago [-]
The problem with MUMPS (and RPG) is that there's so much legacy code written in the old style that you have to learn to read and write it anyway.
surgical_fire 15 hours ago [-]
Dude, chill.
That article is humor, not an essay on the merits of MUMPS.
It was entertaining to read for me back in the day, especially as my first programming job was on a COBOL system from the 80s. That in the mid 2000s.
benj111 20 hours ago [-]
Did they really have to use KILL as the word to delete a variable? Especially as it's used in hospitals? KILL patient....?
quink 16 hours ago [-]
No you don’t - you can abbreviate it to just ‘K’ or ‘k’.
Angostura 19 hours ago [-]
You obviously never read doctors notes in the 70s. Black humour was de rigeur
benj111 4 hours ago [-]
Yes, but this was programmers, not doctors.
I mean I find it humourous, I just have visions of discussions about 'killing' patients.
DB access using same syntax as local variables? Neat!
Datetime epoch in 1841? Ok, sure.
Stringly typed with literally no other types? Uh…
Appendix 7 on this page http://www.faqs.org/faqs/m-technology-faq/part2/ : runs screaming into the night
It had some neat ideas, some alright ideas that were reasonable in the context it was created for, and some absolute nightmare fuel.
Some very novel ideas for the time. I’m not a PL historian but can’t think of an earlier language with such a complex runtime to support it.
But, woof - no thanks to the stringly typing. The article under discussion treats this as a positive, saying it eliminates conversion and having to worry about it. I don’t believe that’s possible, and would bet my life savings that MUMPS interpreting a string as a number when the programmer didn’t intend it, or vice-versa, is a reasonably common class of bugs in MUMPS programs.
The tutorial seems really good, but I’m frustrated with parts like that (or the explanation on a lack of operator precedence) which try to frame a bad thing as a good thing.
In this sense it reads like the autobiography of a presidential candidate; written in a calculated way to minimize flaws.
I agree with your points about weak typing and coercion being prevalent. Having had direct negative experience with it across 3 of the 4 languages you named, I was prepared to marshal an argument about it most definitely being a source of bugs.
> it should be obvious that this is a historical treatise
It wasn’t obvious to me. Might I suggest amending it to make that more clear?
I do appreciate the tutorial and your commentary though, it gave me a new perspective on MUMPS.
Is it a bad thing? Or is it different?
I literally spray brackets about because Im not sure of the precedence.
Explicit over implicit is generally regarded as a good thing. Why is there a blind spot when this comes to operator precedence?
I don't know mumps very well, but this seems pretty straightforward if you put the primer next to it, and I am troubled by your (common!) reaction to alien technology...
> Stringly typed with literally no other types? Uh…
like this example here; SQLite made this choice too. Everyone knows about SQLite by now, right?
All types are strings when the user types them in, whether you are talking source code text, or the patient's weight in kilograms. Pretending you can have other types is something the source code of your application (or the language your application is written in) does.
This is something that makes total sense when you are thinking about things the right way (whatever that means), so when something makes you go "uh" try inverting this equation, and ask yourself, in what way (or under what circumstances) would this decision make sense?
That sort of thinking will get you the right ideas to understand everything else in the software world, and make you less avoidant about filling in the gaps in your own abilities.
> It had some neat ideas
Has. Multiuser support is still almost nonexistent in mainstream programming (and just recently starting to actually show up in SQL implementations!). And besides SQL, the most popular language with global variables you've might have heard of is perl. Understanding these ideas is still in the future.
Putting the ideas in the past, and framing them with such harsh judgement -- especially the ideas like this that you don't fully understand yet -- keeps them out of your mind, and denies you access to what these ideas can do for you.
As an example: A lot of people make a "users" table in SQL for the users of their application. Of course most SQL implementations have "users" of their own, and have a robust implementation that is already there, and yet almost nobody uses it and chooses to make their own rather than learn how to use the one SQL gives them.
Now: SQL exfiltrations are only possible because of this, and when you fully understand why that is you'll probably never make another users table again.
> and some absolute nightmare fuel.
but nightmares? Seriously? There was nothing in that example code that I am going to have nightmares about. It seems very well thought out (unlike say, Python's). It's even Y2K compliant. There is even a few ideas in there I'm going to steal for my own parser.
There is good stuff here; don't give up.
I was alone in a room with one of my interviewers, who seemed pretty sharp. I asked him "do you like working here?"
He looked at me, glanced at the closed door, leaned forward and said in a low voice "nobody likes working here. If you have another option, take it."
I thanked him and left and I'm very glad I did.
At least the front end is much more modern.
A few years ago, they _did_ develop a TypeScript wrapper framework (which was transpiled down into MUMPS). They heavily encouraged newer application code to use this, but it never caught on, was quietly abandoned after a bit.
Internally, MUMPS was often criticized or laughed at, but I doubt it’s going anywhere anytime soon.
Also, the marketing term was post-relational if I recall correctly, the funny thing about that being that it was really pre-relational at first. Also, I forgot, it was IRIS this AOC stuff runs on - the $ZV actually needs that "R" in IRIS so it knows what label to jump to... and what file mode to use... it's wonderfully cursed ;P
That said, it doesn't hold a candle compared to this: https://stackoverflow.com/questions/4151554/need-mumps-sampl... which is just about the best obscured (or byte-saving rather) MUMPS snippet in existence.
One thing I miss about Caché/Ensemble/IRIS is the three different paradigms for manipulating the same bits of data - the whole object layer, SQL (with pre-compiled embedded SQL an option), and the raw global access.
I've never been quite brave enough to try to build something with it.
You life, quite literally if you find yourself in a hospital, depends on MUMPS.
The second largest competitor, Cerner/Oracle Millenium, runs on MSFT SQL, and it's on life support. Last I heard, Oracle was looking to unload it.
Intentional?
MUMPS code is more readable than most languages, it’s very simple and procedural. And the ability to interact directly with durable data the same as you do local data is very nice. I don’t know why no modern languages try to do something similar.
Perl is modern (-ish? Definitely modern compared to MUMPS) and had "tie" for database access forever [0]
Python's dbm interface also looks like a regular dict [1]. I am sure there are many others, I know we had one "magic dict" in one of my work projects.
It's just that transparent access has some limitations, like lack of transactions, unexpected latency, lack of strong types, inability to only change a single value.
[0] https://perldoc.perl.org/DB_File#A-Simple-Example
[1] https://docs.python.org/3/library/dbm.html
For those unfamiliar, MUMPS is an imperative language famously born at Massachusetts General Hospital in 1966. Its defining characteristic is that the language and the database are deeply integrated, acting as an early NoSQL database decades before the term existed.
See here for more information about the project: https://github.com/rochus-keller/mumps/
There are pre-compiled versions of my MUMPS 76 interpreter in case you want to play with it.
It's about a Smalltalk-80 image from 1983.
Trellis/Owl had interesting ideas, though I spent more time with Modula-3.
Good times
In 1976, the year of the first standard, massive hospitals with thousands of patients run on MUMPS, on PDP machines with 8K to 24K of core memory and many concurrent users.
But many MUMPS based systems are still in operation and maintenance today; and not many significant systems in IT reach a 50 year lifetime.
A modern JavaScript, PHP or Python system (languages with similar limitations for large-scale software engineering as MUMPS) written five years ago hardly works today because dependencies significantly changed or are no longer available. In 50 years (or even in 10) it will be astronomically expensive to keep a current Node.js system alive. But you still can run an unmodified 1985 MUMPS system on a current InterSystems IRIS server.
The main problem with critical MUMPS systems today is less technical, but mostly staff shortage. The same applies to COBOL, or Ada, or even Java.
MUMPS is easy to read, understand and maintain when written well.
These examples (and the Wikipedia ones) are from code written when hospitals needed to run their whole EMR with extreme storage constraints, so more terse code was necessary to fit more on the disk. Of course they aren’t readable by modern standards.
That article is humor, not an essay on the merits of MUMPS.
It was entertaining to read for me back in the day, especially as my first programming job was on a COBOL system from the 80s. That in the mid 2000s.
I mean I find it humourous, I just have visions of discussions about 'killing' patients.