Skip to content

Crosswalk — where each idea lives in the sibling libraries

Level: 101 · for anyone who met an idea in another language first

One line: The same question often has a page in a sibling library already — UTF-16 in Encodings, the JavaScript column in Regex, the event loop in Concurrency, doubles in Math — and this page lists every link the pages here make into them, grouped by library.

Each row is a link that a page in this library makes under See also or In other languages. The sibling page answers the same question in its own language, or the question underneath it; the page here says what JavaScript or TypeScript does differently. The table is generated from the pages themselves by tools/check_pages.py --fix, so a link added to a page appears here on the next run.

355 links from 191 pages into 15 sibling libraries.

Encodings

The Encodings library ↗

Page here Sibling page Why
Which features your Node has The table has a version ↗ each runtime carries its own Unicode version, Node included
Eight types The shell has no string type ↗ the shell has one type where JavaScript has eight
BigInt Arithmetic has its own width ↗ 255 << 2 becomes 252 when C stores it back in a byte; BigInt.asUintN(8, 255n << 2n) is that store, written out.
JSON UTF-16 and surrogates ↗ where the lone surrogates that stringify escapes come from
Typed arrays and ArrayBuffer The bytes do not say which end ↗ bytes never record which end is the big one
Typed arrays and ArrayBuffer Arithmetic has its own width ↗ where a value wraps when it is stored back into a byte
Strings are UTF-16 UTF-16 and surrogates ↗ the surrogate arithmetic worked by hand, and why Unicode stops at U+10FFFF
Strings are UTF-16 Why UTF-16 stayed ↗ why JavaScript strings are UTF-16 at all
Code points Unicode code points ↗ reading a U+ number as an address
Graphemes A code point is not a character ↗ five rulers laid along one string, all correct
Normalization Normalization ↗ the four forms, run in Python
Normalization The check that ran too early ↗ the security bug of checking a string before normalizing it
Comparing and sorting strings Sorting and collation ↗ collation's three levels, and why the locale decides the order
Strings and bytes Encode and decode are verbs ↗ which direction is encoding and which is decoding
Strings and bytes OsStr, Path, and WTF-8 ↗ the WTF-8 encoding, which does keep lone surrogates
Case conversion Case is not a per-character operation ↗ why case mapping cannot be done one letter at a time
Bitwise operators Arithmetic has its own width ↗ 255 << 2 in five languages, and where each one wraps
Unicode mode UTF-16 and surrogates ↗ the surrogate pairs that . splits without u
Paths and file URLs Terminal hyperlinks, and the URI that is not one ↗ a file:// URI encodes the space as %20 there too
Buffer Encode and decode are verbs ↗ encode and decode, the two directions Buffer covers
Buffer Binary to text ↗ base64 and hex, which toString also writes
Template literal types UTF-16 and surrogates ↗ the surrogate pairs TypeScript 7 no longer splits during inference
Run-time validation Validation is a boundary ↗ the UTF-8 version: check at the door, and let the type remember

Regex

The Regex library ↗

Page here Sibling page Why
Graphemes \X — one character as a person counts it ↗ \X, the regex token for one grapheme, which JavaScript lacks
Blocking the event loop Catastrophic backtracking, with no backreference anywhere ↗ a regex that can block the loop for seconds
Regex literals and flags Flags, and where you can turn one on ↗ the same flag letters compared across eight engines
Regex literals and flags (?i), (?m), (?s), (?x), (?-i) ↗ inline flags in other engines; JavaScript's (?i:…) arrived later, in ES2025
The g flag and lastIndex \G — where the last match ended ↗ \G, how other engines continue where the last match ended
match, matchAll and exec Extracting fields ↗ capturing groups for extraction, in every engine
Named groups and replacements $1, \1, ${name}, $& ↗ the replacement language in eight engines
Named groups and replacements (?<name>…), (?P<name>…), (?'name'…) ↗ named-group syntax across engines, and the spellings JavaScript refuses
Unicode mode . — any character, except the ones it is not ↗ what . matches in eight engines, emoji included
Unicode mode \p{…} — a character by what it is, not what it looks like ↗ \p{…} across engines, and JavaScript without u
Lookbehind (?<=…) and (?<!…) — assert what precedes, and how wide that may be ↗ lookbehind width rules in eight engines, JavaScript's the loosest
Lookbehind Lookahead and lookbehind ↗ lookaround as a whole, with a JavaScript column
RegExp.escape \Q…\E ↗ \Q…\E, and every language's escape function
RegExp.escape Escaping and literal text ↗ which characters need a backslash, engine by engine
Run-time validation Validating input ↗ checking a string field's format, the regex part of validation

Concurrency

The Concurrency library ↗

Page here Sibling page Why
const is not frozen Immutability ↗ why data that truly cannot change is safe to share
Higher-order functions Where does a callback keep its state? ↗ where a callback keeps the state it needs, across languages
freeze, seal and preventExtensions Immutability ↗ why data nobody can change is safe to share between threads
Generators Coroutine ↗ a generator is a coroutine that yields values to its caller
Generators Async functions as state machines ↗ the same pause-and-resume machinery under async functions
Async iteration How does a loop await a sequence of values that arrive over time? ↗ a loop over values that arrive over time, in other languages
finally Who unlocks when the function returns early? ↗ releasing a lock on every exit path, across languages
Unhandled errors What happens to a task that is started and never awaited? ↗ a task started and never awaited, in other runtimes
Unhandled errors What does a failure on a thread do when nobody is waiting for it? ↗ a failure on a thread nobody waits for
Run to completion Is total += n safe on two threads? ↗ total += n on two threads, the race this rules out
Run to completion Cooperative scheduling ↗ a task runs until it gives up the thread
The event loop What does an event loop do all day? ↗ an event loop written out in thirty lines
The event loop How does one thread watch a thousand sockets? ↗ how one thread waits on a thousand sockets
The event loop Event loop ↗ the event loop as a scheduling idea
Microtasks and tasks Starvation ↗ starvation: work that never gets its turn
Microtasks and tasks Event loop ↗ the event loop as a scheduling idea
Callbacks Where does a callback keep its state? ↗ where a callback keeps its state between calls
Callbacks Callback ↗ the callback as a concurrency idea
Promises What is a future before it has a value? ↗ a value not there yet, across languages
async and await What happens at an await? ↗ what happens at an await, in several languages
async and await Why can't a normal function call an async one? ↗ why a normal function cannot await
Sequential or parallel Join ↗ join: waiting for several tasks at once
Sequential or parallel I/O-bound and CPU-bound work ↗ why overlapping waits helps only I/O-bound work
all, allSettled, race and any What happens to the work when an await times out? ↗ what happens to the work when an await times out
Timers Timers and tickers ↗ timers and tickers across languages
Cancellation How is a running task told to stop, and does it? ↗ how other runtimes tell a task to stop
Blocking the event loop What does one blocking call do to every other task? ↗ one blocking call and every other task, in other runtimes
using and Symbol.dispose Scoped locking ↗ scoped cleanup applied to locks, across languages
Reachability Object lifetime ↗ who guarantees an object's lifetime, language by language
Memory leaks Leaked tasks ↗ leaked tasks, the concurrent form of a memory leak
Streams Backpressure ↗ backpressure as a concept, across languages
Streams What stops a fast producer from filling memory? ↗ a bounded queue pushing back on a fast producer
EventEmitter How does one event reach every subscriber? ↗ one event reaching every subscriber, in other languages
EventEmitter Event-driven programming ↗ event-driven programming as a model
The built-in test runner How does a test wait an hour in a millisecond? ↗ virtual time in tests, across languages
One thread per agent Why do Python threads take turns? ↗ why Python threads take turns
One thread per agent Who runs an async task, and on how many threads? ↗ who runs async tasks, and on how many threads
Worker threads How much faster is real work on eight threads? ↗ real speedup on eight threads, measured
Worker threads How many workers should a pool have? ↗ how many workers a pool should have
postMessage Who owns a value after it has been sent? ↗ who owns a value after it has been sent
postMessage What may be handed to another thread? ↗ what may be handed to another thread, across languages
SharedArrayBuffer and Atomics Is total += n safe on two threads? ↗ the same lost update in other languages
SharedArrayBuffer and Atomics Data race ↗ what a data race is
Child processes How does a parent learn how its child ended? ↗ how a parent learns how its child ended, across languages
Child processes When are processes the better workers? ↗ when processes are the better workers
DOM events How does one event reach every subscriber? ↗ one event reaching many listeners, in other languages
The rendering loop Why may only one thread touch the user interface? ↗ why only one thread may touch the user interface
The rendering loop UI thread ↗ the UI thread as a concept

Math

The Math library ↗

Page here Sibling page Why
Every number is a double Machine numbers ↗ the finite set of numbers a float can be, and its rounding
Rounding and formatting Significant figures ↗ the rule for how many digits a result deserves

Java text

The Java text library ↗

Page here Sibling page Why
Running a file with Node Source-file mode ↗ a single Java source file runs with no build step either
The + operator + is not StringBuilder ↗ what Java's string + compiles to
Strings are UTF-16 A char is not a character ↗ in Java, char has the same 16-bit limit and the same half characters
Code points Length is three different numbers ↗ the three lengths in Java: code units, code points and graphemes
Normalization Normalization and equality ↗ in Java, equals has the same blind spot
Strings and bytes Malformed input has two policies ↗ the two policies Java offers for bad input: replace or report
String methods Reverse and substring cut characters in half ↗ in Java, substring cuts surrogate pairs the same way
Case conversion Case is locale-sensitive ↗ the Turkish i problem in Java, from the default-locale side
Formatting dates Format follows the locale ↗ the same locale dependence in Java's formatted numbers
Files The BOM is not stripped ↗ the same mark kept by a Java reader

Python

The Python library ↗

Page here Sibling page Why
Running a file with Node -c is not the prompt ↗ python3 -c is silent too, until you print
BigInt Comparing an int with a float ↗ in Python too, mixed numbers compare by exact value, so 2**53 + 1 == float(2**53 + 1) is False for the reason the comparison above is false.
Values and references bytearray is the mutable one ↗ Python names are references too, and += on a bytearray changes the shared object in place, where u += "!" here built a new string.
Lints around values and types Float equality and NaN ↗ nan == nan is False in Python too, and math.isnan is the test; but a list checks identity before ==, so [math.nan] == [math.nan] is True.
=== and == Comparing an int with a float ↗ in Python, an int and a float compare without either converting
Object.is, NaN and -0 Float equality and NaN ↗ in Python, containers also find NaN, by checking identity first
< and > Sorting is not comparing ↗ code-point order is not alphabetical in Python either
sort() compares strings Sorting is not comparing ↗ the same code-point sort in Python, and the Polish names it misorders
Graphemes Counting characters ↗ the four answers Python gives to how long a string is
Template literals String literals ↗ the f-strings of Python, and its other literal prefixes
Comparing and sorting strings Sorting is not comparing ↗ the Polish names a code-point sort misorders in Python
String methods strip is a set, not a prefix ↗ in Python, strip takes a set of characters, not a prefix
String methods Slicing is not indexing ↗ in Python, slices forgive bad bounds where indexes do not
Case conversion Lowercasing is not folding ↗ the casefold of Python, which JavaScript has no equivalent of
Safe integers Comparing an int with a float ↗ in Python, a big int and a float compare exactly
NaN, Infinity and -0 Float equality and NaN ↗ the same IEEE 754 NaN, compared in Python
package.json pyproject.toml ↗ the Python counterpart: one declarative project file
match, matchAll and exec Four ways to find it, and four ways to fail ↗ four ways to find a substring in Python, and how each fails
Files Opening a file ↗ the same choice between text and bytes in Python
stdin, stdout and pipes Standard in, standard out, and pipes ↗ the same pipes from Python
Buffer bytearray is the mutable one ↗ the mutable byte type in Python, beside immutable bytes
tsc and tsconfig.json pyproject.toml ↗ the Python project file that plays the same part
npm pyproject.toml ↗ the project file in Python

Rust

The Rust library ↗

Page here Sibling page Why
The language and the host core, alloc and std ↗ the same line drawn in Rust, between core and std
Strict mode Strict clippy: denying the panic, and the arithmetic that comes with it ↗ opt-in strictness in Rust turns runtime aborts into compile errors
Automatic semicolon insertion A block is an expression ↗ in Rust, one semicolon changes what a block returns
ECMAScript versions RFC 1054 — the method that renamed itself to promise less ↗ how a change reaches Rust's standard library through an RFC
Which features your Node has MSRV: the oldest compiler you promise to support ↗ the oldest compiler a Rust crate promises to support
Which features your Node has rustup: the rustc you run is not the compiler ↗ the compiler on your PATH may not be the one you think
Eight types The integer types ↗ twelve integer types in Rust, where JavaScript has two numeric types
null and undefined Partial functions: why Option exists ↗ in Rust a function with no answer for some inputs returns an Option, so "no answer" is one of its answers and the caller has to handle it.
null and undefined Null dereference ↗ what null costs in C, and what Rust uses instead.
null and undefined Six kinds of zero ↗ where JavaScript has two kinds of missing, Rust lets you declare as many as the problem has.
Primitives and wrappers Extension traits ↗ Rust puts a new method behind the dot on str with a trait you declare and import, not by adding it to a prototype that every string shares.
BigInt Big integers: BigInt and Python's int ↗ big integers in Rust and Python, side by side: Rust's num::BigInt truncates like a JavaScript BigInt, where Python's // floors.
Values and references Rc: the clone that copies a pointer ↗ Rc::clone copies a pointer, as JavaScript assignment does.
Values and references Copy or move? Swap the value, keep the program ↗ in Rust the type decides between copy and move.
Errors around values and types Some and None: reading an Option ↗ in Rust a value that may be missing has the type Option, and a match that leaves out the None case does not compile (E0004): the check tsc makes in entry 14, made by the compiler on every such value.
Errors around values and types unwrap is a TODO you forgot to remove ↗ Rust's way to skip that check is unwrap(), which panics on None at run time, much as entry 3's [0] throws on null.
Lints around values and types What a float stores ↗ the compiler itself has use-isnan's check: rustc's invalid_nan_comparisons lint fires on x == f64::NAN and points to x.is_nan().
Lints around values and types Lints around references ↗ the same kind of page for rustc and clippy: twenty-five warnings around references and pointers, and six mistakes no lint catches.
Lints around values and types Clippy: the groups, the settings, the commands ↗ clippy's lints come in groups whose levels are set in Cargo.toml; ESLint's core rules are switched on one at a time, as --rule does here.
=== and == Comparing two numbers of different types ↗ in Rust, two number types cannot be compared until you convert one
Truthy and falsy Meet the bool ↗ in Rust there is no truthiness at all
The + operator Concatenating strings ↗ in Rust, + takes only an owned String and a &str
ToPrimitive Debug and Display ↗ in Rust, two text forms, and only one is generated for you
< and > Comparing and sorting text ↗ in Rust, strings compare as UTF-8 bytes, which is code-point order
var, let and const Scope is about names, not values ↗ in Rust too, a name's scope ends at the closing brace
var, let and const const and static ↗ in Rust, const is a value substituted at compile time
const is not frozen Interior mutability ↗ a Rust binding without mut freezes the value, except through interior mutability
Hoisting and the temporal dead zone Uninitialized reads ↗ where JavaScript throws, C reads garbage and Rust refuses to compile
Closures What a closure is ↗ a Rust closure is a struct holding what it captured
Closures The move keyword ↗ in Rust you choose whether a closure borrows or moves
Closures in loops The move keyword ↗ a Rust closure made in a loop moves or borrows that turn's value
Destructuring Destructuring structs ↗ struct patterns in Rust name the fields you want
Destructuring Irrefutable patterns ↗ which patterns a Rust let accepts, and why
Destructuring let else ↗ a pattern that may fail, with an else to handle it
Declarations, expressions and arrows Functions ↗ how Rust writes a function: every type spelled out, the last expression returned
this impl blocks ↗ how Rust avoids the question: self is a parameter the method declares
Arrow functions What a closure is ↗ how a Rust closure captures what it sees where it was written
call, apply and bind impl blocks ↗ how Rust treats a method: an associated function whose first parameter is self
Parameters Optional function arguments ↗ how Rust copes with no default parameters at all
Functions are objects Function pointers ↗ how Rust holds a function: eight bytes of code address, no properties
Higher-order functions Iterators are lazy ↗ how Rust's map differs: a lazy adapter, where an array's map runs at once
Recursion and the call stack Recursion and the size of the stack ↗ how Rust ends an overflow: the process aborts, nothing to catch
Recursion and the call stack The call stack: what a call does to memory ↗ what one call does to stack memory, measured in Rust
Object literals A type is not a constructor ↗ how Rust's struct literal differs: it names a declared type
Property keys HashMap ↗ how a Rust HashMap orders keys: differently on every run
Getters and setters Naming conventions ↗ how Rust does without properties: a getter is a method, named without get_
Copying objects Copy vs Clone ↗ how Rust makes copy versus clone a property of the type
Copying objects What a clone costs ↗ what a deep copy costs, counted in allocations, in Rust
?. and ?? The ? operator ↗ how Rust's ? stops early: by returning from the whole function
?. and ?? unwrap_or: the default you already have ↗ how Rust supplies a fallback for a missing value
JSON The round trip ↗ the round-trip test that catches what serialization drops
The prototype chain Method resolution ↗ how Rust's dot searches instead: at compile time, through derefs
Classes A type is not a constructor ↗ how Rust differs: a type is not callable, the class here is
Classes impl blocks ↗ how Rust keeps methods apart from data, in impl blocks
new A type is not a constructor ↗ how Rust builds values without new: Type::new is an ordinary function
Private fields Modules and visibility ↗ how Rust draws the privacy wall: around a module, not a class
Static members and static blocks impl blocks ↗ how Rust spells a static method: an associated function called on the type
extends and super Supertraits ↗ how Rust does without inheritance: a supertrait is a requirement, not a parent
extends and super What a trait is ↗ how Rust shares behaviour between types with traits
Arrays Array or Vec? ↗ in Rust, fixed arrays and growable Vec are separate types; JavaScript has one
sort() compares strings slice::sort_by ↗ in Rust, numbers sort numerically and a closure is needed only for other orders
Mutating and copying methods slice::sort ↗ in Rust, sort also works in place, and returns nothing
map, filter, reduce and friends Iterators are lazy ↗ in Rust, map computes nothing until consumed; an array's map runs at once
map, filter, reduce and friends fold and reduce ↗ in Rust, fold takes the initial value and reduce returns an Option
Map and Set HashMap ↗ in Rust, HashMap iterates in a different order on every run
Map and Set BTreeMap and BTreeSet ↗ BTreeMap iterates in key order, a third choice
WeakMap and WeakSet Rc: the clone that copies a pointer ↗ in Rust, Weak also points at a value without keeping it alive
Grouping and set operations HashSet ↗ the four set operations of a Rust HashSet
Code points Walking a String ↗ in Rust, a string is walked by char, which is a code point
Template literals The format mini-language ↗ in Rust, formatting uses a mini-language instead of interpolated expressions
Comparing and sorting strings Comparing and sorting text ↗ in Rust, strings compare byte by byte and collation needs a crate
Every number is a double What a float actually stores ↗ the same 0.1, printed to thirty digits in Rust
Safe integers Big integers: BigInt and Python's int ↗ the u128 ceiling in Rust, and the Python int that has none
Parsing numbers Parsing out of a string ↗ in Rust, parse returns a Result where JavaScript returns NaN
Rounding and formatting Making a float whole ↗ floor, ceil, trunc and round in Rust, on negatives and halves
Bitwise operators Bit flags ↗ masks and shifts on fixed-width integers in Rust
Random numbers Randomness: std has none ↗ in Rust, the standard library ships no random generator at all
Money Decimals: rust_decimal, bigdecimal and Python's Decimal ↗ decimal types in Rust and Python, and integer cents
Money Scale the denominator away ↗ scaling the denominator away, then summing in plain integers
if, switch and ? : match expressions ↗ the Rust match, which must cover every case and never falls through
if, switch and ? : if expressions ↗ in Rust if is an expression, so there is no ? :
Loops Loop labels ↗ the same labelled break, spelled 'outer in Rust
Loops break ↗ in Rust break can carry a value out of a loop
Short-circuit evaluation Meet the bool ↗ in Rust && and || take and return only bool
for...in and for...of for loops ↗ the Rust for, which has only the value-walking kind
The iteration protocol Implementing Iterator ↗ the Rust protocol: one next returning an Option
Iterator helpers Iterators are lazy ↗ the Rust iterator adapters, lazy in the same way
Iterator helpers Adapters by job ↗ the Rust adapters, grouped by what each is for
Async iteration Iterator versus Stream ↗ Stream, the async counterpart of Iterator in Rust
throw and try...catch What makes a type an error ↗ what Rust requires of a type before calling it an error
throw and try...catch The ? operator ↗ in Rust errors are returned as values, not thrown
finally Drop, and what RAII buys ↗ cleanup by scope instead, with Rust's Drop
Custom errors and cause anyhow and context ↗ adding context to an error in Rust while keeping the source
Custom errors and cause thiserror vs anyhow ↗ the two ways Rust defines and wraps error types
Stack traces Reading a backtrace ↗ the Rust counterpart, printed when a program panics
Promises What a future is ↗ a Rust future does nothing until polled; a promise starts at once
async and await async fn and .await ↗ the same keywords in Rust, where nothing runs until awaited
ES modules and CommonJS Packages and crates ↗ the unit Rust builds: a Cargo package and its crates, not a file
ES modules and CommonJS One module per file ↗ how Rust maps files to modules, with a single system
import and export Bringing names in with use ↗ the Rust counterpart: use binds a name, checked at compile time
import and export Modules and visibility ↗ the Rust default: nothing leaves a module unless marked pub
Dynamic import() and top-level await Conditional compilation ↗ the compile-time alternative: Rust decides which code exists before it runs
package.json Packages and crates ↗ what a Cargo package contains and what it exposes
require and ES modules Two versions of one crate in one binary: what "SemVer compatible" means to Cargo ↗ the Cargo version of one library loaded twice in one program
Temporal An Instant is not a SystemTime ↗ the same split in Rust: an instant is not a calendar time
Measuring elapsed time Two clocks: Instant and SystemTime ↗ the same two kinds of clock in Rust, and which can be set
Well-known symbols Implementing Iterator ↗ the Rust counterpart of Symbol.iterator: the Iterator trait
Tagged templates Why println! is a macro ↗ the compile-time alternative: Rust checks its format string before running
Decorators What an attribute is ↗ attribute syntax in Rust, expanded at compile time
using and Symbol.dispose Drop, and what RAII buys ↗ the Rust version: Drop runs at the end of scope, no keyword needed
using and Symbol.dispose Drop guards ↗ a value whose only job is cleanup on every exit
Reachability Rc: the clone that copies a pointer ↗ counting owners instead of tracing from roots: Rust's Rc
WeakRef and FinalizationRegistry Drop, and what RAII buys ↗ a destructor that runs at a known point, unlike a finalizer
Measuring memory The global allocator ↗ counting heap bytes in Rust with a replacement allocator
Measuring memory Stack and heap ↗ where Rust puts values, with no collector at all
process Arguments and the environment ↗ arguments and the environment in Rust
process Standard error, and exit status ↗ standard error and the exit status in Rust
Paths and file URLs Path and PathBuf ↗ paths as their own type, in Rust
stdin, stdout and pipes Broken pipe ↗ what a closed pipe does to a Rust program
Streams Backpressure ↗ backpressure in a Tokio server
HTTP An HTTP request ↗ the same request from Rust
HTTP Mocking a server ↗ a local server standing in for the real one
The built-in test runner How cargo test runs your tests ↗ how cargo test finds and runs tests
The built-in test runner cargo-nextest: one process per test, and what that actually buys ↗ one process per test, beside Node's one per file
One thread per agent Concurrency or parallelism ↗ the same distinction, drawn in Rust
Worker threads Spawning a thread ↗ spawning a thread in Rust
postMessage Ownership and moves ↗ a move in Rust, checked at compile time instead
The DOM Rust in the browser ↗ how Rust reaches the DOM: only through JavaScript glue
fetch and CORS An HTTP request ↗ an HTTP client outside the browser, where CORS never applies
Loading scripts Shipping a wasm page ↗ a module that also needs the right MIME type
What TypeScript adds What a compiler does before your program runs ↗ rustc also rejects code before it runs, and its types reach the machine code
Running TypeScript Compiled, interpreted, or something between ↗ when a toolchain compiles, and what runs afterwards
tsc and tsconfig.json What cargo run -v shows: the rustc line, flag by flag ↗ a project file turned into compiler flags, printed by Cargo
strict Strict clippy: denying the panic, and the arithmetic that comes with it ↗ the same trade in Rust: stricter settings, more errors, fewer crashes
Annotations and inference Type inference ↗ in Rust, inference also uses later lines; TypeScript uses the initialiser
Annotations and inference What a type annotation does ↗ an annotation as an input to inference, in Rust
TypeScript 7 rustup: the rustc you run is not the compiler ↗ another command on PATH that only stands in for the compiler
TypeScript 7 Pinning the toolchain: which compiler verified the answer keys? ↗ pinning the compiler that verified the answer keys, in Rust
Arrays and tuples Tuples ↗ a Rust tuple really does have a fixed length
Arrays and tuples Array or Vec? ↗ fixed-size array or growable Vec, the choice TypeScript blurs
Object types Option fields: modelling what may be absent ↗ how Rust marks a field that may be missing
Union and intersection types What a union is ↗ a Rust union is untagged memory, a different thing with the same name
Union and intersection types Variants that carry data ↗ a Rust enum adds possibilities the way a union type does
Type aliases and interfaces A type alias is not a new type ↗ in Rust too, type gives a second name, not a new type
Type aliases and interfaces What a trait is ↗ a Rust trait names behaviour where an interface names a shape
Function types Optional function arguments ↗ no optional parameters and no overloading in Rust, and what replaces them
strictNullChecks Partial functions: why Option exists ↗ why Rust's find returns an Option instead
strictNullChecks Null dereference ↗ the same crash in C, and Rust's separate type for absence
any, unknown and never The never type ! ↗ the Rust type of an expression that never finishes
Enums What an enum is ↗ a Rust enum is a closed type that match must cover
Enums An enum instead of a bool ↗ named states instead of a bare flag, in Rust
Narrowing if let: one arm, and move on ↗ narrowing by pattern instead of by test, with Rust's if let
Truthiness narrowing Meet the bool ↗ no truthiness in Rust: if count does not compile
Truthiness narrowing Six kinds of zero ↗ keeping zero and missing apart as different values, in Rust
Discriminated unions Variants that carry data ↗ the same idea built into Rust as enum variants
Discriminated unions Destructuring enums ↗ taking a tagged value apart with a pattern, in Rust
Exhaustiveness checking match expressions ↗ a match in Rust must cover every case with no helper
Exhaustiveness checking The wildcard _ ↗ the catch-all arm that switches Rust's check off
Type predicates expect: writing down the proof ↗ a claim the compiler cannot check, written down, in Rust
satisfies, as and annotations Casting with as ↗ an as in Rust converts the value; TypeScript's converts nothing
Structural typing What a trait is ↗ traits in Rust are nominal: a type fits only after an impl
Excess property checks When a struct refuses ↗ a Rust struct literal refuses an unknown field every time
Branded types A score is not a number: the newtype ↗ the Rust newtype, which gives the same safety as a real type
Branded types Phantom types ↗ a zero-byte type tag in Rust, the closest match to a brand
Variance When the type checker is wrong ↗ what soundness means, from a checker that promises it
Generic functions What a generic is ↗ each Rust instantiation gets its own copy; TypeScript erases T entirely
Constraints Where the bound goes ↗ a trait bound, Rust's constraint, and where it belongs
Generic types Generic enums ↗ generic enums in Rust, where Option is ordinary library code
const type parameters Const generics ↗ a different idea with a similar name: Rust's const generic takes a value
When inference guesses wrong When the compiler cannot infer ↗ rustc's E0282: the same gap, reported as an error instead of unknown
Recursive types A generic recursive type ↗ in Rust a Box must break the cycle; a type alias needs nothing
private versus #private Modules and visibility ↗ privacy in Rust, also compile-time, but drawn around modules
abstract and implements What a trait is ↗ a Rust type meets a trait only through an impl; implements is optional
readonly and override Borrowing: &T, &mut T, and where a borrow ends ↗ a Rust shared borrow forbids writes through every path, not one name
Declaration files Generating bindings ↗ declarations of C code for Rust, generated because hand-written ones drift
Declaration merging Extension traits ↗ the Rust way to add a method to a foreign type, with code behind it
any is contagious What unsafe turns off ↗ the Rust contrast: unsafe lifts five checks in one block; any spreads
Type assertions Casting with as ↗ the Rust as converts the value; TypeScript's as converts only the type
Type assertions mem::transmute ↗ the nearest Rust match to as unknown as T, checking only size
Index access Partial functions: why Option exists ↗ in Rust get returns Option, so the missing element is in the type
External data Deriving Serialize and Deserialize ↗ serde checks the shape while it parses; JSON.parse checks nothing
Run-time validation Validating at the boundary ↗ the same rule at Rust's C boundary: validate first, then trust
Array covariance When the type checker is wrong ↗ soundness defined: in rustc a hole is a bug, here it is a choice
npm Adding a dependency: search, info, add ↗ the caret in Cargo, which follows the same rule below 1.0
npm Cargo.lock: what it records, who reads it, and the command that ignores it ↗ the lockfile in Cargo, and the command that ignores it
npm run and npx Cargo subcommands worth knowing ↗ subcommands in Cargo, the nearest thing to npm scripts
Editor setup Zed for Rust: one key to save and run, and three defaults in its way ↗ the same editor, set up for Rust
Editor setup Choosing an editor for Rust ↗ choosing an editor for Rust
ESLint Strict clippy: denying the panic, and the arithmetic that comes with it ↗ clippy, Rust's linter, set to deny
Prettier Formatting: rustfmt, and the formatter your IDE swaps in behind it ↗ rustfmt, and the formatter an IDE swaps in
Bundlers and transpilers A build system is not a compiler ↗ a build system is not a compiler
Bundlers and transpilers What a compiler does before your program runs ↗ what a compiler does before your program runs

Go

The Go library ↗

Page here Sibling page Why
Unhandled errors A panic ends the whole program ↗ an unrecovered panic in Go also ends the whole program
all, allSettled, race and any The first error cancels the rest ↗ the errgroup in Go cancels the rest; Promise.all does not
Timers A timeout is a channel ↗ in Go a timer is a channel you receive from
Cancellation One cancel reaches every goroutine ↗ the context cancel in Go, the closest relative
Memory leaks A leaked goroutine never ends ↗ the Go version: a goroutine blocked for ever, holding its memory
SharedArrayBuffer and Atomics Atomic counters ↗ atomic counters in Go

C

The C library ↗

Page here Sibling page Why
BigInt Comparing signed and unsigned ↗ C converts both sides of a mixed comparison to one type first, so -1 < 1u is false; JavaScript compares a BigInt with a Number without converting either.
=== and == Comparing signed and unsigned ↗ the same convert-then-compare trap in C, signed against unsigned
Converting on purpose Parsing a number from text ↗ three C parsers that fail in three different ways
Typed arrays and ArrayBuffer Byte order on the wire ↗ network byte order, the big-endian that DataView uses by default
NaN, Infinity and -0 A float exception is a flag ↗ the status flag C can read when an operation makes a NaN
Parsing numbers Parsing a number from text ↗ the atoi, sscanf and strtol of C, which fail three different ways
Bitwise operators Comparing signed and unsigned ↗ signed against unsigned, the difference >>> exposes
Tagged templates A format string is a program ↗ a C format string, also a little program run over the values
eval and new Function A format string is a program ↗ another place where a string from outside becomes a program
Types are erased What the decompiler recovers ↗ compiled C loses its names and structs the way TypeScript loses its types
Debugging Node What the debugger records ↗ what a native debugger records, in C

C++

The C++ library ↗

Page here Sibling page Why
Temporal A time point knows its clock ↗ the C++ way: the clock is part of the time point's type
Measuring elapsed time Three clocks, and the one in the trenchcoat ↗ three clocks in C++, one of which can be set back
Measuring elapsed time The cost of asking the time ↗ what reading a clock itself costs

Linux

The Linux library ↗

Page here Sibling page Why
process grep exits 0, 1 or 2 ↗ a tool whose exit status means three different things
Paths and file URLs What a dot means to the shell ↗ . and .. as entries every directory lists
stdin, stdout and pipes A program knows it is piped ↗ ls asking the same question as isTTY
Child processes The signals you cannot catch ↗ the signals no handler can catch

Cryptography

The Cryptography library ↗

Page here Sibling page Why
Random numbers random is not secrets ↗ the same split in Python: random against secrets

Perl

The Perl library ↗

Page here Sibling page Why
Running a file with Node -n and -p are a loop ↗ in Perl, -p means a loop, not print the value
The + operator Numbers from text ↗ in Perl, + always means numbers, even between strings
< and > sort is not alphabetical ↗ in Perl too, 10 sorts before 9; <=> compares numbers
The g flag and lastIndex /g in list and scalar context ↗ the same trap in Perl, where /g keeps its place in pos()

Ruby text

The Ruby text library ↗

Page here Sibling page Why
Primitives and wrappers String.new is binary; "" is not ↗ in Ruby too, a constructor and a literal make different strings: String.new with no argument makes a BINARY string where "" is UTF-8, a difference of encoding rather than of kind.
Converting on purpose to_i never fails; Integer() does ↗ the lenient to_i and the strict Integer() in Ruby
const is not frozen String literals are chilled, not frozen ↗ frozen, chilled and mutable strings in Ruby
freeze, seal and preventExtensions String literals are chilled, not frozen ↗ how Ruby freezes strings, and the FrozenError a write raises
Files The BOM is kept unless you ask ↗ the byte order mark kept by Ruby too, unless asked

Ruby

The Ruby library ↗

Page here Sibling page Why
Eight types Everything is an object, even 1 and nil ↗ in Ruby, and nearly as much in Python (the page runs both), 1 and nil are objects with a class of their own; here seven of the eight types are primitives, and a primitive is not an object at all
typeof Everything is an object, even 1 and nil ↗ nil.class is NilClass in Ruby, and type(None) is NoneType in the Python twin on the same page: there the empty value has a type of its own and says so, where typeof null says "object"
typeof Duck typing asks respond_to?, not class ↗ Ruby code asks an object what it can do rather than what it is; in JavaScript the same question about one method is typeof order.total === "function"
Symbols A symbol is a name, not a string ↗ Ruby keeps exactly one symbol per spelling, so every Ruby symbol behaves like Symbol.for, and nothing there makes a second :id the way Symbol("id") does.
Symbols A string key and a symbol key are two keys ↗ in Ruby too a string key and a symbol key spelled alike are two keys, as order.id and order[billingId] are in the first program.
BigInt 1 + 1.5 works because Integer asks Float to coerce ↗ Ruby mixes an Integer with a Float by converting it to a Float; JavaScript throws on 1n * 1.5 rather than choose.
BigInt 7 / 2 is 3: integer division floors ↗ Ruby's -7 / 2 is -4, where -7n / 2n here is -3n.
Values and references A variable is a reference, not a box ↗ the same model, but a Ruby string can be changed in place, so t << "y" shows through the other name, which a JavaScript string never allows.