LINUX.ORG.RU

ЛОР, помоги выбрать ЯП для обучения

 , , ,


0

4

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

Вот к каким мыслям я пришёл:

Язык должен наиболее чисто демонстрировать самые основы написания кода.

Не Си и не современные коммерческие языки (Java, C#, Go). Си, хотя примитивный в основе, усложнён из-за окружения, в котором используется. Современные коммерческие языки были созданы для решения проблем индустрии. Проблема общая: я хочу преподавать материал по мере нарастания сложности. Если в языке неизбежно приходится использовать классы или printf, то это затруднит объяснение (не хотелось бы слишком часто говорить «потом узнаешь для чего это нужно»), напугает студента (ему придётся писать код, используя возможности, которые он плохо понимает), создаст неправильное восприятие основ (как будто printf — это какая-то важная часть компьютера или ОС).

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

Языки, между которыми я выбираю: Pascal и Python.

Pascal устарел и денег не принесёт (обидно), но это и не является основной целью. Целью является программирование, а не современное окружение.

В частности, я не собираюсь задрачивать студента на Delphi или любой «продвинутый» диалект языка. Это противоречит цели. Я рассчитываю на то, что после должной тренировки “bare bones” нужно перейти на современный язык и это будет легко.

Важно упомянуть, что спека языка Oberon (Виртовский язык, тот же Паскаль, только упрощённый и доработанный) составляет 17 страниц.

Питон мне сложнее оценить, потому что я избегал работы с ним.

Если ограничиться императивным подмножеством, без ассоциативных массивов, классов и мета-классов, list comprehensions, HOF, исключений, то выглядит как альтернатива Паскалю. Хотя меня беспокоит динамическая типизация. Типы — очень важная вещь, хотелось бы чтобы язык помог это донести, а не быть типа «ну да, это важно, но ты забей».

Это все мои мысли.

Что касается практики, то я имел несчастье наблюдать как человек впервые знакомился с программированием, изучая Java на javarush. На это было больно смотреть.

Edit: дальнейшие пояснения по теме:

  • Почему не Си и не ассемблер: 1 2
  • Почему Паскаль: 1 2
  • Почему не Питон: 1
  • Целевая аудитория: 1
  • Почему такая размытая аудитория: 1 2
  • Про важность иерархии: 1


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

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

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

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

max(penis_size) / min(penis_size) внезапно возникает деление на ноль

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

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

если зайти в топ GitHub, то будет много проектов чисто на китайском

Всё-таки есть некоторая разница между пользоваться гитхабом для своего проекта, в котором ковыряются свои и может быть немногочисленные те кто знает китайский, и выложить какую-то документацию для неопределнного числа клиентов/покупателей среди которых точно будут не только свои и даже по большей части не свои так как мир в целом сильно больше чем Китай. Надеюсь понятно объяснил…

Для меня это тоже самое что и файл на английском.

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

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

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

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

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

а вот хаскелл …

Да при чём тут вообще хаскел!

Ну, даже не знаю что и сказать.

любой код на хаскел можно преобразовать в код на си.

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

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

можно же пропускать нулевые

Всё можно. Только это будет сокровенное знание как поперёк системы типов реализовать те или иные костыли, чтобы программа хоть как-то работала. А хотелось бы, чтобы система помогала мне, а не ставила очередные вызовы.

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

И что?

И параметр «размер ноги клиента» явно перестаёт иметь смысл. Ну, либо обретает новый смысл, невыразимой вашей старой системой.

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

откуда немедленно ничего не следует.

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

вот то же самое можно сказать о ваших хаскелах, только другими словами.

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

Если чего-то сделать теоретически возможно, но сложно, тяжело, дорого и т.п., значит нельзя.

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

Перевожу её же на Си++ так, чтобы сохранить использование композиции для суммирования/отбора и компоновки условия.

сдается что monk не до конца понимает, что делает хаскел под капотом, во что это все компилирует и как упрощает.

оттого «аналог» на с++ есть лишь наивное представление монка о хаскеле. и при правильно написанном коде плюсы закопают хаскель гробовой лопатой

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

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

А что C++ программисты так мало зарабатывают? Вроде ж язык такой, что всю бошку сломаешь и нужен он для реализации всяких больших и сложных штук, а платят копейки. От которых ещё треть на налоги отнять надо. И с учётом, что тут жизнь в принципе дороже, нежели в богоспасаемом отечестве, вооще как-то грустно за коллег выходит.

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

вычисление каких-нибудь «нормочасов» существенно отличается от астрономического времени.

А это не время.

Пожалуй даже соглашусь с вами что это не время в обычном понимании,а некие учетные единицы типа каких-нибудь «складометров»(в лесном хозяйстве встречаются). И пожалуй что основная причина в том что к «нормочасам» пытаются применять функции предназначенные для работы именно с временем в физическом/астрономическом его смысле. Так что да - однозначно надо объявлять свой тип с скрытой внутренней реализацией и определять функции для работы с ним. Ада это хорошо умеет.

Хранить надо так, что бы потом можно было пересчитать %) То есть источники расчетов.

Это вы немного про другое - про исходные файлы например. Да,согласен. А я под «хранением» имел в виду в данном случае представление в памяти в процессе работы программы. Например в столь милых мне микроконтроллерах стараются вместо дробных чисел использовать целые. Например вместо 1.5 вольта представляют напряжение как 1500 милливольт. Это фактически получается фиксированный тип у которого положение десятичной точки подразумевается в нужном месте(чтобы потом при выводе на экран нарисовать например). И дело тут не только и не столько в медленности операций с float - современные МК считают весьма быстро. А главное это лучшее сохранение точности при вычислениях. Большие целые числа ведут себя лучше чем маленькие дробные. Хорошая статья(и комментарии к ней) про проблемы чисел с плавающей точкой:https://habr.com/ru/articles/337260/

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

А что C++ программисты так мало зарабатывают?

Те кто много знают зарабатывают неплохо, но большинство работ это наверное перекладывание значений бд на qt.

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

А я под «хранением» имел в виду в данном случае представление в памяти в процессе работы программы.

Это да, в расчетах денежных с float работать нельзя. И даже машинные целые нежелательно, а то скоро зарплаты в рублях снова могут стать миллионными, а какие нибудь итоговые суммы за год совсем заоблачные... В 1С и COBOL правильно сделано.

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

перекладывание значений бд на qt.

А зачем тут С++? Один же хрен производительность упирается в базу и кривыми join’ами можно положить сервер на лопатки, хоть и питона их вызывай, хоть из сишечки.

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

Сам не знаю, но если посмотреть вакансии то реально много qt требуется и всего такого, легаси может всякое, или есть дешевые С++ программисты под рукой...

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

Вот на range, обгоняет Haskell в два раза на моем компьютере. Так что compose на С++ хороший, в Haskell лучше быть не может, это машинное ограничение.

Я думаю тебе не хватает опыта в статических языках и в С++. Я например С++ тоже не знаю, но бенчмарками копий std::vector не занимаюсь все же.

#include <iostream>
#include <string>
#include <ranges>

template <typename F1, typename F2> struct compose {
    F1 f1; F2 f2;
    compose(F1 f1, F2 f2) : f1{f1}, f2{f2} {}
    auto operator ()(auto x) { return f1(f2(x)); }
};

template <typename T, typename R> R sum(T x) {
    R sum = 0;
    for (R i : x) sum += i;
    return sum;
}

auto filter(auto f) {
    return [&](auto a) {
        return a | std::views::filter([&](auto x) { return f(x); });
    };
}

int main(int argc, char **argv) {
    auto v = std::views::iota(0l, atol(argv[1]) + 1);
    auto cond = compose([](auto x) { return x == 0; }, [](auto x){return x % 2;});
    std::cout << compose(sum<decltype(filter(cond)(v)), long>, filter(cond))(v) << std::endl;
}

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

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

Это я сказал что не знаю оба языка %) Русским русский, англичанам английский. В международных проектах язык который был выбран конкретным объединением, может какой то группе будет французский удобнее, или русский если это снг.

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

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

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

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

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

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

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

А где по гендерные нововведения почитать? Я действительно не очень в этом разбираюсь так как в России пока не слишком актуально. Про дроби и проценты в этом вопросе не слышал еще.

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

Ну они же не каждый день добавляются…

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

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

у меня ссылка не открывается. я за железным занавесом.

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

гендер это тензор в 6-мерном изотопическом пространстве.

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

В микроконтроллерах ООП тоже не особенно нужно. При свойственных им небольшим объемам кода никаких особых преимуществ оно не дает.

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

А где по гендерные нововведения почитать?

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

в России пока не слишком актуально.

Считайте, что тут гендер, это как в России национальность.

Про дроби и проценты в этом вопросе не слышал еще.

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

Ну они же не каждый день добавляются…

Бывает и чаще, так что лучше сразу CI/CD настроить.

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

Теперь размер ноги — это два размера.

И что? Почему дополнительные размеры нельзя добавить в тот же перечислимый тип? «Размер» здесь это не число,а признак,даже не обязательно цифрами названный. Может быть и какие-нибудь S,M,XL. Также как цвет не длиной волны указывают,а названием. Ну разрастётся перечислимый тип до нескольки десятков элементов - не фатально. И выберет себе квадробер что там ему надо и для передних ног и для задних. Обычный человек тоже может две пары башмаков купить. И даже разных размеров для лета и зимы. Или разных производителей,маркирующих свою продукцию по-разному.

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

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

Файл на гитхабе точно также приходится показывать в случае командной работы с иностранцами. Конечно,если файл никуда не отправляется со своего диска то называть его можно как угодно,лишь бы в локальной системе это имя глюков не вызывало. Но я по привычке предпочитаю на стандарты ориентироваться если у меня не возникает совсем уж карайней необходимости от них отклоняться. Это примерно как привычка более-менее аккуратно форматировать исходник и осмысленно именовать переменные (не aaa,bbbb и тому подобное),даже если пишешь что-то для себя.

Если же писать на 1С, то там и имена массивов будут русскими буквами.

Вот с этим аргументом да,согласен. Код на 1С маловероятно что будут читать иностранцы. Тут уже можно именовать на свой вкус. Хотя я бы и в этом случае предпочел стандартов придерживаться.

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

Вот на range, обгоняет Haskell в два раза на моем компьютере.

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

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

И опытом борьбы с проблемами ms-dos, древних bsd и прочего хлама.

Да. Представляющих что кроме своего локального компа существуют и другие,с существенно отличающимися ОС и софтом. А «проблемы ms-dos» и сейчас попадаются - например напомню,что на флешках почти всегда файловая система fat32 со всеми ее особенностями. Например даже при использовании в именах файлов только первой половины ascii таблицы можно создать такие имена файлов которые будут соответствовать разным файлам на диске с ext4 но перезапишутся один поверх другого на флэшке. Изврат конечно,но выкладыватели mp3 файлов иногда умудряются.

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

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

Кстати,для избавления от стрёмных имен файлов в Дебиане есть вот такая штука https://github.com/dharple/detox Полезно напускать например на кучку музыкальных файлов,скачаных со всяких сайтов - там нередко та еще дичь в именах попадается.

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

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

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

Функция, которая принимает две функции и возвращает третью

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

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

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

Haskell или Idris. Нормальная типизация, позволяющая решить подавляющее большинство задач.

C++. Если скорость выполнения программы очень критична.

На Ada скорость ничем не хуже Си. Уж поверьте мне,писавшему на Meridian ADA под DOS на процессоре 80286 с частотой 12 мегагерц. Там даже небольшая разница быстродействия была заметна глазами и без специальных измерений. Если очень прижмет то многие runtime-проверки в готовой релизной версии программы можно отключить. Мне не требовалось.

При этом более чем нормальная типизация,позволяющая решить подавляющее большинство задач. И это у меня компилятор был стандарта Ada83,в котором еще не хватало полезных вещей которые появились в Ada95. И адская многозадачность под дос-экстендером от PharLap работала весьма ограниченно. А сейчас в стандарте Ады есть много всякой экзотики которая похоже только в каких-то авиакосмических спецприменениях и нужна.

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

это будет сокровенное знание как поперёк системы типов реализовать те или иные костыли

Не понимаю почему пропуск нулевых значений это какое-то «сокровенное знание» и «поперек системы».

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

Или почему нулевой размер бюста может означать отсутствие сисек, а нулевая длина члена не может означать отсутствие оного?

А хотелось бы, чтобы система помогала мне, а не ставила очередные вызовы.

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

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

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

Нет. В Haskell compose можно хранить в списке, массиве или передать аргументом в функцию.

любой код на хаскел можно преобразовать в код на си

Преобразуйте, пожалуйста

compose f g x = f (g x)
monk ★★★★★
()
Ответ на: комментарий от alysnix

сдается что monk не до конца понимает, что делает хаскел под капотом, во что это все компилирует и как упрощает.

Вопрос был, почему в Си++ не используют compose. Я переписал программу, которая на хаскел использует compose в аналог на Си++, который также использует compose (насколько он возможен в Си++).

Если считаете, что она отличается от хаскелевского оригинала, прошу исправить.

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

С этой версией уже не в разы, но Haskell всё равно быстрее. При том, что обычно он в 2-3 раза медленнее, чем Си++.

$ time ./test 1000000000
250000000500000000

real    0m1,145s
user    0m1,136s
sys     0m0,006s

$ time ./test-cpp 1000000000
250000000500000000

real    0m1,325s
user    0m1,320s
sys     0m0,005s
monk ★★★★★
()
Ответ на: комментарий от watchcat382

На Ada скорость ничем не хуже Си.

Так я не с Си, а с Си++ сравниваю. Как только более-менее абстрактный алгоритм, Ада даёт более медленный код. Потому что в Си++ есть RTVO, UB и && (в смысле, ссылка на правое значение).

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

Ноль на банковском счете при отсутствии у человека денег никого не удивляет - ни программистов ни клиентов банков.

Но вот 0 на банковском счете при отсутствии счета — это уже особый случай. Причём, если надо различать отсутствие денег и отсутствие счёта, придётся для отсутствия счёта возвращать -1, например.

В СУБД не просто так в числовом поле может храниться NULL.

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

всё по классикам:

«какого цвета не существующий дракон»

печатльно что самоописываемые объекты сложны в части безопасности их окружения

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

«какого цвета не существующий дракон»

Вовочке дали задание нарисовать ангела. Он нарисовал ангела в кроссовках. Учительница спросила:

  • Ты где видел ангела в кроссовках?

  • А где Вы видели ангела без кроссовок? - ответил Вовочка.

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

Версия на С++ без compose:

$ time ./test-cpp2 1000000000
250000000500000000

real    0m1,014s
user    0m1,013s
sys     0m0,001s
monk ★★★★★
()
Ответ на: комментарий от monk
Как известно, драконов не существует.
Эта примитивная констатация может удовлетворить
лишь ум простака, но отнюдь не ученого. Банальность
бытия установлена слишком давно и не заслуживает
более ни единого словечка… Имеется три типа драконов:
нулевые, мнимые и отрицательные. Все они, как было сказано,
не существуют, однако каждый тип — на свой особый манер.
Мнимые и нулевые драконы… не существуют
значительно менее интересным способом, чем отрицательные.

Станислав Лем. Кибериада. Вероятностные драконы
qulinxao3 ★★
()
Ответ на: комментарий от monk

Это значит что у тебя медленная реализация <ranges>, или компилятор плохо оптимизирует. В общем переключились с бенча векторов на бенч <ranges>.

Это заметно по цифрам которые ты скинул «без compose». Она примерно такая же медленная как и с compose. Это значит что реализация медленная, а с compose он вызывается как есть.

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

лол кек:

через:

https://en.wikipedia.org/wiki/Programming_language#2000s to present

обнаруживаем

https://en.wikipedia.org/wiki/Service-oriented_programming

писать всё на плюсах(али только на сах) то же самое что писать всЁ на асме ( а ранее в машкодах) - быстрее не возможно

см чисто на поржать на :

https://en.wikipedia.org/wiki/IDL_(programming_language)

qulinxao3 ★★
()

Самые логичные и однозначные языки, на которых мне приходилось писать:

  1. Паскаль.
  2. C#
  3. Как ни странно - 1С.

p.s. Пришлось в конце 90-х несколько лет потратить на разработку на PL/1. Это и тогда уже экзотикой было, а сейчас вообще не знаю, помнит ли кто это.

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

«какого цвета не существующий дракон»

Какого цвета был бы не существующий дракон, если бы он всё-таки существовал?

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

цвет существующего дракона это дракона существующего цвет ( если не зелубой)

каково поведение ли цвета_дракона у дракона чьё существованние возросло(«0->1») !?

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

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

Тут вызов compose на каждую итерацию, ты можешь увеличить его вложенность.

#include <iostream>

template <typename F1, typename F2> struct compose {
    F1 f1; F2 f2;
    compose(F1 f1, F2 f2) : f1{f1}, f2{f2} {}
    auto operator ()(auto x) { return f1(f2(x)); }
};

void test_pure(int argc, char **argv) {
    long r = 0;
    long end = atoi(argv[1]) + 1;
    for (long i = 1; i < end; ++i) {
        if ((i % 2) == 0) r += i;
    }
    std::cout << r << "\n";
}

void test_lambda(int argc, char **argv) {
    long r = 0;
    auto f = [](long x) { return x == 0; };
    auto g = [](long x){return x % 2;};
    long end = atoi(argv[1]) + 1;
    for (long i = 1; i < end; ++i) {
        if ((i % 2) == 0) r += i;
    }
    std::cout << r << "\n";
}

void test_compose(int argc, char **argv) {
    long r = 0;
    auto cond = compose([](long x) { return x == 0; }, [](long x){return x % 2;});
    long end = atoi(argv[1]) + 1;
    for (long i = 1; i < end; ++i) {
        if (cond(i)) r += i;
    }
    std::cout << r << "\n";
}

int main(int argc, char **argv) {
    switch(argv[2][0]) {
        case 'p':
            test_pure(argc, argv);
            break;
        case 'l':
            test_lambda(argc, argv);
            break;
        case 'c':
            test_compose(argc, argv);
            break;
    }
}
% g++-14 -std=c++23 -Ofast main.cpp; time ./a.out 2000000000 p
1000000001000000000

real	0m0,519s
user	0m0,518s
sys	0m0,001s

% g++-14 -std=c++23 -Ofast main.cpp; time ./a.out 2000000000 l
1000000001000000000

real	0m0,520s
user	0m0,519s
sys	0m0,001s

% g++-14 -std=c++23 -Ofast main.cpp; time ./a.out 2000000000 c
1000000001000000000

real	0m0,458s
user	0m0,457s
sys	0m0,001s

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

Хороший вопрос %) должно быть

void test_lambda(int argc, char **argv) {
    long r = 0;
    auto f = [](long x) { return x == 0; };
    auto g = [](long x){return x % 2;};
    long end = atoi(argv[1]) + 1;
    for (long i = 1; i < end; ++i) {
        if (f(g(i))) r += i;
    }
    std::cout << r << "\n";
}
Время примерно такое же как и у всех остальных, разница между всеми тремя неуловима...

MOPKOBKA ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)