Связь между языками программирования

Мне было интересно узнать о следующих вопросах:

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

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

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

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

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

Спасибо и приветствую!

Ответ 1

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

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

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

Синтаксическое подмножество: если 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?

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

  • Хотя термин и общая концепция исходят из теории множеств (и если вы определили язык программирования как множество множеств, вы могли бы взять термин "литерал" и увидеть отношения подмножества/надмножества между некоторыми из этих множеств), для всех практических целей определение гораздо более неформальное: язык L1 является надмножеством языка L2, если программы, действующие в L2, также действительны в L1.
  • Не путайте языки с языковой реализацией. С++ - это всего лишь абстрактная спецификация, но она была реализована по-разному - возможно, сначала C, а впредь - на С++. Но в принципе, да, так как первая реализация L не может быть записана в L, вы должны записать ее во что-то еще. Что-то другое обычно является широко используемым, зрелым языком. В случае интерпретаторов/виртуальных машин это обычно C или С++ для необработанной скорости и контроля управления памятью.
  • Там очень редко "больше" или "меньше", всегда "разные". С++ построен поверх C, поэтому, конечно, он имеет большинство своих функций. Но даже в этом случае у нас нет реального отношения к суперсету, а не только "больше" функций. С++ не имеет всех функций C (больше, по крайней мере) - просто подумайте о C99, массивах переменной длины, чтобы дать конкретную пример. Чтобы быть полным надмножеством другого языка, язык, конечно, должен поддерживать весь этот язык. В этом случае, действительно, можно говорить о том, что у него есть "более" функции. Я полагаю.
  • Бесчисленные. Возьмите свой выбор, используйте свое воображение. Немногие из них полезны или интересны, хотя.