Существуют ли какие-либо компиляторы / интерпретаторы, которые оптимизируют операции, которые не выполняются на месте?

Я часто наблюдаю подобные ошибки, когда оцениваю работы (и иногда делаю их сам):

% 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 и некоторые другие компиляторы, может быть похоже на то, что вы имеете в виду.

  • Скалярная замена агрегатов также в том же духе.

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