Я тут понял удивительную вещь. Одно из тех открытий, когда вдруг понимаешь, что всю жизнь говорил прозой. Ну когда обнаруживаешь, что ты какую-то вещь считал естественной, считал что вообще все вокруг так думают, а оказывается, ровно наоборот: так не думает почти никто
(
Read more... )
"Декларативная предметная область" это значитъ, что уже есть принятый и понятный людямъ языкъ, на которомъ люди объясняютъ другъ другу спецификацiи задачъ въ этой области, и этотъ языкъ однозначно и адекватно задаетъ и формулировку задачи, и ея рѣшенiе.
Два примѣра "декларативной предметной области":
1. Традицiонная запись ариѳметическихъ выраженiй. Мы пишемъ (x + y) / 2 + 1 и намъ сразу понятно, что и какъ будетъ вычислено. Когда придумали языкъ Фортранъ, гдѣ такiя выраженiя автоматически правильно компилируются, продуктивность программистовъ на порядокъ выросла. Не надо писать тесты, провѣряющiе, что мы правильно распредѣлили память или что второй знакъ "плюсъ" вычисляется послѣ дѣленiя. Мы написали выраженiе, какъ мы его понимаемъ, и все "само работаетъ". Языкъ спецификацiи (инфиксныя выраженiя съ числами и функцiями) является однозначнымъ способомъ записать и формулировку, и рѣшенiе задачи.
2. Языкъ SQL. Мы пишемъ select NAME,SALARY,DEPARTMENT from EMPLOYEES,SALARIES where EMPLOYEE.ID = SALARIES.EMPLOYEE_ID order by NAME limit 10 и база данныхъ все сама правильно дѣлаетъ. И человѣку тоже сразу понятно, что и какъ будетъ вычислено. Когда изобрѣли реляцiонныя базы данныхъ, продуктивность программистовъ на порядокъ выросла.
Примѣры design patterns ФП -
1. Фильтрованный траверсальный функторъ-монада (filterable traversable monadic functor). Это структура данныхъ, выглядящая какъ массивъ, для котораго опредѣлены операцiи map, filter, reduce, flatMap. Методъ программированiя въ стилѣ map/filter/reduce позволилъ на порядокъ повысить производительность программистовъ. Теоретическiя свойства этой структуры описываются на языкѣ теорiи категорiй, доказываются необходимые законы, и послѣ этого программистъ можетъ быть увѣренъ, что программа, которая правильно выглядитъ ("сначала мы фильтруемъ то-то, потомъ дѣлаемъ map въ то-то и т.д."), будетъ всегда правильно работать.
2. Свободно порожденная аппликативная монада (free monad/free applicative). https://www.youtube.com/watch?v=Qg48XucSvlg Это комбинацiя свободно порожденной монады и свободно порожденнаго моноидальнаго функтора. (Эти слова мало помогаютъ понять, почему эта конструкцiя полезна, но главное, что есть четкая математическая теорiя съ доказательствомъ, что написанный кодъ реализуетъ структуру данныхъ правильно и всѣ необходимые законы выполняются.) Данная конструкцiя интересна тѣмъ, что ее изобрѣли сначала на бумагѣ, выведя правильный конструкторъ типа, и лишь потомъ написали кодъ реализацiи. Такой порядокъ дѣйствiй - сначала мы что-то на бумажкѣ вычисляемъ, и лишь потомъ начинаемъ конструировать рѣшенiе задачи - характеренъ для инженерной дисциплины. До появленiя ФП, это было невозможно - программы дѣлались чисто интуитивно, и лишь потомъ иногда доказывалась ихъ корректность.
Reply
Метод решения задачи выбирается компилятором. И в случае арифметических выражений мы точно знаем ключи компилятора, которые приведут к разным алгоритмам на современных x86 системах - это включение/выключение sse, avx и fp87.
Есть разные оптимизации, трансформирующие выражения 2*x в x << 1 или x + x при компиляции. Результат вычислений будет похожим на то, что подразумевалось. Но это, собственно, всё, что гарантируется.
Reply
Leave a comment