LINUX.ORG.RU

GHC 9.0.1

 , ,


0

3

Вышла новая версия компилятора языка Haskell — Glasgow Haskell Compiler. Из-за значительных изменений была увеличена мажорная версия компилятора.

Основные изменения:

  • Добавлена реализация линейных типов (расширение LinearTypes). Линейные типы позволяют отслеживать использование ресурсов на стадии компиляции и могут использоваться, среди прочих вещей, для статического управления памятью в стиле Rust.
  • Новая встроенная библиотека для работы с числами неограниченного размера: ghc-bignum. Её использование помогает с переносимостью в системах, где библиотека GMP по каким-либо причинам недоступна.
  • Улучшения в кодогенераторе, значительно увеличивающие производительность многих программ.
  • Улучшения в коде проверки сравнения с образцом (pattern matching), позволяющие находить лишние проверки в случаях, где раньше это было невозможно.
  • Новый IO-менеджер для платформы Windows. Раньше на Windows был использован IO-менеджер для Unix-систем, что приводило в худшей производительности на этой платформе. Также прекращена поддержка Windows Vista. Теперь для сборки и запуска программ на Haskell требуется минимум Windows 7.
  • Добавлено расширение QualifiedDo, расширяющее возможности по переопределению поведения кода.
  • Для сборки с LLVM теперь требуется версия 9.0 или выше.

Также недавно был выпущен корректирующий релиз GHC 8.10.4, исправляющий несколько багов в ветке 8.10.

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

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

Последние лет 5 не притрагивался, ну не суть.

sptCreateStaticBinds :: HscEnv -> Module -> CoreProgram -> IO ([SptEntry], CoreProgram)

Сигнатура функции (зачастую можно не объявлять, но это считается плохим тоном, да и не удобно) Если не понимаешь что такое карирование, то можешь считать что это функция принимает на вход 3 переменные, дальше делает какие-то вычисления с вводом выводом и возвращает тьюпл из списка SptEntry и CoreProgram

sptCreateStaticBinds hsc_env this_mod binds (тут типа запуск)

| not (xopt LangExt.StaticPointers dflags) = и сразу guard (условие выполнения ветки) 
  return ([], binds)

если не (чет там от LangExt.StaticPointers и dflags) возвращаем тьюпл из пустого списка и CoreProgram (dflags ниже раскрыт)

| otherwise = do

во всех остальных случаях:

  _ <- lookupGlobal hsc_env unpackCStringName

делаем какойто ввод вывод, возвращаемый результат не важен

  (fps, binds') <- evalStateT (go [] [] binds) 0

в рамках монадного трансформера выполняем код функции go c начальным состоянием 0, в результате получаем тьюпл из списка SptEntry и CoreProgram (тут опять же какойто ввод вывод)

  return (fps, binds')

возврат из функции, возвращаем тьюпл (тип в аннотации был уже)

where дополнительно объявляем локальные функции

go fps bs xs = case xs of

тут выбор по условию

  []        -> return (reverse fps, reverse bs)
  bnd : xs' -> do
    (fps', bnd') <- replaceStaticBind bnd
    go (reverse fps' ++ fps) (bnd' : bs) XS'

по сути тут разворот списка, но при этом дергается replaceStaticBind и там есть ввод вывод

dflags = hsc_dflags hsc_env

определяем dflags как результат hsc_dflags от hsc_env

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

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

Развернул целиком продолжение

Тут как бы около 120 строк кода )) эквивалент на плюсах или на каком нить go будет примерно в 1500 - 2000 строк кода (возможно больше), если прочитать просто по коду что непосредственно делается в одной функции, это одно если прочитать весь код который тут и понять что он делает, нужно смотреть определения типов, и дальше уже читать )) То есть нужен контекст. Но кому охота время тратить бессмысленно?

Ну и нюанс, Haskell вообще читается не как c++, там в первую очередь смотрятся типы, тело функции вообще дело десятое, его смотришь только в конкретных местах, например в функции которую рефакторишь.

Чтоб было понятно: https://github.com/chemist/passports тут мой код, если убрать импорты размер будет гдет 120 строк. Это сервис по проверке паспортов на валидность (когда давно было надо) скачать текстовик в архиве, разжать, распарсить паспорта оттуда, положить в отсортированный массив в файл, бинарным поиском искать паспорт валиден или нет + веб морда.

https://github.com/chemist/passports-clj тут тоже самое но на closure

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

Re: Последние лет 5 не притрагивался, ну не суть.

Про 5 лет - в этом вся суть хаскеля, язык неплохой, но реально его использовать в работе никто не торопится. Ты забыл сказать ещё про кучу сокращённых в начертании функцией, про то, что из себя представляют монады, про функторы, про аппликативные функторы, лень лезть, но там вроде ещё и свёртки были, там в этом небольшом куске было очень много, аналог на с++ будет и длинней и сложней для понимания. Котечке надо самому попробовать хаскель чтобы понять что на самом деле он практически кристально чист и понятен, если конечно знать все то, что было перечислено. Ну и считаю, что местами там не совсем удачно отформатирован код. Он ещё нашел вполне приличный код, а ведь можно было бы найти #@#fg$dg&& что-то подобное такому, где наклепали алиасов кратких на функции и написали своих типов, вот тогда код начинает сравниваться по сложности чтения с шаблонным на с++.

anonymous ()

Так я за это время

И на других языках не писал )) Ну он же попросил на пальцах объяснить, а функторы монады и тд Ну если человек всю жизнь ездит на лошади, и никогда автомобиль не видел, ему про карбюратор или дисковые тормоза говорить как то бессмысленно ))

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

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

chemistmail ()
Ответ на: Так я за это время от chemistmail

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

Очень многое из того что добавляют сейчас в стандарты С++ было придумано еще очень давно, в том числе и теми кто добавляет, но там же идет обсуждение, как добавить, что добавить, а сломает ли это что нибудь? Итд.

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

И какие тогда поля у struct attr показывает твоя IDE?

Ты к чему? Так то в Haskell, Lisp, Python возможностей создать подобных неочевидностей в разы больше.

MOPKOBKA ()

Какой хороший, ненужный язык! Столько лет на слуху, а всё ещё остаётся уделом яйцеголовых маргиналов «не как у всех». :) Такие новости точно кому-то нужны??

matumba ★★★★★ ()
Ответ на: Так я за это время от chemistmail

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

Вот ПОЭТОМУ он - эталонное «ненужно». Даже как академический язык.

matumba ★★★★★ ()
Ответ на: Развернул целиком продолжение от chemistmail

эквивалент на плюсах или на каком нить go будет примерно в 1500 - 2000 строк кода

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

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

Посмотри в каком языке

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

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

Вообще то

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

lisp и python это сильно другие вещи.

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

Ну еще электричество

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

chemistmail ()
Ответ на: Вообще то от chemistmail

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

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

Погугли что в языки последние лет 10 тащат

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

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

Поведение будет отклоняться от остального кода

Это как? переопределить True в False и в плюсах не долго. Вообще если специально озадачиться на любом языке можно Брэйнфак устроить. Абстракции всего лишь отражают сложность предметной области, выше я как раз про это писал. Ну вот например код которым описывают различные генные вещи для меня откровенно не подъёмен. Прочитать тысяч 5 строк кода не понимая вообще предметной области на мой взгляд задача бессмысленная, логика что это и зачем не понятна, терминология (биологическая) не понятна. Если я не понимаю что поступает в вычислитель и что должно выходить из него и как данные должны преобразовываться, я явно не смогу понять код.

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

Re: Посмотри в каком языке

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

Узнаешь много нового про lisp?

anonymous ()
Ответ на: Re: Посмотри в каком языке от anonymous

Ну тогда уж

про лямбда счисление в принципе. Базовые вещи те же. Но последние 10 - 15 лет как то больше Haskell уже след оставляет, но Lisp да, про него тоже стоит почитать.

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

Очень многое из того, что представляет современное IT было придумано в во второй половине 20 века, ну так что же? Важно не когда оно было придумано, а кто первый реализовал и внедрил в язык по дизайну эти идеи, по факту пацан прав, можно сколько угодно оправдывать С++ в свете его текущих поползновений, но от этого никак не изменится тот факт, что он старый императивный язык на основе С и по дизайну все функциональные навороты на него - костыли.

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

Это язык ресерч направленности, без него всего того, что понавтыкали в дотнет и позднее напилили фшарп не было бы. Не говоря уже о других языках.

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

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

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

Это язык ресерч направленности

Нет. Research – это всякие агды, идрисы, F* и т.д. А хачкель довольно хорошо в индустрии сидит.

hateyoufeel ★★★★★ ()

Re: Поведение будет отклоняться от остального кода

Абстракции всего лишь отражают сложность предметной области

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

anonymous ()

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

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

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

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

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

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

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

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

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

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

Это далеко не единственные причины. Как я тут уже много раз писал, веб-приложения гораздо более переносимы между платформами, потому как хром везде одинаково работает. Удачи сделать подобное с Qt.

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

Кстати, лулзов ради, можно Haskell в JS компилировать и юзать с электроном. И это даже будет работать. Даже весьма неплохо. Но лучше всё же так не делать.

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

В общем-то, нативных переносимых тулкитов кроме Qt сейчас, кажется, и нет на рынке.

LCL

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

веб-приложения гораздо более переносимы между платформами,

==

работает везде где есть броузер

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

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

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

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

относительно жс, можно, но кажется только леницы не устраивал игрища с жс у себя в загончике,

КПРФ запретила?

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

Для этого лучше хаскелоподобный https://elm-lang.org/

Я видел. Хорошая штука. Ещё есть PureScript, он тоже весьма неплох и вроде как лучше поддерживается.

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

Ты к чему?

К тому, что понять, что делает та строка, ты не смог.

Так то в Haskell, Lisp, Python возможностей создать подобных неочевидностей в разы больше.

В Lisp - да (там синnаксис произвольный). В Haskell и даже в Python – нет.

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

К тому, что понять, что делает та строка, ты не смог.

Я с этим несогласен.

В Lisp - да (там синnаксис произвольный). В Haskell и даже в Python – нет.

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

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

Если не превращать предупреждения в ошибки, то легко

В стандарте всё равно запрещено. Значит в С++ так сделать нельзя…

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

Я с этим несогласен.

То есть ты настаиваешь, что та строка пишет в поле amlist, которого в структуре нет?

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

Поведение - не синтаксис. Кроме того, интроспекция позволяет смотреть текущее состояние класса.

В хескеле ничего подобного сделать нельзя? А какой хитрый итератор? Можно конечно.

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

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

Звонили из специального олимпийского комитета, просили передать, что с вашей методой оценки самым понятным языком является язык ассемблера. Содержание каждой строчки понятно даже для таракана.

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

То есть ты настаиваешь, что та строка пишет в поле amlist, которого в структуре нет?

Тебе очень нравится задавать вопросы?

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

В стандарте всё равно запрещено.

В каком-то одном из (кстати, в каком? или только в черновике?). В ISO C++ 98 точно разрешено.

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

В каком-то одном из (кстати, в каком? или только в черновике?). В ISO C++ 98 точно разрешено.

Во всех. В том числе и в ISO C++ 98 такое запрещено.

искать слова такие: lexically identical to keywords.

В С++98 это в параграфе 17.4.3.1.1 Macro names на 347(321) странице

A translation unit that includes a header shall not contain any macros that define names declared or defined in that header.  Nor shall such a translation unit define macros for names lexically identical to keywords.

в текущем драфте 16.4.5.3.3 Macro names написано так:

A translation unit that includes a standard library header shall not #define or #undef names declared in any standard library header.

A translation unit shall not #define or #undef names lexically identical to keywords, to the identifiers listed in Table 4, or to the attribute-tokens described in [dcl.attr], except that the names likely and unlikely may be defined as function-like macros
fsb4000 ★★★★ ()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Ну нельзя и не возможно

Сильно разные вещи, если на каком то языке что то не возможно… он получается не тьюринг полный…..?

Ну или по другому, если я стандарт не знаю, то мне можно, компилятор ведь съест и не подавится ))

А вот если кто то знает стандарт, то ему нельзя…

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

Ох...

ты просто не сталкивался с тайпчекером haskell.

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

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

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

Да нет. Работу с хачкеллом найти сейчас не то чтобы сложно. У меня в последний раз недели две-три ушло.

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

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

A translation unit that includes a header shall not contain any macros that define names declared or defined in that header.

Обалдеть! Раньше это ограничение было даже не на стандартную библиотеку? Причём, если я правильно помню, «shall not» при нарушении даёт UB.

monk ★★★★★ ()
Ответ на: Ох... от chemistmail
$ cat oops.hs 
foo = 1

-- Ooops! I meant `foo + 1` here!
bar = bar + 1

main = print bar
$ ghc oops.hs -o oops
$ ./oops
oops: <<loop>>

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

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