В программировании язык дизайна , в первый класс гражданина ( в том числе тип , объект , субъект , или значение ) в данном языке программирования является юридическим лицом , которое поддерживает все операции , как правило , доступны для других лиц. Эти операции обычно включают передачу в качестве аргумента, возвращение из функции, изменение и присвоение переменной. [1]
История
Понятие объектов первого и второго класса было введено Кристофером Стрейчи в 1960-х годах. [2] [3] На самом деле он не определял термин строго, но противопоставлял действительные числа и процедуры в АЛГОЛЕ :
Объекты первого и второго класса. В ALGOL действительное число может появиться в выражении или быть присвоено переменной, и любое из них может появиться как фактический параметр в вызове процедуры. С другой стороны, процедура может появляться только в другом вызове процедуры либо как оператор (наиболее распространенный случай), либо как один из фактических параметров. Нет других выражений, включающих процедуры или результаты которых являются процедурами. Таким образом, в некотором смысле процедуры в ALGOL являются гражданами второго сорта - они всегда должны появляться лично и никогда не могут быть представлены переменной или выражением (за исключением случая формального параметра) ... [4]
Робин Попплстоун дал следующее определение: Все предметы имеют определенные основные права.
- 1. Все элементы могут быть фактическими параметрами функций.
- 2. Все элементы могут быть возвращены в результате выполнения функций.
- 3. Все позиции могут быть предметом уступок.
- 4. Все предметы можно проверить на равенство.
В 1990-е годы Рафаэль Финкель [6] предложил определения ценностей второго и третьего класса, но эти определения не получили широкого распространения. [7]
Примеры
Простейшие скалярные типы данных, такие как целые числа и числа с плавающей запятой, почти всегда первоклассны.
Во многих старых языках массивы и строки не являются первоклассными: они не могут быть назначены как объекты или переданы как параметры подпрограмме. Например, ни Fortran IV, ни C не поддерживают присвоение массивов, и когда они передаются в качестве параметров, фактически передается только позиция их первого элемента - их размер теряется. C, похоже, поддерживает присвоение указателей массива , но на самом деле это просто указатели на первый элемент массива, и опять же, не несут размер массива.
В большинстве языков типы данных не являются объектами первого класса, хотя в некоторых объектно-ориентированных языках классы являются объектами первого класса и являются экземплярами метаклассов .
Немногие языки вообще поддерживают продолжения и GOTO- метки как объекты, не говоря уже о первоклассных объектах.
Концепция | Описание | Языки |
---|---|---|
первоклассная функция | закрытие и анонимные функции | Dart , Scheme , ML , Haskell , F # , Kotlin , Scala , Swift , PHP , Python , Raku , JavaScript , Delphi , Rust |
первоклассный контроль | продолжения | Схема , ML , F # |
первоклассный тип | зависимые типы | Кок , Идрис , Агда |
первоклассный тип данных | Общий Haskell , C ++ 11 | |
первоклассный полиморфизм | непредикативный полиморфизм | |
первоклассное сообщение | динамические сообщения (вызовы методов) | Smalltalk , [8] Objective-C [8] |
первоклассный класс | метакласс | Smalltalk , Objective-C , Ruby , Python , Delphi |
первоклассные доказательства | объект доказательства [9] | Coq , Agda |
Функции
Многие языки программирования поддерживают передачу и возврат значений функций, которые могут применяться к аргументам. Достаточно ли этого для первоклассного вызова значений функций - это вопрос.
Некоторые авторы требуют, чтобы во время выполнения была возможность создавать новые функции, чтобы называть их «первоклассными». В результате функции в C не являются объектами первого класса; вместо этого их иногда называют объектами второго класса , потому что ими все еще можно манипулировать большинством вышеперечисленных способов (с помощью указателей на функции ).
В Smalltalk функции (методы) являются объектами первого класса, как и классы Smalltalk. Поскольку операторы Smalltalk (+, - и т. Д.) Являются методами, они также являются объектами первого класса.
Отражение
Некоторые языки, такие как Java и PHP , имеют подсистему явного отражения, которая позволяет получить доступ к внутренним структурам реализации, даже если они недоступны или недоступны для управления так же, как обычные объекты.
Смотрите также
- Первоклассная функция
- Овеществление
Рекомендации
- ^ Скотт, Майкл (2006). Прагматика языка программирования . Сан-Франциско, Калифорния: Издательство Морган Кауфманн. п. 140 .
- ^ Род Берстолл, «Кристофер Стрейчи - Понимание языков программирования», Высший порядок и символические вычисления 13 : 52 (2000)
- ↑ Гарольд Абельсон и Джеральд Джей Сассман, Структура и интерпретация компьютерных программ , 2-е издание, раздел 1.3.4, сноска 64. Архивировано 9 марта2015 г. в Wayback Machine.
- ^ Кристофер Стрейчи, «Фундаментальные концепции языков программирования» в высших порядках и символических вычислениях 13 : 11 (2000); хотя и опубликованные в 2000 году, это заметки из лекций, которые Стрейчи прочитал в августе 1967 года.
- ^ RJ Popplestone: Философия дизайна POP-2 . в: D. Michie: Machine Intelligence 3, Edinburgh, University Press, 1968.
- ^ Финкель, Р. Расширенный дизайн языка программирования , стр. 73
- ^ Норман Рэмси. «О первоклассной ценности» . stackoverflow.com . Проверено 14 сентября 2013 года .
- ^ а б Паритош Шрофф, Скотт Ф. Смит. Вывод типа для сообщений первого класса с функциями сопоставления
- ^ Бове, Ана; Дибьер, Питер (2009). «Зависимые типы в действии» (PDF) . Языковая инженерия и тщательная разработка программного обеспечения . 5520 : 57–99. DOI : 10.1007 / 978-3-642-03153-3_2 . Архивировано 2 апреля 2014 года (PDF) . Проверено 8 июня 2015 года .(также в архиве )