|
|
  |
мини PLC. |
|
|
|
Jan 28 2016, 07:42
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Jan 27 2016, 18:06)  о! вот в этом вся загвоздка! вот это я и пытаюсь решить. не то чобы я был зациклен на моей имплиментации. просто других альтернатив нет пока. я думал сделать такую структуру При разработке своего контроллера я подумал побольше и сделал так. Любая логическая функция из N переменных описывается таблицей истинности из 2^N строк. Если переменные пронумерованы, то и на результат можно ссылаться числом. Например, для 5 переменных имеем 32 результата. Зная значения всех 5 переменных, мы можем получить номер бита в 32-битном хранилище результата. В байткодах это выгладит так: TABLE5(result_value) VAR0 VAR1 VAR2 VAR3 VAR4 GETRESULT Компилятор должен преобразовать сложное логическое выражение к таблице истинности и получить правильный resul_value.
|
|
|
|
|
Jan 28 2016, 09:02
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(syoma @ Jan 28 2016, 10:57)  . По-моему вы больно ошибетесь, если будете думать, что она "почти решена". Помимо описанного выше - что насчет типов переменных? Как вы собираетесь описывать весь этот язык в документации? Для каких пользователей? Просто это типичный случай, который я описал в "Гайке М3". ТС кажется, что как только он "определит гайку", то все остальное получится само по себе. Причем он даже не понимает, что он хочет делать интерпретатор или компилятор... Так же как и не понимает, почему ему хочется обрабатывать сложные скрипты а не простые, обработанные компилятором. Не понимает, что в любом случае, в системе управления будет хост. И еще лучше хост удаленный. А это значит, что валить компиляцию в микроконтроллер - не имеет смысла. А уж его высказывания все это только и подтверждают. Я читаю эту переписку не как техническую, а как пример общения с глухим и диким, не вежливым и ужасно самонадеяным....
--------------------
www.iosifk.narod.ru
|
|
|
|
|
Jan 28 2016, 09:19
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(adnega @ Jan 28 2016, 13:42)  Компилятор должен преобразовать сложное логическое выражение к таблице истинности и получить правильный resul_value. А ТС-у нужны только логические функции? Или и арифметические тоже? Я когда-то давно, когда писал свой типа компилятор  ну и парсер выражений для него, реализовал поддержку всех операций, что есть в си (с таким-же синтаксисом). Ничего сложного там нет. Сложно стало когда я попытался сделать ещё фазу оптимизации полученного кода после этого  У меня в выражениях поддерживались все сишные операции, скобки, переменные (были только численно-логические (только одного типа), или строковые (с меньшим списком операций)), константы числовые/строковые, константы литеральные. Мой компилятор компилил текстовые выражения в байт-код, который выполнялся на этапе выполнения. Это для я делал скриптовый компилируемый на лету после старта ПО язык в одной из своих программ.
|
|
|
|
|
Jan 28 2016, 09:34
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Jan 28 2016, 10:54)  честно говоря я мало что понял. Утверждается, что (param1 && input1) || (param2 && (input2 || input3)) соответствует таблица истинности из вложенного файла. Из значений переменных собираем индекс: n = (param1 << 4) + (param2 << 3) + (input1 << 2) + (input 2 << 1) + (input3 << 0); Затем получаем результат: ((0xFEF0EE00) >> n) & 1 Т.е. для вычисления (param1 && input1) || (param2 && (input2 || input3)) нам достаточно знать одно волшебное 32-битное число 0xFEF0EE00. Причем, для меня важным моментом было время вычисления логической функции любой сложности из максимум 5 переменных. При таком подходе оно фиксировано и минимально (не зависит от вида функции и от значений переменных). А самое главное, легко описывается байт-кодом и элементарно вычисляется. Теперь понятно?
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 28 2016, 10:43
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Jenya7 @ Jan 28 2016, 12:52)  да. это интересно. но условие (param1 && input1) || (param2 && (input2 || input3)) не статическое, оно может поменяться на скажем (param2 || input3) && (param4 || (input5 || input6)) или скажем переменных будет больше 5
ааа...понимаю.. с ростом параметров наша таблица серьезно вырастает… да. это круто. интересный подход. а как мы заполняем результат функции в true table - 0xFEF0EE00? При изменении условия меняется и результат. Как вы по условию будете получать "магическое число" - это ваши проблемы. Главное, что это возможно. В моем случае исходный текст компилятором преобразуется в байт код, и в задачи компилятора входит данное преобразование. Насчет логических условий с бОльшим числом переменных могу сказать, что я за долгие годы с такими не встречался (максимум 4). Но кто сказал, что таблицы нельзя каскадировать?
|
|
|
|
|
Jan 28 2016, 11:22
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(adnega @ Jan 28 2016, 15:43)  При изменении условия меняется и результат. Как вы по условию будете получать "магическое число" - это ваши проблемы. Главное, что это возможно. В моем случае исходный текст компилятором преобразуется в байт код, и в задачи компилятора входит данное преобразование. Насчет логических условий с бОльшим числом переменных могу сказать, что я за долгие годы с такими не встречался (максимум 4). Но кто сказал, что таблицы нельзя каскадировать?  оличное решение проблемы. я восхищен, не побоюсь этого слова. правда не знаю смогу ли я победить некоторые недостатки: при 8 параметрах наша таблица станет монструозной програмно получать получать "магическое число" но тем не менее - сильное решение. спасибо. как правильно заметил товарищ jcxz - мощная голова - и можно найти элегантное решение без фортов и джэсонов.
Сообщение отредактировал Jenya7 - Jan 28 2016, 11:37
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|