На чём такое написать?

Тема в разделе "WASM.HEAP", создана пользователем t00x, 4 окт 2010.

  1. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    присваивание чтобы выглядело так:
    Код (Text):
    1. "(0..*)параметр"."(0..*)процесс"."(1..n)класс" = ...значение...
    и чтобы поддерживало "многоуровневую" адресацию, т.е. при адресации к локальным переменным функции по имени менялись значения и локальных и глобальных переменных с однинаковым именем.
    таких компиляторов по всей видимости не существует?

    P.S. не спрашивайте "зачем?" :)
     
  2. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    ничего не понятно. желательно бы поподробнее
     
  3. DarkWanderer

    DarkWanderer New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    333
    Адрес:
    Барнаул.
    Нужно, чтобы поля структур писались именно цифрами? Значит, нужно их где-то изменять. И тогда подойдет обычный многомерный массив.
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    t00x
    C# позволяет. Хотят тут можно на любом реализовать. Зачем не спрашиваю так как это противоречит 3 принципу БД.
     
  5. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    qqwe
    поподробнее.
    надо чтобы компилятор (интерпретатор) поддерживал такую архитектуру и такой режим адресации.
    архитектура.
    "параметры" есть только у "процессов".
    у "класса" нет "параметров"(свойств), но "классы" могут быть вложенными.
    т.е. у "класса" может быть только другой "класс", но не свойства.
    адресация.
    при изменении значения "параметра":
    Код (Text):
    1. "0параметр" =  ...значение...        ; меняются значения всех! "0параметров" у всех! процессов всех! классов.
    2. "0параметр"."1процесс" =  ...значение...        ; меняются значения "0параметров"."1процессов" у всех! классов.
    3. "0параметр"."1процесс"."1класс" =  ...значение...         ; меняется значение одного "0параметра".
    компилятора для такого точно нет.

    DarkWanderer
    начиная с цифр будет удобнее читать. "0рука". "1рука". "2рука". :)))

    Pavia
    длинные посты утомляют читающих ;). Си не нативный язык мне.
     
  6. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    t00x

    Имхо причина, по которой таких компиляторов просто нет - небезопасность изменения конкретного параметра у всех процессов или у всех классов. Ведь программист может не знать/не_просчитать что находится в других процессах и внести изменения, которые приведут к не самым радужным последствиям. Наоборот, языки программирования и операционные системы исходят из того, что стараются разграничить права доступа, чтобы по максимуму исключить возможность ошибки при минимуме умственных усилий со стороны программиста. Впрочем не исключено что такие библиотечки все-таки есть, как говорится гугл в помощь...
     
  7. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    t00x
    начну с того, что сужу поле терминов до "переменная" и "контейнер". контейнера могут содержать как переменные, так и другие контейнера. переменные - просто числа.

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

    решение
    так как переменные будут хоть и одноименные, но _разные_, то так или иначе процедура присвоения сведется к перебору. единственно что мы можем оптимизировать это дело.

    ! спец компилер/интерпрер не нужен. все это делается на любом из них


    Код (Text):
    1. //----------------------------------------------------------------
    2. // для начала необходимо создать глобальный реестр имен переменных
    3. reg = [];
    4.  
    5.  
    6. //----------------------------------------------------------------
    7. // функция регистрации очередной переменной с указанием цепочки ее контейнеров
    8. // <контейнер 0>.<контейнер 1>. ... .<контейнер N>.<переменная>
    9. function add_var_to_reg(var_path_name, pointer_to){
    10.   var i, nm;
    11.   var ptr;
    12.   var lst;
    13.  
    14.   // бьем путь на контейнера и имя переменной
    15.   lst = var_path_name.split(".");
    16.  
    17.   // если передано абы что - выходим
    18.   if(
    19.      pointer_to == null  // если разрешить pointer_to быть null, то можно удалять из реестра
    20.      || lst == null
    21.      || lst.length < 1
    22.      || lst[lst.length -1] == ""
    23.   ){
    24.     return false;
    25.   }
    26.  
    27.   // берем из реестра цепочку для этой переменной
    28.   nm = lst[lst.length -1];
    29.   if(reg[nm] == null){
    30.     reg[nm] = [];
    31.   }
    32.   ptr = reg[nm];
    33.  
    34.   // добавляем к ней путь по контейнерам
    35.   for(i = 0; i < lst.length - 1; i++){
    36.     nm = lst[i];
    37.     if(ptr[nm] == null){
    38.       ptr[nm] = [];
    39.     }
    40.     ptr = ptr[nm];
    41.   }
    42.  
    43.   // в хвост цепочки добавляем ссылку на переменную
    44.   ptr["@@"] = pointer_to;
    45.  
    46.   // выходим
    47.   return true;
    48. }
    49.  
    50.  
    51. //----------------------------------------------------------------
    52. // функция установки переменной с учетом возможного сужения области
    53. // <переменная>.<контейнер 0>.<контейнер 1>. ... .<контейнер N>
    54. function set_var_from_reg(var_path_name, value){
    55.   var i, nm;
    56.   var ptr;
    57.   var lst;
    58.  
    59.   // бьем путь на контейнера и имя переменной
    60.   lst = var_path_name.split(".");
    61.  
    62.   // если передано абы что - выходим
    63.   if(
    64.      lst == null
    65.      || lst.length < 1
    66.      || lst[0] == ""
    67.   ){
    68.     return false;
    69.   }
    70.  
    71.   ptr = reg;
    72.  
    73.   // получаем стартовую позицию в реестре для начала установки
    74.   for(i = 0; i < lst.length; i++){
    75.     nm = lst[i];
    76.     if(ptr[nm] == null){
    77.       return false;
    78.     }
    79.     ptr = ptr[nm];
    80.   }
    81.  
    82.   // запускаем рекурсивный установщик
    83.   _aux_set_var(ptr, value);
    84.  
    85.   // выходим
    86.   return true;
    87. }
    88.  
    89.  
    90. // вспомогательная рекурсивная функция для ползанья по дереву начиная с указанного узла и присвоения значения
    91. function _aux_set_var(ptr, val){
    92.   var nm;
    93.   var v;
    94.  
    95.   // если в данном узле есть ссылка на нужную переменную - устанавливаем
    96.   v = ptr["@@"];
    97.   if(v != null){
    98.     *v = val;
    99.   }
    100.   for(nm in ptr){
    101.     if(nm != "@@" && ptr[nm] != null){
    102.       _aux_set_var(ptr[nm], val);
    103.     }
    104.   }
    105.  
    106.   return;
    107. }
    код написан на жабаскрипте. почти все, кроме самой установки переменной по ссылке. в жс/ас нет ссылок и делаться это будет чуть хитрее. в целях упрощения кода я это дело упростил до С-стиля.

    для локальных переменных внутри функций необходим также удалятель переменных из реестра. в функции add_var_to_reg есть соотв комент

    пример использования:

    class A: {
    process B: {
    function C(){
    var D;
    add_var_to_reg("A.B.C.D", &D); // регистрируем

    set_var_from_reg("A.B", 8);

    add_var_to_reg("A.B.C.D", null); // удаляем из реестра
    }
    }
    }
     
  8. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    SQL чтоли?
     
  9. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    qqwe
    ненене! концепция как раз и заключается в том, что "класс-контейнер" не существует без происходящих внутри процессов. они могут ускорятся, останавливаться, и т.д.
    когда последний процесс завершится, "класс-контейнер" умирает.
    единственная функция процесса обрабатывает ассинхронно (?лениво?) в CASE-?структурами? все параметры и их значения (и ещё чтобы можно было задавать порядок (сортировать) последовательность обработки параметров).

    например остановка всех процессов.
    Код (Text):
    1. "remaintime"."*" = 0
    + >>иметь возможность обратного поля видимости -- это скорее можно назвать агрессивная (или жадная) адресация;
    + >>возможность сужать область адресации явным указанием -- да. и адресация по спец.символам ("*"="для каждого")
    + >> ! чтение в таком режиме невозможно -- возможно. надо только сузить поле видимости до вполне конкретного Nпараметра.Mпроцесса.Kкласса-контейнера

    есть мысль нумеровать "классы-контейнеры" (kID), нумеровать "процессы" (pID), а "параметры" сделать именоваными (?на таблицах?) массивами структур. и размерность параметров жестко задать.

    пардон, скриптовый код неосилю ;)
    W4FhLF
    в SQL только статические таблицы, без потоков-процессов.
    и вложенные таблицы (классы-контейнеры) непросто реализуются. наверное, будет проще структурами на ?списках? такое сделать.
     
  10. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    t00x
    да какая фиг разница какие свойства у контейнеров? просто в конструкторе (начале функции) регистрируете переменные, а в деструкторе (конце функции) их анрегисрируете. можете даже макросами объявлять переменные.
    да ради бога. добавьте распознавание вайлдчаров в приведенные примеры. хоть регекспы добавьте.
    не универсально. в общем случае вы не можете гарантировать наличие дочернего контейнера с переменной того же имени для данного указанного контейнера.
    впрочем, можно добавить какую нить обработку коллизий или читать только из указанного контейнера.
    замучаетесь с номеровкой этой. номерация ваша очень скоро разобьется и на ее нормализацию у вас будет тратиться больше, чем на все остальное.
    да и жесткая фиксация переменных - оч плохая идея. сразу отказывайтесь, если это не код одного дня. иначе оно вас потом подведет
    ы. а чем вам оно неосилимо? тот же С, но с автотипизацией и созданием массивов/хэшей как

    <переменная> = [];

    тут используются хэши. чего и вам желаю.

    неинициализованное значение == null

    чего еще вы заметили настолько непреодолимого? перепишите на С, пас, го. го тоже объявляет переменные через var, имеет вариант автотипизации (присвоение через :=), имеет стандартные модуля для работы с хэшами, сборщик мусора и полностью компилируем.

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

    или вы хотите именно компилер? а с какого языка вы его хотите? в асм это можно вставить модифицировав макросы объявления локалей и финализатора функции. алгос - выше. если именно такой - не, ну так и модифицировать его или написать другой, имхо, не проблемно. вы просто ввели сильно много сущностей в тех описание и запутали себя. имхо
     
  11. dZentle_man

    dZentle_man New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2008
    Сообщения:
    414
    Смотрю я на все это и понимаю, что вопрос "зачем" как раз-таки очень существенный. И похоже на то, что кому-то хочется реализовать многопоточные вычисления?
     
  12. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    qqwe
    у дочернего контейнера будет возможность изменять собственное значение своего параметра.
    32 или 64 бита выделить под каждый параметр, чтобы с чтением/записью не путаться. недостающее добавлять количеством параметров.
    ещё не знаю.

    dZentle_man
    незачем спрашивать, лучше посоветуйте чего-нибудь.
     
  13. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    t00x
    так как у вас в постановке допускается и независимое и групповое изменение, то при решении сводите все к более сложному случаю. те, при чтении _все_ одноименные зарегистрированные переменные считайте различными. те, вам надо или отказаться от группового чтения, или читать только первую встреченную переменную (плохое решение), или читать строго только по указанному пути, или какойнибудь способ разрешения коллизий. потому что они таки будут.
    а структуры? а динамические вектора? а строки?

    имхо, вам лучше делать как делают в скриптах

    struct {
    type : (какой нибудь способ однозначного описания типа);
    len : int; // длина в байтах
    value : void*; // ссылка на переменную
    } Variable;

    так вы повысите универсальность и перестрахуетесь. Также, если у вас встретятся одноименные, но разнотипные переменные, вы их сможете развести и не получите головной боли на отладке.
     
  14. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    qqwe
    вероятнее всего заменю групповое чтение на чтение _последнего_ параметра. ну, и чтение строго по указанному пути конечно.
    именами параметров и количеством.
    Код (Text):
    1. 0строка0 = "0стр"
    2. 1строка0 = "ока0"
    в случае необходимости можно подключить какую-нибудь БД.

    сложнее всего придумать что-нибудь универсальное для функции обработки процесса.
     
  15. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    W4FhLF
    скорее QUEL?