nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 18 Apr 2024 03:45



Reply to topic  [ 14 posts ] 
Язык программирования Simple 
Author Message
Senior

Joined: 28 Feb 2006 21:34
Posts: 180
Reply with quote
Post 
Shaos wrote:
Хотелось бы заполучить компилятор в байт-код и простой интерпретатор этого байткода - соответственно надо иметь чёткое описание форматов и интерфейсов - чтобы интерпретатор мог быть написан на любом языке за разумное время. Также предполагается наличие совместимости бинарных сборок старых версий с новыми - типа как в Java.


А чего мучиться - возьми мой Simple. Точнее его виртуальную машину.
Я могу переточить компилятор под Hope.


07 Apr 2010 10:24
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Post 
d_wanderer wrote:
Shaos wrote:
Хотелось бы заполучить компилятор в байт-код и простой интерпретатор этого байткода - соответственно надо иметь чёткое описание форматов и интерфейсов - чтобы интерпретатор мог быть написан на любом языке за разумное время. Также предполагается наличие совместимости бинарных сборок старых версий с новыми - типа как в Java.


А чего мучиться - возьми мой Simple. Точнее его виртуальную машину.
Я могу переточить компилятор под Hope.


Я бы взял да мне в исходниках надо :)
Да и сайт твой уже не фурыкает...

_________________
:dj: https://mastodon.social/@Shaos


07 Apr 2010 20:54
Profile WWW
Senior

Joined: 28 Feb 2006 21:34
Posts: 180
Reply with quote
Post 
Shaos wrote:
Я бы взял да мне в исходниках надо :)
Да и сайт твой уже не фурыкает...


No problem....
Куда тебе скинуть?

http://oldcomp.msk.ru/temp8.rar
Вот....


08 Apr 2010 11:03
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Post 
d_wanderer wrote:
Shaos wrote:
Я бы взял да мне в исходниках надо :)
Да и сайт твой уже не фурыкает...


No problem....
Куда тебе скинуть?

http://oldcomp.msk.ru/temp8.rar
Вот....


Там несколько каталогов - можно небольшое редми получить что есть что?

_________________
:dj: https://mastodon.social/@Shaos


08 Apr 2010 15:29
Profile WWW
Senior

Joined: 28 Feb 2006 21:34
Posts: 180
Reply with quote
Post 
Shaos wrote:
Там несколько каталогов - можно небольшое редми получить что есть что?


Краткое описание каталогов.
Каталог Simple.
LASM - реализация ассемблера. Ассемблер строит obl файлы.
LASM1 - попытка перенести на Borland CBuilder.
SMPCL - компилятор языка Simple в ассемблер WVM.
SMPCL.1 - попытка перетащить в Borland.
smpc_noret_ru.new - устойчивая версия компилятора в консольном режиме.
SMPP - препроцессор языка Simple.
SMPP1 - попытка перетащить в Borland.
В корне каталога лежит запускалка для препроцессора, компилятора и ассемблера.
Каталоги vm_conserv_gc*
Это собственно версии самой VM. Я непомню какая версия устойчивая поэтому скопировал несколько последних. Устойчивая версия сейчас в коммерческом продукте и я честно говоря позабыл ее сегодня утянуть из офиса...


Кратчайшее описание.
Для получения из исходного файла с расширением smp надо последовательно вызвать smpp, smpc и lasm.

Кстати, унификация у меня есть. На Simple.


09 Apr 2010 08:06
Profile
Senior

Joined: 28 Feb 2006 21:34
Posts: 180
Reply with quote
Post 
Code:
// пролог

#define LISTK %(((отец маша эрнест)) \
           ((мать маша вика)) \
           ((отец давид арнольд)) \
           ((мать давид лена)) \
           ((отец настя давид)) \
           ((мать настя маша)) \
           ((дедушка (var дедушка) (var внук)) \
            (родитель (var дедушка) (var родитель)) \
            (родитель (var родитель) (var внук))) \
           ((родитель (var родитель) (var ребенок)) \
            (мать (var родитель) (var ребенок))) \
           ((родитель (var родитель) (var ребенок)) \
            (отец (var родитель) (var ребенок))))

#define LISTL %(((отец маша эрнест)) \
           ((мать маша вика)) \
           ((отец давид арнольд)) \
           ((мать давид лена)) \
           ((отец настя давид)) \
           ((мать настя маша)) \
           ((родитель (var родитель) (var ребенок)) \
            (мать (var родитель) (var ребенок))))

global программа1;

define поменяй_имена(терм, уровень) {
declare ret;
cond {
  (переменная?(терм)) do ret:=append(терм, уровень);
  (atomp(терм)) do ret:=терм;
        do ret:=cons(поменяй_имена(car(терм), уровень),поменяй_имена(cdr(терм), уровень));
};
ret;
};

define докажи (предикаты, связи, программа, уровень) {
declare ret;

print("докажи");
princ("предикаты=");print(предикаты);
cond {
  (предикаты=nil) do { выведи_связи(связи, связи); ret:=true; };
                    do ret:=докажи_каждый(программа, программа, cdr(предикаты), car(предикаты), связи, уровень);
};
princ("конец докажи ret=");print(ret);
ret;
};

define выведи_связи(связи, связи1)
{
   print(связи);
};

define докажи_каждый(остаток_прогр, программа, остаток_пред, пред, связи, уровень) {
declare ret;
declare теорема;
declare новые_связи;

print("докажи_каждый");
if(остаток_прогр=nil) {
   print("остаток_прогр nil");
   ret:=true;
} else {
   теорема:=поменяй_имена(car(остаток_прогр),cons(уровень, nil));
   princ("пред=");print(пред);
   princ("head теорема=");print(car(теорема));
   новые_связи:=унифицируй(пред, car(теорема), связи);
   princ("новые_связи=");print(новые_связи);
   if(новые_связи) {
      print("новые_связи = nil");
      ret:=докажи_каждый(cdr(остаток_прогр), программа, остаток_пред, пред, связи, уровень);
   } else {
     princ("теорема ");print(теорема);
     ret:=докажи(append(cdr(теорема),остаток_пред), новые_связи, программа, уровень+1);
     if(ret) {
       ret:=true;
     } else {
       ret:=докажи_каждый(cdr(остаток_прогр), программа, остаток_пред, пред, связи, уровень);
     };
   };
};
princ("конец докажи_каждый ret=");print(ret);
ret;
};

#define first head
#define rest last

define унифицируй(x,y,связи) {
declare ret;
declare новые_связи;

print("унифицируй");

  x:=значение(x, связи);
  y:=значение(y, связи);
  cond {
    переменная?(x) do ret:=cons(list(x,y),связи);
    переменная?(y) do ret:=cons(list(y,x),связи);
    ((atomp(x)=true) or (atomp(y)=true)) do ret:=((x=y) and связи);
    do {
         новые_связи:=унифицируй(car(x),car(y),связи);
         princ("новые_связи=");print(новые_связи);
         princ("x=");princ(x);
         princ(" y=");print(y);
         ret:=((новые_связи) and (унифицируй(cdr(x),cdr(y),новые_связи)));
    };
  };
  ret;
};

define значение(x, связи) {
declare ret;
declare связь;

  if(переменная?(x)) {
    связь:=assoc(x,связи);
    if(связь=nil) {
      ret:=x;
    } else {
      ret:=значение(second(связь),связи);
    };
  } else {
      ret:=x;
  };
  ret;
};

define переменная?(x) {
declare ret;

  if(listp(x)) {
    ret:=((atomp(car(x))) and (car(x)='var));
  } else {
    ret:=false;
  };

ret;
};

define listp(x) {
declare ret;
  asm {
    loadal x;
    jlst label_listp;
    drop;
  };
  ret:=false;
  asm {
    jmp label_listp_ret;
label_listp:
    drop;
  };
  ret:=true;
  asm {
label_listp_ret:  loadvl ret;
  };
ret;
};

define atomp(x) {
declare ret;
  asm {
    loadal x;
    jlst label_atomp;
    jtpl label_atomp;
    drop;
  };
  ret:=true;
  asm {
    jmp label_atomp_ret;
label_atomp:
    drop;
  };
  ret:=false;
  asm {
label_atomp_ret:  loadvl ret;
  };
  ret;
};

define null(x) {
declare ret=false;
  cond {
     (listp(x)) do ret:=false;
     (x=nil) do ret:=x;
  };
ret;
};

define assoc (x, a) {
declare ret;
 
  cond {
    (a=nil) do ret:=nil;
    (car(a)=nil) do ret:=nil;
    (x=car(car(a))) do ret:=car(a);
              do ret:=assoc(x,cdr(a));
  };
ret;
};

define append (a, b) {
declare ret;

  cond {
     (atomp(a)) do ret:=a;
     (b=nil) do ret:=a;
     (atomp(cdr(a))) do rplaca(a,b);
                do ret:=append(cdr(a),b);
  };
a;
};

#define LIST3 %(a (var X) c (var Y))
#define LIST2 %(a b (var Z) c)

//#define LIST3 %(дедушка (var X) (var Y))
//#define LIST2 %(отец маша эрнест)

define unify_test {
declare a;
declare b;
declare d=0;

a:=LIST2;
b:=LIST3;
print(a);
print(b);

  lcond {
    (d=1000) do {
       print(d);
     };
    do {
       print_stack_ptr();
          print(унифицируй(a,b,nil));
       print_stack_ptr();
       d:=d+1;
    };
  };
};

define list(...) {
   declare ret=nil;
   declare v=nil;
   declare na=1;

   v:=(argument na);
   asm {
      loadvl v;
      jnil listl31;
      drop;
      enter;
listl11:
      nop;
   };
   v:=(argument na);
   asm {
      loadvl v;
      jnil listl21;
   };
   na:=na+1;
   asm {
      jmp listl11;
listl21:
      drop;
      call list;
      savevl ret;
   };
   asm {
listl31:
      nop;
   };
   ret:=cons((argument 0),ret);
   ret;
};

define main {

unify_test();

declare  предикаты;

программа1:=LISTL;

предикаты:=%(дедушка (var X) (var Y));
докажи(list(поменяй_имена(предикаты, %(0))), %((основа)), программа1, 1);
предикаты:=%(мать настя маша);
докажи(list(поменяй_имена(предикаты, %(0))), %((основа)), программа1, 1);

предикаты:=%(мать (var X) маша);
докажи(list(поменяй_имена(предикаты, %(0))), %((основа)), программа1, 1);
};


09 Apr 2010 10:48
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Post 
d_wanderer wrote:
Shaos wrote:
Там несколько каталогов - можно небольшое редми получить что есть что?


Краткое описание каталогов.
Каталог Simple.
LASM - реализация ассемблера. Ассемблер строит obl файлы.
LASM1 - попытка перенести на Borland CBuilder.
SMPCL - компилятор языка Simple в ассемблер WVM.
SMPCL.1 - попытка перетащить в Borland.
smpc_noret_ru.new - устойчивая версия компилятора в консольном режиме.
SMPP - препроцессор языка Simple.
SMPP1 - попытка перетащить в Borland.
В корне каталога лежит запускалка для препроцессора, компилятора и ассемблера.
Каталоги vm_conserv_gc*
Это собственно версии самой VM. Я непомню какая версия устойчивая поэтому скопировал несколько последних. Устойчивая версия сейчас в коммерческом продукте и я честно говоря позабыл ее сегодня утянуть из офиса...


Кратчайшее описание.
Для получения из исходного файла с расширением smp надо последовательно вызвать smpp, smpc и lasm.

Кстати, унификация у меня есть. На Simple.


Я на домашний комп не успел архив скачать, а то что смотрел в другом месте чисто из браузера - пропало. Можешь ещё раз выложить?...

_________________
:dj: https://mastodon.social/@Shaos


09 Apr 2010 18:16
Profile WWW
Senior

Joined: 28 Feb 2006 21:34
Posts: 180
Reply with quote
Post 
Shaos wrote:
Я на домашний комп не успел архив скачать, а то что смотрел в другом месте чисто из браузера - пропало. Можешь ещё раз выложить?...


Выложил. Завтра постараюсь выложить другУю ВМ...
Насколько я понимаю, тебе, собственно, нужна только сама ВМ и ассемблер.
Компилятор пишется достаточно просто и быстро.
Вопрос лишь в том, хватит ли тебе имеющихся типов данных ВМ. Впрочем, наверно их можно нарастить.


11 Apr 2010 07:31
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Post 
скачал

никто не против, если я всё что касается Simple вырежу в отдельный топик?

_________________
:dj: https://mastodon.social/@Shaos


11 Apr 2010 15:42
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Post 
d_wanderer wrote:
Каталоги vm_conserv_gc*
Это собственно версии самой VM. Я непомню какая версия устойчивая поэтому скопировал несколько последних. Устойчивая версия сейчас в коммерческом продукте и я честно говоря позабыл ее сегодня утянуть из офиса...


упс - это коммерческий закрытый продукт?...
т.е. перерелизить под GPL не получится?

_________________
:dj: https://mastodon.social/@Shaos


12 Apr 2010 05:40
Profile WWW
Senior

Joined: 28 Feb 2006 21:34
Posts: 180
Reply with quote
Post 
Shaos wrote:
упс - это коммерческий закрытый продукт?...
т.е. перерелизить под GPL не получится?


Получится. Я автор.
Все что я делаю и выкладываю идет под BSD лицензией.
Ну и естественно мы бесплатно клиентам отдаем часть ВМ для встраивания в свои программные продукты. Коммерческие - это отдельные модули которые написаны под этой ВМ с модулем защиты. Модуль защиты я конечно же не дам. ;-)
Есть народ который эту ВМ уже лет так 10 использует в своих проектах - если посмотреть исходники - видно что она перенесена на микроконтроллер от NXP.


12 Apr 2010 08:44
Profile
Senior

Joined: 28 Feb 2006 21:34
Posts: 180
Reply with quote
Post 
Shaos wrote:
упс - это коммерческий закрытый продукт?...
т.е. перерелизить под GPL не получится?


Я по почте тебе кинул. ЕСли надо, выложу на свой сервер.
Описание системы команд тебе надо? Вообще она жутко тривиальная...
Я когда с Питоном разбирался даже удивился до чего похоже мысли движутся...


14 Apr 2010 09:03
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Post 
d_wanderer wrote:
Shaos wrote:
упс - это коммерческий закрытый продукт?...
т.е. перерелизить под GPL не получится?


Я по почте тебе кинул. ЕСли надо, выложу на свой сервер.
Описание системы команд тебе надо? Вообще она жутко тривиальная...
Я когда с Питоном разбирался даже удивился до чего похоже мысли движутся...


Если есть описание, то конечно давай!

_________________
:dj: https://mastodon.social/@Shaos


14 Apr 2010 19:20
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22530
Location: Silicon Valley
Reply with quote
Post 
посмотрел - похоже на стековую виртуальную машину - однако я не понимаю каким местом к ней функциональный язык прикручен :)

_________________
:dj: https://mastodon.social/@Shaos


15 Apr 2010 20:23
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 14 posts ] 

Who is online

Users browsing this forum: No registered users and 29 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.