100 Helloslanguages
Home / Languages / Chapel

Chapel

2009fraglet
systemsimperativeparallel.chpl
docker run --rm --platform="linux/amd64" 100hellos/chapel:latest

MCP + fragletc

MCPstdinargs
This language supports code execution via MCP and the fragletc CLI. Stdin piping and argument passing are both supported.
Install fragletc →

Chapel is a programming language designed for productive parallel computing at scale. Originally developed by Cray Inc. (now part of HPE), Chapel aims to make parallel programming as natural and expressive as writing serial code.

Language Overview

Chapel combines the best features of parallel computing frameworks with the elegance of high-level programming languages. It provides:

  • Built-in parallelism: Native support for data parallelism, task parallelism, and distributed computing
  • Global namespace: Variables and functions can be accessed across all compute nodes
  • Locality control: Fine-grained control over data placement and computation locality
  • Intuitive syntax: Clean, readable syntax that scales from laptops to supercomputers

About Our Implementation

Our "Hello World!" program showcases Chapel's sophisticated parallel computing capabilities while producing the simple greeting. The code demonstrates:

Parallel Data Structures

const CognitiveSpace = {1..2029, 1..7};
var awareness: [CognitiveSpace] real;

This creates a 2D domain representing 2029 cognitive nodes across 7 abstraction layers - a nod to both Chapel's distributed computing heritage and forward-thinking design.

Parallel Initialization

forall (node, layer) in CognitiveSpace do
    awareness[node, layer] = sin(node * 0.001 + layer * 0.314159) + threshold;

The forall loop executes in parallel across all elements, with each iteration potentially running on different processors or compute nodes. This is Chapel's way of making parallelism as natural as serial iteration.

Concurrent Task Execution

cobegin {
    // Task 1: Pattern recognition leads to "Hello"
    { /* parallel computation */ }

    // Task 2: Distributed learning produces "World!"
    { /* parallel computation */ }
}

The cobegin block spawns multiple tasks that execute concurrently, demonstrating Chapel's task parallelism capabilities.

Reduction Operations

var patterns = + reduce [i in 1..nodes] (if awareness[i, 1] > threshold then 1 else 0);

Chapel's reduction operations efficiently aggregate data across parallel computations, a fundamental operation in high-performance computing.

Language Features Highlighted

  • Domains and Arrays: Multi-dimensional distributed data structures
  • Forall loops: Parallel iteration with automatic work distribution
  • Cobegin blocks: Concurrent task spawning and synchronization
  • Reduction expressions: Parallel aggregation operations
  • Configuration constants: Runtime-configurable parameters
  • Mathematical libraries: Built-in support for complex computations

Interesting Facts

  • Chapel was specifically designed for exascale computing systems
  • The language supports both shared and distributed memory parallelism seamlessly
  • Chapel programs can scale from single-core laptops to supercomputers with thousands of nodes
  • It features a unique "locality model" that gives programmers control over data placement
  • Chapel's design was influenced by languages like Fortran, C, Python, and MATLAB

The Golden Ratio Connection

Our implementation uses the golden ratio (φ ≈ 0.618) as a threshold value, reflecting both mathematical elegance and Chapel's precision in numerical computing. This constant appears throughout nature and optimization algorithms, making it a fitting choice for a language designed to solve complex computational problems.

Beyond Hello World

Chapel excels at:

  • Scientific computing: Climate modeling, physics simulations, astronomical calculations
  • Data analytics: Processing massive datasets across distributed systems
  • Machine learning: Parallel training of neural networks and statistical models
  • Graph algorithms: Social network analysis, transportation optimization
  • Linear algebra: Matrix operations on distributed arrays

Try exploring Chapel's parallel features:

// Parallel matrix multiplication
var A, B, C: [1..n, 1..n] real;
forall (i, j) in {1..n, 1..n} do
    C[i, j] = + reduce [k in 1..n] A[i, k] * B[k, j];

Learn More

Chapel represents the future of parallel programming - making the complexity of distributed computing accessible through elegant, scalable language design.

Hello World

// BEGIN_FRAGLET
proc main() {
    writeln("Hello World!");
}
// END_FRAGLET

Coding Guide

Language Version

Chapel 2.5.0 (compiled from source with system LLVM)

Execution Model

  • Compiled language using chpl (Chapel compiler)
  • Code is compiled to a binary, then executed
  • Standard Chapel execution model with proc main() procedure

Key Characteristics

  • Statically typed with type inference
  • Case-sensitive
  • Requires explicit compilation step
  • Designed for parallel and distributed computing
  • Supports both shared and distributed memory parallelism
  • Uses domains and arrays for data structures

Fragment Authoring

Write valid Chapel code. Your fragment becomes the module body. This means:

  • You must include proc main() { ... } in your fragment
  • You CAN define procedures, functions, and other module-level constructs
  • Procedures and functions are defined at module level, then called from main()

This approach enables teaching the full range of Chapel features, including procedure definitions and parallel computing patterns.

Available Modules

Standard Chapel modules are available:

  • IO - Input/output operations (writeln, read, etc.)
  • Math - Mathematical operations (sin, cos, sqrt, etc.)
  • Random - Random number generationa
  • Time - Time operations
  • List - List data structures
  • Map - Map/dictionary data structures
  • Set - Set data structures

Common Patterns

  • Output: writeln("message");
  • Variables: var x = 10; or var x: int = 10;
  • Procedures: proc name() { ... } (define at module level)
  • Functions: proc add(a: int, b: int): int { return a + b; } (define at module level)
  • Arrays: var arr: [1..10] int;
  • Domains: const D = {1..10, 1..5};
  • Parallel loops: forall i in 1..10 do writeln(i);
  • Concurrent tasks: cobegin { task1(); task2(); }
  • Reductions: var sum = + reduce [i in 1..10] i;

Examples

// Simple output
proc main() {
    writeln("Hello from fragment!");
}

// Variables and calculations
proc main() {
    var a = 5;
    var b = 10;
    writeln("Sum: ", a + b);
}

// Procedure definition (at module level)
proc greet(name: string) {
    writeln("Hello, ", name, "!");
}

proc main() {
    greet("Alice");
}

// Parallel iteration
proc main() {
    forall i in 1..5 do
        writeln("Count: ", i);
}

// Arrays and reductions
proc main() {
    var numbers: [1..5] int = [1, 2, 3, 4, 5];
    var sum = + reduce numbers;
    writeln("Array sum: ", sum);
}

// Concurrent tasks
proc main() {
    cobegin {
        writeln("Task 1");
        writeln("Task 2");
    }
}

// Domain and array operations
proc main() {
    const D = {1..3, 1..3};
    var matrix: [D] int;
    forall (i, j) in D do
        matrix[i, j] = i * j;
    writeln("Matrix[2,2] = ", matrix[2, 2]);
}

// Multiple helper procedures
proc add(a: int, b: int): int {
    return a + b;
}

proc multiply(a: int, b: int): int {
    return a * b;
}

proc main() {
    writeln("5 + 3 = ", add(5, 3));
    writeln("5 * 3 = ", multiply(5, 3));
}

Caveats

  • Fragment must include proc main() { ... }
  • Code must be valid Chapel code that compiles
  • Chapel is case-sensitive
  • Type inference is available but explicit types can be specified
  • Parallel constructs (forall, cobegin) may execute in any order
  • The code is compiled fresh each time, so compilation errors will fail execution
  • Chapel uses writeln() for output (not print())
  • String concatenation uses , operator in writeln (or + for string concatenation)
  • Arrays are indexed with [i] syntax
  • Domains define the shape and size of arrays

Fraglet Scripts

Echo Args

#!/usr/bin/env -S fragletc --vein=chapel
proc main(args: [] string) {
    writeln("Args: ", " ".join(args[1..]));
}

Stdin Upper

#!/usr/bin/env -S fragletc --vein=chapel
use IO;
proc main() {
    var line: string;
    while stdin.readLine(line) {
        write(line.toUpper());
    }
}

Test

#!/usr/bin/env -S fragletc --vein=chapel
proc main() {
    writeln("Hello World!");
}

Connections

Container Info

image100hellos/chapel:latest
build scheduleThursday
fragletenabled