JavaRush /Java 博客 /Random-ZH /编程语言的级别
Marat Sadykov
第 41 级

编程语言的级别

已在 Random-ZH 群组中发布

介绍

有哪些不同的编程语言?其中蕴含着什么样的概念?他们是如何发展的?在本文中,我们将根据所谓的级别来了解编程语言的类型 - 从机器代码(低级,接近计算机硬件)到 Java 或 C# 等语言(高级)。程序的文本列表在变成一组 0 和 1 的过程中经历的转换越少,级别就越低。
编程语言级别 - 1
接下来我们将看看:
  1. 低级语言(机器代码和汇编)
  2. 中级(C、Fortran……)
  3. 高级(C++、Java、Python、Ruby、JavaScript...)
该级别还表征了未来计划的清单需要详细到何种程度才能实施。这个过程对人类来说有多简单?语言的水平不应被视为其能力的明确指标。编程语言是一种在一个领域有效而在其他领域不太有用的工具。细木工和木匠都用木头工作。第一个有一个主要工具 - 一套凿子,第二个 - 一把斧头。然而,木匠会让雕花柜更美观,木匠会让房子建得更快。尽管每个人都有能力完成对方的工作,但他们的效率会低得多。计算机中的各种数据表示为零和一的集合。用于其处理的控制命令是包含确定必要信息的位置和修改方法的指令的相同数据。

机器语言(最低级别)

我们必须从软件区域到硬件区域进行短暂的访问。让我们以简化的形式来看一下。 处理器是计算机的主要“大脑”。安装它的主板包含用于通过总线(用于通信的数据通道)与其他设备交互的控制器。
编程语言级别 - 2
有些以高速工作(红色箭头):处理器从内存中提取命令并操作数据,显卡(尤其是在 3D 游戏中)消耗大量纹理、形状、像素坐标和其他对象以在显示器屏幕上构建图像。其他的(由于信息交换速度的限制)不需要这么高的指标。各种内部和外部设备在图中用绿色箭头连接。

处理器的内部世界

所有处理器命令都来自内存,以二进制形式执行。指令的格式、数量、子集取决于其体系结构。他们中的大多数人彼此不相容并遵循不同的意识形态。而且命令的类型很大程度上取决于处理器工作的模式(8/16/32...位深度)和数据源(内存、寄存器、堆栈...)。相同的动作可以用不同的指令来表示。处理器具有用于将两个操作数相加 (ADD X,Y) 以及将 1 与指定操作数相加 (INC X) 的指令。向操作数添加三元组可以通过 ADD X,3 或调用 INC X 三次来完成。而且,对于不同的处理器,无法预测这些方法中哪种在速度或内存占用方面将是最佳的。为了方便起见,二进制信息以十六进制形式写入。让我们考虑一个熟悉的程序的一部分(C语言,其语法类似于Java)
int func() {
    int i = getData("7") ;
    return ++i;
   ...
}
以处理器指令序列的形式实现相同操作的代码: ... 48 83 ec 08 bf bc 05 20 00 31 c0 e8 e8 fe ff ff 48 83 c4 08 83 c0 01 ... 这就是英特尔处理器的低级编程语言的实际样子。使用参数调用方法并返回加一的结果的片段。这是机器语言(代码),无需转换,直接传输到处理器执行。 优点:
  • 我们完全掌握了情况,我们拥有使用处理器和计算机硬件的最广泛的可能性。
  • 我们可以使用所有组织和优化代码的选项。
缺点:
  • 有必要对处理器的功能有广泛的了解,并在执行代码时考虑大量的硬件因素。
  • 创建比给出的示例稍微复杂的程序会导致编写代码和调试代码所花费的时间急剧增加。
  • 平台依赖性:为一个处理器创建的程序通常无法在其他处理器上运行。对于该处理器,在其其他操作模式下,可能需要进行代码编辑。
机器代码在计算机诞生之初就被广泛使用;在计算机先驱时代没有其他编程方法。目前,微电子领域的工程师在开发或低级测试处理器时偶尔会使用它们。

汇编语言(低级)

与计算机不同,你和我能更好地感知文本/语义形式的信息,而不是数字形式的信息。您可以轻松地在智能手机上说出五十个联系人姓名,但您不太可能能够记住他们相应的电话号码。编程也是如此。我们通过三个基本步骤来提升类型阶梯:
  • 让我们将一条符号指令与执行相应操作的一组数字处理器指令相关联。
  • 让我们分别重点介绍处理器指令的参数。
  • 让我们介绍一下命名内存区域、变量和各个命令的位置的功能。
让我们比较一下前面程序的机器代码(中)和汇编语言(右)的片段:
2004b0     48 83 ec 08      sub    $0x8,%rsp
2004b4     bf bc 05 20 00   mov    $0x2005bc,%edi
2004b9     31 c0            xor    %eax,%eax
2004bb     e8 e8 fe ff ff   callq  getData
2004c0     48 83 c4 08      add    $0x8,%rsp
2004c4     83 c0 01         add    $0x1,%eax
正如您所看到的,编写程序的过程已得到简化:无需使用参考书来生成数字命令值、计算转换长度、在内存中跨单元分配数据以及其他处理器功能。我们从一组符号命令和执行逻辑所需的参数中描述所需的操作,然后翻译程序将文本文件翻译成处理器可以理解的一组零和一。 优点:
  • 编写和修改代码的过程得到了简化。
  • 保持对所有硬件资源的控制。
  • 将程序移植到其他平台相对容易,但需要根据硬件兼容性进行修改。
缺点:
  • 汇编语言是一种低级编程语言。即使创建一小段代码也很困难。另外,还需要考虑到设备的具体操作情况。
  • 平台依赖性。
最流行的 Java 演示示例:
public static void main(String[] args) {
    System.out.println("Hello World!");
}
将如下所示(NASM 语法,使用 Windows API 和 kernel32.lib):
global _main
	extern  _GetStdHandle@4
	extern  _WriteFile@20
	extern  _ExitProcess@4

	section .text
_main:
	; DWORD  bytes;
	mov 	ebp, esp
	sub 	esp, 4

	; hStdOut = GetstdHandle( STD_OUTPUT_HANDLE)
	push	-11
	call	_GetStdHandle@4
	mov 	ebx, eax

	; WriteFile( hstdOut, message, length(message), &bytes, 0);
    push	0
	lea 	eax, [ebp-4]
	push	eax
	push	(message_end - message)
	push	message
	push	ebx
	call	_WriteFile@20

	; ExitProcess(0)
	push	0
	call	_ExitProcess@4

	; never here
	hlt
message:
	db  	'Hello, World', 10
message_end:
与机器代码一样,汇编语言更常被工程师和系统程序员使用。它用于编写操作系统内核中与硬件相关的部分,这些部分对时间要求严格或对各种外围设备驱动程序的实现功能至关重要。但最近他们越来越少地使用它,因为它的使用大大降低了程序到其他平台的可移植性。有时他们使用反汇编过程 - 他们从数字代码创建程序的汇编程序列表,以解析执行小片段的逻辑。在极少数情况下,如果原始高级代码不可用:分析病毒以对抗病毒或丢失源代码。汇编语言被认为是第一/第二代(我们不会单独考虑汇编程序出现之前的伪代码及其与符号命令的区别)。我想强调的是汇编程序在演示场景中的使用:艺术、数学和低级编码的融合,以程序的形式体现了创作者的艺术理念,在资源有限的情况下生成视频剪辑。通常,程序和数据文件的总大小不应超过 256 字节(4/64 KB 格式也很流行)。以下是 4 KB 程序的示例:

C组/Fortran语言(中级/高级)

随着计算机技术能力的发展,汇编代码的功能量和执行时间已不再令人满意。编写、测试和维护程序的成本比其能力的增长速度快一个数量级。有必要降低程序员对设备功能知识的要求,为他提供一个工具,使他能够用接近人类逻辑的语言进行编写。进入新的编程语言类型水平。提供拆分成各种模块并进一步顺序调用的能力(过程式编程范式),提供各种类型的数据构造它们的能力等。此外,这些措施还提高了代码向其他平台的可移植性,使组织结构更加舒适。团队合作。最先支持上述所有功能的语言之一是Fortran,它于上世纪 50 年代开发。能够使用循环、分支、子例程以文本形式创建执行逻辑的描述,并使用数组进行操作,并以实数、整数和复数的形式呈现数据,这让工程师和科学家感到高兴。在很短的时间内,科学“框架”和图书馆就被创建了。所有这一切都是因为 Fortran 在今天仍然具有相关性,尽管是在一个狭窄的科学环境中,并且正在发展,因为发展的包袱非常大,仅IMSL库自 1970 年以来一直在积极发展(!),如何很多类似的相关软件你还记得吗?-老前辈?这个级别语言发展的另一个分支是C。如果 Fortran 成为科学家的工具,那么 C 的创建是为了帮助程序员创建应用软件:操作系统、驱动程序等。该语言允许您手动控制内存分配并提供对硬件资源的直接访问。C 程序员必须控制低级实体,因此许多人认为 C 是一种高级汇编语言,通常被称为“中级”语言。在将数据类型引入汇编程序、过程化和模块化编程的元素之后,C 语言仍然是系统编程的主要语言之一,这也得益于近年来微电子学的快速发展。各种小工具、控制器、网络和其他设备都需要驱动程序、协作协议的实现以及其他相对底层的软件来实现与设备的交互。所有上述因素都促进了当今对该语言的需求。面向对象和函数式原则以 C++、C#、Java 的形式进一步发展,借鉴了 C 语法的很多 内容。
  • 简化代码创建过程:引入类型、划分模块、减少程序清单。
  • Прозрачная логика заложенного алгоритма вследствие ухода от машинных codeов к более понятным для человека командам в семантически описательном стиле.
  • Переносимость. Стало достаточно перекомпorровать текст программы для выполнения на другой платформе (возможно, с небольшой модификацией).
  • Скорость откомпorрованных программ.
Минусы:
  • Отсутствие автоматического управления памятью и необходимость постоянного её контроля.
  • Отсутствие реализации концепций an objectно-ориентированного и функционального программирования.

Развитие языков высокого уровня

在软件创建方面,高级编程语言已经越来越多地开始摆脱机器代码,并实现除过程性编程范式之外的各种编程范式。其中还包括面向对象原则的实现。C++、Java、Python、JavaScript、Ruby... - 此类语言是当今最流行且需求最大的语言。它们为实现各种软件提供了更多的机会,并且不可能清楚地确定每个软件的“专业化”。但应用程序在相关领域的流行是由于与之合作的库/框架,例如: JavaScript - 前端。该语言设计用于客户端 Web 浏览器与用户和远程服务器之间的交互。最流行的库是 Angular、React 和 VUE。目前,它在 Web 和其他服务器(后端)上的使用相对活跃,Node.js 尤其受欢迎。 Ruby - 后端。它用于在 Web 服务器上创建脚本(服务文件)。主要框架是Ruby On Rails。 Python是一个科学和工程领域(除了 Web 领域)。它是标准计算和数学包(Mathematica、Octave、MatLab...)的替代品,但具有该语言的常用语义和大量库。在机器学习系统、统计和人工智能领域拥有众多粉丝。常用的库包括 django、numpy、pandas 和 tensorflow。 C++ – C 语言的通用、进化发展。提供函数式和面向对象的编程能力,同时又不失去与低级硬件交互的能力。因此,在创建软件时实现了生产力和灵活性,但价格也相应:由于语言的复杂规范而导致较高的进入门槛,执行程序时需要对资源进行独立控制。许多单用户和系统软件都是用它编写的:操作系统模块(Windows、Symbian...)、游戏、编辑器(Adobe Photoshop、Autodesk Maya...)、数据库(MSSQL、Oracle...)、播放器( WinAmp...)等。需要注意的是,现代软件是一个复杂的产品,其开发同时使用多种编程语言,并且很难确定每种语言的参与程度。总体结果。

进一步进展

最近,另一种类型的编程越来越流行——函数式(语言级别的进一步发展)。这是另一种计算抽象类型 - 将一组函数作为参数并返回另一个函数的函数。变量的作用与函数相同(我们熟悉的变量只是常量表达式,类似于Java中类型声明之前的final)。函数本身在其范围内是封闭的,其操作的结果仅取决于传递的参数。由此得出两个显着的特性:
  • 对于测试,我们只需要函数参数(工作结果不依赖于外部变量等)。
  • 函数式程序奇迹般地支持并发:可以在相邻线程中发出顺序函数调用(因为它们不受外部因素的影响)并且不需要锁(即不存在同步问题)。鉴于多核处理器的广泛采用,这是花时间研究这个主题的良好动机。
然而,入门门槛比 OOP 更高:为了获得有效的代码,需要构建一个程序,以函数的形式描述执行算法。但对于纯函数式风格来说,了解逻辑和范畴论的基础知识也是很好的。最流行的是 Haskell、Scala、F#。但不要害怕,函数式编程的元素已经出现在 Java(以及其他现代第三代语言)中,并且它们可以与 OOP 结合。您将在 JavaRush 在线实习中更详细地了解所有这些细节。由于需求较低,逻辑编程领域(下一级别的语言)尚未找到广泛的实际应用。构建程序需要离散数学、谓词逻辑、约束工具和数理逻辑其他分支的基础知识。最流行的活跃语言是 Prolog。

结论

目前,最常见的语言是OOP。Java自诞生以来,一直位居榜首,通常是流行语言的前三名。除了 OOP 之外,它还包含函数式编程的元素,您可以结合不同的程序编写风格。Java 的应用范围非常广泛 - 这些是业务任务、Web 服务器(后端)的实现、创建 Android 应用程序的主要语言、跨平台编程环境和工作场所 (IDE/AWM) 以及建模等等。Java 在企业领域的地位尤其强大——企业软件领域需要高质量和长寿命的代码以及最复杂的业务逻辑的实现。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION