Как делает поддержку Erlang *прозрачный*, распределение агентов влияет на проектирование приложений?

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

Во-первых, прочитайте Почему мы используем массивы вместо других структур данных? , который содержит хороший ответ основных структур данных. Затем подумайте, как их смоделировать в C ++:

struct Node {
    int data;
    Node * next;
};

По сути, это все, что вам нужно для реализации списка! ( очень простой). Тем не менее, он не имеет абстракций, вы должны связать предметы на руку:

Node a={1}, b={20, &a}, c={35, &b} d={42, &c};

Теперь у вас есть связанный список узлов, все они расположены в стеке:

d -> c -> b -> a
42   35   20   1

Следующим шагом является написание класса-оболочки List, который указывает на начальный узел и позволяет при необходимости добавлять узлы, отслеживая заголовок списка (следующее очень упрощено):

class List {
    struct Node {
        int data;
        Node * next;
    };

    Node * head;

public:
    List() {
        head = NULL;
    }

    ~List() {
        while(head != NULL) {
            Node * n = head->next;
            delete head;
            head = n;
        }
    }

    void add(int value) {
        Node * n = new Node;
        n->data = value;
        n->next = head;
        head = n;
    }

    // ...
};

Следующий шаг - сделать List шаблоном, чтобы вы могли добавлять другие значения (не только целые числа).

Если вы знакомы с умными указателями, вы можете заменить необработанные указатели, используемые умными указателями. Часто я нахожу, что люди рекомендуют умные указатели для начинающих. Но, на мой взгляд, вы должны сначала понять, зачем вам нужны умные указатели, а затем использовать их. Но для этого необходимо, чтобы вы сначала поняли сырые указатели. В противном случае вы используете какой-то магический инструмент, не зная, зачем он вам нужен.

12
задан ShreevatsaR 15 June 2009 в 14:01
поделиться

3 ответа

Вы правы, что erlang по своей сути не решает проблемы упорядочивания / причинности или консенсуса. Что erlang делает для вас абстрактным, так это разница между отправкой сообщений на локальные и удаленные узлы.

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

В качестве одного из примеров реализации Erlang VectorClock посмотрите distributerl Erlang OTP Supervisors также может предоставить некоторую необходимую инфраструктуру для достижения консенсуса, но есть некоторые мысли, что консенсус невозможен в распределенных системах с асинхронной передачей сообщений. Дополнительную информацию см. На указанной вики-странице.

3
ответ дан 2 December 2019 в 22:38
поделиться

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

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

3
ответ дан 2 December 2019 в 22:38
поделиться

Эрланг обещает эти вещи ( http://www.sics.se/~joe/thesis/armstrong_thesis_2003.pdf раздел 3.1 (39-40)):

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

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

3
ответ дан 2 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: