夜夜躁很很躁日日躁麻豆,精品人妻无码,制服丝袜国产精品,成人免费看www网址入口

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

三天時(shí)間,我用這門國(guó)產(chǎn)編程語(yǔ)言寫了個(gè)編譯器,同事們看后大為震驚!

0
分享至

張大胖很幸運(yùn),剛畢業(yè)就進(jìn)入了一家芯片設(shè)計(jì)公司。

不過(guò),工作了一個(gè)月以后,他就覺得不對(duì)勁了。

原因很簡(jiǎn)單,對(duì)于公司開發(fā)的最新芯片,主流的編程語(yǔ)言還不支持呢!

無(wú)論是驗(yàn)證特性,還是編寫測(cè)試,都不得不用最最古老的形式:匯編!

張大胖決心改變這種狀況,他找到了梁經(jīng)理,說(shuō)出了自己的想法。

確實(shí)是這樣,操作系統(tǒng)、圖形學(xué),編譯器號(hào)稱程序員的三大浪漫,但每一項(xiàng)真做起來(lái)都讓人頭大。

張大胖當(dāng)年的畢業(yè)設(shè)計(jì),一個(gè)極其簡(jiǎn)單的編譯器,就讓他做了8個(gè)月!

不過(guò),梁經(jīng)理似乎發(fā)現(xiàn)了一個(gè)“秘密武器”。

MoonBit是一門國(guó)產(chǎn)開源編程語(yǔ)言,由 Rescript 作者張宏波(現(xiàn)居深圳)及其團(tuán)隊(duì)打造,它的一些優(yōu)秀特性,非常適合用來(lái)開發(fā)編譯器和新編程語(yǔ)言。

張大胖非常高興,決定利用之前畢業(yè)設(shè)計(jì)的經(jīng)驗(yàn),用MoonBit做個(gè)實(shí)驗(yàn),設(shè)計(jì)并實(shí)現(xiàn)一個(gè)新的編程語(yǔ)言!

為了記錄自己的工作,他用日記的形式記錄下了每天的進(jìn)展:


———日記開始———

第一天:語(yǔ)言設(shè)計(jì)與詞法分析

晚上下班,照常來(lái)說(shuō),我會(huì)打開原神欣賞一下提瓦特的風(fēng)景。不過(guò)今天要用MoonBit實(shí)現(xiàn)新編程語(yǔ)言了,游戲就先放到一邊吧。

1、語(yǔ)言設(shè)計(jì)

我打算設(shè)計(jì)的這門語(yǔ)言叫 TinyMoonBit。它得有常見的數(shù)值類型、分支循環(huán)、函數(shù)、內(nèi)存管理和 CFFI。語(yǔ)法上,我決定讓它看起來(lái)像 MoonBit,但內(nèi)核更像 C。

同時(shí),為了體現(xiàn)“現(xiàn)代”語(yǔ)言的優(yōu)越性,我給它設(shè)計(jì)了更嚴(yán)格的類型系統(tǒng),比如 1 + 1.0 這種在 C 語(yǔ)言里司空見慣的隱式類型轉(zhuǎn)換,在 TinyMoonBit 里是不允許的。

我隨手寫下了一個(gè) TinyMoonBit 的示例程序,用來(lái)計(jì)算斐波那契數(shù)列:

extern fn print_int(x : Int) -> Unit;
// 遞歸實(shí)現(xiàn)斐波那契數(shù)列
fn fib(n : Int) -> Int {
  if n <= 1 { return n; }
  return fib(n - 1) + fib(n - 2);
}
fn main() -> Unit {
  print_int(fib(10));
}

2、詞法分析

第一步是詞法分析。通俗地說(shuō),就是把一長(zhǎng)串代碼文本,切分成一個(gè)個(gè)有意義的“單詞”,我們稱之為 Token。比如 let x = 5;,處理后應(yīng)該變成一個(gè) Token 序列:Keyword("let") -> Identifier("x") -> Operator("=") -> IntLiteral(5) -> Symbol(";")。

在 MoonBit 里,這件事出奇的簡(jiǎn)單。首先,用一個(gè)代數(shù)數(shù)據(jù)類型(ADT)來(lái)定義所有可能的 Token:

pub enum Token {
  Bool(Bool)       // 布爾值:true, false
  Int(Int)         // 整數(shù)
  Keyword(String)  // 關(guān)鍵字:let, if, fn
  Upper(String)    // 類型標(biāo)識(shí)符:Int, Bool
  Lower(String)    // 變量標(biāo)識(shí)符:x, n
  Symbol(String)   // 運(yùn)算符:+, -, ->
  Bracket(Char)    // 括號(hào):(, ), {, }
  EOF              // 文件結(jié)束標(biāo)記
} derive(Show, Eq)

然后,借助 MoonBit 的一大殺器——字符串模式匹配,我們可以像寫詩(shī)一樣實(shí)現(xiàn)詞法分析器:

pub fn lex(code: String) -> Array[Token] {
  let tokens = Array::new()
  loop code[:] {
    // 跳過(guò)空白字符
    [' ' | '\n' | '\r' | '\t', ..rest] => 
      continue rest
    // 處理單行注釋
    [.."http://", ..rest] =>
      continue loop rest {
        ['\n', ..rest] => break rest
        [_, ..rest] => continue rest
        [] => break ""
      }
    
    // 識(shí)別多字符運(yùn)算符 (順序很重要!)
    [.."->", ..rest] => { tokens.push(Symbol("->")); continue rest }
    [.."<=", ..rest] => { tokens.push(Symbol("<=")); continue rest }
    
    // 識(shí)別單字符運(yùn)算符
    [':' |1 ';' | '+' | '-' | '*' | '/' | '<' | '=' as c, ..rest] => {
      tokens.push(Symbol("\{c}")); continue rest
    }
    
    // 識(shí)別標(biāo)識(shí)符和關(guān)鍵字
    ['a'..='z', ..] as code => {
      let (tok, rest) = lex_ident(code) // lex_ident 會(huì)區(qū)分關(guān)鍵字和普通變量
      tokens.push(tok)
      continue rest
    }
    // ... 其他匹配,如數(shù)字、大寫字母開頭的類型等 ...
    
    [] => { tokens.push(EOF); break tokens }
  }
}

MoonBit 特性解讀

函數(shù)式循環(huán) (loop):它不是簡(jiǎn)單的重復(fù),而是一個(gè)不斷用新狀態(tài)(rest)迭代自身的遞歸過(guò)程,非常適合處理“吃掉”一部分字符串,然后處理剩余部分的場(chǎng)景。

強(qiáng)大的模式匹配:[.."->", ..rest] 這樣的語(yǔ)法,可以直觀地匹配字符串前綴,比晦澀的正則表達(dá)式清晰百倍。

只花了大半個(gè)小時(shí),詞法分析器就寫完并測(cè)試通過(guò)了。我暗自竊喜,這要是用別的語(yǔ)言,光是處理各種邊界情況就得焦頭爛額。MoonBit 的 ADT 和模式匹配,寫起來(lái)真是既優(yōu)雅又高效。

第二天:語(yǔ)法分析與類型檢查

有了昨晚的順利開局,我信心更足了。我趁著午休和晚上的時(shí)間,開始攻克編譯器的第二個(gè)難關(guān)。

1、語(yǔ)法分析:從扁平到立體

詞法分析產(chǎn)生的是一維的 Token 序列,而程序本身是有層次結(jié)構(gòu)的。語(yǔ)法分析的任務(wù),就是將這個(gè)扁平的序列,組織成一棵能夠反映代碼結(jié)構(gòu)的抽象語(yǔ)法樹(AST)。

首先,我定義了 AST 的節(jié)點(diǎn)。這就像為程序搭建骨架,每一塊骨骼都代表一種語(yǔ)法結(jié)構(gòu):

// 表達(dá)式的定義
pub enum Expr {
  AtomExpr(AtomExpr, mut ty~ : Type?)          // 原子表達(dá)式 (變量、字面量等)
  Unary(String, Expr, mut ty~ : Type?)         // 一元運(yùn)算:-, !
  Binary(String, Expr, Expr, mut ty~ : Type?)  // 二元運(yùn)算:+, -, *, /
} derive(Show, Eq, ToJson)
// 語(yǔ)句的定義
pub enum Stmt {
  Let(String, Type, Expr)      // 變量聲明:let x : Int = 5;
  If(Expr, Array[Stmt], Array[Stmt])           // 條件分支
  While(Expr, Array[Stmt])     // 循環(huán)
  Return(Expr?)                // 返回
  // ... 其他語(yǔ)句 ...
} derive(Show, Eq, ToJson)
// 函數(shù)和程序的頂層結(jié)構(gòu)
pub struct Function {
  name : String
  params : Array[(String, Type)]
  ret_ty : Type
  body : Array[Stmt]
} derive(Show, Eq, ToJson)
pub type Program Map[String, Function]

設(shè)計(jì)巧思:注意到每個(gè)表達(dá)式節(jié)點(diǎn)都有一個(gè) mut ty~ : Type? 字段嗎?這是一個(gè)可變的可選類型字段。這樣,我就可以在后續(xù)的類型檢查階段,直接把推斷出的類型信息“填”進(jìn)去,而無(wú)需重新構(gòu)建一棵新樹,非常巧妙。

有了骨架,接下來(lái)就是用 遞歸下降 的方法來(lái)填充它。簡(jiǎn)單來(lái)說(shuō),就是為每一種語(yǔ)法結(jié)構(gòu)(如函數(shù)、語(yǔ)句、表達(dá)式)編寫一個(gè)解析函數(shù)。在 MoonBit 中,這又成了模式匹配的絕佳舞臺(tái):

pub fn parse_function(tokens : ArrayView[Token]) -> (Function, ArrayView[Token]) raise {
  // Function一定由fn關(guān)鍵字,Lower,左括號(hào)開頭
  guard tokens is [Keyword("fn"), Lower(fname), Bracket('('), .. rest_tokens]
  let params : Array[(String, Type)] = Array::new()
  let (tokens, ret_ty) = loop rest_tokens {
    // 參數(shù)格式:param_name : Type
    [Lower(param_name), Symbol(":"), Upper(type_name), .. rest] => {
      params.push((param_name, parse_type(type_name)))
      continue rest
    }
    [Symbol(","), .. rest] => continue rest
    [Bracket(')'), Symbol("->"), Upper(ret_ty), .. rest] => 
      break (rest, parse_type(ret_ty))
  }
  // ... 解析函數(shù)體
}

整個(gè)過(guò)程就像剝洋蔥,parse_program 調(diào)用 parse_function,parse_function 調(diào)用 parse_stmt,parse_stmt 調(diào)用 parse_expr,層層遞進(jìn),直到把所有 Token 都消耗完畢。

MoonBit 高級(jí)特性應(yīng)用

derive(Show, Eq, ToJson):這個(gè)小小的注解威力巨大。Show 讓我能輕松打印 AST 用于調(diào)試,Eq 用于測(cè)試,而 ToJson 能一鍵將 AST 序列化為 JSON,方便檢查其結(jié)構(gòu)。

raise 錯(cuò)誤處理:通過(guò)在函數(shù)簽名中標(biāo)記 raise,我可以優(yōu)雅地向上拋出解析錯(cuò)誤,而不用到處傳遞錯(cuò)誤碼。

2、類型檢查:確保語(yǔ)義正確

在代碼生成之前,通常需要實(shí)現(xiàn)一個(gè)類型檢查階段。一些語(yǔ)句雖然符合語(yǔ)法,但可能不符合語(yǔ)義,例如我有一個(gè)foo函數(shù),然后又有了1+foo這樣的代碼,但這是語(yǔ)義不正確的,因?yàn)橐粋€(gè)整數(shù)無(wú)法與一個(gè)函數(shù)相加。

我設(shè)計(jì)了一個(gè)環(huán)境鏈來(lái)處理作用域:

pub struct TypeEnv[K, V] {
  parent : TypeEnv[K, V]?
  data : Map[K, V]
}
pub fn TypeEnv::get[K : Eq + Hash, V](self : Self[K, V], key : K) -> V? {
  match self.data.get(key) {
    Some(value) => Some(value)
    None => match self.parent {
      Some(parent_env) => parent_env.get(key)
      None => None
    }
  }
}

類型檢查器會(huì)自頂向下掃描每個(gè)表達(dá)式,填充類型信息并驗(yàn)證類型一致性:

pub fn Expr::check_type(self : Self, env : TypeEnv[String, Type]) -> Type raise {
  match self {
    Binary("+", lhs, rhs, ..) as node => {
      let lhs_type = lhs.check_type(env)
      let rhs_type = rhs.check_type(env)
      guard lhs_type == rhs_type else {
        raise TypeCheckError("類型不匹配")
      }
      node.ty = Some(lhs_type)
      lhs_type
    }
    // ... 其他表達(dá)式類型
  }
}

語(yǔ)法分析消耗的時(shí)間比預(yù)想的多一些,尤其是在處理運(yùn)算符優(yōu)先級(jí)時(shí)頗費(fèi)腦筋。但在 MoonBit 強(qiáng)大的模式匹配和 AI 助手的幫助下,我還是在深夜前完成了這項(xiàng)工作。萬(wàn)里長(zhǎng)征,只剩下最后一步——代碼生成了。

第三天:代碼生成,最后的難關(guān)

MoonBit本身語(yǔ)言特性適合編譯器實(shí)現(xiàn)之外,也有一個(gè)超級(jí)好用的LLVM綁定,叫做llvm.mbt。

1、LLVM:現(xiàn)代編譯器的基石

LLVM作為現(xiàn)代編譯器基礎(chǔ)設(shè)施的集大成者,為我們提供了一個(gè)強(qiáng)大而靈活的解決方案。通過(guò)將程序轉(zhuǎn)換為L(zhǎng)LVM中間表示(IR),我們可以利用LLVM成熟的工具鏈將代碼編譯到多種目標(biāo)架構(gòu)。

我們先來(lái)試用LLVM的經(jīng)典起手三段式:

pub fn initialize_llvm() -> (Context, Module, Builder) {
  let ctx = @IR.Context::new()          // LLVM上下文
  let mod = ctx.addModule("demo")       // 模塊容器
  let builder = ctx.createBuilder()     // IR構(gòu)建器
  (context, module, builder)
}

有了這三樣法寶,我們就能像搭積木一樣,一條條地構(gòu)建出程序的 LLVM IR。比如生成一個(gè)計(jì)算 a*b+c 的函數(shù):

pub fn generate_muladd_function() -> String {
  let (ctx, mod, builder) = initialize_llvm()
  // 定義函數(shù)簽名:i32 muladd(i32, i32, i32)
  let i32_ty = ctx.getInt32Ty()
  let func_type = ctx.getFunctionType(i32_ty, [i32_ty, i32_ty, i32_ty])
  let func_value = mod.addFunction(func_type, "muladd")
  // 創(chuàng)建函數(shù)入口基本塊
  let entry_block = func_value.addBasicBlock(name="entry")
  builder.setInsertPoint(entry_block)
  // 獲取函數(shù)參數(shù)并生成計(jì)算指令
  let arg_a = func_value.getArg(0).unwrap()
  let arg_b = func_value.getArg(1).unwrap()
  let arg_c = func_value.getArg(2).unwrap()
  let mul_result = builder.createMul(arg_a, arg_b)
  let add_result = builder.createAdd(mul_result, arg_c)
  let _ = builder.createRet(add_result)
  mod.dump()
}

這會(huì)生成非常清晰的 LLVM IR:

define i32 @muladd(i32 %a, i32 %b, i32 %c) {
entry:
  %mul_res = mul i32 %a, %b
  %add_res = add i32 %mul_res, %c
  ret i32 %add_res
}

看起來(lái)很簡(jiǎn)單,對(duì)吧?但真正的挑戰(zhàn)在于,如何將我們前一天生成的、復(fù)雜的 AST,系統(tǒng)性地翻譯成這一條條的 LLVM 指令。

2、類型系統(tǒng)的映射

在LLVM中,類型系統(tǒng)相當(dāng)復(fù)雜。llvm.mbt使用Trait Object的概念,&Type可以表示任意LLVM類型。我需要建立TinyMoonBit類型與LLVM類型的映射:

pub fn CodeGen::convert_type(self : Self, parser_type : Type) -> &@llvm.Type {
  match parser_type {
    Type::Unit => self.ctx.getVoidTy() as &@llvm.Type
    Type::Bool => self.ctx.getInt1Ty()
    Type::Int => self.ctx.getInt32Ty()  
    Type::Double => self.ctx.getDoubleTy()
  }
}

然后就是真正的代碼生成。我需要為 AST 中的每一種節(jié)點(diǎn)編寫一個(gè) emit 方法。其中最有趣也最關(guān)鍵的,是如何處理變量和分支:

3、變量處理:SSA與可變性的橋梁

TinyMoonBit支持變量的重新賦值,但LLVM IR采用SSA(Static Single Assignment)形式,每個(gè)變量只能賦值一次。我需要采用alloca + load/store模式來(lái)處理可變變量:

// 變量聲明:let x : Int = 5;
Let(var_name, var_type, init_expr) => {
  let llvm_type = self.convert_type(var_type)
  let alloca = self.builder.createAlloca(llvm_type, name=var_name)
  env.symbols.set(var_name, alloca)
  let init_value = init_expr.emit(env)
  let _ = self.builder.createStore(alloca, init_value)
}
// 變量賦值:x = 10;
Assign(var_name, rhs_expr) => {
  let var_ptr = env.get_symbol(var_name).unwrap()
  let rhs_value = rhs_expr.emit(env)
  let _ = self.builder.createStore(var_ptr, rhs_value)
}

4、控制流:基本塊的藝術(shù)

控制流是程序邏輯的骨架。在LLVM IR中,控制流通過(guò)基本塊和分支指令來(lái)實(shí)現(xiàn)。每個(gè)基本塊代表一個(gè)沒(méi)有內(nèi)部跳轉(zhuǎn)的指令序列:

// if-else語(yǔ)句的實(shí)現(xiàn)
If(cond, then_stmts, else_stmts) => {
  let cond_val = cond.emit(env)
  // 創(chuàng)建三個(gè)基本塊
  let then_block = func.addBasicBlock(name="if.then")
  let else_block = func.addBasicBlock(name="if.else") 
  let merge_block = func.addBasicBlock(name="if.end")
  // 條件分支
  let _ = builder.createCondBr(cond_val, then_block, else_block)
  // 生成then分支
  builder.setInsertPoint(then_block)
  then_stmts.each(s => s.emit(env))
  let _ = builder.createBr(merge_block)
  // 生成else分支  
  builder.setInsertPoint(else_block)
  else_stmts.each(s => s.emit(env))
  let _ = builder.createBr(merge_block)
  // 繼續(xù)在merge塊生成后續(xù)代碼
  builder.setInsertPoint(merge_block)
}

5、完整的代碼生成

經(jīng)過(guò)詞法分析、語(yǔ)法分析、類型檢查和代碼生成四個(gè)階段,我們的編譯器已經(jīng)能夠?qū)inyMoonBit源代碼轉(zhuǎn)換為完整的LLVM IR。

對(duì)于我們的斐波那契例子:

fn fib(n : Int) -> Int {
  if n <= 1 { return n; }
  return fib(n - 1) + fib(n - 2);
}

最終生成的LLVM IR:

define i32 @fib(i32 %0) {
entry:
  %1 = alloca i32, align 4
  store i32 %0, ptr %1, align 4
  %2 = load i32, ptr %1, align 4
  %3 = icmp sle i32 %2, 1
  br i1 %3, label %4, label %6
4:                                                
  %5 = load i32, ptr %1, align 4
  ret i32 %5
6:                                                
  %7 = load i32, ptr %1, align 4
  %8 = sub i32 %7, 1
  %9 = call i32 @fib(i32 %8)
  %10 = load i32, ptr %1, align 4
  %11 = sub i32 %10, 2
  %12 = call i32 @fib(i32 %11)
  %13 = add i32 %9, %12
  ret i32 %13
}

使用LLC工具鏈,我們可以進(jìn)一步將LLVM IR編譯成RISC-V匯編代碼,完成整個(gè)編譯過(guò)程。

攻克了這些核心難點(diǎn)后,剩下的工作就是水到渠成了。周三深夜,當(dāng)我看到 fib(10) 的代碼成功生成了復(fù)雜的 LLVM IR ,并順利通過(guò)llc鏈接編譯成可執(zhí)行程序并且運(yùn)行通過(guò)時(shí),我知道,我成功了!


———日記結(jié)束———

總結(jié)

周四的午休時(shí)刻,張大胖向同事們展示了自己三天時(shí)間編寫的TinyMoonBit編譯器。

確實(shí),MoonBit的模式匹配讓詞法分析變得異常簡(jiǎn)單,遞歸下降語(yǔ)法分析也很直觀。

最關(guān)鍵的是llvm.mbt這個(gè)綁定庫(kù),讓代碼生成變得容易很多。

有了MoonBit以后,開發(fā)新語(yǔ)言就不那么難了,也許你也可以再把編譯原理?yè)炱饋?lái),用MoonBit完成自己的年輕時(shí)的夢(mèng)想:實(shí)現(xiàn)一個(gè)自己的編程語(yǔ)言!

資源推薦

對(duì)這個(gè)項(xiàng)目感興趣的讀者,可以從以下鏈接獲取更多信息:

TinyMoonBit 完整項(xiàng)目 :


https://github.com/Kaida-Amethyst/TinyMoonbitLLVM

MoonBit 官方文檔 :


https://www.moonbitlang.com/docs/

llvm.mbt 文檔 :


https://mooncakes.io/docs/Kaida-Amethyst/llvm

LLVM 官方教程 :


https://www.llvm.org/docs/tutorial/

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
下一個(gè)投資爆點(diǎn)!深度挖掘數(shù)字人民幣“十倍潛力”龍頭

下一個(gè)投資爆點(diǎn)!深度挖掘數(shù)字人民幣“十倍潛力”龍頭

K線論勢(shì)
2025-10-05 15:48:55
反華總統(tǒng)執(zhí)政下國(guó)家瀕臨亡國(guó),妄圖向中國(guó)尋求援助,最終結(jié)局如何

反華總統(tǒng)執(zhí)政下國(guó)家瀕臨亡國(guó),妄圖向中國(guó)尋求援助,最終結(jié)局如何

貓眼觀史
2025-09-30 12:43:33
江蘇連云港花果山,女游客景區(qū)內(nèi)撿私人板栗:賠償民宿老板300元

江蘇連云港花果山,女游客景區(qū)內(nèi)撿私人板栗:賠償民宿老板300元

阿昌走遍中國(guó)
2025-10-05 22:15:33
中國(guó)海軍:一夜之間就到了高不可攀的程度

中國(guó)海軍:一夜之間就到了高不可攀的程度

文雅筆墨
2025-10-06 09:40:02
3-2,27歲日本球星一劍封喉+雙響,42歲范佩西率隊(duì)2連勝升至第一

3-2,27歲日本球星一劍封喉+雙響,42歲范佩西率隊(duì)2連勝升至第一

側(cè)身凌空斬
2025-10-05 22:27:47
哈馬斯屈服跪下了!以色列下一個(gè)目標(biāo):追殺哈馬斯領(lǐng)導(dǎo)人,趕盡殺絕

哈馬斯屈服跪下了!以色列下一個(gè)目標(biāo):追殺哈馬斯領(lǐng)導(dǎo)人,趕盡殺絕

雪中風(fēng)車
2025-10-04 11:23:08
我是上海人,國(guó)慶假期殺到無(wú)錫,三天時(shí)間,我居然不想回家了!

我是上海人,國(guó)慶假期殺到無(wú)錫,三天時(shí)間,我居然不想回家了!

小小包工頭阿汾
2025-10-06 05:57:46
45歲高圓圓和董潔同框,才發(fā)現(xiàn)女人到中年,幸不幸福都寫在臉上

45歲高圓圓和董潔同框,才發(fā)現(xiàn)女人到中年,幸不幸福都寫在臉上

八卦南風(fēng)
2025-09-27 13:38:37
6億打水漂?投資人揭《美人魚2》不上映原因,劣跡藝人害慘周星馳

6億打水漂?投資人揭《美人魚2》不上映原因,劣跡藝人害慘周星馳

查爾菲的筆記
2025-09-02 00:48:54
緬北黑色帝國(guó)崩塌,明家11人領(lǐng)死刑,被關(guān)在中國(guó)兩年還敢口出狂言

緬北黑色帝國(guó)崩塌,明家11人領(lǐng)死刑,被關(guān)在中國(guó)兩年還敢口出狂言

詩(shī)意世界
2025-10-03 17:25:16
王楚欽母親任偉:吉林大學(xué)?;?,創(chuàng)業(yè)虎媽,如今53歲依然好美

王楚欽母親任偉:吉林大學(xué)?;?,創(chuàng)業(yè)虎媽,如今53歲依然好美

觀察鑒娛
2025-09-27 15:27:36
本拉登被擊斃后,美軍在其房?jī)?nèi)搜出大量光碟,民眾:偽宗教人士

本拉登被擊斃后,美軍在其房?jī)?nèi)搜出大量光碟,民眾:偽宗教人士

阿校談史
2025-10-01 19:59:18
民調(diào)飆升后,郝龍斌向大陸喊話,洪秀柱一錘定音,謀求兩岸統(tǒng)一

民調(diào)飆升后,郝龍斌向大陸喊話,洪秀柱一錘定音,謀求兩岸統(tǒng)一

健身狂人
2025-10-06 08:16:35
華為Mate80發(fā)布時(shí)間確認(rèn),讓友商壓力很大啊!

華為Mate80發(fā)布時(shí)間確認(rèn),讓友商壓力很大啊!

科技堡壘
2025-10-05 10:56:30
臧天朔去世7周年,黑衣男墓前擺茅臺(tái) 軟中華,光點(diǎn)煙不開酒引爭(zhēng)議

臧天朔去世7周年,黑衣男墓前擺茅臺(tái) 軟中華,光點(diǎn)煙不開酒引爭(zhēng)議

尋墨閣
2025-09-30 10:37:33
濱崎步上海演唱會(huì)門票僅25分鐘售罄,日本網(wǎng)友感嘆:這就是中國(guó)速度嗎?

濱崎步上海演唱會(huì)門票僅25分鐘售罄,日本網(wǎng)友感嘆:這就是中國(guó)速度嗎?

日本物語(yǔ)
2025-10-03 20:55:45
1952年連長(zhǎng)派戰(zhàn)士去放哨,只因少叮囑一句,他竟堵著美軍打一整夜

1952年連長(zhǎng)派戰(zhàn)士去放哨,只因少叮囑一句,他竟堵著美軍打一整夜

boss外傳
2025-10-05 08:10:03
韓媒爆料:中國(guó)足協(xié)接觸鄭澤彥!推進(jìn)歸化工作,靠他補(bǔ)強(qiáng)國(guó)足短板

韓媒爆料:中國(guó)足協(xié)接觸鄭澤彥!推進(jìn)歸化工作,靠他補(bǔ)強(qiáng)國(guó)足短板

國(guó)足風(fēng)云
2025-10-05 19:57:29
史無(wú)前例的退休潮來(lái)了,比養(yǎng)老金見底更可怕的,是醫(yī)院的床位

史無(wú)前例的退休潮來(lái)了,比養(yǎng)老金見底更可怕的,是醫(yī)院的床位

小怪吃美食
2025-10-06 04:19:22
吳艷妮穿緊身三角褲太窄被批“露骨”,到底礙了誰(shuí)的眼?

吳艷妮穿緊身三角褲太窄被批“露骨”,到底礙了誰(shuí)的眼?

傲嬌的馬甲線
2025-09-17 18:06:44
2025-10-06 10:56:49
碼農(nóng)翻身 incentive-icons
碼農(nóng)翻身
有趣且硬核的技術(shù)文章
181文章數(shù) 546關(guān)注度
往期回顧 全部

科技要聞

馬斯克腦機(jī)接口公司終于向科學(xué)界“交底”

頭條要聞

"拉面哥"稱不可能回到大集上賣拉面了:回不去了

頭條要聞

"拉面哥"稱不可能回到大集上賣拉面了:回不去了

體育要聞

37歲大師退役儀式:集體列隊(duì) 梅西送祝福

娛樂(lè)要聞

王詩(shī)齡評(píng)論區(qū)淪陷 李湘刪博重發(fā)不道歉

財(cái)經(jīng)要聞

暴漲前夜,大國(guó)博弈找到了新戰(zhàn)場(chǎng)!

汽車要聞

奇瑞全新大型SUV亮相!大六座+800V平臺(tái)

態(tài)度原創(chuàng)

本地
房產(chǎn)
時(shí)尚
健康
公開課

本地新聞

讀港校想省錢,社恐輸在起跑線

房產(chǎn)要聞

十一直擊,三亞這個(gè)熱盤,又火了!

沒(méi)想到這3個(gè)小習(xí)慣,給我生活帶來(lái)這么大的變化

內(nèi)分泌科專家破解身高八大謠言

公開課

李玫瑾:為什么性格比能力更重要?

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版 free性白嫩少妇XXXXHD | 色妞永久免费视频| 国产一区国产二区在线视频| 樱花草影院免费在线| 色婷婷在线精品国自产拍| 夜夜爽夜夜做| 成人免费无码大片A毛片久久| 九九热只有精品| 亚洲av成人片色在线观看| 亚洲日韩国产精品第一页一区 | 国产精品美女久久久| 久久久久国产精品人妻aⅴ天堂| 四川农村一级毛片免费| 日本99久久久久久久久人妻斩 | 超碰人人97在线| 久草热8精品视频在线观看| 一区二区三区毛片| 少妇av资源网| 欧美精品日韩精品一卡| 久久免费AV| 熟妇无码乱子成人精品| 亚洲日韩a级片d!,| 欧美精品一区二区三区百合视频 | 国产香蕉久久综合| 色婷婷19k禁| 久久永久地址| 爱爱XXX三区四区| 日韩精品人涩人| 国产精品天天看天天狠| 一本久道综合久久精品 | 久久久久无码精品国产AV| 久久传媒视频| 国产精品久久久久免费Aⅴ| 免费A级毛片樱桃视频| 亚洲乱伦一区| 99久久久久无码国产精品免费 | 97久久精品| 国产bdsm一区二区| 久久九九精品国产免费看小说| 来10个人操我| 男士网站在线观看|