2016-05-24 8 views
2

на стр 57 книги «Программирование Erlang» Джо Армстронг (2007) «списки: отображение/2» упоминается следующим образом:Является ли «стандартным модулем» частью «языка программирования»?

Практически все модули, которые я пишу функции используют как списки : map/2 - настолько распространено, что я почти рассматриваю карту , чтобы быть частью языка Эрланга. Вызывающие функции, такие как , как карта и фильтр, и раздел в списках модулей чрезвычайно общий.

Использование слова «почти» привело меня в замешательство относительно того, какая разница между Erlang в целом и языком Erlang может быть, и если даже есть разница вообще. Является ли моя путаница основанной на семантике слова «язык»? Мне кажется, что стандартный модуль плавает вокруг границ того, что делает и не принадлежит к фактическому языку, на котором он реализован. В чем различия между языком программирования в его ядре и стандартными библиотеками, реализованными в них?

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

+2

Всегда существует разница между * языком * (что определяет синтаксис, специальные ключевые слова и т. Д.) И * стандартную библиотеку * (функции, которые обычно доступны по умолчанию). В зависимости от языка эти две вещи могут быть более или менее переплетены. Обычно вы можете отделить эти два; вы могли бы использовать Erlang, язык, без модуля 'lists'. – deceze

+0

Спасибо за быстрый ответ и разъяснение. Должен ли я удалить этот вопрос, чтобы сохранить StackOverflow немного чище? Я не могу представить, что это будет очень полезно для других. – Sonder

+2

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

ответ

1

Рассмотрим эту простую программу:

1> List = [1, 2, 3, 4, 5]. 
[1,2,3,4,5] 
2> Fun = fun(X) -> X*2 end. 
#Fun<erl_eval.6.50752066> 

3> lists:map(Fun, List). 
[2,4,6,8,10] 

4> [Fun(X) || X <- List]. 
[2,4,6,8,10] 

Оба производят тот же результат, однако первый один list:map/2 является функцией библиотеки, а второй из них является конструкция языка в его ядре, называется list comprehension. Первый из них - implemented in Erlang (случайно также используя понимание списка), второй - parsed by Erlang. Функция библиотеки может быть оптимизирована только в той мере, в которой компилятор может оптимизировать ее реализацию в Erlang. Тем не менее, понимание списка может быть оптимизировано до написания на ассемблере в Beam VM и вызвано из приведенного файла beam для максимальной производительности.

Некоторые языковые конструкции выглядят так, как будто они являются частью языка, тогда как на самом деле они реализованы в библиотеке, например spawn/3. Когда он используется в коде, он выглядит как ключевое слово, но в Erlang это не один из reserved words. Из-за этого компилятор Erlang автоматически добавит перед ним модуль erlang и вызовет erlang:spawn/3, который является библиотечной функцией. Эти функции называются BIFs (встроенные функции).

В общем, то, что принадлежит самому языку, это то, что компилятор этого языка может анализировать и переводить на исполняемый код (или, другими словами, то, что определено language's grammar). Все остальное - библиотека. Библиотеки обычно записываются на языке, для которого они предназначены, но это необязательно должно быть, например. некоторые из функций библиотеки Erlang записываются с использованием C как Erlang NIF s.

+0

Последнее подразделение несколько смутило меня: я понимаю, что wat принадлежит самому языку, может быть проанализирован и переведен (_directly_) в исполняемый код. Чтобы преобразовать части библиотеки в исполняемый код, компилятор должен был выполнить выборку в библиотеке, представленной «ключевым словом lib», а затем преобразовать ее в исполняемый код? Или эти части библиотеки уже скомпилированы? – Sonder

+0

'erlang: spawn/1' не является BIF. См. «Erlang: is_builtin (erlang, spawn, 1).», Хотя он автоматически импортируется из модуля erlang. –

+2

@Sonder, эти части уже скомпилированы. Последний подраздел - это просто неточное высказывание о том, что то, что принадлежит языку, это его грамматика: https://en.wikipedia.org/wiki/Formal_grammar Все остальное - это библиотека. Исходный файл ввода символизируется lexer https://en.wikipedia.org/wiki/Lexical_analysis, а затем синтаксический анализатор принимает маркеры для создания дерева синтаксического анализа, которое затем переводится в исполняемый файл. См. Неофициальные грамматические произведения для Erlang: https://github.com/antlr/grammars-v4/blob/master/erlang/Erlang.g4. Это то, что принадлежит языку. – Amiramix

Смежные вопросы