Re[19]: Нужна ли Оберон-ОС защита памяти?
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 16.02.05 09:35
Оценка: -3 :)
Здравствуйте, Кодт, Вы писали:

К>На самом деле, указатели в Си — с одной стороны, крайне небезопасный, а с другой — очень выразительный механизм, в том числе — механизм абстракции.

К>Как в языках со слабой типизацией абстрагируются от типа данных, так в Си (ещё не С++) — от размещения данных.
К>В обоих случаях — это паттерн "простота (хуже воровства)", для слабо типизированных языков — получается более простой транслятор, для Си — облегчённый рантайм.

В Обероне указатели есть (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)} *)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.