- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我们在 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版本似乎更接近程序员头脑中的原始想法:只是封装两个数字相加的行为并返回和。
另一方面,在实践中,这些类型声明对减少错误有很大帮助,例如,如果我只想要两个数字的和,我不会将字符串传递给“add”函数。如果我传递两个字符串,编译器会将其视为错误。在此示例中,类型声明似乎是对代码的保护。
但让我困惑的是,为什么这么多早期创建的语言需要变量的类型声明?为什么历史上大多数具有类型声明的语言出现得较早,而大多数具有简单语法版本的语言出现得较晚?
我知道我们无法判断哪种方法“更好”,而且它们都是图灵完备的,但我只是好奇为什么早期的语言创建者没有选择更直观和更简单的语法,即专注于实现功能 100%,但选择添加类型标识符作为语言的必需部分(问题 1)?另外,在早期,人们对代码应该是什么样子的印象非常模糊,所以我猜类型标识符的想法必须来自某个地方。我的第二个问题是类型声明的想法从何而来(数学?实践?还是其他地方?)?我想如果我知道答案的话我会对“类型”有更好的理解。
最佳答案
可以说,数据类型的概念从一开始就存在于编程语言中。最早的语言是机器语言,甚至对于那些机器语言来说,无论是添加整数还是添加 float ,它都可能是相关的。不过,类型的区别是通过使用不同的指令来实现的。
第一种更高级的语言是 Fortran(20 世纪 50 年代中期)。 Fortran 区分变量类型,但不是根据类型声明来区分,而是根据变量名称来区分。例如,变量 i、j k 等将为整数,而 p、q、r 为 float (IIRC)。这允许使用相同的方便的符号,例如另外,无论是什么类型。
显然,这是一个相当老套的想法,并且无法扩展到任何更有趣的类型系统。因此,下一代语言,特别是 Algol(20 世纪 50 年代末),使这一点更加明确,并引入了类型语法。
随着语言变得更加高级并支持更有趣的数据类型,类型系统也变得更有趣。在某个时候(1970 年左右),人们意识到编程语言中的类型实际上与数学中已知的类型概念非常密切相关:即 20 世纪 30 年代发明的类型化 lambda 演算。事实上,人们意识到计算逻辑和编程语言之间的关系实际上在各个层面上都极其密切,并且编程语言可以解释为 lambda 演算的变体,这就是大多数现代编程语言理论(和设计)的内容确实如此。
无类型(或所谓的“动态类型”,明显滥用术语)编程语言也相当古老。第一个是 Lisp(20 世纪 50 年代末),它实际上已经从无类型 lambda 演算中获得了灵感。然而,这种语言直到很久以后才开始流行。原因是它们在运行时系统中需要昂贵得多的机器,这在早期的计算中是负担不起的,而且在今天通常仍然是负担不起的。 (最近对此类语言的炒作似乎有所减弱,因为(重新)发现这种开发形式不能很好地扩展——现在为这些语言发明的所有类型系统都证明了这一点: Scheme、TypeScript、MyPy、Hack 等)
编程语言部分从逻辑中获得的另一个灵感是类型推断。即使最初发明类型化 lambda 演算时,也已经有两种形式:显式类型化和隐式类型化。函数式语言 ML 是第一个采用与编程类似的思想的语言(20 世纪 70 年代末):ML 程序经过完全类型检查,无需编写单个类型声明。最近,这个想法已经进入主流语言,尽管通常以更加有限的方式。
这意味着类型化和非类型化之间的区别不一定与语法和类型声明的存在相关——语言可以是(“静态”)类型化的并且不需要类型声明。
关于types - 编程语言中的类型声明从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26071886/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!