DEV Community

Julian Cook
Julian Cook

Posted on

Understanding Static and Dynamic Typing Through a Computer Ports Analogy

I had an idea to write this at 6 in the morning when I couldn't get back to sleep, hopefully it helps someone.

Examples are Typescript because of the ability to leave out types.


When learning programming languages, one concept that often confuses beginners is the difference between static and dynamic typing. To simplify this concept, let's use an analogy: a computer and its ports.

The Analogy: Computers and Ports

The Computer as a Function

Imagine a function in programming as a computer. Just like a computer processes data and performs tasks, a function takes inputs, processes them, and returns outputs.

Ports as Types

The ports on a computer (USB, HDMI, etc.) represent different data types. Each port is designed for a specific type of connection, much like how variables and functions expect data of specific types.

  • USB Port: Represents a USB type.
  • HDMI Port: Represents an HDMI type.
  • DVI Port: Represents a DVI type.

Static Typing

In a statically typed language, the ports are specifically designed for certain types of cables. You know in advance which port supports which type, ensuring that when you plug in a device, it will fit perfectly.

  • Predefined Types: The types are known at compile-time.
  • Type Checking: The compiler checks the types before the code runs.
  • Error Prevention: Type mismatches are caught early, reducing runtime errors.

Example:

function computer(ports: { usb: USB; dvi: DVI }): boolean {
    // Pretend there's logic here to turn on the computer
    return true;
}
Enter fullscreen mode Exit fullscreen mode

In this example, the computer function expects an object with usb and dvi properties of types USB and DVI, respectively.

Dynamic Typing

In a dynamically typed language, all the ports might look the same, like a universal port that could potentially accept any type of cable. However, you won't know if the cable actually fits and works until you try plugging it in and turning on the computer.

  • Flexible Types: The types are determined at runtime.
  • Runtime Checking: Type checks occur as the program runs.
  • Flexibility vs. Safety: Offers more flexibility but can lead to runtime errors if not managed carefully.

Example:

function computer(ports) {
    // Pretend there's logic here to turn on the computer
    return true;
}
Enter fullscreen mode Exit fullscreen mode

Here, the computer function accepts an object ports without predefined types, allowing for more flexibility but less type safety.

You won't know things work until the code runs that function!

Top comments (0)