GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 902|回复: 21
收起左侧

[技术交流] 【设计哲学】字符串到底该是什么?

[复制链接] |关注本帖

寻觅眼镜蛇图腾香喷喷的烤鸡风雪之家牧羊人GM論壇榮譽勛章山猫图腾

     楼主| 白冥 发表于 2024-6-19 05:25:59 | 显示全部楼层 |阅读模式 |取消关注该作者的回复
    本帖最后由 白冥 于 2024-6-19 05:27 编辑

      有的编程语言(如Python、JavaScript、Java、C#、Go等)会将字符串视为基本数据类型之一,其他基本数据类型一样不可改变,他们认为字符(character)只不过是长度为一的字符串。有的编程语言(如C、C++、Ruby等)会将字符串视为复合的数据结构,是字符数组(characters array)或类似的数据结构,字符串的每一个字符都可以像其他数组或类似的数据结构一样随意更替,甚至添加或删除字符(除非有意设计成不可变数据结构)。
      为什么各个编程语言对字符串(string/String)持有有不同的观点?
      从性能方面考虑,有些编程语言支持并发操作,会有一种线程池优化机制,相同的字符串实例可以被共享,以节省内存资源,此时如果字符串是可变的,则会因为其中一个引用修改它而造成线程安全问题。
      从安全方面考虑,有些编程语言被用于通信领域和加密场景,不可变性意味着字符串一旦创建就不能被修改,这有助于防止意外的数据损坏或安全漏洞,使得字符串操作更加可预测,减少了由于修改导致的错误。
      从操作灵活性方面考虑,有些编程语言作为底层开发语言,更注重底层管理和控制,需要频繁修改字符串内容,能够直接修改字符串中的字符则提供了更大的灵活性,如果大量创建字符串实例,反而不易管理和控制。
      一般高级的编程语言往往侧重于应用层的开发,诸如通讯软件、购物网站、交易平台、大语言模型等等领域往往要求高并发、多线程与安全的通信交互,因此他们更倾向于将字符串视为不可变的基本数据类型。而底层的编程语言则侧重于系统层的开发,诸如操作系统、嵌入式设计、游戏引擎等领域往往要求可以灵活且精细地控制内存与性能,创建大量字符串实例不易管理和控制,因此他们更倾向于将字符串视为可变的复合数据结构。
      所以,如果一门编程语言是高级的,那么它通常将字符串视为不可变的基础数据类型,反之,如果一门编程语言是底层的,那么它通常将字符串视为可变的复合数据结构。
      随着编程语言的发展,一些现代语言(如Swift和Kotlin)对字符串又有不一样的看法。例如,Swift将字符串视为基本数据类型,又提供了高效的修改操作,通过Copy-On-Write技术来平衡不可变性和性能需求。这种设计既保留了不可变数据类型的优点,又在一定程度上提供了可变性。

    评分

    参与人数 1追随 +1 收起 理由
    li漠北 + 1 过于专业了

    查看全部评分

      收起(3)
    • 白冥 白冥 :我倾向于字符串是一种不可变的容器数据类型。在Python中有一种元组(tuple),就是一种不可变的基础容器数据类型,不一样的是,字符串存储的元素也是一个字符串,每个字符串都是一个不可变的容器,任何字符串都存储空字符串,空字符串只存储自身。
      2024-06-19 05:51 回复
    • 白冥 白冥 :
        我提出我自己的观点,如果让我设计编程语言,我会将字符串视为一种不可变的容器数据类型。我认为的字符串类型和传统不可变容器不一样的是,字符串存储的元素也是一个字符串,每个字符串都是一个不可变的容器,而且任何字符串都默认存储一个空字符串。空字符串是引用唯一的,且只存储自身,如果试图访问存储的字符串存储的空字符串,都会返回同一个空字符串。并将字符串内的字符串的访问设置为惰性的,未访问过的字符串不占用内存,并在访问后释放。
        它将有如下特性:
        每个字符串都是容器:在这个模型中,一个字符串可能由多个子字符串组成,每个子字符串本身也是一个完整的字符串对象。
        字符串共享引用:相同的字符串实例应被视为同一个,可以被共享,以节省内存资源。
        空字符串具有引用唯一性:这意味着在整个程序中,所有对空字符串的引用都指向同一个对象实例。
        空字符串也存储字符串:在这个模型中,即使是空字符串也被视为一个容器,虽然它本身不包含任何字符数据,但它仍然可以视作一个引用自身的存在。
        容器化的字符串使得对字符串的操作细颗粒化,每一个子字符串都是一个容器,使得它们可以被视作独立于整个字符串的对象,可以方便的被使用和操作。通过共享引用机制,相同的字符串只在内存中只存储一份,节省内存空间,特别是当一个字符串有多个相同的子字符串时,这种优势更加显著。由于其容器化设计,它可以轻松地与其他数据结构进行交互,从而支持更复杂的操作和数据结构。继承了不可变容器类型的优点,天然是并发安全的,在并发环境下保护了字符串的安全性与一致性。
        它有更多的挑战,比如它继承了惰性初始化的缺点,访问会占用内存,如果大量子字符串被频繁访问,内存长时间得不到释放,仍然可能造成内存泄露问题。也继承了有垃圾回收机制的编程语言的缺点,由于需要引用计数和释放没有引用的子字符串,会带来额外的性能开销,使得该编程语言比没有垃圾回收机制的编程语言慢得多。这些问题虽然在大多数编程语言中是可接受的,且可以通过缓存常用字符串、优化字符串操作来实现,但也增加了语言复杂性,而且初期不一定见效,并且对性能敏感的应用可能是一个问题。
        而且这种模型是新颖的,想要融入其他编程语言的大家庭需要解决兼容性问题,对现有的字符串操作函数进行大量的重写和适配。由于新字符串模型的复杂性,大众对此的接受能力和学习成本也需要考虑。
      2024-06-19 07:26 回复
    • 白冥 白冥 :我也想放弃一切然后放在床上摆烂一段时间,或许自己能过得更好一点。但是沉没成本太大了,自己内耗这么久,干了这么多折磨自己的事情,然后一时间让自己放弃所有事情摆烂。我很难能承受这种负罪感,于是只能继续内耗下去。
      2024-06-19 10:01 回复
    • 我也说一句

    回复

    使用道具 举报

    百相千面-晦永远的克叔業火死鬥实现梦想官复原职虚空之海的鲸Zootopia幸运女神的微笑『逆境中的幸运女神』御医神兔

      不同语言对字符串的处理确实不一样,内置的字符串处理函数的功能也不太一样
        收起(1)
      • 白冥 白冥 :其实我感觉不同的编程语言对字符串的分歧在于它和其他的数据类型相比太另类了,似乎没有一种数学上的描述方法。比如整型数据和实型数据就不用说了,布尔型数据可以用格和布尔代数来定义,那字符串呢?数学上对字符串的生成是借用了形式语言的定义,对于其他基础类型,确实与众不同,每种编程语言对其的理解也不一样。
        2024-06-19 08:43 回复
      • 我也说一句

      回复

      使用道具 举报

      近地夜航GM論壇初心者畢業證書果体76

        本帖最后由 Fenriusclaws 于 2024-6-19 09:22 编辑

        看甲方需求(
        甲方如果想让你在java里搞出一套可替换string,那就给他现编一套string array[d,s,b],替换就到array里面操作,毕竟甲方爸爸的要求不能忤逆(10年前的编程知识了,现在基本已经全部忘光
        回复

        使用道具 举报

        史莱姆牧场吸血魔蝠萨菲罗斯苏醒的格罗姆圣甲虫秘典可爱黑猫诺克提斯·路西斯·伽拉姆夏日柯基美恐:新的开始

          不同的编辑语言字符串都不同,但是大致都能相通不,我只会python,感觉python比较简单
            收起(4)
          回复

          使用道具 举报

          『户口本: Lv7+』『迷翳之中』冰海钓竿诡异的灵魂石炽天使之拥上古卷轴V:天际杰森‧斯坦森.梅克军徽GHOST碎裂的储蓄罐

            回复

            使用道具 举报

            收到情书烈焰天使弓

              字符串是由字符组成的线性序列,一些高级语言里的字符串对象是不可变的如pythhon,python会将字符串单独认作一个不可变的数据类型。
              但是像c/c++中的字符串是可以变的,c\c++会把字符串看做是由字符数组组成的序列,因此是可变的(也可以自行设置为静态,即不可变)。
              回复

              使用道具 举报

              云上之光御医神兔野兽之子珊瑚色礁石蛋冒险专用绳索琉璃玉坠啊!菊花开了!不洁圣子

                回复

                使用道具 举报

                美恐:新的开始

                  对于门外汉有一种在做阅读理解的感觉 感觉更像是块这个概念吧 可以根据应用需求选择整体调用还是分解开来仔细改动
                  可以理解成字符串在更底层的甚至是机器语言中是字符数组 可以进行字符级的修改以进行内存性能控制
                  但是在并发程序进行字符串共享时修改与引用可能会导致线程安全问题
                  而在高级的编程语言中为了数据不被意外篡改和产生安全漏洞 字符串一般视作不可变的基本数据类型
                  楼主自己设想的字符串视为不可变容器 字符串内单个元素也视为字符串 未访问字符串返回空且未访问字符串是惰性的
                  结合了底层编程语言控制精细化和高级语言的并发安全 但是由于有引用计数和回收会带来额外性能开销 字符串引用过多会造成内存泄漏
                  回复

                  使用道具 举报

                  遗忘之水小丑与格雷与星光璀璨『落樱缤纷』『灰域来音』『眼榴』『钟楼盐水棒冰』『泥潭颂唱者』『逆境中的幸运女神』『南瓜拿铁』杰森‧斯坦森.

                    通俗点讲是模块化内容的不同吗?
                      收起(2)
                    回复

                    使用道具 举报

                    【夏日限定】夏日的泰凯斯業火死鬥史莱姆牧场SCP-s-1889-第五页不朽之恋虚空之海的鲸吃饱金币的Doge无尽的怀表丹雀衔五穗,人间始丰登近地夜航

                      字符串的本质上只是一种编程语言想让机械理解的模因,在这一点上他与字母之间没有任何区别,都是 传达信息的作用,理论上来说如果从零编辑一套足够成熟度的编程体系的话,你甚至能让中文汉字字符取代掉现在的编程体系
                        收起(6)
                      回复

                      使用道具 举报

                      史莱姆蛋享受美食的小伯

                        回复

                        使用道具 举报

                        男巫之歌【夏日限定】夏日的泰凯斯裸体克里斯瓮中能言蛙果体76吸血魔蝠内森·德雷克生金蛋的鹅永远的克叔亚瑟‧摩根

                          回复

                          使用道具 举报

                          森林鹿金牌矿工熔岩鹰不曾寄出的信件格拉迪欧拉斯小丑与格雷与星光璀璨御医神兔月光骑士最终幻想XVI

                            回复

                            使用道具 举报

                            『住在GM村』格拉迪欧拉斯雪王的心脏『星河碎片』『灰域来音』预知水晶球炽天使之拥『伊黎丝的赞词』纯真护剑『随时随地开启!』

                              回复

                              使用道具 举报

                              『召唤好运的角笛』诡案谜集·黑夜之星牌中小丑 · 呼之欲出

                                AncL 发表于 2024-6-20 00:55:19 | 显示全部楼层 |取消关注该作者的回复
                                回复

                                使用道具 举报

                                雄躯的昇格英雄联盟泰比里厄斯杰西·麦克雷萨菲罗斯『星象监测』邪恶圣杯GM論壇榮譽勛章

                                  回复

                                  使用道具 举报

                                  SCP-s-1889-第五页GM論壇榮譽勛章红心玉信仰之心『樱花树灵』小小舞台风物长宜近地夜航

                                    回复

                                    使用道具 举报

                                    赫敏·格兰杰『钟楼盐水棒冰』黄金树的恩惠森林鹿生金蛋的鹅熔岩鹰珊瑚泡泡鱼里昂‧S‧甘乃迪结晶火鹰幼崽炙热的格拉迪欧拉斯

                                      噗,还记得之前开的python课,期末考试我就是直接傻傻背那些代码完全摸瞎,然后就死记硬背
                                      回复

                                      使用道具 举报

                                      不洁圣子龙血指环Futūrum(未来)睡着的小伯九尾妖狐·阿狸阿尔萨斯‧米奈希尔神灯.最终幻想XIV

                                        回复

                                        使用道具 举报

                                        粉猪猪储蓄罐㊖风雪之家史莱姆牧场达拉然诺克提斯·路西斯·伽拉姆小丑与格雷与星光璀璨不洁圣子近地夜航

                                          jdd 发表于 2024-6-26 15:44:30 | 显示全部楼层 |取消关注该作者的回复
                                          想学一门简单实用的编程语言,觉得以后说不定会派上用场,但一直没什么动力
                                          回复

                                          使用道具 举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2024-11-25 09:03 , Processed in 0.122880 second(s), 147 queries , Redis On.

                                          Copyright © 2013-2024 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表