О первом - второй - и значении третьего класса

Первоклассное значение может быть

  1. переданный как аргумент
  2. возвращенный из подпрограммы
  3. присвоенный в переменную.

Второразрядное значение просто может быть передано как аргумент.

Значение третьего класса даже не может быть передано как аргумент.

Почему должен эти вещи, определенные как этот? Как я понимаю, "может быть передан как аргумент", означает, что он может быть продвинут в стек этапа выполнения; "может быть присвоен в переменную", означает, что она может быть перемещена в другое местоположение памяти; "может быть возвращен из подпрограммы", почти имеет то же значение, "может быть присвоен в переменную" начиная с возвращенного значения всегда быть помещенным в известный адрес, таким образом, значение первого класса полностью "подвижно", или "динамическое" значение второго класса является наполовину "подвижным", и третьим значением класса, просто "статично", таков как маркировки в C/C++, который просто может быть обращен оператором перехода, и Вы ничего не можете сделать с тем адресом кроме "goto".Does, Мое понимание имеют какой-либо смысл? или что делает эти три вида значений означают точно?

22
задан skaffman 6 April 2010 в 07:34
поделиться

2 ответа

О нет, возможно, мне придется снова отредактировать Википедию.

На самом деле стоит выделить только два различия: первоклассный и не первоклассный. Если Майкл Скотт расскажет о третьем -классе что-нибудь , я буду очень подавлен.

Хорошо, так что вообще такое «первоклассный»? Ну, это термин, который почти не имеет технического значения .Смысл, когда он присутствует, обычно является сравнительным, и он применяется к вещи на языке (я здесь намеренно нечетко), который имеет больше привилегий, чем сопоставимая вещь. Это все, что люди имеют в виду.

Давайте рассмотрим несколько примеров:

  • Указатели функций в C являются первоклассными значениями, потому что они могут быть переданы функциям, возвращены из функций и сохранены в структурах данных, распределенных в куче, как и любое другое значение. Функции в Pascal и Ada не являются первоклассными значениями, потому что, хотя они могут быть переданы как аргументы, они не могут быть возвращены как результаты или сохранены в структурах данных, выделенных в куче.

  • Структурные типы являются типами второго класса в C, потому что не существует литеральных выражений типа структуры. (Поскольку в C99 есть буквальные инициализаторы с именованными полями, но это все еще не так широко, как наличие литерала в любом месте, где вы можете использовать выражение.)

  • Полиморфные значения являются значениями второго класса в ML, потому что хотя они могут быть привязаны к именам, они не могут быть привязаны к лямбда. Поэтому их нельзя передавать в качестве аргументов. Но в Haskell, поскольку Haskell поддерживает полиморфизм более высокого ранга, полиморфные значения являются первоклассными. (Их можно даже хранить в структурах данных!)

  • В Java тип int является вторым классом, потому что вы не можете наследовать от него. Тип Целое число относится к первому классу.

  • В C метки относятся ко второму классу, потому что у них нет значений, и вы не можете использовать их для вычислений. В FORTRAN номера строк имеют значения и поэтому являются первоклассными.Существует расширение GNU для C, которое позволяет вам определять первоклассные метки, и это очень полезно. Что в данном случае означает «первоклассный»? Это означает, что метки имеют значения, могут храниться в структурах данных и могут использоваться в goto . Но эти значения относятся ко второму классу в другом смысле, потому что метка из одной процедуры не может значимо использоваться в goto , принадлежащем другой процедуре.

Мы понимаем, насколько бесполезна эта терминология?

Надеюсь, эти примеры убедят вас в том, что идея «первоклассного» не очень полезна для размышлений о языках программирования в целом. Когда вы говорите об определенной особенности определенного языка или языковой семьи, это может быть полезным сокращением («язык не работает, если он не имеет первоклассных, вложенных функций»), но по и крупно, вам лучше говорить именно то, что вы имеете в виду, вместо того, чтобы говорить о «первоклассных» или «не первоклассных» вещах.

Что касается «третьего класса», просто скажи «нет».

42
ответ дан 29 November 2019 в 04:20
поделиться

Что-то первоклассное, если оно явно управляемо в коде. Другими словами, что-то является первоклассным, если им можно программно управлять во время выполнения.

Это тесно связано с метапрограммированием в том смысле, что то, что вы описываете в коде (во время разработки), является одним мета-уровнем, а то, что существует во время выполнения, является другим мета-уровнем. Но барьер между этими двумя метауровнями можно стереть, например, с помощью отражения. Когда что-то реифицируется во время выполнения, это становится явно управляемым.

  • Мы говорим об объекте первого класса , потому что объектами можно управлять программно во время выполнения (это и есть цель).

  • В java у вас есть классов , но они не являются первоклассными, потому что код обычно не может управлять классом, если вы не используете отражение. Но в Smalltalk классы являются первоклассными: код может управлять классом как обычным объектом.

  • В java у вас есть пакетов (модулей) , но они не являются первоклассными, потому что код не управляет пакетом во время выполнения. Но в NewSpeak пакеты (модули) являются первоклассными, вы можете создать экземпляр модуля и передать его другому модулю, чтобы указать модульность во время выполнения.

  • В C # у вас есть замыкания, которые являются первоклассными функциями. Они существуют, и ими можно программно управлять во время выполнения.Такого нет (пока) в java.

Для меня граница «первоклассный / не первоклассный» не совсем строгая. Иногда бывает трудно произнести некоторые языковые конструкции, например примитивные типы java. Мы могли бы сказать, что это не первый класс, потому что это не объект и им нельзя управлять через ссылку, которую можно передать, но примитивное значение все еще существует и им можно манипулировать во время выполнения.

PS: Я согласен с Норманом Рэмси, и ценность второго и третьего класса для меня не имеет смысла.

4
ответ дан 29 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: