LINUX.ORG.RU

Метапрог-прототип, версия 11 + бенчмарк

 , ,


1

3

Следующая версия:

Метапрог-прототип 13 + LOR Browser

Скачать (читать файл с названием своего языка из архива!):

https://www111.zippyshare.com/v/Nq5mH4Sa/file.html

Версия 11 содержит оптимизации транслятора и исправления в Метапрог онлайн. В остальном различий с описанием 10 версии нет.

Версия 10 содержит несколько хотфиксов для транслятора диаграмм и онлайн-функционала. В остальном различий в сравнении с описанием 9 версии нет.

Версия 9 содержит хотфикс: в 8 версии были проблемы со скачиванием проектов через Метапрог онлайн. В остальном различий в сравнении с описанием 8 версии нет.

В текущей версии прототипа наконец-то исправлены проблемы с отображением справки в скомпилированном ехе (рекомендую изучить справочную систему) и реализованы условные схождения. Это означает, что на нем можно делать уже по-настоящему сложную логику. Например, бенчмарк, предложенный в прошлых темах. Другие уже сделали множество реализаций на разных текстовых языках программирования, я сделал реализацию на Лабвью - а теперь это возможно и на Метапроге. Исходная задача на бенчмарк: Метапрог-прототип, версия 6 + будильник на Метапроге (комментарий)

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

https://www32.zippyshare.com/v/JlUIhEAn/file.html или https://drive.google.com/file/d/1lu1RVqqXEVGgZbviCfwrxFMhdDgvo6LT/view

Доступ к Метапрог-диаграммам можно получить через Метапрог онлайн (репозиторий «бенчмарк ЛОР»), открыть - в прототипе Метапрога.

Каждый бенчмарк проходит 10 повторений, во время каждого выводится 4 числа:

Номер повторения (0-9).

Время (миллисекунды) генерации 100000 строк длиной 100 байт и подсчета их хешей.

Время (миллисекунды) генерации 1000 строк по 20 байт и подсчета их хешей.

Время (миллисекунды) поиска вхождний по хешам.

В случае каждого нахождения вхождения в консоль/stdout выводятся подстрока и строка.

В тестах в случае совпадения хешей в консоль/stdout выводится строка «мяу». Кстати, совпадения хешей случаются даже с 20-символьными подстроками, хотя самих вхождений нет (идет дополнительная проверка).

Условное схождение присутствует, например, в функции генерации случайной английской буквы (A-Z_a-z.bmp, между условием и «+»). После слияния веток с данными (или жесткими последовательностями выполнения) от противоположных условий дальнейшие блоки выполняются в обеих случаях.

Есть разные функции генерации случайного числа, и они совершенно разные по скорости. Если использовать randombytes_uniform из библиотеки libsodium - генерация случайных строк работает в сотни раз медленнее, чем rand. Но функция randombytes_uniform из специальной криптографической библиотеки дает «по-настоящему» случайные числа, в отличие от строк из псевдослучайных чисел (rand), которые повторяются даже между разными запусками программы. Есть тесты, использующие разные функции для случайного числа при генерации 100000 строк по 100 байт. Генерация 1000 строк по 20 байт погоды не делает, тут во всех тестах randombytes_uniform. Уверен, что rand сократило б время генерации 1000 строк по 20 байт до нуля миллисекунд.

Подсчет хешей функцией nk_murmur_hash во всех случаях занимает ничтожную часть времени.

Также для тестирования на достоверность и корректность работы программы есть тесты с подстроками по 5 и 3 байта вместо 20. По ним видно, что бенчмарк работает корректно.

В Метапрог-диагармме подфункции/поддиагарммы могут быть представлены в виде ссылок на файлы (серо-зеленая дискетка при наведении мышью) или же быть частично или полностью отвязанными от файла на диске и полностью находиться в теле файла диагарммы (в таком случае цвет дискетки зависит от наличия и соответствия файлу на диске - путь к нему все же хранится в кластере/структуре диаграммы). Иногда это удобно, чтобы, например, сделать локальный форк подфункции. Например, чтобы использовать rand вместо randombytes_uniform, достаточно было форкнуть диаграмму основного бенчмарка и сделать отвязку от файлов на диске цепочки поддиаграмм, отвечающих за формирование массива случайных строк вплоть до функции генерации псевдослучайного числа. В итоге получились локальные форки функций без необходимости сохранять их в новые файлы. Подобным образом можно управлять и типами, такими как структура/выбор (struct/union), структура условного выбора типа (СУВТ, прямых аналогов в Си нет), пронумерованный список (enum) итд.

Бонус: будильник с проверкой введенных значений (сишная трансляция в файле alarm.c в архиве с бенчмарком, Метапрог-диагарммы в Метапрог онлайн, проект «будильник»).

Из недоделанного: схождения по переключателю (switch) корректно работают только в случае схождения всех без исключения случаев, в том числе «інше»/«другое» (default).

Также заметно, что диагарммы бенчмарков «оплелись» в области поиска подстрок. В прототипе Метапрога работать не очень удобно: есть ограничение на размер окна (если еще увеличить - будут слишком большие задержки отрисовки) и не только, переместить блок входа в цикл по условию (do... while), когда он стал перекрывать вход в типованный цикл (for) было уже довольно сложно (надо переподключать проводки и жесткие последовательности), решил оставить все как есть - все равно работает. В Метапроге «сам на себе», когда он появится, подобных неудобств быть не должно.

В планах: циклы по структурам, переключатели (switch) по многотиповому типу, возможно макросы.

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



Последнее исправление: metaprog (всего исправлений: 7)

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

Это твой будильник.

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

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

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

В отличие от вас, готов к критике.

Сделай кнопку прятанья будильника в трей, что бы работало на линуксе и винде.

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

добавь возможность добавлять будильники.

в тикле что один after, что десяток. Это можно. Надо ограничить сигнал одного будильника каким-то временем, 5 минут сигнал. Только пока не понятно, как будет вести себя программа, если один будильник наложиться на другой – это тоже надо будет как-то разруливать.

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

вот как встроенный будильник в десяточке выглядит

Я уже постил такой скриншот. Как пример, как может выглядеть нормальный интрефейс. Только не в коня корм.

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

В отличие от вас, готов к критике.

Написать будильник на метапроге, задействовать при этом грибоэлектрические знания древних русов!

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

Сделай кнопку прятанья будильника в трей, что бы работало на линуксе и винде.

В винде может быть и сделаю. В линуксе, вряд ли. Ну не такие мои скиллы, я гуем лет десять не занимался.

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

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

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

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

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

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

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

Написать будильник на метапроге, задействовать при этом грибоэлектрические знания древних русов!

Я столько не смогу выпить.

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

Он, похоже, не понимает, что «и так сойдет», «компилируется, ну и хорошо», в итоге, к ничему хорошему, если не принимать во внимание саму концепцию, не приведет.

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

Нет я таких высот в исскустве конспирации пока не достиг. :)

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

Еще из WSL можно запустить calc.exe, да и в общем то все что есть в PATH. Кстати, рекомендую MobaXterm для графики, достаточно лишь поставить «xorg», и запуская из терминала MobaXterm какую либо графическую программу, он ее отобразит как будто бы она виндовая, и не нужно никаких рабочих линуксовых столов. Вот так это выглядит: https://ibb.co/F7FjZpv

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

Yo dawg so i heard you like Linux so we put Linux in your Windows so you can use Linux while you using Windows.

Razk
()
Последнее исправление: Razk (всего исправлений: 1)

Бонус: будильник с проверкой введенных значений

Наконец софт корпоративного уровня, беру все свои слова обратно!

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

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

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

Не-а. По крайней мере, не в ближайшем будущем.

Жаль, видео были прикольные.

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

Но автор так не сделал, а решил копипастить код бенчмарка, чтобы изменить одну только функцию. Почему?

Потому что гладиолус.

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

Я уже писал что осилю за 5 минут, у тебя что, проблемы с пониманием текста?

Ты уже два месяца делаешь AppImage с метапрогом, который грозился выложить к следующей версии прототипа. Вышло уже несколько версий.

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

Дык ТС пропал, видимо по его возвращении наш ждет шедевр enterprise software development. Майкрософт сразу удалит свою студию, с заменой сам понимешь на что. А споры на ЛОР какой ЯП «самый самый» станут полностью бессмысленны.

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

Razk
()
Последнее исправление: Razk (всего исправлений: 5)
Ответ на: комментарий от Unicode4all

Решил не заморачиваться со сложным версионированием и обойтись обычным инкрементом. Вот в игрушке Oxygen Not Included тоже простой инкремент, счет версий идет на сотни тысяч - и выглядит это довольно-таки понятно. 100 лет назад считалось, что человек не способен запомнить 7-значный телефонный номер, из-за чего первые 3 цифры заменяли словом, первые 3 буквы которого переводили в цифры.

Мне вот не совсем понятна логика наименования версий, скажем, того же ядра линукс. Ладно 0.01, 0.02 и 0.12 (совсем сырая, сырая с патчем и чуть менее сырая, умеющая своп), но в чем такое кардинальное отличие линуксов версий 4 и 5? И не проще ли тупо инкрементировать одно число?

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

Fuzz-testing это и есть методика. Программу оставляю на твое усмотрение.

Отдельные функции в Метапроге я тестирую.

Твой самый быстрый бенчмарк с «ненастоящими» случайными числами (rand.c) сливает сишке в ЧЕТЫРЕ раза. Ты сам это признал

Даже в заглавном посте я это писал. Тут черт пойми что не так с поиском в одномерном массиве и как его ускорить - видимо, не хватает аппаратного ускорения, которе есть в реализациях strstr. А вот генерация хешей, кстати, мгновенная. Интересно что будет с параллелизацией, до такого руки еще не доходили.

Да, я завтыкал и не заметил, что в питоне только один проход. Прошу прощения, был недостаточно внимателен.

Будь внимательнее впредь.

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

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

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

Т.е. метапроговская реализация обгоняет мерррскую скриптуху всего лишь в три раза?!

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

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

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

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

вот до чего эти СУВТ-ты доводят

СУВТ в бенчмарке нет. Лечи галлюцинации.

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

Кстати, хотел спросить, почему в метапроговской реализации такой хреновый вывод?

Если посмотреть на диагармму (особенно в Метапроге, а не на скрине) - все с порядком цифр становится понятным.

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

Если посмотреть на диагармму (особенно в Метапроге, а не на скрине) - все с порядком цифр становится понятным.

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

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

Но я еще и близко не исчерпал резерв возможностей оптимизации на Метапроге.

Это радует, так как разница каких-то 25 раз, чуть-чуть жгутики поперекручивать и догонишь.

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

Есть такой подход, называется semver. Гуглить тебе лень, поэтому скопипащу сюда.

    MAJOR version when you make incompatible API changes,
    MINOR version when you add functionality in a backwards compatible manner, and
    PATCH version when you make backwards compatible bug fixes.
provaton ★★★★★
()
Ответ на: комментарий от provaton

Для второй версии уже в сорок. Но ему хоть кол на голове теши - все что для него непонятно это «сферический матан в вакууме» и очевидно ненужно.

Необучаемые дворники необучаемы.

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

Мне вот не совсем понятна логика наименования версий, скажем, того же ядра линукс.

А там постоянной логики и нету.

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

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

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

Rust'a как языка не существует, так же как и не существует компилятора Rust'a. О каких бенчмарках и сравнениях вы говорите, если по факту вы сравниваете не Rust, а LLVM (ворованный!). В этих всех циферках нет никакой заслуги Rust'еров, только лишь ворованного LLVM && C++ не боле и не менее.

Поэтому остается лишь признать существование метапрога. Ну или его несуществование уровня раста.

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

А я и не спорю с этим, я знал что вы будете использовать это как спасательный круг в очередной раз. Да все языки на базе ллвм по сути отличаются лишь тем насколько они смогут в своем фронте грамотно сделать кодагенерацию в промежуточный ллвмир. Так что они тоже такие же некорректные в плане сравнения. А бред этот «ворованный» оставьте для монархической особы. ЛЛВМ для того и делался чтобы не писать это все самому в сотый раз. Тем не менее все равно выходят языки которые реализуют самостоятельно свои компиляторы и интерпретаторы лишь только их и имеет смысл сравнивать.

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

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

stasolog
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.