Речь идет не столько о модели акторов, сколько о том, насколько сложно правильно написать что-то, аналогичное OTP на C ++. Кроме того, разные операционные системы предоставляют радикально разную отладку и системные инструменты, а виртуальная машина Erlang и несколько языковых конструкций поддерживают единый способ определения того, чем занимаются все эти процессы, что было бы очень сложно сделать единообразным способом (или, возможно, вообще) на нескольких платформах. (Важно помнить, что Erlang / OTP возник раньше, чем нынешний ажиотаж вокруг термина «модель акторов», поэтому в некоторых случаях такого рода дискуссии сравнивают яблоки и птеродактили; великие идеи склонны к самостоятельному изобретению.)
Все это означает, что, хотя вы, безусловно, можете написать набор программ «модель акторов» на другом языке (я знаю, я делал это долгое время на Python, C и Guile, не осознавая этого, прежде чем я столкнулся с Erlang, включая форму мониторов и ссылок, и еще до того, как я услышал термин «модель акторов»), понять, как на самом деле порождаются процессы вашего кода и что происходит среди них, чрезвычайно сложно. Erlang применяет правила, по которым ОС просто не может без капитального ремонта ядра - капитального ремонта ядра, который, вероятно, в целом не принесет пользы. Эти правила проявляются как как общие ограничения для программиста (которые всегда можно обойти, если вам действительно нужно), так и как базовые обещания, которые система гарантирует программисту (которые могут быть намеренно нарушены, если вам это действительно нужно).
Например, он требует, чтобы два процесса не могли совместно использовать состояние, чтобы защитить вас от побочных эффектов. Это не означает, что каждая функция должна быть "чистой" в том смысле, что все является ссылочно прозрачным (очевидно, нет, хотя сделать столько вашей программы ссылочно прозрачным, насколько это возможно, это четкая цель дизайна большинства Erlang projects), а скорее то, что два процесса не создают постоянно состояния гонки, связанные с общим состоянием или конфликтом. (Кстати, это больше означает, что «побочные эффекты» означают в контексте Erlang; знание этого может помочь вам расшифровать некоторые из дискуссий, в которых возникает вопрос, является ли Erlang «действительно функциональным или нет» по сравнению с Haskell или игрушечными «чистыми» языками. .)
С другой стороны, среда выполнения Erlang гарантирует доставку сообщений. Этого очень не хватает в среде, где вы должны общаться исключительно через неуправляемые порты, каналы, разделяемую память и общие файлы, которыми ядро ОС управляет только (и управление этими ресурсами ядром ОС обязательно крайне минимально по сравнению с тем, что используется в Erlang). время выполнения предоставляет). Это не означает, что Erlang гарантирует RPC (в любом случае передача сообщений - это не RPC и не вызов метода!), Он не обещает, что ваше сообщение адресовано правильно, и это не так. обещайте, что процесс, которому вы пытаетесь отправить сообщение, существует или жив. Он просто гарантирует доставку, если вещь, которую вы отправляете, действительна в этот момент.
Это обещание основано на том, что мониторы и ссылки являются точными. И на основе этого среда выполнения Erlang заставляет всю концепцию «сетевого кластера» улетучиваться, как только вы понимаете, что происходит с системой (и как использовать erl_connect ...). Это позволяет вам уже перескочить через ряд сложных случаев параллелизма, что дает большую фору при кодировании для успешного случая вместо того, чтобы увязнуть в болоте защитных методов, необходимых для открытого параллельного программирования.
Так что на самом деле дело не в необходимости языка, как Erlang, а в уже существующей среде выполнения и OTP, выраженных довольно чисто, и чрезвычайно сложно реализовать что-либо близкое к нему на другом языке. OTP - это просто акт, которому сложно следовать. Точно так же нам не совсем нужен C ++, мы могли бы просто придерживаться сырого двоичного ввода, Brainfuck и считать Assembler нашим языком высокого уровня. Также нам не нужны поезда или корабли, так как все мы умеем ходить и плавать.
При этом байт-код виртуальной машины хорошо документирован, и появилось несколько альтернативных языков, которые компилируются с ней или работают со средой выполнения Erlang. Если мы разделим вопрос на языковую / синтаксическую часть («Должен ли я понимать лунные руны для параллелизма?») И платформенную часть («Является ли OTP наиболее зрелым способом обеспечения параллелизма, и поможет ли он мне решить самые сложные вопросы? , наиболее распространенные ошибки, которые можно найти в параллельной распределенной среде? "), то ответ будет (" нет "," да ").
person
zxq9
schedule
02.09.2014