当前位置: 首页 > 科技观察

为什么我从Python转向Crystal语言

时间:2023-03-12 09:02:15 科技观察

我从2011年开始成为Python的用户和爱好者。当时,一个朋友建议我尝试Python而不是Perl,一个全新的世界向我打开了。在一个可读性比什么都重要的世界里,有一条经验法则。即使在使用Python超过7年之后,我对它的热情依然如初。然而,随着岁月的流逝,任何人都应该寻求新的机会和冒险。是时候尝试别的东西了!Python的问题首先,列出我在Python中遇到的一些问题:打包:这是大多数解释型语言都存在问题的领域。打包为包含整个virtualenv的可安装程序,像FPM这样的工具使这变得非常容易,但它仍然缺乏单个二进制文件的优雅。静态类型:就像有些人从开始使用C++到完全爱上它一样,我确实怀念我曾经在C++中拥有的类型安全。这与编译时检查密切相关,它确实帮助我们保证代码的质量,甚至在执行之前。速度:大多数解释性语言的另一个问题。Python对于许多任务来说足够快,但仍然远远落后于编译语言。冗长:我们在Python3.6中只有f-strings,这真的是一种解脱。然而,我们在类和结构中仍然有非常冗长的self语法,到处都是self.var=var,这可能在Python3.7的数据类中得到部分解决。隐式私有类成员:当我说私有时,我的意思是该死的私有!作为一名前C++程序员,我发现Python的私有属性和方法的下划线前缀格式有点……变态?:')此外,我不确定我是否真的喜欢Python在几个领域的发展方向,尤其是异步和类型。协程:尽管它们很受欢迎,但Python中的新异步方法感觉非常不友好且难以掌握。现有代码在成为非阻塞之前也需要做大量的工作。我认为随着越来越多的库可用以及我开始了解和使用新库,这会有所改善。类型注释(和mypy):老实说,类型注释很流行……如果它们真的在CPython中做任何事情。如果没有主要CPython发行版的主流支持,为各种结构(如数据类)使用类型注释的想法似乎毫无意义。同时,mypy还不是主流,但从长远来看显示出作为Python类型检查器的巨大潜力,尤其是在启用--strict标志时。我应该声明,我仍然是Python的忠实粉丝和支持者,并且认为它仍然是目前最好的解释型语言之一;特别是当你考虑到它惊人的生态系统和成熟度时。我正在寻找的起点是Python和Ruby。我经常在需要的地方使用Ruby,并且非常喜欢它。Ruby解决了Python存在的几个问题(适当的私有/受保护属性、不那么冗长的语法等),但仍然存在性能问题并且缺乏静态类型。所以我开始寻找具有以下特点的新语言:语法类似于Python和Ruby单一二进制分布编译、静态类型和快速面向对象(ohclass,我多么爱你...)候选人以下语言是Go不碍事:没有关键字参数,没有异常,没有类,没有泛型,以及让我拒绝Go的可怕的命名风格(尽管也许这种简单性吸引了很多人)。实际上,我已经花了很长时间在Go中学习和编码,我发现这是最令人沮丧的。在C之后,像C++这样的语言进步了很多,给了我们更多的灵活性,但感觉Go正在把我们带回到C的时代。Elixir:一门令人着迷的函数式语言,但是缺乏面向对象的特性,并且单个二进制分布不是这种语言的目标这一事实对我的用例来说有点令人失望。然而,我们团队中的许多人都使用Elixir作为所有新项目的主要语言,并且发现它非常好用。Elixir有着丰富而坚实的传统,如果你想要一门函数式语言,你绝对应该考虑它。Rust:这是一种有趣的语言,我花了一些时间尝试学习。真的,我只是认为Rust不适合我的用例。这是一种相当复杂的语言,我和很多其他人似乎都不喜欢它。Julia:这种语言真正针对的是科学计算,而不是我的用例。它还缺乏我想要的面向对象的能力。Pony:一种非常有吸引力的语言,似乎从Python中借鉴了很多,但也借鉴了一些我不喜欢的东西(例如强调前缀变量,缺乏对称性等)。我总觉得Pony不同意我的看法,它没有其他语言那样的吸引力,这使得它现在相当原始。我真正感兴趣并希望在未来进一步研究的语言是:Nim:Nim是我最初计划引领潮流的下一个语言,我希望在未来。Swift:除了开发iOS和Mac应用程序之外,另一种流行的面向对象语言绝对值得关注。但是,最后,我决定致力于学习Crystal!原因如下:Crystal很快就会习惯,因为它大部分遵循Ruby的语法。它编译成一个快速的、单一的可执行文件。整个标准库都是用Crystal编写的。需要时可以轻松阅读它提供了类似于Ruby的完全面向对象的方法(包括真正的受保护和私有成员)Crystal使用静态类型,但也提供联合(定义可以具有多种类型变量的对象的能力)它提供开发类似Ruby的DSL的能力(这是我一直感兴趣的)C库的绑定是完全原生的,并且是用Crystal编写的(类似于Python中的ctypes,只是更好)注释Crystal是一种非常年轻的语言,仍然还没有发布1.0版本。它通常会在版本中引入重大更改并限制库。但是,我打算只将这门语言用于我的个人项目,并且愿意成为早期采用者,因为我觉得这门语言有足够的潜力值得使用。EmpiricalStandardLibrary整个标准库非常容易阅读,我一直在参考它。该库似乎也有些广泛,是一个很好的基础教程。下面是一个添加数组的例子:下面是获取文件扩展名的函数:这是非常有价值和有用的。绑定到C库这真是太神奇了!下面是一个绑定从Unix系统获取用户信息的各种函数的示例:异常处理Puby和Python提供了类似的异常处理:编写自己的异常很容易;只需要集成Exception类。导入系统和命名空间这是Python的一些调整,但让我回到了C++时代,因为Ruby遵循类似C++的方法。等效于C++名称空间的是您可以自定义Ruby/Crystal模块。要求任何库都将导入它定义的所有项目,因此确保将整个库包含在一个模块中以避免名称空间污染始终是安全的。起初我有点担心,但我发现它可以很容易地从任意数量的文件构建一个模块。但是,我不得不承认,寻找事物的来源更具挑战性。