(no subject)
Sep. 13th, 2015 02:21 pmЧитая обсуждение http://ivan-gandhi.livejournal.com/3329246.html и ответы на мой коммент, я вдруг понял почему так тяжело идет. У меня нет никаких проблем барабанить на Erlang'е например, а Purescript, Elm или их идейный отэц Haskell (ну или ML) идет с гораздо большим трудом.
Потому что я пришел в программирование из программирования микропроцессоров. Для меня долгое время компьютер был просто гибкой логической микросхемой, которую можно было запрограммировать на последовательность действий вместо долгого и унылого паяния и протягивания проводов, а потом отладки пробником и паяльником же.
Потом как-то программирование на ассемблере превратилось в программирование на С, но компиляторы для этих микропроцессоров были таковы, что регулярно генерировали последовательности типа
Потому что так у него оптимизатор работает, видите ли. Ну или еще почему. И надо было компилировать в ассемблерный листинг, читать его и руками чистить от этого мусора, потому что иначе в ПЗУ не лезло.
А в универе учили как на Фортране ряды Тейлора вычислять, что тоже не прибавляло.
В результате я всегда когда программирую или читаю программу, симулирую в голове стековую-регистровую машину и "исполняю" на ней программу. И какие-нибудь list comprehensions, лямбды или хвостовые рекурсии отлично на такой голове исполняются. А вот стрелки и монады - почему-то нет.
Нужна книжка или статья "Функциональное программирование для недохардверных недоинженеров". Реквестирую у мироздания.
Потому что я пришел в программирование из программирования микропроцессоров. Для меня долгое время компьютер был просто гибкой логической микросхемой, которую можно было запрограммировать на последовательность действий вместо долгого и унылого паяния и протягивания проводов, а потом отладки пробником и паяльником же.
Потом как-то программирование на ассемблере превратилось в программирование на С, но компиляторы для этих микропроцессоров были таковы, что регулярно генерировали последовательности типа
mov bx, ax
mov dx, ax
mov bx, dx
mov ax, bx
Потому что так у него оптимизатор работает, видите ли. Ну или еще почему. И надо было компилировать в ассемблерный листинг, читать его и руками чистить от этого мусора, потому что иначе в ПЗУ не лезло.
А в универе учили как на Фортране ряды Тейлора вычислять, что тоже не прибавляло.
В результате я всегда когда программирую или читаю программу, симулирую в голове стековую-регистровую машину и "исполняю" на ней программу. И какие-нибудь list comprehensions, лямбды или хвостовые рекурсии отлично на такой голове исполняются. А вот стрелки и монады - почему-то нет.
Нужна книжка или статья "Функциональное программирование для недохардверных недоинженеров". Реквестирую у мироздания.
no subject
Date: 2015-09-14 03:36 pm (UTC)Предположим у вас 4 ядра каждое с HyperThreading, один сложноделимый датасет размером примерно с RAM, и вы хотите в 8 потоков (шоб быстрее было) его как-то обрабатывать, при этом изменяя.
>Она не гарантирована
Вам шашечки или ехать?
>с dll она не работает
С DLL (особенно скомпилированными разными компиляторами) вообще очень много всего не работает, к примеру memory management и C++ exceptions. Вы будете поэтому утверждать, что в C++ нет динамической памяти или исключений?
no subject
Date: 2015-09-14 04:27 pm (UTC)no subject
Date: 2015-09-14 05:03 pm (UTC)no subject
Date: 2015-09-14 05:30 pm (UTC)no subject
Date: 2015-09-14 08:44 pm (UTC)Программисты далеко не всегда обходятся дороже компьютеров. Случаи разные.
Кто-то пишет не особо нагруженную корпоративную систему, которая будет работать на 16-ядерном сервере с 45MB L3 cache, генерируя отчоты. Для такого вполне выгодно пожертвовать производительностью, если это на пользу для программистам. Даже иногда выгодно докупить памяти, или поменять проц с 16 ядерного на 18 ядерный, если альтернатива этому переписывать software.
Кто-то другой программирует для простых вендопользователей, у некоторых из которых обязательно окажется самый популярный в мире современный нетбук с условным Atom Z3740 и 2GB RAM. Пользователям нужно, шоб у них не тормозило, а производительность программистов ваши личные сложности, будет тормозить у вас, пользователи свалят к конкурентам.
Кто-то третий программирует какой-нибудь high-load для облаков для всей аудитории фейсбука, и у него цена виртуального железа линейно зависит от числа работающих виртуалок, и экспоненциально от количества оперативы и ядер процессора в каждой из них.
no subject
Date: 2015-09-14 08:47 pm (UTC)Количество действительно performance-critical кода крайне невелико.
no subject
Date: 2015-09-14 09:13 pm (UTC)У самого фейсбука другая экономика.
Он ни у кого виртуалки не арендует, наоборот он свои железные сервера с нуля дизайнит, и RAM для них он всё равно покупает петабайтами, потому шо кеширование контента.
Когда у вас всё равно есть десятки петабайт RAM, конечно хаскель будет иметь смысл.
>проблема пользователей с тормозящими компьютерами традиционно решается не оптимизацией, а через lock-in.
Какой lock-in?
>Количество действительно performance-critical кода крайне невелико.
Это вам с вашей колокольни так кажется.
Ещё с прошлого года смартфонов/планшетов в интернетах уже больше, чем компов.
Весь мобильный софт performance-critical, потому шо там в среднем не особо быстрые ARM-камни, их охлаждать сложно, и технологии батареек как-то медленно прогрессируют.
no subject
Date: 2015-09-14 09:32 pm (UTC)no subject
Date: 2015-09-14 09:43 pm (UTC)Например из клиентов, для которых я сейчас разрабатываю софт для windows/osx десктопов, один делает в основном плагин для adobe after effects (софт для киношников), второй работает с пачкой чужих форматов word/pdf/odf и всеми остальными, где люди держат тексты (софт для пейсателей и переводчиков).
no subject
Date: 2015-09-14 04:47 pm (UTC)Примерно с RAM он быть не может, потому что может быть больше, может быть меньше.
Во вторых, если мы предполагаем, что он на 10% меньше, то в большинстве случае задача ляжет на сложносочиненный fold, в котором мутабельность может быть и будет, но вся окажется в довольно простом бойлерплейте.
>Вам шашечки или ехать?
В том-то и проблема, что тут нужно гарантированно ехать - иначе на фичу нальзя полагаться, что отражается в подходе к написанию кода, в частности написать разбор входящего файл как рекурсивную функцию уже нельзя.
no subject
Date: 2015-09-14 05:34 pm (UTC)У вас значит такая выборка случаев.
У меня вот другая выборка случаев. В моём большинстве случаев датасет не имеет ничего общего ни с деревьями, ни со списками, а является например большим 2-3 мерным массивом небольших структур.
>в котором мутабельность может быть и будет, но вся окажется в довольно простом бойлерплейте.
Синхронизация доступа потоков к мутабельному датасету тоже в довольно простом бойлерплейте.
>тут нужно гарантированно ехать - иначе на фичу нальзя полагаться
Во-первых, в нашей индустрии 100% гарантии вам никто ни о чём не даёт, это ж не математика с теоремами, прочитайте EULA от чего угодно вообще. Из того, что в спецификации написаны какие-то буковки, ничего особенного не следует. Тестируйте в интересующих условиях, потом полагайтесь, если вам нужно.
Во-вторых, я вам уже приводил пример с C++ исключениями. Почему куча народу, включая афтаров стандартной библиотеки, на них полагается, хотя они тоже не работают с DLL?
P.S. Недавно делал приложение для одного клиента. Сначала запилил алгоритм на C# с иммутабельностью, время работы 5 секунд, много. Потом переписал на C++/ATL, время работы 0.2 секунды, нормально. После JIT, вычисления примерно одинаково быстрые, там не было сложной математики, даже floating point не было, только немного целочисленной арифметики и ветвлений.
Основное отличие с точки зрения производительности — в C++ версии в обоих вложенных горячих циклах не было ни одного выделения памяти, потому шо все временные переменные мутабельные и куски памяти с ними переиспользовались между итерациями, мгновенно попали в кеш процессора, и там остались на время работы алгоритма.
no subject
Date: 2015-09-14 05:38 pm (UTC)no subject
Date: 2015-09-14 08:06 pm (UTC)Короткий ответ — вам просто повезло.
>Это же стандартный ABI
By its nature, exception handling is very platform specific, and not surprisingly, different compilers use very different implementations. Some compilers use what is known as the Zero-Cost Strategy (http://llvm.org/docs/ExceptionHandling.html) where exception records are kept in side tables. DWARF (http://www.dwarfstd.org/) debugging information is then used to unwind the stack when an exception is thrown. The advantage here is that entering try/catch blocks are fast, but executing a throw is very slow. GCC and LLVM implement this strategy.
Microsoft’s compilers on the other hand use Structured Exception Handling (SEH) to implement C++ exceptions by managing a chain of EXCEPTION_REGISTRATION_RECORDs embedded on the stack and then calling the operating system RaiseException() function with “special” arguments. SEH is an operating system feature that Microsoft’s compilers use to implement C++ exception handing.
Given an executable compiled with GCC and a shared library compiled with MSVC, if the shared library were to throw a C++ exception that it did not handle, the different implementations would prevent it from working and the program would likely crash. This would happen even if the GCC compiled executable had the correct C++ exception handling to catch the exception.
Копипаста вот отсюда (https://www.p6r.com/articles/2014/07/20/binary-compatible-c-interfaces/), почитайте — как видно, у C++ вообще практически нет стандартного ABI.
Кстати к исключениям ещё в полной мере относятся разделы той статьи “Object Layout” и “Memory Allocation”.
no subject
Date: 2015-09-14 08:17 pm (UTC)no subject
Date: 2015-09-14 09:36 pm (UTC)А мне норм.
На венде не нужен этот стандарт. Уже многие десятилетия есть прекрасный ABI, который называется COM.
В отличие от того, что теоретически возможно со стандартным C++ ABI, COM позволяет использовать DLL из любого языка, из дот нета, из петона, и если приспичит, то можно даже из PHP. Там и многопоточность, и исключения, и ещё куча всего, и производительности хватает даже для очень performance critical штук (если оно in-process, конечно).
Если бы в красноглазом мире было нечто подобное, я уверен, что им бы тоже не упёрся этот C++ ABI.
А так у них выбора в общем-то не было, кроме как стандартизировать C++ ABI, и программировать на 30-летней давности C++.
no subject
Date: 2015-09-14 09:53 pm (UTC)Это, гм, п-ц а не abi.
>Если бы в красноглазом мире было нечто подобное,
CORBA. Особой популярностью не пользуется.
no subject
Date: 2015-09-14 10:26 pm (UTC)Не умеете его готовить.
>CORBA
Это никакой не ABI.
CORBA это стандарт взаимодействия распределённых систем.
В случае in-process COM, используемого из C++, накладные расходы — единственный виртуальный вызов. Так работают Direct3D, Media Foundation, и другие очень требовательные к производительности штуки.
В случае CORBA вы anyway попадаете на сериализацию\десериализацию, что очевидно ставит крест на производительности.
no subject
Date: 2015-09-16 06:45 am (UTC)Что характерно, никогда не стремился. С п-цом дел стараюсь не иметь.
>Это никакой не ABI.
>CORBA это стандарт взаимодействия распределённых систем.
И то, и другое - стандарт доступа к (возможно, удаленному) менеджеру/хранилищу объектов. Разумеется, ни то, ни другое стандартов ABI не являются.
>В случае in-process COM, используемого из C++, накладные расходы — единственный виртуальный вызов. Так работают Direct3D,
Чё-чё-чё?
С каких это пор DirectX стал работать через виртуальные вызовы?
no subject
Date: 2015-09-16 07:23 am (UTC)Прекрасная проверенная временем технология.
Очень удачная.
Например весь новый WinAPI (который Windows Runtime) целиком построен на COM-интерфейсах.
>И то, и другое - стандарт доступа к (возможно, удаленному) менеджеру/хранилищу объектов.
На самом высоком уровне абстракции да.
Однако COM включает в себя и ABI тоже, который с определёнными оговорками можно использовать отдельно от его более высокоуровневых фич.
>С каких это пор DirectX стал работать через виртуальные вызовы?
DirectX работает через виртуальные вызовы всю свою историю.
Он весь построен на COM интерфейсах, наследующих от IUnknown (ID3D11Device, IXAudio2, etc).
С точки зрения языка C++, COM интерфейс это pure abstract class c таблицей виртуальных методов, которые можно вызывать.
no subject
Date: 2015-09-16 08:54 am (UTC)Ничего хорошего в этом нет, в общем-то. ООП головного мозга теперь совсем зохавает мир.
>DirectX работает через виртуальные вызовы всю свою историю.
Мда. Я-то помню времена, когда это был чисто сишный АПИ, без всякого COM на поверхности. А тут вы рассказываете про ком.
Все-таки не зря винду считают гнилой платформой того же уровня, что и кофемолки.
no subject
Date: 2015-09-16 11:01 am (UTC)Ничего лучше человечество не придумало.
Интерфейс всех современных ОС задизайнен в ООП стиле, даже если он на чистом C с хэндлами, как в Win32 или линупсе.
>Я-то помню времена, когда это был чисто сишный АПИ, без всякого COM на поверхности
У вас значит с памятью что-то. Вот например статья эпохи DirectX 5, из текста которой видно, что COM на поверхности был ещё в DirectX 3:
https://www.microsoft.com/msj/0298/primitive.aspx
no subject
Date: 2015-09-16 11:49 am (UTC)Эээ, ненене. ООП там нет. Объекты - есть, ООП точно нет. И слава богу.
>У вас значит с памятью что-то.
*внимательно поглядел матчасть* Действительно. Ну, от майкрософта ничего хорошего ждать и не следовало...
no subject
Date: 2015-09-16 12:30 pm (UTC)Взаимоисключающие параграфы детектед.
>от майкрософта ничего хорошего ждать и не следовало
Тем не менее «ничего хороший» Direct3D почему-то выиграл в конкурентной борьбе у OpenGL:
http://programmers.stackexchange.com/a/88055/25371
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2015-09-14 08:13 pm (UTC)фолд и тензорные операции?
>Синхронизация доступа потоков к мутабельному датасету тоже в довольно простом бойлерплейте.
Ииии? Баги и сложный код будет скорее всего не в этом месте.
>Во-первых, в нашей индустрии 100% гарантии вам никто ни о чём не даёт,
Языковой стандарт с тестами соответствия дают.
>Почему куча народу, включая афтаров стандартной библиотеки, на них полагается, хотя они тоже не работают с DLL
Потому что дураки. Механизм исключений вообще надо предать анафеме.
>Сначала запилил алгоритм на C# с иммутабельностью,
Этот язык не умеет толком иммутабельность. F# по слухам умеет, но уверенности нет.
no subject
Date: 2015-09-14 10:38 pm (UTC)Не тензорные, просто сильно зависящие от соседних данных.
>Потому что дураки. Механизм исключений вообще надо предать анафеме.
Я с этим согласен, и я к этой куче народа не отношусь.
Это ж не отменяет того факта, что в языке С++ есть исключения, несмотря на то, что лично мне они не нравятся, и шо они не совместимы между компиляторами.
>язык не умеет толком иммутабельность
Readonly fields есть, шо вам ещё от языка нужно?