Lucee: A light-weight dynamic CFML scripting language for the JVM
lucee.org
lucee.org
Would I sell it what I made? No, but if your primary concern is getting stuff done, it surely will.
Coldfusion had a bad rep but it was actually a pretty good tool to work with. Railo made it a million times better in every way - the performance was solid and the environment was full featured enough to let you focus on the code.
The original adobe (macromedia, right?) version was a mess. There were no functions but you could import modules. Massive caveat that those modules were allowed to mutate state outside of themselves so people would import them to, for example, run some db queries and set some variables in the calling code with the results. You can imagine the absolute unmaintainable mess that ensued.
I want to say Macromedia mostly bought ColdFusion for it's editor. The language seemed to be a bit of afterthought.
https://cfdocs.org/coldfusion-versions
CF is interesting because it started as basically server side includes with some extra features to connect to a database. It was meant to be very approachable and not general purpose. Like a distant ancestor to Jupyter and Observable.
That approachability made for some big messes, but it also spawned a huge community of software developers who might not have gotten into it otherwise.
The world is big and complex. Successful (industrial) software systems seem to have a very long tails
Companies only building web things to advance some other purpose don't need the magic, much less the pizzazz, they need something that keeps working for 20+ years, and that keeps looking the same to those who have to touch it.
I very much agree with this take. I sometimes find CFML that was written well before I began in software development, and with very few adjustments, it stays safe and easy to use for internal administrative tasks. It is very fast at delivering business value, and very low maintenance for me. The real fun always begins when someone suggests a rewrite, and realizes to their horror how 25 lines in Coldfusion sometimes become 100+ in other languages.
When you drop out of college, you take whatever job you can get. My first software job was doing ColdFusion, ActionScript, and Foxpro for a Tae Kwon Do studio. I didn't really know Coldfusion or Foxpro, but I picked them up relatively quick, and while I never really liked either of them, I did appreciate how quick I was able to prototype stuff in Coldfusion.
It was relatively easy to go from 0-to-website with CFML and get something that more or less worked, and even had a few niceties as well; the SQL support was actually quite good (including built-in caching), you could fairly easily call out to Java libraries, and it was easy enough to remote with Flash/Flex, which was still relatively useful.
I found it almost impossible to actually maintain anything, and I don't think I'd use it for anything now (particularly since I dont' do any frontend anymore), but there's a sentimentality that I will forever have for Coldfusion, if for no other reason it's the thing that kicked off my career.
Eventually, they incorporated cfscript which let you write stuff that was more like the c derived languages. But they did not port every <cftag> function over to cfscript. Terrible oversight. If you had to resort to ending your cfscript to fall back to a cftag it made the code really ugly.
<cfdump> was ahead of its time. It came out way before php var_dump.
<cfquery> was really powerful. It let you take any database result and then treat that result as though it were a database itself. So you could query a query so to speak.
Something else I remember is how many ColdFusion devotees I worked with. I never understand how people get so attached to a language (ColdFusion, Ruby), a company (Apple), or a database (Postgres, MongoDB). It becomes some kind of cult. So many defensive ColdFusion programmers I had to deal with.
Edit to add another memory. Old ColdFusion would use YES for true and NO for false. That would cause a lot of headaches when dealing with other systems that had no notion of YES or NO.
I never used cfscript for this reason. I felt like if I couldn't use every feature of the language, then there's no point in messing with it.
I definitely miss cfdump sometimes. It was ridiculously useful for what it did.
> Something else I remember is how many ColdFusion devotees I worked with. I never understand how people get so attached to a language (ColdFusion, Ruby), a company (Apple), or a database (Postgres, MongoDB). It becomes some kind of cult. So many defensive ColdFusion programmers I had to deal with.
Yeah, even when I doing that job (2012), Coldfusion was falling out of favor, and I would mention to my manager that we might want to start transitioning to Railo or rewriting stuff using Java EE or something, and would get extremely defensive about it. He was more polite than this, but he basically said something that implied that I didn't know what I was talking about and Coldfusion will still be used for years and years to come.
I guess he was half right :)
CFML was weird, but true, it worked. I felt it was like PHP for JVM: type stuff run site, everything works
What, no Clipper?
https://zope.readthedocs.io/en/latest/zopebook/AppendixC.htm... :
> Zope Page Templates are an HTML/XML generation tool. This appendix is a reference to Zope Page Templates standards: Template Attribute Language (TAL), TAL Expression Syntax (TALES), and Macro Expansion TAL (METAL).
> TAL Overview: The Template Attribute Language (TAL) standard is an attribute language used to create dynamic templates. It allows elements of a document to be replaced, repeated, or omitted
Repoze is Zope backwards. PyPI is built on the Pyramid web framework, which comes from repoze.bfg, which was written in response to Zope2 and Plone and Zope3.
Chameleon ZPT templates with Pyramid pyramid.renderers.render_to_response(request): https://docs.pylonsproject.org/projects/pyramid/en/latest/na...
I dont have more energy to learn or search about CFML, this was your chance
"A modern, dynamically and loosely typed scripting language for multiple runtimes. For the Java Virtual Machine (JVM) giving you tons of Object-Oriented (OO), Functional Programming (FP) Constructs, and dynamic Metadata Programming (MP)."
It's better just to either pay Adobe the license fee for ColdFusion so that you know a company will be behind it and in the meantime start migrating over to python, .net or ruby.
I used to run the Houston Adobe ColdFusion Users Group, which was sanctioned by and supported by Adobe. I have first-hand insight into their support of the language. While they continue to make money off of licenses, I can say with complete confidence that they aren't "behind it" in the way that many companies are. I'd feel more confident with the open source Lucee, a project with 16+ years of history.
I can't argue with switching to another language however, for ecosystem and access to resources. (I chose Ruby over 10 years ago after building my career on CFML)
The thing which killed it was poor performance (PHP 3 was 10-100 TIMES faster in tests I did for our customers) and Adobe-level support. They milked customers mercilessly and refused to fix even major bugs – as an example, we had an app which generated a report table like this (I forget the exact syntax):
<cfloop query as row>
<tr>
<cfloop row as col>
<td>…
They had a bug using a shared pointer internally so that would print the first row over and over for the number of rows. We reported this. Not fixed, but then they told us the next paid upgrade might fix it. It didn’t and we moved the remaining customers to PHP, which we’d already been going for features.I one time worked for a company that had a import on the top that called every single SQL query as part of the template, meaning that there was about ~20 SQL queries running sequentially on every page load. I think just using the built-in caching for it improved performance by an order of magnitude by simply utilizing the built-in caching.
I think what killed Coldfusion was really the price. PHP was free, open source, faster, and also had easy templates integrated into the language. Why pay an absurd license fee for a slow language when you can get something comparable for free?
> I one time worked for a company that had a import on the top that called every single SQL query as part of the template, meaning that there was about ~20 SQL queries running sequentially on every page load.
This is bringing back painful memories of the time I was billed out at some obscene rate to do some overtime bailing out a client (local utility company). We’d had the design side of a product locator site but they’d given the software side to a bigger contractor, and 12 months into a 4 month project they were missing half of the features and the developers were telling them they needed to drop a million on a high-end server to handle the database. I looked at it and quickly found the problem: none of the developers knew SQL well enough to know how to filter a JOIN, so they had multiple nested ASP loops which were retrieving hundreds of millions of rows, using an if statement to decide which ones matched the active filters, and then did more queries in the inner loop. The client paid double our normal rate for me working a few late nights, got five orders of magnitude better performance, and had a very interesting conversation with the original team about the money they had been billed for people who clearly weren’t the senior engineers they’d been paying for.
Tangential, but JDBC, even in the year of our lord 2024, has been one of my biggest headaches for performance. I have a pretty decent job with a very decent manager, so I started replacing as many JDBC calls that I could with Vert.x and got considerably better performance, I think because JDBC is so block heavy and threads just spin idling a lot.
> none of the developers knew SQL well enough to know how to filter a JOIN, so they had multiple nested ASP loops which were retrieving hundreds of millions of rows,
We didn't have hundreds of millions of rows, but at the Tae Kwon Do studio I worked at (who had their own martial arts management software), the initial person who wrote it wasn't great with SQL, and for the "belt management" service the person who wrote it was similarly doing lots of nested loops and conditionals on those loops, all in Coldfusion. Another employee that was pretty good at SQL ended up rewriting everything with a lot of clever joins, views, where clauses, brought down the runtime by like three orders of magnitude.
<cfdump> <cflog> <cfflush>
Lucee has a list of Adobe functions they don't support: https://docs.lucee.org/reference/unsupported.html