В языке программирования, первоклассный гражданин (также тип, объект, объект или значение ) в данном программа Язык - это объект, который поддерживает все операции, обычно доступные другим объектам. Эти операции обычно включают передачу в качестве аргумента, возвращение из функции, изменение и присвоение переменной.
Концепция объектов первого и второго класса была введена Кристофером Стрейчи в 1960-х годах. На самом деле он не определил термин строго, но противопоставил действительные числа и процедуры в АЛГОЛе :
Объекты первого и второго класса. В АЛГОЛе действительное число может появляться в выражении или быть присвоено переменной, и любой из них может появляться как фактический параметр при вызове процедуры. С другой стороны, процедура может появляться только в другом вызове процедуры либо как оператор (наиболее распространенный случай), либо как один из фактических параметров. Нет других выражений, включающих процедуры или результаты которых являются процедурами. Таким образом, в некотором смысле процедуры в ALGOL являются гражданами второго сорта - они всегда должны появляться лично и никогда не могут быть представлены переменной или выражением (за исключением случая формального параметра)...
Робин Попплстоун дал следующее определение: Все предметы имеют определенные основные права.
В 1990-е годы Рафаэль Финкель предложил определения значений второго и третьего класса, но эти определения не получили широкого распространения.
Простейшие скалярные типы данных, такие как целые числа и числа с плавающей запятой, почти всегда первоклассны.
Во многих старых языках массивы и строки не являются первоклассными: они не могут быть назначены как объекты или переданы как параметры подпрограмме. Например, ни Fortran IV, ни C не поддерживают присвоение массивов, и когда они передаются в качестве параметров, фактически передается только позиция их первого элемента - их размер теряется. Кажется, что C поддерживает присвоение массиву указателей, но на самом деле это просто указатели на первый элемент массива и опять же не несут размер массива.
В большинстве языков типы данных не являются объектами первого класса, хотя в некоторых объектно-ориентированных языках классы являются объектами первого класса и являются экземплярами метаклассы.
Некоторые языки поддерживают продолжения и GOTO -labels вообще как объекты, не говоря уже о первоклассных объектах.
Концепция | Описание | Языки |
---|---|---|
первоклассная функция | закрытие и анонимные функции | Схема, ML, Haskell, F#, Kotlin, Scala, Swift, PHP, Python, Raku, JavaScript, Delphi |
первоклассный контроль | продолжения | Схема, ML, F# |
первоклассный тип | зависимые типы | Coq, Идрис, Agda |
первоклассный тип данных | . C ++ 11 | |
полиморфизм первого класса | непредикативный полиморфизм | |
сообщение первого класса | динамическое сообщения (вызовы методов) | Smalltalk, Цель -C |
метакласс | Smalltalk, Objective-C, Ruby, Python, Delphi | |
первоклассный доказательства | Coq, Agda |
Многие языки программирования поддерживают передачу и возвращение значений функций, которые могут применяться к аргументам. Достаточно ли этого для первоклассного вызова значений функции - это вопрос.
Некоторые авторы требуют, чтобы во время выполнения была возможность создавать новые функции, чтобы называть их «первоклассными». В результате функции в C не являются объектами первого класса; вместо этого их иногда называют объектами второго класса, потому что ими все еще можно манипулировать большинством вышеперечисленных способов (с помощью указателей на функции ).
В Smalltalk функции (методы) являются объектами первого класса, как и классы Smalltalk. Поскольку операторы Smalltalk (+, - и т. Д.) Являются методами, они также являются объектами первого класса.
Некоторые языки, такие как Java и PHP, имеют явную подсистему отражения, которая разрешает доступ к внутренним структуры реализации, даже если они недоступны или недоступны для управления так же, как обычные объекты.