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