Beyond Legacy: The Modern Language Ecosystem of z/OS
For "z/OS and Friends," Joe Gulla catalogs the broad and ever-evolving range of programming languages on z/OS
Language is never stagnant, and programming languages are no exception. For evidence of this, just look at z/OS, which supports a broad and evolving range of programming languages and development environments, spanning both commercial and open-source ecosystems.
This article is the first of two for “z/OS and Friends” explaining why z/OS remains the most versatile platform for enterprise development. Here, I will cover the topic in three sections—traditional enterprise languages, modern and open-source languages, and languages focused on scripting and automation.
There Is a Reason COBOL Persists
I started with COBOL in 1978, when I became a programmer trainee for ConRail in Philadelphia. I found it remarkable that after three months of lecture and lab, I was able to start contributing to the new generation of transportation and billing (TABS) programs. My contribution was part of a completely revamped business system. Using COBOL meant that I was productive very quickly.
For another employer, I changed from application programmer to system programmer and learned Basic Assembler Language (BAL). After joining IBM in 1984, I continued with COBOL and BAL for years, writing programs as needed for clients on various professional services projects. COBOL and BAL were useful because they were straightforward to code and easy to maintain if you took steps to organize the code, avoiding unconditional branches (the dreaded COBOL GO TO).
As an adjunct professor in the La Salle MBA program, I taught COBOL to graduate students. It was a good choice because it could be covered in a semester, was a business language and gave practical (and sometimes humbling) experience to future technology leaders. The thinking was that managers should know the challenges of programming, especially testing and debugging. It is a business survival skill even if you are not coding the programs yourself.
When I joined the IBM Networking Lab, I learned CLIST language and REXX. I was part of a team that made extensive use of REXX, millions of lines of code, for various program offerings that later graduated to IBM program products and are still used today. REXX is a powerful language, and I still remember what it was like to use it to solve very complex automation-programming challenges. It was completely up to the task even when I was slow to figure out the right solution approach.
Why Stick With Programming?
Why did I stay familiar with programming languages over all these years? It’s simple; it’s a great way to stay close to an amazing machine when so many other duties, like project planning and personnel management, take you in another other direction. Languages kept me active in solving problems and contributing to the success of an enterprise. Languages also reminded me why I got into computers in the first place, as they remain a wonderful way to take a journey of discovery.
What has happened to those traditional enterprise languages over the years? Let’s explore the most important ones.
Traditional Enterprise Languages
The traditional languages used with z/OS have been updated and enhanced over decades and continue to meet the needs of customers with mission-critical applications. What are the traditional enterprise languages and why do they still matter? Here are languages that are deeply integrated with z/OS and widely used in mission-critical applications:
Common Business-Oriented Language (COBOL)
COBOL was developed in 1959 by a committee of industry and government experts led by the U.S. Department of Defense. It was designed to be readable and accessible for business professionals, making it ideal for tasks like payroll, accounting and inventory management. COBOL quickly became the dominant language for enterprise computing, especially on IBM mainframes, where it powered mission-critical applications across banking, insurance and government sectors.
COBOL remains deeply embedded in global infrastructure, with over 200 billion lines of code and 5 billion lines more being written annually. Modern COBOL on z/OS supports integration with APIs, web services and DevOps pipelines, ensuring its continued relevance in hybrid cloud and digital transformation initiatives. It is still important, so the compiler development continues and is keeping pace.
Formula Translation (Fortran)
FORTRAN was introduced in 1957 by IBM as the first high-level programming language, designed specifically for scientific and engineering calculations. In its early years, FORTRAN revolutionized programming by allowing developers to write code using mathematical formulas rather than machine instructions, making it ideal for tasks like numerical analysis, simulations and data modeling. It quickly became the standard in fields such as physics, aerospace and meteorology.
While no longer mainstream in general enterprise development, FORTRAN remains vital in high-performance computing (HPC), legacy scientific applications and government systems. The compilers from IBM are deployed as a family for z/OS, AIX and Linux. Modern versions support parallel processing, GPU acceleration and integration with contemporary toolchains, ensuring its continued relevance in specialized domains.
Programming Language One (PL/I)
PL/I was introduced by IBM in the early 1960s as a unified language designed to serve both scientific and business computing needs. It combined features from FORTRAN, COBOL, and ALGOL, making it versatile for tasks ranging from numerical analysis to data processing and file management. Initially adopted in industries that required both precision and robust data handling—such as finance, insurance and government—PL/I became a staple on IBM mainframes.
While its usage has declined compared to COBOL, PL/I remains active in legacy systems, particularly on z/OS, where it continues to support critical applications. IBM still provides compiler support and integration with modern tooling, allowing PL/I programs to participate in contemporary DevOps workflows and hybrid cloud environments.
High-Level Assembler (HLASM)
HLASM traces its roots back to the earliest days of IBM mainframes in the 1950s and 1960s, when low-level assembly language was essential for writing operating systems, device drivers and performance-critical routines. Early in my career, I worked with people who readily developed extensions that were needed to fill gaps in those early products.
Initially, Assembler was used to directly control hardware and manage system resources, offering unmatched speed and precision. In the middle 1980s, I wrote a billing systems in BAL that was used to chargeback all the CPU time consumed by a database region. This was just before HLASM. With the introduction of HLASM in the 1990s, IBM provided a more structured and maintainable version of Assembler for z/OS, supporting macros, conditional logic and integration with the Language Environment.
HLASM remains vital in niche areas of enterprise computing, particularly where deep system control, optimization or legacy compatibility is required. It’s often used in conjunction with COBOL or PL/I for performance tuning by rewriting frequently exercised routines in HLASM. System exits and low-level utilities continue to be supported in modern DevOps workflows on z/OS.
Report Program Generator (RPG)
RPG was introduced by IBM in 1964 as a high-level programming language designed to simplify business reporting and data processing tasks, particularly on IBM midrange systems like the System/3 and later the AS/400 (now IBM i). In its early years, RPG was used primarily for generating reports from structured data, making it popular in manufacturing, distribution and finance sectors. Over time, RPG evolved significantly, gaining structured and free-form syntax, modular programming capabilities and support for modern development practices.
RPG is widely used on IBM i systems, where it powers core business applications and integrates with modern technologies such as web services, APIs and SQL databases. Its continued relevance is supported by IBM’s ongoing enhancements and the language’s ability to coexist with newer languages like Java and Python in hybrid environments.
REstructured eXtended eXecutor (REXX)
REXX was developed by IBM in the late 1970s and officially released in 1981 as a scripting language designed for ease of use and readability. Initially used for automating tasks in IBM VM and MVS environments, REXX quickly became popular among system programmers and administrators for writing command procedures, utilities and automation scripts. Its straightforward syntax and integration with TSO/E made it a staple on z/OS systems.
REXX continues to play a vital role in scripting and automation on IBM mainframes, especially in environments where lightweight, interpretable logic is needed for system management, testing and DevOps workflows. Like other enterprise languages, REXX has a compiler and a library. Serving as a bridge between legacy operations and modern tooling, REXX is often used alongside languages like Python and Java in hybrid environments.
Job Prospects for Traditional Enterprise Languages
Based on job openings on sites like Indeed, how many jobs mention COBOL, Fortran, PL/I, Assembler (HLASM), RPG and REXX as a requirement or “nice to have”? The table below is based on current job postings on Indeed and related sources. It contains a snapshot of how often the following legacy programming languages are mentioned as requirements or “nice to have” skills in enterprise job listings.
Table 1. Job Sites and Enterprise Language-Related Openings
| Language | Job Sites Listings |
| COBOL | COBOL dominates the legacy language job market with hundreds of active listings and strong demand due to a shrinking talent pool. Indeed lists hundreds of COBOL-related jobs, including roles like COBOL Developer, Programmer and Mainframe Engineer. |
| ZipRecruiter shows a wide range of COBOL jobs, with salaries ranging from just under $100,000 to over $140,000 per year, including remote and hybrid positions. | |
| Dice.com currently has over 430 COBOL job listings, many requiring experience with DB2, CICS and JCL on IBM mainframes. | |
| SimplyHired lists around 240 COBOL programmer jobs, often requiring experience with Systematics ALS and other mainframe tools. | |
| PL/I, Assembler (HLASM) | These languages appear less frequently but are still present in niche roles. PL/I and Assembler are often bundled with COBOL in mainframe developer roles, especially in government and financial services. This is according to iitjobs.com. |
| RPG | RPG is typically associated with IBM iSeries (AS/400) jobs, which are fewer but still active. |
| REXX, FORTRAN | REXX and FORTRAN are mentioned occasionally, mostly in legacy system maintenance or scientific computing roles. |
Modern and Open-Source Languages
IBM has made significant strides in supporting modern languages on z/OS. Consider these six groupings of languages.
C/C++
C was developed in the early 1970s by Dennis Ritchie at Bell Labs as a system programming language for writing operating systems, most notably UNIX. It offered low-level memory access and efficient performance, making it ideal for embedded systems, compilers and hardware-level programming. C++, introduced in the early 1980s by Bjarne Stroustrup, extended C with object-oriented features, enabling more structured and reusable code for large-scale software development. Initially used for systems and application programming, both languages became foundational in enterprise software, gaming and real-time systems.
C and C++ remain critical in performance-sensitive domains such as operating systems, financial systems, and high-frequency trading platforms. On z/OS, they are used for developing system utilities, middleware and applications that require tight integration with the operating system, often alongside modern DevOps practices and hybrid cloud architectures. C/C++ is supported via IBM XL C/C++.
Java
Java was introduced by Sun Microsystems in 1995, designed as a platform-independent, object-oriented programming language with the slogan “write once, run anywhere.” In its early years, Java was widely adopted for building cross-platform desktop applications and applets for web browsers. Its robust security model and portability quickly made it a favorite for enterprise development, especially in large-scale systems requiring reliability and scalability.
Java remains one of the most widely used languages in the world, powering everything from backend services and Android apps to cloud-native applications and microservices. On platforms like IBM z/OS, Java plays a key role in modernizing legacy systems, integrating with APIs and supporting DevOps workflows through tools like Maven, Gradle and Jenkins. Its continued evolution and strong ecosystem ensure Java’s relevance in both traditional and cutting-edge enterprise environments. Java is fully supported with IBM SDK for Java and WebSphere Liberty.
Python
Python was created in 1991 by Guido van Rossum as a general-purpose programming language focused on simplicity and readability. In its early years, Python was used primarily for scripting, automation and educational purposes, thanks to its clean syntax and ease of learning. Over time, it evolved into a powerful tool for web development, data analysis, scientific computing and artificial intelligence.
Python is one of today’s most popular programming languages, widely adopted across industries for tasks ranging from backend development and DevOps to machine learning and cloud computing. Its vast ecosystem of libraries and frameworks, along with strong community support and compatibility with modern CI/CD pipelines, makes Python a cornerstone of contemporary software development. Python is available via IBM Open Enterprise SDK for Python.
Go
Go, often referred to as Golang, was developed at Google in 2007 by Robert Griesemer, Rob Pike and Ken Thompson, and officially released in 2009. It was designed to improve programming productivity in large-scale systems, particularly in the context of multicore processors, networked machines and massive codebases. Early on, Go gained traction for its simplicity, fast compilation and built-in concurrency model using goroutines and channels, making it ideal for building scalable backend services and command-line tools.
Go is widely used in cloud-native development, DevOps tooling, microservices and API infrastructure. It powers platforms like Kubernetes and Terraform, and is favored for its performance, reliability and clean syntax. Go is supported through the open-source port for z/OS.
Node.js
Node.js was introduced in 2009 by Ryan Dahl as a runtime environment that allowed developers to run JavaScript on the server side, outside the browser. Initially, it gained popularity for building scalable, event-driven web applications, especially real-time services like chat apps and streaming platforms. Its non-blocking I/O model and use of JavaScript made it accessible to frontend developers transitioning to full-stack roles.
Node.js is widely used in enterprise and cloud-native environments for developing microservices, APIs and serverless applications. It integrates seamlessly with modern DevOps workflows, supports CI/CD pipelines and has a rich ecosystem of packages via Node Package Manager (NPM). This makes it a key component in modern software development across platforms, including hybrid environments that interface with legacy systems like z/OS. Node.js is available via IBM SDK for Node.js on z/OS.
Perl, PHP and Ruby
Perl, PHP and Ruby each emerged to address different needs in the evolving landscape of web and systems programming. Perl, developed in 1987 by Larry Wall, was originally designed for text processing and system administration tasks. It quickly became popular for scripting, automation and early web development, especially in UNIX environments. PHP, created in 1994 by Rasmus Lerdorf, was built specifically for web development and became widely adopted for building dynamic websites and applications, particularly with platforms like WordPress and Drupal. Ruby, introduced in 1995 by Yukihiro Matsumoto, emphasized simplicity and developer happiness, gaining traction through the Ruby on Rails framework for rapid web application development.
While these languages are less dominant than Python or JavaScript, they continue to be used in maintaining legacy systems, powering specific platforms and supporting niche communities. Each has modern tooling and package ecosystems that allow integration with APIs, cloud services and CI/CD pipelines, ensuring they remain viable in contemporary development workflows. Perl, PHP and Ruby are, however, available through open-source ports that are less common in production.
Job Openings for Modern and Open-Source Languages
How often do C/C++, Java, Python, Go, Node.js, Perl, PHP and Ruby show up in job posting on sites like Indeed? The table below is based on recent analysis of over 12 million developer job postings from January 2023 to September 2024. Here’s how often major programming languages show up in job listings on platforms like Indeed, LinkedIn and Glassdoor, according to devjobsscanner.com.
Table 2. Job Sites and Modern and Open-Source Openings
| Language | Job Postings Found | % of Total Language-Specific Jobs |
| JavaScript and TypeScript | More than 651,000 | Approximately 31% |
| Python | More than 408,000 | Approximately 20% |
| Java | More than 376,000 | Approximately 18% |
| C/C++/C# | Frequently listed | Often bundled with embedded or systems roles |
| Go (Golang) | Top three in recent months | Popular in backend/cloud roles |
| Node.js | Included under JavaScript | Common in full-stack roles |
| Ruby | Mentioned but less frequent | Often in legacy or niche web apps |
| PHP | Still present but declining | Used in WordPress and legacy systems |
| Perl | Rarely mentioned | Mostly in legacy or scientific roles |
Scripting and Automation
The third and final leg of this tour focuses on languages for scripting and automation—JCL, REXX and Shell Scripting.
Job Control Language (JCL)
JCL is core to batch processing. JCL is a scripting language used on IBM’s z/OS operating system to instruct the system on how to run batch jobs and manage resources. It plays an operational role in enterprise computing by defining the steps a job should follow, specifying input and output datasets and controlling program execution.
JCL enables precise control over job scheduling, execution priorities and system resource allocation, making it essential for automating large-scale data processing and operational workflows. In many systems, job execution is automated using job scheduling software. This is a well-established way to manage the batch window problem.
On the surface, the language is simple, with JOB, EXEC and DD statements that are the focus of control-language definitions. However, context is very important when filling in the parameters that support each statement. Take the DD (data definition) statement and the DISP= parameter, which is an example keyword=value parameter.
Table 3. DD Statement DISP Parameter for Different Kinds of Files
| What Kind of File? | What Should Happen After JOB Completion? | Explanation |
| New dataset | DISP=(NEW,CATLG,DELETE) | Create a catalog entry and keep the file for normal step termination; otherwise, delete the dataset. |
| Existing dataset | DISP=OLD or DISP=SHR | The dataset already exists; keep it regardless of how the step terminates. OLD allows update processing, whereas SHR is read only. |
| Temporary dataset | DISP=(NEW,PASS) | Dataset is new and should be passed to subsequent steps in the JOB. It will not be kept at JOB completion. |
REXX
REXX is a powerful scripting language widely used for automation and task orchestration, particularly in IBM mainframe environments. Known for its simplicity and readability, REXX enables users to write scripts that automate repetitive tasks, manage system operations and integrate with other software components. It is especially popular on z/OS systems, where it serves as a bridge between system commands and applications, allowing for efficient control of batch jobs, data manipulation and system monitoring.
Shell Scripting
Shell scripting in UNIX is a foundational tool for automating system tasks, managing files and streamlining administrative operations. By leveraging the command-line interface, users can write scripts using shells like Bash, KornShell (ksh) or C Shell (csh) to execute sequences of commands, control program flow and interact with system utilities.
Shell scripting enhances productivity by reducing manual intervention, enabling repeatable and consistent execution of complex operations and integrating seamlessly with other UNIX tools and environments. Its power and flexibility make it an essential skill for system administrators, developers and IT professionals working in UNIX-based systems.
Top-Ranked Programming Languages
Below is a list of the top 10 programming languages using a 2025 ranking from IEEE Spectrum. IEEE’s rankings are based on a composite of Google search traffic, Stack Overflow activity, GitHub repositories, mentions in academic papers and job postings.
Only the job posting ranking measure references “need in the marketplace” versus other measures of popularity by collecting selected activity. I wonder about activity versus need—is it a good measure? Tables 1 and 2, earlier in the article, are a good measure of marketplace need, as they reflect job postings. Google search traffic and Stack Overflow activity might be reflective of where a language is in its lifecycle and the skillset of the programmers using it.
- Python (note 1)– Continues to dominate due to its versatility in AI, data science, automation and web development.
- Java – Strong in enterprise systems, mobile apps and backend development.
- C++ – Gaining traction for performance-critical applications like game engines and systems programming.
- C – Still widely used in embedded systems and OS-level development.
- SQL (note 2) – Essential for database management and data-driven applications.
- JavaScript – Popular for web development, though its ranking dropped slightly due to shifts in how developers build websites.
- TypeScript – Rising in popularity as a safer, scalable alternative to JavaScript.
- Go – Favored for cloud-native applications and backend services.
- Rust – Increasingly adopted for secure and efficient systems programming.
- MATLAB – Still relevant in engineering and scientific computing.
Note 1 – Language names in bold indicate that they were discussed elsewhere in this article.
Note 2 – SQL is considered a domain-specific language, not a general-purpose programming language like Python or Java, so it doesn’t really fit in this table of general-purpose languages. There are other domain-specific languages like CICSCommand Level Language and IMS Data Language/I that they might have included in their analysis.
What Is Next?
The next article will focus on environments for development, DevOps and CI/CD, and package and tooling support. It is a natural next step when you have just explored programming languages.