Нативные типы
Нативные типы данных
Нативными (машинными) данными могут быть как переменные, так и функции, а имя нативных объектов начинается на символ процента “%”.
В случае переменных, это двоичные данные, которые располагаются в одной неразрывной области машинной памяти по определенному адресу и имеют строго определенный формат.
Чтобы использовать уже существующие библиотеки, нужно либо импортировать нативный объект, тем самым создав объкт NewLang, но с реализацией на другом языке, например на С/С++, либо сделать предварительное определение (декларацию) нативного объекта.
Импорт нативных объектов
Синтаксис импорта нативных объектов такой же, как и для создания обычных объектов языка, только в качестве правого операнда в операторе создания требуется указать имя нативнного объекта.
При импорте нативного объекта необходимо всегда указывать типы переменных, а также типы аргументов и возвращаемых значений для функций.
Если типы данных у создаваемого и нативного объекта совпадают (т.е. не требуется преобразование типов), то нативное имя объекта можно указать с многоточием, которое означает, что типы данных будут повторять заданные у левого операнда.
При импорте объектов, типы аргументов автоматически преобразуются в нативный тип, указанный у импортируемого объекта, а импорт может быть выполнен во время компиляции программы или во время выполнения программы, например при динамической загрузке библиотеки.
:FILE ::= :Plain;
fopen(filename:StrChar, modes:StrChar):FILE ::= %fopen...;
fclose(f:FILE):Int32 ::= %fclose...;
fflush(f:FILE):Int32 ::= %fflush...;
fprintf(f:FILE, format:FmtChar, ...):Int32 ::= %fprintf...;
fremove(filename:String):Int32 ::= :Native('%remove...');
frename(old:String, new:String):Int32 ::= :Native('%rename...');
Предварительное объявление нативных объектов
Синтаксис предварительного импорта нативных объектов такой же, как и для создания обычных объектов языка, но имя нативного объекта должно быть левым оператором, а с правой стороны оператора создания указывается символ многоточия. Где конкретно создается указанный нативный объект (в библиотеке С++ или в прогамме NewLang) не имеет значения. Лишь бы данный объект был найден при окончательной линковке программы.
Вызовы предварительно объявленных нативных функций выполняется напрямую, но для этого типы аргументов должны быть нативными типами и указаны в явном виде.
%open(path:StrChar, flags:Int32):Int32 := ...;
%close(fd:Int32):Int32 := ...;
%read(fd:Int32, buf:Buffer, cnt:SizeT):SizeT := ...;
/*
int fd, sz;
char* c = (char*)calloc(100, sizeof(char));
fd = open("foo.txt", O_RDONLY);
if (fd < 0) {
perror("r1");
exit(1);
}
sz = read(fd, c, 10);
printf("called read(% d, c, 10). returned that"
" %d bytes were read.\n",
fd, sz);
c[sz] = '\0';
printf("Those bytes are as follows: % s\n", c);
*/
%fd^:Int32 ::= 0;
%sz^:SizeT ::= 0;
%buf^:StrChar ::= StrChar( :Tensor[100](0, ... ) );
fd = %open("foo.txt", O_RDONLY);
if (fd < 0) {
@perror("r1");
@exit(1);
}
sz = %read(fd, buf, 10);
%printf("called read(%d, buf, 10). returned that"
" %d bytes were read.\n",
fd, sz);
buf[sz] = 0';
%printf("Those bytes are as follows: %s\n", :Pointer(buf));
Последующее описание находится в процессе разработки.
:Pointer — указатель на системную область памяти или нативную функцию
Так как любой программе приходится взаимодействовать с внешним миром, то по неволе приходится закладывать возможность использования других библиотек и системы типов данных, и для этих целей служит тип :Pointer. Он создается при импорте функций из внешних библиотек и вручную адрес в памяти указать нельзя. Но его значение можно вывести, например для отладки.
:Binary Иштфкн Plain — указатель на представление данных в бинарном виде
Для взаимодействия с внешними библиотеками требуется еще и обмен данными. И для этих целей служит тип данных :Plain — который также является указателем, но на двоичное представление данных в области памяти. Конечно, если их можно представить в виде одного фрагмента.
Перечисление, структура и объединение
Некоторые типы данных являются полными аналогами нативных типов, что требуется для взаимодействия с внешними библиотеками, в том числе и для блоков кода с нативным синтаксисом.
https://habr.com/ru/companies/otus/articles/770404/
C++98: std::map, std::set, std::multimap и std::multiset
C++11: std::unordered_map, std::unordered_set, std::unordered_multimap и std::unordered_multiset
C++23: std::flat_map, std::flat_set, std::flat_multimap и std::flat_multiset
std::list, std::deque и т.д.
:Map, :MultiMap :Pair???????????????????????????????????????
:StrChar, :StrWide, :Array, :Set, :Struct, :Union, :Enum и :Optional — это такие же словари или перечисления, но на их элементы накладываются определённые ограничения. Каждый элемент должен иметь уникальное имя, а его тип данных должен быть простым, т.е. числом или строкой фиксированного размера. Типы данных :Plain могут быть представлены в двоичном виде в одной области машинной памяти и бинарно совместимы с соответствующими типами данных C/C++.