Data: различия между версиями

Материал из fidoman.ru
 
(не показано 5 промежуточных версий этого же участника)
Строка 27: Строка 27:
  
 
В тяжёлых типах эффективнее работать с указателями на тип, а не подставлять его в шаблоны функций, копирующие и обменивающие значения (например сортировку) - использовать для этого промежуточный тип, хранящий указатель и проксирующий функции сравнения и перестановки.
 
В тяжёлых типах эффективнее работать с указателями на тип, а не подставлять его в шаблоны функций, копирующие и обменивающие значения (например сортировку) - использовать для этого промежуточный тип, хранящий указатель и проксирующий функции сравнения и перестановки.
 +
 +
== переменные ==
 +
 +
Некий объект в памяти, идентифицируемый по имени.
 +
 +
Что в переменной?
 +
  Тип данных.
 +
  Значение (смысл).
 +
  Привязка (к какому объекту относится, что характеризует)
 +
  Назначение (для чего переменная заведена, для чего используется, какая задача с её помощью решается)
 +
 +
Например
 +
  целое
 +
  ключ в таблице сообщений
 +
  БД, открытая в хендле 3
 +
  текущая позиция верхней строки при отображении на экране
 +
 +
=== Способы привязки данных к внешним объектам ===
 +
 +
# Отсутствует. Программа получает данные и выдаёт результат. К чему они относятся решают те, кто запустил.
 +
# Сессии. В каждой сессии обрабатываются данные из одного источника, в рамках источника - как в п.1.
 +
# Неявная (развитие п.2). Привязка осуществляется в рамках контекста (глобального как в п.1 или локального - объект, замыкание и т.д. как в п.2).
 +
# Явная. Помимо собственно данных переменная хранит свою привязку.
 +
 +
== Типы в программе и архитектура CPU ==
 +
 +
В программе программист объявляет тип, с которым хочет работать - например, беззнаковое некоторого размера бит, знаковое в дополнительном коде и т.д.
 +
Если это float - может указать минимально требуемое количество бит мантиссы и порядка.
 +
Может указать вектор (для векторных операций) желаемого размера.
 +
 +
Компилятор сопоставляет пожелания программиста и возможности процессора, и в соответствии с заданным программистом типом либо использует инструкции процессора, работающие с этим типом, либо эмулирует работу с ним, используя доступные инструкции.
 +
 +
Строка является составным типом (массив переменной длины, или структура из длины и массива) и реализуется стандартной библиотекой, а не компилятором. Например кроме строк в стандартной кодировке (ASCII/UTF-8) также могут быть реализованы строки в произвольной кодировке с указанием атрибута кодировки в составе типа данных.
 +
 +
Помимо формата и объёма данных программист также определяет поведение типа. Например, целый с проверкой переполнения (проверка флага переноса/переполнения после операции) и целый с игнорированием переполнения (классический C тип). Возможны дополнительные требования, например, нахождение значения в некотором диапазоне.
 +
При использовании типов с разным поведением в сложных выражениях компилятор должен требовать явной спецификации, по каким правилам типируются промежуточные значения. (если это просто c=a+b, то можно легко вывести тип результата из типа c, если это d=a+b*c, где a и d с проверкой переполнения, а b и c нет - то возникают вопросы. Но логичнее всего исходить из требований к lvalue, и если программист считает что промежуточный результат шире - вариант разбить выражение всегда за ним. Возможно логично будет брать проверку переполнения - по типу результата, проверку границ - по факту записи в переменную)
 +
 +
[[Category:Programming]]

Текущая версия на 15:05, 24 мая 2023

Виды данных в программе

базовые - байт, слово, структ, массив, блок памяти

контейнеры - куча, список, дерево

 сложные контейнеры для организации произвольных указателей должны использовать управляемые указатели, обнуляемые при удалении целевого объекта

прикладные типы - сложные типы с набором методов. Не могут взаимодействовать с ОС

контекст:

 аватар - описывается в общем виде, при инстанциации привязывается к какому-то конкретному объекту - определённая вкладка браузера, некий внешний сервис, контроллер какого-то конкретно мотора. Использует сервисы ОС для подключения к своей точке назначения.
 модель - имитирует работу некого объекта. Может использоваться в качестве точки назначения для аватара. Может ограниченно взаимодействовать с ОС (например использовать таймер).
 контекст содержит:
   переменные состояния
   точки входа реакции на события
   вложенные (используемые) контексты
   код, исполняемый в ответ на события или же для отработки внутренних процессов

лёгкие и тяжёлые типы

Тип может поддерживать копирование, но в силу большого объёма занимать существенное время, или зависеть от записанного значения - строки, контейнеры.

Лёгкие типы - время копирования меньше или сопоставимо с временем копирования указателя.

Тяжёлые типы - время копирования превышает время копирования указателя.

В тяжёлых типах эффективнее работать с указателями на тип, а не подставлять его в шаблоны функций, копирующие и обменивающие значения (например сортировку) - использовать для этого промежуточный тип, хранящий указатель и проксирующий функции сравнения и перестановки.

переменные

Некий объект в памяти, идентифицируемый по имени.

Что в переменной?

 Тип данных.
 Значение (смысл).
 Привязка (к какому объекту относится, что характеризует)
 Назначение (для чего переменная заведена, для чего используется, какая задача с её помощью решается)

Например

 целое
 ключ в таблице сообщений
 БД, открытая в хендле 3
 текущая позиция верхней строки при отображении на экране

Способы привязки данных к внешним объектам

  1. Отсутствует. Программа получает данные и выдаёт результат. К чему они относятся решают те, кто запустил.
  2. Сессии. В каждой сессии обрабатываются данные из одного источника, в рамках источника - как в п.1.
  3. Неявная (развитие п.2). Привязка осуществляется в рамках контекста (глобального как в п.1 или локального - объект, замыкание и т.д. как в п.2).
  4. Явная. Помимо собственно данных переменная хранит свою привязку.

Типы в программе и архитектура CPU

В программе программист объявляет тип, с которым хочет работать - например, беззнаковое некоторого размера бит, знаковое в дополнительном коде и т.д. Если это float - может указать минимально требуемое количество бит мантиссы и порядка. Может указать вектор (для векторных операций) желаемого размера.

Компилятор сопоставляет пожелания программиста и возможности процессора, и в соответствии с заданным программистом типом либо использует инструкции процессора, работающие с этим типом, либо эмулирует работу с ним, используя доступные инструкции.

Строка является составным типом (массив переменной длины, или структура из длины и массива) и реализуется стандартной библиотекой, а не компилятором. Например кроме строк в стандартной кодировке (ASCII/UTF-8) также могут быть реализованы строки в произвольной кодировке с указанием атрибута кодировки в составе типа данных.

Помимо формата и объёма данных программист также определяет поведение типа. Например, целый с проверкой переполнения (проверка флага переноса/переполнения после операции) и целый с игнорированием переполнения (классический C тип). Возможны дополнительные требования, например, нахождение значения в некотором диапазоне. При использовании типов с разным поведением в сложных выражениях компилятор должен требовать явной спецификации, по каким правилам типируются промежуточные значения. (если это просто c=a+b, то можно легко вывести тип результата из типа c, если это d=a+b*c, где a и d с проверкой переполнения, а b и c нет - то возникают вопросы. Но логичнее всего исходить из требований к lvalue, и если программист считает что промежуточный результат шире - вариант разбить выражение всегда за ним. Возможно логично будет брать проверку переполнения - по типу результата, проверку границ - по факту записи в переменную)