我第一次听说”脚本语言”和”编译语言”的区别时,对方说了一句话让我彻底糊涂了:

“JavaScript 是脚本语言,Java 是编译语言,但 Java 同时也可以被解释执行。”

……所以到底什么是什么?

后来我才明白,“标记/脚本/编译”这个三分法其实很粗糙, 它更像是”一个大概的分类”,而不是一个严格的科学定义。

一句话理解: 标记语言描述”长什么样”,脚本语言和编译语言描述”怎么做”——区别在于脚本语言即写即用,编译语言需要先翻译成机器码再跑。

标记语言:给内容贴上标签

标记语言的核心功能不是”做运算”,而是”描述内容的结构和展示方式”。

1
2
<!-- HTML 是在说:这是一个段落,里面的文字加粗 -->
<p>这是一个<strong>加粗</strong>的文字</p>
1
2
3
4
5
<!-- XML 是在说:这是一条数据,包含名字和年龄 -->
<person>
<name>飞鲤</name>
<age>28</age>
</person>

常见的标记语言:

  • HTML:网页内容的结构语言
  • XML:通用的数据标记语言
  • Markdown:我写这篇文章用的语言
  • YAML:配置文件常用(比如 Hexo 的文章头)

关键特征: 标记语言不写逻辑。你不能用 HTML 写一个 if 判断或者 for 循环。

脚本语言:边解释边执行

脚本语言的诞生是为了缩短”写完 → 编译 → 链接 → 运行”这一长串流程。

简单来说,脚本语言写完之后不需要编译就能跑——因为解释器会一边读你的代码一边执行。

1
2
3
# Python:典型的脚本语言,直接 python app.py 就能跑
name = input("输入名字:")
print(f"你好,{name}!")
1
2
3
4
// JavaScript:浏览器端脚本语言的王者
document.querySelector('button').onclick = () => {
alert('Hello!');
};

常见的脚本语言:

  • JavaScript/TypeScript:前端和 Node.js 后端
  • Python:数据科学、AI、自动化脚本的首选
  • PHP:老牌 Web 后端语言
  • Ruby:以 Rails 框架闻名
  • Shell/Bash:Linux 系统管理员的好伙伴

编译语言:先翻译成机器码再执行

编译语言是”先编译、后执行”的流程。你写完代码之后需要一个编译器把它变成机器码(.exe 或 .out),然后才能运行。

1
2
3
4
5
// Rust:2026 年最热门的编译型语言之一
fn main() {
let name = "飞鲤";
println!("你好,{}!", name);
}
1
2
3
4
5
6
// Go:简洁高效的编译型语言
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}

常见的编译语言:

  • Rust:系统编程、WebAssembly、工具链
  • Go:后端服务、云原生基础设施(Docker、Kubernetes 就是用 Go 写的)
  • C/C++:操作系统、游戏引擎、嵌入式
  • Java:企业后端(但 Java 是编译+解释的混合体——先编译成字节码,再由 JVM 解释执行)

经验之谈: 我第一次用 Rust 写了一个 Web 服务——编译花了 3 分钟,但编译之后的速度真的惊艳到我了。同样的逻辑用 Node.js 写,并发能力差了 5 倍。这就是”编译时花的每一秒钟,在运行时都会加倍还给你”。

三种类型的对比

维度 标记语言 脚本语言 编译语言
用途 描述内容结构 编写程序逻辑 编写程序逻辑
执行方式 无执行概念 解释器边读边执行 编译器先翻译成机器码
是否需要编译 不需要 不需要 需要
典型文件 .html, .xml, .md .js, .py, .php .rs, .go, .c, .java
执行速度 N/A 中等 极快
开发效率 中(编译等待)

边界越来越模糊了

说实话,2026 年这个三分法已经不太严格了。原因有三:

1. JIT 编译模糊了边界

现代 JavaScript 引擎(V8、SpiderMonkey)早就不是单纯的”解释执行”了——它们会在运行时把”热点代码”编译成本地机器码。所以 JavaScript 在运行时其实是”先充当脚本,热起来了就变成编译执行”。

2. TypeScript 是”写了需要编译,但运行时还是脚本语言”的混合体

1
2
3
4
// TypeScript:写了需要先 tsc 编译成 JS,再跑
function greet(name: string): string {
return `Hello, ${name}`;
}

TypeScript 需要编译(tsc → .js),但编译后生成的 JavaScript 依然是脚本语言。所以 TypeScript 严格来说不算”编译语言”,而是”带有编译步骤的脚本语言”。

3. WebAssembly 让编译语言跑在浏览器里

Rust 和 Go 都可以编译成 WebAssembly(Wasm)——一种浏览器能直接运行的二进制格式。这意味着你可以用编译语言写前端代码。

2026 年的实际情况

在实际工作中,大多数人会混用这三种语言:

1
2
3
4
一个典型的 Web 应用项目:
├── 标记语言:HTML(结构)+ YAML(配置)+ Markdown(文档)
├── 脚本语言:JavaScript/TypeScript(前端逻辑)+ Python(数据分析脚本)
└── 编译语言:Rust(高性能计算模块)+ Go(API 网关)

你不需要纠结”这个语言到底算什么类型”——你只需要知道:

  • 写结构用标记语言
  • 快速开发用脚本语言
  • 追求极致性能用编译语言

相关推荐

P.S. 回到开头——JavaScript 是脚本语言还是编译语言?我的回答是:它是脚本语言出身,但经过了 JIT 编译器的武装。 就像一个人从小在乡村长大,后来去城市深造——你无法简单地说他是”农村人”还是”城市人”。这两种解释都对,就看你在哪个纬度评价。