Спецификация языка C# "Реализация программы", по-видимому, неправильно определена

В спецификации языка C# Программа определяется как

Запрограммируйте ввод для компилятора.

В то время как приложение определяется как

Приложение сборка с точкой входа

Но они определяют

Реализация программы - выполнение заявки.

Учитывая определение "Программы", не должно ли это быть...

Реализация приложения - исполнение приложения.

вместо?

3 ответа

Решение

Насколько я могу судить, этот термин не встречается в версии спецификации Microsoft. Аннотированная спецификация ECMA имеет эту аннотацию после "Программы":

Программы, сборки, приложения и библиотеки классов
Это определение программы отличается от общего использования. В C# программа - это просто ввод в компилятор. Выход компилятора - это сборка, которая является приложением или библиотекой классов.

Других аннотаций поблизости нет. Это кажется несколько странным, и, возможно, именно поэтому его нет в спецификации MS.

Нет.

Это определения, поэтому они могут быть тем, кем хотят. Ваша ошибка в попытке найти семантическую ссылку в слове programтам, где его нет. Они, как вы заметили, не связаны.

Они говорят: "Вот как мы используем этот термин"; в принципе, нет ничего плохого в выборе какого-либо термина, при условии, что определения согласуются. foo, bar, а также baz было бы так же правильно, как program instantiation, Пока имена внутренне непротиворечивы, а определения верны, имена могут быть любыми. Они просто ярлыки.

Кто-то в Microsoft, очевидно, думал, что более важно, чтобы термин program instantiation отражаться в его обычном использовании. Семестр program вероятно, не получили такого же обращения, но, опять же, они просто имена. И имена "атомные": слово program не имеет никакого отношения к термину program instantiation,


Так как они просто ярлыки, их термины могут быть заменены на что угодно. Одна возможность:

X = вход в компилятор.

Y = сборка с точкой входа

Z = выполнение Y,

Замена любого из имен чем-либо другим не имеет значения в их использовании.

Если я заменю приведенное выше определение Z с новым сроком XY:

XY = выполнение Y

это все еще имеет место. Это просто метка, она получает семантическое содержание из определения, а не от своего имени. XY не имеет никакого семантического отношения к Xи это отношение к Y это только случайно.


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

Есть целая ветвь философии, посвященная таким вопросам, и возникновение "конфликта" в том смысле, что вы цитируете, в значительной степени неизбежно.

Автор спецификации C# сделал свой выбор, и пока он внутренне непротиворечив, он "правильный".

Исходя из заданного ввода, то, что выводит компилятор, остается программой, только в формате сборки / приложения, так что это:

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

Я сделаю смелый шаг здесь и скажу, что мы могли бы удалить себя из такого специфического контекста и посмотреть доступное определение использования на английском языке дляProgram:

  1. (6) Набор закодированных инструкций, который позволяет машине, особенно компьютеру, выполнять желаемую последовательность операций.
  2. (7) Последовательность команд в запрограммированной инструкции.

И то, что вводится в компилятор, и то, что выводится, может быть помечено выше.

Но на самом деле мне придется проголосовать, чтобы закрыть, так как это вопрос относительно семантики английского языка.

Другие вопросы по тегам