Продолжение формализации. Некоторые идеи #2
(Добавлено позднее: это конечно заблуждение, но оно интересно с точки зрения фантазии...) Кстати, о птичках (не так сложно написать компилятор, как формализовать ЯП без сайд эффектов) Если не отказываться от стека (пусть даже виртуального), а все же оставить некую общую структуру для передачи данных, то можно сделать вот что. Можно обратную польскую запись, как бы это мягче выразиться.. - даже не "выровнять", а обратить любое выражение в последовательность элементарных инструкций, как это было описано в предыдущем посте данного блога, но гораздо проще. Что предлагается? А вот что: Итак: 1) у нас есть, допустим стек; 2) но мы не хотим использовать сложные вложенные выражения со скобками, которые трудно разбирать; 3) использовать старшинство операций по умолчанию(источник ошибок); 4) нас тошнит от синтаксиса Forth; 5) мы хотим все сделать "по компьютерному" а не по.... Чтобы не ходить далеко, начнем сразу с примера: Допустим у нас есть классическое инфиксное выражение (для домохозяек):
Теперь у нас имеются кроме бинарных и "унарные" операции. Использую термин "унарные" только в данном контексте и прошу не путать их с унарными в обычном. Запишем вышеприведенное выражение таким образом (сразу предупреждаю, что это НЕ префиксная и НЕ постфиксная запись!!!):
Теперь, что же мы получили в итоге? Мы, внимание, - выровняли выражение, и привели его к естественным последовательностям инструкций! Это значит, что теперь это выражение стало совершенно естественным, так как его нужно читать слева направо до самого конца, чтобы его понять, как читаем мы обычные тексты. Нам не нужно прыгать по выражению в поисках первой операции по старшинству. Также мы избавились от лишних промежуточных переменных (как это было в прошлом посте), коих просто нет. Обозначение и лексическое отделение бинарных операций от унарных требует своей проработки. например, унарную операцию "+" можно представить бинарной при помощи ключевого слова "ADD": ADD 3 в. Или использовать односимвольное обозначение. Более того, такую запись возможно сжимать убирая пробелы между операциями:
Более полная проработка данной идеи будет, надеюсь, позднее. Мы привели Forth к нормальному человеческому виду при этом оставив его простоту.. А теперь пойдем дальше и... приготовьтесь.. избавимся и от "бинарных" операций! Преобразуем наше выражение 3 + 4 × (2 − 1) в:
(В выражении a > b, "a" кладется на стек, а оператор > снимает значение переменной со стека сравнивает это значение с "b") Логическое выражение:
Заметьте: длина нашего выражения не длиннее обычного, куда-то испарились все приоритеты, а читать стало намного приятнее! Еще это позволяет почти один в один транслировать выражение в байт код виртуальной машины, надеюсь преимущества тут совершенно очевидны: высокая скорость трансляции. Предлагаю назвать такой способ записи выражений "прямым", хотя предлагайте свои варианты наименования. Прошу не судить строго. Я пока нахожусь в поиске. Спасибо за внимание. |
Всего комментариев 221
Комментарии
-
Запись от CoderHuligan размещена 03.04.2020 в 17:29 -
Запись от Usaga размещена 03.04.2020 в 17:32 -
Запись от Usaga размещена 03.04.2020 в 17:33 -
Язык программирования, который пишется не на ассемблере с массовым использованием AVX - это забава для детей.
Запись от IamLost размещена 03.04.2020 в 17:51 -
Цитата:По вашему, расположение оператора && - это такой лютый недостаток того же Си, что надо придумывать новый ЯП?
Цитата:Язык программирования, который пишется не на ассемблере с массовым использованием AVX - это забава для детей.Запись от CoderHuligan размещена 03.04.2020 в 17:55
Обновил(-а) CoderHuligan 03.04.2020 в 18:08 -
Цитата:Причем здесь оператор &&? Я предлагаю читать выражения слева направо как мы привыкли читать книги. Существующие выражения не отвечают этому.
Цитата:Тогда дети все те, кто пользуется языками с виртуальной машиной под капотом и написаны на С: java, Pithon, C#.. Продолжить?Запись от Usaga размещена 03.04.2020 в 18:21 -
Цитата:Я предлагаю читать выражения слева направо как мы привыкли читать книги.
Запись от Croessmah размещена 03.04.2020 в 18:48 -
Цитата:Зачем?
Цитата:Тогда стоит ознакомиться с языком karasic.
Перевернули присваивания наоборот.
Можно сделать нечто такого:
Число 3 кладем на стек, затем команда TO заносит его по адресу a. Причем такая команда может снимать со стека результаты любых выражений и сразу отправлять их по адресу.PureBasic 1
3 TO a
Запись от CoderHuligan размещена 03.04.2020 в 19:17 -
Уважаемый CoderHuligan,
1. как вы намерены различать бинарный минус от унарного? Это ведь разные операции.
2. предполагается ли использовать унарный плюс?Запись от wer1 размещена 03.04.2020 в 19:48 -
Запись от Usaga размещена 03.04.2020 в 19:52 -
Нет, такая запись не подходит из-за операций деления и вычитания.. Придется реверсировать порядок операций при делении и вычитании, и уже не приходится говорить о чтении слева направо.. Эх полет фантазии..
Цитата:1. как вы намерены различать бинарный минус от унарного? Это ведь разные операции.
2. предполагается ли использовать унарный плюс?Запись от CoderHuligan размещена 03.04.2020 в 19:59
Обновил(-а) CoderHuligan 03.04.2020 в 20:08 -
Запись от voral размещена 03.04.2020 в 22:25 -
Запись от Croessmah размещена 03.04.2020 в 23:14
Обновил(-а) Croessmah 03.04.2020 в 23:34 -
Цитата:
Это для математиков привычны выражения, которые вложены в друг друга, состоят из многоэтажных конструкций и пр.
Для нормального человека привычнее читать текст слева направо, еще раз повторяю. Если порядок операций будет идти строго слева направо, то не нужны таблицы приоритетов, которые часто не помнят программисты, и забывают. Ошибок таких - воз. И компьютер производи вычисления также слева направо последовательно шаг за шагом, операцию за операцией.
Добится этого можно путем не:
а = 4 + 5 + b - c
а:
+ 4 5 a + a b a - a c a
при этом легко работать и с регистрами проца указав компилятору данную опцию.
-----------
Что касается концепций,то стековая концепция ущербна, по крайней мере для процессоров, которые специально не заточены под эту парадигму. Да и подстраиваться по стек это значит подстраиваться под какой то отдельный механизм. Так же можно подстроиться под список, как в Лиспе..Запись от CoderHuligan размещена 04.04.2020 в 09:28
Обновил(-а) CoderHuligan 04.04.2020 в 10:40 -
Цитата:
Вы хотите сказать, что если на улице опросите 100000 человек показав им записи
Цитата:3 + 4 × (2 − 1)
- 2 1 * 4 + 3
Цитата:
2. Где вы эти ошибки видели. Почему решили, что их "воз"?
Действующему программисту напрягает и нужна таблица приоритетов? Что? Бредятина.....
Да есть ситуации когда приоритетность операций не совсем очевидна (к +-*/ это не относится совсем). Но там правило простое - ставь скобки и не парься. Тем более были прецеденты когда в очередной версии языка приоритет менялся. Ну а дилетант и в вашей форме записи сделает 100500 ошибок. Может он читает "у меня есть числа 2 и 1 и я из первого вычитаю второе" и тогда он запишет "2 1 -"
Язык пишется для программистов. Пофиг как и что делает компьютер. Это и есть задача компилятора и интерпретатора.Запись от voral размещена 04.04.2020 в 11:07 -
Цитата:Действующему программисту напрягает и нужна таблица приоритетов? Что? Бредятина.....
Это все потому, что пошли на поводу математиков. У нас своя область. Это математики делали первые языки Фортран, бейсик и пр. Туда были введены формулы, как в книжках пишут. При этом все вычисления должны проходить неявно, а это приводит к возможному переполнению, делению на 0 и пр.
Язык как бы прячет от программиста промежуточные переменные, константные переменные и пр. Как буд то в машине мало памяти и мы экономим на переменных. На самом деле переменная это именованная ячейка памяти, а программа работает с этими ячейками. Функциональные языки наподобие Лисп прячут всеми возможными способами от программистов состояния, а значит и переменные. Тенденция, правда в сторону конечного развала..Конечно и в нынешних языках никто не запрещает явно вычислять выражения.. Так что этот спор скорее академического отвлеченного свойства..Запись от CoderHuligan размещена 04.04.2020 в 11:45
Обновил(-а) CoderHuligan 04.04.2020 в 11:48 -
Цитата:
Т.е. все "гугление" было только и исключительно в образовательных целях. Сомневаешься - ставь скобки. Но на деле мне совершенно не понятно что вы там за таблицу себе в голове нарисовали. Их там в реальности не так много, это во первых. А во вторых там есть своя логика. Разберитесь один раз, и дальше все будет прозрачно и естественно. Ну а в "непонятных" случаях - ставьте скобки.
Более того, я сейчас просто всегда ставлю скобки. Лично мне так удобнее. (+-*/)Запись от voral размещена 04.04.2020 в 11:57 -
На мой взгляд скобки запутывают выражения. Вернее их наглядное представление. Приходится прыгать туда сюда чтобы разобрать выражение, точно также как это делает машина. То есть, повторяюсь, мы не читаем слева направо, а прыгаем. Если выражение достаточно сложное, то его трудно разбирать, надеюсь вы с этим спорить не будете.
Вот вы пишите, что никаких проблем не испытывали. Это совершенно естественно для того, кто проектирует программу, но для человека, который хочет понять вашу программу это может стать проблемой. А если программист смешивает в одном выражении и скобки, и неявное применение порядка операций? Получается дурдом.Запись от CoderHuligan размещена 04.04.2020 в 12:20 -
ИМХО. Более естественный для человека код, к которому вы стремитесь, это тот, который учат с первого класса. А именно 3 + 4 × (2 − 1), его понимает любой человек в мире (если он хотя бы пару классов закончил), ваш код - 2 1 * 4 + 3 нужно разъяснять каждому. Плюс выражение с несколькими вложениями (скобками) нужно еще будет перевести в ваш код, что не всегда тривиально быстро и просто. Зачем козе баян?
Запись от bedvit размещена 04.04.2020 в 12:30 -
Цитата:
Цитата:
Во вторых есть, например, юниттесты, документирование кода и т.п. Если суть в отладке именно этого выражения - можно просто его разбить на составляющие. И это будет точно так же важно и вашей форме записи.. Потому что вы просто мозг сломаете с длинной строки в 100500 символов.
Цитата:Вот вы пишите, что никаких проблем не испытывали. Это совершенно естественно для того, кто проектирует программу, но для человека, который хочет понять вашу программу это может стать проблемой. А если программист смешивает в одном выражении и скобки, и неявное применение порядка операций? Получается дурдом.
Ломать все ради тех, кто хочет "не как все", и кому лень учиться..... несерьезно.Запись от voral размещена 04.04.2020 в 13:05