Говоря о С, почему разработчики стандарта договорились о многословных идентификаторах? Это потому, что это был язык во время стандартизации.
Мандатом для первоначального стандарта было не создание нового языка, а кодифицировать существующую практику. В соответствии с самого стандарта C89:
Комитет оцениваемого много предложений для добавления, удаления и изменения базовых документов в ходе обсуждения. Были предприняты согласованные усилия по кодификации существующей практики везде, где можно было бы определить однозначную и последовательную практику. Однако в тех случаях, когда не может быть выявлена непротиворечивая практика, Комитет работал над установлением четких правил, которые согласуются с общим вкусом языка.
И из обоснования документа C99:
оригинального X3J11 устав четко уполномочена кодификация общей существующей практики, и C89 Комитет провел быстро прецедент, где это было ясно и однозначно. Подавляющее большинство языков, определенных C89, было точно таким же, как определено в Приложении A первого выпуска языка программирования C Брайаном Керниганом и Деннисом Ритчи, и это было реализовано почти всеми переводчиками того времени.
Кроме того, каждая итерация стандарта имеет высокую ценность обратной совместимости, так что код не прерывается. Из этого же документа обоснования:
Существующий код важен, существующих реализаций нет. Большая часть кода C имеет значительную коммерческую ценность. Сделаны все попытки обеспечить, чтобы основная часть этого кода была приемлема для любой реализации, соответствующей Стандарту.Комитет C89 не хотел, чтобы большинство программистов модифицировали свои программы на С только для того, чтобы их приняли переводчик.
Таким образом, в то время как более поздние версии стандарта дали нам такие вещи, как stdint.h
с его фиксированной шириной целыми типами, забирая стандартные, как int
и long
бы грубое нарушение этого руководства.
С точки зрения C++, это почти наверняка пережиток с первых дней этого языка, где он был выдвинут в качестве «C плюс классы». Фактически, очень ранний компилятор cfront
C++ был назван так потому, что он взял исходный код C++ и превратил его в C, прежде чем предоставить его подходящему компилятору C (т. Е. Переднему концу для C, следовательно, cfront
).
Это позволило бы оригинальному автору Bjarne свести к минимуму рабочую нагрузку при доставке C++, поскольку основная ее часть была предоставлена самим компилятором C.
С точки зрения синтаксического анализа языка, это, безусловно, сложнее придется обрабатывать unsigned long int x
(а) чем обрабатывать ulong x
.
Но, учитывая, что компилятор уже должен обрабатывать большое количество необязательных «модификаторов/спецификаторов» для переменной (например, const char * const x
), обработка нескольких других является номинальной для курса.
(а) Или int long unsigned x
или long unsigned x
или любого другого типа спецификаторы, что в конечном итоге становится сингулярной unsigned long int
типа. См. here для более подробной информации.
C++ имеет его, потому что он начинался как расширение C, которое имело его с самого начала (кроме 'long long', которое было введено на C99). Возможно, лучше перефразировать вопрос, применимый к C. –
Он может либо сделать лексический анализатор более сложным, либо парсером, но не самой системой типов. И даже в этом случае синтаксический анализ не намного сложнее: парсер видит токен 'long', а затем проверяет следующий токен, как обычно. Это идентификатор? Звездочка? Другой «длинный» токен? Что-то еще действительное или недействительное? На самом деле ничего серьезного. –
@JoachimPileborg C сложно разобрать, поскольку имена типов, а не простые маркеры типа, определяют структуру фразы. Если вы не берете строгое подмножество C, вы не можете по-настоящему разделить парсинг (например, деклараций) и интерпретацию (определения типов). –