Неверно что тип данных относится к базовым
Переменные и базовые типы данных языка С
Теоретическая часть
Стандарт С89 определяет пять базовых типов данных [2.4]:
float – вещественное число одинарной точности с плавающей точкой;
double – вещественное число двойной точности с плавающей точкой;
char – символьный тип для определения одного символа;
void – тип без значения.
Объект типа char всегда занимает 1 байт памяти [2.4]. Размеры объектов других типов, как правило, зависят от среды программирования и операционной системы.
Приведем модификаторы базовых типов данных. К ним относятся следующие спецификаторы, предшествующие им в тексте программы [2.4]:
В табл. 2.1 приведены допустимые комбинации типов данных языка С с их минимальным диапазоном значений и типичным размером [13].
Типы данных языка С | ||
---|---|---|
Тип данных | Типичный размер в битах | Минимально допустимый диапазон значений |
char | 8 (или 1 байт) | от –128 до 127 |
unsigned char | 8 | от 0 до 255 |
signed char | 8 | от –128 до 127 |
int | 16 или 32 | от –32768 до 32767 |
unsigned int | 16 или 32 | от 0 до 65535 |
signed int | 16 или 32 | от –32767 до 32767 |
short int | 16 | от –32767 до 32767 |
unsigned short int | 16 | от 0 до 65535 |
signed short int | 16 | от –32767 до 32767 |
long int | 32 | от –2147483648 до 2147483647 |
long long int | 64 | от –(2 63 –1 ) до (2 63 –1) для С99 |
signed long int | 32 | от –2147483647 до 2147483647 |
unsigned long int | 32 | от 0 до 4294967295 |
unsigned long long int | 64 | от 0 до (2 64 –1) для С99 |
float | 32 | от 1Е–37 до 1Е+37 (с точностью не менее 6 значащих десятичных цифр) |
double | 64 | от 1Е–37 до 1Е+37 (с точностью не менее 10 значащих десятичных цифр) |
long double | 80 | от 1Е–37 до 1Е+37 (с точностью не менее 10 значащих десятичных цифр) |
Для базового типа int возможны следующие записи с модификатором:
Для данных вещественного типа максимальные значения абсолютных величин представлены в табл. 2.2 [2.4].
Вещественные типы данных языка С | ||
---|---|---|
Тип данных | Типичный размер в битах | Диапазон абсолютных величин |
float | 32 | от 3.4Е–38 до 3.4Е+37 |
double | 64 | от 1.7Е–308 до 1.7Е+308 |
long double | 80 | от 3.4Е–4932 до 1.1Е+4932 |
Приведем характеристику данных функций [2.4].
Прототип функции printf() имеет вид:
Спецификаторы формата для функции printf() перечислены в табл. 2.3, взятой из [2.3].
Базовые типы значений
Базовые типы в 1С
Физически информация в памяти компьютера хранится в виде нулей и единиц (двоичном виде). Но двоичное представление данных и методы их обработки не очень удобны для восприятия, как для разработчиков, так и для пользователей. Поэтому в компьютерных системах существуют различные способы работы с данными и их представления.
Различие способов работы с данными определяется множеством программ (текстовые редакторы, табличные редакторы, графические редакторы и т.д.). В системе 1С:Предприятие 8 для обеспечения такого механизма программа хранит в памяти компьютера не только данные, но и информацию о том, как с этими данными работать.
Виды примитивных типов 1С (неделимых на другие типы):
В системе 1С можно работать с данными:
Типизация переменных во встроенном языке 1С:Предприятие не жесткая, так как:
Работа в 1С со строковыми значениями
Значения типа СТРОКА содержат строку произвольной длины с возможностью одновременного использования слов на разных языках, что реализуется форматом текста Unicode.
Правила определения значений типа СТРОКА:
Работа в 1С с числовыми значениями
Значением типа ЧИСЛО в 1С может быть представлено любое десятичное число.
Правила определения значений типа ЧИСЛО:
Работа в 1С с датой и временем
Значение типа ДАТА всегда содержит дату и время.
Правила определения значений типа ДАТА:
Для определения значения только для времени необходимо указывать значение даты в литерале 00010101 и необходимое время.
Квант значения типа ДАТА равен секунде, соответственно, если «Переменная1» имеет тип Дата и значение, равное 1 марта 2005 года, то значение выражения (Переменная1+20) будет равно 1 марта 2005 г 00 ч 00 мин 20 сек.
Работа в 1С со значениями типа БУЛЕВО
Значения типа БУЛЕВО могут иметь только значения «Истина» или «Ложь», задаваемые соответствующими литералами.
Значения данного типа часто являются результатом вычисления логических операций.
Правила определения значений типа БУЛЕВО:
Работа в 1С со значениями НЕОПРЕДЕЛЕНО, NULL И ТИП
Для значения НЕОПРЕДЕЛЕНО
Значение типа НЕОПРЕДЕЛЕНО означает пустое значение с незаданным типом в памяти компьютера. Интерактивно данное значение представлено пустой строкой.
Правила определения значений типа НЕОПРЕДЕЛЕНО:
Для значения NULL
Значение типа NULL означает пустое значение с незаданным типом в базе данных.
Используется исключительно для определения отсутствующего значения при работе с базой данных, например, при соединении таблиц.
Интерактивно данное значение представлено пустой строкой. На практике встречается в выборке результата запроса там, где не удалось подобрать подходящее значение:
Правила определения значений типа NULL:
Для значения ТИП
Значение типа ТИП используются для идентификации типов значений. Это необходимо для определения и сравнения типов.
Правила определения значений типа ТИП:
Данный тип не имеет литералов и возвращается функциями встроенного языка «ТипЗнч» и «Тип».
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
Неверно что тип данных относится к базовым
Концепция типов данных является важнейшей стороной любого языка программирования.
В Си/Си++ имеется четыре базовых арифметических (числовых) типа данных. Из них два целочисленных — char, int — и два плавающих (вещественных) — float и double. Кроме того, в программах можно использовать некоторые модификации этих типов, описываемых с помощью служебных слов — модификаторов. Существуют два модификатора размера — short (короткий) и long (длинный) — и два модификатора знаков — signed (знаковый) и unsigned (беззнаковый). Знаковые модификаторы применяются только к целым типам.
Как известно, тип величины связан с ее формой внутреннего представления, множеством принимаемых значений и множеством операций, применимых к этой величине. В табл. 1 перечислены арифметические типы данных Си++, указан объем занимаемой памяти и диапазон допустимых значений.
Размер типа int и unsigned int зависит от размера слова операционной системы, в которой работает компилятор Си++. В 16-разрядных ОС (MS DOS) этим типам соответствуют 2 байта, в 32-разрядных (Windows) — 4 байта.
Эквивалентные названия типа
зависит от системы
зависит от системы
short, signed short int
unsigned short int
long, signed long int
Анализируя данные табл. 1, можно сделать следующие выводы:
o если не указан базовый тип, то по умолчанию подразумевается int;
o если не указан модификатор знаков, то по умолчанию подразумевается signed;
o с базовым типом float модификаторы не употребляются;
o модификатор short применим только к базовому типу int.
Программисту, работавшему на Паскале, покажется странным, что тип char причислен к арифметическим типам. Ведь даже его имя указывает на то, что это символьный тип! В Си/Си++ величины типа char могут рассматриваться в программе и как символы, и как целые числа. Все зависит от контекста, т. е. от способа использования этой величины. В случае интерпретации величины типа char как символа ее числовое значение является ASCII-кодом. Следующий пример иллюстрирует сказанное.
printf(«%c»,а); /*На экране появится символ А*/
printf(«%d»,a); /*На экране появится число 65*/
Символы «%с» являются спецификацией формата ввода/вывода символьных данных, a «%d» — спецификацией для целых чисел.
Еще одной особенностью Си является отсутствие среди базовых типов логического типа данных. Между тем, как мы дальше увидим, в Си используются логические операции и логические выражения. В качестве логических величин в Си/Си++ выступают целые числа. Интерпретация их значений в логические величины происходит по правилу: равно нулю — ложь, не равно нулю — истина.
В последние версии Си++ добавлен отдельный логический тип с именем bool. Его относят к разновидности целых типов данных.
Описание переменных в программах на Си/Си++ имеет вид:
unsigned char code;
unsigned long long number;
long double max__num;
Одновременно с описанием можно задать начальные значения переменных. Такое действие называется инициализацией переменных. Описание с инициализацией производится по следующей схеме:
тип имя_переменной = начальное_значение
unsigned int year=2 000;
Тип константы компилятор определяет по следующим правилам: если значение константы лежит в диапазоне типа int, то она получает тип int; в противном случае проверяется, лежит ли константа в диапазоне типа unsigned int, в случае положительного ответа она получает этот тип; если не подходит и он, то пробуется тип long и, наконец, unsigned long. Если значение числа не укладывается в диапазон типа unsigned long, то возникает ошибка компиляции.
3.14159F — константа типа float, под которую выделяется 4 байта памяти;
3.14L — константа типа long double, занимает 10 байт;
50000U — константа типа unsigned int, занимает 2 байта памяти (вместо четырех без суффикса);
0LU — константа типа unsigned long, занимает 4 байта;
24242424UL — константа типа unsigned long, занимает 4 байта.
Особую разновидность символьных констант представляют так называемые управляющие символы. Их назначение — управление выводом на экран. Как известно, такие символы расположены в начальной части кодовой таблицы ASCII (коды от 0 до 31) и не имеют графического представления. В программе на Си они изображаются парой символов, первый из которых ‘ \ ‘. Вот некоторые из управляющих символов:
‘ \ n ‘ — переход на новую строку;
‘ \t’ — горизонтальная табуляция;
Управляющие символьные последовательности являются частным случаем эскейп-последовательностей (ESC-sequence), с помощью которых можно задать символьную константу указанием ее кода. Код символа можно указать в восьмеричном или в шестнадцатеричном представлении. Формат восьмеричного представления: ‘\ddd’. Здесь d — восьмеричная цифра (от 0 до 7). Формат шестнадцатеричного представления:’ \xhh’ (или ‘ \xhh’), где h — шестнадцатеричная цифра (от 0 до F). Например, константа, соответствующая заглавной латинской букве А, может быть представлена тремя способами: ‘А’, ‘\101’, ‘\х41’.
const float pi=3.14159;
const int iMIN=l, iMAX=1000;
#define константы> Оначение константы>
Тип констант явно не указывается и определяется по форме записи. В конце директивы не ставится точка с запятой.
На стадии препроцессорной обработки указанные имена заменяются на соответствующие значения. Например, если в программе присутствует оператор
то в результате препроцессорной обработки он примет вид:
При этом идентификаторы iMAX и iMIN не требуют описания внутри программы.
В результате имени А будет сопоставлена константа 0, имени B — константа 1, C — 2, D — 3. По умолчанию значение первой константы равно нулю.
Для любой константы можно явно указать значение. Например:
В результате будут установлены следующие соответствия: А=10, B=11, C=12, D=13.
Возможен и такой вариант определения перечисления:
Если перечисляемому типу дать имя, то его можно использовать в описании переменных. Например:
Здесь идентификатор metal становится именем типа. После такого описания в программе возможны следующие операторы:
Элементарные типы и операции над ними. Часть I: типы данных, размер, ограничение.
Строительными кирпичиками любого языка является элементарные типы данных с которыми мы можем работать. Зная их, мы всегда понимаем, что у нас хранится в той или иной переменной, что возвращает та или иная функция. Какие действия мы можем совершить над нашими данными. Это база. Поэтому именно этому я и хотел уделить внимание в данной статье в общем, а так же примерам работы с бинарными данными в частности.
Материал в первую очередь адресую тем кто только начал или хочет начать писать на Erlang-e. Но я постарался максимально полно охватить данный аспект языка и поэтому надеюсь, что написанное будет полезно и более продвинутой аудитории.
Первоначальный материал пришлось разделить на три части, в данной будут рассмотрены базовые типы языка, способы создания базовых типов и потребляемые ресурсы на каждый из типов.
Вступление
Для начала хочу выразить огромную признательность участникам русскоязычной рассылке по Erlang-у в Google-е за поднятие кармы и возможности выложить на хабр данную статью.
В процессе изложения будут приводиться примеры из командной оболочки (шелла) Эрланга. Поэтому нужно усвоить простые принципы работы. Каждая команда в шелле разделяется запятыми. При это совершенно не важно, производится набор в одну строку или в несколько.
1> X=1, Y = 2,
1> Z = 3,
1> S=4.
4
Указателем завершения ввода и запуск на выполнение является точка. При этом шелл выведет на экран значение возвращаемое последней из команд. В примере выше возвращается значение переменной S. Значения всех инициированных переменных запоминается, а так как в Эрланге нельзя переопределить значение инициированной переменной, то попытка переопределения приведет к ошибке:
2> Z=2.
** exception error: no match of right hand side value 2
Поэтому если требуется в текущей сессии работы заставить шелл «забыть» значения переменных, то можно воспользоваться функцией f(). Вызванная без аргументов она удаляет все инициализированные переменные. Если в качестве аргумента указать имя переменной, то удалена будут только она (передать список переменных нельзя):
3> f(Z).
ok
4> X = 4.
** exception error: no match of right hand side value 4
5> f().
ok
6> X = 4. %все, что идет после знака процента является комментарием
4
Для выхода достаточно ввести halt(), или вызвать интерфейс пользовательских команд Crtl+G и ввести q (команда h выведет справку). При выводе цифровых данных в шелле они приводятся к десятичному виду.
Изложенный материал относится к последней, актуальной на данный момент, версии 5.6.5. Для кодирования строк используется ISO-8859-1 (Latin-1) кодировка. Соответственно и все численные коды символов берутся из этой кодировки. Первая половина (коды 0-127) кодировки соответствует кодам US-ASCII, поэтому проблем с латинским алфавитом не возникает.
Несмотря на заявление разработчиков о том, что во внутреннем представлении используется Latin-1 «снаружи» виртуальной машины это зачастую совершенно неочевидно. Это возникает оттого, что Эрланг передает и принимает символы в виде кодов. Если для терминала установлена локаль, то коды интерпретируются исходя из установленной кодовой страницы и если это возможно выводятся в виде печатных символов. Вот пример SSH сессии:
# setenv | grep LANG
LANG=
# erl
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.6.5 (abort with ^G)
1> [255].
«\377»
2> halt().
# setenv LANG ru_RU.CP1251
# erl
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.6.5 (abort with ^G)
1> [255].
«я»
Причем совершенно не важно, что указано в переменной окружения LANG, главное что бы она была установлена.
1. Элементарные типы
В языке не очень много базовых типов. Это число (целое или с плавающей запятой), атом, двоичные данные, битовые строки, функции-объекты (аналогично JavaScript-у), идентификатор порта, идентификатор процесса (Erlang процесса, а не системного), кортеж, список. Существует ряд псевдотипов: запись, булев, строки. Любой тип данных (не обязательно элементарный) называется терм.
1.1 Число
Потребление памяти и ограничения. Целое занимает одно машинное слово, что для 32-ух и 64-х разрядных процессорах составляет 4 байта и 8 байт соответственно. Для больших целых 1…N машинных слов. Числа с плавающей точкой в зависимости от архитектуры занимают 4 и 3 машинных слова соответственно.
1.2 Список
Список (List) позволяют группировать данные в одну структуру. Список создается при помощи квадратных скобок, элементы списка разделяются запятыми. Элемент списка может быть любого типа. Первый элемент списка называется голова (head), а оставшаяся часть — хвост (tail).
Потребление памяти и ограничения. Каждый элемент списка занимает одно машинное слово (4 или 8 байт в зависимости от архитектуры) + размер хранимых в элементе данных. Таким образом на 32-ух разрядной архитектуре значение переменной List будет занимать (1 + 1) + (1 + 4) + (1 + 1) = 9 слов или 36 байт.
1.3 Строка
На самом деле в Эрланге нет строк (String). Это просто синтаксический сахар который позволяет в более удобной форме записывать список целых чисел. Каждый элемент этого списка представляет собой ASCII код соответствующего символа.
Потребление памяти и ограничения. Т.к. строка это список целых чисел, а каждый символ это один элемент списка, то на символ уходит 8 или 16 байт (2 машинных слова).
1.4 Атом
Атом (Atom) это просто литерал. Он не может быть связан с каким либо цифровым значением подобно константе в других языках. Значение возвращаемое атомом является самим атомом. Атом должен начинаться со строчной буквы и состоят из цифр, латинских букв, знака подчеркивания _ или собачки @. В этом случае его можно не заключать в одиночные кавычки. Если имеется другие символы, то нужно использовать одиночные кавычки для обрамления. Двойные кавычки для этого не подходят, т.к. в них заключают строки.
Например:
hello
phone_number
‘Monday’
‘phone number’
В строках и в закавыченных атомах можно использовать такие управляющие последовательности:
Sequence | Description |
\b | возврат (backspace) |
\d | удалить (delete) |
\e | эскейп (escape) |
\f | прогон страницы (form feed) |
\ | новая строка (newline) |
\r | возврат каретки (carriage return) |
\s | пробел (space) |
\t | горизонтальная табуляция (tab) |
\v | вертикальная табуляция (vertical tab) |
\XYZ, \YZ, \Z | восьмеричный код символа |
\^a. \^z \^A. \^Z | Ctrl + A … Ctrl + Z |
\’ | одиночная кавычка |
\» | двойная кавычка |
\\ | обратная косая черта |
Имя незаковыченного атома не может быть зарезервированным словом. К таким словам относятся:
after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xor.
Потребление памяти и ограничения. Каждый объявленный атом является уникальным и его символьное представление хранится во внутренней структуре виртуальной машины которая называется таблица атомов. Атом занимает 4 или 8 байт (одно машинное слово) и является просто ссылкой на элемент таблицы атомов в котором содержится его символьное представление. Сборщик мусора (garbage-collection) не выполняет очистку таблицы атомов. Сама таблица так же занимает место в памяти. Допускается использовать атомы в 255 символов, в общей сложности допустимо использовать 1 048 576 атомов. Таким образом атом в 255 символов будет занимать 255 * 2 + 1 * N машинных слов, где N – количество упоминаний атома в программе.
1.5 Кортеж
Кортеж (Tuple) подобен списку и состоит из набора элементов. Он так же имеет размер равный количеству элементов, но в отличие от списка его размер фиксирован. Кортеж создается при помощи фигурных скобок и его элементами могут быть любые типы данных, кортежи могут быть вложенными.
Кортежи удобны тем, что позволяют не только включать в структуру конкретные данные, но и описывать их. Это, а так же фиксированность кортежа позволяют очень эффективно применять их в шаблонах. Будет хорошей практикой при создании кортежа в первый элемент записывать атом описывающий сущность кортежа. Если проводить аналогии с РСУБД, то список является таблицей, каждая строка таблицы это элемент списка, а кортеж находящийся в этом элемент – конкретная запись в соответствующем столбце.
Потребление памяти и ограничения. Кортеж занимает 2 машинных слова + размер необходимый для хранения непосредственно самих данных. К примеру, кортеж в строке 5 будет занимать (2 + 1) + (2 + 1) = 6 машинных слов или 24 байта на 32-ой архитектуре. Максимальное количество элементов в кортеже 67 108 863.
1.6 Запись
Запись (Record) на самом деле является еще одним примером синтаксического сахара и во внутреннем представлении хранится как кортеж. Запись на этапе компиляции преобразуется в кортеж, поэтому использовать записи напрямую в шелле невозможно. Но можно воспользоваться rd() функцией для объявления структуры записи (строка 1). Объявление записи всегда состоит из двух элементов. Первый элемент обязательно должен быть атом называемый имя записи. Второй всегда кортежем, возможно даже пустым, элементы которого являются парой имя_поля – значение_поля, при этом имя поля должно быть атомом, а значение любым допустимым типом (в том числе и записью, строка 11).
Оператором создания кортежа на основании записи (строка 2) является решетка # после которой следует имя записи и кортеж со значениями полей, возможно даже и пустым, но ни когда с именами полей которые не объявлены в описание записи.
1> rd(person,
person
2> #person<>.
#person
3> #person
#person
Преимущество записи перед кортежем в том, что работа с элементами осуществляется по имени поля (имя должно быть атомом и быть объявленным в описании записи, строка 1), а не по номеру позиции. Соответственно порядок присвоения не имеет значения, не нужно помнить, что у нас содержится в первом элементе имя, телефон или адрес. Можно изменить порядок следования полей, добавить новые поля. Кроме того возможно присвоение значения по умолчанию когда соответствующее поле не задано.
4> rd(person,
person
5> P = #person<>.
#person
6> J = #person
#person
7> P#person.name.
«Smit»
8> J#person.name.
«Joi
9> W = J#person
#person
Если же при создании записи (строка 4) значение по умолчанию не определено (поле phone), то его значение равно атому undefined. Получить доступ к значению переменной созданной с помощью записи можно используя синтаксис описанный в строках 7 и 8. Можно скопировать значение переменной в новую переменную (строка 9). При этом если значение ни каких полей не определено, то получается полная копия, если же определены, то в новой переменной соответствующие поля переопределяются. Все эти манипуляции ни как не затрагивают ни определение записи, ни значения полей в старой переменной.
Лично мне это очень напоминает описание и создание экземпляров класса, хотя еще раз подчеркну, что это всего лишь способ хранения в переменной кортежа.
10> rd(name,
name
11> rd(person,
person
12> P = #person
#person
phone = 123>
13> First = (P#person.name)#name.first.
«Robert»
Пример выше иллюстрирует вложенные записи и синтаксис доступа к внутренним элементам.
1.7 Бинарные данные и битовые строки
И бинарный тип (Binaries) и битовые строки (Bit strings) позволяют работать с двоичным кодом напрямую. Отличие бинарного типа от битовой строки в том, что бинарные данные должны состоять только из целого количества байт, т.е. количество бит в них кратно восьми. Битовые же строки позволяют работать с данными на уровне бит, т.е. по сути бинарный тип это частный случай битовой строки количество разрядов в которой кратно восьми. Можно как создавать данные описав их структуру, так и использовать данный тип в шаблонах. Двоичные данные описываются такой структурой:
>
Отдельной элемент такой структуры называется сегмент. Сегменты описывают логическую структуру двоичных данных и могут состоят из произвольного числа битов/байтов. Это дает очень мощный и удобный инструмент при использовании в шаблонах (пример такого применения будет рассмотрен в третьей части).
1> >.
>
2> >.
>
3> >.
>
4> Var = 30.
30
5> >.
>
Что бы понять, почему в результате создания двоичных данных в строке 2 мы получили 144 (т.е. 10010000, ведь мы, надеюсь, еще не забыли, что шелл при выводе приводит все цифровые данные к десятичному виду), а не ожидаемые 400 нужно рассмотреть битовый синтаксис описания сегмента.
Полная форма описания сегмента состоит из значения (Value), размера (Size) и спецификатора ( TypeSpecifierList ). Причем размер и спецификатор являются необязательными и если не заданы принимают значения по умолчанию.
Значение (Value) в конструкторе может быть числом (целым или с плавающей точкой), битовой строкой или строкой, которая, как мы помним, является на самом деле списком целых чисел. Однако вместе с тем значение сегмента не может быть списком даже целых чисел, т.к. внутри конструктора строка является синтаксическим сахаром для посимвольного преобразования в целые числа, а не в список. Т.е. запись > является синтаксическим сахаром для >, а не >.
Внутри шаблонов значение может быть литералом или неопределенной переменной. Вложенные шаблоны недопускаются. В Value так же можно использовать выражения, но в этом случае сегмент должен быть заключен в круглые скобки (строка 5).
Размер (Size) определяет размер сегмента в юнитах (Unit, о них чуть ниже) и должен быть числом. Значение по умолчанию Size зависит от типа (Type, см. ниже) Value, но может быть и явно задано. Для целых это 8, чисел с плавающей точкой 64, бинарный соответствует количеству байт, битовые строки количеству разрядов. Полный размер сегмента в битах можно вычислить как Size * Unit.
При использовании в шаблонах величина Size должна быть явно заданной (строка 7) и может не задаваться только для последнего сегмента поскольку в него попадает остаток данных (сродни чтению строки со start символа и до конца строки без указания нужного length количества символов).
6> Bin = >.
>
7> > = Bin,
8> Z. %переменная размером в 3 разряда, её значение 110
>
9> >.
>
10> >.
>
11> >.
>
Использую битовый синтаксис одни и те же данные могут быть описаны по разному (строки 9 и 11 описывают одну и туже двухбайтовую структуру).
1.8 Ссылка
Ссылка (Reference) представляет собой терм создаваемый функцией make_ref/0 и может считать уникальным. Она может быть использовать для такой структуры данных как первичный ключ.
Потребление памяти и ограничения. На 32-ух разрядной архитектуре требуется 5 машинных слов на одну ссылку для текущей локальной ноды и 7 слов для удаленной. На 64-ой 4 и 6 слов соответственно. Кроме того ссылка связана с таблицей нод которая также потребляет оперативную память.
1.9 Булев
Булев тип (Boolean) является псевдо типом т.к. на самом деле это всего лишь два атома true и false.
1.10 Объект-функция
Поэтому входные аргументы должны быть того же типа, что объявленные в функции. После ключевого слова when и до -> можно включать выражение результатом которого является true либо false. Тело функции выполняется в случае если выражение возвращает true. Если в ходе всех проверок тело функции так и не было выполнено (т.е. функция ни чего не вернула), то генерируется ошибка (строка 12). Переменные внутри функции являются локальными.
Функции могут быть вложенными, при этом результатом возвращаемым внешней функцией будет внутренняя:
1.11 Идентификатор процесса
Идентификатор процесса (Pid) возвращают функции spawn/1,2,3,4, spawn_link/1,2,3,4 and spawn_opt/4 при создании Эрланг процесса. Удобным механизмом взаимодействия с процессом может быть обращение к нему по имени, а не через цифровой идентификатор. Поэтому в Эрланге есть возможность связывать с Pid-ом символическое имя и в дальнейшем посылать сообщения процессу используя его имя.
Потребление памяти и ограничения. На данный тип уходит 1 машинное слово для локальных и 5 для удаленных нод. Кроме того функция связана с таблицей нод которая так же занимает память.
1.12 Идентификатор порта
Идентификатор порта ( Port Identifier) возвращает функция open_port/2 при создании порта. Порт представляет собой базовый механизм взаимодействия между Эрланг процессами и внешним миром. Он предоставляет байт ориентированный интерфейс связи с внешним программами. Процесс создавший порт называется владелец порта или процессом присоединенным к порту. Все данные проходящие через порт так же проходят и через владельца порта. После завершения процесса сам порт и внешняя программа должны так же завершиться. Внешняя программа должна представлять собой другой процесс операционной системы который принимает и отправляет данные со стандартного входа и выхода. Любой Эрланг процесс может послать данные через порт, но только владелец порта может получить данные через него. Для идентификатора порта, как и для идентификатора процесса, может быть зарегистрировано символьное имя.
Потребление памяти и ограничения. На данный тип уходит 1 машинное слово для локальных и 5 для удаленных нод. Кроме того функция связана с таблицей нод и таблицей портов которые так же занимает память.