Pull to refresh
48
Гончаров Вадим@nuclight

Программист Си | Perl | Tcl/Tk

-0,1
Rating
80
Subscribers
Send message

Так это Windows, там просто системный компонент берут, как и на мобилах, кстати. А webkit-gtk для тех ОС, где “штатного” браузера из коробки нет.

Людей, на полном серьезе не понимающих, почему многообразие и свобода хорошо, надо принудительно сажать писать на COBOL, где, например, символ комментария можно поставить только в определенной колонке строки и нигде иначе (6-й штоле, забываю уже), строки длиннее 72 символов синтаксическая ошибка, и надо внимательно смотреть, где расставлять точки (вместо точек с запятыми там) в случае вложенных IF. Вспоминая, как из-за подобной ошибки (только в Фортране) в свое время упала ракета.

Вообще, конечно, тут вспоминается великий психиатр Эрих Фромм, книга “Бегство от свободы”…

Ну вообще-то нет, не висит. В этом легко можно убедится, попробовав открыть эти .so на запись и получить странную ошибку Text file busy. Это значит, что подсистема виртуальной памяти рассматривает их как этакий “своп”, и неиспользуемые страницы просто выкидывает из памяти, при необходимости загружая вновь из файла. При этом будет экономия на том, что используемые части у разных программ всё же пересекаются, а в случае статической линковки у каждого будет таки своя копия.

Это не говоря уже о том, что в цифры 20 раз при -flto я не верю - 2-3 раза куда ни шло.

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

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

Я толсто намекал, что для разных людей понятие интуитивности - разное. Нет, для человека, совсем ничего не видевшего, как & и && будут разными, либо наоборот, так и or и || совсем не одинаковы. Тем более, что, например, в криптографической литературе || часто используется для конкатенации и вообще к or отношения не имеет. Происхождение же разницы очевидно, опять же, для человека с правильным бэкграундом: в шелле && и || используются для управления выполнением, имея низкий приоритет, Ларри нужны были как они, так и сишные операторы, и сишные видимо чаще, поэтому для управления он и дал им другие названия.

Насчет серьезности Ларри, не знаю, полностью прочитаю текст через несколько дней, однако абзац про постмодернизм по крайней мере забавен. И да, использование философских причин вполне нормально, потому что это, кхм, правильно (pun в контексте постмодернизма intended), а какие такие причины в программировании будут естественными, если опять же не философские? Нет, пример с интуитивностью выше уж точно не относится к “естественным для программирования”. Пакости тут тем более не в кассу (я вновь подозреваю взгляд из ограниченной картины мира).

И нет, пакости с Perl6 он не совершал - это совершенно обычная, естественная для программистов ошибка “сейчас всё возьмем и перепишем с нуля”. Её совершают очень многие, Netscape так вообще из бизнеса вылетел, прекратив существование как компания. Против неё целые эссе мне попадались… так что нет, злого умысла у Ларри здесь не было.

“Единственной интуитивно понятной вещью является материнская сиська, всему остальному надо учиться” (с)

У меня, например, нет такого интуитивного понимания. Более того, из опыта Си с разными & и && интуиция говорит, что и тут должно отличаться (зачем-то же их сделали разными).

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

Что там сложного? Табличка приоритетов в самом начале man perlop, при сомнениях открыть глянуть очень быстро, не читая весь.

Да, это единственное место в прототипах “без запятых”, которое любят и широко применяют. В каком-нибудь try {} catch {} очень органично ложится, например.

Тут хитрость в том, что парсер без скобок трактует это как вызов метода myprint для STDERR который одновременно является и typeglob и объектом класса IO::File, наследником IO::Handle.

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

У данной (print) прототип нестандартный. Но есть встроенные и со стандартными прототипами которые без прототипа работать не будут. Вот, скажем, у push стандартный прототип (\@@)

Нет, он нестандартный, не в том плане, что не описан в манах, а в том, что “обычно так не делают” (не рекомендуется).

Вы цифры-то посмотрели? Он таки грузит .so на двести метров, примерно своего же размера то есть. Если бы каждое qt-приложение тащило бы его еще внутрь себя статиком, я бы на своих 16 гигах уже совсем помер (а так просто рестартую Файрфокс раз в несколько дней, когда своп засрётся). В том числе за это и не люблю все эти снапы-флатпаки (к счастью, у меня их и нет).

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

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

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

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

По-моему он и так с -flto собирается, во всяком случае, когда я собирал его себе в позапрошлом году, из 3 часов сборки линковка занимала минут сорок. Но памяти он жрёт не так много, в те годы меньше гигабайта свежий, сейчас же гига два:

CPU: 32,5% user,  0,0% nice,  6,0% system,  0,3% interrupt, 61,2% idle
Mem: 5987M Active, 5788M Inact, 1025M Laundry, 2715M Wired, 1054M Buf, 357M Free
ARC: 524M Total, 122M MFU, 343M MRU, 5291K Anon, 3109K Header, 50M Other
     374M Compressed, 442M Uncompressed, 1,18:1 Ratio
Swap: 16G Total, 8752M Used, 7680M Free, 53% Inuse

  PID USERNAME    THR PRI NICE   SIZE    RES STATE    C   TIME    WCPU COMMAND
21590 vadim       106  20    0    31G  7214M select   3 237:57  75,44% firefox
77669 vadim        24  20    0  7636M   476M select   1   5:30   0,20% /usr/local/lib/firefox/firefox -contentproc {0
28896 vadim        25  20    0  3438M   391M select   1   4:08   0,01% /usr/local/lib/firefox/firefox -contentproc {7
78385 vadim        24  20    0  3194M   406M select   0  12:46   0,02% /usr/local/lib/firefox/firefox -contentproc {e
  394 vadim        21  20    0  3164M   292M select   3   6:06   1,45% /usr/local/lib/firefox/firefox -contentproc {8
 6350 vadim        19  20    0  3156M   400M select   0  13:06   1,34% /usr/local/lib/firefox/firefox -contentproc {b
 6438 vadim        19  20    0  3112M   329M select   1  10:07   0,76% /usr/local/lib/firefox/firefox -contentproc {b
90089 vadim        22  20    0  3106M   307M select   3   5:51   0,93% /usr/local/lib/firefox/firefox -contentproc {4
 6499 vadim        19  20    0  3074M   322M select   3   8:06   0,97% /usr/local/lib/firefox/firefox -contentproc {9
 6490 vadim        19  20    0  3030M   313M select   3   8:02   1,07% /usr/local/lib/firefox/firefox -contentproc {3
28049 vadim        23  20    0  2993M   245M select   3  11:43   0,06% /usr/local/lib/firefox/firefox -contentproc {e
 1646 vadim        19  20    0  2989M   236M select   0   4:00   0,18% /usr/local/lib/firefox/firefox -contentproc {6
 9057 vadim        29  84    0  2898M   445M CPU3     3   4:14  38,92% /usr/local/lib/firefox/firefox -contentproc {6
78083 vadim        20  20    0  2888M   227M select   2  11:22   0,12% /usr/local/lib/firefox/firefox -contentproc {b
 5875 vadim        19  20    0  2826M   162M select   0   0:37   0,08% /usr/local/lib/firefox/firefox -contentproc {a
 6698 vadim        20  20    0  2779M   184M select   1   3:21   0,06% /usr/local/lib/firefox/firefox -contentproc {f
27671 vadim        20  20    0  2755M   192M select   2   0:24   0,00% /usr/local/lib/firefox/firefox -contentproc {6
 6611 vadim        19  20    0  2747M   163M select   3   0:38   0,05% /usr/local/lib/firefox/firefox -contentproc {d
 6620 vadim        19  20    0  2732M   161M select   0   0:39   0,05% /usr/local/lib/firefox/firefox -contentproc {9
78104 vadim        19  20    0  2730M   138M select   0   1:56   0,02% /usr/local/lib/firefox/firefox -contentproc {0
27680 vadim        19  20    0  2719M   182M select   0   0:12   0,00% /usr/local/lib/firefox/firefox -contentproc {5
21793 vadim        19  20    0  2692M   163M select   0   1:17   0,24% /usr/local/lib/firefox/firefox -contentproc {7
23658 vadim         1  52    0  2691M  1968K pipewr   0   0:10   0,00% git log --all -- mail/claws-mail
 9059 vadim        20  20    0  2675M   238M select   1   0:19   0,03% /usr/local/lib/firefox/firefox -contentproc {e
65171 vadim        19  20    0  2670M   168M select   3   1:02   0,03% /usr/local/lib/firefox/firefox -contentproc {0
21733 vadim        19  20    0  2639M   114M select   0   0:42   0,02% /usr/local/lib/firefox/firefox -contentproc {2
21615 vadim        18  20    0  2636M   185M select   2   5:09   0,70% /usr/local/lib/firefox/firefox -contentproc {3
44518 vadim        20  20    0  2633M   149M select   1   2:06   0,00% /usr/local/lib/firefox/firefox -contentproc {6
...
 6726 vadim        18  20    0  2480M   106M select   3   0:01   0,00% /usr/local/lib/firefox/firefox -contentproc {2
 9075 vadim        18  20    0  2480M   141M select   3   0:01   0,00% /usr/local/lib/firefox/firefox -contentproc {6
14633 vadim        13  20    0  2466M   136M select   1   0:01   0,00% /usr/local/lib/firefox/firefox -contentproc {8
18722 vadim        13  20    0  2465M   137M select   0   0:01   0,00% /usr/local/lib/firefox/firefox -contentproc {a
18669 vadim        13  20    0  2465M   137M select   0   0:01   0,00% /usr/local/lib/firefox/firefox -contentproc {6
19106 vadim        58  20    0  2164M   435M select   2  15:16   0,00% Telegram
19075 vadim         3  23    0  1124M    72M select   0  41:51   6,57% /usr/local/libexec/Xorg :0 -verbose 5 -logverb

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

И какой самый толстый обьект внутри ELF-а ?

Пишите как посмотреть, я не настолько сварщик :)

Так он уже stripped! И не статический, в том-то и мой поинт - если б ЭТО еще и статическим было, при критикуемом мной подходе Go/Rust, размеры были бы вообще невообразимые! Полный readelf не покажу, он по размерам сюда не влезет просто. Да, часть его размеров - это встроенные картинки, но они особо не менялись со времен, когда он менее 100 Мб занимал. Сейчас же в нём еще и браузер есть на webkit-gtk (правда мне лень рыться в выводе ниже, влинкован или как .so)/

$ file /usr/local/bin/Telegram 
/usr/local/bin/Telegram: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 13.5, FreeBSD-style, stripped
$ ldd /usr/local/bin/Telegram
/usr/local/bin/Telegram:
        libBlocksRuntime.so.0 => /usr/lib/libBlocksRuntime.so.0 (0x2239f9df0000)
        libminizip.so.1 => /usr/local/lib/libminizip.so.1 (0x2239fa294000)
        librnnoise.so.0 => /usr/local/lib/librnnoise.so.0 (0x2239fbc90000)
        libopenal.so.1 => /usr/local/lib/libopenal.so.1 (0x2239fa701000)
        libprotobuf-lite.so.29.6.0 => /usr/local/lib/libprotobuf-lite.so.29.6.0 (0x2239fab44000)
        libabsl_strings.so.2501.0.0 => /usr/local/lib/libabsl_strings.so.2501.0.0 (0x2239fb4b5000)
        libabsl_throw_delegate.so.2501.0.0 => /usr/local/lib/libabsl_throw_delegate.so.2501.0.0 (0x2239fbf1d000)
        libhunspell-1.7.so.0 => /usr/local/lib/libhunspell-1.7.so.0 (0x2239fc667000)
        libavfilter.so.11 => /usr/local/lib/libavfilter.so.11 (0x2239fe19e000)
        libpipewire-0.3.so.0 => /usr/local/lib/libpipewire-0.3.so.0 (0x2239fd194000)
        libssl.so.111 => /usr/lib/libssl.so.111 (0x2239ff57e000)
        libavformat.so.62 => /usr/local/lib/libavformat.so.62 (0x223a00ce8000)
        libavcodec.so.62 => /usr/local/lib/libavcodec.so.62 (0x223a04000000)
        libswresample.so.6 => /usr/local/lib/libswresample.so.6 (0x223a004db000)
        libswscale.so.9 => /usr/local/lib/libswscale.so.9 (0x223a01c02000)
        libavutil.so.60 => /usr/local/lib/libavutil.so.60 (0x223a031dd000)
        libopus.so.0 => /usr/local/lib/libopus.so.0 (0x223a07a00000)
        libopenh264.so.8 => /usr/local/lib/libopenh264.so.8 (0x223a025a3000)
        libsrtp2.so.1 => /usr/local/lib/libsrtp2.so.1 (0x223a05d7b000)
        libvpx.so.12 => /usr/local/lib/libvpx.so.12 (0x223a062a6000)
        libm.so.5 => /lib/libm.so.5 (0x223a070e9000)
        libcrc32c.so.1 => /usr/local/lib/libcrc32c.so.1 (0x223a08ad5000)
        libjpeg.so.8 => /usr/local/lib/libjpeg.so.8 (0x223a09ca7000)
        libXcomposite.so.1 => /usr/local/lib/libXcomposite.so.1 (0x223a08f2f000)
        libXdamage.so.1 => /usr/local/lib/libXdamage.so.1 (0x223a0a626000)
        libXrandr.so.2 => /usr/local/lib/libXrandr.so.2 (0x223a0b4ed000)
        libXtst.so.6 => /usr/local/lib/libXtst.so.6 (0x223a0b99b000)
        libXext.so.6 => /usr/local/lib/libXext.so.6 (0x223a0c30a000)
        libXfixes.so.3 => /usr/local/lib/libXfixes.so.3 (0x223a0d06f000)
        libX11.so.6 => /usr/local/lib/libX11.so.6 (0x223a0e546000)
        liblz4.so.1 => /usr/local/lib/liblz4.so.1 (0x223a0d53c000)
        libada.so.3 => /usr/local/lib/libada.so.3 (0x223a0eb01000)
        libz.so.6 => /lib/libz.so.6 (0x223a0f701000)
        libcrypto.so.111 => /lib/libcrypto.so.111 (0x223a109d4000)
        libdispatch.so.1 => /usr/local/lib/libdispatch.so.1 (0x223a1067c000)
        libKF6CoreAddons.so.6 => /usr/local/lib/libKF6CoreAddons.so.6 (0x223a110d5000)
        libxxhash.so.0 => /usr/local/lib/libxxhash.so.0 (0x223a1256c000)
        libxcb-keysyms.so.1 => /usr/local/lib/libxcb-keysyms.so.1 (0x223a11909000)
        libxcb.so.1 => /usr/local/lib/libxcb.so.1 (0x223a12ca7000)
        libxcb-record.so.0 => /usr/local/lib/libxcb-record.so.0 (0x223a12d2e000)
        libxcb-screensaver.so.0 => /usr/local/lib/libxcb-screensaver.so.0 (0x223a12d89000)
        libqrcodegencpp.so.1 => /usr/local/lib/libqrcodegencpp.so.1 (0x223a14a65000)
        libQt6Svg.so.6 => /usr/local/lib/qt6/libQt6Svg.so.6 (0x223a133aa000)
        libQt6OpenGLWidgets.so.6 => /usr/local/lib/qt6/libQt6OpenGLWidgets.so.6 (0x223a141fa000)
        libQt6QuickWidgets.so.6 => /usr/local/lib/qt6/libQt6QuickWidgets.so.6 (0x223a1649b000)
        libQt6Widgets.so.6 => /usr/local/lib/qt6/libQt6Widgets.so.6 (0x223a18a00000)
        libQt6WaylandCompositor.so.6 => /usr/local/lib/qt6/libQt6WaylandCompositor.so.6 (0x223a14aa9000)
        libQt6Quick.so.6 => /usr/local/lib/qt6/libQt6Quick.so.6 (0x223a19a00000)
        libQt6OpenGL.so.6 => /usr/local/lib/qt6/libQt6OpenGL.so.6 (0x223a15bb7000)
        libQt6Gui.so.6 => /usr/local/lib/qt6/libQt6Gui.so.6 (0x223a1c000000)
        libQt6Qml.so.6 => /usr/local/lib/qt6/libQt6Qml.so.6 (0x223a174a0000)
        libQt6Network.so.6 => /usr/local/lib/qt6/libQt6Network.so.6 (0x223a1ac15000)
        libQt6Core.so.6 => /usr/local/lib/qt6/libQt6Core.so.6 (0x223a1d200000)
        libgio-2.0.so.0 => /usr/local/lib/libgio-2.0.so.0 (0x223a1bc78000)
        libgobject-2.0.so.0 => /usr/local/lib/libgobject-2.0.so.0 (0x223a1e429000)
        libglib-2.0.so.0 => /usr/local/lib/libglib-2.0.so.0 (0x223a1fa5a000)
        libc++.so.1 => /usr/lib/libc++.so.1 (0x223a1efd2000)
        libcxxrt.so.1 => /lib/libcxxrt.so.1 (0x223a206f9000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x223a21005000)
        libthr.so.3 => /lib/libthr.so.3 (0x223a221c1000)
        libc.so.7 => /lib/libc.so.7 (0x223a22ebd000)
        libdbus-1.so.3 => /usr/local/lib/libdbus-1.so.3 (0x223a21968000)
        libabsl_die_if_null.so.2501.0.0 => /usr/local/lib/libabsl_die_if_null.so.2501.0.0 (0x223a243c4000)
        libabsl_log_initialize.so.2501.0.0 => /usr/local/lib/libabsl_log_initialize.so.2501.0.0 (0x223a24071000)
        libabsl_statusor.so.2501.0.0 => /usr/local/lib/libabsl_statusor.so.2501.0.0 (0x223a243ef000)
        libutf8_validity.so => /usr/local/lib/libutf8_validity.so (0x223a249ec000)
        libabsl_log_internal_check_op.so.2501.0.0 => /usr/local/lib/libabsl_log_internal_check_op.so.2501.0.0 (0x223a25de3000)
        libabsl_log_internal_conditions.so.2501.0.0 => /usr/local/lib/libabsl_log_internal_conditions.so.2501.0.0 (0x223a24b6c000)
        libabsl_log_internal_message.so.2501.0.0 => /usr/local/lib/libabsl_log_internal_message.so.2501.0.0 (0x223a252cf000)
        libabsl_log_internal_nullguard.so.2501.0.0 => /usr/local/lib/libabsl_log_internal_nullguard.so.2501.0.0 (0x223a26c12000)
        libabsl_examine_stack.so.2501.0.0 => /usr/local/lib/libabsl_examine_stack.so.2501.0.0 (0x223a28209000)
        libabsl_log_internal_format.so.2501.0.0 => /usr/local/lib/libabsl_log_internal_format.so.2501.0.0 (0x223a278a8000)
        libabsl_log_internal_structured_proto.so.2501.0.0 => /usr/local/lib/libabsl_log_internal_structured_proto.so.2501.0.0 (0x223a290be000)
        libabsl_log_internal_proto.so.2501.0.0 => /usr/local/lib/libabsl_log_internal_proto.so.2501.0.0 (0x223a2998d000)
        libabsl_log_internal_log_sink_set.so.2501.0.0 => /usr/local/lib/libabsl_log_internal_log_sink_set.so.2501.0.0 (0x223a2a3e9000)
        libabsl_log_sink.so.2501.0.0 => /usr/local/lib/libabsl_log_sink.so.2501.0.0 (0x223a2a926000)
        libabsl_log_entry.so.2501.0.0 => /usr/local/lib/libabsl_log_entry.so.2501.0.0 (0x223a2bc74000)
        libabsl_flags_internal.so.2501.0.0 => /usr/local/lib/libabsl_flags_internal.so.2501.0.0 (0x223a2add7000)
        libabsl_flags_marshalling.so.2501.0.0 => /usr/local/lib/libabsl_flags_marshalling.so.2501.0.0 (0x223a2c2d3000)
        libabsl_flags_reflection.so.2501.0.0 => /usr/local/lib/libabsl_flags_reflection.so.2501.0.0 (0x223a2ccf8000)
        libabsl_flags_config.so.2501.0.0 => /usr/local/lib/libabsl_flags_config.so.2501.0.0 (0x223a2d964000)
        libabsl_flags_program_name.so.2501.0.0 => /usr/local/lib/libabsl_flags_program_name.so.2501.0.0 (0x223a2eb51000)
        libabsl_flags_private_handle_accessor.so.2501.0.0 => /usr/local/lib/libabsl_flags_private_handle_accessor.so.2501.0.0 (0x223a2def1000)
        libabsl_flags_commandlineflag.so.2501.0.0 => /usr/local/lib/libabsl_flags_commandlineflag.so.2501.0.0 (0x223a2edd3000)
        libabsl_flags_commandlineflag_internal.so.2501.0.0 => /usr/local/lib/libabsl_flags_commandlineflag_internal.so.2501.0.0 (0x223a30c1a000)
        libabsl_log_globals.so.2501.0.0 => /usr/local/lib/libabsl_log_globals.so.2501.0.0 (0x223a2faef000)
        libabsl_vlog_config_internal.so.2501.0.0 => /usr/local/lib/libabsl_vlog_config_internal.so.2501.0.0 (0x223a2ff47000)
        libabsl_log_internal_fnmatch.so.2501.0.0 => /usr/local/lib/libabsl_log_internal_fnmatch.so.2501.0.0 (0x223a3101b000)
        libabsl_log_internal_globals.so.2501.0.0 => /usr/local/lib/libabsl_log_internal_globals.so.2501.0.0 (0x223a320f5000)
        libabsl_raw_hash_set.so.2501.0.0 => /usr/local/lib/libabsl_raw_hash_set.so.2501.0.0 (0x223a31840000)
        libabsl_hash.so.2501.0.0 => /usr/local/lib/libabsl_hash.so.2501.0.0 (0x223a3230f000)
        libabsl_city.so.2501.0.0 => /usr/local/lib/libabsl_city.so.2501.0.0 (0x223a3275f000)
        libabsl_low_level_hash.so.2501.0.0 => /usr/local/lib/libabsl_low_level_hash.so.2501.0.0 (0x223a33423000)
        libabsl_hashtablez_sampler.so.2501.0.0 => /usr/local/lib/libabsl_hashtablez_sampler.so.2501.0.0 (0x223a34ab2000)
        libabsl_random_distributions.so.2501.0.0 => /usr/local/lib/libabsl_random_distributions.so.2501.0.0 (0x223a34221000)
        libabsl_random_seed_sequences.so.2501.0.0 => /usr/local/lib/libabsl_random_seed_sequences.so.2501.0.0 (0x223a351f3000)
        libabsl_random_internal_pool_urbg.so.2501.0.0 => /usr/local/lib/libabsl_random_internal_pool_urbg.so.2501.0.0 (0x223a36661000)
        libabsl_random_internal_randen.so.2501.0.0 => /usr/local/lib/libabsl_random_internal_randen.so.2501.0.0 (0x223a35512000)
        libabsl_random_internal_randen_hwaes.so.2501.0.0 => /usr/local/lib/libabsl_random_internal_randen_hwaes.so.2501.0.0 (0x223a35782000)
        libabsl_random_internal_randen_hwaes_impl.so.2501.0.0 => /usr/local/lib/libabsl_random_internal_randen_hwaes_impl.so.2501.0.0 (0x223a366fc000)
        libabsl_random_internal_randen_slow.so.2501.0.0 => /usr/local/lib/libabsl_random_internal_randen_slow.so.2501.0.0 (0x223a36b9c000)
        libabsl_random_internal_platform.so.2501.0.0 => /usr/local/lib/libabsl_random_internal_platform.so.2501.0.0 (0x223a37956000)
        libabsl_random_internal_seed_material.so.2501.0.0 => /usr/local/lib/libabsl_random_internal_seed_material.so.2501.0.0 (0x223a385ac000)
        libabsl_random_seed_gen_exception.so.2501.0.0 => /usr/local/lib/libabsl_random_seed_gen_exception.so.2501.0.0 (0x223a39593000)
        libabsl_status.so.2501.0.0 => /usr/local/lib/libabsl_status.so.2501.0.0 (0x223a3a2cb000)
        libabsl_cord.so.2501.0.0 => /usr/local/lib/libabsl_cord.so.2501.0.0 (0x223a3a8c6000)
        libabsl_cordz_info.so.2501.0.0 => /usr/local/lib/libabsl_cordz_info.so.2501.0.0 (0x223a3b437000)
        libabsl_cord_internal.so.2501.0.0 => /usr/local/lib/libabsl_cord_internal.so.2501.0.0 (0x223a3bf78000)
        libabsl_cordz_functions.so.2501.0.0 => /usr/local/lib/libabsl_cordz_functions.so.2501.0.0 (0x223a3c3b0000)
        libabsl_exponential_biased.so.2501.0.0 => /usr/local/lib/libabsl_exponential_biased.so.2501.0.0 (0x223a3ccea000)
        libabsl_cordz_handle.so.2501.0.0 => /usr/local/lib/libabsl_cordz_handle.so.2501.0.0 (0x223a3dee0000)
        libabsl_synchronization.so.2501.0.0 => /usr/local/lib/libabsl_synchronization.so.2501.0.0 (0x223a3d7e2000)
        libabsl_graphcycles_internal.so.2501.0.0 => /usr/local/lib/libabsl_graphcycles_internal.so.2501.0.0 (0x223a3e847000)
        libabsl_kernel_timeout_internal.so.2501.0.0 => /usr/local/lib/libabsl_kernel_timeout_internal.so.2501.0.0 (0x223a3fea9000)
        libabsl_time.so.2501.0.0 => /usr/local/lib/libabsl_time.so.2501.0.0 (0x223a3ea63000)
        libabsl_civil_time.so.2501.0.0 => /usr/local/lib/libabsl_civil_time.so.2501.0.0 (0x223a3f470000)
        libabsl_time_zone.so.2501.0.0 => /usr/local/lib/libabsl_time_zone.so.2501.0.0 (0x223a406f3000)
        libabsl_tracing_internal.so.2501.0.0 => /usr/local/lib/libabsl_tracing_internal.so.2501.0.0 (0x223a411eb000)
        libabsl_crc_cord_state.so.2501.0.0 => /usr/local/lib/libabsl_crc_cord_state.so.2501.0.0 (0x223a426be000)
        libabsl_crc32c.so.2501.0.0 => /usr/local/lib/libabsl_crc32c.so.2501.0.0 (0x223a41378000)
        libabsl_crc_internal.so.2501.0.0 => /usr/local/lib/libabsl_crc_internal.so.2501.0.0 (0x223a41885000)
        libabsl_crc_cpu_detect.so.2501.0.0 => /usr/local/lib/libabsl_crc_cpu_detect.so.2501.0.0 (0x223a42cb8000)
        libabsl_bad_optional_access.so.2501.0.0 => /usr/local/lib/libabsl_bad_optional_access.so.2501.0.0 (0x223a44c03000)
        libabsl_stacktrace.so.2501.0.0 => /usr/local/lib/libabsl_stacktrace.so.2501.0.0 (0x223a42d0c000)
        libabsl_leak_check.so.2501.0.0 => /usr/local/lib/libabsl_leak_check.so.2501.0.0 (0x223a43e05000)
        libabsl_strerror.so.2501.0.0 => /usr/local/lib/libabsl_strerror.so.2501.0.0 (0x223a45c26000)
        libabsl_symbolize.so.2501.0.0 => /usr/local/lib/libabsl_symbolize.so.2501.0.0 (0x223a452fc000)
        libabsl_debugging_internal.so.2501.0.0 => /usr/local/lib/libabsl_debugging_internal.so.2501.0.0 (0x223a46a36000)
        libabsl_malloc_internal.so.2501.0.0 => /usr/local/lib/libabsl_malloc_internal.so.2501.0.0 (0x223a480ad000)
        libabsl_demangle_internal.so.2501.0.0 => /usr/local/lib/libabsl_demangle_internal.so.2501.0.0 (0x223a478f9000)
        libabsl_demangle_rust.so.2501.0.0 => /usr/local/lib/libabsl_demangle_rust.so.2501.0.0 (0x223a48eec000)
        libabsl_decode_rust_punycode.so.2501.0.0 => /usr/local/lib/libabsl_decode_rust_punycode.so.2501.0.0 (0x223a495a5000)
        libabsl_utf8_for_code_point.so.2501.0.0 => /usr/local/lib/libabsl_utf8_for_code_point.so.2501.0.0 (0x223a49ad8000)
        libabsl_bad_variant_access.so.2501.0.0 => /usr/local/lib/libabsl_bad_variant_access.so.2501.0.0 (0x223a49dcf000)
        libabsl_str_format_internal.so.2501.0.0 => /usr/local/lib/libabsl_str_format_internal.so.2501.0.0 (0x223a49f41000)
        libabsl_int128.so.2501.0.0 => /usr/local/lib/libabsl_int128.so.2501.0.0 (0x223a4af21000)
        libabsl_strings_internal.so.2501.0.0 => /usr/local/lib/libabsl_strings_internal.so.2501.0.0 (0x223a4c05e000)
        libabsl_string_view.so.2501.0.0 => /usr/local/lib/libabsl_string_view.so.2501.0.0 (0x223a4b1cb000)
        libabsl_base.so.2501.0.0 => /usr/local/lib/libabsl_base.so.2501.0.0 (0x223a4d33c000)
        libabsl_spinlock_wait.so.2501.0.0 => /usr/local/lib/libabsl_spinlock_wait.so.2501.0.0 (0x223a4c5a4000)
        libabsl_raw_logging_internal.so.2501.0.0 => /usr/local/lib/libabsl_raw_logging_internal.so.2501.0.0 (0x223a4da07000)
        libabsl_log_severity.so.2501.0.0 => /usr/local/lib/libabsl_log_severity.so.2501.0.0 (0x223a4e9aa000)
        libncursesw.so.9 => /lib/libncursesw.so.9 (0x223a4eeac000)
        libharfbuzz.so.0 => /usr/local/lib/libharfbuzz.so.0 (0x223a4fce7000)
        liblcms2.so.2 => /usr/local/lib/liblcms2.so.2 (0x223a50087000)
        libplacebo.so.360 => /usr/local/lib/libplacebo.so.360 (0x223a509c7000)
        libvmaf.so.3 => /usr/local/lib/libvmaf.so.3 (0x223a51c17000)
        libass.so.9 => /usr/local/lib/libass.so.9 (0x223a50f9b000)
        libva.so.2 => /usr/local/lib/libva.so.2 (0x223a520aa000)
        libshaderc_shared.so.1 => /usr/local/lib/libshaderc_shared.so.1 (0x223a52200000)
        libfontconfig.so.1 => /usr/local/lib/libfontconfig.so.1 (0x223a52a84000)
        libfreetype.so.6 => /usr/local/lib/libfreetype.so.6.18.3 (0x223a53489000)
        libdl.so.1 => /usr/lib/libdl.so.1 (0x223a54b47000)
        libintl.so.8 => /usr/local/lib/libintl.so.8 (0x223a53f40000)
        libxml2.so.16 => /usr/local/lib/libxml2.so.16 (0x223a55958000)
        libbz2.so.4 => /usr/lib/libbz2.so.4 (0x223a56e1e000)
        libdvdnav.so.4 => /usr/local/lib/libdvdnav.so.4 (0x223a56236000)
        libdvdread.so.8 => /usr/local/lib/libdvdread.so.8 (0x223a57647000)
        libbluray.so.3 => /usr/local/lib/libbluray.so.3 (0x223a5835e000)
        libgmp.so.10 => /usr/local/lib/libgmp.so.10 (0x223a5885f000)
        libgnutls.so.30 => /usr/local/lib/libgnutls.so.30 (0x223a59a45000)
        libsrt.so.1.5 => /usr/local/lib/libsrt.so.1.5 (0x223a58fe8000)
        libwebpmux.so.3 => /usr/local/lib/libwebpmux.so.3 (0x223a5abe9000)
        liblzma.so.5 => /usr/lib/liblzma.so.5 (0x223a5bfe3000)
        libdav1d.so.7 => /usr/local/lib/libdav1d.so.7 (0x223a5ba60000)
        librsvg-2.so.2 => /usr/local/lib/librsvg-2.so.2 (0x223a5c9ea000)
        libcairo.so.2 => /usr/local/lib/libcairo.so.2 (0x223a5d24f000)
        libaom.so.3 => /usr/local/lib/libaom.so.3 (0x223a5f625000)
        libjxl.so.0.11 => /usr/local/lib/libjxl.so.0.11 (0x223a60263000)
        libjxl_threads.so.0.11 => /usr/local/lib/libjxl_threads.so.0.11 (0x223a5e333000)
        libmp3lame.so.0 => /usr/local/lib/libmp3lame.so.0 (0x223a5f307000)
        libSvtAv1Enc.so.4 => /usr/local/lib/libSvtAv1Enc.so.4 (0x223a62124000)
        libvorbis.so.0 => /usr/local/lib/libvorbis.so.0 (0x223a617d7000)
        libvorbisenc.so.2 => /usr/local/lib/libvorbisenc.so.2 (0x223a63a43000)
        libwebp.so.7 => /usr/local/lib/libwebp.so.7 (0x223a6276f000)
        libx264.so.164 => /usr/local/lib/libx264.so.164 (0x223a64306000)
        libx265.so.215 => /usr/local/lib/libx265.so.215 (0x223a65e85000)
        libva-drm.so.2 => /usr/local/lib/libva-drm.so.2 (0x223a62f1e000)
        libvdpau.so.1 => /usr/local/lib/libvdpau.so.1 (0x223a64d73000)
        libdrm.so.2 => /usr/local/lib/libdrm.so.2 (0x223a65c9b000)
        libXrender.so.1 => /usr/local/lib/libXrender.so.1 (0x223a683ee000)
        libXi.so.6 => /usr/local/lib/libXi.so.6 (0x223a67a0a000)
        librt.so.1 => /usr/lib/librt.so.1 (0x223a692d3000)
        libinotify.so.0 => /usr/local/lib/libinotify.so.0 (0x223a6a317000)
        libQt6DBus.so.6 => /usr/local/lib/qt6/libQt6DBus.so.6 (0x223a6bc73000)
        libkvm.so.7 => /lib/libkvm.so.7 (0x223a6a212000)
        libprocstat.so.1 => /usr/lib/libprocstat.so.1 (0x223a6a784000)
        libXau.so.6 => /usr/local/lib/libXau.so.6 (0x223a6b642000)
        libXdmcp.so.6 => /usr/local/lib/libXdmcp.so.6 (0x223a6c510000)
        libGLX.so.0 => /usr/local/lib/libGLX.so.0 (0x223a6d305000)
        libOpenGL.so.0 => /usr/local/lib/libOpenGL.so.0 (0x223a6e0ea000)
        libxkbcommon.so.0 => /usr/local/lib/libxkbcommon.so.0 (0x223a6e4d3000)
        libQt6QmlMeta.so.6 => /usr/local/lib/qt6/libQt6QmlMeta.so.6 (0x223a6fa2e000)
        libQt6QmlModels.so.6 => /usr/local/lib/qt6/libQt6QmlModels.so.6 (0x223a70dbf000)
        libQt6QmlWorkerScript.so.6 => /usr/local/lib/qt6/libQt6QmlWorkerScript.so.6 (0x223a6fc98000)
        libwayland-server.so.0 => /usr/local/lib/libwayland-server.so.0 (0x223a7083a000)
        libEGL.so.1 => /usr/local/lib/libEGL-NVIDIA.so.1 (0x223a7210f000)
        libpng16.so.16 => /usr/local/lib/libpng16.so.16 (0x223a71c1a000)
        libgthread-2.0.so.0 => /usr/local/lib/libgthread-2.0.so.0 (0x223a72c18000)
        libbrotlidec.so.1 => /usr/local/lib/libbrotlidec.so.1 (0x223a73c17000)
        libzstd.so.1 => /usr/local/lib/libzstd.so.1 (0x223a74db1000)
        libicui18n.so.76 => /usr/local/lib/libicui18n.so.76 (0x223a75daf000)
        libicuuc.so.76 => /usr/local/lib/libicuuc.so.76 (0x223a76ff2000)
        libicudata.so.76 => /usr/local/lib/libicudata.so.76 (0x223a748a5000)
        libexecinfo.so.1 => /usr/lib/libexecinfo.so.1 (0x223a77734000)
        libdouble-conversion.so.3 => /usr/local/lib/libdouble-conversion.so.3 (0x223a77c99000)
        libb2.so.1 => /usr/local/lib/libb2.so.1 (0x223a78231000)
        libpcre2-16.so.0 => /usr/local/lib/libpcre2-16.so.0 (0x223a78c4f000)
        libgmodule-2.0.so.0 => /usr/local/lib/libgmodule-2.0.so.0 (0x223a79aaa000)
        libffi.so.8 => /usr/local/lib/libffi.so.8 (0x223a7a64a000)
        libiconv.so.2 => /usr/local/lib/libiconv.so.2 (0x223a7b197000)
        libpcre2-8.so.0 => /usr/local/lib/libpcre2-8.so.0 (0x223a7b2ad000)
        libutil.so.9 => /lib/libutil.so.9 (0x223a7c43f000)
        libgraphite2.so.3 => /usr/local/lib/libgraphite2.so.3 (0x223a7bf0f000)
        libunwind.so.8 => /usr/local/lib/libunwind.so.8 (0x223a7d451000)
        libvulkan.so.1 => /usr/local/lib/libvulkan.so.1 (0x223a7e5bd000)
        libfribidi.so.0 => /usr/local/lib/libfribidi.so.0 (0x223a7e06a000)
        libunibreak.so.6 => /usr/local/lib/libunibreak.so.6 (0x223a7f14a000)
        libexpat.so.1 => /usr/local/lib/libexpat.so.1 (0x223a7fc1e000)
        libudfread.so.3 => /usr/local/lib/libudfread.so.3 (0x223a80a54000)
        libp11-kit.so.0 => /usr/local/lib/libp11-kit.so.0 (0x223a81c5c000)
        libidn2.so.0 => /usr/local/lib/libidn2.so.0 (0x223a814ca000)
        libunistring.so.5 => /usr/local/lib/libunistring.so.5 (0x223a82546000)
        libtasn1.so.6 => /usr/local/lib/libtasn1.so.6 (0x223a834ae000)
        libhogweed.so.6 => /usr/local/lib/libhogweed.so.6 (0x223a84c28000)
        libnettle.so.8 => /usr/local/lib/libnettle.so.8 (0x223a83f7c000)
        libmd.so.6 => /lib/libmd.so.6 (0x223a857e5000)
        libgdk_pixbuf-2.0.so.0 => /usr/local/lib/libgdk_pixbuf-2.0.so.0 (0x223a86cf1000)
        libpangocairo-1.0.so.0 => /usr/local/lib/libpangocairo-1.0.so.0 (0x223a85ea2000)
        libpango-1.0.so.0 => /usr/local/lib/libpango-1.0.so.0 (0x223a8713f000)
        libxcb-render.so.0 => /usr/local/lib/libxcb-render.so.0 (0x223a87271000)
        libxcb-shm.so.0 => /usr/local/lib/libxcb-shm.so.0 (0x223a87b7c000)
        libpixman-1.so.0 => /usr/local/lib/libpixman-1.so.0 (0x223a88c43000)
        libjxl_cms.so.0.11 => /usr/local/lib/libjxl_cms.so.0.11 (0x223a88430000)
        libhwy.so.1 => /usr/local/lib/libhwy.so.1 (0x223a89441000)
        libbrotlienc.so.1 => /usr/local/lib/libbrotlienc.so.1 (0x223a89ac9000)
        libogg.so.0 => /usr/local/lib/libogg.so.0 (0x223a8a49a000)
        libsharpyuv.so.0 => /usr/local/lib/libsharpyuv.so.0 (0x223a8ad67000)
        libelf.so.2 => /lib/libelf.so.2 (0x223a8bb32000)
        libGLdispatch.so.0 => /usr/local/lib/libGLdispatch.so.0 (0x223a8c976000)
        libepoll-shim.so.0 => /usr/local/lib/libepoll-shim.so.0 (0x223a8dbc8000)
        libnvidia-glsi.so.1 => /usr/local/lib/libnvidia-glsi.so.1 (0x223a8f8eb000)
        libbrotlicommon.so.1 => /usr/local/lib/libbrotlicommon.so.1 (0x223a8cac4000)
        libomp.so => /usr/lib/libomp.so (0x223a8e356000)
        libpangoft2-1.0.so.0 => /usr/local/lib/libpangoft2-1.0.so.0 (0x223a8d612000)
        libthai.so.0 => /usr/local/lib/libthai.so.0 (0x223a8ec2b000)
        libdatrie.so.1 => /usr/local/lib/libdatrie.so.1 (0x223a908bf000)
        [vdso] (0x7ffffffff000)
$ readelf -a /usr/local/bin/Telegram | wc -l   
  167531
$ ldd /usr/local/bin/Telegram | awk '{print $3}' | xargs du -hLc
202M    total

Да, это не проблема языка, а проблема психологии. Многие предпочитают BDSM вместо свободы. Ну и да, большое количество свободы подразумевает внутреннюю самодисциплину, иначе начинается “ох, а еще и так можно, а давайте попробуем всё”, что и послужило причиной большого количества немайнтенабельного кода 90-х, сделавшего Перлу дурную славу - потом-то “наигрались”, а осадочек остался…

Там хитрость в том, что у данной конкретной функции прототип нестандартный: обычно в бесскобочной записи все аргументы являются просто списком через запятую, только без самих скобок: funcname "arg1", "arg2", "arg3"; А у print там может опционально появляться хэндл:

print "arg1", "arg2", "arg3";
print STDERR "arg1", "arg2", "arg3";

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

Хах, я вот могу сказать, что “как обычный програмист на Перле”, не знаю почему так без рыться в документации, потому что “обычно так не делают”, применение прототипов ограничено. “Доктор, когда я вот делаю, мне больно! - А вы так не делайте” (с)

Не целиком legacy, скажем так (пример с конкретно \$ “не очень”, а с простыми вполне). Вот, скажем, автор AnyEvent определил функцию дефолтного логгера так, чтоб можно было писать вот в таком бесскобочном стиле:

$ grep log cborlog.pl | head -5
AE::log fatal => "flag exists on start with $pid contents\n" if $pid;
        AE::log info => "starting process for layer $layer on %s", $decoders{$layer}->{inc};
                on_destroy => sub { AE::log trace => "layer $layer exited"; $cond->end },
                on_error   => sub { save_cbor(1); AE::log fatal => "RPCFORK $layer ERROR: $_[0]"; },
$AnyEvent::Log::LOG->log_to_path($opts->logfile) if $opts->{logfile}; # XXX path vs file

Синтаксис прототипов стоило объяснить для новичков, которые скорее всего в этих комментариях, тем более что обычно передачу по ссылке ВОТ ТАК не делают - в вызове сделают setter(\$x, 42) чтоб явно показать, что передана ссылка, а не просто параметр.

А про проверку синтаксиса объяснение для новичков хорошее, лайк.

Ну здесь же то же самое сказали - можно без них, по большому счету они нужны, если мы назвали свою именем встроенной функции - но зачем так делать? Когда такое может быть необходимо в случае развера проекта, в нём тогда будут модули, нэймспэйсы, объекты, так что MyModule::chomp() или $object->chomp() снова не потребует амперсанда.

1
23 ...

Information

Rating
Does not participate
Location
Москва и Московская обл., Россия
Date of birth
Registered
Activity

Specialization

Specialist
FreeBSD
Perl