……(学过啥语言记啥语言)
学编程语言到一定程度总会看到“高级特性”这一字眼的章节,本人学的不精,这篇当作笔记,有新学到的就更新一下O(∩_∩)O
一、编程语言特性
## 面向过程
命名空间、作用域、程序段 | 程序的有效区域 | c、c++、c#、php |
变量、静态变量 | ||
常量、常变量 | 常变量const | |
别名、引用 | 同一处内存的不同名字 | |
指针、堆栈 | c、c++、asm | |
goto、jump跳转、标记 | c、asm | |
函数(方法) | 几乎所有语言都有 |
## 面向对象 (抽象 封装 继承 多态)——总结自《大话设计模式》附录
c++、c#、java、python、JavaScript、php
类与实例 | 基类、派生类、域、【包】 | |
构造方法 | ||
方法重载 | ||
属性与修饰符 | ||
封装 | ||
继承 | ||
多态 | ||
重构 | ||
抽象类 | ||
接口 | java的Interface、C++的抽象类(纯虚函数"=0")、 | |
集合 | 集合(Collection)类是专门用于数据存储和检索的类。 | |
泛型 | 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 | |
过滤器、委托与事件 | (delegate/event) qt的c++框架、c# |
## 高级特性
对于我这个渣渣来说就是炫酷吊炸天的东西。
射和注解 | 反射就是可以在运行时加载类信息,并可以创建其对象访问其属性和方法。 注解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。 | java |
闭包 | JavaScript | |
索引器 | C# | |
匿名方法 | c11里的Lambda表达式、 | |
自定义特性 | ||
多线程 | ||
正则表达式、通配符 | ||
__attribute__ 机制 |
# 二、说不清属于什么但是要说的
1.钩子Hook
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
2.编译型、解释型(包含脚本)
1、编译型语言
需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。
代表语言:C、C++、Pascal、Object-C以及最近很火的苹果新语言swift
2、解释型语言
解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby
3、混合型语言
既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码,中间语言运行库类似于Java虚拟机。.net在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中,下次直接执行(博友回复指出)。我个人认为抛开一切的偏见C#是这个星球上最好的编程语言。可惜微软的政策限制了C#的推广。
Java先生成字节码再在Java虚拟机中解释执行。
严格来说混合型语言属于解释型语言。C#更接近编译型语言。
动态语言和静态语言
1、动态语言
是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。
主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。
2、静态语言
与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++。
3、注意:
很多人认为解释型语言都是动态语言,这个观点是错的!Java是解释型语言但是不是动态语言,Java不能在运行的时候改变自己结构。反之成立吗?动态语言都是解释型语言。也是错的!Object-C是编译型语言,但是他是动态语言。得益于特有的run time机制(准确说run time不是语法特性是运行时环境,这里不展开)OC代码是可以在运行的时候插入、替换方法的。
C#也是动态语言,通过C#的反射机制可以动态的插入一段代码执行。所以我说C#是这个星球最好的编程语言。
动态类型语言和静态类型语言
1、动态类型语言
很多网上资料把动态类型语言和动态语言混为一谈,简直是误人子弟。动态类型语言和动态语言是完全不同的两个概念。动态类型语言是指在运行期间才去做数据类型检查的语言,说的是数据类型,动态语言说的是运行是改变结构,说的是代码结构。
动态类型语言的数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段。
主要语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。
2、静态类型语言
静态语言的数据类型是在编译其间确定的或者说运行之前确定的,编写代码的时候要明确确定变量的数据类型。
主要语言:C、C++、C#、Java、Object-C。
3、注意:
相当一部分程序员,也包括曾经的我,认为解释型语言都是动态类型语言,编译型语言都是静态类型语言。这个也是错的。swift是编译型语言但是它也是动态类型语言。C#和Java是解释型语言也是静态类型语言。
强类型语言和弱类型语言 1、强类型语言:
强类型语言,一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远是这个数据类型。你不能把一个整形变量当成一个字符串来处理。
主要语言:Java、C#、Python、Object-C、Ruby
2、弱类型语言:
数据类型可以被忽略,一个变量可以赋不同数据类型的值。一旦给一个整型变量a赋一个字符串值,那么a就变成字符类型。
主要语言:JavaScript、PHP、C、C++(C和C++有争议,但是确实可以给一个字符变量赋整形值,可能初衷是强类型,形态上接近弱类型)
3、注意:
一个语言是不是强类型语言和是不是动态类型语言 也没有必然联系。Python是动态类型语言,是强类型语言。JavaScript是动态类型语言,是弱类型语言。Java是静态类型语言,是强类型语言。
# 三、不同语言称谓对比
胡乱写写……比如如下的代码
class A
{
public:
void fun(bool input)
{
ok = input;
}
protected:
bool ok;
int height;
};
……
int result;
A a=new A();
类,对象,成员(变量、函数)在不同语言里的不同名字:
A:【C++】类,【C】结构体
a:【C++】对象,【C】结构体变量
fun:【C++】成员函数,【C】——
ok、height:【C++】成员变量,【C】结构体的成员
result:【C】变量
A a=new A(); :【C++】创建对象、实例化类,
把一个类,形象化,通过类的实例,就是对象,来实现类的功能。因为类是抽象的,所以需要实例化对象才能使用类。
variable——【C】变量,数据,【C++对象】成员变量(属性,状态)
function——【C】函数,【java】方法,【C++对象】行为(对内)、消息(对外),【组成原理】指令,操作