Существуют ли какие-либо компиляторы / интерпретаторы, которые оптимизируют операции, которые не выполняются на месте?
Я часто наблюдаю подобные ошибки, когда оцениваю работы (и иногда делаю их сам):
% any vectorized language, such as MATLAB/Octave/R that supports logical indexing
Y = rand(1,10); % random numbers drawn uniformly from the interval [0,1] in a 1x10 vector
Y(Y<=0.6) = 1;
Y(Y>0.6) = 0; % These two lines try to convert the distribution from uniform to Bernoulli
Этот код приводит к вектору нулей, а не к желаемому случайному двоичному вектору, распределение которого аппроксимирует случайную величину Бернулли.
Проблема, с точки зрения программирования, заключается в модификации на месте; кодер пропускает умственный шаг. (Существуют другие способы решения этой проблемы, основанные на математике, которую должен выполнить код, или путем переключения условных выражений и т. Д., Но все они зависят от приложения.) Модульный тест выявит ошибку, но я не смог убедить ни одного студента попробовать их (это конкретно не урок программирования). Код, который сначала выделяет выходной вектор и заполняет его на основе входного вектора, предотвратит это:
X = rand(1,10); % random numbers in a 1x10 vector
Y = zeros(size(X));
Y(X<=0.6) = 1;
Y(X>0.6) = 0;
Тем не менее, это гарантированно займет вдвое больше места, хотя я бы сказал, что оно лучше подходит для ментальной модели ошибочного кодера, и в целом его легче понять, чем действительно сложный алгоритм, который не тратит впустую места вообще (см. CLRS иллюстрация быстрой сортировки).
Существуют ли какие-либо компиляторы / интерпретаторы, которые оптимизируют код, такой как второй фрагмент, для уменьшения необходимого пространства по сравнению с операцией на месте?
1 ответ
Да это так. В области, которую вы обсуждаете, есть несколько различных оптимизаций:
Многие компиляторы C++ будут выполнять копирование, чтобы избежать создания нового временного объекта, только чтобы немедленно скопировать его поверх существующего.
Распределение ресурсов, которое делает LuaJIT и некоторые другие компиляторы, может быть похоже на то, что вы имеете в виду.
Скалярная замена агрегатов также в том же духе.