Здравствуйте, Кодт, Вы писали:
К>На самом деле, указатели в Си — с одной стороны, крайне небезопасный, а с другой — очень выразительный механизм, в том числе — механизм абстракции.
К>Как в языках со слабой типизацией абстрагируются от типа данных, так в Си (ещё не С++) — от размещения данных.
К>В обоих случаях — это паттерн "простота (хуже воровства)", для слабо типизированных языков — получается более простой транслятор, для Си — облегчённый рантайм.
В Обероне указатели есть (
POINTER TO), но адресов и адресной арифметики нет. И именно из-за отсутствия адресов механизм абстракции не очень выразительный. Странно...
С другой стороны в оберонах есть элементарный тип "множество", которого нет в Си/Си++/Java/C#, а в языке Си даже нет булевского типа. А выразительность значит меньше. Опять странно...
Кстати про множества, а почему элементарный тип bool в языки C++/Java/C# все-таки ввели, а элементарный тип "множество" проигнорировали?
Как интересно в Си/Си++/Java/C# работают с битами? Наверное там битовые операции применяют прямо к числам? Вот несчастные программисты, как они там мучаются — ведь в Си/Си++/Java/C# множество битов и числа — это одно и тоже, хотя спроси любого математика так он ответит, что число — это одна математическая абстракция (теория чисел), а множество — совсем другая (теория множеств).
VAR s1, s2, s3: SET;
n, m: INTEGER;
BEGIN
s1 := {0,1,2,3}; (* Первые четыре бита = 1, остальные 32-4 = 28 битов равны 0 *)
s2 := s1;
n := 13;
m := 2;
INCL(s2, n); (* n-тый бит теперь равен 1 *)
EXCL(s2, m); (* m-тый бит теперь равен 0 *)
s3 := s1 + s2 + {25, 26}; (* Объединение трех множеств. В объединеном множестве присутсвуют все элементы присутсвующие во всех объединяемых множествах *)
s3 := s1 * s2; (* Пересечение множеств - остаются только элементы присутсвующие и в первом и во втором множестве *)
s3 := s1 - s2; (* Разность множеств. Из вычистаемого множества удаляются элементы присутсвующие в вычитаемом множестве *)
s3 := s1 / s2; (* Симметричная разность множеств. Объединение разностей множеств s1 / s2 = (s1 - s2) + (s2 - s1) *)
m := ORD(s3); (* Sum i IN s3: 2^i *)
s1 := BITS(n); (* {i | ODD(n DIV 2^i)} *)