Почему Clojure/Lisp Программы быстрее, чем другие динамические языки?

На основе языковых перестрелок за последние несколько лет Clojure и другие Lisps последовательно работают лучше, чем большинство других динамических языков. Почему это так? Это из-за его homoiconicity?

Edit:

Я не знал, что Clojure скомпилирован в байт-код, как Java и Scala. qaru.site/info/163445/... пролил свет на то, почему Clojure использует преимущество компиляции и интерпретации.

Ответы

Ответ 1

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

Итак, как всегда, вы должны осторожно относиться ко всем микрочипам.

Сказав это, следующие причины могут дать Clojure преимущество, однако, при определенных обстоятельствах:

  • Clojure всегда скомпилирован - сначала до байт-кода, а затем до собственного кода JVM JIT-компилятором. Это может принести ему преимущество в скорости во многих случаях, особенно над языками, которые полагаются на некоторую форму интерпретации. Теоретически, по крайней мере, вы должны иметь возможность сопоставлять чистую скорость Java в любых обстоятельствах, когда Clojure позволяет вам создавать один и тот же байт-код (который достаточно часто, хотя и не всегда....)
  • Clojure может использовать примитивы JVM и статическую типизацию. Несмотря на динамический язык, Clojure будет компилировать статические типы или примитивный код, если вы дадите ему достаточно намеков. Это может легко дать 10-кратное повышение производительности, хотя за счет того, что ваш код немного длиннее/уродливее.
  • Clojure сильно оптимизировал определенные структуры данных и операции - в частности, неизменные постоянные структуры данных и некоторые конструкторы функционального программирования, такие как "уменьшить".
  • Макросы обеспечивают мощную оптимизацию времени компиляции. Если вы используете макросы с умом, вы можете сделать некоторые довольно сложные оптимизации во время компиляции, эффективно используя генерацию кода для создания кода, который будет наиболее эффективным при во время выполнения. Это преимущество многих разделов Lisps (особенно Common Lisp, что было одним из больших впечатлений от Clojure). Как указывает nulvinge, гомоциконность не является абсолютно необходимой для достижения этого (у С++ также есть макросы!), Но, будучи гомомиксовым языком, макросы намного проще.
  • Современные JVM блестяще спроектированы - Clojure использует тысячи человеко-лет инженерных решений, которые вошли в JVM, библиотеки времени выполнения Java, алгоритмы сбора мусора и т.д. Non -JVM-языки не получают этих преимуществ.