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

  • «Python строго динамически типизирован»
  • «JavaScript имеет слабую динамическую типизацию»

Прочитав эту статью, вы сможете четко понять приведенные выше утверждения. Мы рассмотрим фрагменты кода на Python, JavaScript и C ++. Если вы не знаете синтаксиса или какого-либо из языков, ничего страшного, вы все равно сможете понять основные концепции.

Оглавление

  • Некоторые определения и моменты, которые следует запомнить
  • Скомпилированные и интерпретируемые языки
  • Статический набор текста против динамического набора текста
  • Слабый набор текста против сильного набора
  • Классификация языков программирования
  • Вывод

Некоторые определения и моменты, которые следует запомнить

  • Слово «типизация» в статической / динамической типизации относится к ДАТАФИКАМ. Это не относится к нажатию клавиш. Я был сбит с толку и уверен, что в той же лодке могут быть и другие
  • Языки программирования классифицируются как статические / динамические типы и сильные / слабые типы на основе двух разных свойств, т.е. статическая / динамическая типизация не связана с сильной / слабой типизацией.

Определения

  • Исходный код - это код, написанный на Python, JavaScript, C ++ и т. д., также известный как читаемый человеком код.
  • Машинный код - это код, который написан на машинном языке (обычно двоичном) и может быть понят Машиной.
  • Компилятор - компьютерная программа, которая может преобразовывать исходный код в машинный код.
  • Компиляция - преобразование кода Python, JavaScript, C ++ в машинный код низкого уровня. В основном преобразование удобочитаемого кода в машинный код

Предполагая, что компиляция прошла успешно, т.е. исходный код не содержит синтаксических ошибок, мы переходим к Runtime.

  • Время выполнения - после компиляции программа запускается, и код выполняется. Этот период времени известен как время выполнения.
  • Выполнение - фактический запуск / выполнение кода. Это происходит после преобразования исходного кода в машинный код и во время выполнения.
  • Ошибка синтаксиса - ошибка синтаксиса (грамматики) языка. Например: отсутствует точка с запятой в C ++, неправильный отступ в Python и т. Д.
  • Ошибки времени выполнения - ошибка времени выполнения - это ошибка, которая возникает во время выполнения программы, например: деление на 0, попытка доступа к неопределенной переменной, использование оператора для несовместимых типов данных.
  • TypeCasting - преобразование значения из одного типа данных в другой, например: char можно преобразовать в int на основе его значения ASCII. Аналогичным образом число 10 можно преобразовать в строку «10». Приведение типов может быть неявным (выполняется языком автоматически) или явным (вы меняете тип вручную)

Скомпилированные и интерпретируемые языки

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

Я позаимствую эту аналогию из FreeCodeCamp.

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

  • Вы можете переводить каждый шаг один за другим, т.е. сначала ваш друг переводит шаг 1, а вы выполняете его. Затем вы переходите ко второму шагу, ваш друг переводит его, а вы следите за ним. И так далее…..
  • Вы переводите сразу весь рецепт, а затем следуете ему, то есть ваш друг переводит весь рецепт на английский язык. Теперь вы следуете этому шаг за шагом.

Первый подход аналогичен «Интерпретируемому», а второй подход аналогичен «Скомпилированному».

Устный перевод

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

Давайте рассмотрим пример на Python

Хотя наша функция имеет деление на 0 (ошибка времени выполнения), программа запускается / выполняется успешно. Поскольку мы никогда не вызываем функцию func, функция никогда не выполняется, и, следовательно, ошибка времени выполнения никогда не возникает.

Давайте рассмотрим аналогичный пример на JavaScript.

Как и Python, JavaScript также не вызывает ошибок. Программа выполняется успешно, поскольку мы никогда не вызываем функцию.

Примечание. Если вы вызываете функцию в любом из приведенных выше фрагментов кода, это приведет к ошибке.

Давайте рассмотрим еще один пример на Python.

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

Скомпилированные языки

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

Давайте рассмотрим фрагмент кода C ++.

В функции func мы присваиваем значение 10 переменной var без определения переменной (ошибка времени выполнения). Хотя мы не вызываем функцию, ошибка все равно возникает. «Hello World» не отображается в терминале.

Давайте рассмотрим еще один фрагмент

В отличие от Python или JavaScript, оператор cout не выполняется. Сначала весь исходный код преобразуется в машинный код, и возникает ошибка времени выполнения. В результате «Hello World» не отображается в терминале. Ошибка возникает, поскольку мы не определили переменную var

Статический набор текста и динамический набор текста

Статический ввод

В статически типизированных языках переменная имеет ФИКСИРОВАННЫЙ тип данных в течение своего жизненного цикла.

Проверка типа выполняется во время компиляции

Рассмотрим фрагмент кода C ++ ниже

Первоначально мы объявляем переменную var1 как int и присваиваем ей целочисленное значение. Но позже мы переназначаем ему строку. C ++ - это язык со статической типизацией, который не поддерживает такое поведение.

Например: C, C ++, Java, Rust, Go, Scala.

Динамический набор текста

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

Проверка типа выполняется во время выполнения

Давайте попробуем сделать то же самое, что и выше, но на языке с динамической типизацией, таком как Python.

Изначально переменная var1 - это целочисленная переменная. Однако позже мы присваиваем строковое значение, и тип данных переменной изменяется. Язык с динамической типизацией, такой как Python, позволяет нам изменять тип данных переменной.

Давайте сделаем нечто подобное в JavaScript, другом языке с динамической типизацией.

Примечание: если вы используете ключевое слово const, вы не можете изменить тип данных переменной. Постоянные значения не могут быть переназначены, поэтому в некотором смысле их тип данных является статическим. Однако Java Script - это язык с динамической типизацией, поскольку тип данных ПЕРЕМЕННОЙ может изменяться в течение его жизненного цикла.

Например: Perl, Ruby, Python, PHP, JavaScript.

Слабый и сильный набор текста

Слабый набор текста

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

Давайте рассмотрим фрагмент кода на C ++.

Значение ascii для a - 97. Когда мы пытаемся выполнить 10 + a, C ++ неявно преобразует a в его значение ascii (97). Следовательно, на выходе получается 107.

Давайте сделаем что-нибудь подобное в JavaScript.

JavaScript преобразует число 10 в строку «10» и объединяет его в a.

Например: C / C ++, JavaScript, PHP, Perl.

Сильный ввод

Строго типизированные языки НЕ поддерживают операции между разными типами данных. Они могут или не могут поддерживать приведение типов. Однако они не выполняют неявного преобразования типов.

Давайте рассмотрим фрагмент кода на Python. Мы постараемся сделать то же самое, что и выше.

Когда мы пытаемся сложить целое число и строку, мы получаем ошибку типа. Это делает Python сильным типом. Однако обратите внимание, что можно явно привести целое число к строке и выполнить операцию.

Например: Python, C #, Java, Scala, Ruby.

Классификация языков программирования

Вывод

Надеюсь, я смог объяснить термины и то, как язык определяется как компилируемый / интерпретируемый, статический / динамический, слабый / сильный. Знание этих свойств языка позволит вам узнать, чего ожидать, начиная с этого языка. Пожалуйста, дайте мне знать, если вы обнаружите какие-либо ошибки или какие-либо хорошие аналогии, чтобы объяснить разницу :)

Свяжитесь со мной в LinkedIn, Twitter