Почему C не динамический язык? - PullRequest
6 голосов
/ 06 ноября 2010

Как я знаю, в C мы можем использовать указатель на функцию, и она вызывается во время выполнения (1).

По определению из википедии:

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

Итак, мой вопрос: почему C не является динамическим языком, обеспечивающим функцию в (1)?

Ответы [ 5 ]

5 голосов
/ 06 ноября 2010

Поскольку функция в указателе функции все еще компилируется во время компиляции.

Вы не можете добавить новую функцию или изменить функцию "на лету" во время выполнения.

3 голосов
/ 06 ноября 2010

Полиморфное поведение не делает динамический язык.Вообще говоря, кто-то, ссылаясь на «динамический язык», ссылается на его систему типов.PHP является динамическим языком, потому что любая переменная может содержать любые данные, и преобразования между типами данных обрабатываются неявно.Определение того, что и когда преобразовывать, производится во время выполнения.

Кроме того, я думаю, что C не соответствует части "1003 * высокого уровня языков программирования" в приведенном вами определении.

1 голос
/ 06 ноября 2010

Язык обычно считается динамическим из-за его системы типов. C статически типизирован. Это означает, что каждая переменная имеет тип, назначенный ей при создании, и этот тип не может быть изменен. Вы не можете поместить данные с плавающей точкой в ​​указатель типа int *. В динамическом языке, таком как Python, данные имеют тип, а переменные - нет. Я могу присвоить строку той же переменной, что и целое число.

Определение, на которое вы ссылаетесь, также говорит о динамическом программировании, то есть добавлении кода во время выполнения. В C невозможно, не думая с точки зрения сборки, добавить новый код после времени компиляции. Ваша программа не может решить, что ей нужна новая функция во время ее выполнения. На таком языке, как Scheme, он может.

* Приведение не учитывается, поскольку вы явно конвертируете тип.

1 голос
/ 06 ноября 2010

Вы можете назначить указатель только на функцию, которая существует во время компиляции. Вы не можете скомпилировать новую функцию в середине программы на C и назначить указатель на эту функцию.

0 голосов
/ 06 ноября 2010

C не является языком высокого уровня, это очень низкий уровень.

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

Как правило, динамические языки, запускаемые поверх некоторых виртуальных машин, таких как JVM или CLR, интерпретируются как Python или используют исполняемый стек, то есть Haskell, для обеспечения функциональности. Напротив, C компилируется непосредственно в машинный код.

Существуют способы заставить C самостоятельно изменяться, но это очень сложный метод, который на самом деле не считается «динамическим языком».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...