Можно ли получить эти адреса памяти в прологе gnu?

В основном я пытаюсь смоделировать разыменование указателя C, используя gnu-prolog.

Вот код:

Пролог

:-foreign(fun(+integer,-integer)).

% p = &b;
testfun(Var, Val) :- fun(Val, Var).

main :-
A is 1,
testfun(A, P),
write(P),

C:

#include <gprolog.h>
#include <string.h>

PlBool fun(int ptr, int* res){
    *res = &ptr;                  // this is wrong
    if(res==NULL){
      return PL_FALSE;
    }else{
      return PL_TRUE;
    }
}

Так что в основном это неправильно, потому что ptr — это просто временная переменная в стеке, и ее память будет освобождена после вызова fun.

Итак, мой вопрос: возможно ли получить адреса памяти переменных в прологе gnu (например, в этом случае это адрес A, а не адрес ptr)?


person lllllllllllll    schedule 13.04.2014    source источник
comment
Я думаю, что если это строго входной аргумент, он передается по значению, и вы не можете получить его указатель из функции.   -  person lurker    schedule 13.04.2014
comment
@lurker Но можем ли мы получить адрес памяти A другими способами?   -  person lllllllllllll    schedule 13.04.2014
comment
Зачем вам адрес A? Я не думаю, что Prolog дает доступ к своим внутренним адресам, особенно через вызов функции C. Даже в случае, когда у вас есть выходной аргумент, такой как int *res, руководство GNU говорит: ... целое число, хранящееся в этом месте, объединено с Arg., поэтому оно не выглядит прямым указателем. к переменной, которую Пролог поддерживает внутри.   -  person lurker    schedule 13.04.2014
comment
@lurker Ну ... в основном я хочу использовать переменные A для имитации в C, и мне приходится иметь дело с проблемами указателя ..   -  person lllllllllllll    schedule 13.04.2014
comment
Например, у меня есть P и A, и я хочу использовать P для представления указателя на языке C, поэтому мне нужно найти способ заставить P хранить адрес памяти A.   -  person lllllllllllll    schedule 13.04.2014
comment
@lurker, если это невозможно, то, думаю, мне нужно использовать карту или что-то еще, чтобы смоделировать отношение ссылки на память ...   -  person lllllllllllll    schedule 13.04.2014
comment
Я вижу, да, это может быть правильным подходом.   -  person lurker    schedule 13.04.2014
comment
@lurker В настоящее время проблема заключается в том, что для тривиальных случаев это относительно просто, но в некоторых случаях, например, использование указателя с (pointer ++) для итерации массива, на который указывает указатель, тогда это кажется невыполнимым ...   -  person lllllllllllll    schedule 16.04.2014
comment
Чего вы пытаетесь достичь в целом? Для моделирования процессора или вычислительного языка я бы не стал рассматривать Prolog как предпочтительный язык для этой работы, если только он каким-то образом не включает множество эвристических решений, основанных на выборе. Вероятно, все выполнимо, но это может быть очень неэффективно.   -  person lurker    schedule 16.04.2014
comment
Под переносом вы имеете в виду автоматическое преобразование программы C в Prolog? Ваш начальник знает Пролог? Насколько полным должно быть это преобразование языка C? Это может занять очень много времени. А поскольку Пролог плохо подходит для императивной задачи программирования такого масштаба, она будет трудной, а результаты будут неэффективными.   -  person lurker    schedule 16.04.2014
comment
@lurker Да, мы пытались сделать это автоматически ... Я думаю, он каким-то образом знает Пролог ... Что ж, это может быть сложно и неэффективно, но мы все же можем получить некоторую пользу от этого преобразования.   -  person lllllllllllll    schedule 16.04.2014
comment
@lurker Что касается всего, в настоящее время мы просто нацелены на какой-то простой код GNU coreutils.   -  person lllllllllllll    schedule 16.04.2014
comment
Тяжелая работа всегда ведет к некоторому обучению. :) Вы переходите от языка, который дает вам тесную связь с аппаратным обеспечением, к языку, который гораздо более абстрагирован и не устанавливает этой связи. В Прологе нет указателей или адресов переменных и т.д. Таким образом, это ведет к моделированию всей архитектуры адресов, а затем к переменным, которые могут хранить этот адрес, и к какой-то структуре, представляющей ячейки памяти (например, возможно, список чисел). Весело. :)   -  person lurker    schedule 16.04.2014
comment
@lurker Да, спасибо за добрый совет! Пока я могу чему-то научиться из всего процесса, это имеет смысл :)   -  person lllllllllllll    schedule 16.04.2014


Ответы (1)


Gnu Prolog довольно легко расширить, написав подпрограммы C и соединив их в исполняемый. но если вы пытаетесь «симулировать отношение ссылки на память», то я сомневаюсь, что взлом реальной функции адреса памяти будет полезен.

Вместо этого, как предлагает @lurker, вы, вероятно, захотите «симулировать» архитектуру памяти/компьютера, а затем какой-нибудь C-подобный язык, который «выполняется» на нем. Это звучит немного амбициозно, но моделирование ЦП в Прологе уже спрашивали, и недавно здесь спросил о вас, с ответом люркера.

person hardmath    schedule 13.04.2014
comment
Привет hardmath, спасибо за ответ! Потому что в настоящее время единственная проблема заключается в том, что я не знаю адрес памяти переменных Prolog, поэтому я думаю, что могу просто поддерживать карту указателя Prolog и переменных, на которые они указывают... Кажется, это может решить проблему. Am Я прав? - person lllllllllllll; 13.04.2014
comment
По моему скромному мнению, моделирование архитектуры памяти/компьютера может быть излишним. - person lllllllllllll; 13.04.2014
comment
Ваша способность знать адрес памяти переменных Prolog зависит от некоторых предостережений. Как вы, несомненно, знаете, все переменные Пролога существуют внутри стекового фрейма, который можно использовать повторно. Хотя вы можете вызвать функцию C, которая возвращает адрес переменной Пролога в виде числового значения, этот адрес может не только устареть, но даже до этого я не понимаю, для чего вы можете использовать его в коде Пролога вашей программы. Указатели полезны в C в значительной степени из-за их роли в рекурсии, а Пролог обрабатывает рекурсию без указателей. - person hardmath; 13.04.2014
comment
Если цель состоит в том, чтобы просто сказать, что я получил адрес переменной Пролога, взгляните на ссылку, которую я дал для связывания Пролога и C. Я использовал это, и это было совсем не сложно (учитывая хороший опыт в оба языка). - person hardmath; 13.04.2014