LINUX.ORG.RU

Glasgow Haskell Compiler 9.12.1

 , ,

Glasgow Haskell Compiler 9.12.1

0

5

Привет, ЛОР!

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

Среди особенностей новой версии:

  • Расширение языка OrPatterns, позволяющее давать общий обработчик нескольким веткам сравнения по образцу.
  • Поддержка многострочных строковых литералов через специальный синтаксис: """строка""".
  • В бэкенд компилятора добавлены экспериментальная поддержка архитектуры RISC-V и поддержка SIMD инструкций для архитектуры x86 (ранее требовалось использование LLVM).
  • Удалена поддержка 32-битных версий ОС Windows, macOS и iOS. Поддержка 32-битных систем на базе Linux и BSD нетронута.
  • Улучшена работа сборщика мусора. В некоторых случаях скорость работы программ может увеличиться на 25%.
  • И множество других мелких фич, багфиксов и так далее.

>>> Скачать

>>> Подробности

★★★★★

Проверено: dataman ()
Последнее исправление: CrX (всего исправлений: 4)

Решил загуглить на тему «haskell Backend», и вот, по первой ссылке на реддите:

Писал на Хаскелле 10 лет, но пару лет назад переключился на ТайпСкрипт для фуллстека

seiken ★★★★★
()

Поддержка многострочных строковых литералов через специальный синтаксис: """строка"""

А что для этого раньше использовали? TH?

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

Ну хоть после этого на ТайпСкрипт будет нормально писать :) Удачи ему!

gns ★★★★★
()

GhcUp до сих пор 9.4.8 рекомендует. Уж даже не знаю почему...

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

https://ru.wikipedia.org/wiki/Монада_(программирование)

Монады чаще всего используются в функциональных языках программирования. При ленивой модели вычисления порядок редукции неизвестен. Например, вычисление 1 + 3 + 6 может быть редуцировано в 1 + 9 или 4 + 6. Монады позволяют упорядочить редукцию. Поэтому существует ироничное утверждение, что монады — это способ перегрузить оператор «точка с запятой».

Монада является контейнером, который хранит в себе значение произвольного типа. Она должна обладать функцией связывания (bind), которая принимает два аргумента: текущее значение монады и функцию, принимающую значение типа, который содержит текущая монада и возвращающая новую монаду. Результатом вызова функции связывания будет новая монада, полученная путём применения первого аргумента ко второму.

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

Конкатенацию на месте, например.

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

Это моноид в категории эндофункторов.

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

Монада = контейнер.

Не просто контейнер, а контейнер с определённым интерфейсом, который является моноидом и апликативом, и соответствует монадозаконам.

Rodegast ★★★★★
()

Поддержка многострочных строковых литералов через специальный синтаксис: «««строка»»»;

Надо же, хаскель ворует у Питона.

gaylord
()
Ответ на: комментарий от LINUX-ORG-RU

Дяди Джабраила на них нет, в исполнении Мкртчяна!

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

Ага

- Папа, что такое сложение?
- Сложение — бинарная коммутативная ассоциативная операция на декартовом произведении гиперкомплексных чисел.
monk ★★★★★
()
Ответ на: комментарий от monk

декартовом произведении гиперкомплексных чисел

Чо, только там что-ли? :) Или тебе сложение в целочисленных кольцах уже не операция?

Сказал бы проще, Сложение — это бинарная операция в алгебре над некоторым множеством со следующими свойствами... :)

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

емнип, они её реализовали в каком то виде пару-тройку лет назад, но работает жутко медленно, п джонс говорил емнип.

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

А это кого читать. У Бурбаков вообще частный случай закона композиции. Посему, наверное, априорно-синтетическое.

Где и как это у Уайтхеда с Расселом можете самостоятельно найти, потом мне расскажете. Мне дюже интересно :)

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

Где и как это у Уайтхеда с Расселом можете самостоятельно найти, потом мне расскажете. Мне дюже интересно :)

У меня этот трёхтомник в бумаге есть. Но, честно говоря, я не осилил так много букв.

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

Что они там суперкомпилировали? Pattern matching?

Немного не в тему, но в GHC есть офигенная штука под названием rewrite rules. Можно задать компилятору паттерны в коде, которые можно преобразовать в другие паттерны. В результате, дохренища оптимизаций пишутся не внутри GHC, а на вот на этом недомакроязычке, причём библиотеки могут поставлять свой набор оптимизаций для своего API.

На практике это выглядит примерно вот так:

{-# RULES
   "map fusion" forall f g. map f . map g = map (f . g)
#-}

Здесь два вызова map (т.е. два цикла прохода по списку) будут соединены в один.

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

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

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

Что до паттерн матчинга, то кажется я встречал где то того же Джонса что суперкомпиляция это дефорестрация + частичное исполнение. Это конечно упрощённое понимание, но какую то суть оно передаёт.

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

Но я давно интересовался (лет 5 как), могу что то путать.

ЗЫ. Вообще у Сергея Романенко на гитхабе есть примерчики простых суперкомпиляторов. Вот например https://github.com/sergei-romanenko/spsc-scala

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

В чём разница между суперкомпиляцией и инлайнингом с вычислением во время компиляции, как делают компиляторы C/C++?

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

Ну так там, по слухам, тот факт, что 1 + 1 = 2 доказывается где-то на семьсот какой-то странице с комментарием, что этот результат может иметь некий практический смысл. :)

Но, честно говоря, я не осилил так много букв.

Буквы там не главное, но то, что там не буквы осилить гораздо труднее :)

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

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

Как я понял, суперкомпилятор пытается преобразовывать алгоритм с использованием знаний об аргументах. Типа сортировку массива из нескольких элементов он заинлайнит в набор сравнений без цикла.

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

Еще один способ объяснить неизвестное непонятным?

Эк ты моноид-то обозвал.

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

Типа сортировку массива из нескольких элементов он заинлайнит в набор сравнений без цикла.

Так я про это же. В gcc уже такое сплошь и рядом. А в Haskell, насколько я помню, учёт констант идёт только слева. В смысле f x y 1 оптимизироваться не будет, а в f 1 x y скомпилирует f 1, которую применит к остальным параметрам.

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

Чот, сдается мне, что они что-то типа препроцессора придумали. Сишным #define повеяло :)

Не. Это сложнее чуток. Как минимум, потому что учитывает область видимости и импорты, а не просто текст подставляет.

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

Так он и монадные законы на инстансах не проверяет. Не той системы гранаты у него.

water_closed
()

Интересно а вообще на хачеле хоть что то полезное написали?

На лиспах и МЛ-оидах полным полно.

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

Да на здоровье. Хоть Фа-диез, ака Эф-шарп :)

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

[не очень разбираюсь в теме, плюс по памяти, могу врать, прошу прощения за неточности, лучше читать здесь https://sergei-romanenko.github.io/scp-notes-ru/]

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

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

В некотором смысле суперкомпилятор упрощает программы. Причём этот смысл очень близок к человеческому пониманию слова «упрощает».

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

Я понимаю, но предвосхищая вопросы Bad_ptr спрошу сразу.

Что не ясно-то?

Что такое моноид? Что такое категория? Что такое эндофунктор (и функтор)?

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

Моноид — полугруппа с единицей Эндофунктор - функтор, отображающий категорию в себя (автоморфизм) Функтор — отображение, сохраняющее структуру. Категория — пара из набора объектов и набора отображений (морфизмов) с законом ассоциативности.

Ну, собственно, и все. Учите теорию категорий и будет ВАм Щастье!

gns ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.