前面我们知道了高级编程语言计算机是不能直接识别的,需要通过翻译成机器码然后交由计算机执行。
根据不同的翻译机制,又分为编译型和解释型。
注意,翻译源代码是一个非常复杂的过程,大致包括词法分析,语法分析,语义分析,性能优化,目标代码生成等五个步骤。在初学阶段没有必要研究这个,如果感兴趣可以阅读《编译原理》一书。
接下来我会使用通用的语言和类比的方式讲解编译和解释。
如果把高级编程语言编写的代码比作一篇英文文章,计算机比作一个不懂英文的人。那么,为了让这个人阅读这篇文章,可以找一名懂英文的翻译将这篇文章整体翻译成中文版。然后他就可以随时随地的阅读这篇翻译后的文章。
编译的过程其实跟上面翻译的过程很像。
编译型编程语言就是通过编译器(英文翻译)将源代码(编译型编程语言编写的程序,类比英文文章)编译(翻译)成可执行文件(翻译后的文章)。

可执行文件可以在任何支持的平台上,脱离编译环境运行。因为可执行程序就是机器码,所以它的执行效率高。但是编译型编程语言一般是不能跨平台的,也就是说不能在不同的操作系统间任意切换, 并且修改程序也非常不方便,只要源代码修改了,都需要重新编译生成新的可执行文件。C语言,C++就是典型的编译型编程语言。
接上面的类比,翻译这篇英文文章,还可以通过随身电子词典,逐字逐句的边看边翻译。
解释型编程语言就是通过解释器(电子词典)将源代码(解释型编程语言编写的程序)逐行解释成机器码,然后交由计算机执行。

解释型编程语言编写的程序离不开解释器,因为是边翻译边执行所以相对效率不高,但是修改起来非常方便,只要源代码修改了,下一次执行就是修改后的代码。解释型编程语言大都可以跨平台运行,这归功于解释器。Python,php就是典型的解释型编程语言。
Python属于典型的解释型编程语言,支持所有常见的平台,例如Linux,Windows,Mac OS, Android, FreeBSD等等,只要在不同的平台上安装了对应的解释器,代码就可以正确运行,一般不需要担心任何兼容性问题,真正做到了"一次编写,到处运行"。
另外,关于执行效率,你可能会看到很多人说python的执行效率差。那只是相对而言,随着硬件性能的提升,和很多优化手段,python在某些时候执行效率甚至会超过c语言,所以忘记这个效率问题,全心全意的学习python吧。
总结编译型编程语言与解释型语言的区别如下表:
| 类型 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 编译型语言 | 通过专门的编译器,将所有源代码一次性转换成特定平台(Windows、Linux 等)执行的机器码(以可执行文件的形式存在)。 | 一次编译,多次运行,脱离编译环境,并且运行效率高。 | 可移植性差,不够灵活。 |
| 解释型语言 | 由专门的解释器,根据需要将部分源代码临时转换成特定平台的机器码。 | 跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码。 | 一边执行一边转换,效率不搞。 |
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识