From JCL to Bicep: The Evolution of Infrastructure Definition

Job Control Language (JCL) utilized on IBM 370 mainframes and Bicep for Microsoft Azure represent two distinct eras of infrastructure and resource management that are decades apart yet share foundational principles. Although they may appear to be entirely different, these technologies exhibit fundamental similarities in their methods for resource definition and management. This analysis examines their interconnections and traces the evolutionary journey from mainframe JCL to contemporary Infrastructure as Code (IaC).

Core Similarities

Declarative Nature

Both JCL and Bicep are declarative languages that allow users to specify “what” they wish to achieve rather than “how” to implement it. In JCL, users declare the programs to execute, the required datasets, and the necessary resources. In a similar manner, Bicep specifies the desired state of Azure resources, along with their configurations and interrelationships.

JCL Example (Declaring a Job Step):

//STEP1    EXEC PGM=SORT
//SORTIN   DD   DSN=INPUT.FILE,DISP=SHR
//SORTOUT  DD   DSN=OUTPUT.FILE,
//         DISP=(NEW,CATLG),
//         SPACE=(CYL,(10,5))

Equivalent Concept in Bicep:

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = {
  name: 'mystorageaccount'
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

Resource Definition

JCL’s DD (Data Definition) statements outline the resources required for a job, including:

  • Storage allocations
  • Input/output devices
  • Dataset characteristics

Bicep performs a parallel function by defining:

  • Azure resources (such as VMs, storage accounts, and networks)
  • Resource configurations
  • Dependencies and relationships

JCL Dependencies:

//STEP1    EXEC PGM=CREATE
//FILE1    DD   DSN=NEW.FILE,DISP=(NEW,PASS)
//STEP2    EXEC PGM=PROCESS
//INPUT    DD   DSN=*.STEP1.FILE1,DISP=SHR

Bicep Dependencies:

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = {
  name: 'mystorageaccount'
  // ... other properties

Parameter Usage

Both languages incorporate parameterization:

  • JCL utilizes symbolic parameters and SET statements
  • Bicep employs parameters and variables to facilitate dynamic value assignment

JCL Parameter Example:

//MYJOB    JOB (ACCT),'MY NAME'
//         SET INFILE=DATA.SET.NAME
//STEP1    EXEC PGM=MYPROGRAM
//INPUT    DD   DSN=&INFILE,DISP=SHR

Bicep Parameter Example:

param location string = 'eastus'
param storageAccountName string

var storageSku = 'Standard_LRS'

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageSku
  }
}

Job/Deployment Flow Control

Both JCL and Bicep offer mechanisms to control execution:

  • JCL includes COND parameters and IF/THEN/ELSE statements
  • Bicep employs dependencies and conditional deployments

JCL Conditional Example:

//STEP1    EXEC PGM=PROG1
//IF (STEP1.RC = 0) THEN
//STEP2    EXEC PGM=PROG2
//ELSE
//STEP3    EXEC PGM=PROG3
//ENDIF

Bicep Conditional Example:

param deployHighAvailability bool = true

resource appServicePlan 'Microsoft.Web/serverfarms@2021-02-01' = {
  name: 'myAppServicePlan'
  location: location
  sku: {
    name: deployHighAvailability ? 'P1v2' : 'B1'
    tier: deployHighAvailability ? 'PremiumV2' : 'Basic'
  }
}

Modern Integration Example

The following example illustrates how a contemporary cloud deployment can be compared to a traditional mainframe batch job:

Traditional JCL Batch Job:

//BATJOB   JOB (ACCT),'BATCH PROCESS'
//STEP1    EXEC PGM=SORT
//SORTIN   DD   DSN=INPUT.FILE,DISP=SHR
//SORTOUT  DD   DSN=SORTED.FILE,
//         DISP=(NEW,CATLG),
//         SPACE=(CYL,(10,5))
//STEP2    EXEC PGM=PROCESS,
//         COND=(0,LT,STEP1)
//INPUT    DD   DSN=*.STEP1.SORTOUT,DISP=SHR
//OUTPUT   DD   SYSOUT=A

Equivalent Modern Bicep Deployment:

param location string = 'eastus'
param environmentName string

// Storage for input data
resource storage 'Microsoft.Storage/storageAccounts@2021-06-01' = {
  name: 'batchstorage${environmentName}'
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
}

// Batch account for processing
resource batchAccount 'Microsoft.Batch/batchAccounts@2021-06-01' = {
  name: 'batchaccount${environmentName}'
  location: location
  properties: {
    storageAccountId: storage.id
  }
}

// Function App for output processing
resource functionApp 'Microsoft.Web/sites@2021-02-01' = {
  name: 'processor${environmentName}'
  location: location
  kind: 'functionapp'
  properties: {
    siteConfig: {
      appSettings: [
        {
          name: 'BatchAccountName'
          value: batchAccount.name
        }
        {
          name: 'StorageConnection'
          value: storage.properties.primaryEndpoints.blob
        }
      ]
    }
  }
}

The Evolution Path

Mainframe Era (1960s-1980s)

  • JCL emerged as the primary method for defining jobs on mainframes
  • Introduced concepts of resource declaration and job scheduling
  • Established a precedent for separating resource definitions from application code

Client-Server Transition (1980s-1990s)

  • Shell scripts and batch files supplanted JCL in distributed systems
  • Maintained similar concepts, albeit with a less formal structure
  • Introduced more procedural methods for system configuration

Early Cloud Era (2000s)

  • Configuration management tools (e.g., Puppet, Chef) began to emerge
  • A resurgence of declarative methodologies
  • Introduction of idempotency concepts

Infrastructure as Code Evolution (2010s)

  • AWS CloudFormation pioneered the concept of cloud-native IaC
  • Terraform introduced a provider-agnostic approach to IaC
  • ARM (Azure Resource Manager) templates facilitated native Azure deployment

Modern Cloud-Native Era (2020s)

  • Bicep has emerged as a more user-friendly alternative to ARM templates
  • Synthesizes lessons learned from previous generations, including:
  • Declarative syntax from JCL
  • Modern programming paradigms
  • Cloud-native capabilities

Key Transformations

From Physical to Virtual

  • JCL: Managed physical resources (such as tapes, disks, and printers)
  • Bicep: Manages virtual resources (including VMs, containers, and services)

From Single System to Distributed

  • JCL: Primarily focused on a singular mainframe environment
  • Bicep: Manages distributed cloud resources across various regions

From Static to Dynamic

  • JCL: Operated within a relatively static environment, characterized by fixed resources
  • Bicep: Functions in a highly dynamic context, featuring auto-scaling and flexible resources


The transition from JCL to Bicep signifies not only a technological evolution but also a philosophical shift. The core principles established by JCL—declarative resource definition, separation of concerns, and structured resource management—have been retained and adapted in modern IaC tools such as Bicep. Despite the significant changes in technologies and capabilities, the fundamental approach to infrastructure definition remains remarkably consistent, underscoring the enduring importance of these core concepts in IT infrastructure management.


Posted

in

by