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

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

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

    自己提下 python 吧,但只接触过一点,未实际项目,它有一种语法层面的整洁美,那个缩进。
    62 条回复    2025-01-31 16:27:20 +08:00
    idrunk
        1
    idrunk  
       1 天前
    个人感觉 Java 比较美,虽然较啰唆,但比较优雅。python 接触不多,觉得它太灵活了,各种语法,比较乱,不优雅。但如果现在二选一,我还是会选 python ,因为觉得实用大于语法优雅。
    scp3125
        2
    scp3125  
       1 天前   ❤️ 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  
       1 天前
    不可以。讲不出来。自己脑补吧。
    iintothewind
        4
    iintothewind  
       1 天前
    不可变数据结构, 无副作用函数, 消息驱动在多线程上下文, 异步, 和分布式场景拥有天然优势.

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

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

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

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

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

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

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


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

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

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

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

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

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

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