В данном языке программирования гражданин первого класса [a] — это сущность, которая поддерживает все операции, обычно доступные другим сущностям. Эти операции обычно включают передачу в качестве аргумента , возврат из функции и назначение переменной . [ 1]
Понятие объектов первого и второго класса было введено Кристофером Стрейчи в 1960-х годах. [2] [3] На самом деле он не дал строгого определения этому термину, но противопоставил действительные числа и процедуры в АЛГОЛе :
Объекты первого и второго класса. В ALGOL действительное число может появляться в выражении или быть присвоено переменной, и любой из них может появляться как фактический параметр в вызове процедуры. Процедура, с другой стороны, может появляться только в другом вызове процедуры либо как оператор (наиболее распространенный случай), либо как один из фактических параметров. Нет других выражений, включающих процедуры или чьими результатами являются процедуры. Таким образом, в некотором смысле процедуры в ALGOL являются гражданами второго сорта — они всегда должны появляться лично и никогда не могут быть представлены переменной или выражением (за исключением случая формального параметра)... [4]
Робин Попплстоун дал следующее определение: Все предметы имеют определенные основные права.
В 1990-х годах Рафаэль Финкель [6] предложил определения ценностей второго и третьего класса, но эти определения не получили широкого распространения. [7] [ необходим лучший источник ]
Простейшие скалярные типы данных, такие как целые числа и числа с плавающей точкой, почти всегда являются первоклассными.
Во многих старых языках массивы и строки не являются первоклассными: их нельзя назначать как объекты или передавать как параметры подпрограмме. Например, ни Fortran IV , ни C не поддерживают назначение массивов, и когда они передаются как параметры, фактически передается только позиция их первого элемента — их размер теряется. C, кажется, поддерживает назначение указателей массивов , но на самом деле это просто указатели на первый элемент массива, и снова не несут размер массива. [ необходима цитата ]
В большинстве языков типы данных не являются объектами первого класса, хотя в некоторых объектно-ориентированных языках классы являются объектами первого класса и являются экземплярами метаклассов . Языки в семействе функционального программирования часто также имеют типы первого класса, в форме, например, обобщенных алгебраических типов данных или других удобств метаязыка, позволяющих программам реализовывать расширения своего собственного языка реализации.
Немногие языки вообще поддерживают продолжения и метки GOTO как объекты, не говоря уже о том, чтобы рассматривать их как объекты первого класса.
Многие языки программирования поддерживают передачу и возврат значений функций, которые могут быть применены к аргументам. Достаточно ли этого, чтобы называть значения функций первоклассными, является спорным.
Некоторые авторы требуют, чтобы была возможность создавать новые функции во время выполнения, чтобы называть их «первоклассными». [ требуется ссылка ] Согласно этому определению, функции в C не являются объектами первого класса; вместо этого их иногда называют объектами второго класса , поскольку ими по-прежнему можно манипулировать большинством из вышеперечисленных способов (с помощью указателей на функции ).
В Smalltalk функции (методы) являются объектами первого класса, как и классы Smalltalk. Поскольку операторы Smalltalk (+, - и т. д.) являются методами, они также являются объектами первого класса.
Некоторые языки, такие как Java и PHP , имеют явную подсистему рефлексии , которая позволяет получать доступ к внутренним структурам реализации, даже если они недоступны или не поддаются манипулированию так же, как обычные объекты.
В других языках, например, в семействе Lisp , рефлексия является центральной функцией языка, а не специальной подсистемой. Обычно это принимает форму некоторого набора следующих функций:
Они допускают различные формы первоклассного доступа к реализации языка и, в общем, манипулируются так же, как и обычные языковые объекты, и полностью неотличимы от них. Из-за этого их использование обычно сопровождается некоторыми (культурными) оговорками и рекомендациями, поскольку непроверенная модификация базовой системы программирования пользователями может легко подорвать оптимизацию производительности, сделанную разработчиками языка.