Связь между языками программирования - PullRequest
18 голосов
/ 26 марта 2011

Меня интересовали следующие вопросы:

  1. Что это значит " какой-то язык подмножество / надмножество другого"? Может это будет определено в математике? Это связанные с подмножеством / надмножеством понятие в теории элементарных множеств?
  2. Почти все существующие языки реализовано / написано в некоторых небольших количество языков низкого уровня? За Например, написано ли большинство языков в С? C ++ написан на C?

    Есть ли какая-то связь между отношение реализации и понятие подмножества / надмножества языки?

  3. С точки зрения языковых особенностей, некоторые Языки имеют больше, чем некоторые другие. В некоторых случаях в некоторых есть все особенности некоторых других, например, C ++ обладает всеми функциями C?

    Есть ли какая-то связь между отношение подмножество / надмножество с точки зрения набор функций и отношение подмножество / надмножество между языки?

  4. Существуют ли другие аспекты, которые охарактеризовать связь между языки?

Спасибо и всего наилучшего!

Ответы [ 4 ]

19 голосов
/ 26 марта 2011

Что означает «один язык является подмножеством / надмножеством другого»?

Синтаксически язык A является подмножеством языка B, если каждая программа, которая действительна на языке A, также действительна на языке B. Семантически это подмножество, если это синтаксическое подмножество, и каждая действительная программа A также показывает то же поведение на языке Б.

Можно ли это определить в математике? Связано ли это с понятием подмножества / надмножества в теории элементарных множеств?

Синтаксическое подмножество: если P_A - это набор всех допустимых программ на языке A, а P_B - это набор всех допустимых программ на языке B, то язык A - это точно синтаксическое подмножество языка B если P_A является подмножеством P_B.

Семантическое подмножество: пусть A(p) будет функцией, которая описывает поведение программы p на языке A, а B(p) описывает поведение программы p на языке B. A является подмножеством B, если и только если для всех p, для которых определено A(p), также определено B(p) и A(p) = B(p).

Практически все существующие языки реализованы / написаны на небольшом количестве языков низкого уровня?

Конечно, это зависит от вашего определения «почти все», но я склонен сказать «нет». Многие компиляторы и интерпретаторы написаны на C и C ++ (просто потому, что много программного обеспечения в целом реализовано на C и C ++), но далеко не все.

Например, большинство языков написано на C? C ++ написан на C?

Как уже отмечалось в комментариях, C ++ - это язык, а не часть программного обеспечения. g++, который является компилятором GNU C ++, написан на C, но есть также компиляторы C ++, написанные на разных языках (возможно).

С точки зрения языковых возможностей, некоторые языки имеют больше, чем другие. В некоторых случаях некоторые имеют все возможности других, например, имеет ли C ++ все функции C?

Да (если не считать простоту как функцию).

Существует ли какая-либо связь между отношением подмножество / надмножество в терминах набора признаков и отношением подмножество / надмножество между языками?

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

Однако это не применимо в другом направлении (т. Е. Только потому, что функции A являются расширенным набором функций B, A не обязательно должно быть расширенным набором B).

4 голосов
/ 26 марта 2011

Я хотел подобрать это:

Почти все существующие языки реализовано / написано в некоторых небольших количество языков низкого уровня? За Например, большинство языков написано на C? C ++ написан на C?

Насколько я знаю, на практике почти все языки, которые возникли после C, написаны на C из-за огромной популярности C в течение определенного периода времени, пока они не будут готовы реализовать свои собственные компиляторы. Большинство языков, которые компилируются в нативный код, реализуют сами себя, то есть современные компиляторы C ++ написаны на C ++. Это достигается путем компиляции нового компилятора с предыдущей версией компилятора, которая, как известно, является хорошей, - компилятором LKG или «Last Known Good». Я точно знаю, что компилятор Visual C ++ сделан таким образом, и я вспоминаю, что есть IDE на Haskell, которые также выполняются, и даже PROLOG. Первоначальный компилятор C ++ был написан на C-, но, поскольку C ++ стал мощным языком общего назначения, люди написали на нем компиляторы C ++.

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

Есть ли какая-то связь между отношение реализации и понятие подмножества / надмножества языки?

Да, есть. Если вы внедряете C #, зачем отказываться от многолетнего опыта C ++ по быстрому вызову полиморфных функций? Проще всего было бы просто вернуться к этой реализации, и, насколько я понимаю, в C #, работающем на платформе .NET, именно так и происходит - они используют реализацию, взятую в основном из C ++. Если вы реализуете языковую функцию, которая уже существует на определенном языке, вы теряете опыт и инновации, если внедряете новую реализацию с нуля. Конечно, это отличается, если эти реализации являются частными или что-то в этом роде, но в целом.

Есть ли другие аспекты, которые охарактеризовать связь между языки?

Да, есть. Наиболее очевидным является синтаксический - рассмотрим синтаксические отношения между C, C ++, C # и Java, хотя Java и C # явно не являются надмножествами C. Затем рассмотрим подход к основным проблемам в разработке программного обеспечения. Например, Java и C # являются статически типизированными языками для сборки мусора, основанными на виртуальных машинах. Тогда вы могли бы рассмотреть ошибки дизайна. На мой взгляд, ошибки проектирования - это один из самых больших намеков на то, что два языка гораздо более тесно связаны, чем они должны быть. Здесь вы можете снова рассмотреть Java и C #. Ковариантные массивы сломаны. Giraffe[] не является Animal[], но и Java, и C # допускают преобразование. Это явная ошибка проектирования, но оба языка имеют ее, что является признаком того, что они слишком тесно связаны.

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

3 голосов
/ 26 марта 2011

Существует строгое определение для формальных языков - язык L1 является подмножеством языка L2 тогда и только тогда, когда каждая правильно построенная формула L1 является корректно сформулированной формулой L2.

В случае языков программирования «правильно сформированная формула» означает синтаксически допустимую программу, и вы можете или не хотите, чтобы ваше определение «подмножества» говорило не только о том, что действительная программа L1 также является действительной программой L2, но также и то, что он имеет ту же семантику в L2, что и в L1. Поскольку C и C ++ имеют семантическое представление о неопределенном поведении, вы также можете сказать, что для того, чтобы L1 был подмножеством L2, необходимо, чтобы каждая синтаксически допустимая программа с определенным поведением была действительной в L2 с таким же определенным поведением - не обязательно, чтобы каждая программа с UB в L1 также имела UB в L2. Формальные языки не определяют семантику, только грамматику, поэтому это не является частью первого определения.

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

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

2 голосов
/ 26 марта 2011
  1. Хотя термин и общая концепция происходят из теории множеств (и если вы определили язык программирования как число множеств, вы можете взять термин литерал и увидеть отношения подмножеств / надмножеств между некоторыми из этих множеств), для всехв практических целях определение гораздо более неформально: язык L1 - это расширенный набор языков L2, если программы, допустимые в L2, действительны и в L1.
  2. Не путайте языки с реализацией языка.C ++ - это просто абстрактная спецификация, но она реализована множеством способов - в первую очередь, вероятно, на C, а сегодня, вероятно, на C ++.Но, в принципе, да - поскольку первая реализация L не может быть написана на L, вы должны написать это в другом месте.Это что-то еще, обычно широко используемый, зрелый язык.В случае интерпретаторов / виртуальных машин это обычно C или C ++ для необработанной скорости и для контроля над управлением памятью.
  3. Очень редко "больше" или "меньше", всегда есть "другое".C ++ - это , построенный поверх C, поэтому, конечно, он обладает большинством своих возможностей.Но даже в этом случае у нас нет реального отношения надмножества, а не просто «дополнительных» возможностей - C ++ не имеет всех функций C (больше, по крайней мере) - просто подумайте о C99, массивах переменной длины, чтобы дать конкретныйпример.Чтобы быть полным надмножеством другого языка, язык, конечно, должен поддерживать все этого языка.В таком случае можно было бы говорить о том, что он имеет «больше» функций, я полагаю.
  4. Бесчисленное множество.Выберите, используйте свое воображение.Немногие из них полезны или интересны.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...