LINUX.ORG.RU

Метапрог-прототип, версия 7 + графические диалоги на Метапроге

 , ,


0

3

Скачать (перед запуском читайте !Русский.txt или !Українська.txt):

https://www71.zippyshare.com/v/dNcHIgzD/file.html

Новая версия принесла несколько новых фич интерфейса пользователя. Добавлено выделение прямоугольником для вырезания и копирования части диаграммы (в прошлой версии было только копирование и вставка одного блока по щелчку колесом мыши). После копирования куска диаграммы (с проводками с данными и жесткими последовательностями) его можно вставить кликом колесом мыши на пустом месте диаграммы. Есть план реализовать в будущий версиях также создание подфункций из выделенного куска - аналог Create SubVI из LabVIEW (так была сделана немалая часть функций в прототипе Метапрога).

Однако самая интересная фича новой версии - сериализация в base64 координат блока на диаграмме с цепочкой функций. Этому есть как минимум два возможных применения. Можно «ткнуть пальцем» на нужный блок (меню блоки - ткнуть пальцем на блок). Будет сгенерирована строка такого вида:

metaprog_debug:AAAAAAAAAAAAAAAHAAAAAFBUSDAAAAAEAAAAAAAAAAAAAAAAAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAU4fPk6Ov87ejqIO3gIOfg7+jy4PUAAAAK0+rw4L/t8fzq4AAAABXh8+To6/zt6Oog7eAg5+Dv8O7x4PUAAAAH0PPx8ero6VBUSDEAAAAxcmVsIAAr0LHRg9C00LjQu9GM0L3QuNC6INC90LAg0LfQsNC/0LjRgtCw0YUubXBiZBNiCtNfkRABAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAT9rPr7vfo8evu4ujpIOSz4Ovu4wAAAArT6vDgv+3x/OrgAAAAFPbl6+736PHr5e3t++kg5Ojg6+7jAAAAB9Dz8fHq6OlQVEgxAAAANXJlbCAAA25rYwAq0YbRltC70L7Rh9C40YHQu9C+0LLQuNC5INC00ZbQsNC70L7Qsy5tcGJkP/rfBI32qgEAAAADAAAAB01QTCAyLjAAAAAHTElDRU5TRQAAABDy5erx8u7i6Okg5LPg6+7jAAAACtPq8OC/7fH86uAAAAAQ8uXq8fLu4vvpIOTo4Ovu4wAAAAfQ8/Hx6ujpUFRIMQAAAC9yZWwgAANua2MAJNGC0LXQutGB0YLQvtCy0LjQuSDQtNGW0LDQu9C+0LMubXBiZFbEp7cIT2gBAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAV5+Dv8/HqIOKz6u3gIE51a2xlYXIrAAAACtPq8OC/7fH86uAAAAAU5+Dv8/HqIO7q7eAgTnVrbGVhcisAAAAH0PPx8ero6VBUSDAAAAAWAAEAAgNua2MNbmtjIGluaXQubXBiZFQc/+kgVZgBAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAO+PDo9PIg7fPq6+Xg8CsAAAAK0+rw4L/t8fzq4AAAAA748Oj08iDt8+rr5eDwKwAAAAfQ8/Hx6ujpUFRIMQAAADpyZWwgAANua2MAL9GW0L3RltGG0ZbQsNC70ZbQt9Cw0YbRltGPINC90YPQutC70LXQsNGAKy5tcGJkaxMcpv873AEAAAAAUFRIMAAAAAQAAAAAdcftGC2ZsAE=:metaprog_debug

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

Вместо тысячи слов:

https://i.postimg.cc/gd7RZD9Q/image.png

Там будет явно показан конечный блок, на который «ткнули пальцем», либо подфункция, по которой до него следует добираться.

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

https://postimg.cc/hQVLBcHp

Дебаг-строку выводит оранжевый блок.

В новой версии прототипа Метапрога было исправлено множество багов. Теперь метапроговские массивы и СУВТ можно помещать под указатели и вставлять в структуры, не боясь багов. Это позволило добавить к будильнику, реализованному в прошлой версии, диалоги, запрашивающие час и минуту срабатывания будильника.

Для компиляции надо скачать https://sourceforge.net/projects/tinyfiledialogs/

Распаковать в папке с Си-файлом так, чтобы работал соответствующий инклюд.

Код:

https://pastebin.com/5NW30tQx

Введя нужное число, закрываете окошко. После ввода часа и минуты в консоль будет выведено время срабатывания. Теперь будильником можно пользоваться и для повседневных нужд (звук пронзительный, хорошо слышный, sound.wav больше не нужен), однако завершать его работу надо еще через диспетчер задач или Ctrl+C в консоли, когда не идет звук. Также нет проверки введенных чисел, если введете не то число - будильник никогда не сработает.

Нереализованного еще много, но самое главное - условные схождения, без которых невозможно возвращать данные зависимо от условия. Скорее всего, они будут реализованы в следующей версии. Тогда же, возможно, будет более подробное описание концепта Метапрога.

Предыдущая версия:

Метапрог-прототип, версия 6 + будильник на Метапроге

Ответ на: комментарий от metaprog

Опять бессмыслица какая-то. Где там исключения? Пока что ты описываешь обычный ветвящийся код.

И что будет если ты вызываешь функцию? Эта функция может вызывать другие функции, которые вызывают другие функции, которые могут делить на ноль, фейлиться на открытии файла и тому подобное. Как информация об ошибке передаётся между уровнями?

i-rinat ★★★★★ ()
Ответ на: комментарий от metaprog

а вот ООП и тем более динамическая типизация (PyObject) - это зло, и усложняющее програмирование, и замедляющее все в рантайме.

За PyObject не скажу, а вот насчёт ООП это эталонный бред. Программирование сложных систем ООП сильно упрощает. Да и чтобы ООП что-то замедлило в рантайме, это надо ну очень сильно стараться.

hobbit ★★★★★ ()
Ответ на: комментарий от hobbit

Справедливости ради нужно отметить, что ООП применяют для сложных программ. Их действительно сложно понять, потому что они большие и сложные, потому что сложны решаемые ими задачи.

В какой-то степени мышление ТСа можно понять. Большая программа с ООП, ничего не понятно, нужно читать талмуды. Маленький кусочек программы без ООП, всё понятно. ООП объявляется злом, потому что положительно коррелирует со сложностью.

i-rinat ★★★★★ ()
Ответ на: комментарий от hobbit

Что самое смешное я бы мог понять если @metaprog придирался к коду жвм какой-нибудь которая действительно на плюсах (хотя там тоже написано так, что это можно считать обычным С), но к питону который на чистом С доколебываться это конечно даже интересно, тем более доколебаться до PyObject :)



/* Nothing is actually declared to be a PyObject, but every pointer to
 * a Python object can be cast to a PyObject*.  This is inheritance built
 * by hand.  Similarly every pointer to a variable-size Python object can,
 * in addition, be cast to PyVarObject*.
 */
typedef struct _object {
    _PyObject_HEAD_EXTRA
    Py_ssize_t ob_refcnt;
    PyTypeObject *ob_type;
} PyObject;

abcq ★★ ()
Ответ на: комментарий от abcq

собственно на этом же и вся динамика питона построена - именно объект хранит данные о своем типе)) Все просто

saibogo ★★★ ()
Ответ на: комментарий от i-rinat

Такие проверки медленнее исключений в Си++

Быстрее, компилятор перебросит с нижней проверки условия сразу на обработчик ошибок.

stasolog ()
Ответ на: комментарий от stasolog

Ты не понимаешь, о чём пишешь. С явными проверками тебе придётся проверять каждый раз, когда возвращаешься из функции, чтобы протащить ошибку от места появления до обработчика. И проверки будут выполняться всегда. С механизмом исключений в современном Си++ в нормальном потоке исполнения проверок не будет. Вместо этого при генерации исключения рантайм найдёт место обработки и пойдёт напрямую туда.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Зачем что-то протаскивать это же метапрог, можно просто скипать или обрабатывать тут же и надеяться что ты учел все возможные варианты развития, привет говнокод.

abcq ★★ ()
Ответ на: комментарий от i-rinat

С явными проверками тебе придётся проверять каждый раз

зачем? можно же протянуть проводок, на который прыгнут все ошибки и даже конвейером их обработать!

ossa ★★ ()
Последнее исправление: ossa (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Ты не понимаешь, о чём пишешь.

Пора бы антиметапрогерам кое что понять, если они думают что я ошибаюсь, то это значит что они чего то не поняли, или сами ошибаются.

С явными проверками тебе придётся проверять каждый раз, когда возвращаешься из функции, чтобы протащить ошибку от места появления до обработчика.

Я же написал, компилятор вставит в самое нижнее условие где возникла ошибка переход сразу на обработчик. Конечно в коде все не так, но компиляторы шагнули вперед с 60х годов. А уж мой компилятор только так работать и будет!

С механизмом исключений в современном Си++

Все плохо.

stasolog ()
Последнее исправление: stasolog (всего исправлений: 2)
Ответ на: комментарий от i-rinat

Ты не понимаешь, о чём пишешь. С явными проверками тебе придётся проверять каждый раз, когда возвращаешься из функции, чтобы протащить ошибку от места появления до обработчика. И проверки будут выполняться всегда. С механизмом исключений в современном Си++ в нормальном потоке исполнения проверок не будет. Вместо этого при генерации исключения рантайм найдёт место обработки и пойдёт напрямую туда.

Зато если исключение выкинется и нам нужно его обрабатывать это в 200-300 раз медленнее чем подход с if. Поэтому и возникла концепция panic, которые исключения, но для которых специально взяли другое слово, чтобы программист даже не думал их обрабатывать(кроме логгирования). Если нужна обработка то это Result, Either и другие подходы на if…

Вообще Result и panics просто для разного, оба подхода нужны. Вот мне понравилась такая классификация:

Domain Errors. These are errors that are to be expected as part of the business process, and therefore must be included in the design of the domain. For example, an order that is rejected by billing, or an order than contains an invalid product code. The business will already have procedures in place to deal with this kind of thing, and so the code will need to reflect these processes. Domain errors are part of the domain, like anything else, and so should be incorporated into our domain modeling, discussed with domain experts, and documented in the type system if possible. Note that diagnostics are not needed – we are using Result as a glorified bool.

Panics. These are errors that leave the system in an unknown state, such as unhandleable system errors (e.g. “out of memory”) or errors caused by programmer oversight (e.g. “divide by zero,” “null reference”). Panics are best handled by abandoning the workflow and raising an exception which is then caught and logged at the highest appropriate level (e.g. the main function of the application or equivalent).

Infrastructure Errors. These are errors that are to be expected as part of the architecture, but are not part of any business process and are not included in the domain. For example, a network timeout, or an authentication failure. Sometimes handling these should be modeled as part of the domain, and sometimes they can be treated as panics. If in doubt, ask a domain expert!

В С необязательно переизобретать exceptions, можно использовать abort для panics. В раст тоже можно задать использовать abort, вместо exceptions для паники, хотя по умолчанию exeptions…

fsb4000 ★★★★ ()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Другие подходы никто не оспаривает, оспаривают лишь то, что пока это набор if, и что нужны как минимум еще какие-то стратегии. Теперь надо чтобы @metaprog это понял и принял.

abcq ★★ ()
Ответ на: комментарий от fsb4000

Зато если исключение выкинется и нам нужно его обрабатывать это в 200-300 раз медленнее чем подход с if.

Это ещё оптимистичные оценки. Для разворачивания стека нужно довольно много действий совершать. Но ты эту цену заплатишь только если бросаешь исключение. Которое, по названию, исключительная ситуация. А вот зато if’ы будут есть процессорное время понемножку, но всегда и везде.

Поэтому и возникла концепция panic

Эээ, нет. За уши притянуто. Паника нужна, чтобы обработка кодов возврата не превращалась в пытку. Явно не из-за вычислительной стоимости исключений.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Мимими зашкаливает, схоронил.

Ты вот тут развлекаешься, а я с дочкой связь потерял. Незнай как с ней связаться? Как восстановить ввод/вывод дочернего процесса? Я знаю ты знаешь, скажи пажалста что ты знаешь =)

LINUX-ORG-RU ★★ ()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Мне, кстати, в плане обработки ошибок нравится Go. Там функции могут возвращать сразу несколько значений. Так удобно возвращать результат функции и специальный тип (интерфейс) error и затем проверять этот error на nil, а также, имплементируя интерфейс error, можно создавать свои типы ошибок и при помощи обычного свитча проводить type assertions, сверяя вернувшуюся ошибку с нужным типом. Ну и, разумеется, есть panic(), который тоже можно ловить при помощи recover() для того же логгирования и вывода стектрейса. В Расте вроде тоже похожая система, да? До раста пока руки не дотягиваются.

Unicode4all ★★★★★ ()
Ответ на: комментарий от Unicode4all

Ну да, наверное что-то похожее. Я вот go правда вообще не знаю.

Только ещё в Rust/F#/Haskell и других похожих языках можно проверять ошибки не на каждом шаге, а лишь на последнем.

let result = Some(n)
    .map(func1) 
    .map(func2)
    .map(func3)
    .and_then(func4)
    .map(func5)
    .and_then(func6);

match result {
    Some(x) => println!("Result was {}.", x),
    None    => println!("This failed.")
}

Если где-то в цепочке вызовов нам вернут None, то тогда дальше ничего не будет вызываться, и весь result будет None.

fsb4000 ★★★★ ()
Ответ на: комментарий от Unicode4all

Да не, го это прошлый век. nil это совсем не комильфо((

provaton ★★★★★ ()
Ответ на: комментарий от Unicode4all

Хотя вот вспомнил комментарий, к одному просмотренному видео:

Well, thank you Scott - now I just can’t use Go anymore. I knew it’s error handling is ugly but knowing how elegant the solution can be is even more painful.

https://www.youtube.com/watch?v=Nrp_LZ-XGsY&lc=Ugw9vyZbk5bHrYqsLs94AaABAg

Так что если когда-нибудь появится время, то можно посмотреть видео, хоть и про F#, но в Rust почти до буквы тоже самое Option, Result, match. Rust и F# оба - это развитие семейства языков ML, примерно как С++ и Java - С подобные языки.

Может тоже не сможешь использовать Go, после просмотра видео :)

fsb4000 ★★★★ ()
Ответ на: комментарий от fsb4000

Может тоже не сможешь использовать Go, после просмотра видео :)

Пфф! Мы тут Си используем после просмотра этих ваших видео. И ничего, всё ещё норм.

i-rinat ★★★★★ ()
Ответ на: комментарий от metaprog

И вот эти погоняй у себя

И каким боком Плюсы в разы медленнее ? Каким боком паскаль в разы медленнее ? Хруст в разы медленее? ObjectC тоже в разы медленее?

Чёт у тебя дичь пошла.

Как всегда, пердеж в лужу. Не припомню чтоб использовал ZverCD, всегда предпочитал «чистую» ХР, которую вообще не переустанавливал (даже между хардами переносил, когда покупал новые). А дотнет появился уже в 2002, релиз ХР - 2001.

Релиз никто в здравом уме не юзал, ключное говно, которое допилили к SP2-3. Хотя какая разница, если в 2001 метапроге гонял пиратские диски, на каждом из которых был дотнет.

shpinog ★★ ()
Ответ на: комментарий от shpinog

вселенная метапрога отличается от вселенной марвелл только набором супергероев (С, АСМ, метапрог, Диана, Царь) и злодеев (скриптуха, пайобджект, ООП, всякие учоные со своей ненужной заумью и орды антиметапрогеров боыжжущих слюной от зависти).

Уже можно рисовать комиксы и снимать блокбастеров, будет круче чем про трансформеров.

AntonI ()
Ответ на: комментарий от provaton

и что же, божественная сишка не на первом месте

Уж царь бы высказался по этому поводу:

https://tsar1997.blogspot.com/2019/10/blog-post_24.html

Он вроде делал бенчи где уделывал раст, но тему на ЛОРе удалили. Кстати:

-march=core2

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

metaprog ()
Ответ на: комментарий от i-rinat

Где там исключения? Пока что ты описываешь обычный ветвящийся код.

Ладно, пускай исключений нет - это даже к лучшему. Не нужен будет рантайм.

С тем же делением на ноль может быть несколько подходов. Можно, например, возвращать флаг «деление на ноль», а не только результат. Можно делать abort, можно выводить ошибку, можно возвращать какой-то INT_MAX, в общем возможностей море и какие из них использовать в случае деления на ноль в стандартой функции я еще не определился. Во всяком случае, сделать реализации, отличные от стандартной, тоже можно.

metaprog ()
Ответ на: комментарий от metaprog

Итого, вместо одной простой операции деления, ты делаешь АБСТРАКЦИЮ в виде функции деления с оверхедом в виде проверки условия.

Теперь вопрос. Как работать с библиотеками, в которых нет этой проверки? А если что-то внутри libc поделит на ноль? А как быть с другими ошибками? Корки именно поэтому и существуют, чтобы такие ситуации можно было отладить в единой манере. Но поскольку ты не осилил сделать нормальный транслятор, тебе приходится городить абстракции и забор из костылей.

liksys ★★ ()
Ответ на: комментарий от abcq

к питону который на чистом С доколебываться это конечно даже интересно, тем более доколебаться до PyObject:)

Да уж, это жесть. Тащить В РАНТАЙМЕ на КАЖДУЮ переменную целую структуру, содержающую тип, особенно там, где можно обойтись обычным числовым типом, еще и стектрейсы ловить во время исполнения - этого мне не понять.

Я вот использую всякие «составные» плюшки типа метапроговских массивов и СУВТ только там, где они реально нужны. Да и то типизирую все статически, что позволяет компилятору оптимизировать все до предела. Глупости делаю, так ведь?

metaprog ()
Ответ на: комментарий от fsb4000

Да уж, посмеялся. Адептом динамической типизации мне не понять.

metaprog ()
Ответ на: комментарий от fsb4000

Может тоже не сможешь использовать Go, после просмотра видео :)

Я вот после Лабвью ничего из текстовых ЯП уже не смогу использовать:)

metaprog ()
Ответ на: комментарий от metaprog

Я это написал лишь к тому, что вы тут PyObject выдавали чуть ли не за супер абстракцию, а на деле это просто структурка обычная.

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

abcq ★★ ()
Последнее исправление: abcq (всего исправлений: 3)
Ответ на: комментарий от metaprog

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

abcq ★★ ()
Ответ на: комментарий от metaprog

Можно делать abort

Ударом о борт.

ЗЫ: друзья, извините, сегодня на работе наши девочки поздравили нас с наступающим праздником. Поэтому объективной критики не будет, буду прикалываться.

cluge ()
Ответ на: комментарий от AntonI

вселенная метапрога отличается от вселенной марвелл только набором супергероев (С, АСМ, метапрог, Диана, Царь) и злодеев (скриптуха, пайобджект, ООП, всякие учоные со своей ненужной заумью и орды антиметапрогеров боыжжущих слюной от зависти).
Уже можно рисовать комиксы и снимать блокбастеров, будет круче чем про трансформеров.

Пиши заявку Бекмамбетову

Ramil ★★★★ ()
Ограничение на отправку комментариев: