присваивание чтобы выглядело так: Code (Text): "(0..*)параметр"."(0..*)процесс"."(1..n)класс" = ...значение... и чтобы поддерживало "многоуровневую" адресацию, т.е. при адресации к локальным переменным функции по имени менялись значения и локальных и глобальных переменных с однинаковым именем. таких компиляторов по всей видимости не существует? P.S. не спрашивайте "зачем?"
Нужно, чтобы поля структур писались именно цифрами? Значит, нужно их где-то изменять. И тогда подойдет обычный многомерный массив.
t00x C# позволяет. Хотят тут можно на любом реализовать. Зачем не спрашиваю так как это противоречит 3 принципу БД.
qqwe поподробнее. надо чтобы компилятор (интерпретатор) поддерживал такую архитектуру и такой режим адресации. архитектура. "параметры" есть только у "процессов". у "класса" нет "параметров"(свойств), но "классы" могут быть вложенными. т.е. у "класса" может быть только другой "класс", но не свойства. адресация. при изменении значения "параметра": Code (Text): "0параметр" = ...значение... ; меняются значения всех! "0параметров" у всех! процессов всех! классов. "0параметр"."1процесс" = ...значение... ; меняются значения "0параметров"."1процессов" у всех! классов. "0параметр"."1процесс"."1класс" = ...значение... ; меняется значение одного "0параметра". компилятора для такого точно нет. DarkWanderer начиная с цифр будет удобнее читать. "0рука". "1рука". "2рука". )) Pavia длинные посты утомляют читающих . Си не нативный язык мне.
t00x Имхо причина, по которой таких компиляторов просто нет - небезопасность изменения конкретного параметра у всех процессов или у всех классов. Ведь программист может не знать/не_просчитать что находится в других процессах и внести изменения, которые приведут к не самым радужным последствиям. Наоборот, языки программирования и операционные системы исходят из того, что стараются разграничить права доступа, чтобы по максимуму исключить возможность ошибки при минимуме умственных усилий со стороны программиста. Впрочем не исключено что такие библиотечки все-таки есть, как говорится гугл в помощь...
t00x начну с того, что сужу поле терминов до "переменная" и "контейнер". контейнера могут содержать как переменные, так и другие контейнера. переменные - просто числа. условие итак, если я вас понял, вы хотите иметь возможность обратного поля видимости. те, при установке переменной - чтоб устанавливались все одноименные переменные во всех контейнерах. также требуется возможность сужать область видимости явным указанием контейнеров. ! чтение в таком режиме невозможно, тк значения одноименных неравных переменных вполне могут отличаться. решение так как переменные будут хоть и одноименные, но _разные_, то так или иначе процедура присвоения сведется к перебору. единственно что мы можем оптимизировать это дело. ! спец компилер/интерпрер не нужен. все это делается на любом из них Code (Text): //---------------------------------------------------------------- // для начала необходимо создать глобальный реестр имен переменных reg = []; //---------------------------------------------------------------- // функция регистрации очередной переменной с указанием цепочки ее контейнеров // <контейнер 0>.<контейнер 1>. ... .<контейнер N>.<переменная> function add_var_to_reg(var_path_name, pointer_to){ var i, nm; var ptr; var lst; // бьем путь на контейнера и имя переменной lst = var_path_name.split("."); // если передано абы что - выходим if( pointer_to == null // если разрешить pointer_to быть null, то можно удалять из реестра || lst == null || lst.length < 1 || lst[lst.length -1] == "" ){ return false; } // берем из реестра цепочку для этой переменной nm = lst[lst.length -1]; if(reg[nm] == null){ reg[nm] = []; } ptr = reg[nm]; // добавляем к ней путь по контейнерам for(i = 0; i < lst.length - 1; i++){ nm = lst[i]; if(ptr[nm] == null){ ptr[nm] = []; } ptr = ptr[nm]; } // в хвост цепочки добавляем ссылку на переменную ptr["@@"] = pointer_to; // выходим return true; } //---------------------------------------------------------------- // функция установки переменной с учетом возможного сужения области // <переменная>.<контейнер 0>.<контейнер 1>. ... .<контейнер N> function set_var_from_reg(var_path_name, value){ var i, nm; var ptr; var lst; // бьем путь на контейнера и имя переменной lst = var_path_name.split("."); // если передано абы что - выходим if( lst == null || lst.length < 1 || lst[0] == "" ){ return false; } ptr = reg; // получаем стартовую позицию в реестре для начала установки for(i = 0; i < lst.length; i++){ nm = lst[i]; if(ptr[nm] == null){ return false; } ptr = ptr[nm]; } // запускаем рекурсивный установщик _aux_set_var(ptr, value); // выходим return true; } // вспомогательная рекурсивная функция для ползанья по дереву начиная с указанного узла и присвоения значения function _aux_set_var(ptr, val){ var nm; var v; // если в данном узле есть ссылка на нужную переменную - устанавливаем v = ptr["@@"]; if(v != null){ *v = val; } for(nm in ptr){ if(nm != "@@" && ptr[nm] != null){ _aux_set_var(ptr[nm], val); } } return; } код написан на жабаскрипте. почти все, кроме самой установки переменной по ссылке. в жс/ас нет ссылок и делаться это будет чуть хитрее. в целях упрощения кода я это дело упростил до С-стиля. для локальных переменных внутри функций необходим также удалятель переменных из реестра. в функции 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); // удаляем из реестра } } }
qqwe ненене! концепция как раз и заключается в том, что "класс-контейнер" не существует без происходящих внутри процессов. они могут ускорятся, останавливаться, и т.д. когда последний процесс завершится, "класс-контейнер" умирает. единственная функция процесса обрабатывает ассинхронно (?лениво?) в CASE-?структурами? все параметры и их значения (и ещё чтобы можно было задавать порядок (сортировать) последовательность обработки параметров). например остановка всех процессов. Code (Text): "remaintime"."*" = 0 + >>иметь возможность обратного поля видимости -- это скорее можно назвать агрессивная (или жадная) адресация; + >>возможность сужать область адресации явным указанием -- да. и адресация по спец.символам ("*"="для каждого") + >> ! чтение в таком режиме невозможно -- возможно. надо только сузить поле видимости до вполне конкретного Nпараметра.Mпроцесса.Kкласса-контейнера есть мысль нумеровать "классы-контейнеры" (kID), нумеровать "процессы" (pID), а "параметры" сделать именоваными (?на таблицах?) массивами структур. и размерность параметров жестко задать. пардон, скриптовый код неосилю W4FhLF в SQL только статические таблицы, без потоков-процессов. и вложенные таблицы (классы-контейнеры) непросто реализуются. наверное, будет проще структурами на ?списках? такое сделать.
t00x да какая фиг разница какие свойства у контейнеров? просто в конструкторе (начале функции) регистрируете переменные, а в деструкторе (конце функции) их анрегисрируете. можете даже макросами объявлять переменные. да ради бога. добавьте распознавание вайлдчаров в приведенные примеры. хоть регекспы добавьте. не универсально. в общем случае вы не можете гарантировать наличие дочернего контейнера с переменной того же имени для данного указанного контейнера. впрочем, можно добавить какую нить обработку коллизий или читать только из указанного контейнера. замучаетесь с номеровкой этой. номерация ваша очень скоро разобьется и на ее нормализацию у вас будет тратиться больше, чем на все остальное. да и жесткая фиксация переменных - оч плохая идея. сразу отказывайтесь, если это не код одного дня. иначе оно вас потом подведет ы. а чем вам оно неосилимо? тот же С, но с автотипизацией и созданием массивов/хэшей как <переменная> = []; тут используются хэши. чего и вам желаю. неинициализованное значение == null чего еще вы заметили настолько непреодолимого? перепишите на С, пас, го. го тоже объявляет переменные через var, имеет вариант автотипизации (присвоение через :=), имеет стандартные модуля для работы с хэшами, сборщик мусора и полностью компилируем. вы, это, напишите полностью чего вы хотите. и учитесь читайть скрипты. алгосы ними писать/проверять куда как оперативнее. (кстати, на том же луа все эти регистраторы-синхронизаторы можно запускать автоматом и только средствами языка. но я не предполагаю, что вы знаете луа и пишу на жс в простейшем С-стиле с комментами) или вы хотите именно компилер? а с какого языка вы его хотите? в асм это можно вставить модифицировав макросы объявления локалей и финализатора функции. алгос - выше. если именно такой - не, ну так и модифицировать его или написать другой, имхо, не проблемно. вы просто ввели сильно много сущностей в тех описание и запутали себя. имхо
Смотрю я на все это и понимаю, что вопрос "зачем" как раз-таки очень существенный. И похоже на то, что кому-то хочется реализовать многопоточные вычисления?
qqwe у дочернего контейнера будет возможность изменять собственное значение своего параметра. 32 или 64 бита выделить под каждый параметр, чтобы с чтением/записью не путаться. недостающее добавлять количеством параметров. ещё не знаю. dZentle_man незачем спрашивать, лучше посоветуйте чего-нибудь.
t00x так как у вас в постановке допускается и независимое и групповое изменение, то при решении сводите все к более сложному случаю. те, при чтении _все_ одноименные зарегистрированные переменные считайте различными. те, вам надо или отказаться от группового чтения, или читать только первую встреченную переменную (плохое решение), или читать строго только по указанному пути, или какойнибудь способ разрешения коллизий. потому что они таки будут. а структуры? а динамические вектора? а строки? имхо, вам лучше делать как делают в скриптах struct { type : (какой нибудь способ однозначного описания типа); len : int; // длина в байтах value : void*; // ссылка на переменную } Variable; так вы повысите универсальность и перестрахуетесь. Также, если у вас встретятся одноименные, но разнотипные переменные, вы их сможете развести и не получите головной боли на отладке.
qqwe вероятнее всего заменю групповое чтение на чтение _последнего_ параметра. ну, и чтение строго по указанному пути конечно. именами параметров и количеством. Code (Text): 0строка0 = "0стр" 1строка0 = "ока0" в случае необходимости можно подключить какую-нибудь БД. сложнее всего придумать что-нибудь универсальное для функции обработки процесса.