лекция 10 (Языки программирования (лекции) (2008))
Описание файла
Файл "лекция 10" внутри архива находится в папке "Языки программирования (лекции) (2008)". Документ из архива "Языки программирования (лекции) (2008)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "лекция 10"
Текст из документа "лекция 10"
Языки программирования.
Лекция 10.
26.10.04
Строки
Строка - некоторая последовательность символов. Строки в силу своей специфики нельзя сводить только к массивам символов.
В STL введены шаблоны(хранятся в динамической памяти)
-Vector
-String
Массив значений по сути Vector, но не является специализацией стандартного контейнера
Vector.
Строку от обычного вектора отличает:
-изменчивость.
Самая частая операция со строками - операция конкатенации. Так же часто производится поиск, присваивание, обрезание начала строки. Поэтому реализация строк как массивов оказывается неэффективна.
Строки настолько часто употребляются, что создатели многих языков вынесли их в базис языка.
В Java и в Cи# строки встроены в сам язык:
5 + str- либо преобразование строки в число, либо преобразование целого в строку (конкатенация).
Любой тип- производный от базисного типа Object (ТObject - в Дельфи ), который имеет встроенный метод ToString для перевода в строковый тип, что облегчает перевод в строку. Если компилятор чувствует необходимость в переводе в строку, он вызывает ToString, который можно переопределить.
Для типов данных классов метод ToString возвращает тип этого объекта.
В C++ они вынесены в стандартную библиотеку STL. Преобразования зависят не от компилятора, а от программиста (возможность перекрытия стандартных знаков и т.д.).
Подобные преобразования строкового типа данных интегрированы в Java, потому что реализовать их средствами языка нельзя.
Пример:
ASP, PHP, JSP, ASP.NET - технологии динамической генерации веб-страниц.
Скрипты, написанные на ASP и переписанные на ASP.NET стали работать хуже. В частности, из-за неэффективной работы со строками.
В C# и Java есть специальный класс, оптимизированный под построение строки, - StringBuilder. И есть специальная операция Format, позволяющая эффективно её форматировать.
Глава 3 "Процедурные абстракции"
Абстракции - подпрограммы. К ним относятся - процедуры и функции.
Подпрограмма- есть последовательность однотипных вычислений. Мы можем дать это последовательности имя и вызывать её из программы.
Основное назначение функции - вычисление одного значения. return E - оператор явного возврата.
Целью процедуры является побочный эффект - изменение параметров среды.
Главный оператор - оператор присваивания. И этот оператор имеет побочный эффект - он меняет значение левого операнда.
С этой точки зрения такие языки называют императивными или процедурными.
С современной точки зрения процедура - чёрный ящик, имеющий один вход и один выход. Не важно, какая структура этого ящика. Не важно, с какой точки процедуры выход( при использовании: выход один).
С современной точки зрения (1967 год - Э. Дейкстра) оператор goto - вреден. Структурное программирование - программирование в терминах структур (структура - вещь с одним входом и одним выходом - циклы, условные операторы и т.д.).
Процедуры в современных ЯП - это также структура с одним входом и одним выходом.
Подпрограммы.
Альтернативная вещь – сопрограммы (были популярны в несовременных языках).
1) Подпрограмма
Подпрограмма всегда подчинённая. Главная программа в какой-то точке вызывает подпрограмму. Р начинается с первого оператора, а передает управление, куда скажет главная.
главная программа: подпрограмма :
c all p Р
…
c all p
2). Сопрограмма(сп)
Для сопрограммы понятие главной программы отсутствует.
Есть сопрограмма 1 и сопрограмма 2.
СП 2 вызывает СП1 с первого оператора, потом возврат в СП2. После выполнения нескольких операторов в СП2 управление снова передаётся в СП1, но начиная со следующего оператора за последним выполненным.
Р 1 Р2
.
. .
Вместо оператора вызова используется оператор возобновления - resume
Походит на взаимодействие параллельных потоков.
Есть в Модула-2.
Почему в современных ЯП не используется понятие СП?
1. В некоторых случаях нужна именно подчинённость.
Внешне СП похожи на параллельные процессы, в каждое время может выполняться только одна СП. Вместо СП в современных яп мы используем реальное понятие потока (вместо низкоуровнего понятия)- на базе JVM или на родном понятии потоков, понятие потоков встроено в любую из современных ОС, но программы становятся менее переносимыми, С#- на базе потоков .NET.
Параметризации подпрограмм.
Рассмотрим вопрос параметризации процедур. У каждой процедуры мы указываем набор параметров.
Формальные параметры – переменные языка, но особого рода.
Фактические параметры - выражения или переменные (частные случаи выражения).
Фактические параметры <=> (связывание) формальные параметры.
Связывание всегда динамическое, т.к. процедура имеет смысл, как динамические абстракции.
Понятие абстракции:
-
определение
-
вызов- конкретизация соответствующей абстракции(происходит связывание фактических и формальных параметров).
Есть 3 семантики (эффекта, а не способа) связывания:
1. Входные параметры (параметры, от которых требуется только значение); мы используем только значение фактических параметров, они не меняются.
2. Выходные параметры –параметры не обязаны иметь начальное значение, но могут быть изменены.
3. Изменяемые параметры - требуется и исходное значение и возможность его изменения.
В Аде:
1-in
2-out
3-inout
procedure P (X: in T; Y: out Z; w: inout TT)
Входным параметром может быть произвольное выражение.
Для выходных - это только переменная, которая занимает фиксированное место в памяти.
Для изменяемых параметров - переменная, которая может не занимать фиксированное место в памяти, но она обязана иметь своё значение.
В большинстве ЯП вместо указания семантики передачи параметра указывается способ (механизм) передачи параметра.
Способы передачи параметров:
1. По значению
2. По результатам
3. По значению/результатам
4. По ссылке/адресу
5. По имени.
1-й, 2-й, 3-й способ:
Любой формальный параметр (ФП) есть некоторая локальная переменная. Место для локальных переменных отводится в стеке. Там же отводится место и для ФП.
1-й способ - значение фактического параметра копируется перед call в ФП. Все изменения ФП связаны с изменением локальной переменной не сказываются на фактическом пар-ре. Фактический параметр- любое выражение, которое вычислится при копировании в переменную. Главное- совпадение типов.
2-й способ - перед возвратом значение ФП копируется в фактический параметр.
3-й способ - перед CALL копируем фактический параметр, а перед return копируем всё обратно.
Эти способы передачи параметров один в один соответствуют 3 семантикам связывания.
Во всех современных ЯП используется только 1-й вариант из этих 3-х.
2 и 3 включают в себя копирование при больших размерах параметра- накладно. 1 используется в основном для простых типов данных.
Ещё в современных ЯП используется 4-й тип - по ссылке.
4-й способ-Передача по ссылке - фактически, это передача адреса по значению(в Си вызывается операция взятия адреса) изменение фактического параметра этот способ может реализовать все 3 семантики: in, out, inout.
Если мы хотим передавать параметр по ссылке (т.к. он велик, и мы не хотим его копировать), но не хотим, чтобы его меняли, то для этого, например, в Си++ введён механизм константных ссылок.(Нет в Паскале, Модула-2, Оберон)( Си++ отличается от Си введением ссылочного тд):
const T& a;// T- как правило, структурный тд
const int& a;// обычно не используется
способ- по ссылке, семантика- входная cсоответствующую ссылку мы не можем менять можем передавать не только адрес, но и ссылку на константные объекты(формально адреса в Си++ не имеет).
LHS - то, что может находиться в левой стороне оператора присваивания.
1). В Аде-83 компилятор выбирает сам способ передачи параметров, программист указывает только семантику.
2). С- только по значению.
3). С++-1,4 способы.(входной параметр либо по значению, либо константной ссылкой, выходной параметр - по ссылке)
4). Паскаль, Модула-2, Оберон- 1,4 способы(семантику указать не можем)
5). Java - есть простые типы данных и референциалные.
Все простые типы данных - по значению, а референциальные (ссылки) - по ссылке
(в общем все по значению, в том числе и ссылка)
void f (int a){}// по значению
class X {...}
void f (X a)// ссылка
Передача по ссылке объекта простого типа.
Любому тд соответствует встроенный в базис языка тип, например:
int -> Integer
Java.lang - специальный пакет, содержащий все объявления классов стандартной библиотеки, интегрированных с языком. По умолчанию имена из этого пакета импортируются в файл. (string, Object, все классы-обертки и т.д.) Если класс-обертка появляется в качестве ФМ функции, то соответствующим фактическим параметром может быть выражение соответствующего типа:
void f (Integer a)
то, используя упаковку-распаковку:
int x;
f(x) ~ f (new Integer (x))
new Integer (x)- новый объект передача по ссылке любые изменения со ссылкой отражаются на х и при выходе происходит выделение объекта х.
В C# аналогично с Java, но мы должны перед именем параметра указать ref:
void f(ref int a);// а по ссылке Int32 + boxing и unboxing
f(ref x)- для структур ref необходим
класс Х:
void f(ref X a)- ссылку передаем по ссылке(можем менять как ссылку, так и объект), ref относится к ссылочным тд
В языке Java мы должны создать класс
Ref X {X a;}- здесь мы ссылку менять уже можем и передаем по ссылке., сами моделируем.
В языке С# выходной параметр по ссылке(отражение семантики):
ref out int a; от а не требуется входное значение.
void f(ref int a); - 3-й тип параметров (изменяемые параметры)
От объекта а требуется статус определенности, его можно изменять!
X a = null; - нормально проинициализировали значение.
X a; - несуществующее значение - при попытке передачи параметра по ссылке будет ошибка.
Т.о. входной параметр – по значению, выходной параметр по ссылке с модификатором out и ref необходимо указывать и при вызове соответствующей функции. Изменяемый параметр- передаем по ссылке требуется начальное значение.
6). В языке Дельфи есть передача параметров по значению и по ссылке( комбинация Паскаля и объектно-ссылочного языка). Значениями объектов являются ссылки, поэтому все комбинации соответствующих средств у нас обеспечены.
Во всех современных ЯП специально специфицируется способ передачи параметров и способ указать семантику средств.
7). В Ада 83 специфицируется только семантика, а компилятор сам определяет способ передачи.
Передача простого значения (например 1 адресуемая ячейка, которая часто используется) по ссылке (2 разыменования указателя ) менее эффективна, чем по значению(2 копирования в конце и начале)
Ада 95:
In простые типы- по значению, непростые - по ссылке.
Inout- все параметры по ссылке
Out- все параметры по ссылке
Из-за требований переносимости: