Сьогодні вирішив почати вивчати функціональне програмування на прикладі Haskell. Це вже приблизно третій, якщо не більше, раз коли я починаю, але раніше жодного разу не доходило дальше за 'Hello world'. Цього разу вже зайшло трохи далі. Але я так і не можу зрозуміти навіщо це все, які у нього переваги над імперативним стилем.

main = purStrLn "Hello HASKELL!"

Щоб скомпілювати це ми виконуємо команду

$ ghc hello.hs -o hi -dynamic

Параметр -dynamic взагалі не обовʼязковий, але через те що я використовую ghc з офіційних репозиторіїв Arch де є тільки динамічні бібліотеки я змушений вказувати цей параметр. Це вказано на Arch Wiki тут.

#програмування #haskell #hs #hello-world #first-program #перша-програма #ghc #arch #linux #compiling #компіляція #програма #арч #dynamic #libs #бібліотеки #лінкування

PS: Поки значка Haskell тут немає.

Haskell - ArchWiki

Ця оптимізація відбувається завдяки, тому що C++, на відміну від Go і Rust, привʼязує свою стандартну бібліотеку динамічно. Через це знижується сумісність бінарних файлів. Зібраний бінарний файл на Arch з використанням GCC 13, на Debian не запускається, тому що у ньому ще досі 12 версія компілятора, відповідно і старіша версія бібліотеки libstdc++.

Мені стало цікаво скільки буде займати місця файл програми коли ми прилінкуємо цю бібліотеку статично. Це можна зробити додавши -static до команди лінкера. Збирати будемо у режимі випуску. Якщо ми привʼяжемо динамічно, то розмір буде 547.664KiB, а якщо статично, то 3.214MiB. Ми можемо зменшити обидва ці файли видаливши з них зайву інформацію за допомоги команди strip з набору binutils. Після цього перший файл буде займати 427.664KiB, а зі статичною бібліотекою 2.581MiB. У другому випадку різниця більш помітна.

Виходить що коли поставити C++ і Go у рівні умови, то по розміру виграє Go через меншу стандартну бібліотеку. А по швидкості виконання все рівно виграє C++. Але їх обох обганяє чистий C.

Також хочу замітити що на бінарний файл мови Go команда strip ніяк не впливає, тобто нічого не видаляє.

#strip #static #libstdc++ #c++ #cpp #binutils #bin #gcc #g++ #link #sof #size #статична #бібліотека #привʼязка #лінкер #лінкування #розмір #бінарники #go

Social.Net.Ua