Теория и практика языков программирования

Теория и практика языков программирования

СПб.: 2013. — 6 88 с.

Учебник посвящен систематическому изложению теории и практики языков программирования. Он отражает классическое содержание учебной дисциплины по языкам программирования. Все сложные вопросы поясняются законченными примерами. Кроме того, здесь предлагается полный комплекс задач и упражнений по узловым вопросам. В российских стандартах третьего поколения (компьютерного направления) учебник охватывает базисные разделы следующих дисциплин: теория формальных языков, теория автоматов и формальных языков, языки программирования, программирование, объектно-ориентированное программирование, логическое и функциональное программирование, теория вычислительных процессов.
Учебник предназначен для студентов инженерного, бакалаврского и магистерского уровней компьютерных специальностей, может быть полезен преподавателям и исследователям/разработчикам трансляторов и другого программного обеспечения.
Рекомендовано Санкт-Петербургским институтом информатики и автоматизации Российской академии наук (СПИИРАН) в качестве учебника по направлению «Информатика и вычислительная техника».

ОГЛАВЛЕНИЕ
Введение 15
Благодарности 21
Глава 1. Определение и проблемы языков программирования 22
Для чего нужно изучать принципы построения языков программирования 22
Аппарат абстракции-конкретизации 23
Исходное определение языка программирования 24
Практическое определение языка программирования 25
Технологическое определение языка программирования 26
Области применения языков программирования 27
Научные вычисления 27
Обработка деловой информации 28
Искусственный интеллект 28
Системная область 29
Веб-обработка 29
Критерии эффективности языков программирования 30
Читабельность 31
Легкость создания программ 33
Надежность 34
Стоимость 35
Способы построения критериев эффективности 37
Нормализация частных показателей 39
Учет приоритета частных показателей 39
Заключительные замечания 40
Контрольные вопросы и упражнения 40
Глава 2. Виртуальные машины и трансляция языков 42
Аппаратная организация компьютеров 42
Принцип программного управления 43
Структура виртуальной машины 44
Порядок функционирования виртуальной машины 45
Понятие виртуальной машины 46
Трансляторы и интерпретация 47
Иерархия виртуальных машин 51
Этапы трансляции 52
Анализ исходной программы 54
Синтез объектной программы 58
Контрольные вопросы 60
Глава 3. Виды языков программирования 62
Парадигмы программирования 62
Императивные языки программирования 63
Язык Fortran 64
ЯзыкС 65
Функциональные языки программирования 67
Язык LISP 69
Логические языки программирования 70
Язык Prolog 72
Объектно-ориентированные языки программирования 73
Язык Smalltalk 74
Язык разметки HTML 75
Скриптовые языки 78
Общие характеристики скриптовых языков 80
Язык Perl 82
Язык JavaScript 84
ЯзыкРНР 85
Язык Python 86
ЯзыкЯиЬу 87
fl3biKLua 88
Гибридные языки разметки/программирования 91
flsbiKXSLT 92
ЯзыЫЭР 96
Контрольные вопросы и упражнения 97
Глава 4. Выражения и присваивания в языках программирования 98
Нотации выражений 98
Префиксная нотация выражения 99
Постфиксная нотация выражения 101
Инфиксная нотация выражения 102
Смешанная нотация 103
Сравнение нотаций для записи выражений 103
Присваивание 103
Порядок вычисления операндов в выражении 105
Контрольные вопросы и упражнения 107
Глава 5. Действия и операторы в программах 109
Базовые операторы 109
Операторы перехода 112
Потокуправления 113
Составные операторы 115
Условные операторы 116
Вложенность условных операторов 117
Операторы выбора 121
Организация повторения операторов 125
Операторы цикла с заданным числом повторений 126
Оператор for языка Python 128
Циклы с заданным числом повторений в функциональных языках 129
Операторы цикла без заданного числа повторений 129
Бесконечные циклы и механизмы управления ими 129
Циклы с предусловием 132
Циклы с постусловием 133
Универсальность оператора for в языках С, C++, С# и Java 134
Охраняемые структуры управления Дейкстры 136
Инварианты 138
Программирование с инвариантами 139
Контрольные вопросы и упражнения 141
Глава 6. Средства представления синтаксиса языков программирования 144
Особенности определения языка программирования 144
Качество синтаксиса языка 146
Легкость чтения 146
Легкость написания 147
Легкость трансляции 147
Отсутствие неоднозначности 148
Синтаксические элементы языка 148
Набор символов 148
Идентификаторы 151
Константы и литералы 152
Символы операций 154
Ключевые и зарезервированные слова 155
Необязательные слова 156
Комментарии 156
Пробелы 156
Разделители и скобки 156
Выражения 157
Операторы 157
Лексемы и лексический синтаксис 157
Абстрактный синтаксис и абстрактные синтаксические деревья 158
Грамматики в языках программирования 161
Контекстно-свободная грамматика 161
Форма Бэкуса—Haypa(BNF) 162
Деревья разбора 163
Синтаксическая неоднозначность 165
Неоднозначность повисшего Else 165
Выводы — линейная форма грамматического разбора 166
Списки в инфиксных выражениях 167
Переход к конкретному синтаксису 168
Обработка ассоциативности и приоритетности 171
Расширенная BNF 173
Синтаксические схемы 175
Точки с запятой и пустые операторы 177
Контрольные вопросы и упражнения 178
Глава 7. Формальная семантика языков программирования 182
Семантика языка программирования 182
Синтезируемые атрибуты 183
Порядок вычислений 185
Выводы 185
Атрибутные грамматики 185
Операционная семантика 188
Аксиоматическая семантика 189
Аксиома присваивания 191
Применение аксиомы присваивания 192
Правило консеквенции (упрощения) 192
Правило вывода для последовательности 193
Применение правила вывода для последовательности 194
Правило вывода для условного оператора 194
Применение правила вывода для условного оператора 194
Вычисление предусловия для цикла FOR 195
Правило вывода для оператора цикла WHILE 196
Требования к инварианту цикла 196
Определение инварианта цикла по индукции 196
Пример доказательства цикла 197
Общий случай определения инварианта цикла 198
Денотационная семантика 200
Семантическая функция отображения двоичных чисел 201
Семантическая функция отображения десятичных чисел 201
Состояние программы 202
Выражения 203
Операторы присваивания 204
Логические циклы с предусловием 204
Контрольные вопросы и упражнения 205
Глава 8. Типизация данных 209
Объекты данных 209
Переменные и константы 210
Типы данных 211
Элементарные типы данных 213
Объявления 216
Статический контрольтипов 218
Динамический контрольтипов 219
Обзор составных типов данных 220
Системы типизации данных 221
Атрибуты переменной 222
Связывание 224
Динамическое связывание типов 225
Время жизни 228
Тип выражения 232
Контрольные вопросы и упражнения 233
Глава 9. Скалярные типы данных 236
Перечисления 236
Целые и вещественные типы 238
Десятичные числа 241
Поддиапазоны 241
Логический тип 242
Символьные типы 243
Стиль программирования в языке С. Преобразование типов 244
Контрольные вопросы и упражнения 244
Глава 10. Составные типы данных 246
Массивы 246
Разновидности массивов 248
Инициализация массива 251
Атрибуты и операции простого массива 252
Операции над массивами в скриптовых языках 253
Прямоугольные массивы и массивы массивов 253
Сечения массивов 256
Статические массивы языка С 259
Ассоциативные массивы 259
Строки символов 261
Записи 265
Записи и массивы со вложенными структурами 268
Сравнение массивов и записей 269
Объединения и вариантные записи 270
Вариантные записи ослабляют надежность типов? 273
Множества 275
Кортежи 276
Списки 277
Контрольные вопросы и упражнения 280
Глава 11. Указатели 282
Основные понятия 282
Операции над указателями в языке Pascal 283
Динамические связные структуры данных 284
Повисшие указатели и утечки памяти 285
Безопасность указателей в Паскале 286
Указатели как посредники 287
Перестановка указателей и перемещение данных 288
Указатели в языке Ada 288
Массивы и указатели в языках С и C++ 291
Динамическое распределение памяти 294
Гибкость указателей в языке С 295
Ссылочный тип 296
Реализация указателей 297
Контрольные вопросы и упражнения 298
Глава 12. Преобразования типов данных 300
Эквивалентность типов данных 300
Преобразование типа и явное приведение 306
Явные приведения типа в языке C++ 308
Оператор staticcast 309
Оператор constcast 309
Оператор reinterpret_cast 310
Оператор dynamiccast 311
Совместимость типов и неявное приведение 311
Уровень типизации языка 315
Контрольные вопросы и упражнения 319
Глава 13. Подпрограммы 320
Разновидности подпрограмм 320
Объявление подпрограммы 322
Вызов подпрограммы 325
Рекурсия — множественные выполнения подпрограммы 328
Преимущества подпрограмм 328
Методы передачи параметров 329
Передача параметров по значению 333
Передача параметров по ссылке 334
Эффект передачи параметров по ссылке с помощью указателей языка С 336
Передача по значению-результату 337
Передача по результату 339
Правила области видимости для имен 340
Статическая область видимости и переименование локальных переменных 342
Макрорасширение и динамическая область видимости 342
Конфликты именования 343
Передача параметров— текстуальная подстановка 343
Передача параметров по имени и статическая область видимости 344
Реализация методов передачи параметров 345
Методы передачи параметров в популярных языках программирования 346
Проверка типов параметров 349
Массивы в качестве параметров 350
Подпрограммы в качестве параметров 352
Проверка типов параметров при вызовах подпрограммы 352
Организация области видимости для выполнения
переданной подпрограммы 354
Типы возвращаемых значений 355
Количество возвращаемых значений 356
Побочные эффекты функций 356
Полиморфизм в языках программирования 356
Параметрический полиморфизм 357
Полиморфизм включения или полиморфизм подтипов 359
Перегрузка и неявное приведение 360
Реализация полиморфизма 360
Перегруженные подпрограммы 361
Родовые подпрограммы 363
Родовые подпрограммы в языке Ada 363
Родовые подпрограммы в языке C++ 367
Родовые методы в языке Java 369
Родовые методы в языке С# 371
Родовые функции в языке F# 371
Замыкания 372
Контрольные вопросы и упражнения 374
Глава 14. Управление подпрограммами 376
Вложенные области видимости объявлений 376
Связывания при выполнении подпрограмм 381
Поток управления между активациями подпрограмм 381
Деревья активации 382
Формат записи активации 383
Размещение и освобождение в куче 385
Повторное использование свободного пространства 386
Уплотнение свободного пространства 387
Фрагментация памяти в куче 387
Размещение и освобождение в стеке 388
Размещение статических переменных в период компиляции 389
Управление подпрограммами в языке С 389
Управление подпрограммами в языке Pascal 391
Дисплеи для быстрого доступа к информации 395
Контрольные вопросы и упражнения 397
Глава 15. Абстрактные типы данных 400
Абстракция процесса 400
Инкапсуляция и абстракция данных 401
Абстрактные типы данных 403
АТД в языке Ada 405
АТД в языке C++ 408
АТД в языке Java 410
АТД в языке С# 411
АТД в языке Ruby 413
Параметрический полиморфизм в АТД 416
Родовые АТД в языке Ada 416
Классы-шаблоны в языке C++ 418
Родовые классы в языке Java 420
Родовые классы в языке С# 422
Синтаксические контейнеры для множества типов 422
Контейнеры в языке С 423
Контейнеры в языке C++ 423
Пакеты языка Ada 424
Сборки языка С# 426
Пространства имен 427
Пространства имен в языке C++ 427
Пакеты в языке Java 428
Пространства имен в языке Ada 429
Модули в языке Ruby 430
Контрольные вопросы и упражнения 430
Глава 16. Объектно-ориентированное и аспектно-ориентированное программирование 432
Основные понятия объектно-ориентированного подхода к программированию 432
Классы 433
Отношения между классами 436
Деревья наследования классов 442
Объекты 443
Отношения между объектами 446
Возможности наследования и полиморфизм 448
Природа наследования 450
Иерархия наследования в различных языках 452
Принцип подстановки Барбары Дисков 452
Корректность наследования 453
Переопределение и виртуальные методы 454
Интерфейсы и абстрактные классы 455
Формы наследования 456
Вариации на тему наследования 460
Сообщения и объекты 462
Синтаксис пересылки сообщений 462
Сообщения в языках со статической и динамической типизацией 463
Доступ к получателю внутри метода 464
Создание объектов и конструкторы 466
Связывание сообщения и метода 468
Переопределение методов 472
Замещение методов 472
Уточнение методов 475
ООП на языке C++ 477
Единичное наследование 478
Множественное наследование 481
Динамическое связывание 482
ООП на языке Ада 484
Расширяемые типы 484
Классы 484
Абстрактные классы и интерфейсы 486
Надклассовые типы 489
Наследование от родового класса 489
ООП на языке Java 492
Единичное наследование 493
Смешанное наследование 494
Вложенные классы 495
ООП на языке С# 496
Наследование 496
Динамическое связывание 496
Вложенные классы 497
ООП на языке Ruby 497
Наследование 499
Динамическое связывание 499
Реализация объектно-ориентированных классов и объектов 500
Организация памяти для сохранения объекта 500
Динамическое связывание сообщений с методами 500
Особенности аспектно-ориентированного подхода 503
Базовые понятия АОП 507
Аспекты 509
Жизнь без аспектов 509
Жизнь с аспектами 510
Программирование нааспектно-ориентированном языке AspectJ 514
Конструкции пересечения языка AspectJ 516
Альтернативный синтаксис ©AspectJ 519
Контрольные вопросы и упражнения 520
Глава 17. Аппарат исключений 523
Характеристика исключений 523
Этапы работы с определяемыми исключениями 526
Потоки управления при обработке исключений 528
Многоуровневая система исключений 529
Обработка исключений в языке C++ 531
Связывание исключений с обработчиками 531
Оформление функций в C++ 532
Обработка исключений в языке Java 533
Классы исключений 533
Обработчики исключений 533
Связывание исключений с обработчиками 534
Секция finally 535
Обработка исключений в языке С# 536
Контрольные вопросы и упражнения 536
Глава 18. Ввод-вывод и файлы 537
Характеристика аппарата ввода-вывода 538
Пакеты ввода-вывода языка Ада 539
Процедуры ввода языка Ада 540
Процедуры вывода языка Ада 541
Организация файлов и средства управления ими 543
Текстовые файлы 546
Двоичные файлы последовательного доступа 552
Двоичные файлы прямого доступа 554
Потоки ввода-вывода 556
Объектно-ориентированный ввод-вывод в языке C++ 560
Потоковая библиотека ввода-вывода 561
Стандартные потоки 563
Форматирование потоков 565
Ошибки потоков 568
Файловые потоки 569
Строковые потоки 575
Контрольные вопросы и упражнения 577
Глава 19. Основные понятия параллельного программирования 578
Процессы и потоки 578
Задачи языка Ада 582
Синхронизация процессов на основе разделяемых переменных 585
Семафоры 586
Мониторы 588
Защищенные объекты 589
Синхронизация процессов на основе сообщений 592
«Развязка» взаимодействия задач при рандеву 596
Селективный прием selective accept 596
Временной вызов входа 601
Условный вызов входа 601
Асинхронный отбор 601
Потоки языка Java 602
Класс Thread 602
Приоритеты 604
Семафоры 604
Синхронизация конкуренции 605
Синхронизация взаимодействия 606
Неблокирующая синхронизация 608
Явная блокировка 609
Потоки вС# 610
Основные операции над потоками 610
Синхронизация потоков 612
Контрольные вопросы и упражнения 613
Глава 20. Функциональное программирование 615
Особенности функциональных языков программирования 615
Выводы 618
Язык Scheme — классический функциональный подход 619
Выражения языка Scheme 619
Специальные формы 621
Создание функций 623
Динамическая проверка типа 624
Хвостовая и не хвостовая рекурсия 625
Структуры данных в языке Scheme 626
Программирование в языке Scheme 627
Функции высшего порядка 628
Статическая область видимости 630
Настройка —специализация языка Scheme 631
Язык ML — функциональный подход со статической типизацией 632
Функции и величины языка ML 633
Списки в языке ML 634
Проверка типов в языке ML 636
Ввод и вывод в языке ML 637
Типы данных 638
Функции высшего порядка и карризация 639
Отложенные вычисления 642
Нестрогие функции 642
Специальные формы для отложенных вычислений 643
Ленивые вычисления 645
Контрольные вопросы и упражнения 646
Глава 21. Логическое программирование 648
Исчисление предикатов 648
Компоненты исчисления предикатов первого порядка 649
Запись утверждений в исчислении предикатов 650
Правила вывода исчисления предикатов первого порядка 651
Специфика логического программирования 652
Формулы Хорна 652
Резолюция и унификация 656
Язык Prolog 659
Нотация и структуры данных 659
Выполнение в среде языка Prolog 660
Арифметика 661
Унификация 662
Стратегия поиска в языке Prolog 664
Циклы и структуры управления 665
Проблемы языка Prolog 669
Проблема проверки вхождения при унификации 669
Проблема замкнутого мира 669
Проблема логического отрицания 670
Формулы Хорна не выражают всю логику утверждений 671
Информация управления в логическом программировании 672
Контрольные вопросы и упражнения 673
Заключение 675
Список литературы 677
Алфавитный указатель 683

Читайте также:  Как оплатить картой в стиме

О том, как читать книги в форматах pdf , djvu — см. раздел " Программы; архиваторы; форматы pdf, djvu и др. "

Библиотека программиста запись закреплена

Сергей Орлов "Теория и практика языков программирования" (2013, PDF)

Учебник посвящен систематическому изложению теории и практики языков программирования. Он отражает классическое содержание учебной дисциплины по языкам программирования. Все сложные вопросы поясняются законченными примерами. Кроме того, здесь предлагается полный комплекс задач и упражнений по узловым вопросам. В российских стандартах третьего поколения (компьютерного направления) учебник охватывает базисные разделы следующих дисциплин: теория формальных языков, теория автоматов и формальных языков, языки программирования, программирование, объектно-ориентированное программирование, логическое и функциональное программирование, теория вычислительных процессов. Учебник предназначен для студентов инженерного, бакалаврского и магистерского уровней компьютерных специальностей, может быть полезен преподавателям и исследователям/разработчикам трансляторов и другого программного обеспечения. Рекомендовано Санкт-Петербургским институтом информатики и автоматизации Российской академии наук (СПИИРАН) в качестве учебника по направлению "Информатика и вычислительная техника".

Учебник посвящен систематическому изложению теории и практики языков программирования. Он отражает классическое содержание учебной дисциплины по языкам программирования. Все сложные вопросы поясняются законченными примерами. Кроме того, здесь предлагается полный комплекс задач и упражнений по узловым вопросам. Учебник охватывает базисные разделы следующих дисциплин: теория формальных языков, теория автоматов и формальных языков, языки программирования, программирование, объектно-ориентированное программирование, логическое и функциональное программирование, теория вычислительных процессов.

В новом издании обсуждаются характеристики, а также последние тенденции развития универсальных языков программирования высокого уровня, таких как Scala, Go и Swift; поясняются главные особенности последних стандартов классических языков C++, Java и C#: лямбда-выражения во всех этих языках, cсылочный тип rvalue и семантика перемещения в языке C++ 11, ковариантность и контрвариантность родовых шаблонов в C#; существенно расширено представление скриптового языка Ruby, рассматриваются его блоки, механизмы единичного наследования и подмешивания, а также утиной типизации; добавлено описание аппарата событий и программирования на основе событий; показано применение стиля функционального программирования в скриптовых и объектно-ориентированных языках Python, Ruby, C#, Java, C++, Scala, Go и Swift.

Читайте также:  Графический планшет с экраном gaomon

Отрывок из книги. Язык Scala

Язык был создан в Швейцарской политехнической школе Лозанны (2004 год, главный автор — Мартин Одерски). Он стал результатом исследований, направленных на разработку улучшенной языковой поддержки компонентного ПО. За основу были взяты две идеи:

• Язык для программирования компонентного ПО должен быть масштабируемым (должна обеспечиваться возможность с помощью одних и тех же концепций описывать как малые, так и большие фрагменты программ). Поэтому внимание было сконцентрировано на механизмах абстракции, композиции и декомпозиции, а не на введении большого количества конструкций, которые могут быть полезными только на каком-то одном уровне масштабирования.

• Масштабируемая поддержка компонентов обеспечивается языком, объединяющим как объектно-ориентированное, так и функциональное программирование. Некоторые из базовых новшеств Scala представляют собой концепции, являющиеся сплавом этих парадигм программирования. В статически типизированных языках, к которым относится Scala, данные парадигмы до сих пор были полностью разделены.

Scala была выпущена для использования на платформе JVM в январе 2004 года и на платформе .NET в июне 2004 года. Кроме того, в настоящее время активно разрабатывается целый ряд Scala-компиляторов.

Таким образом, Scala — это мультипарадигменный язык со строгой типизацией, который поддерживает функциональное, объектно-ориентированное и параллельное программирование. Предназначен для реализации на вершине виртуальной машины Java и частично мотивирован известными недостатками языка Java. Обеспечивает наиболее агрессивную интеграцию функциональных характеристик в императивный язык. Имеет функции первого класса и высшего порядка, механизм логического вывода локального типа, отложенные (ленивые) вычисления, сопоставление с образцом, карризацию, хвостовую рекурсию, развитые родовые средства (с ковариантностью и контрвариантностью), параллелизм на основе сообщений, наследование на основе трейтов (что-то среднее между классами и интерфейсами). Энергично используется как в промышленности, так и в науке. Развитие финансируется Европейским исследовательским советом.

В Scala используется чистая объектно-ориентированная модель, похожая на применяемую в Smalltalk: каждое значение является объектом (и числа, и результаты функций), а каждая операция — это отправка сообщения, вызов метода объекта. Например, сложение 2 + 3 интерпретируется как 2.+(3), то есть как вызов в объектеприемнике «2» метода «+» с аргументом «3». Здесь в качестве объекта-источника рассматривается число 3. Этим Scala отличается от Java, поскольку в Java разделены примитивные типы (например, boolean или int) и ссылочные типы, а также нет возможности работать с функциями как со значениями.

Конечно, Java-программисты сильно удивятся тому, что в Scala функции также являются объектами. Тем не менее в Scala функцию можно передавать как аргумент, сохранять в качестве переменной или возвращать из другой функции. Такая возможность манипулировать функциями как обычными переменными является краеугольным камнем функционального программирования, суть которого состоит в работе функций с неизменяемыми переменными.

Перед определением функции ставится ключевое слово def. Определения классов начинаются с зарезервированного слова class. Класс может предотвратить дальнейшее создание подклассов, употребляя зарезервированное слово final. Подобно объектно-ориентированным языкам C++, Java, C#, экземпляр класса может ссылаться на себя, используя слово this. Scala допускает перегруженные методы. Как и в Java, ключевое слово extend объявляет, что класс является подклассом другого класса. Scala не поддерживает множественное наследование. Вместо этого язык применяет смешанное наследование на базе трейтов, обеспечивающих включения общих атрибутов и методов в несколько подклассов. Трейты могут расширять классы или другие трейты. Подкласс в Scala может наследовать методы как от родительского класса, так и от трейтов. Трейты могут также иметь отношения с родительским классом и подклассом. Объявление трейта начинается с ключевого слова trait. Тело трейта выполняется, когда создается экземпляр класса, задействующего этот трейт. Родительским по умолчанию для класса или трейта является класс AnyRef, прямой потомок класса Any.

Конструктор в Scala размещается в теле определения класса. Когда создается экземпляр класса, каждое поле, соответствующее параметру в списке параметров, инициализируется параметром автоматически. В общем случае явный конструктор не нужен. Конструктор в производном классе должен вызывать один из конструкторов родительского класса. Трейты используют только первичные конструкторы без аргументов. Трейты не могут передавать аргументы конструктору родительского класса.

Читайте также:  Интернет трафик в россии

Правила видимости в Scala похожи на Java с некоторыми вариациями. В отличие от C++, по умолчанию в Scala задается «публичная» видимость. Видимость регулируется с помощью ключевых слов protected и private. Видимость указывается в начале объявлений функций, переменных или трейтов. Применение private [this] закрывает объявление для конкретного экземпляра внутри класса.

Определения методов считаются обычными функциями, начинаются с ключевого слова def, за которым следуют необязательные списки аргументов, символ двоеточия «:» и тип возвращаемого значения метода. Абстрактным является метод, у которого отсутствует тело. Методы могут вкладываться друг в друга.

Для иллюстрации представим абстрактный класс для комплексного числа:

Определение класса включает только два атрибута: re (действительная часть) и im (мнимая часть). С помощью свойства override операция toString переопределена. Это сделано для облегчения печати результата. Заданы две абстрактные операции: сложение и вычитание. Абстрактные операции записываются в виде двух методов. Каждый метод создает новое комплексное число, которое автоматически печатается на консоли с помощью переопределенного метода toString.

После загрузки этого фрагмента в интерпретатор Scala можно выполнить следующие команды:

Точка с запятой используется в языке значительно реже: она не ставится в конце оператора, если он записан один в строке. Если строка содержит более одного оператора, точка с запятой обязательна. Scala поддерживает как изменяемые, так и неизменяемые структуры данных Язык обеспечивает полиморфизм, и если тип переменной не указан, то он выводится на основе значения, заданного для переменной.

Scala реализует обширный набор типов данных: массивы, ассоциативные массивы, списки, кортежи и множества. Массивы являются изменяемыми объектами, а списки — неизменяемыми объектами. Списки используются при функциональном программировании, а массивы — при императивном программировании. Множества и ассоциативные массивы могут создаваться как изменяемыми, так и неизменными с помощью трейтов. Напомним, что трейты — это абстрактные интерфейсы, которые расширяют содержание объектов. Например, если имеется класс «транспортное средство» и трейт «четырехколесный», расширяющий транспортные средства, то автомобиль соответствует классу «транспортное средство» с добавлением трейта «четырехколесный». В случае множеств и ассоциативных массивов связывание «изменяемого» и «неизменяемого» трейтов с классом множество или ассоциативный массив обеспечивает, в конечном счете, их изменяемость или неизменность.

Целочисленный массив объявляется как Array [Int] (4). Это означает, что объект является массивом, содержащим четыре целых числа. Индексы переменных записываются внутри пары круглых скобок. Поскольку каждая структура данных является объектом, массив создается с использованием конструктора new. Например, объявление val: studentNames = new array [String] (20) создаст объект массива, содержащий 20 строк. К его строкам можно получить доступ с помощью studentNames(i), где i — индексная переменная типа integer.

Списки могут быть объявлены в форме List (1, 2, 3) или как несколько элементов, соединенных символом «::». Например, List (1, 2, 3) можно записать как 1 :: 2 :: 3 :: Nil. Два списка xl и yl соединяются с помощью символа «. ». Например, List (1, 2) . List (3, 4, 5) создают List (1, 2, 3, 4, 5).

Язык Scala поддерживает выражения if-then-else, классы case, операторы while-loop, do-while-loop, итератор foreachloop, определяет итерацию forloop и рекурсивные вызовы функций. Передавая функцию в качестве параметра в другую функцию, можно смоделировать композицию. Кроме того, Scala поддерживает обновление в индексированных переменных, что позволяет разрабатывать программы на основе обычных итераций.

Рассмотрим еще один пример объявления функции:

Здесь функция описывает факториал и объявляет тип аргумента и тип результата как целочисленный. Предусмотрен рекурсивный вызов функции.

Scala является блочно-структурированным языком, где функции могут вкладываться внутрь других функций. Локальные переменные имеют область действия внутри блоков, где они были объявлены. Внутри вложенного блока переменные, объявленные во внешних блоках, могут быть перекрыты. Scala поддерживает концепцию модуля с использованием пакетов Java и может импортировать методы по предложению import. По умолчанию Scala импортирует все библиотеки классов Java и любую предопределенную библиотеку в Scala перед выполнением программы. Для передачи параметров Scala использует передачу по значению, а также передачу по имени. Синтаксис передачи по имени: : ‘=>’ , тогда как синтаксис передачи по значению имеет вид : . Scala использует возможности обработки исключений Java.

Примеры программного кода на Scala

Функция add7 добавляет 7 к входному параметру n и возвращает значение. Обратите внимание, что тип параметра и тип результата функции объявлены явно. Тело функции является блоком и заключено в фигурные скобки.

Функция square_add показывает композицию двух функций: square и add7. Сначала функция add7 применяется для генерации числа, которое на 7 больше входного параметра, а затем сгенерированное значение возводится в квадрат. Например, square_add (5) эквивалентно square (5 + 7) = 144.

Функция power_rec иллюстрирует использование выражения if-then-else и рекурсии в Scala. Обратите внимание, что предикат заключен в круглые скобки и нет никакой мутации (изменения значений переменных).

Напротив, функция power_iter использует локальные изменяемые переменные a и b для вычисления значения функции xn. Значение накапливается в аккумуляторе b и, наконец, возвращается после завершения цикла while.

Функция sum_list добавляет все целые числа в список, используя рекурсивный вызов в остальной части списка. Встроенный метод isEmpty используется для проверки пустого списка, метод head применяется для доступа к первому элементу списка, а метод tail обеспечивает доступ к остальным элементам списка.

Scala использует встроенную функцию отображения map, которая обеспечивает возможность применения функциональной формы apply_all. Здесь в теле функции сначала записывается параметр (xl), затем функция отображения высшего порядка (map), а затем имя функции (my_func). В этом случае apply_all (int_square, List (1, 2, 3)) будет генерировать список List (1, 4, 9). Следует отметить способ объявления типа для функции my_func. Тип функции объявлен как Int => Int, что означает, что он принимает входной аргумент типа integer и генерирует выходное значение типа integer.

Наконец, функция construct берет последовательность функций, применяемых к одному и тому же аргументу, и генерирует последовательность выходных значений. Например, construct (List (add7, int_square), 5) будет генерировать список List (12, 25). Программа с функцией construct возвращает нулевой список, если список функций пуст. В противном случае она вызывает рекурсивно из списка остальные функции и объединяет результат применения первой функции с остальной частью выходной последовательности, полученной путем применения остальных функций к этому же аргументу.

Рецензенты:

Соколов Б. В., д. т. н., профессор, руководитель лаборатории информационных технологий
в системном анализе и моделировании Санкт-Петербургского института информатики
и автоматизации РАН;

Пасмуров А. Я., д. т. н., доцент, senior member of IEEE, руководитель учебного центра ФГУП
«ЗащитаИнфоТранс» Министерства транспорта РФ, Санкт-Петербургский филиал.

Для Хаброжителей скидка 20% по купону — Орлов

Ссылка на основную публикацию
Стим показывает что я не в сети
Не редко пользователи Steam встречаются с проблемой, когда подключение к интернету есть, браузеры работают, но клиент Стим не грузит страницы...
Смарт часы что они умеют
В этой статье мы поговорим о том, для чего нужны умные часы, а также какими функциями они располагают чаще всего....
Смарт часы самсунг с сим картой
Хотите быть современным и модным человеком? Перестать зависеть от своего громоздкого смартфона? Только представьте, вы можете не брать телефон на...
Стим саппорт украли аккаунт
Если ваш аккаунт Steam украли или взломали, то до его восстановления вам необходимо выполнить действия, указанные ниже, иначе аккаунт может...
Adblock detector