Делаю свой домашний проект - виртуальную машину наподобие jvm. Есть текстовый файл с опкодами по типу: store 200 0 i //кладет в ячейку памяти 0 значение 200 и помечает ячейку как integer store string 1 s //кладет в ячейку памяти 1 значение string и помечает ячейку как string store a 2 c //кладет в ячейку памяти 2 значение c и помечает ячейку как char store 300 3 i //кладет в ячейку памяти 3 значение 300 и помечает ячейку как integer load 0 //загружает из ячейки памяти 0 значение в стек, тип стека задается типом первого загружаемого значение, в данном случае int load 3 //загружает из ячейки памяти 3 значение в стек add //складывает значения в стеке store 4 //результат который остался от сложения берет из стека и кладет в ячейку 4 Код store 200 0 i //кладет в ячейку памяти 0 значение 200 и помечает ячейку как integer store string 1 s //кладет в ячейку памяти 1 значение string и помечает ячейку как string store a 2 c //кладет в ячейку памяти 2 значение c и помечает ячейку как char store 300 3 i //кладет в ячейку памяти 3 значение 300 и помечает ячейку как integer load 0 //загружает из ячейки памяти 0 значение в стек, тип стека задается типом первого загружаемого значение, в данном случае int load 3 //загружает из ячейки памяти 3 значение в стек add //складывает значения в стеке store 4 //результат который остался от сложения берет из стека и кладет в ячейку 4 И я столкнулся с проблемой как хранить эти ячейки памяти. Если создавать ячейки через дженерики < T >, то такие ячейки будут разными и хранить их в одном массиве не получится. Если бы так работало, то можно было бы получать доступ к ячейке просто по индексу и вызывать в ней метод get который возвращал тот тип данных который хранит ячейка. Потом я подумал хранить ячейки в массиве object, но это плохая идея так как все равно придется приводить к типу ячейки, приведение типов не безопасно. Да и конвертация в object и обратно занимает время просто так, неэффективно. Далее я подумал сделать ячейку универсальной и дать ей поля всех нужных типов данных: int float char string bool, но тогда получается когда в ячейку помещается значение оно хранится в одном из 5 полей, остальные 4 поля пустые и неинициализированные, что не есть хорошо. Еще была идея создать 5 массивов, каждый для своего типа ячеек, например массив MemArrInt[] хранит ячейки MemCellInt которые имеют поле int для хранения данных, но мне эта идея показалась неправильной и костыльной и что будто есть нормальный путь сделать задуманное. Если тут есть хорошо разбирающиеся в C# и в целом архитектуре языков программирования, подскажите пожалуйста идею как это все можно было бы реализовать по вашему. Или если вы знаете источники где это хорошо описано прошу поделиться. Заранее спасибо. Если есть какие либо идеи или предложения и вам удобнее показать/рассказать это в тг, то пожалуйста, буду ждать вас там.
Host1, Игрушечная память должна представлять собой byte[] или sbyte[] (это если у тебя 8 разрядная шина адреса), если 32 разрядная то соответственно uint[] или int[] . Если твоя "виртуальная структура" занимает больше места чем ячейка памяти ее надо хранить в нескольких ячейках
vtlstolyarov, Просто как хранить это. Например у меня есть класс который читает файл с опкодами операций. И вот например он получает store 200 0 i. Как хранить это? Как это хранится в подобных джаве языках с виртуальной машиной? Просто я вот то что придумал архитектуру которую описал с использованием MemoryCell которая сама по себе класс с полем value. Может мой подход неверен и чтобы все было нормально его в корне нужно поменять на что-то другое? Ты предложил использовать массив байт как память. Но как в нее записывать данные и понимать где они? Там же все подряд будет. Объясни пожалуйста, наверно твоя идея правильная я просто не до конца ее понял. И еще вопрос заранее тогда. Как в таком массиве байт хранить string, int, float, bool, char? Например я получу строку store 200 0 i, парсер разобьет все на части и получит строку "200" которую нужно будет конвертировать в байты, чтобы поместить в массив байт(память), но как сохранить понимание того что это int. Просто я уже пытался конвертировать подобное "500" в byte с помощью GetBytes и получался массив байт который представляет строку. Тут вероятно я тоже неправильно делал. Поправь пожалуйста и расскажи подробнее.
Host1, а как ты думаешь в компе память работает - операционная система не знает какие типы ты там хранишь. Ты когда нибудь писал на Си? знаешь как там строки хранятся? по второму вопросу - чтобы сохранить понимание того что это "инт" виртуальная машина (типа JVM или .net) хранит не читые данные, а структуру (заголовок + данные) - заголовок определяет что находится в данных