Загрузка...

How to organize the toy memory of your language?

Thread in C# created by Host1 Mar 23, 2024. 197 views

  1. Host1
    Host1 Topic starter Mar 23, 2024 Лучше бы раньше, но раньше уже закончилось 64 Aug 8, 2017
    Делаю свой домашний проект - виртуальную машину наподобие jvm. Есть текстовый файл с опкодами по типу:
    Code
    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# и в целом архитектуре языков программирования, подскажите пожалуйста идею как это все можно было бы реализовать по вашему. Или если вы знаете источники где это хорошо описано прошу поделиться. Заранее спасибо. Если есть какие либо идеи или предложения и вам удобнее показать/рассказать это в тг, то пожалуйста, буду ждать вас там.
     
    1. View previous comments (4)
    2. Host1 Topic starter
      vtlstolyarov, Понял, спасибо! Я как раз читал как сделать через массив байт. Понял что можно любые данные в байты перевести, узнать их длину по типу и записать в массив байт. И также сделать заголовок в котором будет храниться тип данных и length. Пока я остановился на том что не совсем представляю как получать эти данные обратно. Например есть 3 переменные, записанные в "память" - массив байт. Я так понял нужно сделать что-то похожее на указатели в c++. Вроде вот есть переменная а, начинается -> тут, а так как заголовок фиксированной длины, то его распечатать из байт в данные обратно, из него получить информацию о том какие данные идут дальше после него, например есть это float то у него своя длина и столько нужно прочитать. Но вот как эти "указатели" реализовать пока не понимаю. Просто так по индексу не получится так как память это массив байт и просто взять оттуда что-либо по индексу я получу 1 байт чего-то. Сможешь пожалуйста подсказать тут по моим мыслям в правильном ли направлении я думаю и как примерно такое делается
    3. vtlstolyarov
      Host1, В правильном. Указатели реализуются по индексу - просто индекс будет на первый байт заголовка а не на первый байт данных. зная индекс первого байта заголовка и то что заголовок фиксированной длины ты сожешь вычитать все байти заголовка, а потом уже зная длину данных сможшь посчитать индексы начала и конца данных и вычитать эти байты.
    4. vtlstolyarov
      Host1, хранить length данных в каждом заголовке это лишняя трата памяти - в заголовке нужно хранить только тип данных - а уже length этого типа можно хранить один раз в структуре описывающей тип - она у всех экземпляров этого типа всегда одинаковая.
    5. View the next comments (12)
Top
Loading...