Язык C имеет славу крайне небезопасного языка. Так ли это на самом деле?
÷ 0
«Солярис» Лема — это провал
Станислав Лем ругал современную ему фантастику в том числе за то, что она изображала инопланетную жизнь слишком по человечески. Сам писатель хотел создать такое произведение, в котором люди сталкивались бы с чем-то действительно новым и непонятным. Это очень хорошая идея, правда, сложно воплотимая. Это не только вызов для писателя, но и для читателей, которые, как мы знаем, снова и снова хотят читать про людей, в какие одежды их бы не рядили. Можно было бы предположить, что такие произведения, если бы и существовали, то они бы всё равно не были известными. Но мы знаем, что «Солярис» имел большой успех. Очень интересно, как же справился с этой сложной задачей писатель, бросивший вызов устоям?
Воображаемый Ахиллес не догонит воображаемую черепаху, если об этом не думать
Известная апория Зенона[0] о том, что Ахиллес не сможет догнать черепаху, потому что за время, когда он достигнет её исходного положения, она успеет отползти дальше, после чего всё повторится — это очередная логическая загадка, которая до сих пор вводит в заблуждение многих людей, но оказывающаяся неприлично простой, если для её рассмотрения использовать язык программирования[1].
Почему математика работает?
В основе естественных наук лежит математика. И открытые законы природы, описанные в математическом виде, обладают огромной предсказательной силой. Почему? Чего только не выдумывают по этому поводу. Ответ же довольно прост, но, как это часто бывает с простыми ответами, не всем легко его принять.
Превращение O→P
Убого:
MODULE Power;
PROCEDURE Do*(x: REAL; n: INTEGER): REAL;
VAR y: REAL; i: INTEGER;
BEGIN
ASSERT(n >= 0);
y := 1.0; i := n;
WHILE i > 0 DO
IF ODD(i) THEN y := y*x END;
x := x*x; i := i DIV 2
END
RETURN
y
END Do;
END Power.
Уже лучше:
sub power($x real, $n int) {
assert $n < 0;
var $y = 1.0;
while ($n > 0) {
$y *= $x if $n % 2;
$x *= $x;
$n = int($n / 2);
}
return $y;
}
Божественно:
use feature 'current_sub';
sub power{$_[1]?($_[1]%2?$_[0]:1)*__SUB__->($_[0]*$_[0],int $_[1]/2):1}Превращение O→A
Убого:
MODULE Power;
PROCEDURE Do*(x: REAL; n: INTEGER): REAL;
VAR y: REAL; i: INTEGER;
BEGIN
ASSERT(n >= 0);
y := 1.0; i := n;
WHILE i > 0 DO
IF ODD(i) THEN y := y*x END;
x := x*x; i := i DIV 2
END
RETURN
y
END Do;
END Power.
Уже лучше:
power ← f R N R { (x n)
(y) ← 1.0
(↺) n > 0 {
n|2 = 1 ? y ×← x
x ×← x
n ÷← 2
}
y
}
Божественно:
power ← {
⍵=0 : 1
(1 ⍺)[1+2|⍵] × (⍺×⍺) ∇ ⌊⍵÷2
}Превращение O→F
Убого:
MODULE Power;
PROCEDURE Do*(x: REAL; n: INTEGER): REAL;
VAR y: REAL; i: INTEGER;
BEGIN
ASSERT(n >= 0);
y := 1.0; i := n;
WHILE i > 0 DO
IF ODD(i) THEN y := y*x END;
x := x*x; i := i DIV 2
END
RETURN
y
END Do;
END Power.
Уже лучше:
: power ( real x integer n -- real )
real y integer i
n 0 < assert
1.0 =:y
n =:i
begin
i 0 >
while
i odd if y x * =:y then
x x * =:x
i 2 div =:i
end
y
;
Божественно:
: power ( n -- ) ( F: x -- y )
dup 0< if drop fdrop abort then
>r 1e
begin r@ 0> while
r@ 1 and 0<> if fover f* then
fswap fdup f* fswap
r> 2/ >r
repeat
r> drop fnip
;




