Перейти к содержанию
    

у меня есть мощный камень и такой же язык программирования. и я думаю этих двух условий вполне хватает для решения задачи. тем более что она почти решена.

Самое необходимое (и достаточное) условие для решение любой задачи - не мощный камень или язык, а мощная голова... :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Самое необходимое (и достаточное) условие для решение любой задачи - не мощный камень или язык, а мощная голова... :laughing:

это Вы свою имеете ввиду я так понимаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по "постановке задачи" ТС, это похоже на интерпретатор бейсика в "онлайн" режиме,

когда каждая строка выполняется по энтеру.

 

В PLC системах, один из языков программирования - IL ( Instruction lang.) полностью соотв-ий ассемблеру.

Кроме ASM - есть ST - сильно похожий на C

 

Тоисть, ТС не следует изобретать очередной лисапет, а (если задача учебно-тренировочная)

разработать свой компилятор ассемблера (включающий парсер) на выходе которого будет сгенерирован

машинный код (это будет круто),

 

или

промежуточный код (как в Java) - для последующего исполнения вирт. машиной "MyPLC"

 

или

текст-код, например например на ASM MSP430 для последующей компиляции "настоящим" компилятором ASM430

и заливки реального кода в процессор, где уже "живет" "Операционная система MyPLC"

(тоже круто). Так работают реальные системы разработки для промышленных контроллеров.

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

о! вот в этом вся загвоздка! вот это я и пытаюсь решить. не то чобы я был зациклен на моей имплиментации. просто других альтернатив нет пока.

я думал сделать такую структуру

При разработке своего контроллера я подумал побольше и сделал так.

Любая логическая функция из N переменных описывается таблицей истинности из 2^N строк.

Если переменные пронумерованы, то и на результат можно ссылаться числом.

Например, для 5 переменных имеем 32 результата.

Зная значения всех 5 переменных, мы можем получить номер бита в 32-битном хранилище результата.

 

В байткодах это выгладит так:

 

TABLE5(result_value)

VAR0

VAR1

VAR2

VAR3

VAR4

GETRESULT

 

Компилятор должен преобразовать сложное логическое выражение к таблице истинности и получить правильный resul_value.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

честно говоря я мало что понял.

Изменено пользователем Herz
Избыточное цитирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

у меня есть мощный камень и такой же язык программирования. и я думаю этих двух условий вполне хватает для решения задачи. тем более что она почти решена.

Я так понял, что у вас задача "програмировать задачи - состояния на выходе в зависимости от условий на входе." в первом посте, а не разработка интерпретатора для своего языка программирования. Среда разработки выше была создана именно с целью решения задачи из вашего первого сообщения. По-моему вы больно ошибетесь, если будете думать, что она "почти решена". Помимо описанного выше - что насчет типов переменных? Как вы собираетесь описывать весь этот язык в документации? Для каких пользователей?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

честно говоря я мало что понял.

Вы таблицу истинности представляете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

. По-моему вы больно ошибетесь, если будете думать, что она "почти решена". Помимо описанного выше - что насчет типов переменных? Как вы собираетесь описывать весь этот язык в документации? Для каких пользователей?

Просто это типичный случай, который я описал в "Гайке М3". ТС кажется, что как только он "определит гайку", то все остальное получится само по себе. Причем он даже не понимает, что он хочет делать интерпретатор или компилятор... Так же как и не понимает, почему ему хочется обрабатывать сложные скрипты а не простые, обработанные компилятором. Не понимает, что в любом случае, в системе управления будет хост. И еще лучше хост удаленный. А это значит, что валить компиляцию в микроконтроллер - не имеет смысла.

А уж его высказывания все это только и подтверждают. Я читаю эту переписку не как техническую, а как пример общения с глухим и диким, не вежливым и ужасно самонадеяным....

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор должен преобразовать сложное логическое выражение к таблице истинности и получить правильный resul_value.

А ТС-у нужны только логические функции? Или и арифметические тоже?

Я когда-то давно, когда писал свой типа компилятор ;) ну и парсер выражений для него, реализовал поддержку всех операций, что есть в си (с таким-же синтаксисом).

Ничего сложного там нет. Сложно стало когда я попытался сделать ещё фазу оптимизации полученного кода после этого :)

У меня в выражениях поддерживались все сишные операции, скобки, переменные (были только численно-логические (только одного типа), или строковые (с меньшим списком операций)),

константы числовые/строковые, константы литеральные.

Мой компилятор компилил текстовые выражения в байт-код, который выполнялся на этапе выполнения.

Это для я делал скриптовый компилируемый на лету после старта ПО язык в одной из своих программ. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мой компилятор компилил текстовые выражения в байт-код, который выполнялся на этапе выполнения.

Это для я делал скриптовый компилируемый на лету после старта ПО язык в одной из своих программ. :)

Об этом объяснено еще пару страниц назад, да только все бесполезно...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

честно говоря я мало что понял.

Утверждается, что (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 переменных.

При таком подходе оно фиксировано и минимально (не зависит от вида функции и от значений переменных).

А самое главное, легко описывается байт-кодом и элементарно вычисляется.

 

Теперь понятно?

post-27702-1453973673_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да. это интересно.

но условие (param1 && input1) || (param2 && (input2 || input3)) не статическое, оно может поменяться на скажем (param2 || input3) && (param4 || (input5 || input6))

или скажем переменных будет больше 5

 

ааа...понимаю.. с ростом параметров наша таблица серьезно вырастает…

да. это круто. интересный подход. а как мы заполняем результат функции в true table - 0xFEF0EE00?

Изменено пользователем Herz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да. это интересно.

но условие (param1 && input1) || (param2 && (input2 || input3)) не статическое, оно может поменяться на скажем (param2 || input3) && (param4 || (input5 || input6))

или скажем переменных будет больше 5

 

ааа...понимаю.. с ростом параметров наша таблица серьезно вырастает…

да. это круто. интересный подход. а как мы заполняем результат функции в true table - 0xFEF0EE00?

При изменении условия меняется и результат.

Как вы по условию будете получать "магическое число" - это ваши проблемы. Главное, что это возможно.

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

 

Насчет логических условий с бОльшим числом переменных могу сказать, что я за долгие годы с такими не встречался (максимум 4).

Но кто сказал, что таблицы нельзя каскадировать? ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

adnega, неужели в наше время, микропроцессорные ресурсы такие ценные, что пришлось так извращаться?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При изменении условия меняется и результат.

Как вы по условию будете получать "магическое число" - это ваши проблемы. Главное, что это возможно.

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

 

Насчет логических условий с бОльшим числом переменных могу сказать, что я за долгие годы с такими не встречался (максимум 4).

Но кто сказал, что таблицы нельзя каскадировать? ;)

оличное решение проблемы. я восхищен, не побоюсь этого слова.

правда не знаю смогу ли я победить некоторые недостатки:

при 8 параметрах наша таблица станет монструозной

програмно получать получать "магическое число"

но тем не менее - сильное решение. спасибо.

 

как правильно заметил товарищ jcxz - мощная голова - и можно найти элегантное решение без фортов и джэсонов.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...