Да, мусор должен обрабатываться детерминистическим образом в системах реального времени.
Один из подходов заключается в планировании определенного количества времени для сборки мусора во время каждого выделения памяти. Это называется «сборка мусора на основе работы». Идея заключается в том, что при отсутствии утечек распределение и сбор должны быть пропорциональными.
Другой простой подход («сборка мусора на основе времени») заключается в планировании определенной доли времени для периодической сборки мусора, независимо от того, нужна она или нет.
В любом случае возможно, что программе не хватит используемой памяти, поскольку ей не разрешается тратить достаточно времени на полную сборку мусора. Это отличается от системы не в реальном времени, которой разрешено приостанавливать столько времени, сколько необходимо для сбора мусора.
За исключением использования пространственно-зависимых языков (например, Python, как вы сказали), я не понимаю, почему любая разумная интерпретация будет соответствовать самому внешнему блоку if
.
Некоторые языки запрещают эту потенциальную двусмысленность посредством:
elsif
, elif
или elseif
. Если бы какой-либо язык сделал это (кроме языков, ориентированных на отступы), он должен был бы попасть в один из списков «какой язык худший».
Вот почему Я почти всегда использую фигурные скобки для условных выражений и в 100% случаев, когда есть вложенные условные выражения или циклы. Несколько дополнительных символов стоит исключить возможность путаницы.
В Python вы не можете быть двусмысленным. Либо у вас есть
if (x > 0):
if (y > 0):
print "hello"
else:
print "world"
, либо
if (x > 0)
if (y > 0)
print "hello"
else:
print "world"
. Отступ показывает, какое «if» соответствует «else». [Примечание: как бы я ни старался, я не могу заставить «else» в первом примере правильно выстроиться под первым «если».]
На всех языках, которые я видел, которые допускают эту конкретную двусмысленность, «else» соответствует самому последнему «если». Возможно, это не относится ко всем когда-либо существовавшим языкам. Обычно при написании парсера проще всего сопоставить «else» с ближайшим «if» в стеке.
Аналогичный вопрос: каков результат 5 - 2 + 1? Это 4 или 2? Лично я всегда использую круглые скобки, когда пишу (x - y) + z или x - (y + z), потому что я никогда не могу вспомнить, в каком направлении пойдет синтаксический анализатор.
В Perl фигурные скобки не являются обязательными, что помогает нам избежать таких проблем:
if ($x > 0) {
if ($y > 0) {
print "hello"
}
else {
print "world"
}
}
по сравнению с
if ($x > 0) {
if ($y > 0) {
print "hello"
}
}
else {
print "world"
}
IIRC, большинство руководств стиля C требуют / рекомендуют фигурные скобки для циклов и условных выражений.
C # делает «правильные» вещи. Интеллектуальный отступ Visual Studio также автоматически помещает его в нужное место:
if (x > 0)
if (y > 0)
Console.WriteLine("hello");
else
Console.WriteLine("world");
Мы надеемся, что это должен быть чисто теоретический вопрос, так как привычка добавлять фигурные элементы повсюду должна быть глубоко укоренилась в большинстве производных C, иначе вы откроете возможность неприятные сюрпризы.
Принцип работы C # заключается в том, что он сопоставляет операторы else в порядке используемых операторов else.
то есть
if (x == 1)
if (y == 1)
Console.WriteLine("Hello");
else
Console.WriteLine("World");
else
Console.WriteLine("All your base are belong to us.");
, однако, если вы хотите изменить положение else.
if (x == 1)
{
if (y == 1)
Console.WriteLine("Hello World");
}
else
Console.WriteLine("All your base are belong to us.");
Большинство языков будут соответствовать else
с самым внутренним if
, и это действительно единственное разумное решение для компилятора, не чувствительного к пробелам. . Многие IDE, как упоминает Джефф, форматируют код в соответствии со структурой, но на самом деле использование фигурных скобок вокруг всех блоков кода - очень разумный способ справиться с этим.
Если он не соответствует самому последнему if, либо все становится бессмысленным, либо вы не можете сопоставить другие if. Это (единственная реальная альтернатива, которую я могу себе представить) не имело бы смысла:
if(first)
if(second)
if(third)
doFirst();
else
doSecond();
else
doThird();
что слишком уж чертовски.