Я подредактировал CP-шный вариант для простого Оберона:
MODULE Bubble;
IMPORT Out;
CONST n = 40000;
PROCEDURE PrintAll(arr: ARRAY OF INTEGER);
VAR i: INTEGER;
BEGIN
FOR i := 0 TO LEN(arr) - 1 DO
Out.Int(arr[i], 0);
Out.Ln
END
END PrintAll;
PROCEDURE DoIt*;
VAR
arr : ARRAY n OF INTEGER;
i, j, tmp : INTEGER;
BEGIN
FOR i := 0 TO n - 1 DO
arr[i] := n-i
END;
PrintAll(arr);
Out.String("---");
Out.Ln;
FOR i:=0 TO n-1 DO
FOR j:=0 TO n-2-i DO
tmp := arr[j];
IF arr[j] > arr[j+1] THEN
arr[j] := arr[j+1];
arr[j+1] := tmp
END
END
END;
PrintAll(arr)
END DoIt;
BEGIN
DoIt
END Bubble.
И прогнал через свой неполноценный транслятор. Оказалось, что на нём до сих пор не был реализован FOR. После добавления поддержки, транслятор выдал такое:
#include <stdlib.h>
#include <stddef.h>
#include <assert.h>
#include <math.h>
#include <stdbool.h>
#define n_cnst 40000
static void PrintAll_(int arr_[/*len0*/], int arr_len0) {
int i_;
for (i_ = 0; i_ <= arr_len0 - 1; ++i_) {
Out_Int(arr_[i_], 0);
Out_Ln();
}
}
extern void Bubble_DoIt(void) {
int arr_[n_cnst];
int i_;
int j_;
int tmp_;
for (i_ = 0; i_ <= n_cnst - 1; ++i_) {
arr_[i_] = n_cnst - i_;
}
PrintAll_(arr_, n_cnst);
Out_String("---", 4);
Out_Ln();
for (i_ = 0; i_ <= n_cnst - 1; ++i_) {
for (j_ = 0; j_ <= n_cnst - 2 - i_; ++j_) {
tmp_ = arr_[j_];
if (arr_[j_] > arr_[j_ + 1]) {
arr_[j_] = arr_[j_ + 1];
arr_[j_ + 1] = tmp_;
}
}
}
PrintAll_(arr_, n_cnst);
}
extern int main(int argc, char **argv) {
Bubble_DoIt();
return 0;
}
При сборке gcc -O3
программа работает 2.19 секунд
для сравнения, c++ вариант отработал за 2.1
и стабильно выполняется быстрей.