Введение в программирование системы типов.

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

Язык программирования Си ведет обработку любых элементов как чисел. Любые символы, например, такие как a или 7 или % могут быть представлены в виде числа благодаря ASCII кодировке, представляющей их “истинное” и “ложное” значение в виде комбинации всего из двух цифр: 1 и 0.

Язык программирования Cи определяет тип переменных, например, как int для целочисленных значений и char для символьных, но на самом деле, таким образом просто распределяется объем выделяемой для использования памяти. Чтобы получить доступ к переменным и организовать ввод их значения, мне нужно знать их тип.

int a = 1; printf("The number is %i\n", a); 
char z = 'z'; printf("The character is %c\n", z);

Когда я запускаю эту программу, она выводит на экран следующие значения:

The number is 1
The character is z

Функция printf  должна получить от нас информацию, чтобы знать, как форматировать переменную. Если я представлю неправильную информацию …

 char z = 'z'; printf("The character is %i\n", z); 

… тогда  получу следующий результат:

The character is 122

Cи не понимает к чему отнести букву z к символу или целому числу, этот язык программирования имеет слабую типизацию.

Слабая типизация обладает высоким быстродействием, потому что отсутствуют какие-либо запоминания других типов данных, но это также приводит к некоторым неприятным ошибкам. Отсутствует возможность форматирования символа z, если вы предварительно не задали его тип. Представьте себе доступ к переменной, которая просто значится под номером 1229799107. Данное число может быть результатом математического расчета (1229799107), стоимостью какой-нибудь государственной программы ($ 1,2 млрд), а также обычной датой (Суббота, 20 декабря, 2008 год). Если у вас есть только номер, вряд ли вам удастся узнать, что в действительности это код моего имени: zack.

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

(Изображение: Cris).

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

Слабая типизация Компоновочные языки не обладают возможностью определения или проверки типа данных. Любой тип данных воспринимается в виде чисел.
Слабая статическая типизация Язык программирования Cи позволяет определять типы объектов как структуры, но это не дает возможности обеспечить присвоение значений или запоминание. Cи автоматически конвертирует различные типы данных. Cи++ и Objective-C более усовершенствованны в плане инициализации данных, но до сих пор не обеспечивают присвоение полученное в результате типизации.
Сильная статическая типизация Java предполагает, что вы должны определить все типы данных и их проверку с виртуальным устройством.
Сильной динамическая типизация Python, JavaScript и Ruby способны к самостоятельному динамическому определению типов объектов, вместо того чтобы возлагать эту задачу на вас, а затем соблюдает эти типы данных, когда программа работает в интерпретаторе. Все динамически типизированные языки программирования нуждаются в мощной системе ввода во время выполнения программы, а иначе они не смогут обеспечить типизацию объектов.
Слабая динамическая типизация Динамически выведенные типы данных не работают в слабо типизированных языках, потому что невозможно идентифицировать тип вывода.

Ни один из языков программирования не подходит под описанные определения на все 100%. Язык программирования Java считается одним из самых статических языков, но в нем реализован комплексный механизм отображения программного интерфейса приложения (API), который позволяет изменять классы данных во время исполнения, таким образом, имеет больше сходства с динамическими языками. Эта функция позволяет виртуальному устройству Java поддерживать очень динамические языки, например, такие как Groovy.

Функциональные языки программирования такие как Lisp, Erlang и Haskell еще больше размывают границы определения.

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

Языки программирования со Слабой статической типизацией: Cи, Cи++ и Objective-C.

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

В Cи++ и Objective-C можно определить значение нашего номера (1229799107). Я могу инициализировать его как строку символов и убедиться, что никто не использует его в качестве валюты или даты. Компилятор обеспечивает его надлежащее использование.

Статическая типизация поддерживает объекты с набором функциональности, которые всегда работают строго определенным образом. Теперь я могу создать объект Person и убедиться, что getName функция всегда возвращает строку чьему-нибудь имени.

class Person { public: string getName() { return "zack"; } }; 

Сейчас я могу вызвать свой объект:

Person p; printf("The name is %s\n", p.getName().c_str()); 

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

Язык программирования Java сделал шаг вперед, добавляя проверку типа данных при выполнении кода в виртуальном устройстве.

языки программирования с Сильной статической типизацией: Java.

Cи++ предлагает использование некоторых методов, доступных для Cи; Java позволяет обеспечить такое использование. Java требует инициализации всех типов данных, поэтому вам заранее необходимо знать, какой тип объекта вы будете использовать, его функциональные возможности, которые будут доступны независимо от правильности вызова.

Также стоит отметить, что Java прекратила поддержку кода Cи и других способов выхода из статической типизации.

В Java объект Person выглядит практически так же :

public class Person {
    public String getName() {
        return "zack"; }
}

Я получил имя путем создания нового объекта и вызова функции getName, как в примере:

public class Main {
    public static void main (String args[]) {
        Person person = new Person();
        System.out.println("The name is " + person.getName());}
}

Этот код создает новый объект Person, присваивает ему переменную с именем person, вызывает функцию getName и выводит значение.

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

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

Популярность языка Java, его строгое соблюдение норм типизации оказали огромное влияние на развитие области программирования. Сторонники сильной типизации наперебой хвалили Java в качестве инструмента исправления недочетов в Cи++. Но многие …

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.