Форум программистов, компьютерный форум, киберфорум
CoderHuligan
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Рейтинг: 2.67. Голосов: 3.

Продолжение формализации. Некоторые идеи #2

Запись от CoderHuligan размещена 03.04.2020 в 14:32
Обновил(-а) CoderHuligan 04.04.2020 в 09:30

(Добавлено позднее: это конечно заблуждение, но оно интересно с точки зрения фантазии...)
Кстати, о птичках (не так сложно написать компилятор, как формализовать ЯП без сайд эффектов)
Если не отказываться от стека (пусть даже виртуального), а все же оставить некую общую структуру для передачи данных, то можно сделать вот что.
Можно обратную польскую запись, как бы это мягче выразиться.. - даже не "выровнять", а обратить любое выражение в последовательность элементарных инструкций, как это было описано в предыдущем посте данного блога, но гораздо проще.
Что предлагается?
А вот что:
Итак:
1) у нас есть, допустим стек;
2) но мы не хотим использовать сложные вложенные выражения со скобками, которые трудно разбирать;
3) использовать старшинство операций по умолчанию(источник ошибок);
4) нас тошнит от синтаксиса Forth;
5) мы хотим все сделать "по компьютерному" а не по....
Чтобы не ходить далеко, начнем сразу с примера:
Допустим у нас есть классическое инфиксное выражение (для домохозяек):
Visual Basic
1
3 + 4 × (2 − 1)
Давайте запишем его на нашем гипотетическом командном basic.
Теперь у нас имеются кроме бинарных и "унарные" операции. Использую термин "унарные" только в данном контексте и прошу не путать их с унарными в обычном.
Запишем вышеприведенное выражение таким образом (сразу предупреждаю, что это НЕ префиксная и НЕ постфиксная запись!!!):
Visual Basic
1
- 2 1 * 4 + 3
Что здесь происходит? Сначала, по старшинству операций мы вычитаем используя бинарную (в которой участвуют два операнда) операцию "-". Эта операция (команда) складывает 2 и 1, а результат кладет на стек. Далее нам нужно умножить результат на стеке на 4. Для этого используется унарная (из-за внешности) операция *, которая снимает со стека результат прежней операции и умножает его на число 4 (один непосредственный аргумент), а результат кладет на стек. Унарный + делает то же самое, только складывает число на вершине стека со своим единственным аргументом.
Теперь, что же мы получили в итоге? Мы, внимание, - выровняли выражение, и привели его к естественным последовательностям инструкций!
Это значит, что теперь это выражение стало совершенно естественным, так как его нужно читать слева направо до самого конца, чтобы его понять, как читаем мы обычные тексты. Нам не нужно прыгать по выражению в поисках первой операции по старшинству. Также мы избавились от лишних промежуточных переменных (как это было в прошлом посте), коих просто нет.
Обозначение и лексическое отделение бинарных операций от унарных требует своей проработки. например, унарную операцию "+" можно представить бинарной при помощи ключевого слова "ADD": ADD 3 в.
Или использовать односимвольное обозначение.
Более того, такую запись возможно сжимать убирая пробелы между операциями:
Visual Basic
1
- 2 1*4+3
К тому же это позволяет избавится (избавляемся от всего ненужного...)и от отделения команд-операций друг от друга путем прибавления к их хвосту символа ";", так как лексер и так всё хорошо разберет. Но это уже для "эстетов".
Более полная проработка данной идеи будет, надеюсь, позднее.
Мы привели Forth к нормальному человеческому виду при этом оставив его простоту..
А теперь пойдем дальше и... приготовьтесь.. избавимся и от "бинарных" операций!
Преобразуем наше выражение 3 + 4 × (2 − 1) в:
Visual Basic
1
2 - 1 * 4 + 3
Тут нет "бинарных" операций. Число "2" имеет такой смысл: его просто кладут на стек (перед ним нет арифметического оператора). Дальше все как обычно. Ну и сжимаем до неприличия:
Visual Basic
1
2-1*4+3
По прежнему эти выровненные выражения можно использовать например в :
Visual Basic
1
IF a > b 30
Заметьте: теперь пропала запятая, которая отделяла метку перехода (последняя) от операции. Еще одно упрощение.. А если применить обычную структурную условную конструкцию:
Visual Basic
1
2
3
4
IF a > b 
  "code"
else
  "code"
то можно избавится от then. Хотя, если вместо "выражения"(которое не является настоящим выражением) будет просто переменная, то невозможно будет отделить следующий код.. Поэтому тут возможно нужен then в качестве открывающей скобки.
(В выражении a > b, "a" кладется на стек, а оператор > снимает значение переменной со стека сравнивает это значение с "b")
Логическое выражение:
Visual Basic
1
a < c && g > d
Транслируется например в:
Visual Basic
1
a < c g > d &&
Смысл && в том, что он снимает два верхних значения и применяет к ним логическую операцию "и".

Заметьте: длина нашего выражения не длиннее обычного, куда-то испарились все приоритеты, а читать стало намного приятнее!
Еще это позволяет почти один в один транслировать выражение в байт код виртуальной машины, надеюсь преимущества тут совершенно очевидны: высокая скорость трансляции. Предлагаю назвать такой способ записи выражений "прямым", хотя предлагайте свои варианты наименования.
Прошу не судить строго. Я пока нахожусь в поиске.
Спасибо за внимание.
Размещено в Без категории
Показов 15772 Комментарии 221
Всего комментариев 221
Комментарии
  1. Старый комментарий
    Аватар для CoderHuligan
    Предлагаю осознать что же сейчас произошло...
    Запись от CoderHuligan размещена 03.04.2020 в 17:29 CoderHuligan вне форума
  2. Старый комментарий
    Аватар для Usaga
    Когда изобретают новый ЯП, то стараются устранить серьёзные недостатки существующих. По вашему, расположение оператора && - это такой лютый недостаток того же Си, что надо придумывать новый ЯП?
    Запись от Usaga размещена 03.04.2020 в 17:32 Usaga вне форума
  3. Старый комментарий
    Аватар для Usaga
    Цитата:
    Предлагаю осознать что же сейчас произошло...
    Тут всё просто: очередное велосипедостроение и битва с ветряными мельницами.
    Запись от Usaga размещена 03.04.2020 в 17:33 Usaga вне форума
  4. Старый комментарий
    Язык программирования, который пишется не на ассемблере с массовым использованием AVX - это забава для детей.
    Запись от IamLost размещена 03.04.2020 в 17:51 IamLost вне форума
  5. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    По вашему, расположение оператора && - это такой лютый недостаток того же Си, что надо придумывать новый ЯП?
    Причем здесь оператор &&? Я предлагаю читать выражения слева направо как мы привыкли читать книги. Существующие выражения не отвечают этому.
    Цитата:
    Язык программирования, который пишется не на ассемблере с массовым использованием AVX - это забава для детей.
    Тогда дети все те, кто пользуется языками с виртуальной машиной под капотом и написаны на С: java, Pithon, C#.. Продолжить?
    Запись от CoderHuligan размещена 03.04.2020 в 17:55 CoderHuligan вне форума
    Обновил(-а) CoderHuligan 03.04.2020 в 18:08
  6. Старый комментарий
    Аватар для Usaga
    Цитата:
    Причем здесь оператор &&? Я предлагаю читать выражения слева направо как мы привыкли читать книги. Существующие выражения не отвечают этому.
    Зачем?

    Цитата:
    Тогда дети все те, кто пользуется языками с виртуальной машиной под капотом и написаны на С: java, Pithon, C#.. Продолжить?
    Это был сарказм. Кстати, компилятор C# написан на C# (начиная года с пятнадцатого где-то).
    Запись от Usaga размещена 03.04.2020 в 18:21 Usaga вне форума
  7. Старый комментарий
    Аватар для Croessmah
    Цитата:
    Я предлагаю читать выражения слева направо как мы привыкли читать книги.
    Тогда стоит ознакомиться с языком karasic.
    Запись от Croessmah размещена 03.04.2020 в 18:48 Croessmah вне форума
  8. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Зачем?
    Затем, что к этому стремятся большинство разработчиков, а именно: к более естественному для человека коду.
    Цитата:
    Тогда стоит ознакомиться с языком karasic.
    Мне не нравится.
    Перевернули присваивания наоборот.
    Можно сделать нечто такого:
    PureBasic
    1
    
    3 TO a
    Число 3 кладем на стек, затем команда TO заносит его по адресу a. Причем такая команда может снимать со стека результаты любых выражений и сразу отправлять их по адресу.
    Запись от CoderHuligan размещена 03.04.2020 в 19:17 CoderHuligan вне форума
  9. Старый комментарий
    Уважаемый CoderHuligan,
    1. как вы намерены различать бинарный минус от унарного? Это ведь разные операции.
    2. предполагается ли использовать унарный плюс?
    Запись от wer1 размещена 03.04.2020 в 19:48 wer1 вне форума
  10. Старый комментарий
    Аватар для Usaga
    Цитата:
    Затем, что к этому стремятся большинство разработчиков, а именно: к более естественному для человека коду.
    Вы себя нарекли "большинством"?
    Запись от Usaga размещена 03.04.2020 в 19:52 Usaga вне форума
  11. Старый комментарий
    Аватар для CoderHuligan
    Нет, такая запись не подходит из-за операций деления и вычитания.. Придется реверсировать порядок операций при делении и вычитании, и уже не приходится говорить о чтении слева направо.. Эх полет фантазии..

    Цитата:
    1. как вы намерены различать бинарный минус от унарного? Это ведь разные операции.
    2. предполагается ли использовать унарный плюс?
    Тут нет проблем - это делает лексический анализатор. Честно говоря я уже разочарован в своей концепции. Хотя.. если помнить о порядке вычисления операндов для минуса деления, то можно.
    Запись от CoderHuligan размещена 03.04.2020 в 19:59 CoderHuligan вне форума
    Обновил(-а) CoderHuligan 03.04.2020 в 20:08
  12. Старый комментарий
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Затем, что к этому стремятся большинство разработчиков, а именно: к более естественному для человека коду.
    Интересно в какой школе вы учились, что для вас привычно арифметические выражения читать так. Конечно привыкнуть можно ко всему..... Но зачем?
    Запись от voral размещена 03.04.2020 в 22:25 voral вне форума
  13. Старый комментарий
    Аватар для Croessmah
    Цитата:
    Но зачем?
    Чтобы не быть как все.
    Запись от Croessmah размещена 03.04.2020 в 23:14 Croessmah вне форума
    Обновил(-а) Croessmah 03.04.2020 в 23:34
  14. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от voral Просмотреть комментарий
    Интересно в какой школе вы учились, что для вас привычно арифметические выражения читать так. Конечно привыкнуть можно ко всему..... Но зачем?
    voral
    Это для математиков привычны выражения, которые вложены в друг друга, состоят из многоэтажных конструкций и пр.
    Для нормального человека привычнее читать текст слева направо, еще раз повторяю. Если порядок операций будет идти строго слева направо, то не нужны таблицы приоритетов, которые часто не помнят программисты, и забывают. Ошибок таких - воз. И компьютер производи вычисления также слева направо последовательно шаг за шагом, операцию за операцией.
    Добится этого можно путем не:
    а = 4 + 5 + b - c
    а:
    + 4 5 a + a b a - a c a
    при этом легко работать и с регистрами проца указав компилятору данную опцию.
    -----------
    Что касается концепций,то стековая концепция ущербна, по крайней мере для процессоров, которые специально не заточены под эту парадигму. Да и подстраиваться по стек это значит подстраиваться под какой то отдельный механизм. Так же можно подстроиться под список, как в Лиспе..
    Запись от CoderHuligan размещена 04.04.2020 в 09:28 CoderHuligan вне форума
    Обновил(-а) CoderHuligan 04.04.2020 в 10:40
  15. Старый комментарий
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    voral
    Это для математиков привычны выражения, которые вложены в друг друга, состоят из многоэтажных конструкций и пр.
    Для нормального человека привычнее читать текст слева направо, еще раз повторяю. ..
    Полный бред.
    Вы хотите сказать, что если на улице опросите 100000 человек показав им записи
    Цитата:
    3 + 4 × (2 − 1)
    - 2 1 * 4 + 3
    то 99% "прочтут" вашу вторую запись? Теперь к вопрос о школе в которой вы учились у меня добаляется вопрос и "где вы живете"....
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Если порядок операций будет идти строго слева направо, то не нужны таблицы приоритетов, которые часто не помнят программисты, и забывают. Ошибок таких - воз.
    1. Не надо к программистам причислять двоечников?
    2. Где вы эти ошибки видели. Почему решили, что их "воз"?

    Действующему программисту напрягает и нужна таблица приоритетов? Что? Бредятина.....
    Да есть ситуации когда приоритетность операций не совсем очевидна (к +-*/ это не относится совсем). Но там правило простое - ставь скобки и не парься. Тем более были прецеденты когда в очередной версии языка приоритет менялся. Ну а дилетант и в вашей форме записи сделает 100500 ошибок. Может он читает "у меня есть числа 2 и 1 и я из первого вычитаю второе" и тогда он запишет "2 1 -"

    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    И компьютер производи вычисления также слева направо последовательно шаг за шагом, операцию за операцией.
    Язык пишется для программистов. Пофиг как и что делает компьютер. Это и есть задача компилятора и интерпретатора.
    Запись от voral размещена 04.04.2020 в 11:07 voral вне форума
  16. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Действующему программисту напрягает и нужна таблица приоритетов? Что? Бредятина.....
    загуглите сколько приоритетов в языке с или с++. Десятки. Причем кроме приоритетов надо помнить и порядок вычисления операторов с одинаковым приоритетом. Бывает что слева направо, а бывает и справа налево. Это все надо помнить как таблицу умножения. Но 99% не заглянув в справочник не смогут отобразить её всю.
    Это все потому, что пошли на поводу математиков. У нас своя область. Это математики делали первые языки Фортран, бейсик и пр. Туда были введены формулы, как в книжках пишут. При этом все вычисления должны проходить неявно, а это приводит к возможному переполнению, делению на 0 и пр.
    Язык как бы прячет от программиста промежуточные переменные, константные переменные и пр. Как буд то в машине мало памяти и мы экономим на переменных. На самом деле переменная это именованная ячейка памяти, а программа работает с этими ячейками. Функциональные языки наподобие Лисп прячут всеми возможными способами от программистов состояния, а значит и переменные. Тенденция, правда в сторону конечного развала..Конечно и в нынешних языках никто не запрещает явно вычислять выражения.. Так что этот спор скорее академического отвлеченного свойства..
    Запись от CoderHuligan размещена 04.04.2020 в 11:45 CoderHuligan вне форума
    Обновил(-а) CoderHuligan 04.04.2020 в 11:48
  17. Старый комментарий
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    загуглите сколько приоритетов в языке с или с++. Десятки. Причем кроме приоритетов надо помнить и порядок вычисления операторов с одинаковым приоритетом. Бывает что слева направо, а бывает и справа налево.
    Повторюсь: не путайте двоечников и программистов. Подскажите вот я написал несколько коммерческих проектов на плюсах. Почему меня эта проблема не коснулась? Логики там было порядком. (В частности серия проектов это сбор информации с контроллеров, их преобразование и отправка). Еще могу вспомнить разработку САПР грозозащиты (но это было еще на Turbo Pascal). Ну высосали вы эту проблему. Да были по началу у меня проблемы с пониманием... Но потом просто стал ставить скобки даже не задумываясь.

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


    Более того, я сейчас просто всегда ставлю скобки. Лично мне так удобнее. (+-*/)
    Запись от voral размещена 04.04.2020 в 11:57 voral вне форума
  18. Старый комментарий
    Аватар для CoderHuligan
    На мой взгляд скобки запутывают выражения. Вернее их наглядное представление. Приходится прыгать туда сюда чтобы разобрать выражение, точно также как это делает машина. То есть, повторяюсь, мы не читаем слева направо, а прыгаем. Если выражение достаточно сложное, то его трудно разбирать, надеюсь вы с этим спорить не будете.
    Вот вы пишите, что никаких проблем не испытывали. Это совершенно естественно для того, кто проектирует программу, но для человека, который хочет понять вашу программу это может стать проблемой. А если программист смешивает в одном выражении и скобки, и неявное применение порядка операций? Получается дурдом.
    Запись от CoderHuligan размещена 04.04.2020 в 12:20 CoderHuligan вне форума
  19. Старый комментарий
    Аватар для bedvit
    ИМХО. Более естественный для человека код, к которому вы стремитесь, это тот, который учат с первого класса. А именно 3 + 4 × (2 − 1), его понимает любой человек в мире (если он хотя бы пару классов закончил), ваш код - 2 1 * 4 + 3 нужно разъяснять каждому. Плюс выражение с несколькими вложениями (скобками) нужно еще будет перевести в ваш код, что не всегда тривиально быстро и просто. Зачем козе баян?
    Запись от bedvit размещена 04.04.2020 в 12:30 bedvit вне форума
  20. Старый комментарий
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    На мой взгляд скобки запутывают выражения. Вернее их наглядное представление. Приходится прыгать туда сюда чтобы разобрать выражение, точно также как это делает машина. То есть, повторяюсь, мы не читаем слева направо, а прыгаем.
    Ну в таких выводах не надо ориентироваться на ваш взгляд. Большинство прекрасно работают со скобками и легко понимают. Почему вы говорит за всех? Все языки программирования пишут не так "чтоб было". А так как удобно. И да, хороший программист всегда в значительной мере математик.

    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Если выражение достаточно сложное, то его трудно разбирать, надеюсь вы с этим спорить не будете.
    Буду. Потому, что не так часто это встречается. Ради 1% случаев делать нечитабельными 99% случаев. Это бред.
    Во вторых есть, например, юниттесты, документирование кода и т.п. Если суть в отладке именно этого выражения - можно просто его разбить на составляющие. И это будет точно так же важно и вашей форме записи.. Потому что вы просто мозг сломаете с длинной строки в 100500 символов.

    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Вот вы пишите, что никаких проблем не испытывали. Это совершенно естественно для того, кто проектирует программу, но для человека, который хочет понять вашу программу это может стать проблемой. А если программист смешивает в одном выражении и скобки, и неявное применение порядка операций? Получается дурдом.
    Опять же повторюсь. Не надо пускать к проекту дилетантов и будет вам счастье. Другой программист точно так же воспринимает эту запись. Описываемая вами ситуация может быть только в двух случаях: если читающий ваш последователь смотрящий на все не так как приянто, второе - программист с низкой квалификацией.

    Ломать все ради тех, кто хочет "не как все", и кому лень учиться..... несерьезно.
    Запись от voral размещена 04.04.2020 в 13:05 voral вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru