V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
BNineCoding
V2EX  ›  问与答

想到一个比较沙雕的语言设计问题,不知道是否有标准答案?

  •  
  •   BNineCoding · 5 天前 · 957 次点击

    不同语言中,参数名和类型的位置是不一样的。

    比如 java 中是:String name ,先写声明类型,再写变量名。

    但在 JavaScript 中是:name:string ,先写变量名,再写类型。

    在我看来这两个声明方式完全没任何区别,为什么语言设计者要搞出两种不同的使用方式?

    这不是徒增 diff 吗?

    第 1 条附言  ·  5 天前
    它涉及到编程语言设计的历史、哲学以及实用性方面的考虑。不同的语言设计者可能会基于不同的理念和目标来决定语言的语法结构,包括类型和变量名的声明顺序。

    历史和传统
    首先,很多语言的设计受到了它们的“祖先”或者更早的语言的影响。例如,Java 语言在很大程度上受到了 C 和 C++ 的影响,这两种语言都采用了“类型在前,变量名在后”的声明方式。这种方式有助于在阅读代码时快速识别变量的类型。

    JavaScript 的类型注解(在使用 TypeScript 或者 Flow 时)采用了“变量名在前,类型在后”的方式,这种方式则更接近于动态类型语言的自由风格,并且在某种程度上与数学符号的声明方式(如函数 f: X -> Y )相似,可能更自然地表达了“这个变量是这种类型”的概念。

    设计哲学
    不同的设计哲学也影响了语法的选择。例如,Java 的设计强调了清晰的结构和严格的类型安全,这可能促使其采用了一种更为正式和明确的声明方式(类型先行)。而 JavaScript 最初被设计为一种轻量级的脚本语言,强调的是快速开发和灵活性,其类型系统(在引入 TypeScript 等静态类型系统之前)是动态的,因此其语法更加灵活。

    实用性和可读性
    从实用性和可读性的角度来看,不同的声明方式各有优劣。类型在前的方式使得在查看代码库或进行代码审查时,能够快速地识别出变量的类型,这对于维护大型代码库是非常有帮助的。而变量名在前的方式则可能使得代码看起来更接近自然语言,对于某些人来说可能更易于理解。

    结论
    总的来说,虽然这两种方式在功能上并没有本质的区别,它们反映了不同的设计理念和目标。语言的设计往往需要在多种因素之间做出权衡,包括但不限于历史背景、目标用户群、预期的用途等。因此,不同的语言可能会选择不同的方式来满足其特定的需求和优化用户的体验。这种多样性虽然在某种程度上增加了学习和使用不同语言的复杂性,但也丰富了编程语言的生态,使得开发者可以根据具体的项目需求和个人偏好选择最合适的工具。
    第 2 条附言  ·  5 天前
    问了一下 gpt ,提炼了一个重点:JavaScript 这种语言其实是动态类型的,比如 JavaScript/typescript/arkts 就有联合类型的形式,所以类型被弱化放后面了。
    17 条回复    2024-12-16 10:28:46 +08:00
    ferock
        1
    ferock  
       5 天前 via Android
    所以世界才这么五彩斑斓
    ferock
        2
    ferock  
       5 天前 via Android
    为什么要都一样呢?那何必再多个语言呢
    cmdOptionKana
        3
    cmdOptionKana  
       5 天前
    因为 “照顾老习惯” 并非最高优先级。百花齐放,自由地创造反而更重要。

    另外要注意,它们不一样,不是故意不一样,而是各自选择了自己认为最合适的方式,有时恰好一致,有时恰好不同,有时恰好大同小异。
    NotLongNil
        4
    NotLongNil  
       5 天前
    name:string 是 TypeScript 的写法吧,我个人猜测采用这种写法是为减轻编译器的实现
    crysislinux
        5
    crysislinux  
       5 天前 via Android
    这个问题是有明确答案的,去问 gpt 吧。
    panlatent
        6
    panlatent  
       5 天前 via Android
    归根到底还是设计哲学的问题
    Leviathann
        7
    Leviathann  
       5 天前
    因为 C 是 BS
    yoyoyoyolol
        8
    yoyoyoyolol  
       5 天前 via iPhone
    故意的,都一样了还有啥区分.就跟 switch 手柄和 xbox 手柄那四个控制键反着来差不多
    CEBBCAT
        9
    CEBBCAT  
       5 天前 via iPhone
    这个网站目前不接受 AI 生成内容 建议楼主点击“下沉主题”按钮
    DOLLOR
        10
    DOLLOR  
       5 天前
    TS 的变量类型是可以省略的,编译器、LSP 可以自动推导。
    既然是可省略的东西,应该放在后面,因为相对不那么重要。

    另外请不要直接贴 AI 的长篇大论。
    Perry
        11
    Perry  
       5 天前 via iPhone
    校服穿惯的学生想法是这样子的
    cmdOptionKana
        12
    cmdOptionKana  
       5 天前
    > 提炼了一个重点:JavaScript 这种语言其实是动态类型的...所以类型被弱化放后面了

    虽然但是,静态类型的 Go 也是类型放后面 func f(x string) {}
    glcolof
        13
    glcolof  
       5 天前   ❤️ 1
    最早的时候,底层语言关注的是内存空间,内存空间对应的是类型,变量名只是帮助记忆的符号,所以先确定类型再赋予名字。
    高级语言关注的是逻辑,变量是逻辑的一部分,所以先确定变量,后面有需要的时候再赋予类型。
    时间长了之后,大家各自养成了习惯,形成了固定的审美倾向,所以也就不管这些了,想类型在前就类型在前,想变量名在前就变量名在前,反正结果都一样。
    zhhbstudio
        14
    zhhbstudio  
       5 天前
    众所周之,Javascript 变量没有类型,直接 name = anything 。
    name:string 已经是 Flow 或 Typescript 的了,都是得做一次转换才是 Javascript ,转完了也没类型定义了。
    zhhbstudio
        15
    zhhbstudio  
       5 天前
    @zhhbstudio #14 众所周知....
    cenbiq
        16
    cenbiq  
       5 天前
    @glcolof 跟我想的一样,变量在前的语言主要着重变量本身,类型放前面的语言主要着重类型。并且据我观察确实越新的语言越是前者。
    wanguorui123
        17
    wanguorui123  
       5 天前
    成熟的人要接受世界的参差不齐
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2785 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 13:58 · PVG 21:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.