C управление памятью для Межплатформенного VM

Нет, нет способа применить значение к формату из файла макета - только в Java. Извините!

6
задан Community 23 May 2017 в 12:30
поделиться

3 ответа

Тангенциальные комментарии

Эти первые элементы касаются заданных вами вопросов, но ...

// Execute
void (*NativeFunction)(char*, char*) = &Plus;
NativeFunction(Params, Result); // Call the function

Я думаю, вам, вероятно, следует использовать 'void *' вместо 'char *' Вот. У меня также есть typedef для типа указателя функции:

typedef void (*Operator)(void *params, void *result);

Тогда вы можете написать:

Operator NativeFunction = Plus;

Фактическая функция тоже будет изменена - но очень незначительно:

void Plus(void *pParams, void *pResult)

Кроме того, у вас есть небольшая проблема с именованием - эта функция это 'IntPlusDoubleGivesDouble ()', а не функция общего назначения 'добавить любые два типа'.


Прямые ответы на вопросы

1). Если я знаю размер типов, есть ли способ изменить функцию push и pull для точной синхронизации с заполнением структуры? (измените, чтобы компилятор позаботился об этом, как о задачах Datasize и Endians.)

Это не простой способ сделать это. Например, рассмотрите:

struct Type1
{
     unsigned char byte;
     int           number;
};
struct Type2
{
     unsigned char byte;
     double        number;
};

На некоторых архитектурах (например, 32-разрядная или 64-разрядная SPARC) структура Type1 будет иметь «число», выровненное по 4-байтовой границе, но структура Type2 будет иметь «число», выровненное по 8-байтовой границе. граница байта (и может иметь «длинное двойное» на границе 16 байтов). Ваша стратегия «проталкивать отдельные элементы» будет увеличивать указатель стека на 1 после нажатия значения «байта», поэтому вы захотите переместить указатель стека на 3 или 7 перед нажатием «числа», если указатель стека еще не установлен должным образом. выровнен. Часть вашего описания виртуальной машины будет содержать необходимые выравнивания для любого данного типа; соответствующий код толкания должен будет гарантировать правильное выравнивание перед нажатием.

2). Если я упаковываю структуру по одной (используя #pragma pack (1)); (2.1) Будет ли приемлемо снижение производительности? и (2. 2) Будет ли под угрозой стабильность программы?

На машинах x86 и x86_64, если вы упаковываете данные, вы понесете штраф за производительность из-за несогласованного доступа к данным. На таких машинах, как SPARC или PowerPC (согласно mecki ) вместо этого вы получите ошибку шины или что-то подобное - вы должны получить доступ к данным при их правильном выравнивании. Вы можете сэкономить немного места в памяти за счет снижения производительности. Лучше обеспечить производительность (что здесь включает «правильную работу вместо сбоев») с минимальными затратами в космосе.

3). Как насчет отступов на 2,4 или 8? Что должно быть подходящим для общей 32- или 64-битной системы?

В SPARC вам нужно дополнить N-байтовый базовый тип до N-байтовой границы. На x86 вы получите лучшую производительность, если сделаете то же самое.

4). Можете ли вы дать мне документацию по точному алгоритму заполнения, скажем, для GCC на x86?

Вам нужно будет прочитать руководство .

5). Есть ли способ лучше?

Обратите внимание, что трюк «Type1» с одним символом, за которым следует тип, дает вам требование выравнивания - возможно, с использованием макроса «offsetof ()» из :

offsetof(struct Type1, number)

Что ж, я бы не стал упаковывать данные в стек - я бы работал с нативным выравниванием, потому что он настроен на максимальную производительность. Писатель компилятора не добавляет к структуре пустые поля; они поместили его туда, потому что он «лучше всего подходит» для архитектуры. Если вы решите, что знаете лучше, вы можете ожидать обычных последствий - более медленные программы, которые иногда терпят неудачу и не столь переносимы.

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

2
ответ дан 17 December 2019 в 07:06
поделиться

Здесь есть несколько очень хороших вопросов, многие из них будут связаны с некоторыми важными проблемами дизайна, но для большинства из нас - мы можем видеть, над чем вы работаете (осторожно только что отправили, когда я пишу чтобы вы могли видеть, что вы вызываете интерес) мы можем достаточно хорошо понимать ваш английский, поэтому вы работаете над некоторыми проблемами компилятора и некоторыми проблемами языкового дизайна - становится трудно решить этот вопрос, но в том, что вы уже работаете в JNI, есть надеюсь ...

Во-первых, я бы попытался уйти от прагм; Многие, очень многие не согласятся с этим. Для канонического обсуждения того, почему см. Обоснование позиции языка D. Во-вторых, в вашем коде похоронен 16-битный указатель.

Проблемы почти бесконечны, хорошо изучены, и, вероятно, похоронят нас в оппозиции и внутренней непримиримости. Если я могу предложить прочитать домашнюю страницу Кеннета Лаудена , а также руководство по архитектуре Intel. Он у меня есть, я попытался прочитать. Выравнивание структур данных, а также многие другие вопросы, которые вы ставите на обсуждение, глубоко укоренились в исторической науке о компиляторах и, вероятно, вас затопят неизвестно чем. (сленг или идиоматика для непредвиденных последствий)

С учетом сказанного, вот и:

  1. Размеры C-типа Наряду со многими другими вопросами, которые вы выносите на обсуждение, глубоко укоренились в исторической науке о компиляторах и, скорее всего, вас затопят неизвестно чем. (сленг или идиоматика для непредвиденных последствий)

    С учетом сказанного, вот и:

    1. Размеры C-типа Наряду со многими другими вопросами, которые вы выносите на обсуждение, глубоко укоренились в исторической науке о компиляторах и, скорее всего, вас затопят неизвестно чем. (сленг или идиоматика для непредвиденных последствий)

      С учетом сказанного, вот и:

      1. Размеры C-типа Какие размеры шрифтов?
      2. Инженер-компьютерщик до перехода на Инженер-программист Вы когда-нибудь изучали микроконтроллеры? Предлагаю взглянуть на некоторые работы Дона Ланкастера.
      3. Паскаль, Delphi, а теперь и Java и PHP. программист. Those are comparatively removed from the base fundamental architecture of processors, though plenty of persons will show or try to show how they can be used to write powerful and fundamental routines. I suggest looking at David Eck's recursive descent parser to see exactly how to begin study of the matter. As well, Kenneth Louden has an implementation of "Tiny" which is an actual compiler. I found something not too long ago that I think was called asm dot org ... very advanced, very powerful work was available for study there but it is a long haul to start writing in assembler intending to get into compiler science. Additionally, most architectures have differences that are not consistent from one processor to another.
      4. accessing existing library

      There are many libs around, Java has some good ones. I don't know about the others. One approach is to try to write a lib. Java has a good base and leaves room for people like to to try to come up with something better. Start with improving Knuth-Morris-Pratt or something: There is just no shortage of places to start. Try Computer Programming Algorithms Directory and for sure, look at Dictionary of Algorithms and Data Structures at NIST

      1. always_inline

      Not necessarily, see Dov Bulka - the worker holds a Doctorate in CS and as well is a proficient author in areas where time-efficiency / reliability-robustness and so on are not subject to some of the "business model" paradigm wherefrom we get some of the "Oh! that doesn't matter" on issues that actually do matter.

      As a closing note, instrumentation and control comprise over 60% of the actual market for accomplished programming skills as you describe. For some reason, we hear mostly about the business model. Let me share with you and inside tidbit I have from a reliable source. From 10% to 60% or more actual safety and property risk comes from vehicular issues than comes from burglar, theft and that sort of thing. You will never hear appeals for "90 days bustin minerals at the county mineral extraction faciltiy!" for traffic tickets, in fact most people do not even realize traffic citations are ( N.A. - U.S.A. ) class 4 misdemeanor and are actually classifiable as such.

      Sounds to me like you have taken a good step towards some good work, ...

1
ответ дан 17 December 2019 в 07:06
поделиться

Интересный пост, показывающий, что вы много поработали. Почти идеальный пост SO.

У меня нет готовых ответов, так что терпите меня. Придется задать еще несколько вопросов: P

1). Если я знаю размер типов, есть ли способ изменить функцию push и pull для точной синхронизации с заполнением структуры? (измените, чтобы компилятор позаботился об этом, как о задачах Datasize и Endians.)

Это только с точки зрения производительности? Планируете ли вы ввести указатели вместе с собственными арифметическими типами?

2). Если я упаковываю структуру по одной (используя #pragma pack (1)); (2.1) Будет ли приемлемо снижение производительности? и (2. 2) Будет ли под угрозой стабильность программы?

Это зависит от реализации. Не то, на что можно рассчитывать на разных платформах.

3). Как насчет отступов на 2,4 или 8? Что должно быть подходящим для общей 32- или 64-битной системы?

Значение, которое соответствует собственному размеру слова, должно обеспечить оптимальную производительность.

4). Можете ли вы подсказать мне документацию по точному алгоритму заполнения, скажем, для GCC на x86?

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

Обратите внимание, что вы можете указать атрибуты переменных с помощью GCC (который также имеет что-то под названием default_struct __attribute __ (( упаковано)) отключает заполнение).

3). Как насчет отступов на 2,4 или 8? Что должно быть подходящим для общей 32- или 64-битной системы?

Значение, которое соответствует собственному размеру слова, должно обеспечить оптимальную производительность.

4). Можете ли вы подсказать мне документацию по точному алгоритму заполнения, скажем, для GCC на x86?

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

Обратите внимание, что вы можете указать атрибуты переменных с помощью GCC (который также имеет что-то под названием default_struct __attribute __ (( упаковано)) отключает заполнение).

3). Как насчет отступов на 2,4 или 8? Что должно быть подходящим для общей 32- или 64-битной системы?

Значение, которое соответствует собственному размеру слова, должно обеспечить оптимальную производительность.

4). Можете ли вы подсказать мне документацию по точному алгоритму заполнения, скажем, для GCC на x86?

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

Обратите внимание, что вы можете указать атрибуты переменных с помощью GCC (который также имеет что-то под названием default_struct __attribute __ (( упаковано)) отключает заполнение).

Можете ли вы подсказать мне документацию по точному алгоритму заполнения, скажем, для GCC на x86?

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

Обратите внимание, что вы можете указать атрибуты переменных с помощью GCC (который также имеет что-то под названием default_struct __attribute __ (( упаковано)) отключает заполнение).

Можете ли вы подсказать мне документацию по точному алгоритму заполнения, скажем, для GCC на x86?

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

Обратите внимание, что вы можете указать атрибуты переменных с помощью GCC (который также имеет что-то под названием default_struct __attribute __ (( упаковано)) отключает заполнение).

1
ответ дан 17 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: