序
每一种语言的教程几乎都是从打印 Hello World 开始的。下面用目前比较常见的语言,串一下「控制台打印」和「Web 接口返回 JSON」两种最小形态。
先简单认识各语言背景(实现语言指该语言早期或参考实现常用什么来写运行时/编译器)。
各语言速览
Python
Python 软件基金会(PSF)于 1991 年 2 月正式发布。2008 年发布 3.0,与 2.x 不完全兼容。
常见实现(如 CPython)会把源码编译为字节码,再由虚拟机执行;一般不需要像 C 那样显式「编译链接」成单独可执行文件再分发。早期参考实现以 C 为主。
Java
Sun 于 1996 年 1 月发布 JDK 1.0。早期 HotSpot 等大量以 C++ 实现;如今 JDK 自身演进与混合语言栈并存。
JavaScript
网景于 1996 年 3 月正式发布。早期引擎以 C++ 实现居多。
TypeScript
微软于 2014 年发布 TypeScript 1.0;2016 年 Angular 团队宣布采用 TypeScript。
它是 类型检查器 + 转译器:通常把 .ts 编译成 .js,再在 Node.js 或浏览器(JavaScript 运行时)里执行。TypeScript 编译器早期用 JavaScript 写,现已以 TypeScript 自举为主。
Go
Google 于 2009 年 11 月正式发布。编译型语言;go run 只是把「编译 + 运行」合成一条命令。早期以 C / 汇编 为主,现工具链以 Go 自举。
Rust
2015 年发布第一个稳定版(1.0)。早期编译器与 OCaml 等渊源较深,现 Rust 自举。
彼此的关系
Java 与 JavaScript
- 网景曾获得 Sun 的官方授权。
- Sun 也借助网景把 Java 生态铺进浏览器叙事里。
因此「JavaScript」的命名与 Java 的市场营销协同有关;历史上 Java Applet 可在浏览器里跑(依赖 JVM 插件),与 JS 不是同一套技术栈。
JavaScript 与 TypeScript
- JS:长期缺少静态类型与大规模工程化结构,工具链体验参差不齐。
- TS:JavaScript 的超集、类型可擦除、工具链强、兼容现有 npm 生态。
- 转折点:Google Angular 团队用 TypeScript 重写框架,带动企业采纳。
Java 与 Go
Go 并非为「取代 Java」而生,但在云原生场景里,简单、并发模型清晰、单一静态二进制等特点,使不少团队从 Java 迁往或混用 Go。Java 也在后续版本里加强 Lambda、虚拟线程 等,吸收其他语言的工程经验。
Rust 与 C++
Rust 用所有权 + 借用检查在编译期约束大量内存与并发问题,与 C++「靠约定与审查」的路径不同。Linux 等系统内核与驱动里 Rust 的采用在逐步增加。
Python 生态
- 数据科学:NumPy(2006)、SciPy、Matplotlib(2003)、Pandas(2008)等。
- 机器学习:TensorFlow(2015)、PyTorch(2016)等,语法与生态成熟。
- Web 等:Django(2005)、Flask(2010)等,常被称为「胶水语言」连接多语言组件。
控制台打印(Hello World)
Python
print("hello world")
print 是内置函数,脚本里可直接调用;不强制写 main(工程化项目里再按约定组织入口即可)。
Java
// JDK25之前版本的写法
public class Main {
public static void main(String[] args) {
System.out.println("hello world");
}
}
// JDK25无类名极简入口的写法
void main() {
System.out.println("hello world");
}
JavaScript / TypeScript
console.log("hello world");
在浏览器或 Node 里,上述写法对 JS 与 TS 源文件在「打印」这一层是一致的(TS 需先编译或经工具链处理)。
Go
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
可执行程序的包名一般为 package main;fmt 提供格式化打印。
Rust
fn main() {
println!("hello world");
}
println! 末尾的 ! 表示宏(macro),在编译期展开。
Web:返回 JSON 的 /api/hello
Python
常见:Django(全家桶)、FastAPI(API 优先)、Flask(小内核、按需拼插件)。
Django
views.py
from django.http import JsonResponse
def hello(_request):
return JsonResponse({"message": "hello world"})
urls.py(与 views.py 同属一个 Django app 时,用 . 表示当前包)
from django.urls import path
from . import views
urlpatterns = [
path("hello/", views.hello, name="hello"),
]
项目根 urls.py 里需 path("api/", include("api.urls")) 之类挂载,最终浏览器路径多为 /api/hello/(是否带尾部斜杠与 APPEND_SLASH 等有关)。
Java
常见:Spring Boot、Quarkus、Vert.x 等;Spring Boot 生态与资料最全,适合作为入门默认选项。
Spring Boot
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/hello")
public Map<String, String> hello() {
return Map.of("message", "hello world");
}
}
TypeScript
常见:NestJS(结构类似 Spring)、Elysia 等偏高性能方案。
NestJS
import { Controller, Get } from "@nestjs/common";
@Controller("api")
export class AppController {
@Get("hello")
hello(): { message: string } {
return { message: "hello world" };
}
}
Go
常见:Gin、Echo、Beego;Beego 偏「一站式 MVC」,概念上容易和 Spring Boot 对照记忆。
Beego
package main
import (
"github.com/beego/beego/v2/server/web"
)
// 结构体嵌入,也叫做组合
type HelloController struct {
web.Controller
}
func (c *HelloController) Get() {
c.Data["json"] = map[string]string{"message": "hello world"}
c.ServeJSON()
}
func main() {
web.Router("/api/hello", &HelloController{})
// 监听地址与端口见 conf/app.conf(httpaddr / httpport)
web.Run()
}
Rust
常见:actix-web、Rocket、Axum 等;选型与团队经验、延迟/吞吐目标、异步模型习惯有关。
Actix-web
use actix_web::{get, App, HttpResponse, HttpServer, Responder};
#[get("/api/hello")]
async fn hello() -> impl Responder {
HttpResponse::Ok().json(serde_json::json!({ "message": "hello world" }))
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
let (host, port) = load_server_env(); #load_server_env函数见源码
let addr = IpAddr::from_str(&host).expect("HOST must be valid IP");
HttpServer::new(|| App::new().service(hello))
.bind((addr, port))?
.run()
.await
}
完整代码见:gitee.com/xiaobingjin…