LINUX.ORG.RU

GNU Guile 3.0

 , , ,


3

7

16 января состоялся мажорный релиз GNU Guile — встраиваемой реализации языка программирования Scheme с поддержкой многопоточности, асинхронности, работы с сетью и системными вызовами POSIX, бинарного интерфейса Си, разбора PEG, REPL по сети, XML; имеет собственную систему объекто-ориентированного программирования.

Главной особенностью новой версии является полноценная поддержка JIT-компиляции, что позволило ускорить работу программ в среднем в два раза, максимум — в тридцать два для бенчмарка mbrot. По сравнению с виртуальной машиной Guile предыдущей стабильной версии, набор инструкций стал более низкоуровневым.

Также улучшена совместимость со стандартами языка программирования Scheme R5RS и R7RS, появилась поддержка структурированных исключений и чередующихся между собой объявлений и выражений внутри лексического контекста. Написанный на Scheme eval по производительности сравнялся с аналогом на языке Си; Для разных реализаций типа Record предоставлен унифицированный набор инструментов для работы с ними; Классы в GOOPS перестали быть переопределяемыми; Подробности и прочие изменения можно прочитать в анонсе релиза.

Новой стабильной веткой языка отныне является 3.x. Она устанавливается параллельно предыдущей стабильной ветке 2.x.

>>> Анонс релиза



Проверено: cetjs2 ()

Написанный на Scheme eval по производительности сравнялся с аналогом на языке Си

Видимо, сравнивается время компилляции + время выполнения. Иначе непонятно, как так.

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

На Common Lisp. Вернулся к истокам. Ошибки то проблемы с запросом по https, то оказалось, что когда парсится xml, это всё не потокобезопасно, то библиотека json менялось апи чуть ли не с каждым минорным релизом. То вообще удручающе малое количество библиотек.

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

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

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

На Common Lisp

То вообще удручающе малое количество библиотек

Если уж даже по сравнению с общелиспом «малое количество библиотек», то это совсем уж полторы штуки и те школьники писали. Печально конечно.

no-such-file ★★★★★ ()
Ответ на: комментарий от turtle_bazon

Круто, но я с Guile уже сосокочил ввиду разных багов.

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

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

Видимо, сравнивается время компилляции + время выполнения. Иначе непонятно, как так.

eval может и не компилировать, а интерпретировать. Сравнивается eval, написанный на Си и eval, написанный на Схеме. По скорости выполнения одинакового переданного кода.

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

Судя по всему можно переползать с ракета на сабж.

Не раньше, чем в сабж завезут кроссплатформенный графический интерфейс.

Кроме того, макросы в Guile на фоне Racket очень ущербные. Да ещё и с eval-when.

Наконец-то он стал похож на реализацию схемы, а не бесполезную игрушку, развлекающую авторов.

на фоне встраиваемых альтернатив (lua, ecl, …) он очень даже неплох.

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

Ну ракет он для промышленного программирования лучше, чем Guile. Но вот хз, с CL как-то всё проще и быстрее. И библиотек, в целом, валом. Может, только для меня, конечно.

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

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

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

Ракета же тормоз жутчайший.

По сравнению с Си++? Из реализаций Scheme одна из самых быстрых: https://ecraven.github.io/r7rs-benchmarks/ На фоне Guile реально ракета.

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

Да? Где на CL аналог racket/gui? Где аналог web-server/servlet? Хотя бы XML парсер, который может прочитать 700 мегабайт и не упасть.

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

Сборка мусора во всех обёртках работает. А синтаксический сахар ради сахара — зло. От него «диабет» бывает (когда ради идиоматичности уменьшают возможности библиотеки).

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

В текстовом виде вполне себе язык. Как и LLVM IR.

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

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

то просто плевался от ущербности гейзера перед слаймом.

А что именно тебе там не хватало, можешь перечислить? И как сейчас проект развивается? Смотрел репу недавно, такое впечатление, что инструмент в полузаброшенном состоянии, последние коммиты в код, поддерживающий racket, пару лет назад. А с тех времен вышло несколько новых версий ракетки.

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

Да? Где на CL аналог racket/gui?

Не знаю что за racket/gui, поэтому говорить не буду. Но для gui там опции есть.

Где аналог web-server/servlet?

Так тысячи же их. Причём есть более продвинутые аналоги. Не просто servlet там, а всё гораздо лучше. clack, например, как база, остальное поверх. С этим в CL проблем точно нет.

Хотя бы XML парсер, который может прочитать 700 мегабайт и не упасть.

Столько не парсил, но на CL есть биндинги к сишным парсерам. Думаю, они могут 700 Мб распарсить.

turtle_bazon ★★★★ ()
Ответ на: racket/gui от testqw

Отвлеченный вопрос - а racket с gui можно потом как-то удобно упаковать в инсталлер для Windows/Mac?

Так там же обычный exe-шник получается. Либо папка с exe-шником и библиотеками. Дальше папку или файл вроде тривиально упаковать.

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

По сравнению с Си++? С общелиспом, очевидно, о нем же речь была в предыдущем сообщении. Где на CL аналог racket/gui? Да там же, где и аналог mcclim на рэкете – никому не вперся. С gui в обоих экосистемах беда, такова уж горькая правда. А синтаксический сахар ради сахара — зло. Не спорю. Но это же не значит, что нужно впадать в другую крайность и тянуть недостатки сишки в язык, который их лишен. Кошмар же! Сравни с cl-sdl2. Где аналог web-server/servlet? Что-то подобное этому http://40ants.com/weblocks/ ? Вообще, ещё во времена, кажется, смолтолковского сисайда все поняли, что идея не самая удачная. Хотя бы XML парсер, который может прочитать 700 мегабайт и не упасть. Вообще plump есть. Не упасть, кстати, от чего? Нехватки памяти что ли?

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

Да? Где на CL аналог racket/gui?

Кстати, я вот не понимаю претензий на счет gui. Своего gui нет во многих языках - python, ruby, php, rust, perl, go, ... Это ж сложная и очень масштабная библиотека (набор библиотек), по-моему проще и эффективней использовать биндинги к нормальным либам типа Qt/Gtk, разве нет?

Хотя бы XML парсер, который может прочитать 700 мегабайт и не упасть.

А че реально нету что ли?

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

Тьху, проклятый маркдаун.

По сравнению с Си++?

С общелиспом, очевидно, о нем же речь была в предыдущем сообщении.

Где на CL аналог racket/gui?

Да там же, где и аналог mcclim на рэкете – никому не вперся. С gui в обоих экосистемах беда, такова уж горькая правда.

А синтаксический сахар ради сахара — зло.

Не спорю. Но это же не значит, что нужно впадать в другую крайность и тянуть недостатки сишки в язык, который их лишен. Кошмар же! Сравни с cl-sdl2.

Где аналог web-server/servlet?

Что-то подобное этому http://40ants.com/weblocks/ ? Вообще, ещё во времена, кажется, смолтолковского сисайда все поняли, что идея не самая удачная.

Хотя бы XML парсер, который может прочитать 700 мегабайт и не упасть.

Вообще plump есть. Не упасть, кстати, от чего? Нехватки памяти что ли?

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

Кошмар же! Сравни с cl-sdl2.

К слову сравнивать надо сравнимое. Если с cl-sdl2, то racket/sdl2, а не велосипед 7-летней давности,

И, по-моему, это cl-sdl2 кошмар. Сделать 4-уровневую вложенность на ровном месте: https://github.com/lispgames/cl-sdl2/blob/master/examples/renderer.lisp#L75 ?

(sdl2:with-window (win :title "SDL2 Renderer API Demo" :flags '(:shown)) ...)

Угадаешь, какого размера окно будет?

Для сравнения

(define window (SDL_CreateWindow
                "hello_sdl2"
                SDL_WINDOWPOS_UNDEFINED
                SDL_WINDOWPOS_UNDEFINED
                640
                480
                'SDL_WINDOW_SHOWN))

Очевиден результат, при написании не надо вспоминать, как идиоматор переименовал флаг (:shown? :window-shown? :sdl-window-shown?).

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

Что-то подобное этому http://40ants.com/weblocks/ ?

Что-то оно полумёртвое…

Нет, чтобы можно было вместо явного указания сессий/путей/(де)сериализации просто писать что-то вроде

(define (render-confirm-add-comment-page a-blog a-comment
                                         a-post request)
  (define (response-generator embed/url)
    (response/xexpr
     `(html (head (title "Add a Comment"))
            (body
             (h1 "Add a Comment")
             "The comment: " (div (p ,a-comment))
             "will be added to "
             (div ,(post-title a-post))
 
             (p (a ([href ,(embed/url yes-handler)])
                   "Yes, add the comment."))
             (p (a ([href ,(embed/url cancel-handler)])
                   "No, I changed my mind!"))))))
 
  (define (yes-handler request)
    (post-insert-comment! a-blog a-post a-comment)
    (render-post-detail-page a-blog a-post (redirect/get)))
 
  (define (cancel-handler request)
    (render-post-detail-page a-blog a-post request))
  (send/suspend/dispatch response-generator))
monk ★★★★★ ()
Ответ на: комментарий от anonymous

Вообще plump есть. Не упасть, кстати, от чего? Нехватки памяти что ли?

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

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

С общелиспом, очевидно, о нем же речь была в предыдущем сообщении.

С SBCL примерно одинаково (если в SBCL безопасность в 0 не отключать). Остальные общелиспы вроде медленнее.

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

Своего gui нет во многих языках - python, ruby, php, rust, perl, go,

У питона есть PyGObject, который включает в себя все необходимые библиотеки. На rust есть https://github.com/hecrj/iced . Про остальные не знаю.

Отсутствие GUI для CL и Haskell под Windows сильно мешает писать на них скрипты для пользователей.

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

Угадаешь, какого размера окно будет?

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

Очевиден результат

Ну да, действительно очевиден. Неочевидно только, зачем вообще было брать схему, если на си было бы точно так же, но без многословных ptr-ref’ов и прочих ffi’стей

как идиоматор переименовал флаг (:shown? :window-shown? :sdl-window-shown?).

Во-первых, не «идиоматор», а autowrap. Во-вторых, даже если этого не знать, легко догадаться, что приставки SDL и WINDOW будут отброшены, т.к. решают лишь проблему конфликта имен.

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

У питона есть PyGObject, который включает в себя все необходимые библиотеки.

Ну так тоже через биндинг работает этот PyGObject.

На rust есть https://github.com/hecrj/iced .

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

Отсутствие GUI для CL и Haskell под Windows сильно мешает писать на них скрипты для пользователей.

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

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

Ну так тоже через биндинг работает этот PyGObject.

Я не против биндингов. Я против того, что для работы биндинга в Windows приходится ставить половину линукса через MSYS и аналоги.

Технически racket/gui тоже биндинг. К WinAPI, GTK и что-там-на-маке. Но он работает и позволяет легко распространять дистрибутив скомпилированной программы.

monk ★★★★★ ()