Языки программирования Парадигмы языков Стандартизация языков Интернационализация Типы данных Управление последовательностью действий Управление памятью
Парадигмы языков программирования 1. Императивные (процедурные) языки. Основная концепция – это состояние машины, т.е. множество всех значений всех ячеек памяти компьютера. Программа – это последовательность операторов, меняющих значения ячеек памяти, т.е. переводящих машину в новое состояние. Примеры. C/C++, Fortran, Algol, PL/1, Pascal, Ada, Cobol, Smalltalk 2. Аппликативные (функциональные) языки. Основная концепция – не определение последовательности состояний машины для получения ответа, а выбор функции, которую надо применить к исходным данным для получения ответа. Синтаксис: функция 1(функция 2(функция 3(…функцияn(данные)…))) Примеры. ML, LISP, Haskell, F# 3. Языки, основанные на системе правил (языки логического программирования). В основе теория и аппарат математической логики с использованием математических принципов резолюций. Исполнение программы - автоматическое доказательство теорем. Синтаксис: разрешающее условие 1 действие 1 Примеры. Planner, Prolog. 4. Объектно-ориентированные языки. Главное здесь то, что в этой строятся сложные объекты как расширения более простых объектов и наследуют их свойства. Основные синтаксические элементы: классы (наследование, полиморфизм, инкапсуляция) и интерфейсы. Примеры. Smalltalk, C++, Java, Delphi, семейство языков.NET
Виды стандартов Частные стандарты – разработаны конкретными фирмами. Главным недостатком считается то, что часто появляются новые реализации, несовместимые со старыми. Согласительные стандарты (просто стандарты) – разработаны специальными организациями и основаны на соглашении всех заинтересованных участников.
Организации – разработчики стандартов В США: ANSI (American National Standards Institute) комитет X3 ассоциации CBEMA (Computer Business Equipment Manufactures Association) IEEE (Institute of Electrical and Electronic Engineers) NIST (National Institute of Standards and Technology) В Великобритании: BSI (British Standards Institute) Международные организации: ISO (International Standards Organization, штаб- квартира находится в Женеве).
Аспекты стандартизации Своевременность. Стандарт Fortran был создан поздно, в 1966 г., когда уже существовало несколько несовместимых версий. Другая крайность: стандарт Ada был создан слишком рано, в 1983 г., хотя первый эффективный компилятор появился только в 1987 г. Вовремя были созданы стандарты для C и Pascal.
Соответствие : Разные компиляторы компилируют 3-мя разными способами: 1). Вызывает S{1} (Delphi). 2). Вызывает S{3}. 3). Выдаёт ошибку, говоря что пропущено forward-описание. В соответствии со стандартом языка Pascal правильным является вариант 3, но обоснованным является и вариант 2. Совершенно недопустимым является вариант 1. program Anomaly; procedure S{1}; begin writeln(wrong one); end; procedure T; {Здесь пропущено: procedure S; forward; } procedure U; begin S{2} end; procedure S{3}; begin writeln(right one) end; begin U end; begin T end.
Устаревание. Стандарты обычно считается, что должны пересматриваться 1 раз в 5 лет. Обычно делается так, чтобы следующая версия была обратно совместима с предыдущей версией, но при этом язык может стать очень громоздким, т.к. будет накапливать устаревшие конструкции. Поэтому сейчас в стандарты вводится понятие устаревшей (не рекомендуемой) возможности, заранее предупреждающая пользователя, что может быть исключена из языка через 1–2 его последующих пересмотра.
Интернационализация Вопрос интернационализации имеет 2 аспекта: Как можно писать саму программу на этом языке. Как программы на этом языке выполняют ввод/вывод данных.
1. Идеографические системы (кодировка текстов: ANSI-7, ANSI-8, UTF-8, Unicode) 2. Схемы упорядочения: – сортировка нестандартных латинских символов (типа умляутов) и смешанных латинских и нелатинских языков – регистр (некоторые языки не имеют регистров – японский, арабский, тайский, иврит) – направление письма (слева направо, справа налево, сверху вниз) 3. Запись чисел (100000,0 и и ,0 и 100,000.0) 4. Денежные единицы ($10, 10 руб.) 5. Формат даты (Россия и Франция – , Америка – 11/26/06, Англия – 26/11/06, Италия – 26-XI-06) 6. Формат времени (Россия и Япония – 17:40, Америка – 5:40 p.m., Германия – 17.40, Франция – 17h40) 7. Часовые пояса (бывают пояса со сдвигом 15, 30, 45 и 60 мин, разное летнее время в мире и в северном/южном полушарии)
Типы данных Статическая типизация контроль типов осуществляется при компиляции. Динамическая типизация контроль типов осуществляется во время выполнения. Языки без типизации: –Языки с полиморфным типом данных –Языки с неявным определением типов –Языки с типом, определяемым пользователем
Статическая / динамическая типизация Статическая типизация – конечные типы переменных и функций устанавливаются на этапе компиляции. Динамическая типизация – все типы выясняются уже во время выполнения программы. Примеры: Статическая: C, Java, C#; Динамическая: Python, JavaScript, Ruby.
Сильная / слабая типизация Сильная типизация – язык не позволяет смешивать в выражениях различные типы и не выполняет автоматические неявные преобразования (вычитание из строки множество). Слабая типизация предполагает выполнение множества неявных преобразований автоматически, допуская потерю точности. Примеры: Сильная: Java, Python, Haskell, Lisp; Слабая: C, JavaScript, Visual Basic, PHP.
Явная / неявная типизация Явно-типизированные языки отличаются тем, что тип новых переменных / функций / их аргументов нужно задавать явно. Языки с неявной типизацией перекладывают эту задачу на компилятор / интерпретатор. Примеры: Явная: C++, D, C# Неявная: PHP, Lua, JavaScript
Примеры: Язык C - статическая слабая явная типизация Язык Python динамическая сильная неявная типизация Язык Assembler – сильная без типовая типизация(с проверкой размерности регистров) Динамика в статических языках: C# поддерживает псевдо-тип dynamic Delphi посредством специального типа Variant.
Скалярные типы данных Целые (8, 16, 32, 64, знаковые/беззнаковые, двоичное представление или посимвольное – упакованное десятичное BCD, диапазон значений 1..10) Вещественные (фиксированная/плавающая [знак- экспонента-мантисса] точка, IEEE 32, IEEE 64, IEEE 80, Real 48, Currency), комплексные числа Перечисления (enum) Логические (0 и 1 / 0 и –1 / 0 и не 0) Символьные (кодировка AnsiChar/UnicodeChar) Множества (битовые строки и хеш-кодирование)
Составные типы данных Массивы (статические/динамические) Ассоциативные массивы в Perl (ключ-значение) Записи (упакованные/неупакованные, записи с вариантами) Строковые (PChar/string, фиксированная string[30] / переменная string длина, статические/динамические, кодировка) Варианты (Variant, OleVariant) Списки (специальные виды: стеки, очереди, деревья, графы) Файлы (последовательные, текстовые [stdin, stdout, stderr], прямого доступа)
Прочие типы данных Указатели Ссылка Валютный тип Процедурные типы (процедурные, методы объектов, делегаты) Объекты, классы, интерфейсы Параметризированные (записи в Ada и строки в Pascal) и шаблонные типы (C++)
Управление последовательностью действий Управление вычислением выражений: – Запись выражений (инфикс, постфикс) – Правила старшинства (приоритет операций) Формы управления последовательностью выполнения операторов: – Композиция (последовательное выполнение/на основе правил, составные операторы, операторы goto/break/continue/exit). При вызове break/continue/exit реализуется последовательный вызов процедур секций finally. – Ветвление (if-then-else, case) – Повторение (циклы)
Подпрограммы (раннее/позднее связывание, передача параметров, реализация через стек, фактические и формальные параметры, установка соответствия параметров через позицию/по имени, передача параметров по ссылке/значению,) Параллельное программирование (многопоточность, синхронизация) Обработка исключений (raise, try except, try finally)
Управление памятью 1. Статическое выделение в сегменте данных, в стеке и в регистрах (Fortran – только статическое выделение). 2. Явное выделение + освобождение памяти (C, Pascal: New=GetMem, Dispose=FreeMem, AllocMem, ReallocMem) 3. Явное выделение и управление памятью на основе счетчика использования (IUnknown, string): AddRef + Release. 4. Явное выделение + сбор мусора (Алгол,.NET). Момент сбора мусора непредсказуем.