Нужен автокод - иностранцам вежливо настраивать язык кириллический

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Первая реализация. Исходники.

Сообщений 61 страница 63 из 63

1

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

main.r
Код:
 
#вставка    "library.h" 
#вставка 	<locale.h> 	//Во избежание "крокозяблей" на выводе
#вставка 	<stdio.h> 	//Стандартный однобайтовый ввод-вывод
#вставка 	<wchar.h> 	//"Широкие" многобайтовые символы и их ввод-вывод
#вставка 	<wctype.h> 	//"Классификация" широких символов

#вставка	"vm.h"    //Внешний интерфейс виртуальной машины

// при подключении файлов из других папок будьте внимательны с путями,
// так как перед компиляцией С/С++ файлы будут находится в папке .src/
 
цел main()
{
    //включение всех локалей
	setlocale(LC_ALL, "");
	system("cls");
	пчтф16(L"Новый проект.\n");
	
	//в переменной типа ТВМ "упакована" все внутреннее устройство ВМ:
	// регистры, стек, память указатели и тд. 
	ТВМ* ВМ1 = создать_ВМ();
	
	// программа состоящая их одной тестовой инструкции. 
	б64 программа = 16"FFFF;
	//Тут требуется подумать. Программа загружается как массив байтов. 
	загрузить_ВМ(ВМ1,(симв*) &программа, (симв*)((&программа)+1));
	//Наверное, имеет смысл совсместить загрузку и старт программы в одной инструкции.
	старт_ВМ(ВМ1);
	// освобождаем динамически выделенную память под ВМ.
	закрыть_ВМ (ВМ1);
	читз();
	вернуть 0;  
}	

В следующих двух файлах описана интерфейсная часть ВМ. То есть, какие функции доступны нам для использования ВМ.

vm.rh vm.r
Код:
#если_нет 	VM_H
#макрос	  	VM_H	
//===========================================================
// 	Файл:    vm.rh
// 	Версия:    1.00
// 	Дата:    17.06.2022
//	Описание:	Описание внешнего интерфейса виртуальной машины (ВМ)
//        доступ к внутренним структурам ВМ извне напрямую запрещен
//	Автор:
//===========================================================

тип структура ТВМ ТВМ;
 
// Внешний интерфейс управления виртуальной машиной
ТВМ* создать_ВМ();        // конструктор
пуст закрыть_ВМ(ТВМ* эта_ВМ);	// деструктор
пуст загрузить_ВМ(ТВМ* эта_ВМ, симв * старт_адрес, симв* стоп_адрес);	// загрузка программы в байт-кодах в ВМ
пуст старт_ВМ(ТВМ* эта_ВМ);    // запуск работы ВМ

 

#к_если    //VM_H

Код:
//===========================================================
// 	Файл:    vm.r
// 	Версия:    1.00
// 	Дата:    17.06.2022
//	Описание:	Реализация интерфейса виртуальной машины (ВМ)
//        доступ к внутренним структурам ВМ извне напрямую запрещен
//	Автор:
//===========================================================
#вставка    "library.h" 
#вставка	"vm.h"
#вставка	"vm_core.h"

// Конструктор виртуальной машины
ТВМ* создать_ВМ()
{
	ТВМ* врем = (ТВМ*) malloc (sizeof(ТВМ));
	/****начало тестового блока****/
	врем->имя[0] = 'V';
	врем->имя[1] = 'M';
	врем->имя[2] = '1';
	врем->имя[3] = '\n';
	врем->имя[4] = '\0';
	/****конец тестового блока****/
	вернуть врем;
}
// Деструктор виртуальной машины
пуст закрыть_ВМ(ТВМ* эта_ВМ)
{
	free(эта_ВМ);
}
// загрузка программы в байт-кодах в ВМ
пуст загрузить_ВМ(ТВМ* эта_ВМ, симв * старт_адрес, симв* стоп_адрес)
{
	эта_ВМ->РЕГИСТР_А = *((б64*) старт_адрес);
}	

//Запуск виртуальной машины
пуст старт_ВМ(ТВМ* эта_ВМ)
{
	/****начало тестового блока****/
	пчтф(эта_ВМ->имя);
	если (эта_ВМ->РЕГИСТР_А == 16"FFFF){
    пчтф16(L"Выполнена тестовая инструкция!\n");
	}
	/****конец тестового блока****/
}

А теперь начало реализации самой ВМ.

vm_core.rh
Код:
#если_нет 	VM_CORE_H
#макрос	  	VM_CORE_H	
//===========================================================
// 	Файл:    vm_core.rh
// 	Версия:    1.00
// 	Дата:    17.06.2022
//	Описание:	Описание внутреннего устройства виртуальной машины (ВМ)
//	Автор:
//===========================================================
#макрос РЕГИСТР_А регистры[0]
#макрос РЕГИСТР_Б регистры[1]
#макрос РЕГИСТР_В регистры[2]
#макрос РЕГИСТР_Г регистры[3]
#макрос РЕГИСТР_Д регистры[4]
#макрос РЕГИСТР_Е регистры[5]
#макрос РЕГИСТР_Ж регистры[6]
#макрос РЕГИСТР_З регистры[7]
#макрос РЕГИСТР_И регистры[8]
#макрос РЕГИСТР_К регистры[9]
#макрос РЕГИСТР_Л регистры[10]
#макрос РЕГИСТР_М регистры[11]
#макрос РЕГИСТР_Н регистры[12]
#макрос РЕГИСТР_О регистры[13]
#макрос РЕГИСТР_П регистры[14]
#макрос РЕГИСТР_Р регистры[15]

// Структура,описывающая виртуальную машину
структура ТВМ {
 	симв имя[10];
 	б64 регистры[16];
 	
 };

#к_если    //VM_CORE_H

0

61

Евгений написал(а):

придется использовать уникальные префиксы и суффиксы

Тогда лучше .so-файлы с разными именами, но одинаковыми именами функций...
имена .so файлов хотя бы видно в файловой системе.

Отредактировано Лис (2023-03-12 02:13:37)

0

62

Добавил новую ветку, в которой проект преобразован в мультипроект.
Более подробную информацию смотри тут.

0

63

1) Как написать виртуальную машину?

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

А как это сделано в сказочной колеснице?

2) Я прочитал страницу
https://tvoygit.ru/stein47/russian-virt … c_rus/vm.r

Ну, примерно всё так и есть, распределение памяти, считывание файла,

Наблюдения:
2.1) Идея использовать макрос для того, чтобы разобрать поле „режим адресации” спорная (то есть по-моему неправильная).
Потому что если дальнейший план - реализовать кириллический язык и на него переписать эту виртуальную машину,
то получается, что к языку потребуется макропроцессор.
Мне кажется, это лишнее, в современных компиляторах функции макропроцессора минимизируют, формализовывают
и встраивают разными другими способами.
Поэтому надо было как-то по другому это оформлять, подпрограммами или ещё как-то.
И тут можно провести аналогии между текстом программы и строением физического процессора. Блоки управления адресом, шинами и АЛУ - разные устройства.
2.2) нет никаких переходов (регистр счётчика команд только инкрементируется).
2.3) у файла нет формата (примерно как у .com-файла), и адресом старта берётся просто первая инструкция в файле.
анализ его формата для определения адресов (нет формата - нет анализа).

Вот сообщение, объясняющее, почему сделано именно так в пункте 2.1:
О быстродействии ВМ и оптимизации кода

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

Отредактировано Лис (2025-09-26 03:23:12)

0