Size: a a a

2018 August 08

OS

Oleg Shelajev in graalvm_ru
truffle как бы вроде технически мог бы
источник

ПФ

Паша Финкельштейн in graalvm_ru
но почему? Это же очевижным образом делается для простых случаев! (см. котлин)
источник

OC

Oleg Chirukhin ☄️ 🧙🏻‍♂️🚀 in graalvm_ru
в трюфеле вроде есть механизм, который позволяет кастомно обработать хвостовую рекурсию, если ты (как создатель конкретного DSL) знаешь - как
источник

OS

Oleg Shelajev in graalvm_ru
да, там через эксепшны сделано
источник

ПФ

Паша Финкельштейн in graalvm_ru
Oleg Shelajev
да, там через эксепшны сделано
как эксепшны?
источник

ПФ

Паша Финкельштейн in graalvm_ru
там вроде дополнительная переменная и вечный цикл
источник

OC

Oleg Chirukhin ☄️ 🧙🏻‍♂️🚀 in graalvm_ru
причем там очень хитрые экзепшены, если трюфель при сборке видит, что они не нужны, он их заменяет на условные переходы
источник

OC

Oleg Chirukhin ☄️ 🧙🏻‍♂️🚀 in graalvm_ru
емнип в simple language так сделан оператор return. Кажется что он с оверхедом, потому что экзепшен, а на самом деле нет
источник

OS

Oleg Shelajev in graalvm_ru
короче скоро уже же в джаве будут, через год например
источник

OS

Oleg Shelajev in graalvm_ru
источник

ПФ

Паша Финкельштейн in graalvm_ru
tailrec fun findFixPoint(x: Double = 1.0): Double
       = if (x == Math.cos(x)) x else findFixPoint(Math.cos(x))
источник

ПФ

Паша Финкельштейн in graalvm_ru
Compiled from "test.kt"
public final class TestKt {
 public static final double findFixPoint(double);
   descriptor: (D)D
   Code:
      0: dload_0
      1: dload_0
      2: invokestatic  #11                 // Method java/lang/Math.cos:(D)D
      5: dcmpg
      6: ifne          13
      9: dload_0
     10: goto          21
     13: dload_0
     14: invokestatic  #11                 // Method java/lang/Math.cos:(D)D
     17: dstore_0
     18: goto          0
     21: dreturn

 public static double findFixPoint$default(double, int, java.lang.Object);
   descriptor: (DILjava/lang/Object;)D
   Code:
      0: iload_2
      1: iconst_1
      2: iand
      3: ifeq          8
      6: dconst_1
      7: dstore_0
      8: dload_0
      9: invokestatic  #17                 // Method findFixPoint:(D)D
     12: dreturn
}
источник

ПФ

Паша Финкельштейн in graalvm_ru
казалось бы — что может быть проще?
источник

ПФ

Паша Финкельштейн in graalvm_ru
Я тут думал судокусолвер написать и посмотреть ускорит ли его граль )
источник

OC

Oleg Chirukhin ☄️ 🧙🏻‍♂️🚀 in graalvm_ru
Идея в том, что на уровне Трюфеля мы можем понять, стоит ли нода AST в позиции tail call. Если да, то мы кидаем экзепшен, что обрывает стандартное исполнение и обрабатываем специальным образом. (Если нет, то обрабатываем как обычно)
источник

ПФ

Паша Финкельштейн in graalvm_ru
Oleg Chirukhin ☄️ 🧙🏻‍♂️🚀
Идея в том, что на уровне Трюфеля мы можем понять, стоит ли нода AST в позиции tail call. Если да, то мы кидаем экзепшен, что обрывает стандартное исполнение и обрабатываем специальным образом. (Если нет, то обрабатываем как обычно)
но это должно быть адово плохо по перфомансу, нет?
источник

ПФ

Паша Финкельштейн in graalvm_ru
или оно ток один раз кидается?
источник

ПФ

Паша Финкельштейн in graalvm_ru
проблема котлина в том, что факториал уже не оптимизируется
источник

OC

Oleg Chirukhin ☄️ 🧙🏻‍♂️🚀 in graalvm_ru
при записи оно выглядит как будто бы это адовейший перфоманс хит
источник

OC

Oleg Chirukhin ☄️ 🧙🏻‍♂️🚀 in graalvm_ru
в реальности трюфель использует какие-то хитрые метаоптимизации, и в простых случаях элиминирует экзепшены, заменяя обычными вызовами функций, условными переходами и циклами
источник