Когда скомпилированный код отличается от оцененного оболочки? - PullRequest
8 голосов
/ 28 декабря 2010

В Erlang и OTP в действии (стр. 46), авторы отмечают следующее в примечании:

Может случиться, что в каком-то нечетном угловом случае код, вычисляемый в оболочке, ведет себя немного иначе, чем тот же код, когда компилируется как часть модуля. В таком случае скомпилированная версия является золотым стандартом. Оболочка старается делать то же самое, когда интерпретирует выражения.

Можете ли вы вспомнить один или несколько из этих нечетных угловых случаев ? Каковы небольшие различия в этих случаях?

Ответы [ 2 ]

8 голосов
/ 29 декабря 2010

Самое важное отличие состоит в том, что оболочка интерпретируется, тогда как скомпилированный код ... ну ... скомпилирован.Это имеет заметную разницу в скорости выполнения и использовании памяти функцией.Другими словами, вы можете обнаружить, что интерпретируемый вариант медленнее или использует всю вашу память, а скомпилированная версия - нет.

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

Этот пункт является защитной мерой.По сути, интерпретатор и компилятор должны согласовать весь ввод / вывод функции.Но, к сожалению, это не всегда так.На практике интерпретатор и компилятор являются различными механизмами выполнения и, следовательно, могут отличаться.Если вы нативно компилируете через HiPE, изменения могут быть еще больше.Обычно проблемы возникают вокруг чисел с плавающей точкой IEEE 754.

7 голосов
/ 29 декабря 2010

Интерпретатор erlang, erl_eval, очень старается вести себя точно так же, как скомпилированный код. Если этого не произойдет, скорее всего, это ошибка.

За исключением в одном случае, и это получение сообщений. Скомпилированный код может получить доступ к внутренним инструкциям для доступа и управления очередью сообщений. Переводчик не может этого сделать. Он должен: фактически удалять сообщения из очереди (более или менее с receive X -> X end); проверить их, чтобы увидеть, соответствуют ли они шаблонам приема; сохранить те, которые не соответствуют; и поместите все ненужные в данный момент сообщения в очередь (получив все сообщений и затем отправив их обратно себе). Это означает, что существует короткое время, в течение которого, если сообщение приходит, оно может не оказаться в том же месте в очереди сообщений, что и для скомпилированного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...