#dart
#dart
Вопрос:
int tracingFibonacci(int n) {
final int resu< // Error
if (n < 2) {
result = n; // Error
} else {
result = tracingFibonacci(n - 2) tracingFibonacci(n - 1); // Error
}
print(result);
return resu<
}
Это было бы ошибкой, поскольку результирующая переменная является окончательной, но не имеет инициализатора. С интеллектуальным анализом потока в режиме null safety эта программа работает нормально. Анализ может показать, что результат определенно инициализируется ровно один раз на каждом пути потока управления, поэтому ограничения для обозначения переменной final выполнены.
Я получаю ошибку во время компиляции, но в документах говорится о чем-то другом. Итак, что такое «Интеллектуальный анализ потока», как мне включить такую функцию?
Комментарии:
1. Также проблема с виртуальной машиной Dart версии 2.10.0-7.0.dev (работает в режиме NNBD). Я думаю, вам следует создать отчет об ошибке по этому поводу. Причиной может быть то, что эта функция еще не реализована… но я не могу найти никаких следов в багтрекере об этой функции.
2. Обнаружил следующее в системе отслеживания проблем: github.com/dart-lang/sdk/issues/38237 , github.com/dart-lang/language/issues/946 , github.com/dart-lang/language/pull/1091 . Я все еще пытаюсь прочитать все это.
3. Хорошо, я думаю, вывод заключается в том, что эта часть функции NNBD еще не включена в SDK, поскольку она все еще обсуждается в language issue tracker. Итак, я предполагаю, что статья «Понимание безопасности null» была написана на основе того, как правильно будут реализованы функции NNBD, а не на основе текущего состояния основной ветви SDK.
4. @julemand101 Большое вам спасибо за то, что прошли через все это, честно говоря, я не люблю читать теории 🙂 Итак, мне удалить этот вопрос сейчас или вы напишете его в качестве ответа?
5. Ну, я не уверен на 100% в ответе, поэтому не собираюсь его публиковать. Вы можете либо удалить это, либо надеяться, что кто-нибудь из команды Dart опубликует официальный ответ.
Ответ №1:
Итак, что такое «Интеллектуальный анализ потока»?
Эти ссылки объясняют нечто подобное. Реализация Dart может быть основана на нем. Я привожу некоторую полезную информацию в этом посте, чтобы избавить кого-то от перехода по ссылкам.
Анализ потока данных — это метод сбора информации о возможном наборе значений, вычисляемых в различных точках компьютерной программы. График потока управления программой (CFG) используется для определения тех частей программы, на которые может распространяться конкретное значение, присвоенное переменной. Собранная информация часто используется компиляторами при оптимизации программы. Канонический пример анализа потока данных — получение определений.
Анализ потока данных — это тип статического анализа. Цель статического анализа — проанализировать поведение программы во время компиляции, прежде чем запускать программу. Цель динамического анализа, напротив, заключается в том, чтобы рассуждать о поведении программы во время выполнения. Анализ потока данных обычно выполняется с использованием графика потока управления (CFG), графического представления программы.
Рассмотрим, например, следующий Java-код:
public String badCode(int x) { String y = null; if (x > 0) { y = "more"; } else if (x < 0) { y = "less"; } return y.toUpperCase(); }
Мы можем представить это следующим CFG:
Используя этот CFG, мы можем рассуждать глобально (от начала до завершения CFG) о поведении программы, рассуждая локально (с помощью одного оператора или последовательности операторов без ответвлений) о фактах. Например, мы можем захотеть узнать, существуют ли какие-либо возможные исключения с нулевым указателем в нашей программе. Мы можем сделать это, рассуждая локально об определениях в нашем CFG. Мы знаем, что в точке программы 1 переменной присваивается значение null, и мы также знаем, что это значение перезаписывается в точках 3 и 5. Используя эту информацию, мы можем определить, может ли определение в точке 1 достичь точки программы 6, где оно используется. Если это возможно, у нас есть возможное исключение с нулевым указателем.