Варианты классификации:
Наиболее категоричное – типизированные и нетипизированные.
Типизированные языки, в свою очередь классифицируются:
По моменту проверки типов
Языки со статической типизацией
требуют явного указания типов. К ним относятся, например, C, C++, C#, Java.
определяют (выводят) типы большинства выражений автоматически, и требуют явного аннотирования только в сложных и неоднозначных случаях. К ним относятся, например, Haskell и OCaml.
По строгости типизации
неявно конвертируют один тип в другой, скажем, строки в числа и наоборот. Это может быть удобно в некоторых случаях, однако многие программные ошибки могут быть пропущены. Усложняется отладка. Например Perl, JavaScript, C.
не позволяют неявную конверсию, и требуют явной. Дают сильные гарантии типобезопасности, но код может становиться крайне многословным. Например C++, Java, Haskell.
Сильно зависит от современных представлений о “высоком уровне абстракции”
Компилируемые, транс-компилируемые или интерпретируемые.
Поколение – несколько условная характеристика, которая в значительной мере связана с историей появления современных языков программирования.
Определение несколько расплывчато. Ещё более высокий уровень абстракции.
попытка разработать класс языков, которые “пишут программы сами”
Любая вычислимая функция может быть представлена комбинацией трёх управляющих структур: