Ресурсы по прогнозированию типов переменных для Javascript?

Цитата из этой академической статьи: Синтаксическое и семантическое прогнозирование в динамических языках:

IntelliSense практически основан на знании типа переменных. Следовательно, символы, описывающие переменные, должны содержать свой тип, если он известен и может быть разрешен. Кроме того, в динамических языках одна переменная может нести экземпляр другого типа в разных частях кода и в разных исполнениях программы. Также переменная может быть инициирована динамически, и ее тип может быть известен только во время выполнения. Поэтому символ должен содержать некоторый список возможных типов, разрешенных в рамках семантического анализа. Но в целом это не может быть решено определенно в динамических языках; даже выполнение одной программы не поможет.

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

1 ответ

Решение

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

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

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

Меня всегда беспокоит концепция, что "анализаторы не могут быть (как) хороши (как люди)". Если у анализатора есть доступ к той же информации, что и у человека, она должна быть как минимум такой же хорошей, а часто и лучшей; он может отслеживать взаимодействия так, как люди не могут. Что еще более важно, если статический анализатор не имеет доступа к ключевым предположениям, лежащим в основе вашего кода, как вы можете ожидать, что другие программисты будут работать над этим кодом? Какова причина проири, которая настаивает на том, что они знают все предпосылки / предположения, используемые в каком-то блоке кода?

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

Другие вопросы по тегам