Представление массивов и записей в байт-код - PullRequest
0 голосов
/ 11 января 2011

Я создаю язык программирования с нуля на C, и я предпочел бы не использовать сторонний код для обработки переменных.

Во-первых, каков наилучший способ представления назначений массива, например apples_in_crate[5] = 170, в форме байт-кода?

Очевидно, apples = 170 может быть представлен как:

PUSHSCALAR ("apples")
PUSHREAL (170)
ASSIGNSCALAR

, но все становится намного сложнее, когда дело доходит до массивов.Любые предложения?

Во-вторых, как бы вы представили crate[5].apples = 170 (запись) в байт-коде?

Любая помощь будет оценена.

Уточнение: я пишуинтерпретатор, поэтому размер массива не известен во время компиляции или синтаксического анализа.Например, следующий (абстрактный) код будет вполне допустимым:

// Note: NUMBER_OF_CRATES is not known at compile-/parse-time,
// it could even be a dynamic expression.
array apples_in_crate[NUMBER_OF_CRATES]

for crate = 1 to NUMBER_OF_CRATES
   apples_in_crate[crate] = randint (101) + 100
end for

Ответы [ 2 ]

0 голосов
/ 11 января 2011

В качестве примера Вот , как оно представлено на виртуальной машине Java.

0 голосов
/ 11 января 2011

Это полностью зависит от вашего байт-кода. Насколько статичны ваши структуры? Если все сделано во время компиляции (примерно как в C и C ++), вы знаете размер каждого элемента apple_in_create, так что вы можете сначала нажать кнопку apple_in_create, затем добавить 5 * sizeof (elements) к этому значению, а затем присвоить 170 по этому адресу.

То же самое относится и ко второму примеру: нажмите ящик, добавьте 5 * sizeof (Ящик), добавьте offset_of (яблоки), присвойте значение.

Теперь, если вы хотите, чтобы вещи были более гибкими (скажем, если вы хотите учесть такие вещи, как рефлексия), вам нужно, чтобы ваша система была лучше осведомлена о ваших типах данных во время выполнения. Но без дополнительной информации о том, каким должен быть ваш байт-код, трудно дать вам больше советов.

...