Подтвердить что ты не робот

Почему Clojure динамически типизирован?

Мне очень нравится читать о разных языках программирования. В настоящее время я изучаю Scala, но это не значит, что меня не интересуют Groovy, Clojure, Python и многие другие. Все эти языки имеют уникальный внешний вид и некоторые характерные особенности. В случае с Clojure я не понимаю одно из этих дизайнерских решений. Насколько я знаю, Clojure уделяет большое внимание своей функциональной парадигме и в значительной степени заставляет вас использовать неизменяемые "переменные", где это возможно. Итак, если половина ваших значений неизменна, почему язык динамически типизирован?

Сайт Clojure сообщает:

Прежде всего, Clojure является динамичным. Это означает, что программа Clojure - это не просто то, что вы компилируете и запускаете, а то, с чем вы можете взаимодействовать.

Ну, это звучит совершенно странно. Если программа скомпилирована, вы больше не сможете ее изменить. Конечно, вы можете "взаимодействовать" с ним, для чего используются пользовательские интерфейсы, но веб-сайт определенно не означает аккуратный "динамический" графический интерфейс.

Как Clojure выигрывает от динамического набора текста

Я имею в виду частный случай Clojure, а не общие преимущества динамической типизации.

Как динамическая система типов помогает улучшить функциональное программирование

Опять же, я знаю удовольствие от того, чтобы не проливать "int a" по всему исходному коду, но вывод типа может облегчить большую часть боли. Поэтому я просто хотел бы знать, как динамическая типизация поддерживает концепции функционального языка.

4b9b3361

Ответ 1

Я согласен, что чисто функциональный язык может по-прежнему иметь интерактивный цикл read-eval-print-loop и будет иметь более легкое время с типом вывода. Я предполагаю, что Clojure хотел привлечь программистов lisp, будучи "lisp для jvm", и решил быть динамичным, как другие lisps. Другим фактором является то, что системы типов должны быть спроектированы как самый первый шаг языка, и быстрее для разработчиков языка просто пропустить этот шаг.

Ответ 2

Если программа скомпилирована, вы больше не можете ее изменять.

Это неправильно. В системах на основе изображений, таких как Lisp (Clojure, можно рассматривать как диалект Lisp) и Smalltalk, вы можете изменить скомпилированную среду. Разработка на таком языке обычно означает работу с работающей системой, добавление и изменение определений функций, определение макросов, параметров и т.д. (Добавление средств компиляции и загрузки в изображение).

У этого есть много преимуществ. Во-первых, все инструменты могут напрямую взаимодействовать с программой и не нужно угадывать поведение системы. У вас также нет длинных пауз для компиляции, потому что каждый скомпилированный блок очень мал (очень редко перекомпилировать все). NASA JPL однажды исправил запущенную систему Lisp на зонде в сотнях тысяч километров в пространстве.

Для такой системы очень естественно иметь информацию о типе, доступную во время выполнения (это то, что означает динамическое типирование). Разумеется, ничто не мешает вам также выполнять проверки типа и проверки типов во время компиляции. Эти понятия ортогональны. Современные реализации Lisp обычно могут выполнять оба.

Ответ 3

Ну в первую очередь Clojure является Lisp, и Lisps традиционно всегда были динамически напечатаны.

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

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

Ответ 4

Clojure - это Lisp со своей макросистемой и философией кода как данных, и эта философия вряд ли уживается со статической системой типов. Например, какой будет тип такого списка:

(defn square [x] (* x x))

?

Тем не менее, если вам нужна статическая типизация, Clojure разрешит это с подсказками типов.

Ответ 5

Потому что это то, что нужно миру/рынку. Нет смысла строить то, что уже построено.

Я слышал, что у JVM уже есть статически типизированный язык;)

Ответ 6

Некоторые причины:

Динамически типизированные языки более гибкие и с ними быстрее работать.

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

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

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

Сильные типы языков - это своего рода преждевременная оптимизация, и это серьезный недостаток.

Кроме того, вы можете добавить "типы" в clojure, когда общая структура будет завершена с использованием спецификации. В идеале язык должен позволять постепенно вставлять типы в код, и вы можете сделать это с помощью спецификации.