Не буду писать многабукаф - просто скажите, сколько (по времени в секундах) в Scheme выполняется данный кот:
(define (divs n)
(define (go i a)
(cond ((> (* i i) n) a)
((= (* i i) n) (+ 1 a))
((= 0 (modulo n i)) (go (+ 1 i) (+ 2 a)))
(else (go (+ 1 i) a))))
(go 1 0))
(define (task n k)
(cond ((>= 500 (divs k)) (task (+ 1 n) (+ k n 1))) (else k)))
(display (task 1 1))
Я пробовал несколько онлайн вычисляторов, и время выполнения различается на порядки. Где-то указывают реализацию (chiken / guile), где-то нет. Здесь https://repl.it/languages/scheme какое-то неприличное время выполняется, здесь https://www.tutorialspoint.com/execute_scheme_online.php весьма неплохо (относительно остальных), на Ideone и Rextester промежуточные показатели... Я в растерянности - где правда?
Мерить время выполения на онлайн-выполняторах глупое занятие. Там настройки выкручены чтоб бы не грузить сервер. Guile как аналог python/ruby-ей никогда скоростью не славился. Chicken-компилятор работает быстро поверх C, что врдяли возможно в онлайн на сервере. А интерпретатор произвольного кода у него не сильно быстрый по идее.
По ссылке, где выполняется бесконечно долго, прочитал
BiwaScheme Interpreter version 0.6.4
Copyright (C) 2007-2014 Yutaka HARA and the BiwaScheme team
так что там действительно кто во что горазд... Можете посоветовать оптимальный вариант скачать/установить локально? В принципе в варианте по второй ссылке стартового поста мне более-менее нравится скорость.
Можете посоветовать оптимальный вариант скачать/установить локально?
Если ты никогда такого не ставил, то виртуалку с попсовым линуксом и поставить тот же chicken из реп. Хотя все вручную тоже должно работать. Хотя это все таки схемщиков надо спрашивать, я все таки лиспер :)
Такое сравнение не имеет смысла. И абсолютное значение времени выполнения тоже не имеет смысла. Реализуй один и тот же алгоритм на двух языках и тогда ты можешь определить относительную производительность двух реализаций этих языков на подобных задачах.
Ivana, мой пост в этой теме имеет смысл, потому что говорит, что вопрос заданный в теме не имеет смысла и предлагает на выбор несколько вопросов, ответы на которые сообщат Вам более осмысленную информацию.
Уточню. В вопросе «сколько работает этот код» нет смысла, потому что на это влияет слишком много незафиксированных переменных. Смысл есть в вопросах:
1. Насколько дольше выполняется этот код в одних реализациях Scheme, чем в других при одинаковом железе. На этот вопрос уже ответил Puzan в, объективно, самом осмысленном комментарии в этом треде.
2. Насколько дольше выполняется этот код в реализациях Scheme в сравнении с аналогичным кодом на других языках на одинаковом железе.
Ivana, нет, продолжаю наполнять тему осмысленными постами, а вы продолжаете утверждать, что мои осмысленные посты бессмысленны.
UPD: На самом деле, да. Мой пост действительно был бессмысленным, потому что к тому моменту как я его сделал Puzan уже дал ответ на более осмысленный вопрос, чем тот бессмысленный, который Вы задали в ОП. :)
Дело в том, что мне не нужна аутентичная стандартная в полной мере схема. Я просто написал три реализации своего схемоподобного по синтаксису и семантике языка, интерпретаторы. Но поскольку особой оптимизации не делал, скорость выполнения оставляет желать - например кот из стартового поста на паре реализаций выполняется 40 секунд и 3 минуты 50 секунд соответственно. Желая получить возможность убыстрить исполнение, я подумал, что чем самостоятельно пытаться курить JIT или статическую оптимизирующую компиляцию, проще будет попробовать транслировать котов на моем диалекте в какой-нибудь готовый промышленный язык с оптимизациями на борту. Попробовал в Java, но ниасилил победить стековерфлоу. Потом меня осенило, что если не брать спецвозможностей моего диалекта, определяемых платформой реализации, то он синтаксически и семантически похож на схему - почему бы не транслировать в какой-нибудь из ее диалектов? Поскольку локально ничего не стояло, полез в инет на онлайн-РЕПЛы проверять эффективность, удивился результатам и создал эту тему. В результате (спасибо осмысленно пишущим участникам) выбрал Racket (я на винде, измучен мышовыми гуями, да и скорость на примере одна из лучших), и сейчас с интересом узнаю, что можно не только учить мой диалект конвертировать кот в синтаксис схемы (обильно досыпая скобок при этом, что имхо не способствует читабельности и понимабельности), но и написать на Racket реализацию своего диалекта, т.к. в нем присутствуют бортовые возможности для этого - это приятный бонус к скорости, удобному гуевому РЕПЛу, хорошей документации и т.п.
Вот, вкратце, что я хотел сказать о моих целях и мотивации.
Racket со многих сторон хорош. Накостылил на своем языке транслятор его же кода в Racket, альфа-версию, но вполне применимую. Например, после тривиальной доработки напильником получается вот такой ракетный кот, который вполне себе работает