哥谈的是语言,不是寂寞

经常看到一些文章在谈论语言,例如“哪个语言更有前途”,“语言选择是否关键”。我是个语言粉丝,但是看到这些文章总有一些奇怪的感觉。因为在我看来,这些文章谈的东西都不是我眼中的语言——可能与国内技术环境有关,语言本身被淡化了,例如,谈语言的时候涉及更多的却是“平台”方面的内容(例如冯老大的《编程语言的选择并非无关紧要》)。那么我现在便来描述一下我眼中的“语言”该如何谈论吧——下次在我猛砍Java语言时也好有个参考。

语言

语言是给人看的,人们设计出各种各样的语言,最终会通过某些工具变成机器可以执行的形式。人们设计出语言,是为了进行大规模的程序开发,否则使用机器码来0110着写,估计只有神仙才能写出如今动辄数十万数百万行高级语言的项目来——即便是“高手”也得用汇编哪。但可惜的是,如果仅仅使用汇编,估计程序员的思维永远无法跳出“子过程”这个抽象级别,什么面向对象设计,函数式编程几乎无从谈起。人们在学习和生产过程中会引发一些需求,因而需要产生一些工具来辅助学习和生产,而“语言”便是此类工具之一。只有利用高级语言,人们才能有效地把真实世界抽象成计算机这些机器盒子能认识的东西。

显然,不同的语言适合不同的领域——尤其是那些所谓的“领域特定语言(Domain Specific Language)”,因为在不同领域中所需要的思考方式可能会不一样,对于语言来说就有特定的抽象方式与之应对。不过,对于广大程序员来说接触到的更多的应该是“通用目的语言(General Purpose Language)”,例如C,C++,Java,C#,Ruby,Python,F#……它们都是通用目的语言。对于这些语言来说,它们是为了解决广泛问题而存在的。当然,由于通用目的语言的语言特性不同,它们也是有一定“倾向性”的。例如,F#的Workflow特性尤其适合异步编程,而函数式编程语言可能更适合科学计算或金融方面的应用,因为它们和那些问题(业务)的思维方式比较接近——假如使用Java这样的面向对象语言来说可能就要使用一些奇怪的模式了。

因为语言是用来解决问题的,因此在谈论语言的时候,其实我们主要还应该把关注点放在语言抽象或描述事物(包括“思维”等等)的能力上面,以及用它们解决问题的时候是否方便,是否“舒适”——这可能有“感觉”的因素在里面,但的确也有一些客观的,可以衡量的标准在里面。例如《Concepts of Programming Languages》一书中就提出了以下一些标准:

  • 可读性:读代码的次数比写代码要多得多,可读性自然是非常重要的评判标准。例如Perl语言就比Python要难读的多,可谓是一种著名的Write Only语言。
  • 可写性:例如,使用Fortran 77这种不支持指针和动态内存管理的语言中,实现一个二叉树结构会很困难。还有,虽然使用while可以实现任何循环需求,但是没有for语句的语言写起来便会麻烦不少。此外,表达同样的逻辑,代码是否紧凑?如C#或Java等需要相当“架子代码”的语言,同样实现面向对象编程就不如F#或Scala来的紧凑。
  • 可靠性:语言特性是否易于写出正确可靠的代码,如异常处理,静态/动态类型,强/弱类型都是和可靠性有关的特性。此外,一些脚本语言,如PHP或JavaScript中经常被人诟病可靠性不佳,便是由于一些操作(如相等或相加操作)过于“宽容”,容易出错。
  • 代价:例如,语言规则是否太多?是否自然?学习起来是否容易?

通俗来讲,我们考察语言,关注点应该放在它的“语言特性”上。语言特性哪里来?自然是语言制定时定下的,例如Java和C#都有其规约(Specification),其中定制了关于语言的方方面面。但是如Ruby和Python,它们都只有各自的“参考实现”(CPython及MRI),并没有明确的规约文档——有人认为这是个比较重要的问题,因此如Ruby社区便开展了RubySpec项目希望定制一个严格的Ruby语言规约。

我认为,语言规约(再扩大一点,也仅仅包括其标准库)是讨论语言,比较语言的唯一依据——这也是我在谈论语言(如讨论Java语言之低劣)的思考准则。

平台

当然,语言设计的最终目的是让计算机进行计算,因此我们不可能回避其他方面,仅仅谈论语言规约。我这里把除了语言规约外语言实现的其他方面统称为“平台”。因此,这个平台其实包括多种东西,例如:

  • 将程序文本转化为二进制形式的:编译器(包括解释器,Linker等等)。打个比方,主流C++编译器有VC++,GCC;C#编译器也有微软实现的CSC及Mono上的MCS。同样的源文件交由不同的编译器,得到的结果会有不同,而最终也会影响程序性能等因素。但是,我们可以简单认为,这些编译器最终生成的结果是符合一个统一标准的,也就是说它们得到的结果可以用相同的规则来识别与执行。
  • 运行时也是平台的重要组成部分。例如,使用微软的CSC编译出的程序集可以在微软的CLR或Mono提供的运行时上执行,同样Sun的Java编译器生成的Byte Code也可以在Sun和IBM两种JVM上运行。由于运行时实现不同,所涉及的标准库也有不同,其程序执行的性能和稳定性都会有所区别。
  • 在不同的执行环境下,可以利用的周边事务是不同的。例如,IronPython便非常容易和.NET程序进行互操作,而JRuby便可以利用Java平台上的各类框架。而一个C语言程序本身也是一个合法的Objective-C程序,但是在Mac OS X上编写Cocoa程序利用的也是不同的环境(不确定,求证)。
  • 技术以外的方面,如社区活跃度等等。

当然,上面举的编译器和运行时都是最为典型的例子。事实上,很多平台并没有如此明显的划分,它们的编译器和运行时都是一体的。例如Python语言的实现有传统的CPython,.NET平台上的IronPython,Java平台上的Jython,以及追求比CPython更高性能与灵活性的PyPy。此外,JavaScript语言除了在各浏览器引擎中不同的原生实现外,现在又有了神奇的Node.js,可以在服务器端使用JavaScript编写高性能的服务器端程序。

当我们谈论到一门语言“能做什么”,“性能如何”时,往往就是在讨论的就不(仅仅)是语言,而是平台了。语言里的概念和平台实现并非完全相关,例如在Scala语言中,1 + 2并不是一个表达式,它其实表示的是1.+(2),也就是一个整型对象上的“加”方法的调用。但是在编译器的实现上,出于性能考虑就会尽量将其编译成原生的整数加法操作。当然,语言中的很多部分也在真切地影响其平台相关的部分,例如C语言的目标是系统语言,因此便尽可能的接近计算机体系结构,没有高级的语言特性,要把很多细节都交由程序员去控制。而如C#或Java这样的语言,从语言特性上就注定了其执行环境需要GC能力,这样对于一些空间密集型的场景可能就比不上如C语言般精细控制所带来的性能;同样,C/C++这样的语言可能并不适合高性能计算,因为它的语言设计注定了会遇上“别名检测(alias detection)”方面的问题,于是编译器便无法像一些无副作用的函数式编程语言那样进行自动并行,或者生成充分利用系统缓存的高性能指令。

吵架

以上,我承认语言与其平台其实有着密切联系,但是在很多情况下我们可以忽略平台而仅仅谈论语言。

例如,因为CLR和JVM的性能和可靠性是相同的(您有不同意见?嘿嘿,这里不讨论这个),所以我们便可以比较C#与Java(甚至F#与Scala);因为Rails和Django的能力不分上下,因此我们可以比较Ruby和Python语言在业务逻辑实现方面的优劣;因为它们都在JVM上执行,因此我们便可以引发Java,Scala,JRuby,Jython,Jaskell,Groovy及Clojure的混战。由于我们“求同”,那么“存异”也就有了意义,因为此时语言也是进行技术选型的重要方面了。

语言引发的争吵不计其数,这点有目共睹。我写这篇文章的目的也是希望可以减少这方面的无谓争论。例如我在猛砍Java时,有朋友会回应到:

  • 做项目不能只考虑语言——没错,这并不影响我说Java语言差,我也不想以此让您来用.NET。
  • JVM成熟——没错,但这并不代表Java语言就好了,您可以用Scala,Clojure等语言。
  • 语言不重要,谈语言层次太低了——呃,吵不过您,我妈叫我回家吃饭,吃好饭我就洗洗睡了。
  • ……

其实有时候,我也只是想单纯讨论一下语言罢了——哥谈的是语言,不是寂寞。

【UG/NX二次开发】记录在二次开发中遇到的坑 阅读详情

相关推荐

当AI学会自我验证:Chain-of-Verification如何杜绝错误决策?

2025年,大模型"幻觉"问题已成为企业落地AI的最大障碍之一——金融风控中1.2%的误判率可能导致千万级损失,医疗诊断中3%的错误可能危及生命,法律文书中5%的事实偏差可能引发合规风险。MetaAI与Google联合提出的**Chain-of-Verification(CoVe,验证链)**技术,让AI具备"自我审视"能力,通过结构化验证流程将幻觉率降低68%+,在复杂决策场景准确率提升至95%+。本文系统拆解CoVe的技术原理、实施路径与行业实战,为企业提供AI决策可靠性保障的完整方案。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1080

HNUCM2020年春季ACM集训队选拔赛(4)题解

问题 A: 小白鼠 题目描述 N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子。 现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色。 帽子的颜色用“red”,“blue”等字符串来表示。 不同的小白鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。 输入 多案例输入,每个案例的输入第一行为一个整数N,表示小白鼠的数目。 下面有N行,每行是...

名字呢? 1330

AI Agent + 大数据 + RAG:电商用户行为分析的低成本落地

本文探讨了AIAgent与大数据技术在电商用户行为分析中的应用。通过构建"数据采集-实时分析-智能决策"的全自治链路,解决了传统大数据分析的三大痛点:人工建模周期长、实时性不足和决策闭环断裂。系统采用Flink+Spark处理实时数据,结合基于DeepSeek-V3.1的AIAgent实现智能分析,并通过飞书RAG模块动态获取业务知识。落地效果显示,分析响应时间从2-3天缩短至30秒,推荐转化率提升134%,验证了该方案在提升电商数据决策效率方面的显著价值。

想~ai抽 1618

星象仪

2013-09-17 14:20 题目描述 在寂寞的夜里,星象仪是非常浪漫的东西。但是,你作为一个精神稍微有点不太正常的 Geek,把原本正常的星象仪改造得像电报发送器一样。当然,你这个的构造还要更加奇葩 一点。具体来说,你的星象仪是一棵满二叉树,二叉树的节点都是有两个输入端和一个输出 端的AND门或者OR门。它们输入和输出的信号都是只是0 或者1 。它们会接受子节点的 输出信号,然...

weixin_33937913的博客 193

Qualcomm平台下基于QSEE的指纹识别方案移植之四TA移植

本文只介绍TA移植的过程,不做技术分析,关于TA开发另做记录。 一、TA介绍 TA,Trusted application 可信应用,是运行于QSEE中的可执行程序。 指纹TA文件如下,形式一般是 xxx.mbn; xxx.b0 ~ xxx.b6, xxx.flist, xxx.mdt; xxx.mbn 可以理解为其它几个文件的集合,签名的时候用的就是这个文件,签完名之后,有对应的工具将它...

梦路遥 7548

美团外卖 mtgsig 1.2 逆向工程与补环境实战指南

本文深入解析了美团外卖核心风控参数mtgsig 1.2的生成机制与逆向实战。通过拆解其复杂的JSON结构,揭示了设备指纹、环境信息加密等关键字段。重点阐述了在Node.js中模拟浏览器环境(补环境)的核心方法,包括DOM/BOM对象、本地存储及Canvas/WebGL等高级指纹的模拟技巧,为安全研究和合规自动化测试提供了一套完整的技术指南。

uber9的博客 409

想你在寂寞的夜里

想你在寂寞的夜里 夜深了万籁俱寂 总是撩起我的相思万缕 每次独处自问 不知这份情谊是否能维持永恒 时间是否会腐蚀我们的心灵 长久的感情 在时光的增润下 得到一甘露 填补了空虚的心扉 振奋了我沉寂的神经 欢愉时光短暂 唯有留在心底回味 缠绵不断的情丝 深系看我未来的日子 沉醉的颤栗和心悸 就像一条流不尽的爱河 流到回荡不已的记忆里 犹如一场甜蜜的美梦 深深地烙印在脑海里 久久挥之不去 你的身影像彩

u013568834的专栏 668

TPAMI 2025 | 从缺失碎片到杰作:基于上下文自适应扩散的图像修复

图像修复是一项具有挑战性的任务,尤其是要确保生成的内容与图像的现有部分无缝融合。尽管最近的扩散模型展现出了潜力,但它们在保持已知区域和未知(缺失)区域之间的连贯性方面常常遇到困难。这个问题源于扩散过程中缺乏明确的空间和语义对齐,导致生成的内容无法与原始图像平滑融合。此外,扩散模型通常依赖全局学习分布,而非局部特征,这使得生成的图像部分与现有图像部分之间存在不一致。在这项工作中,作者提出了ConFill,这是一个新颖的框架,引入了上下文自适应差异(CAD)模型,以确保在整个扩散过程中,已知区域和未知区域的中间

小白学视觉 239

哥写的不是代码,是寂寞

哥写的不是代码,是寂寞anytao.net | 《你必须知道的.NET》网站 | Anytao技术博客 发布日期:2009.08.17 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处。 为什么我的眼里常含泪水,那不是眼屎没有擦干净,只是因为我的眼神里充满了:寂寞。我是个正宗的80后,虽然在开心的账号常年显示着90后,

孙继滨@程序世界 1152

汽车OTA 测试用例

汽车OTA 测试用例

天赐好车的博客 973

【学前须知】推荐阅读顺序

AUTOSAR学习笔记专栏文章推荐阅读顺序

weixin_47571898的博客 743

哥和寂寞的语录

1、不要迷恋哥,哥只是个传说!2、哥不在江湖,江湖都有哥的传说!3、世上本没有哥,但迷哥的人多了,就开始出现了哥!4、哥不寂寞,因为有寂寞陪着哥。5、不要打哥的电话,哥玩的不是寂寞……是哥的手机丢了!6、哥用微笑保持低调,却不知道微笑也让世界烦恼。7、哥抽的是寂寞,吐出来的是烟。8、哥泡的不是姐,是姐的寂寞。9、哥就是把姐搂在怀里,也不过是两个人的寂寞!10、哥有一艘船,船到哪里,哪里就有海,知道

zhizhunbao的专栏 362

SPICE仿真软件:HSPICE_(20).HSPICE仿真结果的后处理

HSPICE仿真结果的后处理是一个多步骤的过程,包括读取结果文件、可视化、分析和导出。通过使用命令行工具、Python脚本和HSPICE内置工具,可以高效、准确地完成这些任务。Python脚本的灵活性和强大的数据分析能力使其成为后处理的理想选择。自动化处理可以显著提高工作效率,减少人为错误,而高级分析方法可以更深入地理解仿真结果,为电路设计提供有力支持。

kkchenjj的博客 1382

寂寞的香味

作者:晓荷 如果生命的起初注定了要遭遇炼狱之苦,就让我陪着你一起遭遇吧。   如果生命的继续只能是走在一场又一场的幻灭之苦中,也让我陪着你,走下去。                                ——题记   那只是飘落在风雨中的一个梦。   外面的天空被这一季的雨水覆盖着,窗子是朝南的,他站在窗前,看着窗外风雨中飘落的大片大片的落叶。听着雨珠敲打着窗子发出的寂寞的声音。   女孩

自在飞花轻似梦 1469

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

不要迷恋哥,哥只是个传说

不要迷恋哥,哥只是个传说!         哥不在江湖,江湖都有哥的传说!        世上本没有哥,但迷哥的人多了,就开始出现了哥!        哥不寂寞,因为有寂寞陪着哥。        不要打哥的电话,哥玩的不是寂寞……是哥的手机丢了!        哥用微笑保持低调,却不知道微笑也让世界烦恼。        哥抽的是寂寞,吐出来的是烟。        哥

mpp1094412769的专栏 855

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

09年的流行语

      网络作为新型媒体,大有赶超纸媒和视媒的趋势。各种信息通过网络的交互,传播速度的确惊人,网络流行语汇亦是层出不穷,令人应接不暇。继08年冒出“山寨”、“打酱油”、“俯卧撑”、“范跑跑”、“很黄很暴力”、“雷人”等流行词语后,在2009年,新的更有影响力的语汇横空出世。现将其整理为09年的网络流行语,看了后你一定大长见识。    2009网络流行语一:“你妈喊你回家吃饭!”   7月中旬,

fangfang8686的专栏 2168

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

蓝桥杯 算法训练 寂寞的数(c语言版详细注释)

试题 算法训练 寂寞的数                                &...

xyf0209的博客 1973

蓝桥杯 - 算法训练 寂寞的数 C语言实现

算法训练 寂寞的数  题目如下: 问题描述   道德经曰:一生二,二生三,三生万物。   对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。   因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d(d(n)),d(d(d(n))).

zhencan的博客 1366

C语言 · 寂寞的数

算法训练 寂寞的数 时间限制:1.0s 内存限制:256.0MB 问题描述   道德经曰:一生二,二生三,三生万物。  对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。  因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d...

weixin_30549175的博客 169

算法训练 寂寞的数 C/C++

算法训练 寂寞的数 问题描述 德经曰:一生二,二生三,三生万物。 对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。 因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d(d(n)),d(d(d(n)))…例如,从33开始的递增序列为: 33, 39, 51, 5...

weixin_42418736的博客 567

蓝桥杯 算法训练 寂寞的数

试题 算法训练 寂寞的数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述   道德经曰:一生二,二生三,三生万物。   对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。   因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d(d(n)),...

杜晓帅~的博客 516

寂寞沙洲冷c语言程序,周传雄《寂寞沙洲冷》钢琴谱

《寂寞沙洲冷》是由陈信荣作词,周传雄作曲,周传雄演唱的一首歌曲,该曲收录在周传雄于2005年6月29日由环球唱片发行的专辑《星空下的传说》中。2006年,该曲获得“2006香港新城国语力颁奖礼”新城国语力歌曲的奖项。创作背景周传雄在内地时逗留的时间长,去的地方多,便吸收不少中国文化,而宋词是他个人非常喜欢的一种。这首歌曲的创作灵感来自苏轼的《卜算子》,是出其不意搭配而成的即兴花火。一开始原是吉他手...

weixin_32349913的博客 642

东华复试OJ-54 寂寞的数

作者: Turbo时间限制: 1S章节: 基本练习(数组) 问题描述 : 道德经曰:一生二,二生三,三生万物。   对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。   因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d(d(n)),d(d(d(n)))…例如...

weixin_42781960的博客 367

蓝桥 算法训练 寂寞的数

算法训练 寂寞的数   时间限制:1.0s   内存限制:256.0MB 问题描述   道德经曰:一生二,二生三,三生万物。   对于任意正整数n,我们定义d(n)的值为为n加上组成n的各个数字的和。例如,d(23)=23+2+3=28, d(1481)=1481+1+4+8+1=1495。   因此,给定了任意一个n作为起点,你可以构造如下一个递增序列:n,d(n),d(d(n)),d(d...

c_29548的博客 473
上一篇: 软件开发评估过程
下一篇: Javascript中各种trim的实现
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值