V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
nnegier
V2EX  ›  程序员

可以讲下你看到的编程语言的美吗?

  •  
  •   nnegier · 20 天前 · 4603 次点击
    我是写 java 代码的,感觉后续的一些语法更补不是很让人满意,只是写习惯了,不过也萌生了对那种编程语言的美的思考,表现力强,整洁优美,但我自身接触的语言实在有限,所以想想问问大家,如果可以,也希望可以附上一段你喜欢的代码。

    自己提下 python 吧,但只接触过一点,未实际项目,它有一种语法层面的整洁美,那个缩进。
    第 1 条附言  ·  19 天前
    感觉这样问有点不太适合,因为各个语言的语法不太一样,如果没有用过可能很难一眼欣赏到它的美的地方,好的代码可能也要限定同一种语言内讨论才有意义,谢谢大家的讨论,我就把这个帖子下沉了。
    然后最后我也想表达一下,java 系我个人的话可能现阶段比较喜欢 groovy 一点。
    idrunk
        1
    idrunk  
       20 天前
    个人感觉 Java 比较美,虽然较啰唆,但比较优雅。python 接触不多,觉得它太灵活了,各种语法,比较乱,不优雅。但如果现在二选一,我还是会选 python ,因为觉得实用大于语法优雅。
    scp3125
        2
    scp3125  
       20 天前   ❤️ 2
    ```rust
    fn read_file(path: &str) -> Result<String, io::Error> {
    let mut file = File::open(path)?; // 自动传播错误
    let mut contents = String::new();
    file.read_to_string(&mut contents)?; // 自动传播错误
    Ok(contents)
    }
    ```
    rust 的错误处理吧,是我见过的最好的错误处理方式
    hefish
        3
    hefish  
       20 天前
    不可以。讲不出来。自己脑补吧。
    iintothewind
        4
    iintothewind  
       20 天前
    不可变数据结构, 无副作用函数, 消息驱动在多线程上下文, 异步, 和分布式场景拥有天然优势.

    控制流语句, if-else, foreach, unit, try, 不再只是命令, 而是输入输出数据的操作符, 跟函数的作用是一样的.

    可惜实现了这些思想的高级语言只能运行在指令式设计的处理器上.

    所以底层实现还是内存块, 指针, 加操作指令.
    yvescheung
        5
    yvescheung  
       20 天前   ❤️ 4
    Tomohiko Sakamoto 算法,来确定当前日期是星期几:
    int dow(int y, int m, int d) {
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    y -= m < 3;
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
    }


    快速平方根倒数算法:
    float Q_rsqrt( float number )
    {
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y = number;
    i = * ( long * ) &y;
    i = 0x5f3759df - ( i >> 1 );
    y = * ( float * ) &i;
    y = y * ( threehalfs - ( x2 * y * y ) );

    return y;
    }
    little_cup
        6
    little_cup  
       20 天前   ❤️ 7
    2025 年了,AI 临门一脚的时代,我不认为程序员需要再把自己的追求放到这种事情上面。

    准确说,所有受限于人类脑眼结构的 IO 带宽有限而做的优化都即将失去意义。
    注释无误的情况下越啰嗦越好,编译结果一致的前提下代码越平庸越好,框架越大众越好。以往追求的美感,诸如逻辑单元的可复用性、「巧妙」的写法也很快会失去意义,因为几秒钟新写一个成本将远低于维护,不需要维护的代码的「美感」没有价值。
    Dropless
        7
    Dropless  
       20 天前   ❤️ 1
    ```csharp
    Person person = new Person(); // good old.
    var person = new Person(); // cool. 较新一点的 Java 现在也能这样写, 不过 csharp 很早就有了
    Person person = new(); // awesome. 我想不到比这更简洁的写法了
    ```

    搞点怪的:
    ```common lisp
    (loop repeat 10
    for x = (random 100)
    if (evenp x)
    collect x into evens
    else
    collect x into odds
    finally (return (values evens odds)))
    ;; =>
    (92 44 58 68)
    (95 5 97 43 99 37)
    ```
    其它语言里很基础的循坏结构, 在 common lisp 里硬是弄出了一套 dsl. 有时候我讨厌它, 有时候我又喜欢它.
    dcoder
        8
    dcoder  
       20 天前   ❤️ 11
    Java 还美, 疯了...
    omoiFly
        9
    omoiFly  
       20 天前   ❤️ 2
    Y-Combinator
    ```scheme
    (define Y
    (λ (le)
    ((λ (f)
    (f f))
    (λ (f)
    (le (λ (x) ((f f) x)))))))
    ```
    Rust2015
        10
    Rust2015  
       20 天前   ❤️ 1
    最美不过 C#
    AEDaydreamer
        11
    AEDaydreamer  
       20 天前   ❤️ 1
    函数式的语法我觉得都挺美
    aresyang
        12
    aresyang  
       20 天前
    ocaml 实现的神经网络
    dalaoshu25
        13
    dalaoshu25  
       20 天前   ❤️ 1
    美,当然是 Pascal
    vincentWdp
        15
    vincentWdp  
       20 天前
    erlang/elixir 的 pattern match 是我见过的最优雅的
    charles0
        16
    charles0  
       20 天前   ❤️ 3
    一个微软研究院的编程语言[Koka]( https://github.com/koka-lang/koka),函数式强类型,用 algebraic effect 管理任意的副作用(可用来实现协程和 async/await 等等),它非常漂亮和统一,在语法和语义上都非常优雅,体现在它有一个非常小的核心语言子集,其它语言构造都可以转化成核心语言; while 只是一个普通的标准库函数;所有圆括号永远先求值而所有花括号都会后续求值零次/一次/多次(作为匿名函数);使用类似 Python 的缩进来省略 C 风格的花括号;和 Rust 一样函数块的最后一个表达式作为返回值;函数式语言标配的类型推导和模式匹配;所有 a.f 都等价于 f(a) ......
    这个编程语言属于研究性质,可能对于缺少函数式编程背景的人来说有点难懂,而且资料较少,需要参考它的论文、文档、示例还有测试用例,一个例子如下:
    ```
    // A custom generator effect (which is polymorphic)
    effect yield<a>
    fun yield(x: a): ()

    // Traverse a list and yield the elements (which is also polymorphic) with 'yield' effect
    fun traverse(xs: list<a>): yield<a> ()
    match xs
    Cons(x,xx) -> { yield(x); traverse(xx) }
    Nil -> ()

    fun main(): console ()
    with fun yield(i: int) // Handles the 'yield' effect
    println("yielded " ++ i.show) // Printing requires 'console' effect
    [1,2,3].traverse
    ```
    charles0
        17
    charles0  
       20 天前
    @charles0 注意这上面的缩进没了
    kenvix
        18
    kenvix  
       20 天前
    你既然写 java 就搞点 kotlin 呗
    xgdgsc
        19
    xgdgsc  
       20 天前 via Android
    levelworm
        20
    levelworm  
       20 天前
    可以试试看比较 exotic 的语言,比较说 Forth 。
    leegradyllljjjj
        21
    leegradyllljjjj  
       20 天前 via iPhone
    c sharp 的 lamda 表达式,java 一处编写 处处不能运行
    catazshadow
        22
    catazshadow  
       20 天前
    OCaml 那种没有循环的语言
    DOLLOR
        23
    DOLLOR  
       20 天前
    python 虽美,但是贴在 v2 上缩进全部崩溃🐶
    dcsuibian
        24
    dcsuibian  
       20 天前
    [img][/img]
    xjpz
        25
    xjpz  
       20 天前
    <img alt="Scala 之美" src="https://imgur.com/a/1ztRcVM">
    xjpz
        27
    xjpz  
       20 天前   ❤️ 1
    CodingIran
        28
    CodingIran  
       20 天前
    @scp3125 Swift 有类似的处理:

    ```swift

    // 从文件路径读取字符串,返回结果或错误
    func readFile(path: String) -> Result<String, Error> {
    Result { try String(contentsOfFile: path, encoding: .utf8) }
    }

    // 处理结果或错误
    switch readFile(path: "/test.txt") {
    case .failure(let error):
    print("reading file failed: \(error)")
    case .success(let contents):
    print("reading file contents: \(contents)")
    }

    ```
    humingk
        29
    humingk  
       20 天前 via iPhone   ❤️ 1
    几乎不用维护的代码最优雅,死代码才是好代码
    suyabgaran
        30
    suyabgaran  
       20 天前
    美?那肯定是 Ruby 呀
    yhxx
        31
    yhxx  
       20 天前
    说到美,那当然是我大 JavaScript
    class Example {
    #privateField = 42;

    getPrivateField() {
    return this.#privateField;
    }
    }


    let x = (1, 2, 3);
    console.log(x); // 3


    ['1', '2', '3'].map(parseInt); // [1, NaN, NaN]

    还有这个字字珠玑:
    console.log(0 == "0"); // true
    console.log(0 == []); // true
    console.log(0 == ""); // true
    console.log("0" == []); // false
    console.log([] == ![]); // true
    cj323
        32
    cj323  
       20 天前
    还是觉得 C 最美:大道至简,大智若愚

    ```
    int main() {
    printf("Hello, World!\n");
    return 0;
    }
    ```
    nebkad
        33
    nebkad  
       20 天前
    我认为一个编程语言如果是美的,那么它可以通过自己的代码,来描述关于用它写成的程序自身的几个问题:
    1. 我(这个程序)要解决什么样的问题
    2. 我(这个程序)要如何解决这个问题
    3. 我(这个程序)如何证明这个问题被解决了

    目前这三点都做得很好的,在我用过的编程语言( C/C++, Java, C#, F#, Python, Haskell, Javascript, Rust )里,
    nebkad
        34
    nebkad  
       20 天前
    @nebkad #33 Rust 做得最好
    nebkad
        35
    nebkad  
       20 天前   ❤️ 1
    @little_cup #6 反对这个说法:

    注释无误的情况下越啰嗦越好,编译结果一致的前提下代码越平庸越好,框架越大众越好。以往追求的美感,诸如逻辑单元的可复用性、「巧妙」的写法也很快会失去意义,因为几秒钟新写一个成本将远低于维护,不需要维护的代码的「美感」没有价值。


    编程世界存在一些不可动摇的基础,否则整个世界如同流沙上的城堡。
    只不过这些东西都被隐藏得很深,所以我们以为不再需要它们。
    9LCRwvU14033RHJo
        36
    9LCRwvU14033RHJo  
       19 天前
    简单是一种美。语法简单:C 语言。写出来的程序简短:Python 语言。
    iintothewind
        37
    iintothewind  
       19 天前
    @xjpz #27 Scala 的 control-flow 演示的不错, 但是有些地方我认为还是处理的不好,
    几处 if-else 的嵌套如果用 pattern-match 是不是就不用这么多行了,
    errorhandling 的分支都是 Ok(XXX)不是很认同.
    Zien
        38
    Zien  
       19 天前
    對我來說, 主要是各種 monospace 字體... IDE 各種 UI... 還有縮進...
    mayli
        39
    mayli  
       19 天前
    应该没有啥美不美,我觉得更多的是取舍(trade off)
    就比如 java vs python

    java 明显更工业化,适合巨型项目,py 的话,脚本还可以,短小精悍
    更多的是语言适配了某个场景,比如程序员水平,业务需求,开发场景,配合得当就挺美的。
    go 代码看起来丑,但是编译玩用起来不用折腾依赖库也很优雅。

    另外我见过最让我惊艳的大概是 prolog ,虽然有些人吹 functional ,oop ,啥的,但是 prolog 感觉完全是另一种思路,甚至有种前 gpt 的感觉。
    charlie21
        40
    charlie21  
       19 天前
    依赖倒置 DIP 在概念层面
    控制反转 IoC 在设计一个软件的时候的设计原则/设计模式方面
    依赖注入 DI 在具体方法层面

    https://www.zhihu.com/question/265433666/answer/337599960# 阿莱克西斯: 为什么有很多人说 Go 语言不需要依赖注入? 依赖倒置原则与系统设计
    https://www.zhihu.com/question/68611994/answer/298845862 在做程序员的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进?
    charlie21
        41
    charlie21  
       19 天前
    https://www.zhihu.com/question/22508677/answer/276595266 阿莱克西斯: 编程到底难在哪里?
    dwu8555
        42
    dwu8555  
       19 天前   ❤️ 3
    C#的 LINQ 遥遥领先,最美担当

    june4
        43
    june4  
       19 天前   ❤️ 1
    @dwu8555 这个和别的普通语言的函数式库有什么特殊优势吗?
    比如 js 类的也是一行就行: R(scores).filter(s => s > 80).map(s => s)
    kidlj
        44
    kidlj  
       19 天前
    Swift 的闭包挺美的。argument label 也挺好的,独一份。
    ddup
        45
    ddup  
       19 天前 via Android   ❤️ 1
    用过 c# java typescript vb c++ php
    c# 是最美的,尤其是 linq 和模式匹配,方便美丽又高效
    thoo61871
        46
    thoo61871  
       19 天前
    在厂里打螺丝的工人会觉得螺丝刀美吗
    nicebird
        47
    nicebird  
       19 天前
    暂时没有觉得美过
    9LCRwvU14033RHJo
        48
    9LCRwvU14033RHJo  
       19 天前
    @dwu8555 Python 是这样一行而已
    ```py
    scores = [97, 92, 81, 60]
    scoreQuery = [s for s in scores if s > 80]
    print(scoreQuery)
    ```
    mcfog
        49
    mcfog  
       19 天前
    你只是看的少了
    ....觉得有些新鲜感
    ....文面上简洁,基本意味着语法或机制的复杂
    ....而语法简洁,基本意味着文面上有冗余
    ....美和美之间是有冲突和矛盾的
    ....所以大家说谁美谁不美,可能实际上实在争论 xp
    dragondove
        50
    dragondove  
       19 天前
    @dwu8555 你这个例子不太能表现出 LINQ 的优势,对应的 scala 代码如下
    ```scala
    val scores = Array(97, 82, 60, 99)
    val r = for score <- scores
    if score > 80
    yield score

    println(r.mkString(" "))

    ```
    python 也可以做到更简洁
    ```python
    scores: list[int] = [97, 92, 81, 60]
    r = [score for score in scores if score > 80]
    print(" ".join([str(x) for x in r]))
    ```
    dragondove
        51
    dragondove  
       19 天前
    @scp3125 Result 对比 Checked Exception 并没有显著的优势,你的例子换成 java 写可能还更简洁
    ```java
    public static String readFile(String path) throws FileNotFoundException, IOException {
    File file = new File(path);
    try (var fis = new FileInputStream(file)) {
    return new String(fis.readAllBytes());
    }
    }
    ```
    异常靠 throws 传播,和你的问号作用基本是一样的,函数的返回类型还更简单,模式匹配靠 catch 匹配,能达到相同的效果,代码还更简洁。
    dragondove
        52
    dragondove  
       19 天前
    @Dropless 创建对象的话,kotlin 和 scala 都可以直接 `val person = Person()` 也足够简洁(数字符的话和 Person person = new() 是一样多的),不过 scala 中内置的想法会不太一样,scala 是 universal apply (实际上调用的是 Person 伴生对象的 apply 方法)更加通用一些,也可以自行改造成工厂方法(用起来和构造器一样,实际是工厂,更加统一)
    noahlias
        53
    noahlias  
       19 天前
    Haskell 绝妙的美

    powerSet = filterM (const [True, False])
    Flourite
        54
    Flourite  
       19 天前 via iPhone
    美是一种很主观的事情,自己尝试看喜欢什么。it 行业这种言论多的是宗教,以后 ai 直接把他们都灭了
    dragondove
        55
    dragondove  
       19 天前
    @mcfog 和语言设计者的功底也有关,以及语言提供多大的自由度(有时候限制自由是好事),举个例子,scala 没有运算符重载,但是也可以给任意类型添加运算符。因为 scala 的函数名可以为符号,结合扩展方法和中缀表达式就可以给类型添加运算。scala 中 `1 + 2` 就是 `1.+(2)` 而已。这样就不需要额外引入运算符重载的语法了。缺点就是自由度过大,导致一些库作者玩的太花,各种自定义运算符满天飞。所以有时候限制自由度是有好处的
    LieEar
        56
    LieEar  
       19 天前
    虽然我也写过一年 java ,但是我觉得 java 是最丑的。
    我觉得 python 的推导式很美
    9LCRwvU14033RHJo
        57
    9LCRwvU14033RHJo  
       19 天前
    那种老油条,倚老卖老,我吃过的盐比你吃过的米还多,居然也会出现在互联网行业。
    dwu8555
        58
    dwu8555  
       19 天前
    @user8341 #48 c# 的 linq 还能能应用在各种数据库上,甚至是 XML 。
    liuliuliuliu
        59
    liuliuliuliu  
       19 天前   ❤️ 1
    @dwu8555 #42
    @dragondove #50

    可能稍微复杂一点的例子会好些,例如
    var results = from p in persons
    where p.Age > 18
    orderby p.Name ascending, p.Age descending
    select new { p.Name, p.Age };

    这 persons 可以是数组、List 、数据库、xml 等等
    假如是数据库会通过表达式树直接转换成 sql
    chachi
        60
    chachi  
       19 天前
    c#的 lambda 表达式更符合直觉
    var result = people
    .Where(p => p.Score > 80)
    .OrderBy(p => p.Name)
    .Select(p => p.Name)
    .ToList();
    twinsant
        61
    twinsant  
       19 天前
    Python & Swift
    hez2010
        62
    hez2010  
       19 天前
    C# 用模式匹配轻松完成对 !!x 这种双重 not 的化简:

    ![doublenot]( )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1217 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 18:10 · PVG 02:10 · LAX 10:10 · JFK 13:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.