Почему Clojure динамически набирается? - PullRequest
50 голосов
/ 24 февраля 2011

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

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

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

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

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

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

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

Ответы [ 6 ]

21 голосов
/ 25 февраля 2011

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

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

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

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

14 голосов
/ 25 февраля 2011

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

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

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

11 голосов
/ 25 февраля 2011

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

7 голосов
/ 25 февраля 2011

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

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

?

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

5 голосов
/ 25 февраля 2011

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

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

0 голосов
/ 09 июня 2019

Несколько причин:

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

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

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

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

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

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

...