Динамические языки против статических языков (могут ли эти два быть вместе в одном месте)

StackOverflow https://stackoverflow.com/questions/1801894

Вопрос

Языки программирования сгруппированы в два основных класса: «Динамический» и «Статический».- Всегда ли язык программирования находится в одном из них, а не в обоих? Я имею в виду, может ли язык быть динамическим и статическим одновременно?

Это было полезно?

Решение

Различие статический и динамический язык весьма неоднозначен, поскольку может относиться к множеству различных (более или менее подходящих) критериев.Постараюсь ответить по каждому случаю:

Интерпретация/Компиляция

Это зависит не от самого языка, а только от используемой реализации.Поэтому языки могут выполняться как через интерпретатор, так и через компилятор.Примеры

  • Haskell (GHC/GHCI/Hugs)
  • С++ (Г++/Ч)
  • Ф#

Некоторые компилируемые языки также имеют возможность компилировать свой код во время выполнения (.NET).

Статическая/динамическая типизация

Статическую и динамическую типизацию (уточную типизацию) можно комбинировать в одном языке.См. C# dynamic, ВБ с Опция Явный/Строго выключенный или Бу.Структурная типизация может использоваться для формулирования строгой типизации без явных иерархий типов.Полиморфные базовые типы (System.Object) также поддерживают некоторое динамическое поведение, хотя тип задается статически.

Метаконструкции (например,Отражение, генерация типов во время выполнения)

Доступны также в Java и .NET.

Функциональные методы (напр.Функции высшего порядка, продолжения)

Может быть воспроизведено и на статически типизированных языках.См. Haskell или Scala.

Другие советы

C # 4.0 - это язык статического типа, который поддерживает динамический разрешение также. Ключевое слово dynamic в основном говорит компилятору: пока не беспокойтесь об этом. Если он не может разрешить тип во время выполнения, генерируется исключение.

Objective-C является еще одним примером. Это строгий надмножество C, а C статически типизирован. Но «объективный» вещи могут быть полностью динамическими (все объекты объявлены как type id ). Компилятор выполняет некоторую статическую проверку типов объектов Objective-C, хотя она ограничена, поскольку многие стандартные методы возвращают id . Например, коллекция NSArray возвращает объекты типа id , поэтому компилятор не может перехватить:

NSMutableArray *a = [NSMutableArray arrayWithObject:@"I am a string"];
NSNumber *n = [a objectAtIndex:0]; //assigning a string to a number!

хотя это может пометить, NSNumber * n = @ " я строка " во время компиляции.

Да.Возможно одновременное использование статики и динамики.

Если кто-то использует C#, то мы находимся на статическом пути и в движении используем новый System.linq.Expression tree API в VS 2010 (.NET 4.0).Мы ориентируем наш код на инфраструктуру под названием DLR (Dynamic Language Runtime), которая находится на уровне выше CLR.

Даже наш код, созданный expression class также может использоваться другими динамическими языками, такими как IronPython и т. д.

Точно так же мы можем использовать железный код Python поверх CLR.Все, что нам нужно, — убедиться, что они создают дерево выражений и нацелены на DLR.

  

может ли язык быть динамическим и статичным одновременно?

Динамический и статический относятся к разным вещам довольно расплывчато. В частности, языки могут быть статически или динамически типизированы, что означает, что проверка типов либо в некоторой степени принудительно выполняется при компиляции, либо полностью откладывается на время выполнения. Но люди часто называют язык «динамическим». потому что он имеет REPL, поэтому определения и выражения могут оцениваться в интерактивном режиме. Действительно, F # - это язык со статической типизацией, который был признан лучшим динамическим языком в опросе. Динамический также может относиться к способности делать самоанализ / рефлексию.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top