鸭子编译器
‘壹’ 鸿蒙系统代码开源,不担心友商“抄袭”吗
最近手机圈最火的话题恐怕就是华为宣布最快今年秋季,最晚明年春季就要正式发布自主研发的操作系统了。这是续华为自研麒麟芯片之后又一重磅炸弹,而华为的操作系统很有可能命名为鸿蒙,目前鸿蒙已经通过了注册商标,离发布已经越来越近了
老用户无需购买新华为手机就能用上。而友商手机,比如小米魅族甚至三星手机,都可以通过编译后刷入,就像之前刷其它非官方ROM一样,当然前提是要解BL锁和ROOT。所以等到鸿蒙系统发布之后,只要想用,我们手上的手机都能够用上,就看华为官方会不会放出适配包了
‘贰’ 软件设计模式鸭子模拟器
假设我们需要设计出各种各样的鸭子,一边游泳戏水, 一边呱呱叫。很明显这时我们需要设计了一个鸭子超类(Superclass),并让各种鸭子继承此超类。
public abstract class Duck {
public void Swim() {
//会游泳
}
public abstract display();//各种外观不一样,所以为抽象
public void Quack() {
//会叫
}
}
每一只鸭子就继承Duck类
public class MallardDuck extends Duck {
public void display() {
// 外观是绿色的
}
}
public class RedheadDuck extends Duck{
public void display(){
// 外观是红色的
}
}
好了,我们完成这些后,但是发现我们需要有一些鸭子是会飞的,应该怎么修改呢?
也许你要说这很简单,在Duck类里面直接加入一个fly()方法,不就可以了。
public abstract class Duck {
public void Swim() {
//会游泳
}
public abstract display();//各种外观不一样,所以为抽象
public void Quack() {
//会叫
}
public void fly(){
//会飞
}
}
这时你会发现所有的鸭子都变成了会飞的,很明显这是不对了,例如橡皮鸭显然就不是了。
你也许想到了另一种方法,在会飞的鸭子类里才添加该方法不就可以了嘛,
public class MallardDuck extend Duck{
public void display(){
// 外观是绿色的
}
public void fly(){
//会飞
}
}
这个方法看起来是很不错,可是有很多种鸭子都会飞的时候,代码的复用性很明显是不够好的,你不得不在
每一个会飞的鸭子类里去写上同一个fly()方法,这可不是个好主意.
可能你又想到另一个方法:采用继承和覆盖,在Duck类里实现fly()方法,在子类里如果不会飞的就覆盖它
public abstract class Duck {
public void Swim() {
//会游泳
}
public abstract display();//各种外观不一样,所以为抽象
public void Quack(){
//会叫
}
public void fly(){
//会飞
}
}
//橡皮鸭吱吱叫,不会飞
public class RubberDuck extend Duck{
public void quack(){
//覆盖成吱吱叫
}
public void display{
//外观是橡皮鸭
}
public void fly{
//什么也不做
}
}
这样我们真实现了确实能飞的鸭子才可以飞起来了,看起来主意不错!问题到这儿似乎得到了解决
但我们现在有了一种新的鸭子,诱铒鸭(不会飞也不会叫),看来需要这样来写
public class DecoyDuck extend Duck{
public void quack(){
//覆盖,变成什么也不做
}
public void display(){
//诱饵鸭
}
public void fly(){
//覆盖,变成什么也不做
}
}
每当有新的鸭子子类出现或者鸭子新的特性出现,就不得不被迫在Duck类里添加并在所有子类里检查可能需要覆盖fly()和quark()...这简直是无穷尽的恶梦。所以,我们需要一个更清晰的方法,让某些(而不是全部)鸭子类型可飞或可叫。让鸭子的特性能有更好的扩展性。
用一下接口的方式把fly()取出来,放进一个Flyable接口中,这样只有会飞的鸭子才实现这个接口,当然我们也可以照此来设计一个Quackbable接口,因为不是所有的鸭子都会叫,也只让会叫的鸭子才去实现这个接口.
但这个方法和上面提到的在子类里去实现fly一样笨,如果几十种都可以飞,你得在几十个鸭子里去写上一样的fly(),如果一旦这个fly有所变更,你将不得不找到这几十个鸭子去一个一个改它们的fly()方法。
因为改变鸭子的行为会影响所有种类的鸭子,而这并不恰当。Flyable与Quackable接口一开始似乎还挺不错, 解决了问题( 只有会飞的鸭子才继承Flyable) , 但是java的接口不具有实现代码, 所以继承接口无法达到代码的复用。这意味着:无论何时你需要修改某个行为,你必须得往下追踪并修改每一个定义此行为的类。
策略模式的第一原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 好吧,回头看一下这个Duck类,就我们目前所知,除了fly()和quack()的问题之外,Duck类还算一切正常,主要是鸭子的行为总是可能变化的,让我们头痛就在于这些行为的变化,那我们就把这些行为独立出来。
为了要把这两个行为从Duck 类中分开, 我们将把它们自Duck 类中取出,建立一组新类代表每个行为。我们建立两组类(完全远离Duck类),一个是“fly”相关的,一个是“quack”相关的,每一组类将实现各自 的动作。比方说,我们可能有一个类实现“呱呱叫”,另一个类实现“吱吱叫”,另一个类实现“安静”。我们利用接口代表每组行为,比方说, FlyBehavior来代表飞的行为,QuackBehavior代表叫的行为,而让每一种行为具体类来实现该行为接口。
在此,我们有两个接口,FlyBehavior和QuackBehavior,还有它们对应的类,负责实现具体的行为:
public interface FlyBehavior {
public void fly();
}
public class FlyWithWings implements FlyBehavior{
public void fly{}{
//实现鸭子飞行
}
}
public class FlyNoWay implements FlyBehavior{
public void fly{}{
//什么也不做,不会飞
}
}
public interface QuackBehavior{
public void quack();
}
public class Quack implements QuackBehavior{
public void quack(){
//实现鸭子呱呱叫
}
}
public class Squeak implements QuackBehavior{
public void quack(){
//实现鸭子吱吱叫
}
}
public class MuteQuack implements QuackBehavior{
public void quack(){
//什么也不做,不会叫
}
}
实际上这样的设计,我们已经可以让飞行和呱呱叫的动作被其他的对象复用,因为这些行为已经与鸭子类无关了。如果我们新增一些行为,也不会影响到既有的行为类,也不会影响有已经使用到飞行行为的鸭子类。
好了,我们设计好鸭子的易于变化的行为部分后,该到了整合鸭子行为的时候了。
这时我们该想到策略模式的另一个原则了:
针对接口编程,而不是针对实现编程。
首先, 在鸭子中加入两个实例变量,分别为“flyBehavior”与“quackBehavior”,声明为接口类型( 而不是具体类实现类型), 每个变量会利用多态的方式在运行时引用正确的行为类型( 例如:FlyWithWings 、Squeak...等)。我们也必须将Duck类与其所有子类中的fly()与quack()移除,因为这些行为已经被搬移到FlyBehavior与 Quackehavior类中了,用performFly()和performQuack()取代Duck类中的fly()与quack()。
public abstract class Duck(){
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public void swim(){
//会游泳
}
public abstract void display();//各种外观不一样,所以为抽象
public void performQuack(){
quackBehavior.quack();
}
public void performFly(){
flyBehavior.fly();
}
}
很容易,是吧?想进行呱呱叫的动作,Duck对象只要叫quackBehavior对象
去呱呱叫就可以了。在这部分的代码中,我们不在乎QuackBehavior 接口的对象到底是什么,我们只关心该对象
知道如何进行呱呱叫就够了。
好吧! 现在来关心如何设定flyBehavior 与quackBehavior的实例变量。
看看MallardDuck类:
public class MallardDuck extends Duck {
public MallardDuck() {
\\绿头鸭使用Quack类处理呱呱叫,所以当performQuack() 被调用,就把责任委托给Quack对象进行真正的呱呱叫。
quackBehavior = new Quack();
\\使用FlyWithWings作为其FlyBehavior类型。
flyBehavior = new FlyWithWings();
}
}
所以,绿头鸭会真的‘呱呱叫’,而不是‘吱吱叫’,或‘叫不出声’。这是怎么办到的?当MallardDuck实例化时,它的构造器会
把继承来的quackBehavior实例变量初始化成Quack类型的新实例(Quack是QuackBehavior的具体实现类)。同样的处理方式也可以用在飞行行为上: MallardDuck 的构造器将flyBehavior 实例变量初始化成FlyWithWings 类型的实例(
FlyWithWings是FlyBehavior的具体实现类)。
输入下面的Duck类(Duck.java) 以及MallardDuck 类MallardDuck.java),并编译之。
public abstract class Duck {
//为行为接口类型声明两个引用变量, 所有鸭子子类(在同一个packge)都继承它们。
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public abstract void display();
public void performFly() {
flyBehavior.fly();//委托给行为类
}
public void performQuack() {
quackBehavior.quack();//委托给行为类
}
public void swim() {
System.out.println("All cksfloat, even decoys!");
}
}
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = newQuack();
flyBehavior = newFlyWithWings();
}
public void display() {
System.out.println("I’m a real Mallard ck");
}
}
输入FlyBehavior接口(FlyBehavior.java)与两个行为实现类(FlyWithWings.java与FlyNoWay.java),并编译之。
public interface FlyBehavior {//所有飞行行为类必须实现的接口
public void fly();
}
public class FlyWithWings implements FlyBehavior {//这是飞行行为的实现, 给“真会”飞的鸭子用 .. .
public void fly() {
System.out.println("I’m flying!!");
}
}
public class FlyNoWay implements FlyBehavior {//这是飞行行为的实现, 给“不会”飞的鸭子用( 包括橡皮鸭和诱饵鸭)
public void fly() {
System.out.println("I can’t fly");
}
}
输入QuackBehavior接口(QuackBehavior.java)及其三个实现类(Quack.java、MuteQuack.java、Squeak.java),并编译之。
public interface QuackBehavior {
public void quack();
}
public class Quack implements QuackBehavior {
public void quack() {
System.out.println(“Quack”);
}
}
public class MuteQuack implements QuackBehavior {
public void quack() {
System.out.println(“<< Silence >>”);
}
}
public class Squeak implements QuackBehavior {
public void quack() {
System.out.println(“Squeak”);
}
}
输入并编译测试类(MiniDuckSimulator.java)
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.display();
//这会调用MallardDuck继承来的performQuack() ,进而委托给该对象的QuackBehavior对象处理。(也就是说,调用继承来的quackBehavior的quack())
mallard.performQuack();
//至于performFly() ,也是一样的道理。
mallard.performFly();
}
}
运行结果:
I’m a real Mallard ck
Quack
I’m flying!!
虽然我们把行为设定成具体的类(通过实例化类似Quack 或FlyWithWings的行为类, 并指定到行为引
用变量中),但是还是可以在运行时轻易地改变该行为。
所以,目前的作法还是很有弹性的,只是初始化实例变量的作法不够弹性罢了。
我们希望一切能有弹性,毕竟,正是因为一开始的设计的鸭子行为没有弹性,才让我们走到现在这条路。
我们还想能够“指定”行为到鸭子的实例, 比方说, 想要产生绿头鸭实例,并指定特定“类型”的飞行
行为给它。干脆顺便让鸭子的行为可以动态地改变好了。换句话说,我们应该在鸭子类中包含设定行为的方法。
因为quackBehavior实例变量是一个接口类型,所以我们是能够在运行时,透过多态动态地指定不同的QuickBehavior实现类给它。
我们在鸭子子类透过设定方法(settermethod)设定鸭子的行为,而不是在鸭子的构造器内实例化。
在Duck类中,加入两个新方法:从此以后,我们可以“随时”调用这两个方法改变鸭子的行为。
public strate class Duck(){
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
}
好了,让我们再制造一个新的鸭子类型:模型鸭(ModelDuck.java)
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();//初始状态,我们的模型鸭是不会飞的。
quackBehavior = new Quack();//初始状态,我们的模型鸭是可以叫的.
}
public void display() {
System.out.println("I’m a modelck");
}
}
建立一个新的FlyBehavior类型(FlyRocketPowered.java)
public class FlyRocketPowered implements FlyBehavior {
// 我们建立一个利用火箭动力的飞行行为。
public void fly() {
System.out.println("I’m flying with arocket!");
}
}
改变测试类(MiniDuckSimulator.java),加上模型鸭,并使模型鸭具有火箭动力。
public class MiniDuckSimulator {
public static void main(String[] args) {
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck model = new ModelDuck();
//第一次调用performFly() 会被委托给flyBehavior对象(也就是FlyNoWay对象),该对象是在模型鸭构造器中设置的。
model.performFly();
//这会调用继承来的setter 方法,把火箭动力飞行的行为设定到模型鸭中。哇咧! 模型鸭突然具有火箭动力飞行能力。
model.setFlyBehavior(new FlyRocketPowered());
//如果成功了, 就意味着模型鸭动态地改变行为。如果把行为的实现绑死在鸭子类中, 可就无法做到这样。
model.performFly();
}
}
运行一下,看下结果
I’m a real Mallard ck
Quack
I’m flying!!
I’m a model ck
I can’t fly
I’m flying with a rocket!
如同本例一般,当你将两个类结合起来使用,这就是组合(composition)。这种作法和‘继承’不同的地方在于,
鸭子的行为不是继承而来,而是和适当的行为对象‘组合’而来。
这是一个很重要的技巧。其实是使用了策略模式中的第三个设计原则, 多用组合,少用继承。
现在来总结一下,鸭子的行为被放在分开的类中,此类专门提供某行为的实现。
这样,鸭子类就不再需要知道行为的实现细节。
鸭子类不会负责实现Flyable与Quackable接口,反而是由其他类专门实现FlyBehavior与QuackBehavior,
这就称为“行为”类。由行为类实现行为接口,而不是由Duck类实现行为接口。
这样的作法迥异于以往,行为不再是由继承Duck超类的具体实现而来, 或是继承某个接口并由子类自行实现而来。
(这两种作法都是依赖于“实现”, 我们被实现绑得死死的, 没办法更改行为,除非写更多代码)。
在我们的新设计中, 鸭子的子类使用接口( FlyBehavior与QuackBehavior)所表示的行为,所以实际的实现不会被
绑死在鸭子的子类中。( 换句话说, 特定的实现代码位于实现FlyBehavior与QuakcBehavior的特定类中),这样我们就获得了更大的灵活性和可扩展性。
‘叁’ 为什么N8的视频编辑器幻灯片制作只能支持32张照片
因为软件本身还不完善啊~~
‘肆’ 笑话征集
有一天,三个探险家终于寻找到“希望之谷”,传说中,只要站在山谷边大
喊心中 想要的东西,然后往山谷中跳下去,就会得到满坑满谷所想要的东西。于是他们三个决定试看看。
第一个是个色鬼,因此他大喊“女人!女人!”往下一跳果真有满坑满谷的 美女正 等着他.
第二个是个书呆子,喊了“书书书书书!”然后,跳到山谷里也得到满坑满
谷的书.
第三个是个优柔寡断的人,左思右想总是无法决定自己的最爱,过了一个小
时以 后,他终于下定决心,觉得还是钞票最有用了,于是他走向山谷边.一不小心踢到一颗 石头,他骂了一声“shit!”不料一个重心不稳跌下山谷.
‘伍’ 创业项目该如何选择技术
选择方式:
选择适合自己的企业类型:
工商企业的类型主要有四大类,即零售业、服务业、制造业和批发业。从事零售业和服务业所需资金较少,容易进入;而从事制造业和批发业则需要大量的资金,但也提供巨大的潜在报酬。
大学生要选择真正适合自己的企业类型,必须综合考虑多方面的因素。首先是个性因素,即自己的兴趣、爱好等。如果喜欢与人打交道,就可以考虑服务业;如果不喜欢与人打交道,而更喜欢解决工程技术性问题,就应该考虑制造业。其次是技术专长与工作经验。技术专长是一个人具备的所有专业知识和技能,是重要的创业资本。从事自己最擅长的行业,是创业成功的重要保障。第三是资金需求。企业类型不同,所需投入的资金数量也不同,资金回收的周期也不同。资金需求量最大的是制造业,资金投入大,回收较慢;而资本需求量最小的是服务业。要根据自己的资金情况和创业项目所需资金的数量,权衡选择适当的投资项目。第四是人脉。如果在所要从事的行业里有自己的亲人、朋友或认识的专家,’那么他们会给你提供很多有价值的信息、建议和帮助,当然也可以提供资金方面的帮助。总之,要根据各类企业的特点和要求,结合自身的创业条件,初步确定要从事的行业。
选择适合自己的创业领域:
大学生具有一定的专业知识,思维活跃,容易接受新事物,这有利于创业的开展。但是,由于没有进入社会,大学生在商业意识及管理、营销等方面的实际经验比较缺乏,这对创业增加了风险。所以,大学生创业既有优势,也有局限,在创业方向和创业领域的选择上应该扬长避短,寻找适合自己发展的道路。
目前,适合大学生创业的领域很多。具体来讲,一是高科技领域。大学生可以利用自身的知识及学校资源,进行科技成果的应用开发。二是智力服务。智力是大学生的资本,智力服务创业项目一般成本低、见效快,如咨询、家教、翻译、计算机维修维护、设计工作室等。三是信息技术。IT产业一直被誉为创业“金矿”,大学生在计算机使用方面具有优势,可利用自己的知识技能进行网上创业。四是连锁加盟。对创业资源十分有限的大学生来说,通过连锁加盟形式创业,可以快速掌握经营所需要的知识和经验,从而降低风险,提高创业成功率。五是创意小店。如手工制造、特色专柜等。这种小店规模不大,经营相对简单,对社会经验、管理、营销、财务要求等也都不高,比较适合初次创业者。六是代理。从代理起家,从销售入手,相对比较简单,投入也会小一些,能达到降低创业风险,快速积累第一桶金的目的。从做代理商开始创业,最后做大做强的例子有很多,着名的联想集团就是这么起家并成长起来的。
发现商机,选择创业项目
商机即商业机会,也叫市场机会,是指市场中客观存在的未被满足的需求。企业存在的价值,就在于满足市场需求。另外,人们在生活中总是存在这样那样的困难和不便,而寻求解决这些问题的方法也往往给创业者带来创业的契机。所以,需求带来商机,问题孕育商机。商机是驱使创业者进行创业的直接动因。
发现商机的方法很多,常用的方法是头脑风暴法和实地考察法。所谓“头脑风暴法”,就是让人们围绕某一问题,打开思路,充分发挥想象力,提出尽可能多的有助于解决该问题的建议和想法。运用头脑风暴法可以激发每个人的创造力,使每个人从中受到启发,最终找到合适的创意或解决办法。所谓“实地考察法”,就是对特定地区进行实地考察,了解人们的需求或生活中存在的问题,从中寻找可以把握的商机。
创业的过程就是寻找和发现、识别有价值的、可以利用的商业机会的过程。一个商业机会是否具有价值,要看它是否能够真正满足顾客的需求;判断商业机会的大小和发展前景,要考虑其能提供可赢利空间的大小及风险如何。另外,创业者在识别商机时,还要考虑该项目是否符合自己的能力水平及各方面条件,与竞争对手相比是否具有竞争优势等。总之,应综合考虑各方面因素,要选择那些既有市场发展前景,又符合创业者自身条件的创业项目
‘陆’ fm in game editor 和fmrte的区别
fm in game editor和fmrte都是Football Manager(足球经理)系列游戏的存档修改器,它们最根本的区别是前者来自官方,需要在steam上花钱单独购买,而后者则是第三方开发的,属于免费软件(接受捐赠)。
fm in game editor作为官方开发的收费软件,有查看球员和职员数据,和添加球员的功能,但它的使用不是实时的,修改以后要重新开始游戏才能产生效果,而且使用它修改过的存档将无法获得游戏成就。它的优点在于存档能够保证绝对安全,缺点则是限制太多,功能太少。
‘柒’ c#多态的运行机理
描述一下C++的,应该差不多
1、编译器发现一个类中有虚函数,编译器会立即为此类生成虚拟函数表 vtable(后面有对vtable的分析)。虚拟函数表的各表项为指向对应虚拟函数的指针。
2、编译器在此类中隐含插入一个指针vptr(对vc编译器来说,它插在类的第一个位置上)。
有一个办法可以让你感知这个隐含指针的存在,虽然你不能在类中直接看到它,但你可以比较一下含有虚拟函数时的类的尺寸和没有虚拟函数时的类的尺寸,你能够发现,这个指针确实存在。
class cnovirtualfun
{
private:
long lmember;
public:
long getmembervalue();
} class chavevirtualfun
{
private:
long lmember;
public:
virtual long getmembervalue();
}
cnovirtualfun obj;
sizeof(obj) -> == 4;
chavevirtualfun obj;
sizeof(obj) -> == 8;
3、在调用此类的构造函数时,在类的构造函数中,编译器会隐含执行vptr与vtable的关联代码,将vptr指向对应的vtable。这就将类与此类的vtable联系了起来。
4、在调用类的构造函数时,指向基础类的指针此时已经变成指向具体的类的this指针,这样依靠此this指针即可得到正确的vtable,从而实现了多态性。在此时才能真正与函数体进行连接,这就是动态联编。
‘捌’ 小鸭子的生活2的编辑器里为什么我的鸭子走的很慢
咕~~(╯﹏╰)b
‘玖’ 类型系统的类型检查
类型检查所进行的检验处理以及实行类型的约束,可发生在编译时期(静态检查)或运行时期(动态检查)。静态类型检查是在编译器所进行语义分析中进行的。如果一个语言强制实行类型规则(即通常只允许以不丢失信息为前提的自动类型转换)就称此处理为强类型,反之称为弱类型。 如果一个编程语言的类型检查,可在不测试运行时期表达式的等价性的情况下进行,该语言即为静态类型的。一个静态类型的编程语言,是在运行时期和编译时期之间的处理阶段下重视这些区别的。如果程序的独立模块,可进行各自的类型检查(独立编译),而无须所有会在运行时出现的模块的那些信息,该语言即具有一个编译时期阶段。如果一个编程语言支持运行时期(动态)调度已标记的数据,该语言即为动态类型的。如果一个编程语言破坏了阶段的区别,因而类型检查需要测试运行时期的表达式的等价性,该语言即为依存类型的。
在动态类型中,经常在运行时期进行类型标记的检查,因为变量所约束的值,可经由运行路径获得不同的标记。在静态类型编程语言中,类型标记使用辨识联合类型表示。
动态类型经常出现于脚本语言和RAD语言中。动态类型在解译语言中极为普遍,编译语言则偏好无须运行时期标记的静态类型。对于类型和隐式类型语言较完整的列表参见类型和隐式类型语言。
术语推断类型(鸭子类型,ck typing)指的是动态类型在语言中的应用方式,它会“推断”一个数值的类型。
某些静态语言有一个“后门”,在这些编程语言中,能够编写一些不被静态类型所检查的代码。例如,Java 和 C-风格的语言有“转型”可用。在静态类型的编程语言中,不必然意味着缺乏动态类型机制。例如 Java 使用静态类型,但某些运算需要支持运行时期的类型测试,这就是动态类型的一种形式。更多静态和动态类型的讨论,请参阅编程语言。 对静态类型和动态类型两者之间的权衡也是必要的。
静态类型在编译时期时,就能可靠地发现类型错误。因此通常能增进最终程序的可靠性。然而,有多少的类型错误发生,以及有多少比例的错误能被静态类型所捕捉,仍有争论。静态类型的拥护者认为,当程序通过类型检查时,它才有更高的可靠性。虽然动态类型的拥护者指出,实际流通的软件证明,两者在可靠性上并没有多大差别。可以认为静态类型的价值,在于增进类型系统的强化。强类型语言(如 ML 和 Haskell)的拥护者提出,几乎所有的臭虫都可以看作是类型错误,如果编写者以足够恰当的方式,或者由编译器推断来声明一个类型。
静态类型通常可以编译出速度较快的代码。当编译器清楚知道所要使用的数据类型,就可以产生优化过后的机器码。更进一步,静态类型语言中的编译器,可以更轻易地发现较佳捷径。某些动态语言(如 Common Lisp)允许任意类型的声明,以便于优化。以上理由使静态类型更为普及。参阅优化。
相较之下,动态类型允许编译器和解译器更快速的运作。因为源代码在动态类型语言中,变更为减少进行检查,并减少解析代码。这也可减少编辑-编译-测试-除错的周期。
静态类型语言缺少类型推断(如 Java),而需要编写者声明所要使用的方法或函数的类型。编译器将不允许编写者忽略,这可为程序起附加性说明文件的作用。但静态类型语言也可以无须类型声明,所以与其说是静态类型的代价,倒不如说是类型声明的报酬。
静态类型允许构造函数库,它们的用户不太可能意外的误用。这可作为传达库开发者意图的额外机制。
动态类型允许建构一些静态类型系统所做不出来的东西。例如,eval 函数,它使得运行任意数据作为代码成为可能(不过其代码的类型仍是静态的)。此外,动态类型容纳过渡代码和原型设计,如允许使用字符串代替数据结构。静态类型语言最近的增强(如 Haskell 一般化代数数据类型)允许 eval 函数以类型安全的方式撰写。
动态类型使元程序设计更为强大,且更易于使用。例如 C++ 模板的写法,比起等价的 Ruby 或 Python 写法要来的麻烦。更高度的运行时期构成物,如元类型(metaclass)和内观(Introspection),对静态类型语言而言通常更为困难。