Языки программирования, 14 лекция (от 19 октября)
Материал из ESyr's Wiki pages.
ЯП 19.10.06
Выделили три семантики, пять способов передачи параметров (по значению, по рез-ту, , ссылке, по имени). По имени похоже на макроподстановку. Где увозникает при передаче по имени: пусть i – глобальная переменная. Представим, что i меняется во времени выполненния программы.
Procedure Swap(i, a[i]) – меняется i, и работает не так.
Самый больщой недостаток: как это реализовано.
Thunk – небольшие вспомогательные программы. При передаче параметров она считала фактический параметров. И свой набор thunkов генерируется для каждого отдельного вызова, при каждому обращении к формальному параметру, который передаётся. Это неэффективно и по памяти, и по времени.
7-10 раз медленнее Алгол был потому, что там была передача по имени.
//Виртоидные языки программирования.
В виртоидных языках были зафикс способы передачи параметров, и была потеряна семантика. В Си++ семантика потеряна не была. Там есть передача по ссылке и по константной ссылке. Константные объекты можно передавать по кностантной ссылке.
В Аде 83 была принята попытка разобраться семантика. Решать эффективно-неэффективно доложен решать компилятор, а не программист, ибо он лучше знает. Была фиксирована семантика, а компилятор выбирает тип передачи сам. Это не прошло. В Аде 95 семантика оставлена, но были зафикс способы передачи параметрами. Так как проблема с in-out параметрами.
Procedure PP(X, Y : in out T) is
X:=e; return Err;
y:=e1;
На одном компиляторе может работать нормально, на другом – ошибка. Нельзя говорить о переносимости.
In-out параметры – параметры, изменение которых влечёт за сосбой побочный эффект.
По определению процедура есть сплошной побочный эффект.
Побочный эффект в функциям может приводить к трудно
В 60х годах, когда зверствовал радикализм, то гото нельзя использовать, то стричься нельзя.
В 1972 году была статья, почему плохи глобальные переменные.
В совр языках типа си шарп и джавыы глобальных переменных вообще нет.
При необъектном стиле программирования без глобальных переменных не обойтись.Тогда возникает вопрос, допускать или не допускать побочный элемент у функции. В итоге в Аде сначала была введена такая классификация:
Функции
Процедуры\
Процедуры, возвращ значение
В окончательном варианте решили отказались от такой классиф., ибо в побочный эффект может распространяться на глобальные переменные, и это очень сложная задача. Поэтому было принято половинчатое решение.
В Джава, Си шарп семантика inout забыта. Объекты протых типов передаются по значению, оюъекты классов по ссылке. Проблема в том, что если мы хотим менять значения параметров простых типов. Решением является паковка-рааспаковка.
В Си шарп есть ключевые слова ref и out
void P(out T x) { x = 0;}
P(out a);
В си шарп семантика сохранилась.
П3. Переменный список аргументов.
Хочется, чотбы можно было писать
write(x);
write(x, y);
Связанный с этим вопрос – параметры по умолчанию. P(,,x,y), пропушенные параметры получают значения по умолчанию. Подобные вещи мало кому нужны и специфичны, и от них лучше отказываться. Во всех виртовских яп поодбного нет.ю В джаве нет. В некоторых случаях хочется иметь по крайней мере возможнотсь переменный список параметров. Это полезно при консольном вводе-выводе.
При отказе упрощается контроль параметров, но уменьшается гибкость.
В Аде переменный список запрещён, но есть клбючевые параметры и параметры по умолчанию.
Три языка, в которых они разрешены: Си, Си плюс плюс, Си шарп
В первом варианте Си (КР Си) не было переменных списков параметров.
В первых вариантах си тип по умолчанию – инт.
В какой-то старой программе была отладочная печать реализована в виде void printf(int a, b, c, d, e, f, g, h).
В файле stdargs.h определены макросы va_list, va_start, va_next, va_end. Это очень ненадёжный способ.
В плюсах появились cin cout.
В Си шарп если перед параметром стои params, он является массивом, и указывается последним в спписке параметров.
В Си шарп есть динамическая идентиф типа. Это позволяет окончательно решить
Функции первого порядка(из Википедии): язык их поддерживает, если их можно формировать, их можно загружаьт как часть структуры, можно присваивать и можно вызывать.
Функциоальные функции имеют функции первого порядка
Микрософт умеет держать хвост по ветру.
Глава 5. Определние новых типов.
Именно этим и отличаются ЯП друг от друга.
Почти все позволяют определять, вопрос в мощности и защищённости.