Язык программирования Simple

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

d_wanderer
Senior
Posts: 180
Joined: 28 Feb 2006 21:34

Post by d_wanderer »

Shaos wrote: Хотелось бы заполучить компилятор в байт-код и простой интерпретатор этого байткода - соответственно надо иметь чёткое описание форматов и интерфейсов - чтобы интерпретатор мог быть написан на любом языке за разумное время. Также предполагается наличие совместимости бинарных сборок старых версий с новыми - типа как в Java.
А чего мучиться - возьми мой Simple. Точнее его виртуальную машину.
Я могу переточить компилятор под Hope.
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

d_wanderer wrote:
Shaos wrote: Хотелось бы заполучить компилятор в байт-код и простой интерпретатор этого байткода - соответственно надо иметь чёткое описание форматов и интерфейсов - чтобы интерпретатор мог быть написан на любом языке за разумное время. Также предполагается наличие совместимости бинарных сборок старых версий с новыми - типа как в Java.
А чего мучиться - возьми мой Simple. Точнее его виртуальную машину.
Я могу переточить компилятор под Hope.
Я бы взял да мне в исходниках надо :)
Да и сайт твой уже не фурыкает...
Я тут за главного - если что шлите мыло на me собака shaos точка net
d_wanderer
Senior
Posts: 180
Joined: 28 Feb 2006 21:34

Post by d_wanderer »

Shaos wrote: Я бы взял да мне в исходниках надо :)
Да и сайт твой уже не фурыкает...
No problem....
Куда тебе скинуть?

http://oldcomp.msk.ru/temp8.rar
Вот....
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

d_wanderer wrote:
Shaos wrote: Я бы взял да мне в исходниках надо :)
Да и сайт твой уже не фурыкает...
No problem....
Куда тебе скинуть?

http://oldcomp.msk.ru/temp8.rar
Вот....
Там несколько каталогов - можно небольшое редми получить что есть что?
Я тут за главного - если что шлите мыло на me собака shaos точка net
d_wanderer
Senior
Posts: 180
Joined: 28 Feb 2006 21:34

Post by d_wanderer »

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.
d_wanderer
Senior
Posts: 180
Joined: 28 Feb 2006 21:34

Post by d_wanderer »

Code: Select all

// пролог

#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);
};
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

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.
Я на домашний комп не успел архив скачать, а то что смотрел в другом месте чисто из браузера - пропало. Можешь ещё раз выложить?...
Я тут за главного - если что шлите мыло на me собака shaos точка net
d_wanderer
Senior
Posts: 180
Joined: 28 Feb 2006 21:34

Post by d_wanderer »

Shaos wrote: Я на домашний комп не успел архив скачать, а то что смотрел в другом месте чисто из браузера - пропало. Можешь ещё раз выложить?...
Выложил. Завтра постараюсь выложить другУю ВМ...
Насколько я понимаю, тебе, собственно, нужна только сама ВМ и ассемблер.
Компилятор пишется достаточно просто и быстро.
Вопрос лишь в том, хватит ли тебе имеющихся типов данных ВМ. Впрочем, наверно их можно нарастить.
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

скачал

никто не против, если я всё что касается Simple вырежу в отдельный топик?
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

d_wanderer wrote: Каталоги vm_conserv_gc*
Это собственно версии самой VM. Я непомню какая версия устойчивая поэтому скопировал несколько последних. Устойчивая версия сейчас в коммерческом продукте и я честно говоря позабыл ее сегодня утянуть из офиса...
упс - это коммерческий закрытый продукт?...
т.е. перерелизить под GPL не получится?
Я тут за главного - если что шлите мыло на me собака shaos точка net
d_wanderer
Senior
Posts: 180
Joined: 28 Feb 2006 21:34

Post by d_wanderer »

Shaos wrote: упс - это коммерческий закрытый продукт?...
т.е. перерелизить под GPL не получится?
Получится. Я автор.
Все что я делаю и выкладываю идет под BSD лицензией.
Ну и естественно мы бесплатно клиентам отдаем часть ВМ для встраивания в свои программные продукты. Коммерческие - это отдельные модули которые написаны под этой ВМ с модулем защиты. Модуль защиты я конечно же не дам. ;-)
Есть народ который эту ВМ уже лет так 10 использует в своих проектах - если посмотреть исходники - видно что она перенесена на микроконтроллер от NXP.
d_wanderer
Senior
Posts: 180
Joined: 28 Feb 2006 21:34

Post by d_wanderer »

Shaos wrote: упс - это коммерческий закрытый продукт?...
т.е. перерелизить под GPL не получится?
Я по почте тебе кинул. ЕСли надо, выложу на свой сервер.
Описание системы команд тебе надо? Вообще она жутко тривиальная...
Я когда с Питоном разбирался даже удивился до чего похоже мысли движутся...
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

d_wanderer wrote:
Shaos wrote: упс - это коммерческий закрытый продукт?...
т.е. перерелизить под GPL не получится?
Я по почте тебе кинул. ЕСли надо, выложу на свой сервер.
Описание системы команд тебе надо? Вообще она жутко тривиальная...
Я когда с Питоном разбирался даже удивился до чего похоже мысли движутся...
Если есть описание, то конечно давай!
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

посмотрел - похоже на стековую виртуальную машину - однако я не понимаю каким местом к ней функциональный язык прикручен :)
Я тут за главного - если что шлите мыло на me собака shaos точка net