系统学习计算机体系结构、汇编语言程序设计和编译原理,真正建立对计算机系统的理解,而不是臆测。推荐书《深入理解计算机系统》(如何读本书)或南京大学的 MOOC《计算机系统基础 (一):程序的表示、转换与链接》,它们包含以上三门课的基础知识。之后,便对知乎上大部分关于编程语言的概念性疑问豁然开朗。

用专业思维搞定这个疑问:发射到 CPU 最终执行的只有机器码,无论编程语言是编译型、解释型,还是混合型,无论是 AOT 还是 JIT,也无论是以面向过程、面向对象、泛型还是函数式设计思想编写程序。通俗地讲,CPU 不知道 C/C++、Java 和 Python 程序的存在,它只是无差别地执行机器码指令,各种编程语言只是为人类(程序员)发明的。所以,思考编程语言的运行机制时,思维不能停在半途,而应理清整个过程:某语言程序的执行文本(源代码),究竟是怎么传导为 CPU 的执行行为的(机器码指令)。

最基本的两种编程语言运行机制,代表了两种程序执行的传导方式:编译型 vs. 解释型。引自 CS143: Compilers, © Stanford University, Prof. Alex AikenCS143: 01-01 Introduction: Compilers vs. Interpreters

编译型和解释型语言,在语法分析时所用的技术是相通的。编译型的执行传导比解释型更直白,大学编译原理课重点一般放在编译型。要搞清解释型是怎么传导执行的,不浮于理论,最有效的学习途径是自制一个解释器。《手把手教你构建 C 语言编译器》(write-a-C-interpreter),以及 @vczh 十年前写的《手把手教你写脚本引擎》都是上手教程。

多种编程语言共存的意义

既然编程语言是为人类(程序员)发明的,必然遵循人类的思维习惯,这造就了千差万别的编程语言。影响语言设计的思维有两点:

(一) 人类思维是层次化的解决不同领域的问题,称为问题领域 (problem domain) 或应用领域 (application domain)。

一个具体问题,可分解为上中下多个层次,从底层的细节控制微调,到高层的模块组织协调。

导致产生多种程序设计范型,如面向过程的结构化设计、面向对象设计、泛型设计等。

(二) 人类思维是个性化的有人偏爱明确 (explicit),让程序员负责更多;有人偏爱隐含 (implicit),让 Runtime 负责更多。

现存于世的编程语言要比 TIOBE Index 上列出的多得多,那里列出的只是最流行的 Top 20。有大量个性化的、私人自制的语言系统默默无闻,但说不定此时正在你身边的设备上干活儿。这些语言甚至不是 turing-complete or general-purpose

有本《Masterminds of Programming》(中文版《编程之魂》翻译的不好)是对 C++、Python、Java 和 C# 等多个流行语言发明者的采访编录。文中有大量发明者关于语言特性的抉择和考虑。理解语言系统的 Runtime

Runtime 翻译为“运行时”,可以做状语,如 In C++, the instantiation of a template occurs in compile-time, while the instantiation of a class occurs in runtime.

Runtime 作为名词用时,一般是指某种语言系统的基础设施。但不同的执行传导方式下,Runtime 的作用不尽相同。

[1] C Runtime Library (CRT) 是 C 语言的 Runtime,作为古典编译型语言的典型。CRT 包含 ISO C 标准库的实现(不同厂商的扩展不同,微软的 MSVCRT 还包括 ISO C++ 标准库和它自己的一些扩展)。CRT 的主要作用,是根据各厂商实现的不同,初始化对于标准库有用的全局数据和结构,这些初始化在进入 main 函数之前就完成了,例如 stdin、stdout、stderr、errno 等。但作为 C/C++ 程序,是可以选择不链接、不使用 CRT 的,这仍是合法的 C/C++ 程序(尤其对于内核程序)。这时,需要自己实现 CRT 的某些功能。CRT 只是编程用户态程序的一种便利。

[2] Common Language Runtime (CLR) 是 .NET/Mono 语言 (C#, VB.NET, etc) 的 Runtime,作为 JIT 编译型语言的典型(也称为 Execution Engine 或 Virtual Machine,如微软的实现 mscoree.dll 称为 Microsoft .NET Runtime Execution Engine)。它的主要作用,是在运行时将 CIL 字节码转换为平台特定的机器码并传导执行。CLR 是不可或缺的,如下图:.NET CLI and CLR

Stanford Compilers 课程章节 01-03 The Economy of Programming Languages 中也讨论了多种编程语言共存的问题:CS143: 01-02 Languages Economy: Why are there so many programming languages?

[Q] 为什么有如此之多的编程语言?

[A] 因为应用领域千差万别。题目问题中的 C/C++、Java 和 Python,各自擅长的问题领域不尽相同。 以 C/C++ 为例,其擅长的系统编程,特点是 low-level control of resources (hardware / system)。就是让程序员负责更多的控制,而不是让类似 Java 的 Runtime (JVM) 接管太多事情。另一方面,C/C++ 程序对执行传导的立即响应要求上,Java 和 Python 也无法满足。CS143: 01-02 Languages Economy: Why are there new programming languages?CS143: 01-02 Languages Economy: Why are there new programming languages? (continued)

[Q] 为什么还会产生新的编程语言?

[A] 一个事实:对某种编程语言的学习和练习,是这个语言生态中最大的开销(时间和金钱)。当一种语言变得广泛流行(成熟),它的进化速度随之就会变慢。相反,新发明的语言的进化速度是很快的。新语言没有历史包袱,更容易占领新(突发)出现的生态位。但新语言也会参考成熟语言的某些风格。CS143: 01-02 Languages Economy: What is a good programming languages?

[Q] 什么是好的编程语言?

[A] 不存在一个普适的标准,在一个框架下,评估所有编程语言的优劣。有一种“存在即合理”的说法:有人用的语言就是好的语言。但 Aiken 教授并不同意,反例是 VB 用的人很多,VB 难道是最好的语言之一?

参考

python和java都是用c文件吗_python是用C实现的,Java是用C++实现的,那为什么不直接用C或C++呢?...相关推荐

  1. java的sdk在哪个文件夹_我的计算机中的Java SDK文件夹在哪里? Ubuntu 12.04

    我知道它的安装,因为当我键入: $java -version 我得到: OpenJDK Runtime Environment (IcedTea6 1.12.5) (6b27-1.12.5-0ubun ...

  2. python无法启动此程序、因为文件损坏_python报错:无法启动此程序,因为计算机中丢失...

    python报错:无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-|1-1-0.dll api-ms-win-crt-runtime-|1-1-0.dll丢失的解决方法 ...

  3. java 网页保存为pdf文件怎么打开方式_js相关:JavaScript+Java实现HTML页面转为PDF文件保存的方法...

    js相关:JavaScript+Java实现HTML页面转为PDF文件保存的方法 发布于 2020-8-12| 复制链接 借助iText这个Java库,我们可以将HTML文件保存为图片文件进而转换成P ...

  4. Java+GeoTools工具包+读写shapfile文件

    本篇所用到的测试shapfile文件下载地址: 链接: https://pan.baidu.com/s/1S-TrFp_r8zyf_d0oBUeWqg GeoTools英文帮助文档地址: Geotoo ...

  5. 码出高效:java开发手册_Java 11手册:最聪明的技巧来简化Java 11导航

    码出高效:java开发手册 Java 11:提示和技巧,日常陷阱及更多 为了庆祝Java 11的发布,我们邀请了八位Java专家与他们分享最新版本的最佳和最差体验. 由于本系列旨在作为Java 11的 ...

  6. Python:pmml格式文件的简介、安装、使用方法(利用python将机器学习模型转为Java常用的pmml格式文件)之详细攻略

    Python:pmml格式文件的简介.安装.使用方法(利用python将机器学习模型转为Java常用的pmml格式文件)之详细攻略 目录 pmml格式文件的简介 1.PMML结构 pmml安装 pmm ...

  7. cmd无法运行python_通过Java-%1在cmd中运行python文件不是有效的Win32应用程序 - java...

    我正在尝试使用Java执行python代码.我的代码: public class PyTest { public static void main(String[] args) { Runtime.g ...

  8. python文件转换成jar包_Python一键转Jar包,Java调用Python新姿势!

    粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 今天的这篇文章,聊一个轩辕君之前工作中遇到的需求:如何在Jav ...

  9. Python实例篇:这样操作PDF文件一点都不枯燥了

    前言 大家好,我是辣条 之前辣条有发布过我们常用的两个技能点,今天第三个技能点(PDF)他来了 <Python实例篇:自动操作Excel文件(既简单又特别实用)> <Python技巧 ...

最新文章

  1. 要引爆用户增长?抵制“诱惑”更健康
  2. Flask之flask-script 指定端口
  3. 一文搞定 Hive 表分隔符
  4. Git_Eclipse:[2]Git初始化配置
  5. Spring Cloud 子项目
  6. 淘宝开源网络框架tbnet之buffer
  7. mysql事务 start transaction
  8. 压测学习总结——高并发性能指标:QPS、TPS、RT、吞吐量详解
  9. Jquery(一)选择器
  10. 手机无法被计算机识别,手机usb无法被电脑识别怎么办_电脑无法识别手机usb设备的解决方法...
  11. 两个小Tips: 解决Matlab初始化时间过长Office使用(KMS工具无效时)
  12. 安装和使用IBM PowerVP和IBM AIX
  13. buildroot的使用简介
  14. STM32F103-FreeRTOS 操作系统移植
  15. Hexo博客配置SSL证书
  16. 软件质量保障体系建设
  17. 知识点总结报告 1.26
  18. 干货 | 关于射频芯片最详细解读
  19. 如何在github上搭建自己的个人主页
  20. hybris下remaining days到期之后的处理办法

热门文章

  1. tp-link 怎么打开ssh服务_如何用Xshell远程连接VPS服务器
  2. 中医济世促醒汤-----发作性睡病
  3. 蒲丰投针计算机模拟ppt,蒲丰投针实验模课件.doc
  4. mt4中php是什么意思,MT4编程报警问题
  5. 海外社交媒体SNS运营之社交媒体概览
  6. 一文教你搞懂C语言的Q格式使用
  7. android googleplay 支付接入
  8. ios开发工具_7个基本的ios开发人员工具
  9. 软考证书具体用途--详细介绍
  10. linux 文件格式elf,linux ELF 文件格式 | ZION