Size: a a a

Compiler Development

2020 May 05

А

Алексей in Compiler Development
Михаил Бахтерев
Машинный код - это данные. В нём вообще ничего нет бнз интерпретатора.
А как вы без функций собираетесь монады строить?
источник

AT

Alexander Tchitchigi... in Compiler Development
Алексей
Как устроены? Генераторы могут возвращать значение во вне, принимать значение извне, запускать другие генераторы в том же контексте (в том же итераторе). Что ещё надо?
Попробуйте написать call/cc на генераторах. 🤷‍♀
источник

А

Алексей in Compiler Development
Не, конечно можно взять компилятор хаскеля и там монады спокойно делать, только это другой уровень абстракции уже и после компиляции они исчезнут.
источник

А

Алексей in Compiler Development
Alexander Tchitchigin
Попробуйте написать call/cc на генераторах. 🤷‍♀
Хорошая задачка, займусь ей.
источник

МБ

Михаил Бахтерев... in Compiler Development
Алексей
А как вы без функций собираетесь монады строить?
Не очень понимаю, зачем строить монады без функций. И не очень понимаю, какие есть проблемы с тем, чтобы описывать семантику процессора  функциями. Более того, скорее всего, если Вы начнёте  это делать строго, без махания руками, функции и монады у Вас возникнут сами собой.  Вам просто не хочется. Но это же не проблема инструментов
источник

А

Алексей in Compiler Development
Михаил Бахтерев
Не очень понимаю, зачем строить монады без функций. И не очень понимаю, какие есть проблемы с тем, чтобы описывать семантику процессора  функциями. Более того, скорее всего, если Вы начнёте  это делать строго, без махания руками, функции и монады у Вас возникнут сами собой.  Вам просто не хочется. Но это же не проблема инструментов
Вы можете описать семантику процессора хоть через ООП. Да толку то от этого?
источник

МБ

Михаил Бахтерев... in Compiler Development
Алексей
Вы можете описать семантику процессора хоть через ООП. Да толку то от этого?
Не могу. Потому что ООП снова сведётся к функциям. А толк в том, чтобы анализировать удобство и мощность (выразительную) вычислительных машин. GPU, например, именно так и разрабатывали, через функциональную семантику
источник

А

Алексей in Compiler Development
Михаил Бахтерев
Не очень понимаю, зачем строить монады без функций. И не очень понимаю, какие есть проблемы с тем, чтобы описывать семантику процессора  функциями. Более того, скорее всего, если Вы начнёте  это делать строго, без махания руками, функции и монады у Вас возникнут сами собой.  Вам просто не хочется. Но это же не проблема инструментов
Вы походу так долго забивали гвозди, что любой инструмент вам начинает казаться молотком. Вот только это не так.
И когда действительно понадобится забивать этим не молотком гвозди, то очень быстро выяснится, что гвозди плохо забиваются. Что нужно делать много дополнительных усилий, тех самых усилий, для избегания которых и был создан молоток.
источник

А

Алексей in Compiler Development
Михаил Бахтерев
Не могу. Потому что ООП снова сведётся к функциям. А толк в том, чтобы анализировать удобство и мощность (выразительную) вычислительных машин. GPU, например, именно так и разрабатывали, через функциональную семантику
ООП плохо сводится к функциям (в терминах ФП).
источник

МБ

Михаил Бахтерев... in Compiler Development
Алексей
ООП плохо сводится к функциям (в терминах ФП).
С чего это? Объекты - это замыкания. Вы можете, конечно, описаывать объекты, рисуя картинки, и размахивая руками, но когда потребуется дать строгую семантику, вам придётся описывать это всё функциями. Других способов люди пока не придумали. Да и не факт, что другие способы вообще существуют.
источник

А

Алексей in Compiler Development
Михаил Бахтерев
С чего это? Объекты - это замыкания. Вы можете, конечно, описаывать объекты, рисуя картинки, и размахивая руками, но когда потребуется дать строгую семантику, вам придётся описывать это всё функциями. Других способов люди пока не придумали. Да и не факт, что другие способы вообще существуют.
class Example {
 public String field = "Hello";

 public void addOne() { field += "1"; }
}

Превратите вот это в замыкание пожалуйста.
источник

p

polunin.ai in Compiler Development
Алексей
class Example {
 public String field = "Hello";

 public void addOne() { field += "1"; }
}

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

AS

Anton Shvab in Compiler Development
Может быть так?
const Example = () => {

   let field = "Hello";
   const addOne = () => {
       field += "1";
       return field;
   };

   return (msg) => {
       if (msg === "field") {
           return field;
       } else if (msg === "addOne") {
           return addOne;
       }
   };  
};


e1 = Example();
e1("field");
e1("addOne")();
e1("addOne")();
e1("field"); // "Hello11"

e2 = Example();
e2("field"); // "Hello"
e2("addOne")();
e2("field"); // "Hello1"
источник

А

Алексей in Compiler Development
Anton Shvab
Может быть так?
const Example = () => {

   let field = "Hello";
   const addOne = () => {
       field += "1";
       return field;
   };

   return (msg) => {
       if (msg === "field") {
           return field;
       } else if (msg === "addOne") {
           return addOne;
       }
   };  
};


e1 = Example();
e1("field");
e1("addOne")();
e1("addOne")();
e1("field"); // "Hello11"

e2 = Example();
e2("field"); // "Hello"
e2("addOne")();
e2("field"); // "Hello1"
Хех
источник

А

Алексей in Compiler Development
Но задача выполнена кстати
источник

M

MaxGraey in Compiler Development
Вообще то любой объект можно превратить в замыкание, а наследование в композицию. Это не новость потому что таким образом по сути эмулировались объекты в CLOS (common lisp object system)
источник

PS

Peter Sovietov in Compiler Development
MaxGraey
Вообще то любой объект можно превратить в замыкание, а наследование в композицию. Это не новость потому что таким образом по сути эмулировались объекты в CLOS (common lisp object system)
И особенно это не новость для тех, кто читал учебники для первокурсников (SICP) :)
источник

PS

Peter Sovietov in Compiler Development
Alexander Tchitchigin
Так и чем — "более лучшим" — предлагается заменить монады? 😉
Итак, вот та самая статья-виновник происходящего беспорядка в чате :)

Effects Without Monads: Non-determinism Back to the Meta Language
http://okmij.org/ftp/tagless-final/nondet/nondet-paper.pdf
источник

PS

Peter Sovietov in Compiler Development
Олега Киселева интересно читать не только потому, что он один из признанных специалистов в области ФП. Он, к тому же, еще и имеет взгляд на вещи, близкий компиляторщику: уклон в практическую область, связанную с эффективным порождением кода на основе DSL.
источник

MM

Mikhail Maltsev in Compiler Development
> а наследование в композицию
А как это будет работать downcast + виртуальные методы? Допустим:
struct Base {
 int x = 0;
 virtual int foo() { x += 1; }
};

struct Derived : Base {
 int foo() { x += 2; }
};

void do_work(Base &x) {
 x.foo();
}

void test() {
 Derived x;
 do_work(x);
}
источник