Внутренний c тип против примитивного не внутреннего c тип - PullRequest
1 голос
/ 28 января 2020

В фортране я встречал слово intrinsi c type, которого я никогда раньше не слышал:

В Fortran есть пять типов данных intrinsi c: целое, реальное, сложный, логичный и характерный.

Является ли intrinsi c тем же, что и "примитив", или есть небольшое различие в значении? Что противоположно внутреннему типу c (я бы представил что-то вроде даты или десятичной дроби): как бы это назвать?

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Тип intrinsi c - это один из тех типов данных, который определен стандартом Фортрана и всегда доступен (ответ от rvbarreto содержит явную цитату определения). Что касается Fortran 2018, то это пять вопросов.

До введения Fortran 90 системы параметров типа существовал тип double precision, но теперь это не другой тип intrinsi c: он относится для типа intrinsi c real с указанным параметром вида c.

Отличие от типа intrinsi c будет выглядеть примерно так: тип, который всегда доступен, но определяется конкретным процессором (компилятор) вместо. Одним примером может быть byte тип данных.

Кроме того, существуют производные типы данных . Они не являются внутренними c и могут быть определены пользователем или процессором. Производный тип, такой как c_ptr, может быть определен стандартом Fortran, но, поскольку он определен в модуле intrinsi c iso_c_binding, он не всегда доступен: это не тип intrinsi c.

Производный тип данных, определенный пользователем, может выглядеть примерно так:

type :: date
   real :: seconds_since_epoch
end type date

type :: decimal(digits)
   integer, kind :: digits
   integer :: value(digits)
end type decimal

Они не всегда будут доступны (определяются пользователем) и не определяются стандартом.


Термин nonintrinsi c определяется стандартом, но это не относится к типам данных (просто к модулям и процедурам). Не существует определенного термина для «типов данных, которые не являются внутренними c». Мы можем использовать производный тип или нестандартный тип в зависимости от того, какой случай выше мы хотим отловить. С «примитивом» можно быть более склонным к нестандартному типу данных, определенному процессором.

Рассмотрим:

real a ! Intrinsic
byte b ! Non-standard 'primitive' perhaps (if supported)
type(byte) c ! Derived type, non-standard/user
type(c_ptr) d ! Standard (if referring to that of iso_c_binding)
type(real) e ! Intrinsic!
double precision f ! Intrinsic (real)
2 голосов
/ 28 января 2020

Стандарт Fortran определяет intrinsi c (как правило, не только для типа) как:

1.3.93

intrinsi c

тип, процедура, модуль, назначение, оператор или операция ввода / вывода, определенные в этой части ISO / IEC 153917 и доступные без дополнительного определения или спецификации, или процедуры или модуль, предоставляемый процессором, но не определенный в этой части ISO / IEC 1539.

Кроме того, он определяет тип intrinsi c следующим образом:

1.3.147.8

intrinsi c тип

тип, определенный этой частью ISO / IEC 1539, который всегда доступен.

Таким образом, основное различие между типом intrinsi c и производным типом состоит в том, что необходимо импортировать библиотеку, чтобы использовать последнюю. (Ранее я привел пример non-intrinsi c с использованием real (real64) из библиотеки ISO_FORTRAN_ENV, но, как указывал в комментариях francescalus, это не так.)

Возможно, вы также захотите проверить сессию 4.4 Стандарта, в которой подробно рассматриваются встроенные типы c. Стандартная версия Fortran , имеющаяся у меня , является неофициальной и не самой последней, но самые последние соответствуют старой в рамках философии Fortran.

Я не нашел соответствия primitive в стандарте Фортрана, поэтому я считаю, что эта номенклатура не используется в Фортране. Я также проверил стандарт C и не смог найти ничего официального, но каждое определение, которое я нахожу для термина в других языках - например, в Java - в основном определяет его как тип, который поставляется с языком, то есть intrinsi c. :)

Возможно, вы ищете различие в том, что, хотя real является типом intrinsi c в Fortran, double precision не является:

Спецификатор типа для реальный тип использует ключевое слово REAL. Ключевое слово DOUBLE PRECISION является альтернативным спецификатором для одного типа реального типа. Если ключевое слово типа REAL используется без параметра типа вида, то указывается реальный тип с реальным типом по умолчанию, а значением типа является KIND (0.0). Спецификатор типа DOUBLE PRECISION определяет тип real с типом двойной точности; значение типа KIND (0.0D0). Десятичная точность метода реальной аппроксимации с двойной точностью должна быть больше точности метода по умолчанию.

Однако в других языках такие типы, как short и long, могут пониматься как различные примитивы.

...