老版本fortran语言 内存无效_编程语言的分类

编程语言世代

第一代和第二代语言又称低级语言(Low-level language),其余被视为高级语言(High-level language)

第一代编程语言

即机器语言,由0和1构成,通过面板、打孔带或者打孔卡输入。

第二代编程语言

即汇编语言,是机器语言的简单替换,目前在内核/驱动中会被用到。

第三代编程语言

架构无关的语言,更加面向程序员,而非机器。第三代语言将很多细节交由计算机(编译器)把控,同时变得更加抽象。从Fortran、ALGOL、COBOL到C、C++、C#、Java、Basic和PASCAL都是第三代语言。大多数第三代语言支持结构化编程,不少支持面向对象编程。

第四代编程语言

是一个比较模糊而不断变化的概念,本质上说,任何在第三代语言的概念上有所改进的语言都可被视为第四代语言。

第四代语言可能包括对数据库处理、报告生成、GUI开发、网络开发等的支持。某些人认为第四代语言是domain-specific语言的子集。而且这些支持在第三代语言中都有以库的方式体现,这模糊了第三代和第四代的区别。

第五代编程语言

第五代语言被认为可以让计算机在不需要程序员的情况下独立解决一个问题,也就是说计算机只需要了解这个问题的约束,而无需程序员写出算法。

广义上来说,大部分constraint-based和logic-programming和某些其他的declarative语言都是第五代语言。第五代语言通常被用作在人工智能的研究上,一些这样的语言(比如OPS5)基于Lisp。

狭义上来说,第五代语言尚未诞生。因为其特点,第五代语言曾被认为是未来的语言,将取代所有之前的高级语言,日本曾在第五代语言方面投入了大量的研究和资金,但事实上因为第五代语言和Strong AI息息相关,其难度非常之高。

编译型和解释型

所有语言最终都需要转变为机器码,基于其转换为机器码的方式,高级语言可大致分为编译型和解释型两类(汇编语言无须编译或解释,仅需汇编成机器码)。

通常来说,编译型语言的运行速度更快(因为已经预先编译好,运行时无须执行解释这一步骤),而因此,编译型语言的开发/调试时间也较长,因为每次调试之前都需要编译一次。而解释型语言则可以快速的测试和调试。

理论上来说,任何语言都可以是编译型的或者解释型的。许多语言同时采用编译器和解释器来实现:先将代码编译为(虚拟机一致的)字节码,在运行时再用解释器解释执行,即所谓的JIT(Just-in-time,即时编译)。

编译型语言(Compiled language)

编译型语言利用编译器先将代码编译为机器码,再加以运行。比如C、C++、C#(编译成字节码)、Java(编译成字节码)等

解释型语言(Interpreted language)

解释型语言利用解释器,在运行期间,动态将代码逐行解释(Interpret)为机器代码并执行。比如Python、BASIC、JavaScript等。

编程范式

Programming Paradigms,或叫编程范型、编程典范,基于编程语言的特点而进行分类的方式。一种语言可以可以支持超过一种编程范型。

命令式和声明式

这是两个相对/并列的范式,命令式编程描述过程 ,声明式编程描述目标。

命令式编程(Imperative programming)

命令式编程描述计算所需作出的行为。几乎所有的计算机硬件都是命令式的。

子范式:过程式和面向对象式,过程式更靠近机器,面向对象式更贴近程序员。

过程式编程(Procedural programming)

来源于结构化编程,其概念基于过程(procedure、routine、subroutine、function),过程由一系列可执行可计算的步骤构成。

Fortran、ALGOL、COBOL、BASIC、Pascal和C等语言采用过程式编程。

面向对象式编程(Object-oriented programming)

具有对象概念的编程范式。

重要的面向对象编程语言包括Common Lisp、Python、C++、Java、C#、Perl、PHP、Ruby、Swift等。

声明式编程(Declarative programming)

声明式编程描述目标的性质,让计算机明白目标,而非流程。声明式编程通常被定义为所有的“非命令式编程”。

声明式编程包括数据库查询语言(SQL)、正则表达式、逻辑式编程、函数式编程和configuration management。声明式编程通常用作解决人工智能和约束满足问题。

子范型:函数式编程、逻辑式编程、约束式编程、数据流式编程

函数式编程(Functional programming)

又称泛函编程,它将计算视为数学上的函数运算,避免变量或状态(只有函数及其参数)。其最重要的基础是λ演算(lambda calculus),λ演算的函数可以接受函数当作输入和输出。

分为纯函数式编程(Purely functional programming)和函数逻辑式编程(Functional logic programming,函数式编程和逻辑式编程的组合)

逻辑式编程(Logic programming)

逻辑式编程基于数理逻辑,它设置答案所须匹配的规则来解决问题,而非设置步骤来解决问题。过程为:事实+规则=结果。

最常用的逻辑式编程语言是Prolog,Mercury则较适用于大型方案。

约束式编程(Constraint programming)

在这种范式中,变量之间的关系是以约束的形式陈述的,它们并非明确说明了要去执行步骤的某一步,而是规范其解的一些属性。

数据流式编程(Dataflow programming)

将程序建模为一个描述数据流的有向图。例如BLODI。

结构化和非结构化

这是两个相对的范式,非结构化编程是最早的编程范式,现今的计算机科学家都同意结构化编程的好处。

非结构化编程(Non-structured programming)

是最早的编程范式,相对于结构化编程,特点是其控制流是通过(容易引起混乱的)goto语句跳转实现的。非结构化编程包括机器语言、汇编语言、MS-DOS batch、以及早期的BASIC及Fortran等等。

结构化编程(Structured programming)

通过子程序、代码块、for循环、while循环等结构来取代之前的goto语句,以提高代码的清晰程度,获得更好的可读性。现今的大部分高级语言都是结构化的。

结构化编程的流程包括顺序、选择(if, else, switch)、循环(for, while)几类。

元编程(Metaprogramming)

元编程是一种让程序视其他程序为数据的编程技术。也即是说一个程序可以被设计为读取、产生、分析、改变其他程序,甚至在运行时改变自己。元编程所用的语言叫做元语言。

最著名的元语言是Lisp。

元编程的子范型:自动式编程、反射式编程

自动式编程(Automatic programming)

自动式编程的定义并不清晰,而且随时间在演变。

反射式编程(Reflection programming)

反射式编程指的是程序具有在运行时检查/修改它自身的结构及行为的能力。

泛型编程(Generic programming)

泛型允许程序员在用强类型语言编写代码时使用一些以后才指定的类型。

Ada、Delphi、C#、Java、Swift、http://VB.NET称之为泛型(generics),Scala和Haskell称之为参数多态(parametric polymorphism),C++称之为模板()

动态语言(Dynamic programming language)

动态语言在运行时可以改变其结构:新的函数、对象甚至代码可以被引进,已有的函数可以被删除或有其他结构上的变化。JavaScript、PHP、Python、Ruby属于动态语言,而C和C++则不属于动态语言。

大部分动态语言都使用动态类型,但也有些不是。

类型系统(Type system)

动态和静态类型检查

对类型的检查可能发生在编译时(静态检查),或者程序运行时(动态检查)进行。动态类型检查经常出现在脚本语言和解释型语言中,编译语言则通常使用静态类型检查

大部分动态语言都使用动态类型,但也有些不是。

强弱类型

强类型(Strongly typed)和弱类型(Weakly/Loosely typed)并没有非常明确地定义。主要用于描述编程语言对于混入不同数据类型的值进行运算时的处理方式。强类型的语言遇到函数形参和实参的类型不匹配时通常会失败,而弱类型的语言常常会进行隐式的转换(并可能造成不可知的后果)。

类型安全和内存安全

第三种对语言的类型系统进行分类的方法,就是类型运算和转换的安全性。如果它不允许导致不正确的情况的运算或转换,计算机科学就认为该语言是类型安全的。

内存安全则指的是程序不被允许访问没有分配给它的内存,比如:内存安全语言会做数组边界检查。通常来说,类型安全和内存安全是同时存在的。

比如以下例子:

var x:= 5

var y:= “37”

var z:= x + y

上例中的z的值为42,不管编写者有没有这个意图,该语言定义了明确的结果,且程序不会就此崩溃,或将不明定义的值赋给z。就这方面而言,这样的语言就是类型安全的。

再比如:

int x = 5

char y[] = “37”

char* z = x + y

在这个例子中,z将会指向一个超过y地址5个字节的存储器地址,相当于指向y字符串的指针之后的两个空字符之处。这个地址的内容尚未定义,且有可能超出存储器的定址界线,这就是一个类型不安全/内存不安全的语言。

显式声明和隐式暗示

许多静态类型系统,如C和Java,要求变量声明类型:编写者必须以指定类型明确地关系到每一个变量上。其它的,如Haskell,则进行类型推断:编译器根据编写者如何运用这些变量,以草拟出关于这个变量的类型的结论。

例如,给定一个函数f(x,y),它将x和y加起来,编译器可以推断出x和y必须是数字——因为加法仅定义给数字。因此,任何在其它地方以非数值类型(如字符串或链表)作为参数来调用f的话,将会发出一个错误。

在代码中数值、字符串常量以及表达式,经常可以在详细的前后文中暗示类型。例如,一个表达式3.14可暗示浮点数类型;而[1, 2, 3]则可暗示一个整数的链表;通常是一个数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金融统计分析python论文_比较好写的本科金融专业论文题目 本科金融专业论文题目怎么取...

为论文写作提供【100道】比较好写的本科金融专业论文题目,海量本科金融专业相关论文题目,包括专科与本科以及硕士论文题目,解决您的本科金融专业论文题目怎么取的相关难题!一、比较好写的本科金融专业论文题目:1、微观金融视角下财务管理专业应用型本科人才培养目标…

互联网java常用框架_来,带你鸟瞰 Java 中4款常用的并发框架!

1. 为什么要写这篇文章几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库。 但是,当深入实现细节时,我们想起了一位智者曾经说过的话:“细…

2020亚太杯数学建模_比赛 | 2020年APMCM亚太地区大学生数学建模竞赛

2020年11月26日到30日,在我院老师指导下,由统计分析竞赛社组织的41支队伍,共123人,参加了亚太地区大学生数学建模竞赛组委会主办的大学生学科类竞赛。此次竞赛题目分为A题和B题,参赛者需从A,B两题中任选其一…

java声明复数类_JAVA声明复数类

声明复数类,成员变量包括实部和虚部,成员方法包括实现由字符串构造复数、复数加法、减法,字符串描述、比较相等等操作。虽然我只是一个刚学一个月JAVA的菜鸡,但是强迫症让我把复数乘法和除法一起写出来了。public class Complex {…

python接口测试非json的断言_荐在接口自动化测试中,如何利用Pytest + JSONPath 进行接口响应断言...

之前有一篇文章,介绍了如何使用JSONSchema对接口响应进行断言,主要的适用场景是对响应的数据结构进行校验,保证客户端收到的数据结构稳定和合法。今天,介绍使用JSONPath对接口响应的值进行断言方法。上一篇文章《在接口自动化测试…

python3中异常处理_python中的五种异常处理机制介绍|python3教程|python入门|python教程...

https://www.xin3721.com/eschool/python.html从几年前开始学习编程直到现在,一直对程序中的异常处理怀有恐惧和排斥心理。之所以这样,是因为不了解。这次攻python,首先把自己最畏惧和最不熟悉的几块内容列出来,里面就有「异常处理…

java static 单例模式_Java 单例模式全面学习

介绍什么是单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点解决什么问题:省略创建对象所花费的时间,不需要频繁创建对象,减轻 GC 压力。单例模式有以下几种实现方式:懒汉式第一次使用的时候…

sql 没有调试 菜单_MySQL递归查询上下级菜单

正文在传统的后台管理系统里面经常会需要展示多级菜单关系,今天我们来学一下如何使用一条SQL语句展示多级菜单。现在我们有一张corpinfo单位表,里面有一个belong字段指向上级单位,首先来看一下现在表里有什么数据:SELECT uid,ubel…

java 桥 word_java导出word的6种方式(转发)

最近做的项目,需要将一些信息导出到word中。在网上找了好多解决方案,现在将这几天的总结分享一下。目前来看,java导出word大致有6种解决方案:1:Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构…

python删除指定天数前的文件_python 删除指定时间间隔之前的文件实例

遍历指定文件夹下的文件,根据文件后缀名,获取指定类型的文件列表;根据文件列表里的文件路径,逐个获取文件属性里的“修改时间”,如果“修改时间”与“系统当前时间”差值大于某个值,则删除该文件。#!/usr/b…

jieba 词典 词频_在Hanlp词典和jieba词典中手动添加未登录词

在使用Hanlp词典或者jieba词典进行分词的时候,会出现分词不准的情况,原因是内置词典中并没有收录当前这个词,也就是我们所说的未登录词,只要把这个词加入到内置词典中就可以解决类似问题,如何操作呢,下面我…

android访问java服务器_Android_post访问java服务器端

//javaee工程访问地址String url "http://localhost:8080/TestAndroid";//把要请求的值封装到namevalupair的集合中NameValuePair nameValuePair1 new BasicNameValuePair("name","zhangsna");NameValuePair nameValuePair2 new BasicNameVal…

pythonweb啥意思_python-web-guide

Python Web 入坑指南____ _ _ __ __ _ ____ _ _| _ \ _ _| |_| |__ ___ _ __ \ \ / /__| |__ / ___|_ _(_) __| | ___| |_) | | | | __| _ \ / _ \| _ \ \ \ /\ / / _ \ _ \ | | _| | | | |/ _ |/ _ \| __/| |_| | |_| | | | (_) | | | | \ V V / __/ |_) | | |_| | |_| | | (_…

java范例_Java范例集锦(一)

范例1:不用其他变量实现两个变量通常在对变量互换时,将创建一个临时变量来共同完成互换,临时变量的互换增加了系统资源的消耗。如果需要交换的是两个整数类型的变量,则可以使用异或运算符(^)进行更高效的处理。实现代码如下&#…

python查找输出文字_Python基础练习,查询文本内容并输出;

1、编写可供用户查询的员工信息表:1).用户认证(输入用户名,密码)2).查询关键字:姓名3).显示ID,name,section,phone4).员工信息表内容如下:cat search_name.txt001wenlong IT12345678002xiaojun …

python列表索引超出范围 等于啥_python - IndexError:列表分配索引超出范围,Python

我正在尝试实现功能。它的工作方式应该是这样的:它需要两个列表。标记一些索引,最好居中。父母双方都切换标记索引。其他索引按顺序转到其父元素。如果该父元素中已经存在相同的元素,则它将映射并检查同一元素在其他父元素的位置并到达那里。…

python爬取汽车之家_python爬取 汽车之家(汽车授权经销商)

一:爬虫的目标:打开汽车之家的链接:https://www.autohome.com.cn/beijing/,出现如下页面我们的目标是点击找车,然后出现如下图我们要把图中的信息抓取到二:实现过程我们选择 宝马5系 然后点击找车注意宝马…

python跨目录调用_python 跨目录访问文件

1.同级、同目录的文件之间的访问有这样一个目录结构假如,in_A.py 这个文件想调用 hello_world.py 中的函数怎么办呢? --->>> import只需在 in_A.py 中 写入importhello_worldhello_world.functions()这样就可以访问啦,什么原理呢&a…

Java 调用 Caffe_解决 free(): invalid pointer: 0x00000000019ff700 运行时报错(caffe)(libtool使用)...

编译成功,运行时报错:在使用 pytorch or tensorflow or caffe 时,都可能存在这个问题:*** Error in xxx: free(): invalid pointer: 0x00000000020663b0 ***很可能是缺少libtcmalloc库解决方法1:apt-get安装libtcmallo…

unity 世界坐标间角度_Unity学习笔记—本地坐标转世界坐标

核心用到的方法就是transform.TransformPoint( )这个方法的返回值就是Vector3类型的世界坐标,transform就是相对的物体,括号里的就是相对这个transform的本地坐标,比方说我现在的位置吧,知道我相对于我的邻居的坐标:Pos1&#xff…