Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Зачем писать на Haskell?




Создатели языка Haskell очень гордятся тем, что в нём используется чистая функциональная парадигма. Они утверждают, что на Haskell

  • проще писать сложные программы, и программы получаются существенно короче;
  • программы имеют ясный, легко читаемый вид; их можно легко понять, даже не зная многих деталей языка Haskell;
  • делается меньше ошибок, так как синтаксис языка Haskell защищает программиста от совершения многих типичных ошибок;
  • короче и проще этап проектирования и разработки программ: программист должен просто понять, что ему нужно, и затем описать это на формальном математическом языке;
  • создаются адаптивные, легко изменяемые и расширяемые программы.

Кроме того, отмечается, что благодаря строгой типизации языка, в программах на Haskell не случается системных ошибок и не бывает аварийных ситуаций (сore dump).

Создатели также утверждают, что программы на Haskell получаются более модульными и встраиваемыми и предоставляют больше возможностей для повторного использования (англ. code reuse). В частности, представленная программа быстрой сортировки на Haskell (в отличие от программы на Си) может сортировать не только целые числа, но и числа типа Float и любые другие объекты, на которых определена операция сравнения.

Язык Haskel имеет высокий уровень абстракции. Грубо говоря, под этим имеется в виду возможность создавать функции, которые возвращают функции. Но более точно сказать, что язык Haskell включает в себя абстрактное лямбда-исчисление (λ-исчисление). Мощь, которую предоставляет это исчисление, ещё не до конца осознана программистами, и не в полной мере используется на практике.

Обратите внимание на то, что в списке достоинств не указаны такие моменты, как эффективность кода, экономичное использование памяти, или скорость работы программ. Это не потому, что этих достоинств нет. Просто сегодня акценты индустрии языков программирования cместились в другую сторону. Уже мало кого интересует скорость работы программ или возможность писать супероптимальный код. Ясно, что на практике возникает необходимость ускорить работу некоторых функций, так как они часто вызываются и/или играют важную роль. Но таких мест в коде не много и им можно уделить отдельное внимание. Например, важные функции, от которых требуется высокая скорость работы, можно реализовать на языке Си, оформить в виде библиотеки и подключить к основному приложению, написанному на удобном для человека языке программирования (языке быстрой разработки), подобному Haskell или Python.

Сегодня важно иметь средства для разработки действительно сложных систем, где важно, чтобы программисты не увязали в собственном коде и были способны понять текст программ, который был написан месяц или год назад. Именно поэтому многие разработчики языков программирования в качестве одного из важных достоинств языка указывают его близость к естественному языку (обычно английскому).[17]

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

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

В языке Си для этого используется функция malloc. Программист ответственен за возвращение этой памяти обратно системе. Когда потребность в выделенной памяти отпадает, он должен послать запрос возвращения (освобождения) памяти. Несбалансированные запросы по выделению и освобождению памяти являются частыми причинами неработоспособности программ. Кроме того, запрос выделения памяти достаточно «дорогой», и программисты на Си часто увлекаются написанием своих собственных менеджеров памяти, которые сначала запрашивают у системы много памяти, а потом начинают распределять внутри себя эту память по необходимости.

Функциональные языки освобождают программиста от этой непростой обязанности. Память выделяется неявно, автоматически, а специальный сборщик мусора (garbage collector) возвращает системе неиспользуемые куски памяти. Оптимальные алгоритмы управления памятью сложны, но сегодня уже достаточно хорошо проработаны. Использование этих алгоритмов не сильно увеличивают время работы программы в целом (в сравнении с тем, когда программист сам, по-умному, занимается выделением и освобождением памяти).[3]

Когда Си лучше?

Конечно, не всё «цветочки да бабочки». У функциональных языков есть свои недостатки. Считается, что программы, написанные на функциональных языках программирования, работают существенно медленнее, нежели на императивных. Поэтому суть пользы и вреда лени в данном случае сформулируем так: «Программы пишутся быстрее, но работают они медленнее». Это прекрасный компромисс, поскольку человеко-часы часто существенно дороже часов работы компьютера!

Представленная искусная реализация функции быстрой сортировки на Си, придуманная Хоаром, безусловно, выигрывает по эффективности у реализации на Haskell (как по времени работы, так и по необходимой для вычислений памяти). Но код на Haskell существенно проще! Следует отметить, что обе реализации имеют сложность O (n log ⁡ n) {\displaystyle O(n\log n)}, то есть время работы на списке (массиве) длины n {\displaystyle n} растёт пропорционально n log ⁡ n {\displaystyle n\log n}, и в этом «асимптотическом смысле» обе реализации одинаково хороши.

Кроме того, активно развиваются алгоритмы трансляции функциональных языков, и по эффективности ассемблерного кода они постепенно начинают догонять императивные языки. А самое важное (но сложное для понимания) достоинство Haskell заключается в том,что в трансляторы языка Haskell со временем можно будет добавить алгоритмы, которые по данным определениям функций смогут сами находить наиболее эффективные алгоритмы их вычисления, например, с использованием динамического программирования или жадных стратегий. Сегодня теория алгоритмов уже настолько развита, что можно выделить ряд шаблонов алгоритмических задач, и «научить» трансляторы функциональных языков программирования «видеть их» в определениях функций и применять известные эффективные алгоритмы вычисления.

Конечно, язык Си предпочтительнее в целом ряде случаев: системное программирование, драйверы устройств, приложения, от которых требуется высокая производительность, например, компьютерные игры с качественной графикой и другие. Но всё это довольно специальные случаи. Большинство компьютерных приложений не требует высокой скорости работы. Часто оптимизация требуется лишь для небольшого числа функций, а остальная логика может быть запрограммирована на удобном для человека языке программирования, пусть не совсем эффективном с точки зрения скорости работы и использования памяти.[17]

 

Заключение.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных