问题

PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点?

回答
好的,我们来详细地探讨一下 PHP、Java、Python、C、C++ 这五种主流编程语言各自的特点和优点:



1. PHP (Hypertext Preprocessor)

PHP 是一种广泛用于Web开发的开源脚本语言。

特点与优点:

Web 开发的王者: PHP 是为Web开发而生的。它与HTML的集成非常紧密,可以直接在HTML中嵌入PHP代码,这使得创建动态网页变得非常简单快捷。
庞大的生态系统和社区: 拥有极其庞大的用户基础和活跃的社区。这意味着你可以轻松找到大量的库、框架、教程、文档和解决问题的方案。如果你遇到问题,几乎总有人已经遇到过并解决了。
成熟的框架支持: 拥有许多成熟且强大的框架,如 Laravel, Symfony, CodeIgniter 等,它们提供了结构化的开发模式、安全性保障和大量常用功能的封装,极大地提高了开发效率和代码质量。
易学易用: 相对于一些底层语言,PHP 的语法相对简单直观,上手门槛较低。对于初学者来说,可以快速学会并开始构建简单的Web应用。
部署方便: PHP 部署相对容易,通常只需要一个Web服务器(如 Apache 或 Nginx)和一个PHP解释器即可。
成本效益高: 由于其开源的性质和广泛的使用,使用 PHP 开发的成本相对较低,无论是开发人员的招聘还是所需的服务器软件都是免费的。
强大的数据库集成能力: 可以轻松连接和操作各种数据库,如 MySQL, PostgreSQL, SQLite 等。
丰富的内置函数: 提供了大量的内置函数,涵盖了字符串处理、文件操作、网络通信、日期时间处理等各个方面,减少了重复造轮子的工作。
持续发展: 尽管有时被诟病,但 PHP 社区一直在积极更新和改进语言,PHP 的性能也在不断提升(例如 PHP 7+ 的性能大幅超越了旧版本)。

适用场景:

动态网站和Web应用程序开发(最主要的应用)。
内容管理系统(CMS)如 WordPress, Drupal, Joomla。
电子商务平台。
API 开发。
服务器端脚本。



2. Java

Java 是一种面向对象、跨平台的编程语言,以其“一次编写,到处运行”的理念而闻名。

特点与优点:

跨平台性(Write Once, Run Anywhere WORA): Java 代码被编译成字节码,可以在任何安装了Java虚拟机(JVM)的平台上运行,无需重新编译。这极大地简化了跨平台开发和部署。
面向对象(ObjectOriented): Java 是纯粹的面向对象语言,支持封装、继承和多态,有助于构建模块化、可维护和可扩展的代码。
健壮性和稳定性: Java 设计时就非常注重健壮性。它有自动垃圾回收机制,可以减少内存泄漏;运行时异常处理机制也很完善,能够有效地处理程序运行时出现的错误。
安全性: Java 在设计时就考虑了安全性,其虚拟机提供了安全沙箱,可以限制代码的访问权限,防止恶意代码的执行。
强大的生态系统和成熟的框架: 拥有极其庞大和成熟的生态系统,尤其在企业级应用开发领域。Spring (Spring Boot), Hibernate, Maven, Gradle 等框架和工具是业界标准。
高性能: 尽管是解释执行(字节码),但通过即时编译器(JIT)优化,Java 的性能可以达到接近编译型语言的水平,尤其适合大型、高性能的应用程序。
多线程支持: Java 内置了对多线程的良好支持,可以轻松地创建和管理并发执行的线程,这对于构建高并发系统至关重要。
广泛的应用领域: 不仅在Web后端开发(Spring框架是事实上的标准),还广泛应用于:
企业级应用: 金融、ERP、CRM等大型复杂系统。
Android 应用开发: Android 官方开发语言之一。
大数据技术: Hadoop 生态系统的许多组件都使用 Java 编写。
桌面应用: 虽然不如 Web 和移动应用流行,但仍有许多桌面应用使用 Java。
嵌入式系统: 一些特定的嵌入式设备也使用 Java ME。
庞大的社区和丰富的文档: 拥有全球最大的开发者社区之一,可以获得大量支持、教程和解决方案。

适用场景:

大型企业级应用开发。
Android 移动应用开发。
大数据处理(Hadoop, Spark 等)。
金融交易系统。
Web 后端服务和微服务。
高性能计算。



3. Python

Python 是一种解释型、高级的通用编程语言,以其简洁、易读的语法而闻名。

特点与优点:

易学易用,语法简洁: Python 的语法非常接近自然语言,可读性极高。它使用缩进来表示代码块,大大减少了括号和分号的使用,使得代码看起来非常清晰。这降低了学习曲线,让开发者可以更快地实现想法。
丰富的标准库和第三方库: Python 拥有极其庞大且多样化的标准库,几乎涵盖了所有常见的编程任务。此外,还有数不清的第三方库(如 NumPy, Pandas, SciPy, TensorFlow, PyTorch, Django, Flask 等),使得 Python 在数据科学、机器学习、Web开发、自动化等领域拥有无与伦比的能力。
跨平台性: 与 Java 类似,Python 也能在不同操作系统上运行,无需修改代码。
解释型语言: 代码被逐行解释执行,这使得开发和调试过程非常快速。
面向对象、过程式和函数式编程范式: Python 支持多种编程范式,开发者可以根据需求选择最合适的风格。
强大的社区支持: Python 社区是世界上最大的开发者社区之一,拥有庞大的资源和活跃的讨论。
应用广泛:
数据科学与机器学习: 这是 Python 最耀眼的领域。NumPy, Pandas, Matplotlib, Scikitlearn, TensorFlow, PyTorch 等库使其成为数据分析、可视化和人工智能的首选语言。
Web 开发: Django 和 Flask 等框架提供了快速、安全的 Web 应用开发能力。
自动化脚本: 自动化运维、测试、数据处理等任务,Python 的简洁性使其成为理想的脚本语言。
科学计算: 在学术界和科研领域广泛使用。
教育: 因其易学性,常被用作入门编程语言。
网络编程: 易于构建网络应用和爬虫。
动态类型: 变量的类型在运行时确定,增加了开发的灵活性,但也可能带来一些运行时错误。
可扩展性: 可以通过集成 C/C++ 代码来扩展 Python 的功能,以获得更高的性能。

适用场景:

数据科学、统计分析、数据可视化。
机器学习、深度学习、人工智能。
Web 开发(后端)。
自动化脚本和任务自动化。
科学计算和研究。
教育和入门编程。
网络爬虫和网络编程。



4. C

C 语言是一种过程式编程语言,以其高效、低级控制和接近硬件的特性而闻名,是许多现代编程语言的基础。

特点与优点:

高效和高性能: C 语言的代码被直接编译成机器码,执行效率非常高,非常接近硬件操作。这使其成为开发操作系统、驱动程序、嵌入式系统等对性能要求极高的应用的理想选择。
低级内存访问和硬件控制: C 语言允许直接操作内存地址(通过指针),并且能够进行位操作,提供了对硬件的精细控制能力。这对于系统级编程至关重要。
可移植性(在一定程度上): 虽然 C 语言本身可以编译到不同的平台,但要实现真正的“一次编写,到处运行”,需要注意平台相关的差异和使用标准库。不过,核心的 C 代码通常具有良好的可移植性。
结构化编程: C 语言支持函数、循环、条件语句等结构化编程元素,使得程序逻辑清晰。
底层操作能力: C 语言是许多操作系统(如 Linux, Windows 的内核部分)和嵌入式系统的基础,可以直接与硬件交互。
生成其他语言的基础: 许多高级语言的编译器和解释器都是用 C 语言编写的。学习 C 语言有助于理解计算机底层的工作原理。
丰富的库支持(标准库): 提供了强大的标准库,涵盖了输入输出、字符串处理、数学运算、内存管理等基本功能。
高效的内存管理: 程序员需要手动管理内存(使用 `malloc`, `free` 等函数),这既是优点也是缺点。如果管理得当,可以实现极高的效率,但如果管理不当,容易出现内存泄漏或段错误。
简洁的语法: 相对于 C++,C 语言的语法更加简洁,易于理解其核心概念。

适用场景:

操作系统开发(Linux, Windows 内核)。
嵌入式系统开发(微控制器、RTOS)。
设备驱动程序开发。
高性能计算。
游戏引擎开发。
编译器、解释器和虚拟机开发。
数据库系统。
需要直接硬件访问的底层应用。



5. C++

C++ 是 C 语言的扩展,是一种多范式(支持过程式、面向对象、泛型编程)的编译型编程语言。它在 C 的基础上增加了面向对象的特性和其他许多高级功能。

特点与优点:

面向对象编程(OOP): C++ 是面向对象的,支持类、对象、封装、继承、多态,这使得构建大型、复杂的软件系统更加容易管理和维护。
高性能和效率: C++ 同样编译成机器码,并提供了低级内存访问能力,因此在性能方面与 C 语言相当,非常适合对性能要求极高的场景。
强大的抽象能力: 支持类、模板(泛型编程)、运算符重载等特性,可以创建高度抽象的代码,提高代码的复用性和可读性。
兼容 C 语言: C++ 几乎完全兼容 C 语言,可以直接使用 C 语言的库和代码。
丰富的特性: 提供了许多强大的特性,如:
内存管理: 允许手动控制内存,也提供了智能指针等现代内存管理工具。
STL (Standard Template Library): 提供了大量高效的容器(如 `vector`, `list`, `map`)、算法和迭代器,极大地提高了开发效率。
异常处理: 提供了结构化的异常处理机制来处理运行时错误。
泛型编程: 通过模板,可以编写与类型无关的代码,实现代码的重用。
广泛的应用领域:
游戏开发: 许多大型游戏引擎(如 Unreal Engine, Unity 的部分核心)和游戏都使用 C++。
高性能计算和科学计算: 领域如物理模拟、金融建模等。
操作系统和系统软件: 如 macOS, Windows 的核心组件。
浏览器引擎: Chrome, Firefox 等。
数据库系统: MySQL, PostgreSQL 等。
桌面应用程序: 如 Adobe 系列软件。
嵌入式系统: 许多对性能和内存控制要求高的嵌入式系统。
学习曲线陡峭: 相较于 Python 或 PHP,C++ 的语法更复杂,概念更多,内存管理也需要更精细的操作,学习曲线相对陡峭。

适用场景:

游戏开发(引擎和游戏本体)。
操作系统和系统软件。
高性能计算和科学模拟。
图形用户界面(GUI)应用程序。
嵌入式系统和实时系统。
需要极致性能和底层控制的应用。
大型复杂软件项目的核心部分。



总结比较:

| 语言 | 主要特点/优点 | 主要劣势(相对而言) | 主要应用场景 |
| : | : | : | : |
| PHP | Web 开发简单快捷,生态成熟,易学易用,成本效益高。 | 性能不如编译型语言,类型系统相对较弱,有时被认为不够“优雅”。 | 动态网站、Web 应用、CMS(WordPress)、电子商务、API 开发。 |
| Java | 跨平台性强,健壮,安全,面向对象,生态系统庞大成熟,性能优异(经过优化后),多线程支持好。 | 启动速度相对较慢,内存占用可能较高,对于小型项目可能显得过于重量级。 | 企业级应用,Android 应用,大数据(Hadoop),金融系统,Web 后端,微服务。 |
| Python | 语法简洁易学,开发效率极高,库资源极其丰富(尤其在数据科学和 AI 领域),可读性强,社区活跃。 | 性能相对较低(解释型语言),在移动端开发方面不如 Java/Kotlin,GIL (Global Interpreter Lock) 限制了多线程的并行计算能力。 | 数据科学、机器学习、人工智能,Web 开发(后端),自动化脚本,科学计算,教育。 |
| C | 性能极致,低级控制能力强,接近硬件,可移植性好(需注意平台差异),是很多系统软件的基础。 | 语法相对晦涩,内存管理复杂(容易出错),缺少高级抽象(面向对象、泛型),开发效率不如高级语言。 | 操作系统,嵌入式系统,驱动程序,高性能计算,编译器,数据库内核。 |
| C++ | 性能极致,面向对象,多范式,STL 功能强大,兼容 C,抽象能力强,控制力强。 | 语法复杂,学习曲线陡峭,内存管理需要精细,编译时间较长。 | 游戏开发,操作系统,高性能计算,浏览器引擎,数据库,桌面应用程序,嵌入式系统,对性能和资源控制要求极高的应用。 |

选择哪种语言取决于具体的项目需求、团队的熟悉程度、性能要求、开发周期等多种因素。每种语言都有其闪光点和适用场景。

网友意见

user avatar

PHP:没有优点

Java:库多,库多,库多

Python:语法清楚,语法清楚,语法清楚

C:能操纵底层,能细粒度优化性能

C++:啥都有,啥都有,啥都有

————————————————————————————————————————————

汇编:

C:

Java:

C#:

PHP:

Python:

Go:

Haskell:

Lisp:

最后是 C++:

(图部分为自制,部分来自网络)

user avatar

相信每一个计算机科班出身的同学或许都有这样的经历:在大三的某一天,仿佛打通了全身筋脉一般把三年的所学:“数电里的与非门——计算机体系结构——汇编语言——C语言——C++语言——Java语言”。所有知识全部串联了起来。所有这些语言的出现都仿佛都有了必然性和追根溯源的历史感。



**阅读指引**

读懂此文,需要以下基础:

1. 至少写过50000行的代码;

2. 汇编基础(静态数据段,代码段,堆栈段)。



有以下或者类似知识就更好了:

1. C语言编译,C++对象模型,MFC反射的实现

2. JAVA的解释器运行原理

3. 使用过javascript,Python,PHP:感受过代码和类型系统在运行时的自由程度的不同

4. 计算机组成原理



**序 —— 一些问题**

1. 程序设计语言的目的是什么?

2. 为什么大多数语言有控制流?逐行执行+跳转。这与我们的需求差很远(例如一个教务管理系统、一个自动打车APP)

3. 为什么类型申明在C语言中要与控制流隔离开来?

4. 现在主流语言最基本的元素是?

5. 有没有语言它的类型结构,在运行时也可以改变?

动态性?


什么是动态性?

1. 编译后确定了什么信息,之后不再改变;

2. 运行时可以改变、添加什么;

3. 运行时是否保存着类型信息。


程序中的信息分为几类?

1. 数据信息

a) 编译时Meta-Data元数据(类型框架、空间占用)

b) 运行时Meta-Data元数据(继承体系、用于new或者反射)(特别区别编译与运行的Meta-Data的不同。)

c) 堆栈段中地址偏移(C++的switch case中不能声明变量、共享内存)

d) 静态段中地址

2. 指令信息

a) 代码段(动态性需要操作系统或者虚拟机支持,例如动态链接库,动态类加载,lisp语言自生成代码)



**语言举例**


**汇编语言**


汇编语言没有动态性吗?

没有。首先,寄存器、数据段、堆栈、代码段完全由程序员控制。完完全全是写死了的。然后,根据冯诺伊曼机的规则;取指令,执行,取指令,执行……



既然都有数据段了,还要堆栈段来做什么?这不是多余?

一开始本没有堆栈,直到60年代出现了module模块化,才有了堆栈。汇编中的模块叫子程序,不过仍旧靠程序员全权控制。


堆栈和模块化的优点有?

1. 递归

2. 功能分离到模块,可复用

3. 封装作用域


堆栈和模块化的缺点有?

1. 时间上:保存现场、还原现场的代价(另,高级语言编译“消除尾递归”节约部分成本)

2. 空间上:爆栈的危险



**C语言**


C语言比起汇编多了什么东西?

1. 编译器

2. 表达式(相比汇编,可以处理多个操作数了。)

3. 函数与模块{}(真·模块化,栈操作无需程序员完成)

4. 类型(原子类型、结构类型、数组、指针)

5. 头文件,库

总之,C语言并没有比汇编多了新的特性,它只是把汇编的繁琐操作抽象出来,让编译器完成,减轻程序员负担。


编译器的作用是?

(减少程序员负担)

1. 解析表达式,控制流(汇编中指令只有1-3个操作数,而表达式可以多个操作数)

2. 模块和函数的抽象(完成堆栈中保存恢复现场的工作)

3. 类型变量的管理(所有变量被替换成直接访问的地址,最快的访问速率)

4. 代码优化


变量是替换成可以直接访问地址的?

a) 编译时的Meta-Data(struct的成员,数组的长度,以便替换到指令流;只在编译器中维护,编译结束后丢弃)

b) 计算出每个变量相对于该模块的偏移(一旦算出该偏移地址,将固定在执行码中,无法改变;就是说编译完成后,所有变量的偏移地址都固定下来了。)

c) 对变量的存储进行管理(所有的变量/内存地址的布置,都是在编译时确定的;也就是说,可执行码中没有类型信息,只有地址,任何数据都是地址来操作,完全和汇编类似。至于寄存器的安排,那是更下一层的类似缓存策略算法的结果。)


编译出来的执行码与汇编的执行码有特征的区别吗?

没有。特别是在编译器优化之后。

无法通过执行码,区分汇编和C程序。

打个比方,一只“程序猫”在黑笼子里,在里面喵喵的叫,无法通过它的叫声来判断它是“汇编猫”还是“C语言猫”。


从效率上来讲,C的多余代价在哪里?

1. 编译的时间

2. 模块的堆栈操作

总之,经过优化的C程序执行码与汇编效率几乎相同。

因为从理论上来说,C并没有引入运行时的新机制。

我理解的C语言只是一种汇编的宏而已。

**C++语言**

(推荐《深度探索C++对象模型》)


C++语言比C语言多了什么?

1. 成员函数

2. 类型继承体系

3. 虚函数、虚继承

4. 模板

5. 涉及到了多种编程范式

(开始更抽象,语言逐渐开始脱离冯氏结构。)

其中,面向对象的思想,让程序与现实事物的关系更加紧密。

程序设计的负担,也因为OO与设计模式的流行,而变得轻松。


编程范式是什么?

就是一套指导思想行为准则。

(例如,C是过程式,Haskell是函数式,JAVA是面向对象,Python是简单的大杂烩,shell是调用命令的,lua是调用c程序的,PHP是写页面的,ProLog是线性逻辑推理的。

再例如,UML是描述规格specification的,XML是存储数据的。

再再例如,CSS是描述网页表现的,HTML是描述网页内容的。

javascript比较神奇,不敢说。)



C++有什么编程范式?

1. 过程式(使用STL的类C语言编程)

2. ADT式(自定义抽象数据类型,继承;但是不用new,不用virtual;拷贝构造;为了防止资源泄漏,也发明了RAII的方式进行资源的初始化和释放)

3. 面向对象式(使用new,使用virtual,需要指针或引用;实现多态。)

4. 泛型编程(《Modern C++ Design》各种奇淫技巧,业务层代码比较少遇到)


C++编译器是怎样实现的?

C++开始有一个叫做cfront的编译器,即把C++语言先翻译成C语言。

然后再用C编译器来编译,C的编译器并不知道此段代码是来自C++还是C。


C++语言特性分别是怎样实现?简单说。

1. 成员变量:和C语言的struct 类似,最后也会被直接替换成地址,便于高效访问。

2. 成员函数:使用特殊函数名编码方案,翻译成C函数,并添加this指针作参数。(如___clsA12345func001(...,clsA *this))

3. 类型继承体系:通过C++编译时的Meta-Data来实现。即在编译时,编译器是知道类型信息与继承体系的,但是编译成C语言后就丧失了此类型信息。

4. 虚函数、虚继承:为了支持多态,这也是“面向对象”最重要的特性,使用了虚函数表和虚基类表。注意,运行时多态是通过运行时查表实现的。稍后详细说。

5. 模板:通过代码复制的方式实现。每次编译都需要重新编译,不能编成库文件直接使用。


C++编译器的准则与virtual机制?

1. 首先,C++的编译准则,希望做到与C一样的效率。希望做到以下:

——a) 没有运行时调用间接性。任何数据在运行时都是一个地址直接就访问到。

——b) 没有运行时的Meta-Data。无需通过Meta-Data来访问某个复杂的类层次。

——c) 所有的数据都希望用C中struct来实现,即在编译时就确定好对象及其成员地址。

2. 以上,在过程式范式,与ADT范式中都是成立的。

3. 但是,在面向对象范式中,渴望做到:

**需要维系着同一个继承体系成员结构的一致性,只有这样,才能保证运行时的多态性。即希望通过同一个入口,访问到父类或者子类的相同数据成员、函数成员,而不在乎具体对象的是父类还是子类。**


C++的virtual机制如何实现的?

a) 虚函数

i. 虚函数,运行时,每个有虚函数的类型(哪怕是子类)都维持着一个虚函数表,这已经是运行时的Meta-Data,通过查表,即可找到对象自己的虚函数。

ii. 例如clone肯定是object.__vptr__Base->#3(),无论具体的对象。

b) 多重继承

——如何处理后继的base基类?由编译器判断指针类型并加上相应的偏移。

c) 虚继承

——添加一个虚基类指针,指向共享部分。

这样的缺点有两个:

1. 虚基类的子类都要背负一个基类指针指向共享部分。如果继承了多个虚基类,还需要多个这样的指针。(Microsoft的解决方法是增加一个虚基类表,类似于虚函数表。)

2. 虚继承链条的增加,会导致间接访问的层次增加。例如两个菱形继承的串联。


跨平台的级别有哪些级别?——头文件,库,源代码

1. C++确实在源代码的层次是可能跨平台的(例如《POSA2》中加了针对不同平台的各种宏的代码)。

2. 也可以通过相同的头文件去访问不同平台的库。

3. 但是,不同操作系统中的不同的API大大增加了跨平台的难度。

4. 跨平台的责任留给了程序员(充斥着大量宏的C++跨平台代码确实让人头疼。)

5. 编译器面对不同的系统也不敢作为,它只是负责编译源代码,链接。


如何使用C++才能保证其高效性能?

1. 有额外负担的机制:虚函数,虚继承,拷贝构造。

2. 用一次虚函数,多了一次指针寻址的效率损失,并且相对于inline内联(另,inline是编译器优化的重头),还损失了保存和恢复现场的效率。

3. 用一次虚继承,也多一次指针寻址的效率损失。(另,虚基类没有成员变量没有虚函数的时候会被优化。这也是JAVA可以多重继承接口interface的原因。)

4. 不要使用virtual在复杂的多继承,深层次继承中。

5. 编译速度会较慢:virtual机制会使编译器处理更多的Meta-Data。



**JAVA语言**

(推荐《本地Java代码的静态编译和动态编译问题》)


JAVA语言比C++语言多了什么?


1. 虚拟机

a) 跨平台

b) 动态编译

c) 动态特性

2. 没有指针

3. 没有类的多继承,有接口的多继承。

4. 统一的库

从编译来说,JAVA比C++迈出了一大步。

它的跨平台特性和运行时的灵活性,为JAVA自己以及未来语言都提供了很多可能性。


虚拟机的好处有什么?

1. 跨平台:在OS与字节码间隔了一层。实现了程序员无负担的跨平台。

2. 动态编译:许多信息不必在编译后确定,为动态特性提供可能,稍后详细说。

3. 运行时维护着类型信息,甚至可以加载新的类型。(CORBRA依赖这个实现)



JAVA编译执行的过程是怎样的?


1. 编译后产生一个基于堆栈的字节码。

2. JRE在不同的OS上提供支持。

3. 起初的JRE是解释执行的,效率低下。

a) 获取待执行的下一个字节码。

b) 解码。

c) 从操作数堆栈获取所需的操作数。

d) 按照 JVM 规范执行操作。

e) 将结果写回堆栈。


JAVA是如何解决执行效率低下的问题呢?

使用JIT(Just-in-time)编译器进行动态编译。


JIT(Just-in-time)是怎样运行的呢?如何解决了效率的问题?

如上图:

1. 每次按照一个function来编译。转成中间表示,并优化其效率,再生成可执行码。

2. 编译器的编译线程和执行线程是分开的,应用程序不会等待编译的执行。

3. 分析框架Profiler会观察程序行为,对频繁执行的function进一步优化。(例如function内部对象维持一个池不必每次生成。)


动态编译的优点有什么?

可以根据程序的行为,优化其代码

1. 例如频繁执行的function——热方法

2. 例如arrayCopy方法,如果每次都拷贝大段内存,在指令集中有特别指令可以加速。

3. 例如类层次结构,多态的优化。(大多数虚调用都有其固定的一个目标,JIT因此生成的直接调用代码比虚表调用代码的效率会更高。)


动态编译的缺点有什么?

1. 大量的初始编译会影响程序启动时间。

2. 运行时候的编译,行为分析都需要花费时间。

3. 运行效率达到稳定需要时间。

4. 实时GUI型的程序不能忍受“动态编译”和“GC”带来的延迟。

JAVA如何解决实时的需求?


使用AOT(Ahead-of-time)编译器:预先编译成为可执行码。

AOT(Ahead-of-time)的缺点:

对于一些动态特性的支持效率低下

1. 反射机制

2. 运行时类加载

JIT与AOT的对比



总体来说,JAVA适合怎样的应用呢?

JAVA比较时候需要长期运行的应用,例如Web服务器,Daemon服务。


**函数式语言**


函数式语言通常有哪些呢?


1. 函数式语言

a) Lisp

b) Scheme

c) Haskell(纯函数式)

d) F#?

2. 包含了函数式特性的语言

a) Python

b) Javascript

c) JAVA

d) C?



函数式语言有哪些特性?


1. 函数无副作用,只对输入输出有作用

2. 高阶函数,lamda演算。(这个像C函数指针,但是它是高阶的,即返回值可能也是函数)

3. 没有过程,类似规格说明的语法,更容易理解,自解释。

4. 基于list的编程,函数更通用。

5. 惰性计算(这个很像“树形DP”)

6. 有对应的数学形式化表达,有可能证明其正确性。(最终目标可能是保证程序没有bug。)

7. 其模型适合多核或者分布式的计算。

a) 不变性(immutable)

b) 惰性计算/按需计算(lazy evaluation)

c) **最重要的是,由于函数式语言不可在同一数据上做修改,每一次运用一个函数都会在新的位置产生新的数据,这与过程式语言在同一位置对数据做多次操作不同:函数式语言的函数依赖于前一次函数产生的结果数据,过程式语言依赖于数据的位置。这里函数式语言就暗含了计算的依赖顺序,如果没有前后顺序关系,就可以并发。而过程式语言没有指定这个顺序,就需要通过加锁、Actor、Channel等模式来指定这个顺序**

总的来说,函数式语言,向着更抽象迈了一大步,更像是数学上的表达,几乎与冯诺伊曼体系断绝了关系。



函数式语言的劣势?


1. 效率不高(因为其抽象,远离了冯诺伊曼体系)

2. 平台以及开发环境都比较简单。

3. 缺少推广,应用不广泛


**逻辑程序设计**

ProLog语言,线性逻辑。人工智能语言。没有接触过。



**总结**

动态性有哪些呢?

1. 多态性:运行时根据具体对象来访问属于它的方法。(而不理会指针的类型。)

2. 反射:运行时维系着类型结构的Meta-Data。

3. 运行时类加载:运行后再次加载新的数据类型和指令流。

4. 动态链接:OS根据按需链接库文件。


编译语言 和 解释语言 的分界在哪里?

语言本身并没有编译类型或者解释类型。(例如:JAVA也可以静态编译后成可执行码。)只有少数运行时特性是依赖于解释型的。(可能需要运行环境的支持。)


为什么解释语言都需要虚拟机或者运行环境支持?

动态编译,运行时Meta-Data的保存,这些功能对于每个程序都是一致的。

所以把它们分离开来,不必每个程序植入这些代码


非脚本语言 和 脚本语言

脚本语言,我理解是负责调度其他代码的语言。

例如shell脚本(调用命令),lua(调用C)。


跨平台分为哪些层次?

1. 源码跨平台(C,C++,但是因为系统调用接口不同,程序员负担太大,但是汇编却不是。)

2. 执行码跨平台(JAVA,有些语言直接从源码解释执行,例如Javascript,PHP)

发展历史(推荐《近看图灵碗 (一. 从苏黎世到巴黎)》)


学术上有哪些实验性语言?

1. Fortran

2. ALGOL58

3. ALGOL60

4. Lisp

5. smalltalk


常用语言

过程式:C,ALGOL,Pascal,

面向对象式:C++,smalltalk,JAVA,Delphi

函数式:Lisp,Scheme,Haskell,

逻辑式:Prolog

脚本?PHP,Python,Ruby

存储描述信息:XML,CSS,HTML


**回答问题**

程序设计语言的目的是什么?

1. 控制数据

2. 控制指令流

为什么大多数语言有控制流?逐行执行+跳转。这与我们的需求差很远(例如一个教务管理系统。)

逐行执行,很大程度是起源于冯诺依曼体系结构。


为什么类型申明在C语言中要与控制流隔离开来?

因为在编译时,具体的类型信息,要转化成地址偏移,然后替换控制流中的类型变量。


现在主流语言最基本的元素是?

控制流 与 类型系统。


有没有语言它的类型结构,在运行时也可以改变?

Javascript只有对象没有类,使用prototype的方式继承,运行时给某个对象添加新的数据成员。没有类型体系。

许多后来的语言在运行时都保存着类型信息的,例如Python,JAVA。


**综上所述**

控制流——指令流

类型系统——为了计算出变量地址信息

区分运行时的Meta-Data与编译时的Meta-Data

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有