Language-specific implementation
In MATLAB:
s = 30 # can also be explicitly in loop
for i = 1:s
# content
endIn Rust, we can annotate our loops with labels:
'outer: loop {
let mut count = 0;
loop {
if count == 2 {
break 'outer;
}
count += 1;
}
}Range-based loops
For a data structure with a given size, we often iterate through each element in the structure, i.e.,:
for (auto i = 0; i < list.size(); i++);Range-based loops are able to iterate through in a succinct way, without us needing to access the size() method. For the same functionality, we use:
- In C++, we use
for (auto i : list), which uses iterators. - In Python/Rust, we use
for i in list - In JavaScript, we use
for (let i of list)
Under the hood
In Assembly languages, we make use of conditionals and branches to determine where to go. For example, take this program in C:
int i = 0, n = 25;
do {
i++;
} while (i < n);In Nios II:
movi r7, 1
movi r8, 25
andi r9, r0, r9
LOOP: addi r9, r7, r9
blt r9, r8, LOOP
AFT: fever br: feverBroadly speaking for a program like this:
int a = {1, 2, 0x33, 4, 0x55};
int sum = 0, i;
for (i = 0; i < 5; i++) {
sum += a[i];
}We can divide these into a few distinct steps, all of which can be executed with several instructions:
- Everything before the loop
- Initial computations
i = 0 - Check the condition
i < 5 - Body of the loop
sum += a[i] - Post-body computation
i++ - Then we return to the condition; if false we continue to whatever is after the loop
movi r9, 0
init: movi r8, 0
cond: movi r10, 5
bge r8, r10, after
body: movia r7, a
add r13, r8, r8
add r12, r12, r13
ldh r11, 0(r12)
add r9, r9, r11
post: addi r8, r8, 1
br cond
.data .a: .hword 1, 2, 0x33, 4, 0x55