Как мы определяем, что язык является динамическим или статическим?пример Swift - PullRequest
0 голосов
/ 18 марта 2019

Я читал некоторые посты, и это всегда сбивает меня с толку.

1, некоторые говорят, что язык статичен / динамичен в зависимости от того, как определяется type во время выполнения или во время компиляции.Но стоит ли говорить, что язык static/dynamic typing language, а не static/dynamic language?

2, в некотором сравнении swift vs target-c.Мы знаем, что target-c использует свою среду выполнения для динамической отправки методов.И некоторые используют это как причину, чтобы сказать, что language/objective-c is dynamic, это правда?!

3, меня иногда смущает полиморфизм ООП, некоторые говорят, чтобы заставить его работать, язык ХАСподдерживать метод динамической диспетчеризации.Это правильно?

4, для swift, я знаю, что это язык статической типизации, но это статический или динамический язык диспетчеризации методов?и это статический или динамический язык в целом ??

Ответы [ 2 ]

1 голос
/ 18 марта 2019
  1. Я никогда не слышал о термине «статический язык» или «динамический язык».Обычные термины, о которых я слышал, это «язык со статической типизацией» или «язык с динамической типизацией».

  2. «Динамический» не является определенным термином в этом контексте, поэтому не так многосказать здесь.

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

  4. Swift являетсястатически типизированный язык, насквозь.Это может быть немного затенено выводом типа.Если у вас есть выражение вроде

    func someFunction() -> Int { return 123 }
    let x = someFunction()
    

    Вывод типа не означает "x имеет некоторый тип, который будет вычислен во время выполнения".Наоборот, это означает, что «тип x может быть выведен во время выполнения, потому что мы уже знаем тип someFunction

    Все типы в Swift известны во время компиляции.В худшем случае, по крайней мере, должен иметь тип Any, который по-прежнему является типом.Это не особенно полезный тип (потому что Any гарантированно не сможет это сделать, но это все еще тип.

    Существует некоторая путаница в том, что во время компиляции говорят о типахи типы времени выполнения. Вот пример:

        class Car {
            func vroom() { print("vroom")}
        }
    
        class SportsCar: Car {
            override func vroom() { print("VROOOOOM")}
        }
    
        let car: Car = SportsCar()
    
        func driveSportsCar(_: SportsCar) { print("driving") }
        // Compile types are what determine usage compatibility
        driveSportsCar(car) // ? cannot convert value of type 'Car' to expected argument type 'SportsCar'
    
        // Runtime types are what determine method implementations
        car.vroom() // => "VROOOOOM"
    

    В этом примере car имеет тип времени выполнения Car и тип времени выполнения SportsCar. Тип времени компиляции определяет, как он можетиспользовать, где это может быть передано, и т. д. Например, вы не можете передать car функции driveSportsCar(), потому что, хотя ее тип времени выполнения равен SportsCar, его тип времени компиляции равен Car, чтонесовместим.

    Тип объекта - это то, что определяет реализации метода, которые будут вызваны.

1 голос
/ 18 марта 2019
  1. Swift является статически «типизированным» языком, что означает, что он выполняет проверки типов перед выполнением.
  2. Swift использует прямую диспетчеризацию, диспетчеризацию таблицы со своей таблицей-свидетелем или диспетчеризацию сообщений (obj-c) в зависимости от различных ситуаций. Вы можете взглянуть на эту статью: https://www.raizlabs.com/dev/2016/12/swift-method-dispatch/ некоторые примеры устарели, но концепции станут более понятными
  3. Статическая диспетчеризация не поддерживает полиморфизм, поскольку ей необходимо знать, какая реализация метода будет выполнена во время компиляции. Надеюсь, это немного поможет.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...