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

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

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

    自己提下 python 吧,但只接触过一点,未实际项目,它有一种语法层面的整洁美,那个缩进。
    第 1 条附言  ·  6 天前
    感觉这样问有点不太适合,因为各个语言的语法不太一样,如果没有用过可能很难一眼欣赏到它的美的地方,好的代码可能也要限定同一种语言内讨论才有意义,谢谢大家的讨论,我就把这个帖子下沉了。
    然后最后我也想表达一下,java 系我个人的话可能现阶段比较喜欢 groovy 一点。
    idrunk
        1
    idrunk  
       7 天前
    个人感觉 Java 比较美,虽然较啰唆,但比较优雅。python 接触不多,觉得它太灵活了,各种语法,比较乱,不优雅。但如果现在二选一,我还是会选 python ,因为觉得实用大于语法优雅。
    scp3125
        2
    scp3125  
       7 天前   ❤️ 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  
       7 天前
    不可以。讲不出来。自己脑补吧。
    iintothewind
        4
    iintothewind  
       7 天前
    不可变数据结构, 无副作用函数, 消息驱动在多线程上下文, 异步, 和分布式场景拥有天然优势.

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

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

    所以底层实现还是内存块, 指针, 加操作指令.
    yvescheung
        5
    yvescheung  
       7 天前   ❤️ 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  
       7 天前   ❤️ 7
    2025 年了,AI 临门一脚的时代,我不认为程序员需要再把自己的追求放到这种事情上面。

    准确说,所有受限于人类脑眼结构的 IO 带宽有限而做的优化都即将失去意义。
    注释无误的情况下越啰嗦越好,编译结果一致的前提下代码越平庸越好,框架越大众越好。以往追求的美感,诸如逻辑单元的可复用性、「巧妙」的写法也很快会失去意义,因为几秒钟新写一个成本将远低于维护,不需要维护的代码的「美感」没有价值。
    Dropless
        7
    Dropless  
       7 天前   ❤️ 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  
       7 天前   ❤️ 11
    Java 还美, 疯了...
    omoiFly
        9
    omoiFly  
       7 天前   ❤️ 2
    Y-Combinator
    ```scheme
    (define Y
    (λ (le)
    ((λ (f)
    (f f))
    (λ (f)
    (le (λ (x) ((f f) x)))))))
    ```
    Rust2015
        10
    Rust2015  
       7 天前   ❤️ 1
    最美不过 C#
    AEDaydreamer
        11
    AEDaydreamer  
       7 天前   ❤️ 1
    函数式的语法我觉得都挺美
    aresyang
        12
    aresyang  
       7 天前
    ocaml 实现的神经网络
    dalaoshu25
        13
    dalaoshu25  
       7 天前   ❤️ 1
    美,当然是 Pascal
    vincentWdp
        15
    vincentWdp  
       7 天前
    erlang/elixir 的 pattern match 是我见过的最优雅的
    charles0
        16
    charles0  
       7 天前   ❤️ 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  
       7 天前
    @charles0 注意这上面的缩进没了
    kenvix
        18
    kenvix  
       7 天前
    你既然写 java 就搞点 kotlin 呗
    xgdgsc
        19
    xgdgsc  
       7 天前 via Android
    levelworm
        20
    levelworm  
       7 天前
    可以试试看比较 exotic 的语言,比较说 Forth 。
    leegradyllljjjj
        21
    leegradyllljjjj  
       7 天前 via iPhone
    c sharp 的 lamda 表达式,java 一处编写 处处不能运行
    catazshadow
        22
    catazshadow  
       7 天前
    OCaml 那种没有循环的语言
    DOLLOR
        23
    DOLLOR  
       7 天前
    python 虽美,但是贴在 v2 上缩进全部崩溃🐶
    dcsuibian
        24
    dcsuibian  
       7 天前
    [img][/img]
    xjpz
        25
    xjpz  
       7 天前
    <img alt="Scala 之美" src="https://imgur.com/a/1ztRcVM">
    xjpz
        27
    xjpz  
       7 天前   ❤️ 1
    CodingIran
        28
    CodingIran  
       7 天前
    @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  
       7 天前 via iPhone   ❤️ 1
    几乎不用维护的代码最优雅,死代码才是好代码
    suyabgaran
        30
    suyabgaran  
       7 天前
    美?那肯定是 Ruby 呀
    yhxx
        31
    yhxx  
       7 天前
    说到美,那当然是我大 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  
       7 天前
    还是觉得 C 最美:大道至简,大智若愚

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

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

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


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

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

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

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

    june4
        43
    june4  
       7 天前   ❤️ 1
    @dwu8555 这个和别的普通语言的函数式库有什么特殊优势吗?
    比如 js 类的也是一行就行: R(scores).filter(s => s > 80).map(s => s)
    kidlj
        44
    kidlj  
       7 天前
    Swift 的闭包挺美的。argument label 也挺好的,独一份。
    ddup
        45
    ddup  
       7 天前 via Android   ❤️ 1
    用过 c# java typescript vb c++ php
    c# 是最美的,尤其是 linq 和模式匹配,方便美丽又高效
    thoo61871
        46
    thoo61871  
       7 天前
    在厂里打螺丝的工人会觉得螺丝刀美吗
    nicebird
        47
    nicebird  
       7 天前
    暂时没有觉得美过
    user8341
        48
    user8341  
       7 天前
    @dwu8555 Python 是这样一行而已
    ```py
    scores = [97, 92, 81, 60]
    scoreQuery = [s for s in scores if s > 80]
    print(scoreQuery)
    ```
    mcfog
        49
    mcfog  
       7 天前
    你只是看的少了
    ....觉得有些新鲜感
    ....文面上简洁,基本意味着语法或机制的复杂
    ....而语法简洁,基本意味着文面上有冗余
    ....美和美之间是有冲突和矛盾的
    ....所以大家说谁美谁不美,可能实际上实在争论 xp
    dragondove
        50
    dragondove  
       6 天前
    @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  
       6 天前
    @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  
       6 天前
    @Dropless 创建对象的话,kotlin 和 scala 都可以直接 `val person = Person()` 也足够简洁(数字符的话和 Person person = new() 是一样多的),不过 scala 中内置的想法会不太一样,scala 是 universal apply (实际上调用的是 Person 伴生对象的 apply 方法)更加通用一些,也可以自行改造成工厂方法(用起来和构造器一样,实际是工厂,更加统一)
    noahlias
        53
    noahlias  
       6 天前
    Haskell 绝妙的美

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

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