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


В совр языках типа си шарп и джавыы глобальных переменных вообще нет.


При необъектном стиле программирования без глобальных переменных не обойтись.Тогда возникает вопрос, допускать или не допускать побочный элемент у функции. В итоге в Аде сначала была введена такая классификация:


  1. Функции

  2. Процедуры\

  3. Процедуры, возвращ значение


В окончательном варианте решили отказались от такой классиф., ибо в побочный эффект может распространяться на глобальные переменные, и это очень сложная задача. Поэтому было принято половинчатое решение.


В Джава, Си шарп семантика 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. Определние новых типов.


Именно этим и отличаются ЯП друг от друга.

Почти все позволяют определять, вопрос в мощности и защищённости.



Личные инструменты