Является ли C открытым исходным кодом? - PullRequest
72 голосов
/ 24 февраля 2011

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

Ответы [ 9 ]

127 голосов
/ 24 февраля 2011

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

Однако существует множество разных компиляторов для C, и многие из них действительно имеют открытый исходный код. Наиболее ярким примером является компилятор C GCC , который находится под общей публичной лицензией GNU 1008 *, лицензией с открытым исходным кодом.

Есть еще варианты. Watcom , например, с открытым исходным кодом. Нет недостатка в компиляторах C с открытым исходным кодом, но, без сомнения, самым распространенным, по крайней мере в мире, отличном от Windows, является GCC.

Для Windows лучше всего выбрать Watcom или GCC, используя Cygwin или MinGW .

27 голосов
/ 24 февраля 2011

C - это стандарт, который определяет, как компиляторы C должны генерировать программы.
Сам по себе C не имеет исходного кода, так же, как музыкальная нота не имеет пластика.

Некоторые компиляторы C, такие как GCC, имеют открытый исходный код.

10 голосов
/ 24 февраля 2011

C - это просто язык, причем тоже стандартизированный.Это в значительной степени компилятор, который "делает всю работу".У разных компиляторов были разные диалекты;до стандарта ANSI C99 у вас были такие вещи, как Borland C и другие конкурирующие компиляторы, которые реализовали язык C своими фантастическими способами.

stdlib - это просто согласованная коллекция стандартных библиотек, которыедолжен присутствовать в любой реализации ANSI C.

4 голосов
/ 24 февраля 2011

Чтобы добавить к другим замечательным ответам:

Относительно различных диалектов - в C добавлены некоторые дополнительные функции, которые зависят от компилятора.Вы можете предоставить gcc флаг командной строки -std=..., чтобы указать стандарт C, который вы хотите использовать, у каждого есть небольшие изменения / дополнения к синтаксису, наиболее распространенным является, вероятно, c99.

Каждый компилятор имеет тенденцию реализовывать несколько различных дополнений, например, typeof() не входит в стандарт C, и поэтому компиляторы не должны реализовывать это, но, тем не менее, это полезно, и большинство компиляторов предоставляют его.Вот список расширений gcc C

Stdlib - это набор функций, определенных в стандарте C.Как и компиляторы, stdlib может иметь разные реализации.Реализация GNU является открытым исходным кодом, как и gcc, но есть другие компиляторы и могут быть другие реализации stdlib с закрытым исходным кодом.

3 голосов
/ 24 февраля 2011

Компилятор определит все сопоставления от C до Assembly и т. Д. ... но если кто-то владеет им ... никто не владеет C, однако ANSI / ISO определяет стандарты

2 голосов
/ 24 февраля 2011

компилятор GCC C написан на C. Итак, мы знаем, что по крайней мере один C компилятор написан на C.

GNU stdlib (glibc) также написано на C (stdio.h, stdlib.h). Но в нем также есть некоторые части, написанные на ассемблере.

1 голос
/ 24 февраля 2011

Хельги Храфн Гуннарссон написал основной ответ, но я подумал, что стоит отметить, что вы также можете эффективно закончить с диалектами.

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

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

1 голос
/ 24 февраля 2011

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

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

0 голосов
/ 07 апреля 2017

Я бы сказал, что C как язык не является открытым исходным кодом. Как отмечают многие, вы можете скачать лицензионные компиляторы и библиотеки GNU бесплатно, но если вы хотите написать свой собственный компилятор C, вам нужно будет следовать стандартам ISO C, а ISO взимать наличные за спецификацию языка C , что на момент публикации это $ 178. Поэтому на самом деле ответ зависит от того, какие элементы вы заинтересованы в том, чтобы быть свободным и открытым исходным кодом.

...