4【计算机编程】到底该学哪种编程语言?各种不同的编程语言现在都用来干嘛?

部署运行你感兴趣的模型镜像
0 本文要点

1.计算机编程语言的分类
低级语言/高级语言;(高级语言中的)编译型语言/解释性语言;动态语言/静态语言;
2.主要的流行高级语言介绍
Java、C++、python、C#、C、JavaScript、Go、ruby、Groovy、Kotlin等
3.硬件编程
只了解一点FPGA/DSP,就简单提一下

1 编程语言分类
(1)低级语言 / 高级语言

低级语言包括机器语言和汇编语言,Java、C++、python这些常见的都是方便程序员与电脑高效交互的高级语言。
机器语言是计算机可以直接识别的 0/1 串,对应计算机硬件的“断开”和“闭合”两种状态。
汇编语言实际上就是描述指令集的语言。通过汇编这一过程,汇编语言转换成机器指令执行。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不具备移植性。
高级语言更接近人类的思维方式,编写容易,开发效率高。

(2)编译型语言 / 解释型语言

C、C++语言是典型的编译型语言。可以这么理解,有一个事先编好的叫做“编译程序”的“机器语言程序”(*未求证,感觉这里不太对)*安装在计算机内,它的功能是通过预处理、编译、链接等将高级语言变为机器可执行的目标代码(注意区分,这个目标代码是机器指令,并非0 / 1二进制代码。这里涉及到ABI的相关知识)。C++编译链接后生成的.exe可执行文件,也是作用/运行在操作系统上的,并非直接运行在硬件上。

解释型语言:python是典型的解释型语言,即计算机有专门对应的解释器程序,一边扫描python代码、逐句输入逐句翻译,没有编译产生目标程序的过程,而是翻译后由计算机直接一行一行执行。

这里特殊讲下Java语言,因为Java运行过程是,先 javac xxx.java 即编译Java文件,这一步生成一个 .class 文件(一个与平台无关的字节码程序),然后 java xxx 运行这个名为xxx的Java源程序。所以这么看来Java也有编译的过程,但是Java被定义为解释型语言,因为它并不是编译生成常规的机器指令,而是生成在JVM上运行的指令字节码。

这就涉及到Java语言的运行机制:JDK JRE JVM与Java。

在这里插入图片描述

JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK),它是Java实现的核心,我们要运行Java必经痛苦的配置环境的过程,就是在部署JDK。

JRE(Java Runtime Environment,Java运行环境),包含JVM标准实现及Java核心类库。JRE是Java运行环境,并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),它负责类的加载、初始化静态变量、二进制字节码的校验、解析类中调用的接口和类

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。经过Java编译器生成的字节码.class文件就是运行在JVM。

(3)静态(强类型)语言 / 动态(弱类型)语言

这也是针对高级语言来讲的。静态语言即编译时变量的数据类与就可以确定的语言,大多数静态语言要求在使用变量之前就必须声明数据类型,C++、Java都是如此,所以他们用起来更安全。

动态语言的变量类型是由其上下文决定、动态赋予的,其类型检查是在运行时做的。它的优点是方便阅读,不需要写非常多的类型相关的代码;缺点是不方便调试,容易出错。比如众所周知的ECMAScript(JavaScript)、Ruby、Python等都属于动态语言。

脚本语言都属于动态语言,动态语言又都属于解释型语言。

2 主要高级语言介绍
(1)Java

诞生于1995年,是分布式服务开发的最佳选择之一;
Java做后端服务居多,包括网站后端、手机app后端,微信小程序后端、h5页面的后端等等。
Java也可以用来做安卓开发,不过现在Android发布了官方的开发语言kotlin,可能会形成相对聚集的生态圈。
Java开源框架超多,spring全家桶等;
游戏方面,《我的世界》就是用Java写的;
Java提供web插件,允许在浏览器中直接运行此类应用;
在大数据存储和应用方面,Java是必备语言,Hadoop也是基于Java进行开发的;

(2)C语言

诞生于1972年,最初构建目标是用来编写系统软件;
Linux操作系统就是用C语言开发的;
C语言不支持面向对象编程,也不具备运行时检查机制;但具有出色的可移植性;
通信电子类的公司(华为、中兴等),开发相关的软件都是用的标准C语言;
嵌入式系统编程、单片机开发板都是用C语言来进行开发的;(直接接触底层,执行效率高)

(3)python

python诞生于1991年,本身是用C语言开发的;
用于数值分析与计算(金融系统分析、量化展示等);
在机器学习、人工智能、数据挖掘等领域应用广泛;
第三方开源库和工具繁花似锦,不用造轮子,调包非常方便;
python脚本可以用来分析系统效率、覆盖率、做数据可视化,以及爬虫
也可以用来做web的后端服务,开发小程序等,Flask、Django框架等都非常火热;

python是Google的官方语言之一,常用的软件中,Instagram、YouTube、Dropbox(媒体存储和处理方向)和spotify等后端都是用python开发的。

(4)C++

诞生于1983年,属于C语言的一个超集;
对C语言的扩充和延申,非常有设计感,容器、泛型编程、模板库、面向对象编程等元素的使用,使得C++非常具有表现力;
嵌入式编程、电信级软件、windows/Linux上的(ps、office、QQ、微信,基本都是c++开发的。Foxmail / Outlook 等各种邮件收发工具、Chrome浏览器、IDE visual studio、搜狗输入法等也都是由C++开发

C++可跨越全部设备实现移植,并受到Android、苹果、Windows phone以及黑莓四大移动平台支持;

(5)JavaScript

JavaScript诞生于1995年,属于客户端脚本语言;(JS代码被写入HTML页面中,客户端的用户通过内部JS请求某HTML页面时,该脚本会被发送至浏览器,并由(客户端的)浏览器决定下一步操作。)

代码在客户端执行,减轻了服务器端的压力,但这也意味着有时会被恶意活动所利用,从而带来安全隐患;
JavaScript在不同的浏览器上有时会以不同的方式进行解释,相比于提供稳定输出结果的服务器端,js脚本的可预测性较差。不过充分测试可避免此类问题。

也是典型的全栈语言,在前后端无处不在;
用户交互UI、动态页面生成,主要在前端大放异彩;
广泛应用到各种企业级开发,如Vue.js、React.js、Angular.js等框架;
也可以用来做后端服务器开发、高性能服务器编程等,其支持框架为大名鼎鼎的 Node.js,具有异步编程的特点;

(6)C#

诞生于2000年,语法很像Java,可以做web后端(ASP.NET)、桌面软件开发、Windows应用开发等;
常用的 stack overflow、印象笔记就是由C#开发的;
全面集成.net库,提供出色的功能与支持库访问能力,但也由于集成了.net库而不具备跨平台的能力;
在国内生态不太好,就业形势一般;

(7)PHP

诞生于1994年,超文本预处理器,是一种服务器端的脚本语言;
可以用来做后端的web服务,典型框架 ThinkPHP,以及现在比较流行的 Larvaral;
Facebook中就用到了PHP;
PHP拥有庞大而活跃的社区,易于上手,能够丰富支持html、js、css等语言,与各类数据库、文件系统的协作都非常顺畅;

(8)SQL

数据库查询语言,很简单,但必须要学;
经久不衰的话题是:如何对SQL语言进行优化;(社招常问)

(9)Objective-C、Swift

O-C诞生于1983年,是苹果IOS开发官方语言,用于构建 Mac OS、IOS;

(10)Go

由Google开发发布;
对在多处理器系统上的运行进行了特别的优化,据说编译后的运行速度可以媲美C++/C;
也拥有自己web后端开发的典型框架:Beego框架、Gin框架;
基于Go语言的博客框架:Hugo,可以用来搭建自己的个人博客;
Go语言在虚拟化技术方面应用十分广泛,大名鼎鼎的远程虚拟机工具Docker就是Go语言的典型作品;

(11)Groovy

隶属于Java系的脚本语言;可以理解为Java动态机制的一种补充,二者可以互相调用;
它也需要JDK的支持;
典型的应用:Jenkins 2.0的流水线 pipeline 脚本,只能用groovy来写;

(12)Kotlin

也需要JDK的支持,也和Java语言互通;
2017Google开发者大会官宣了kotlin为Android开发的官方语言;

(13)Lua

和python类似,也是用C语言实现的,很容易和C代码互相调用;
OpenResty = Nginx + Lua:这个项目就是 Lua 语言对 Nginx 服务器进行二次开发得到的,用于web后端服务器开发、游戏开发等;

(14)Julia

高性能动态科学计算语言;
支持非常多的数据类型,在科研中(尤其机器学习)用的非常多;

3 硬件编程
(1)Verilog、VHDL(用于FPGA编程的两种常见语言)

Field Programmable Gate Array,现场可编程逻辑门阵列

FPGA 芯片并非单纯局限于研究以及设计芯片,而是针对较多领域产品都能借助特定芯片模型予以优化设计。从芯片器件的角度讲,FPGA 本身构成 了半定制电路中的典型集成电路,其中含有数字管理模块、内嵌式单元、输出单元以及输入单元等。

我们的计算机中,CPU芯片处理器负责调度、计算,GPU用来图形加速显示等,上面布满了密集的电路元件,FPGA也是一种芯片,它在通信领域用途较广,常规也用于图像、数据处理的一些算法辅助实现,现在比较火热的是用于深度学习加速

(2)DSP

TI公司的DSP用CCS开发平台,编程语言一般是C语言;来ADI公司的源DSP用VDSP++开发平台,一般也是用C语言。
这个我了解不多,只知道在我们直观看不到的地方应用非常广泛,还有就是EDA技术那一套。有机会了解了再说。

参考链接:
https://blog.youkuaiyun.com/zdb292034/article/details/80732098
bilibili @ codesheep 高级语言介绍的部分内容由程序羊大哥的视频搬运而来
知乎 @ 周萌萌 部分内容参考来自四年前由周翻译过来的一个外国网站的统计图

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 队列结构体的用途和应用场景 队列是一种遵循先进先出(FIFO)原则的数据结构,其结构体在实际应用中具有重要的作用。通过定义队列结构体,可以方便地管理和操作队列中的元素[^3]。队列结构体通常包含指向队列首尾的指针以及队列的状态信息(如大小、容量等),这使得队列的操作更加高效且易于维护。 以下是队列结构体的主要用途和典型应用场景: #### 1. **任务调度与资源分配** 在操作系统和分布式系统中,队列常用于任务调度和资源分配。例如,在多线程环境中,多个线程可能需要访问共享资源。通过将请求放入队列中,可以确保请求按照顺序处理,避免竞争条件和死锁问题[^2]。 ```c typedef struct Queue { int *data; // 存储队列数据的数组 int front; // 队列头指针 int rear; // 队列尾指针 int capacity; // 队列容量 int size; // 当前队列中元素的数量 } Queue; void QueuePush(Queue* pq, int x) { if (pq->size == pq->capacity) { printf("Queue is full\n"); return; } pq->data[pq->rear] = x; pq->rear = (pq->rear + 1) % pq->capacity; pq->size++; } ``` #### 2. **网络流量管理** 在计算机网络中,路由器和交换机使用队列来管理数据包的传输。数据包按照到达顺序进入队列,并依次发送到目标地址。这种机制确保了数据传输的公平性和效率[^2]。 #### 3. **广度优先搜索(BFS)** 在图论算法中,广度优先搜索(BFS)依赖于队列来实现。算法从起始节点开始,逐层遍历图中的节点,并将待访问的节点存入队列中。这种方法广泛应用于最短路径计算、连通性检测等领域[^2]。 #### 4. **消息队列** 消息队列是异步通信的重要工具,广泛应用于分布式系统中。生产者将消息放入队列,消费者从队列中取出并处理消息。这种方式可以解耦生产者和消费者,提高系统的灵活性和可扩展性[^2]。 #### 5. **批量任务处理** 在批处理系统中,队列用于存储待处理的任务。任务按照提交顺序进入队列,并由处理器逐一执行。这种方式适用于需要按顺序处理大量任务的场景,如打印任务队列或作业调度系统。 #### 6. **用户界面事件处理** 在图形用户界面(GUI)编程中,事件(如鼠标点击、键盘输入)通常被放入事件队列中。程序按照事件发生的顺序处理这些事件,从而确保用户交互的一致性和流畅性。 --- ### 示例代码:循环队列的实现 以下是一个基于数组的循环队列实现示例,展示了队列结构体的基本功能: ```c #include <stdio.h> #include <stdlib.h> typedef struct Queue { int *data; int front; int rear; int capacity; int size; } Queue; Queue* createQueue(int capacity) { Queue* q = (Queue*)malloc(sizeof(Queue)); q->data = (int*)malloc(capacity * sizeof(int)); q->front = 0; q->rear = 0; q->capacity = capacity; q->size = 0; return q; } void QueuePush(Queue* q, int x) { if (q->size == q->capacity) { printf("Queue is full\n"); return; } q->data[q->rear] = x; q->rear = (q->rear + 1) % q->capacity; q->size++; } int QueuePop(Queue* q) { if (q->size == 0) { printf("Queue is empty\n"); return -1; } int value = q->data[q->front]; q->front = (q->front + 1) % q->capacity; q->size--; return value; } void destroyQueue(Queue* q) { free(q->data); free(q); } ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值