2014-09-27 4 views
2

Когда мы определим функцию в C/C++, мы вводим что-то вродеОткуда появляется объявление типа в языках программирования?

int add(int a, int b){ 
    return a+b; 
} 

Однако реальная вещь, которую мы делаем в функции, чтобы получить сумму двух суммируемых вещей и возвращает его значение. Во многих ранних языках программирования, таких как Algol, C, pascal, вы должны объявить тип переменной перед выполнением некоторых операций над ней. Кроме того, это требуется на довольно многих основных языках, таких как Java, C# (хотя у него есть такие ключевые слова, как «var»).

Во многих языках динамического программирования, как Python, перепишем предыдущую функцию:

def add(a,b): 
    return a+b 

без «идентификатор типа» функции и аргументов. Я думаю о том, что по сравнению с такими языками, как C/C++, версия Python, по-видимому, ближе к первобытной идее в уме программиста: просто инкапсулируйте поведение добавления двух чисел вместе и верните сумму.

С другой стороны, на практике эти объявления типов помогают мне с уменьшением ошибки, например, я не буду передавать строку в функцию «добавить», если я просто хочу получить сумму двух чисел , Если я передаю две строки, компилятор будет рассматривать это как ошибку. Объявление типа, похоже, является защитой кода в этом примере.

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

Я знаю, что мы не можем сказать, какой подход «лучше», и они оба являются завершающими, но мне просто интересно, почему раньше разработчики языка не выбрали более интуитивно понятный и симуляторный синтаксис, который фокусируется на реализации функция 100%, но предпочла добавить идентификатор типа в качестве искомой части языка (вопрос 1)? Кроме того, в раннее время люди имеют очень неявное впечатление о том, какой код должен выглядеть, поэтому я предполагаю, что идея идентификатора типа должна откуда-то. Мой второй вопрос: откуда возникает идея объявления типа (математическая практика? Или где-то еще?)? Думаю, у меня будет лучшее понимание «типа», если я знаю ответ.

ответ

4

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

Первым более высокоуровневым языком был Fortran (середина 1950-х годов). Фортран выделял типы переменных, но вместо того, чтобы делать это на основе объявлений типа, он делал это на основе имен переменных. Например, переменные i, j k и т. Д. Будут целыми числами, а p, q, r floats (IIRC). Это позволяет использовать одну и ту же удобную нотацию, например. дополнение, независимо от типа.

Очевидно, что это довольно хакерская идея и не масштабируется до более интересной системы типов. Итак, следующее поколение языков, в частности Algol (конец 1950-х), сделало это более явным и ввело синтаксис для типов.

С языками, становящимися более высокоуровневыми и поддерживающими более интересные виды данных, системы типов также стали более интересными. В какой-то момент (около 1970 года) было осознано, что типы в языках программирования на самом деле очень тесно связаны с понятием типов, уже известных из математики, а именно в типизированном лямбда-исчислении, изобретенном в 1930-х годах.Фактически, было осознано, что связь между вычислительной логикой и языками программирования на самом деле чрезвычайно близка ко всем уровням и что языки программирования можно объяснить как варианты лямбда-исчислений, что является самой современной теорией языка программирования (и дизайна) делает.

Нектопированные (или так называемые «динамически типизированные», в заметном злоупотреблении терминологией) языки программирования также довольно стары. Первым из них был Lisp (конец 1950-х), который на самом деле уже воодушевился от нетипизированного лямбда-исчисления. Однако такие языки не стали популярными до гораздо позже. Причина в том, что они требуют значительно более дорогостоящего оборудования в системах времени выполнения, что было нецелесообразно в первые дни вычислений, и часто до сих пор не существует. (Недавняя шумиха по поводу таких языков, похоже, немного угасает в наши дни, так как она (ре) обнаружила, что эта форма развития не очень хорошо масштабируется - свидетелями всех типов систем, которые сейчас изобретены для этих языков: Scheme, TypeScript, MyPy, Hack и т. Д.)

Другое вдохновение, что языки программирования частично взяты из логики btw - это вывод типа. Даже при типичном исчислении лямбда, где первоначально изобретено, существовали две формы: явно введенные и неявно введенные. Функциональный язык ML первым применил аналогичную идею к программированию (конец 1970-х годов): программа ML полностью проверена на типе без написания объявления одного типа. Совсем недавно эта идея появилась на основных языках, хотя обычно это гораздо более ограниченные возможности.

Следует отметить, что разница между типизированным и нетипизированным необязательно связана с синтаксисом и наличием объявлений типа - язык может быть («статически») типизирован и не требует деклараций типа.

+0

Спасибо, это именно то, что мне интересно. Кстати, мы часто видим обозначения, определяющие функции в математике, такие как f: R^2-> R, имеет ли это какое-то отношение с объявлением типа в программировании? – zhxchen17

+0

@ sorrow17, ну да, теория типов (в вычислительной логике) была изобретена как основополагающая теория математики, как теория множеств, поэтому она естественно заимствовала нотацию. Оттуда он, вероятно, нашел свой путь в языках программирования, например, в лямбда-исчислении вы должны были написать 'f: R × R → R', а в ML' f: real * real -> real' как аннотации типов. –

1

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

Причина - объем памяти. В то время программам, включая компиляторы, приходилось работать с очень ограниченным объемом памяти. Это имеет два прямых последствия:

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

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

Типовые декларации, по крайней мере на C, обеспечили решение обеих этих проблем.

+0

Хороший ответ, особенно «ссылка». Благодаря! – zhxchen17