Эта тема очень сложная. Вы можете поискать алгоритмы синтаксического анализа в Google и получить много подробных материалов.
В основном:
- Чем меньше неясностей необходимо устранить, тем быстрее процесс синтаксического анализа.
- Чем больше токенов нужно рассмотреть, прежде чем принимать решение, тем сложнее оно становится.
Например:
когда анализатор JS видит function
ключевое слово в этом коде: function xyz(a, b) {}
ключевое слово function является неоднозначным. Сначала он должен обработать следующий токен xyz
и увидеть, что это идентификатор, прежде чем он сможет решить, что это объявление функции.
Тем не менее, если следующая лексема были (
мы имеем дело с функцией литерала: function(a, b) {}
. Это требует, чтобы синтаксический анализатор вел себя очень по-разному, поэтому в синтаксическом анализаторе было больше кода, что замедляло его выполнение.
Если бы были разные ключевые слова для этих двух целей, не было бы никакой двусмысленности:
function_decl xyz(a, b, c) {}
а также function_lit(a, b, c) {}
Однако никто не хотел бы писать на таком языке. Но WebAssembly не должен быть написан от руки. Это позволяет адаптировать язык к машинам, а не к людям.