<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>JVM Languages on JAVAPRO International</title><link>https://javapro-en.svenruppert.com/categories/jvm-languages/</link><description>Recent content in JVM Languages on JAVAPRO International</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Fri, 03 Jul 2026 12:00:01 +0000</lastBuildDate><atom:link href="https://javapro-en.svenruppert.com/categories/jvm-languages/index.xml" rel="self" type="application/rss+xml"/><item><title>BoxLang’s First 11 Months: Explosive Growth, Developer Empowerment, and the Return of Dynamic Language!</title><link>https://javapro-en.svenruppert.com/boxlangs-first-11-months-explosive-growth-developer-empowerment-and-the-return-of-dynamic-language/</link><pubDate>Fri, 03 Jul 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlangs-first-11-months-explosive-growth-developer-empowerment-and-the-return-of-dynamic-language/</guid><description>&lt;blockquote class="pullquote"&gt;
 &lt;span class="pullquote-mark" aria-hidden="true"&gt;“&lt;/span&gt;
 &lt;div class="pullquote-body"&gt;&lt;p&gt;&lt;em&gt;11 months. 13 releases. Production workloads already running. If you haven&amp;rsquo;t evaluated BoxLang yet, now is the time.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.ortussolutions.com/blog/boxlangs-first-11-months-explosive-growth-developer-empowerment-and-the-return-of-dynamic-languages"&gt;https://www.ortussolutions.com/blog/boxlangs-first-11-months-explosive-growth-developer-empowerment-and-the-return-of-dynamic-languages&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;hr&gt;
&lt;p&gt;At Into the Box 2026, &lt;a href="https://ai.ortussolutions.com"&gt;Ortus Solutions&lt;/a&gt; pulled back the curtain on something that deserves serious attention from every technical leader building on the JVM: &lt;a href="https://boxlang.io/"&gt;BoxLang&lt;/a&gt; is not a hobbyist language experiment. It is a production-grade, actively evolving development platform with enterprise adoption already underway and a runtime footprint that now reaches places Java simply cannot go.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : Query Transformers: Take Full Control of Your Query Results</title><link>https://javapro-en.svenruppert.com/boxlang-1-14-0-query-transformers-take-full-control-of-your-query-results/</link><pubDate>Wed, 01 Jul 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-1-14-0-query-transformers-take-full-control-of-your-query-results/</guid><description>&lt;p&gt;BoxLang 1.14.0 ships a lot of exciting features &amp;ndash; Dynamic Sets, Ranges, Inner Classes, JSONPath navigation &amp;ndash; but one quietly powerful addition will change the way you think about every database call in your application: &lt;strong&gt;Query Transformers&lt;/strong&gt;, and this is just the start, we have plans for a whole lot more cool query features.&lt;/p&gt;
&lt;p&gt;If you have ever executed a query and then immediately written a loop to reshape the result into what you actually needed, this feature is for you.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : Introducing Inner Classes</title><link>https://javapro-en.svenruppert.com/boxlang-1-14-0-introducing-inner-classes/</link><pubDate>Mon, 29 Jun 2026 12:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-1-14-0-introducing-inner-classes/</guid><description>&lt;p&gt;BoxLang has always embraced a simple truth: the way you organize code shapes the way you think about problems. For a long time, if you needed a helper class, you needed a file. One class, one &lt;code&gt;.bx&lt;/code&gt; file, no exceptions. This also stemmed from the CFML days. That&amp;rsquo;s clean and predictable, but it creates real friction when a class is tightly coupled to exactly one caller and has no business existing anywhere else.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : BoxSet is Here: BoxLang's New First-Class Set Type</title><link>https://javapro-en.svenruppert.com/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/</link><pubDate>Fri, 26 Jun 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-1-14-0-boxset-is-here-boxlangs-new-first-class-set-type/</guid><description>&lt;p&gt;BoxLang 1.14.0 ships with a new &lt;strong&gt;dynamic first-class Set type&lt;/strong&gt; baked directly into the language. Not a wrapper you reach for manually, not a &lt;code&gt;createObject( &amp;quot;java&amp;quot;, &amp;quot;java.util.HashSet&amp;quot; )&lt;/code&gt; incantation you paste from a Stack Overflow answer years ago. A real &lt;code&gt;BoxSet&lt;/code&gt; with literal syntax, operator overloads, a full functional pipeline, change listeners, JSON serialization, and deep Java interop.&lt;/p&gt;
&lt;p&gt;If you have ever deduplicated an array with a loop, compared two collections element by element, or modeled a permission system on top of a struct &amp;ndash; Sets are the tool you were missing. Let&amp;rsquo;s dig in.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : Sets, Ranges, Inner Classes, and a Runtime That Talks Back</title><link>https://javapro-en.svenruppert.com/boxlang-1-14-0-sets-ranges-inner-classes-and-a-runtime-that-talks-back/</link><pubDate>Wed, 24 Jun 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-1-14-0-sets-ranges-inner-classes-and-a-runtime-that-talks-back/</guid><description>&lt;p&gt;BoxLang has never stood still, but &lt;strong&gt;version 1.14.0&lt;/strong&gt; is something different. This is the release where the language stops filling gaps and starts defining what a modern dynamic JVM language looks like on its own terms. Sixty-five issues closed. Four innovative language features. A formatter that has grown up. And a companion module - &lt;code&gt;bx-mcp&lt;/code&gt; - that fundamentally changes how you operate a running BoxLang application with AI.&lt;/p&gt;
&lt;p&gt;This could have easily been a major release for the team. This has been a really amazing effort by everybody at Ortus, and we&amp;rsquo;ve received great feedback from our clients migrating to BoxLang and coming up with innovative ideas for this platform. We have only just begun!&lt;/p&gt;</description></item><item><title>Introducing bx-jwt: Enterprise-Grade JSON Web Tokens for BoxLang</title><link>https://javapro-en.svenruppert.com/introducing-bx-jwt-enterprise-grade-json-web-tokens-for-boxlang/</link><pubDate>Tue, 23 Jun 2026 12:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/introducing-bx-jwt-enterprise-grade-json-web-tokens-for-boxlang/</guid><description>&lt;p&gt;JWT authentication is everywhere. But rolling it correctly — with proper algorithm enforcement, key management, clock skew handling, JWE encryption, and zero security footguns — is anything but trivial. Today, we&amp;rsquo;re shipping &lt;strong&gt;bx-jwt&lt;/strong&gt;, a production-ready JWT/JWE module for BoxLang that handles all of it out of the box, so you can focus on building, not fighting cryptography.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;bx-jwt&lt;/strong&gt; is part of the &lt;a href="https://www.boxlang.io/plans"&gt;BoxLang+ and BoxLang++ subscription tiers&lt;/a&gt; — our enterprise-grade module collection built for teams that take security seriously.&lt;/p&gt;</description></item><item><title>Introducing BoxLings! An interactive teacher for BoxLang and TDD/BDD</title><link>https://javapro-en.svenruppert.com/introducing-boxlings-an-interactive-teacher-for-boxlang-and-tdd-bdd/</link><pubDate>Wed, 17 Jun 2026 12:00:03 +0000</pubDate><guid>https://javapro-en.svenruppert.com/introducing-boxlings-an-interactive-teacher-for-boxlang-and-tdd-bdd/</guid><description>&lt;p&gt;We believe the best way to learn a programming language is by writing code — real code, with real feedback, and real tests. That&amp;rsquo;s exactly why we built &lt;strong&gt;BoxLings&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Inspired by the beloved &lt;a href="https://github.com/rust-lang/rustlings"&gt;Rustlings&lt;/a&gt; project, &lt;strong&gt;BoxLings&lt;/strong&gt; is an interactive CLI tool that teaches you &lt;strong&gt;BoxLang&lt;/strong&gt; through hands-on exercises. You read failing tests, fix broken code, and level up — one exercise at a time.&lt;/p&gt;
&lt;p&gt;Oh, and the whole thing is written in BoxLang itself. 🥊 Dogfooding at its finest.&lt;/p&gt;</description></item><item><title>BoxLang v1.13.0: Compatibility, Concurrency, and Formatter Maturity</title><link>https://javapro-en.svenruppert.com/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/</link><pubDate>Mon, 15 Jun 2026 12:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-v1-13-0-compatibility-concurrency-and-formatter-maturity/</guid><description>&lt;p&gt;&lt;strong&gt;BoxLang 1.13.0&lt;/strong&gt; is a stability-first release with deep compatibility work and runtime hardening. This build closes 48 issues, with the majority focused on CFML compatibility edge cases, concurrency correctness, formatting parity, and miniserver/runtime reliability under real production loads.&lt;/p&gt;
&lt;p&gt;While this release is bug-fix heavy, it still introduces several meaningful features and quality-of-life improvements: character-aware trimming, class metadata lookup by absolute path, process environment control in SystemExecute(), SOAP headers, new query column rename capabilities, and safer miniserver routing/security defaults.&lt;/p&gt;</description></item><item><title>BoxLang Goes Serverless on Google Cloud</title><link>https://javapro-en.svenruppert.com/boxlang-goes-serverless-on-google-cloud/</link><pubDate>Wed, 10 Jun 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-goes-serverless-on-google-cloud/</guid><description>&lt;p&gt;We just shipped the &lt;strong&gt;BoxLang Google Cloud Functions Runtime&lt;/strong&gt; — and it brings the same write-once-run-anywhere serverless experience you already know from our AWS Lambda runtime, now running natively on &lt;strong&gt;Google Cloud Functions Gen2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The big idea is simple: the same &lt;code&gt;.bx&lt;/code&gt; handler file you deploy to AWS Lambda works on GCF without modification. One codebase. Two clouds. Zero rewrites.&lt;/p&gt;
&lt;h2 id="the-architecture"&gt;The Architecture&lt;/h2&gt;
&lt;p&gt;The GCF experience is intentionally split into two projects:&lt;/p&gt;</description></item><item><title>Build Cross-Platform Desktop Apps with BoxLang</title><link>https://javapro-en.svenruppert.com/build-cross-platform-desktop-apps-with-boxlang/</link><pubDate>Mon, 08 Jun 2026 12:00:00 +0000</pubDate><guid>https://javapro-en.svenruppert.com/build-cross-platform-desktop-apps-with-boxlang/</guid><description>&lt;p&gt;Today we&amp;rsquo;re shipping the &lt;strong&gt;initial release of the BoxLang Desktop Runtime&lt;/strong&gt; — powered by Electron, BoxLang, and Vite. With one starter, one &lt;code&gt;npm run dev&lt;/code&gt;, and one packaging command, you can build and distribute professional desktop applications for &lt;strong&gt;macOS, Windows, and Linux&lt;/strong&gt; using the BoxLang you already know. 🎯&lt;/p&gt;
&lt;p&gt;This is BoxLang&amp;rsquo;s newest runtime joining a deliberately growing list — web servers, AWS Lambda, Google Cloud Functions, Android (in development), and now &lt;strong&gt;desktop&lt;/strong&gt;. Same language, same idioms, same modules — different shell. Write once, deploy where your users are. 🚀&lt;/p&gt;</description></item><item><title>BoxLang AI 3.2.0 — Image Generation, Web Search, Fluent Audio, Agent Registry &amp; MCP Observability</title><link>https://javapro-en.svenruppert.com/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability/</link><pubDate>Fri, 05 Jun 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-ai-3-2-0-image-generation-web-search-fluent-audio-agent-registry-mcp-observability/</guid><description>&lt;p&gt;BoxLang AI 3.2.0 is here, and it&amp;rsquo;s a landmark release. We&amp;rsquo;re shipping five major features: &lt;strong&gt;image generation, web search, a fluent audio builder API, a centralized agent registry, and deep MCP observability along with a suite of analytics improvements and a critical bug fix.&lt;/strong&gt; Let&amp;rsquo;s dig in. 🎉&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-image-generation--aiimage"&gt;🖼️ Image Generation — &lt;code&gt;aiImage()&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;You can now generate images directly from BoxLang using any provider that supports &lt;code&gt;text-to-image&lt;/code&gt; generation. The &lt;code&gt;aiImage()&lt;/code&gt; BIF follows the same &lt;strong&gt;fluent, chainable philosophy&lt;/strong&gt; as the rest of bx-ai then act on the result with expressive method calls.&lt;/p&gt;</description></item><item><title>Introducing skills.boxlang.io — The Open Agent Skills Ecosystem for BoxLang &amp; the Ortus World</title><link>https://javapro-en.svenruppert.com/introducing-skills-boxlang-io-the-open-agent-skills-ecosystem-for-boxlang-the-ortus-world/</link><pubDate>Wed, 03 Jun 2026 12:00:03 +0000</pubDate><guid>https://javapro-en.svenruppert.com/introducing-skills-boxlang-io-the-open-agent-skills-ecosystem-for-boxlang-the-ortus-world/</guid><description>&lt;p&gt;Today we&amp;rsquo;re launching something we&amp;rsquo;ve been quietly building for months: &lt;strong&gt;&lt;a href="https://skills.boxlang.io"&gt;skills.boxlang.io&lt;/a&gt;&lt;/strong&gt; — a public, agent-agnostic directory for AI skills covering BoxLang, ColdBox, TestBox, CommandBox, and the entire Ortus ecosystem.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever pasted a 400-line system prompt into yet another AI agent, watched two of your bots drift onto subtly different versions of the same coding standard, or spent half a Friday afternoon trying to convince an LLM that BoxLang is &lt;strong&gt;not&lt;/strong&gt; Java and is &lt;strong&gt;not&lt;/strong&gt; CFML, or how to code for Modern CFML; this launch is for you. 🎯&lt;/p&gt;</description></item><item><title>Announcing MatchBox Open Beta: BoxLang, Now Running in New Places</title><link>https://javapro-en.svenruppert.com/announcing-matchbox-open-beta-boxlang-now-running-in-new-places/</link><pubDate>Mon, 01 Jun 2026 12:00:00 +0000</pubDate><guid>https://javapro-en.svenruppert.com/announcing-matchbox-open-beta-boxlang-now-running-in-new-places/</guid><description>&lt;p&gt;Ortus Solutions is excited to announce the open beta of &lt;strong&gt;&lt;a href="https://boxlang.ortusbooks.com/boxlang-framework/matchbox"&gt;MatchBox&lt;/a&gt;&lt;/strong&gt;, a new open source project in the BoxLang ecosystem. MatchBox is a custom BoxLang virtual machine written in Rust. It is built for the places where a full JVM runtime is not the right fit: small native command-line tools, compact web services, browser applications, WebAssembly containers, and even embedded hardware like ESP32 devices.&lt;/p&gt;
&lt;p&gt;The project started in early March and has been moving quickly - already at &lt;strong&gt;v0.5.0&lt;/strong&gt;. That speed is part of why we are opening the beta now. MatchBox is already capable enough to build real experiments, prototypes, and early applications, but it is still beta software. APIs will change. Some language features are still being implemented. Some deployment targets are intentionally limited while we harden the runtime. We want developers to try it, break it, ask questions, and help shape where it goes next.&lt;/p&gt;</description></item><item><title>Kotlin kontra Java - Part 3 - Language for Interop</title><link>https://javapro-en.svenruppert.com/kotlin-kontra-java-part-3-language-for-interop/</link><pubDate>Thu, 07 May 2026 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/kotlin-kontra-java-part-3-language-for-interop/</guid><description>&lt;p&gt;When you start a new project on the JVM, should you pick Java or Kotlin? Why not both?&lt;/p&gt;
&lt;p&gt;You can use any Java library you want in Kotlin, you can even co-write your software in both languages (e.g. one team I work with writes their JUnit tests in Kotlin, their main code in Java) and migrate to Kotlin or back to Java over time. &lt;a href="https://kotlinlang.org/docs/java-interop.html"&gt;Kotlin is designed with Java interoperability in mind&lt;/a&gt;, because JetBrains wanted to migrate their IDEs (IntelliJ IDEA, WebStorm, etc.) incrementally to the language. But how does that work? What does Kotlin do, so that interop to this degree becomes possible?&lt;/p&gt;</description></item><item><title>Kotlin kontra Java - Part 2 - MultiPlatform</title><link>https://javapro-en.svenruppert.com/kotlin-kontra-java-part-2-multiplatform/</link><pubDate>Wed, 22 Apr 2026 07:45:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/kotlin-kontra-java-part-2-multiplatform/</guid><description>&lt;p&gt;When you start a new project on the JVM, should you pick Java or Kotlin?&lt;/p&gt;
&lt;p&gt;You might have a preference based on the ecosystem — the tooling around it, who we can ask for help, and the libraries we can use — which we discussed in &lt;a href="https://javapro.io/2026/04/16/kotlin-kontra-java-part-1-ecosystem/"&gt;part 1&lt;/a&gt; of this article series. Or you might have a preference based on the business modeling capabilities of Java or Kotlin, which we will show in &lt;a href="https://javapro.io/2026/05/07/kotlin-kontra-java-part-3-language-for-interop/"&gt;part 3&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to Develop AI Agents Using BoxLang AI: A Practical Guide</title><link>https://javapro-en.svenruppert.com/how-to-develop-ai-agents-using-boxlang-ai-a-practical-guide/</link><pubDate>Mon, 20 Apr 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/how-to-develop-ai-agents-using-boxlang-ai-a-practical-guide/</guid><description>&lt;p&gt;AI agents are transforming how we build software. Unlike traditional chatbots that just answer questions, agents can reason about what tools they need, decide when to use them, chain multiple actions together, and remember what happened earlier in a conversation.&lt;/p&gt;
&lt;p&gt;In this tutorial, I&amp;rsquo;ll show you how to build a real-world AI agent using &lt;a href="https://ai.boxlang.io"&gt;BoxLang AI&lt;/a&gt; — the official AI framework for the BoxLang JVM language. We&amp;rsquo;ll build &lt;strong&gt;SupportBot&lt;/strong&gt;, an e-commerce customer support agent that can look up orders, check inventory, issue refunds, and answer questions grounded in your knowledge base.&lt;/p&gt;</description></item><item><title>BoxLang AI Deep Dive — Part 7 of 7: MCP — The Protocol That Connects Everything 🔌</title><link>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-7-of-7-mcp-the-protocol-that-connects-everything-/</link><pubDate>Fri, 17 Apr 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-7-of-7-mcp-the-protocol-that-connects-everything-/</guid><description>&lt;p&gt;&lt;em&gt;BoxLang AI 3.0 Series · Part 7 of 7&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The AI ecosystem has a tool problem. Every framework has its own way of defining tools, every agent has its own way of calling them, and every integration requires custom code on both sides. An agent built in Python can&amp;rsquo;t easily use tools built in Java. An MCP server written for Claude Desktop can&amp;rsquo;t easily be consumed by a BoxLang agent without a custom adapter.&lt;/p&gt;</description></item><item><title>BoxLang AI Deep Dive — Part 6 of 7: Memory Systems &amp; RAG — Building AI That Remembers 🧠</title><link>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-6-of-7-memory-systems-rag-building-ai-that-remembers-/</link><pubDate>Thu, 16 Apr 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-6-of-7-memory-systems-rag-building-ai-that-remembers-/</guid><description>&lt;p&gt;&lt;em&gt;BoxLang AI 3.0 Series · Part 6 of 7&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;A chatbot with no memory isn&amp;rsquo;t a conversation — it&amp;rsquo;s a series of isolated queries. Every message starts from scratch. The user has to re-explain who they are, what they&amp;rsquo;re working on, and what was just said. It&amp;rsquo;s exhausting, and it signals that the AI isn&amp;rsquo;t really listening.&lt;/p&gt;
&lt;p&gt;Memory is what separates a useful AI application from a toy. BoxLang AI ships with one of the most comprehensive memory systems in any AI framework — 20+ memory types across two major categories, vector embedding support for semantic retrieval, 30+ document loaders for RAG pipelines, and a per-call identity routing system that makes multi-tenant applications safe by default.&lt;/p&gt;</description></item><item><title>Kotlin kontra Java - Part 1 - Ecosystem</title><link>https://javapro-en.svenruppert.com/kotlin-kontra-java-part-1-ecosystem/</link><pubDate>Thu, 16 Apr 2026 07:00:00 +0000</pubDate><guid>https://javapro-en.svenruppert.com/kotlin-kontra-java-part-1-ecosystem/</guid><description>&lt;p&gt;When you start a new project on the JVM, should you pick Java or Kotlin?&lt;/p&gt;
&lt;p&gt;Kotlin is used by Amazon, Atlassian, Duolingo, Google, JetBrains, Meta, Netflix, Uber and many more. Java is used by, well, &lt;a href="https://blogs.oracle.com/connect/25-years-java-technology-community-family"&gt;„more than 3 billion devices“&lt;/a&gt;. Which one provides the biggest benefit, which one can give us an edge, which one should we pick?&lt;/p&gt;
&lt;p&gt;After 20 years of building systems in Java and 8 years of doing the same in Kotlin, I’ve seen Kotlin earn its reputation as a natural evolution of Java. Rightfully so. Much of what we need can be expressed very cleanly with little verbosity.&lt;/p&gt;</description></item><item><title>BoxLang AI Deep Dive — Part 5 of 7: One API, 17 Providers — The Provider Architecture Deep Dive 🛡️</title><link>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive-%EF%B8%8F/</link><pubDate>Wed, 15 Apr 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-5-of-7-one-api-17-providers-the-provider-architecture-deep-dive-%EF%B8%8F/</guid><description>&lt;p&gt;&lt;em&gt;BoxLang AI 3.0 Series · Part 5 of 7&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Vendor lock-in is the silent killer of AI projects. You pick OpenAI, build everything against the OpenAI API, and then GPT-5 launches at three times the price. Or a competitor launches a model that&amp;rsquo;s faster for your use case. Or you need to self-host for compliance. Or your client is on AWS and wants Bedrock.&lt;/p&gt;
&lt;p&gt;Every time the answer to &amp;ldquo;can we switch providers?&amp;rdquo; is &amp;ldquo;it would take months,&amp;rdquo; something went wrong architecturally.&lt;/p&gt;</description></item><item><title>BoxLang AI Deep Dive — Part 4 of 7: Middleware — The Missing Layer in Every AI Framework 🧵</title><link>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-4-of-7-middleware-the-missing-layer-in-every-ai-framework-/</link><pubDate>Tue, 14 Apr 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-4-of-7-middleware-the-missing-layer-in-every-ai-framework-/</guid><description>&lt;p&gt;&lt;em&gt;BoxLang AI 3.0 Series · Part 4 of 7&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Here&amp;rsquo;s the question every team eventually asks about their AI agents: &lt;em&gt;how do we test these things?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Agents make live LLM calls. They invoke real tools. They have non-deterministic outputs. Standard unit testing approaches fall apart. You can&amp;rsquo;t mock every provider. You can&amp;rsquo;t replay a conversation from three weeks ago. You can&amp;rsquo;t confidently tell stakeholders that the agent you deployed today behaves the same way it did when you signed off on it.&lt;/p&gt;</description></item><item><title>BoxLang AI Deep Dive — Part 3 of 7: Multi-Agent Orchestration — Building AI Teams That Work 🌲</title><link>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-3-of-7-multi-agent-orchestration-building-ai-teams-that-work-/</link><pubDate>Mon, 13 Apr 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-3-of-7-multi-agent-orchestration-building-ai-teams-that-work-/</guid><description>&lt;p&gt;&lt;em&gt;BoxLang AI 3.0 Series · Part 3 of 7&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;A single agent is useful. An orchestra of agents is powerful.&lt;/p&gt;
&lt;p&gt;The problem with most multi-agent frameworks is that the orchestration layer is bolted on — you&amp;rsquo;re managing agent references manually, passing outputs between them by hand, and hoping you haven&amp;rsquo;t introduced a cycle. There&amp;rsquo;s no concept of hierarchy. No cycle detection. No way to ask &amp;ldquo;who&amp;rsquo;s in charge here?&amp;rdquo; or &amp;ldquo;how deep in the tree am I?&amp;rdquo;&lt;/p&gt;</description></item><item><title>BoxLang AI Deep Dive — Part 2 of 7: Building a Production-Grade AI Tool Ecosystem</title><link>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-2-of-7-building-a-production-grade-ai-tool-ecosystem/</link><pubDate>Fri, 10 Apr 2026 12:00:00 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-2-of-7-building-a-production-grade-ai-tool-ecosystem/</guid><description>&lt;p&gt;&lt;em&gt;BoxLang AI 3.0 Series · Part 2 of 7&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Function calling is where most AI frameworks look deceptively simple on the surface and turn into a mess underneath. You define a tool, pass it to the LLM, and when the LLM calls it — who handles the lifecycle? Who fires observability events? Who serializes the result? Who resolves the tool by name when the only thing you have is a string?&lt;/p&gt;</description></item><item><title>BoxLang AI Deep Dive — Part 1 of 7: The Skills Revolution 🎓</title><link>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-1-of-7-the-skills-revolution-/</link><pubDate>Thu, 09 Apr 2026 12:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-ai-deep-dive-part-1-of-7-the-skills-revolution-/</guid><description>&lt;hr&gt;
&lt;p&gt;Every AI framework eventually hits the same wall: your system prompts start drifting. Agent A has a slightly different version of the SQL rules than Agent B. The tone policy on your support bot is three weeks behind the tone policy on your documentation bot. Someone copy-pasted the wrong version. Nobody noticed.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t a discipline problem: it&amp;rsquo;s an architecture problem. System prompts are plain strings, and plain strings don&amp;rsquo;t have a source of truth.&lt;/p&gt;</description></item><item><title>BoxLang AI v3 released - Multi-Agent Orchestration, Tooling, Skills and so much more</title><link>https://javapro-en.svenruppert.com/boxlang-ai-v3-released-multi-agent-orchestration-tooling-skills-and-so-much-more/</link><pubDate>Tue, 07 Apr 2026 13:33:36 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-ai-v3-released-multi-agent-orchestration-tooling-skills-and-so-much-more/</guid><description>&lt;p&gt;It&amp;rsquo;s been a while since we&amp;rsquo;ve shipped something this big. &lt;strong&gt;BoxLang AI 3.0&lt;/strong&gt; is a ground-up rethink of how AI agents, models, and tools work in the BoxLang ecosystem — and it lands with ten major features at once.&lt;/p&gt;
&lt;p&gt;The headline is the &lt;strong&gt;AI Skills system&lt;/strong&gt;: a first-class implementation of Anthropic&amp;rsquo;s &lt;a href="https://www.anthropic.com/news/agent-skills"&gt;Agent Skills open standard&lt;/a&gt; that lets you define reusable knowledge blocks: coding styles, domain rules, tone policies, API guidelines once in a &lt;code&gt;SKILL.md&lt;/code&gt; file and inject them into any number of agents and models at runtime. No more copy-pasting the same system-prompt boilerplate everywhere. Skills are versioned, composable, and come in two modes: always-on (full content in every call) and lazy (only a name + description until the LLM asks for more).&lt;/p&gt;</description></item><item><title>BoxLang Spring Boot Starter: Dynamic JVM Templating for Spring</title><link>https://javapro-en.svenruppert.com/boxlang-spring-boot-starter-dynamic-jvm-templating-for-spring/</link><pubDate>Thu, 19 Mar 2026 12:00:02 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-spring-boot-starter-dynamic-jvm-templating-for-spring/</guid><description>&lt;p&gt;Spring Boot developers know the pain of evaluating view technologies. Thymeleaf is great — until you need more expressiveness. FreeMarker is powerful — until the syntax fights you. What if you could write templates in a dynamic JVM language that gives you the full power of the platform, feels natural, and requires zero setup to integrate?&lt;/p&gt;
&lt;p&gt;Meet the &lt;strong&gt;BoxLang Spring Boot Starter&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Drop one dependency into your Spring Boot 3 app and start writing dynamic &lt;code&gt;.bxm&lt;/code&gt; templates powered by BoxLang — a modern, expressive JVM language. Zero configuration. Full web scopes. 100% Java interoperable. Not only that, you get full access to BoxLang&amp;rsquo;s framework capabilities so you can integrate tons of features into your Spring Boot applications:&lt;/p&gt;</description></item><item><title>7 Habits of Highly Effective AI Java Coding</title><link>https://javapro-en.svenruppert.com/7-habits-of-highly-effective-ai-java-coding/</link><pubDate>Thu, 12 Mar 2026 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/7-habits-of-highly-effective-ai-java-coding/</guid><description>&lt;h3 id="from-ai-user-to-ai-pro"&gt;&lt;strong&gt;From AI User to AI Pro&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://schedule.jcon.one/2026/session/1034618"&gt;&lt;figure class="post-figure"&gt;
 &lt;img src="https://javapro-en.svenruppert.com/uploads/2026/03/2026-Magazin-Artikel-Banner-1024x213.png" alt="" loading="lazy" decoding="async"&gt;
 
 
 
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s be real, AI coding tools are everywhere now.  They&amp;rsquo;re no longer some shiny new toy—they&amp;rsquo;re a part of our daily grind as developers, just like our morning coffee. &lt;/p&gt;
&lt;p&gt;For us Java devs, whether we&amp;rsquo;re wrestling with a giant legacy app or juggling a bunch of microservices, these tools look like a huge win for getting stuff done faster. &lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s the catch: just coding faster isn&amp;rsquo;t the whole story. If you&amp;rsquo;re not careful, it can actually lead to bigger problems down the road. &lt;/p&gt;</description></item><item><title>BoxLang v1.11.0 released</title><link>https://javapro-en.svenruppert.com/boxlang-v1-11-0-released/</link><pubDate>Tue, 10 Mar 2026 12:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-v1-11-0-released/</guid><description>&lt;p&gt;We&amp;rsquo;re proud to announce &lt;strong&gt;BoxLang 1.11.0&lt;/strong&gt;, a highly focused performance and stability release that delivers measurable speed improvements across every BoxLang application, with zero code changes required. The team invested deeply in bytecode generation, class loading, lock management, and type casting to produce one of the most impactful runtime optimization releases to date. Alongside the performance wave, this release resolves critical concurrency bugs, hardens DateTime handling, and ships powerful new developer tooling.&lt;/p&gt;</description></item><item><title>Boxlang intellij ide released</title><link>https://javapro-en.svenruppert.com/boxlang-intellij-ide-released/</link><pubDate>Mon, 09 Mar 2026 12:51:00 +0000</pubDate><guid>https://javapro-en.svenruppert.com/boxlang-intellij-ide-released/</guid><description>The IntelliJ ecosystem is one of the most powerful development environments for JVM developers. Today, we’re excited to introduce the official BoxLang IDE plugin for IntelliJ, bringing modern BoxLang development directly into the JetBrains IDE family.</description></item><item><title>Why I Abandoned my 30-year Open Source Project</title><link>https://javapro-en.svenruppert.com/why-i-abandoned-my-30-year-open-source-project/</link><pubDate>Fri, 20 Feb 2026 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/why-i-abandoned-my-30-year-open-source-project/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I started an open-source project in 1996, I am abandoning now. It was not my first OSS project and certainly not the last one. It definitely was the one that lasted the longest and that I had the most faith in having an impact on the industry.&lt;/p&gt;
&lt;p&gt;The project aimed to create a new approach to document maintenance, and over the years, I developed a few versions of software solutions that supported the idea.&lt;/p&gt;</description></item><item><title>Behind the Bytecode: Exploring Java Features with javap tool</title><link>https://javapro-en.svenruppert.com/behind-the-bytecode-exploring-java-features-with-javap-tool/</link><pubDate>Thu, 27 Nov 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/behind-the-bytecode-exploring-java-features-with-javap-tool/</guid><description>&lt;p&gt;When we develop applications, we often rely on a robust set of tools that the language&amp;rsquo;s development environment provides, which saves us from reinventing the wheel. In the case of Java also, the⁣ &lt;code&gt;Java Development Kit (&lt;/code&gt;&lt;strong&gt;&lt;code&gt;JDK&lt;/code&gt;&lt;/strong&gt;&lt;code&gt;)&lt;/code&gt; plays a vital role. It offers a comprehensive suite of tools, utilities, and commands that simplify the process of building, testing, and running Java applications, making our development faster and more efficient.&lt;/p&gt;
&lt;p&gt;As a Java developer, I&amp;rsquo;m always fascinated by what happens behind the scenes when we compile my code into bytecode. This bytecode reveals how we represent and manage our code internally through the different components of the⁣ &lt;code&gt;Java Virtual Machine (&lt;/code&gt;&lt;strong&gt;&lt;code&gt;JVM&lt;/code&gt;&lt;/strong&gt;&lt;code&gt;)&lt;/code&gt;. Exploring this process offers us deeper insights into Java&amp;rsquo;s architecture and helps us better understand memory management, performance, and runtime behavior.&lt;/p&gt;</description></item><item><title>The Rise of JVM Languages: Kotlin, Scala, Groovy, and More</title><link>https://javapro-en.svenruppert.com/the-rise-of-jvm-languages-kotlin-scala-groovy-and-more/</link><pubDate>Thu, 09 Oct 2025 07:00:00 +0000</pubDate><guid>https://javapro-en.svenruppert.com/the-rise-of-jvm-languages-kotlin-scala-groovy-and-more/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;As Java marks its 30th anniversary in 2025, it remains a foundational force in software development. However, one of its most enduring contributions is not just the language itself but the Java Virtual Machine (JVM). The JVM has paved the way for numerous modern programming languages by providing a stable, efficient, and interoperable runtime environment.&lt;/p&gt;
&lt;p&gt;Over the years, developers have embraced JVM-based languages. These languages offer alternative syntax styles, functional programming paradigms, and dynamic scripting capabilities. At the same time, they maintain seamless compatibility with Java. This article explores the growth of JVM languages. It highlights Kotlin, Scala, and Groovy, along with other influential options such as Clojure, JRuby, and Jython. These languages have extended the reach of the JVM, empowering developers with increased flexibility and productivity.&lt;/p&gt;</description></item><item><title>Building Local LLM AI-Powered Applications with Quarkus, Ollama, and Testcontainers</title><link>https://javapro-en.svenruppert.com/build-local-llm-ollama-quarkus-testcontainers/</link><pubDate>Tue, 09 Sep 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/build-local-llm-ollama-quarkus-testcontainers/</guid><description>&lt;p&gt;Traditionally, many AI-powered applications rely on cloud-based APIs or centralized services for model hosting and execution. While this approach has its advantages, such as scalability and ease of use, it also introduces challenges around latency, data privacy, and dependency on third-party providers.&lt;/p&gt;
&lt;p&gt;This is where local AI models shine. By running models directly within your application&amp;rsquo;s infrastructure, you gain greater control over performance, data security, and deployment flexibility. However, building such systems requires the right tools and frameworks to bridge the gap between traditional software development and AI model integration.&lt;/p&gt;</description></item><item><title>Fixing the Billion-Dollar Mistake</title><link>https://javapro-en.svenruppert.com/fixing-the-billion-dollar-mistake/</link><pubDate>Thu, 07 Aug 2025 07:00:00 +0000</pubDate><guid>https://javapro-en.svenruppert.com/fixing-the-billion-dollar-mistake/</guid><description>&lt;p&gt;&lt;em&gt;There are mistakes that are just costly. Then there is the null reference. A language feature that was added in 1965 &amp;ldquo;simply because it was so easy to implement&amp;rdquo;. Since then, null references have caused countless bugs, system crashes and security problems - and cost billions of dollars in maintenance and troubleshooting. It has been eliminated in many new programming languages and this article will show the practical ways to eliminate this language mistake even in Java.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>The long history of log4j</title><link>https://javapro-en.svenruppert.com/the-long-history-of-log4j/</link><pubDate>Tue, 10 Jun 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/the-long-history-of-log4j/</guid><description>&lt;p&gt;Logging is the art of making sense of a system.&lt;/p&gt;
&lt;p&gt;Software writes lines of information into log files, and developers sift through them, hoping to find what they need. The problem? Systems rarely log the right things. Yet without those files, we&amp;rsquo;d be flying blind, unaware that anything even went wrong.&lt;/p&gt;
&lt;p&gt;This is the story of Apache Log4j—one of the oldest pieces of Java code still in use today. A tool that gave developers a way to listen to their systems.&lt;/p&gt;</description></item><item><title>Adapting Java for Modern APIs: REST, GraphQL, and Event-Driven Innovation</title><link>https://javapro-en.svenruppert.com/adapting-java-for-modern-apis-rest-graphql-and-event-driven-innovation/</link><pubDate>Thu, 05 Jun 2025 07:00:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/adapting-java-for-modern-apis-rest-graphql-and-event-driven-innovation/</guid><description>&lt;h2 id="introduction"&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;In the rapidly evolving world of software development, new API standards like REST, GraphQL, and event-driven architectures are crucial for building scalable, efficient systems. Java for modern APIs, known for its stability in enterprise applications, has continually adapted to meet the demands of these modern paradigms. With an evolving ecosystem, Java for modern APIs remains a robust choice for developers creating flexible, scalable web services.&lt;/p&gt;
&lt;p&gt;This article explores how Java for modern APIs has evolved to support REST, GraphQL, and event-driven architectures, highlighting the technical advancements, key frameworks, and best practices that power modern API development.&lt;/p&gt;</description></item><item><title>Kotlin Multiplatform's Cross-Platform Brilliance at Norway's Nearly 400-Year-Old National Postal Service</title><link>https://javapro-en.svenruppert.com/kotlin-multiplatforms-cross-platform-brilliance-at-norways-nearly-400-year-old-national-postal-service/</link><pubDate>Thu, 01 May 2025 08:56:32 +0000</pubDate><guid>https://javapro-en.svenruppert.com/kotlin-multiplatforms-cross-platform-brilliance-at-norways-nearly-400-year-old-national-postal-service/</guid><description>&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=nAkjwyQ8QOI&amp;amp;list=PLFeSAZzYdUodZjQy6a3pCBl43UUem8_E3&amp;amp;index=19"&gt;&lt;figure class="post-figure"&gt;
 &lt;img src="https://javapro-en.svenruppert.com/uploads/2025/04/Magazin-Artikel-Banner-2-1024x214.jpg" alt="" loading="lazy" decoding="async"&gt;
 
 
 
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When we think of Norway’s National Postal Service, we think of legacy, tradition, and history – a service that has been delivering letters, packages, parcels, and sometimes even joy, for nearly 400 years.\&lt;/p&gt;
&lt;p&gt;&lt;br&gt;
But what happens when such an ancient institution faces the modern challenges of software development and cross-platform integration? How does a company like Posten Bring navigate the world of fragmented business logic across multiple platforms and systems?&lt;br&gt;
&lt;br&gt;
But before I answer these questions, I want to ask &lt;strong&gt;YOU&lt;/strong&gt; - Have you ever had a complex business rule-set problem? You know the kind where you have business rules (logic) spread across multiple platforms, systems, and applications? Some of them might even be alter egos of the same rule hiding in different apps. You never know which one might turn up where; there is no single source of truth, solving errors takes hours of debugging, and making changes requires (oftentimes) painful coordination across teams and applications (ugh).&lt;br&gt;
&lt;br&gt;
We faced this exact challenge at Posten Bring As - Norwegian National Postal Service, founded way back in 1647 - a 378-year-old institution with software spanning more generations than most families! Our business logic was scattered across platforms, some of which were as ancient as the company itself (okay, maybe not that old, but close enough)!&lt;br&gt;
&lt;br&gt;
In this article, I’m spilling the tea. We will discover how the team at a century-old Norwegian postal services giant tackled modern challenges with cutting-edge technology.&lt;br&gt;
&lt;br&gt;
I’m going to walk you through our journey with Kotlin Multiplatform, including the hurdles we encountered, the lessons we learned, and why KMP is a game-changer for anyone grappling with similar challenges.&lt;br&gt;
&lt;br&gt;
This article is for you if troublesome &amp;amp; unruly business logic keeps you up at night &amp;amp; you want that to end NOW. It is also for you if you like to hear a good story.&lt;/p&gt;</description></item><item><title>Top Security Flaws hiding in your code right now - and how to fix them</title><link>https://javapro-en.svenruppert.com/top-security-flaws-injections/</link><pubDate>Tue, 29 Apr 2025 07:00:07 +0000</pubDate><guid>https://javapro-en.svenruppert.com/top-security-flaws-injections/</guid><description>&lt;p&gt;In 2019, a significant &lt;a href="https://medium.com/@sashni/dont-play-games-with-your-cybersecurity-c3dbea71685b"&gt;breach in Fortnite&lt;/a&gt;, the popular game, reportedly exposed millions of players to malware risk. The incident underscored the importance of securing SQL databases properly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But this is not an isolated issue.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Multiple attacks involving SQL injection have occurred, like the one Tesla experienced in 2018. In that case, another SQL injection attack affected Tesla’s Kubernetes console, resulting in financial losses due to unauthorized cryptocurrency mining activities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But this is not only about SQL Injection.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Are AI Coding tools worth it - RESULTS</title><link>https://javapro-en.svenruppert.com/are-ai-coding-tools-worth-it-results/</link><pubDate>Wed, 30 Oct 2024 12:32:45 +0000</pubDate><guid>https://javapro-en.svenruppert.com/are-ai-coding-tools-worth-it-results/</guid><description>&lt;h5 id="background"&gt;Background&lt;/h5&gt;
&lt;p&gt;In &lt;a href="https://javapro.io/2024/10/17/are-ai-coding-tools-worth-it-part-1/"&gt;Part 1&lt;/a&gt;&lt;a href="https://javapro.io/2024/10/17/are-ai-coding-tools-worth-it-part-1/"&gt;,&lt;/a&gt; I examined the value of AI tools for developers, especially those that help them create or understand code. The tools selected are all free to use and a mix of general-purpose ones and those that declare they are specifically for coding purposes.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://javapro.io/2024/10/23/are-ai-coding-tools-worth-it-part-2/"&gt;Part 2&lt;/a&gt;, I examined these tools&amp;rsquo; ability to find bugs and weaknesses. The results were spotty and not particularly useful or time-saving.&lt;/p&gt;
&lt;p&gt;In this part, we&amp;rsquo;ll look at the results from asking these tools to create JUnit tests for the code and decide who wins (and why).&lt;/p&gt;</description></item><item><title>Programming Language with no Syntax?</title><link>https://javapro-en.svenruppert.com/programming-language-with-no-syntax/</link><pubDate>Sun, 15 Sep 2024 23:44:01 +0000</pubDate><guid>https://javapro-en.svenruppert.com/programming-language-with-no-syntax/</guid><description>&lt;p&gt;1. Introduction&lt;br&gt;
Is it possible to have a programming language that has no syntax? It sounds like a contradiction. Programming languages are all about syntax, plus a bit of code generation, optimization, run-time environment, and so on. But syntax is the most important part as far as programmers are concerned. When encountering a new programming language, it takes time to learn the syntax.&lt;br&gt;
&lt;br&gt;
Could we just make the syntax disappear or at least make it as simple as possible? Could we also make the syntax arbitrary so that the programmer writing the code can define it for themselves?&lt;br&gt;
&lt;br&gt;
Ouroboros is a programming language that tries to do just that. It has the simplest syntax ever. It is so simple that it does not even have a syntax analyzer. All it has is a lexical analyzer, which is 20 lines long.&lt;br&gt;
&lt;br&gt;
At the same time, you can write complex programs and even expressions with parentheses and operators of different precedence, assuming you write your own syntax for that in the program. That way, no syntax also means any syntax.&lt;br&gt;
&lt;br&gt;
This article is an introduction to Ouroboros, a programming language with no syntax. It is a toy, never meant to be used in production, but it is a fun toy to play with, especially if you have ever wanted to create your own programming language.&lt;br&gt;
&lt;br&gt;
There were programming languages with minimal syntax. One of the very first languages was LISP, which used only parentheses to group statements as lists.&lt;br&gt;
&lt;br&gt;
If you are familiar with TCL, you may remember how simple the language is. However, it still defines complex expressions and control structures as part of the language.&lt;br&gt;
&lt;br&gt;
Another simple language to mention is FORTH. It is a stack language. The syntax is minimal. You either put something on the stack or call a function that works with the values on the stack. FORTH was also famous for its minimal assembly core and for the fact that the rest of the compiler was written in FORTH itself.&lt;br&gt;
&lt;br&gt;
These languages inspired the design of Ouroboros. LISP is known for the simplest syntax. One might say that LISP has the simplest syntax of all programming languages, but it would be a mistake. True to its name, it uses parentheses to delimit lists, which can be either data or programming structures. As you may know, LISP stands for &amp;ldquo;Lots of Irritating Superfluous Parentheses.&amp;rdquo;&lt;br&gt;
&lt;br&gt;
Ouroboros does not do that. It inherits the use of { and } from TCL, but unlike LISP, you are forced to use them only where they are really needed.&lt;br&gt;
&lt;br&gt;
Ouroboros, although being an interpreted language, can compile itself. Well, not really compile, but you can define syntax for the language in the language itself. However, it is not like in the case of compilers where the compiler is written in the source language. One of the first compilers was the PASCAL compiler written by Niklaus Wirth in PASCAL. The C compiler was also written in C, and more and more language compilers are written in the language they compile.&lt;br&gt;
&lt;br&gt;
In the case of an interpreted language, it is a bit different. It is not a separate program that reads the source code and generates machine code. It is the executing code, the application program itself, that becomes part of the interpreter.&lt;br&gt;
&lt;br&gt;
That way, you cannot look at it and say: this code is not Ouroboros. Any code can be, depending on the syntax you define for it at the start of the code.&lt;br&gt;
&lt;br&gt;
2. The Name of the Game&lt;br&gt;
Before diving into what Ouroboros is, let’s talk about the name itself. Ouroboros coils around itself in an endless cycle of creation and recreation. The name &amp;ldquo;Ouroboros&amp;rdquo; is as multifaceted as the language itself, offering layers of meaning that reflect its unique nature and aspirations.&lt;br&gt;
&lt;br&gt;
2.1. The Eternal Cycle&lt;br&gt;
At its core, Ouroboros draws inspiration from the ancient symbol of a serpent consuming its own tail. This powerful image represents the cyclical nature of creation and destruction, perfectly encapsulating our language’s self-referential definition. Just as the serpent feeds upon itself to sustain its existence, Ouroboros the language is defined by its own constructs, creating a closed loop of logic and functionality.&lt;br&gt;
&lt;br&gt;
2.2. UR: The Essence of Simplicity&lt;br&gt;
Abbreviated as &amp;ldquo;UR,&amp;rdquo; Ouroboros embraces the concept of fundamental simplicity. In German, &amp;ldquo;Ur—&amp;rdquo; signifies something primordial, primitive, or in its most basic form. This perfectly encapsulates the design philosophy behind Ouroboros: a language stripped down to its absolute essentials.&lt;br&gt;
&lt;br&gt;
By pushing the simplification of syntax to the extreme, Ouroboros aims to be the &amp;ldquo;ur-language&amp;rdquo; of programming—a return to the most elemental form of computation. Like the basic building blocks of life or the fundamental particles of physics, Ouroboros provides a minimal set of primitives from which complex structures can emerge.&lt;br&gt;
&lt;br&gt;
This radical simplicity is not a limitation but a feature. It challenges programmers to think at the most fundamental level, fostering a deep understanding of computational processes. In Ouroboros, every construct is essential, every symbol significant. It’s programming distilled to its purest form.&lt;br&gt;
&lt;br&gt;
2.3. Our Shared Creation&lt;br&gt;
The name begins with &amp;ldquo;Our-,&amp;rdquo; emphasizing the collaborative nature of this language. Ouroboros is not just a tool but a shared endeavor that belongs to its community of developers and users. It’s a language crafted by us, for us, evolving through our collective efforts and insights.&lt;br&gt;
&lt;br&gt;
2.4. Hidden Treasures&lt;br&gt;
Delve deeper into the name, and you’ll uncover more linguistic gems:&lt;br&gt;
&lt;br&gt;
&amp;ldquo;Oro&amp;rdquo; in many Romance languages means &amp;ldquo;gold&amp;rdquo; or &amp;ldquo;prayer.&amp;rdquo; Ouroboros can be seen as a golden thread of logic, or a prayer-like mantra of computational thought.&lt;br&gt;
&lt;br&gt;
&amp;ldquo;Ob-&amp;rdquo; as a prefix often means &amp;ldquo;toward&amp;rdquo; or &amp;ldquo;about,&amp;rdquo; suggesting that Ouroboros is always oriented toward its own essence, constantly reflecting upon and refining itself.&lt;br&gt;
&lt;br&gt;
&amp;ldquo;Boros&amp;rdquo; could be playfully interpreted as a variation of &amp;ldquo;bytes,&amp;rdquo; hinting at the language’s digital nature.&lt;br&gt;
&lt;br&gt;
Parsing the name as &amp;ldquo;our-ob-oros&amp;rdquo; reveals a delightful multilingual wordplay: &amp;ldquo;our way to the treasure.&amp;rdquo; This blend of English (&amp;ldquo;our&amp;rdquo;), Latin (&amp;ldquo;ob&amp;rdquo; meaning &amp;ldquo;towards&amp;rdquo;), and Greek (&amp;ldquo;oros,&amp;rdquo; which can be associated with &amp;ldquo;boundaries&amp;rdquo; or &amp;ldquo;definitions&amp;rdquo;) mirrors the language’s eclectic inspirations.&lt;br&gt;
&lt;br&gt;
Just as Ouroboros draws from the diverse traditions of TCL, LISP, and FORTH, its name weaves together linguistic elements from different cultures. This multilingual, multi-paradigm approach guides us toward the treasures of computation, defining new boundaries along the way, much like how TCL offers flexibility, LISP promotes expressiveness, and FORTH emphasizes simplicity and extensibility.&lt;br&gt;
&lt;br&gt;
2.5. A Name That Bites Back&lt;br&gt;
Ultimately, Ouroboros is a name that challenges you to think recursively, to see the end in the beginning and the whole in every part. It’s a linguistic puzzle that mirrors the very nature of the programming language it represents—complex, self-referential, and endlessly fascinating.&lt;br&gt;
&lt;br&gt;
As you embark on your journey with Ouroboros, remember that you’re not just writing code; you’re participating in an ancient cycle of creation, where every end is a new beginning, and every line of code feeds into the greater whole of computational possibility.&lt;br&gt;
&lt;br&gt;
3. What is Ouroboros&lt;br&gt;
Ouroboros is a programming language that has no syntax. I have already said that, and now comes the moment of truth: it is a &amp;ldquo;lie.&amp;rdquo; There is no programming language with absolutely no syntax. UR has a syntax, and it is defined with this sentence:&lt;br&gt;
&lt;br&gt;
You write the lexical elements of the language one after the other.&lt;br&gt;
&lt;br&gt;
3.1. Syntax&lt;br&gt;
That is all.&lt;br&gt;
&lt;br&gt;
When the interpreter starts to execute the code, it begins reading the lexical elements one after the other. It reads as many elements as it needs to execute some code and not more. To be specific, it reads exactly one lexical element before starting execution. When the execution triggered by the element is finished, it goes on reading the next element.&lt;br&gt;
&lt;br&gt;
The execution itself can trigger more reads if the command needs more elements. We will see it in the next example soon.&lt;br&gt;
&lt;br&gt;
A lexical element can be a number, a string, a symbol, or a word. Symbols and words can and should have an associated command to execute.&lt;br&gt;
&lt;br&gt;
For example, the command puts is borrowed shamelessly from TCL and is associated with the command that prints out a string.&lt;br&gt;
&lt;br&gt;
puts &amp;ldquo;Hello, World!&amp;rdquo;&lt;br&gt;
It is the simplest program in Ouroboros. When the command behind puts starts to execute, it asks the interpreter to read the next element and evaluate it. In this example, it is a constant string, so it is not difficult to calculate. The value of a constant string is the string itself.&lt;br&gt;
&lt;br&gt;
The next example is a bit more complex:&lt;br&gt;
&lt;br&gt;
puts add &amp;ldquo;Hello, &amp;quot; &amp;ldquo;World!&amp;rdquo;&lt;br&gt;
In this case, the argument to the command puts is another command: add. When puts asks the interpreter to get its argument, the interpreter reads the next element and then starts to execute. As add starts to execute, it needs two arguments, which it asks from the interpreter. Since these arguments are strings, add concatenates them and returns the result.&lt;br&gt;
&lt;br&gt;
3.2. Blocks&lt;br&gt;
There is a special command denoted by the symbol {. The lexical analyzer recognizing this character will ask the interpreter to read the following elements until it finds the closing }. This call is recursive in nature if there are embedded blocks.&lt;br&gt;
&lt;br&gt;
The resulting command is a block command. A block command executes all the commands in it and results in the last result of the commands in the block.&lt;br&gt;
&lt;br&gt;
puts add {&amp;ldquo;Hello, &amp;quot; &amp;ldquo;World!&amp;rdquo;}&lt;br&gt;
If we close the two strings into a block, then the output will be a single World! without the `Hello, `. The block &amp;ldquo;executes&amp;rdquo; both strings, but the value of the block is only the second string.&lt;br&gt;
&lt;br&gt;
3.3. Commands&lt;br&gt;
The commands implemented are documented in the readme of the project on GitHub. The actual set of commands is not fascinating. Every language has a set of commands.&lt;br&gt;
&lt;br&gt;
The fascinating part is that in UR there is no difference between functions and commands. Are puts or add commands or functions? How about if and while? They are all commands, and they are not part of the language per se. They are part of the implementation.&lt;br&gt;
&lt;br&gt;
The command if asks the interpreter to fetch one argument, evaluated. It will use this as the condition. After this, it will fetch the next two elements without evaluation. Based on the boolean interpretation of the condition, it will ask the interpreter to evaluate one of the two arguments.&lt;br&gt;
&lt;br&gt;
Similarly, the command while will fetch two arguments without evaluation. It then evaluates the first as a condition, and if it is true, it will evaluate the second and then go back to the condition. It fetched the condition unevaluated because it will need to evaluate it again and again. In the case of the if command, the condition is evaluated only once, so we did not need a reference to the unevaluated version.&lt;br&gt;
&lt;br&gt;
Many commands use the unevaluated version of the arguments. This use makes it possible to use the &amp;ldquo;binary&amp;rdquo; operators as multi-argument operators. If you want to add up three numbers, you can write add add 1 2 3, or add* 1 2 3 {}, or {add* 1 2 3}. The command add fetches the first argument unevaluated and sees if it is a *. If it is *, then it will fetch the arguments until it encounters the end of the arguments or an empty block.&lt;br&gt;
&lt;br&gt;
This is a little syntactic sugar, which should be peculiar in the case of a language that has no syntax. It really is there to make the experiment and the playing with the language bearable. On the other side, it erodes the purity of the language. It is also only a technical detail, and I mention it only because we will need to understand it when we discuss the metamorphic nature of the language. It will be needed to understand the use of the first example there.&lt;br&gt;
&lt;br&gt;
3.4. Variables&lt;br&gt;
UR supports variables. Variables are strings with values associated with them. The value can be any object.&lt;br&gt;
&lt;br&gt;
When the interpreter sees a symbol or a bare word (identifier) to evaluate, it will check the value associated with it. If the value is a command, then it will execute the command. In other cases, it will return the value.&lt;br&gt;
&lt;br&gt;
The variables are scoped. If you set a variable in a block, then the variable is visible only in that block. If there are variables with the same name in the parent block, then the variable in the child block will shadow the variable in the parent block.&lt;br&gt;
&lt;br&gt;
Variable handling and scoping are implementation details and not strictly part of the language.&lt;br&gt;
&lt;br&gt;
The implementation as it is now supports boolean, long, double, big integer, big decimal, and string primitive values. It also supports lists and objects.&lt;br&gt;
&lt;br&gt;
A list is a list of values, and it can be created with the list command. The argument to the command is a block. The command list will ask the interpreter to fetch the argument unevaluated. Afterward, it evaluates the block from the start the same way as the block command does. However, instead of throwing away the resulting values and returning the last one, it returns a list of the results.&lt;br&gt;
&lt;br&gt;
An object is a map of values. It can be created with the object command. The argument to the command is the parent object. The fields of the parent object are copied to the new object.&lt;br&gt;
&lt;br&gt;
Objects also have methods. They are the fields that have a command as a value.&lt;br&gt;
&lt;br&gt;
4. Introspection&lt;br&gt;
The interpreter is open like a cracked safe after a heist. Nothing is hard-wired into the language. When I wrote that the language interpreter recognizes bare words, symbols, strings, etc., it was only true for the initial setup. The lexical analyzers implemented are UR commands, and they can be redefined. They are associated with the names $keyword, $string, $number, $space, $block, $blockClose, and $symbol. The interpreter uses the variable structures to find these commands. There is another variable named $lex that is a list of the lexical analyzers.&lt;br&gt;
&lt;br&gt;
The interpreter uses this list when it needs to read the next lexical element. It invokes the first, then the second, and so on until one of them returns a non-null value, a lexical element, which is a command.&lt;br&gt;
&lt;br&gt;
If you modify this list, then you can change the lexical analyzers, and that way you can change the syntax of the language.&lt;br&gt;
&lt;br&gt;
The simplest example is changing the interpretation of the end-of-line character.&lt;br&gt;
&lt;br&gt;
You may remember that we can use the binary operators using multiple arguments terminated with an empty block. It would be nice if we could omit the block and just write add* 1 2 3 simply adding a new-line at the end. We can do that by changing the lexical analyzer that recognizes the end-of-line character, and this is exactly what we are going to do in this example.&lt;br&gt;
&lt;br&gt;
set q add* 3 2&lt;br&gt;
1 {} puts q&lt;br&gt;
insert $lex 0 &amp;lsquo;{&lt;br&gt;
if { eq at source 0 &amp;ldquo;\n&amp;rdquo;}&lt;br&gt;
{sets substring 1 length source source &amp;lsquo;{}}}&lt;br&gt;
set q add* 3 2&lt;br&gt;
1 {} puts q&lt;br&gt;
We insert a new lexical analyzer at the beginning of the list. If the very first character of the current state of the source code is a new-line character, then the lexical analyzer eats this character and returns an empty block.&lt;br&gt;
&lt;br&gt;
The command source returns the source code that was not parsed by the interpreter yet. The command sets sets the source code to the string value specified.&lt;br&gt;
&lt;br&gt;
The first puts q will print 6 because at the time of the first calculation, new-lines are just ignored, and that way the value of q is add* 3 2 1 {}. The second puts q will print 5 because the new-line is eaten by the lexical analyzer, and the value of q is add* 3 2 {}. Here, the closing {} was the result of the lexical analysis of the new-line character. The values 1 and {} on the next line are calculated, but they do not have any effect.&lt;br&gt;
&lt;br&gt;
This is a very simple example. If you want to see something more complex, the project file src/test/resources/samples/xpression.ur contains a script that defines a numerical expression parser.&lt;br&gt;
&lt;br&gt;
There is a special command called fixup. This command forces the interpreter to parse the rest of the source. After this point, the lexical analyzers are not used anymore.&lt;br&gt;
&lt;br&gt;
Executing this command does not give any performance benefit, and that is not the purpose. It is more like a declaration that all the codes that are part of the source code introspection and the metamorphic calculation are done. A special implementation of the command can also take the parsed code and generate an executable, turning the interpreter into a compiler.&lt;br&gt;
&lt;br&gt;
5. Technical Considerations&lt;br&gt;
The current version is implemented in Java. Ouroboros is not a JVM language, though. We do not compile the code to Java byte-code. The Java code interprets the source and executes it.&lt;br&gt;
&lt;br&gt;
The implementation is an MVP focusing on the metamorphic nature of the language. It is meant to be an experiment. This is the reason why there are no file, network, and other I/O operations except the single puts command that writes to the standard output.&lt;br&gt;
&lt;br&gt;
The Java service loader feature is used to load the commands and to register them with their respective names in the interpreter. It means that implementing extra commands is as simple as creating them, writing a class implementing a ContextAgent to register them (see the source code), and putting them on the classpath.&lt;br&gt;
&lt;br&gt;
The whole code is open-source and available on GitHub. It is licensed under the Apache License 2.0 (see the license file in the repo). It is exactly 100 classes at the time of writing this article. It means that the source code is simple, short, and easy to understand. If you need some straightforward scripting language in your application, you can use it. It was not meant to be for production, though.&lt;br&gt;
&lt;br&gt;
6. Going Further&lt;br&gt;
There is no plan currently to extend the language and include more commands. We only plan to create more metamorphic code in the language. The reason for that is that we do not see the language as a practical tool as of today. If it proves to be useful and gains a user base and utilization, we certainly will incorporate more commands to support I/O, file handling, networking, and so on.&lt;br&gt;
&lt;br&gt;
We also have visions of implementing the interpreter in other languages, like in Rust and Go. Anyone suggesting or wanting to develop commands for better usability or adding features is welcome. It can be a parallel project, or it can be merged into the main project if that makes sense.&lt;br&gt;
&lt;br&gt;
7. Conclusion&lt;br&gt;
In exploring Ouroboros, we delved into the concept of a programming language that minimizes syntax to the point of almost non-existence. This radical approach challenges the conventional understanding of what a programming language should be, presenting a system where syntax is both absent and infinitely customizable. By drawing inspiration from languages like LISP, TCL, and FORTH, Ouroboros embodies simplicity and introspection, allowing programmers to define their syntax and commands within the language itself.&lt;br&gt;
&lt;br&gt;
While Ouroboros is not designed for practical production use, it serves as an intriguing experiment in language design and metaprogramming. Its self-referential nature and minimalistic design offer a playground for developers interested in the fundamentals of computation, syntax design, and language interpretation. Whether it evolves into a more robust tool or remains a fascinating intellectual exercise, Ouroboros pushes the boundaries of how we think about programming languages, inviting us to consider the possibility of a language where syntax is as mutable and recursive as the Ouroboros serpent itself.&lt;/p&gt;</description></item></channel></rss>