01-经典的Hello World

0 阅读4分钟

每一种语言的教程几乎都是从打印 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 mainfmt 提供格式化打印。

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 BootQuarkusVert.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

常见:GinEchoBeego;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-webRocketAxum 等;选型与团队经验、延迟/吞吐目标、异步模型习惯有关。

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…