Языки программирования, 14 лекция (от 19 октября)
Материал из eSyr's wiki.
(Содержимое страницы заменено на «== From Ebaums Inc to MurkLoar. == We at EbaumsWorld consider you as disgrace of human race. Your faggotry level exceeded any imaginab...») |
(Отмена правки № 1407 участника 128.197.11.30 (обсуждение)) |
||
Строка 1: | Строка 1: | ||
- | == | + | <P STYLE="margin-bottom: 0cm">ЯП 19.10.06</P> |
- | + | <P STYLE="margin-bottom: 0cm"><BR> | |
- | + | </P> | |
- | + | <P STYLE="margin-bottom: 0cm">Выделили три семантики, пять способов | |
+ | передачи параметров (по значению, по рез-ту, , ссылке, по имени). По | ||
+ | имени похоже на макроподстановку. Где увозникает при передаче по | ||
+ | имени: пусть i – глобальная переменная. Представим, что i | ||
+ | меняется во времени выполненния программы.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Procedure Swap(i, a[i]) – | ||
+ | меняется i, и работает не так.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Самый больщой недостаток: как это | ||
+ | реализовано. | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Thunk – небольшие вспомогательные | ||
+ | программы. При передаче параметров она считала фактический | ||
+ | параметров. И свой набор thunkов генерируется для каждого отдельного | ||
+ | вызова, при каждому обращении к формальному параметру, который | ||
+ | передаётся. Это неэффективно и по памяти, и по времени.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">7-10 раз медленнее Алгол был потому, | ||
+ | что там была передача по имени.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">//Виртоидные языки программирования.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В виртоидных языках были зафикс способы | ||
+ | передачи параметров, и была потеряна семантика. В Си++ семантика | ||
+ | потеряна не была. Там есть передача по ссылке и по константной | ||
+ | ссылке. Константные объекты можно передавать по кностантной ссылке.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В Аде 83 была принята попытка | ||
+ | разобраться семантика. Решать эффективно-неэффективно доложен решать | ||
+ | компилятор, а не программист, ибо он лучше знает. Была фиксирована | ||
+ | семантика, а компилятор выбирает тип передачи сам. Это не прошло. В | ||
+ | Аде 95 семантика оставлена, но были зафикс способы передачи | ||
+ | параметрами. Так как проблема с in-out параметрами.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Procedure PP(X, Y : in out T) is</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">X:=e; return Err;</P> | ||
+ | <P STYLE="margin-bottom: 0cm">y:=e1;</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">На одном компиляторе может работать | ||
+ | нормально, на другом – ошибка. Нельзя говорить о переносимости.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">In-out параметры – параметры, | ||
+ | изменение которых влечёт за сосбой побочный эффект.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">По определению процедура есть сплошной | ||
+ | побочный эффект.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Побочный эффект в функциям может | ||
+ | приводить к трудно | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В 60х годах, когда зверствовал | ||
+ | радикализм, то гото нельзя использовать, то стричься нельзя.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В 1972 году была статья, почему плохи | ||
+ | глобальные переменные.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В совр языках типа си шарп и джавыы | ||
+ | глобальных переменных вообще нет.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">При необъектном стиле программирования | ||
+ | без глобальных переменных не обойтись.Тогда возникает вопрос, | ||
+ | допускать или не допускать побочный элемент у функции. В итоге в Аде | ||
+ | сначала была введена такая классификация:</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <OL> | ||
+ | <LI><P STYLE="margin-bottom: 0cm">Функции</P> | ||
+ | <LI><P STYLE="margin-bottom: 0cm">Процедуры\</P> | ||
+ | <LI><P STYLE="margin-bottom: 0cm">Процедуры, возвращ значение</P> | ||
+ | </OL> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В окончательном варианте решили | ||
+ | отказались от такой классиф., ибо в побочный эффект может | ||
+ | распространяться на глобальные переменные, и это очень сложная | ||
+ | задача. Поэтому было принято половинчатое решение.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В Джава, Си шарп семантика inout | ||
+ | забыта. Объекты протых типов передаются по значению, оюъекты классов | ||
+ | по ссылке. Проблема в том, что если мы хотим менять значения | ||
+ | параметров простых типов. Решением является паковка-рааспаковка. | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В Си шарп есть ключевые слова ref и out</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">void P(out T x) { x = 0;}</P> | ||
+ | <P STYLE="margin-bottom: 0cm">P(out a);</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В си шарп семантика сохранилась.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">П3. Переменный список аргументов.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Хочется, чотбы можно было писать</P> | ||
+ | <P STYLE="margin-bottom: 0cm">write(x);</P> | ||
+ | <P STYLE="margin-bottom: 0cm">write(x, y);</P> | ||
+ | <P STYLE="margin-bottom: 0cm">Связанный с этим вопрос – | ||
+ | параметры по умолчанию. P(,,x,y), пропушенные параметры получают | ||
+ | значения по умолчанию. Подобные вещи мало кому нужны и специфичны, и | ||
+ | от них лучше отказываться. Во всех виртовских яп поодбного нет.ю В | ||
+ | джаве нет. В некоторых случаях хочется иметь по крайней мере | ||
+ | возможнотсь переменный список параметров. Это полезно при консольном | ||
+ | вводе-выводе. | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">При отказе упрощается контроль | ||
+ | параметров, но уменьшается гибкость.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В Аде переменный список запрещён, но | ||
+ | есть клбючевые параметры и параметры по умолчанию.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Три языка, в которых они разрешены: Си, | ||
+ | Си плюс плюс, Си шарп</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В первом варианте Си (КР Си) не было | ||
+ | переменных списков параметров.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В первых вариантах си тип по умолчанию | ||
+ | – инт.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В какой-то старой программе была | ||
+ | отладочная печать реализована в виде void printf(int a, b, c, d, e, | ||
+ | f, g, h).</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В файле stdargs.h определены макросы | ||
+ | va_list, va_start, va_next, va_end. Это очень ненадёжный способ.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В плюсах появились cin cout.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В Си шарп если перед параметром стои | ||
+ | params, он является массивом, и указывается последним в спписке | ||
+ | параметров.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">В Си шарп есть динамическая идентиф | ||
+ | типа. Это позволяет окончательно решить</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Функции первого порядка(из Википедии): | ||
+ | язык их поддерживает, если их можно формировать, их можно загружаьт | ||
+ | как часть структуры, можно присваивать и можно вызывать.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Функциоальные функции имеют функции | ||
+ | первого порядка</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Микрософт умеет держать хвост по ветру.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Глава 5. Определние новых типов.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm">Именно этим и отличаются ЯП друг от | ||
+ | друга.</P> | ||
+ | <P STYLE="margin-bottom: 0cm">Почти все позволяют определять, вопрос | ||
+ | в мощности и защищённости.</P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> | ||
+ | <P STYLE="margin-bottom: 0cm"><BR> | ||
+ | </P> |
Версия 17:19, 3 февраля 2008
ЯП 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. Определние новых типов.
Именно этим и отличаются ЯП друг от друга.
Почти все позволяют определять, вопрос в мощности и защищённости.