外观
常用编程语言基础语法对比
编译与运行
| 语言 | 编译与运行 |
|---|---|
| Java | javac Hello.java & java Hello.class java Hello.java (Java 11+) |
| Golang | go run hello.go go build -o hello hello.go & ./hello |
| Python | python hello.py |
| JS | node hello.js |
| TS | tsx hello.ts tsx watch hello.ts tsc & node hello.js node hello.ts |
包管理器
| 语言 | 包管理器 | 元数据文件 |
|---|---|---|
| Java | Maven Gradle | pom.xml build.gradle | build.gradle.kts |
| Golang | Go Modules | go.mod & go.sum |
| Python | pip uv | requirements.txt pyproject.toml & uv.lock |
| JS / TS | npm | package.json |
包与模块
包
包存在狭义与广义两种概念:
- 狭义上,包指的是:语言内的代码组织单元,物理上常映射为目录。后续提到包这个概念时,如果不加特殊说明,一般是指狭义包。
- 广义上,包指的是:可分发、可安装、有版本的发布与依赖单元,物理载体通常是归档文件(jar、zip、wheel、tgz)。包管理器中的包指代的就是广义包。
| 语言 | 狭义包 | 广义包 |
|---|---|---|
| Java | package(目录) | jar、artifact、library、dependency |
| Golang | package(目录) | module |
| Python | package (目录) | distribution package |
| JS / TS | 无 | npm package |
模块
在不同的编程语言中,模块的概念也有较大差异:
| 语言 | 模块的含义 |
|---|---|
| Java | 包的集合,部署与依赖单元(Java 9+) |
| Golang | 包的集合,版本化依赖管理单元 |
| Python | 文件级代码单元,通常是一个源文件( .py ) |
| JS / TS | 文件级代码单元,通常是一个源文件( .js / .ts ) |
对于 Java / Golang 来说,模块是包的集合,它们的关系是:模块 ⊃ 包(目录) ⊃ 文件。
对于 Python / JS / TS 来说,模块通常是一个源文件,它们的关系是:包(目录)⊃ 模块(文件)。这里为了便于类比理解,将包与目录等价了,但实际上 JS / TS 中不存在狭义包的概念,其与目录也并不等价。
导入与导出
几乎所有编程语言都支持 import 其它包或模块中的对象,大部分编程语言不需要显性 export 对象。如下所示:
| 语言 | import 的对象 | export 的对象 |
|---|---|---|
| Java | 类型(类、接口、枚举、注解)或静态成员 | 普通 java 文件无 export 关键字,通过修饰词控制可见性 JPMS 可 exports 包来控制包的可见性 |
| Golang | 包 | 无 export 关键字,通过首字母大小写控制可见性 |
| Python | 模块、模块中的名称、包 | 无 export 关键字 |
| JS / TS | export 的对象 | 变量、函数、类等 |
示例:
| 语言 | import | export |
|---|---|---|
| Java | import java.time.LocalDateTime | - |
| Golang | import dt "time" | - |
| Python | from datetime import datetime as dt | - |
| JS / TS | import { DateTime as dt } from "luxon" | export class DateTime |