avva: (Default)
avva ([personal profile] avva) wrote2009-10-08 11:45 pm

эх раз, еще раз (программистское)

Еще Бисмарк заметил, что стандартные библиотеки - как сосиски: приятнее использовать по назначению, не зная в подробностях, как их делают.

В исходниках java.util.Arrays, когда после множества фасадных методов сортировки с разными опущенными аргументами дело доходит до "мяса", до настоящего кода сортировки, его предваряет следующий комментарий:

    /*
     * The code for each of the seven primitive types is largely identical.
     * C'est la vie.
     */

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

    private static void sort1(long x[], int off, int len) { ...
    private static void sort1(int x[], int off, int len) { ...
    private static void sort1(short x[], int off, int len) { ...
    private static void sort1(char x[], int off, int len) { ...
    private static void sort1(byte x[], int off, int len) { ...
    private static void sort1(double x[], int off, int len) { ... 
    private static void sort1(float x[], int off, int len) { ...

C'est la vie.

[identity profile] dimrub.livejournal.com 2009-10-08 10:50 pm (UTC)(link)
А вот зато чтение исходников функций типа strcpy вызывает изумление, но совсем иного рода.

[identity profile] avva.livejournal.com 2009-10-08 10:54 pm (UTC)(link)
Да в этой гребаной glibc пока найдешь настоящие исходники, в лабиринте фальшивых директорий, устаревших иерархий, препроцессорной магии и еще черт знает чего - так набегаешься, что уже ничего от них не хочешь.

Блин. Терпеть не могу этого уродливого бегемота.

Вот то ли дело было читать исходники стандартной библиотеки в FreeBSD: все в очевидных местах, просто и ясно.

[identity profile] dimrub.livejournal.com 2009-10-08 10:56 pm (UTC)(link)
Я, кстати, и не помню уже, где читал эти исходники, не исключено, что на виндах. Но примененные там оптимизации меня потрясли, это я помню хорошо.

Так точно

[identity profile] spamsink.livejournal.com 2009-10-08 10:57 pm (UTC)(link)
Еще Брэм заметил, что жрущий бегемот отвратителен на вид.

[identity profile] http://users.livejournal.com/malfet_/ 2009-10-09 02:30 am (UTC)(link)
В glibc есть определенная логика, к ней нужно только привыкнуть.. Вот ld - это настоящий монстр

[identity profile] avnik.livejournal.com 2009-10-09 03:19 am (UTC)(link)
btw читать для самообразования лучше netbsd.
(если мы не говорим про желание узнать что же делает конкретно glibc)

(no subject)

[identity profile] itman.livejournal.com - 2009-10-09 14:14 (UTC) - Expand

[identity profile] ygam.livejournal.com 2009-10-09 07:28 am (UTC)(link)
В Майкрософт Оффисе glibcmsvcrt не используется, и исходники его библиотек не менее интересны.

Ты знаешь, например, что в Турции и Азербайджане toupper будет работать не так, как в остальном мире?

(no subject)

[identity profile] dimrub.livejournal.com - 2009-10-09 09:29 (UTC) - Expand

(no subject)

(Anonymous) - 2009-10-09 15:39 (UTC) - Expand

(no subject)

[identity profile] michk.livejournal.com - 2009-10-09 21:43 (UTC) - Expand

(no subject)

[identity profile] dimrub.livejournal.com - 2009-10-09 22:43 (UTC) - Expand

(no subject)

[identity profile] michk.livejournal.com - 2009-10-09 22:46 (UTC) - Expand

(no subject)

[identity profile] ygam.livejournal.com - 2009-10-11 02:19 (UTC) - Expand

(no subject)

[identity profile] michk.livejournal.com - 2009-10-11 07:24 (UTC) - Expand

(no subject)

[identity profile] ktotam.livejournal.com - 2009-10-20 00:51 (UTC) - Expand

(no subject)

[identity profile] ygam.livejournal.com - 2009-10-20 00:59 (UTC) - Expand

(no subject)

[identity profile] ygam.livejournal.com - 2009-12-19 18:34 (UTC) - Expand

[identity profile] emdin.livejournal.com 2009-10-08 11:16 pm (UTC)(link)
А вроде же был этот, как его, boxing? Или что-то такое с расширяемыми типами и автокастингом. Два года назад учил, забыл всё...

[identity profile] avva.livejournal.com 2009-10-08 11:25 pm (UTC)(link)
Есть автоматический promotion, но не для массивов (точнее, только для массивов объектов, а не примитивных числовых типов). Кроме того, они в любом случае стремятся тут выжать как можно лучший перформанс для каждого отдельного типа.

[identity profile] sergeytk.livejournal.com 2009-10-09 12:08 am (UTC)(link)
А чё-то навскидку никакого разумного выхода не вижу.

[identity profile] dimrub.livejournal.com 2009-10-09 12:46 am (UTC)(link)
На момент написания этого кода generics в Джаве, надо думать, не было. Более экспрессивные программисты сделали бы из этого вывод, что единственным разумным выходом для авторов языка было бы убиться апстену.
Edited 2009-10-09 00:46 (UTC)

(no subject)

[identity profile] sergeytk.livejournal.com - 2009-10-09 01:51 (UTC) - Expand

(no subject)

[identity profile] avitya.livejournal.com - 2009-10-09 02:06 (UTC) - Expand

(no subject)

[identity profile] ygam.livejournal.com - 2009-10-09 03:31 (UTC) - Expand

(no subject)

[identity profile] avitya.livejournal.com - 2009-10-09 03:33 (UTC) - Expand

(no subject)

[identity profile] cryinstone.livejournal.com - 2009-10-09 10:09 (UTC) - Expand

(no subject)

[identity profile] itman.livejournal.com - 2009-10-09 14:16 (UTC) - Expand

(no subject)

[identity profile] dimrub.livejournal.com - 2009-10-09 20:34 (UTC) - Expand

[identity profile] loco-che.livejournal.com 2009-10-09 01:04 am (UTC)(link)
Ну так оно же с любым legacy кодом так?
Как это -
// somedev1 - 6/7/02 Adding temporary tracking of Login screen
// somedev2 - 5/22/07 Temporary my ass

[identity profile] http://users.livejournal.com/malfet_/ 2009-10-09 02:25 am (UTC)(link)
Думаете define SORT_IMPL(type) на 100 строк был бы лучше?

[identity profile] a-bronx.livejournal.com 2009-10-09 09:33 am (UTC)(link)
Лучше уж что-то типа:

#define TYPE int
#include "sort1.inc"
#undef TYPE

#define TYPE long
#include "sort1.inc"
#undef TYPE

а в sort.inc написать единственную копию void sort(TYPE x[], int off, int len) { ... }

(no subject)

[personal profile] a_p - 2009-10-09 11:47 (UTC) - Expand

(no subject)

[identity profile] a-bronx.livejournal.com - 2009-10-13 02:30 (UTC) - Expand

[identity profile] cema.livejournal.com 2009-10-09 04:06 am (UTC)(link)
Если бы копии были не совершенно одинаковые, вот тогда было бы о чём поговорить! :-)

[identity profile] caseq.livejournal.com 2009-10-09 10:03 am (UTC)(link)
Кстати, да. Какой смысл bytes & chars сортировать qsort'ом совсем непонятно. Да и с прочими целыми типами можно было бы оптимизировать.
(deleted comment)

[identity profile] itman.livejournal.com 2009-10-09 02:17 pm (UTC)(link)
Это может быть медленно.

[identity profile] caseq.livejournal.com 2009-10-09 09:33 am (UTC)(link)
Ну а как еще такие вещи писать на языке, в котором вместо нормальных темплейтов -- уродливый костыль под названием "дженерики"?

[identity profile] xfyre.livejournal.com 2009-10-09 09:52 am (UTC)(link)
generics это скорее про type safety, а не про шаблоны
но про костыль и его характеристику ты, безусловно, прав :)
nine_k: A stream of colors expanding from brain (Default)

[personal profile] nine_k 2009-10-09 05:15 pm (UTC)(link)
Ну возьмём C++ с его образцовыми templates.
И что, при подстановки 7 разных типов он не сгенерирует 7 реализаций, отличающихся только типом?

(no subject)

(Anonymous) - 2009-10-09 20:15 (UTC) - Expand

(no subject)

[identity profile] caseq.livejournal.com - 2009-10-09 21:52 (UTC) - Expand

[identity profile] exceeder.livejournal.com 2009-10-09 09:40 pm (UTC)(link)

Копаясь в исходниках SDK, мне вот это понравилось в комментарии (или JavaDoc-е):

Fairness generally decreases throughput but reduces variability and avoids starvation.

Это для BlockingQueue было написано. Но отлично подходит для макроэкономики :) Особенно в условиях кризиса.

[identity profile] avva.livejournal.com 2009-10-09 09:50 pm (UTC)(link)
Забавно :)

[identity profile] alex-inside.livejournal.com 2009-10-10 10:50 am (UTC)(link)
Таки Ви ратуете за динамическую типизацию или за использование в джаве рефлекшена (ну или опознание типа переменной динамически внутри одной функции)?

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

[identity profile] zigmar.livejournal.com 2009-10-11 09:13 pm (UTC)(link)
Нормальные шаблоны или на худой конец препроцессор бы избавили бы от необходимости писать такой кода. Но, увы, религия не позволяет.
Вообще в джаве что-то многовато религии - перегрузка операторов плохо, запретим (но сам попользуемся немного в стрингах, так удобнее), темплейты - плохо, запретим (впрочем, без них грустно, подумали и разрешили на половину), enums - вообще зло (но подумав пару лет добавили, но из религиозных соображений в виде жуткого монстра), и т.д.
Мне кажется, что дизайн языка для реального использования, за стенами университета, должен следовать более прагматичному подходу...