J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录

【5G核心网】Packet Forwarding Model 数据包转发模型 CP 通过建立,修改,删除 PFCP 会话上下文,以及通过为每个 PFCP 会话赏析哪问提供 PDR FAR QER URR BAR,来控制 UP 面的数据包处理。 每一个 PDR 都包含 PDI(Packet Detection Information,包探测信息),一个或多个字段,与输入数据包进行匹配,并可能与以下规则相关联,从而提供了适用于与 PDI 匹配的数据包的指令集: - One FAR(包含了处理数据包的相关指令) an Apply Act... 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 原文http://java.sun.com/features/2003/05/bloch_qa.html by Janice J. Heiss May 8, 2003 随着预期Java 2 Platform, Standard Edition 1.5 (J2SE 1.5) beta版本在2003年晚一些时候的发布(众所周知的Tiger项目),开发人员非常关注即将到来的新的变化。没有谁能比Joshua Bloch更适合清晰地解释J2SE 1.5了。他是Sun公司的资深工程师,是Java平台核心工作组的系统架构师。他成功地设计并实现了获奖的Java Collections Framework,java.math包,而且对Java平台的其他部分的设计和实现也做出了卓越的贡献。他发表过无数的论文,并且出版过一本书《Effective Java Programming Language Guide》,这本书获得了软件开发杂志的Jolt奖。他获得了Carnegie-Mellon 大学的计算机博士学位。今天我们跟他交流一下,来看看Java程序设计语言的未来。 正在研发的Tiger项目试图增强J2SE,在不损失兼容性的基础上使Java程序更清晰、更简短、更安全以及更易于使用。您能告诉我们在J2SE平台中Java语言怎么样更容易使用吗? 新语言特性都有一个共同特征:它们都包含一些通用的语法并且提供了语言上的支持。换句话说,它们把编写与语义代码的责任从程序员转移到了编译器上。 因为源代码摆脱了语义相关代码,它更容易读写。同时编译器不是程序员,永远不可能犯错误,所以导致新代码更可能摆脱bug的困扰。 另外,整体的功能大于组成整体的各个部分之和,所有的新特性在设计的时候都是充分考虑其它部分的。它们一起协调作用,显著地提升了语言的表现力和安全性。 您估计,哪一个变化是最难让开发者适应的?还有,开发者需要做什么样的调整? 我希望,所有的新特性都不会让开发者感到难以适应。不过,如果我非要从里面选一个出来的话,那么我觉得是泛型技术。因为开发者必须在声明中提供一些额外的信息,而不是仅仅说: List words = new ArrayList(); 你必须这样写: List words = new ArrayList(); 这样做的好处就是如果你想插入一个其他什么对象而不是String的话,在编译的时候你就可以发现并修正你的错误。如果不使用泛型技术的话,只有当你们的客户向你们抱怨他们所依赖的软件Down掉了,原因是一个什么类型转化异常(ClassCastException)的时候,你才可能发现你程序中的这个bug。 这样做的另外一个好处就是当你从集合(Collection)中取出一个元素的时候不用作强制类型转转。本来,你会这样写: String title = ((String) words.get(i)).toUppercase(); 现在很简单: String title = words.get(i).toUppercase(); Java 2 Platform, Standard Edition 1.5 (J2SE 1.5) beta版本将在2003年晚一些时候的发布,这些变化也都通过了JCP的审核。两个问题:如何确保当前的构想会反映到最终的改变?开发者怎样参与到这种改变的过程? 相关JSRs (14, 201, 和175)的专家组将会推敲当前的草案,但是我确信大体的轮廓在最终的版本中不会改变太多。当然,最终还是要专家组说了算。 开发者参与的最好的途径就是阅读最新的草案,并把意见和建议发给相关的专家组。最新的泛型草案可以在下面的地址中找到: http://jcp.org/aboutJava/communityprocess/review/jsr014/. 你也可以下载一个预览版的编译器,尝试理解泛型技术: http://developer.java.sun.com/developer/earlyAccess/adding_generics/. 其他方面建议的早期草案在这里: http://www.jcp.org/en/jsr/detail?id=201。 请注意3.1节,大约在这一页的底部。 当前还没有关于JSR-175 (metadata)元数据的草案,不过很快就会有了。开发的进一步信息请在这里找: http://www.jcp.org/en/jsr/detail?id=175 您能把这六个方面的改进概括一下吗? 那好,我做一个简述: 泛型Generic – 提供了collection操作的编译期类型安全,并且避免了类型转换的苦差事。 For循环增强Enhanced for loop – 避免使用容易引起错误的迭代器. 自动置入/自动取出Autoboxing/unboxing – 避免了在基本类型(如int)和包装类型(如Integer)之间人工转换类型的苦差事。 类型安全的枚举Typesafe enums – 提供了类型安全的枚举模式((Effective Java, Item 21))的好处,却没有冗长和易错的代码。 静态导入Static import – 让你可以避免使用类的静态变量而必须前缀类名;而且避免了常数接口的缺点(Effective Java, Item 17)。 元数据 – 让你避免写样本代码。你在程序中做标记然后工具自动帮你生成样本代码。这会导致一种声明式的程序设计方格,你说应该做什么,然后工具就会产生代码完成这个任务。 如果遵循新规范并且开始使用泛型,那么现在使用集合的方式和使用带泛型的集合有什么不同之处? 我们一般这样使用集合: /** * 在由String构成的集合中删除所有长度为4的元素 * 传入的集合必须由String构成 */ static void expurgate(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) { String s = (String) i.next(); if(s.length() == 4) i.remove(); } } 这个类型转换并不完美,而且更重要的是程序可能会在运行时发生错误。假设用户不小心传入一个由StringBuffer构成的集合而不是注释中说明的String,那么就可能会有意外发生。注释说客户端必须传入一个由String构成的集合,但是并不能要求编译器编译时一定满足注释。 下面是同样的代码使用泛型的例子 : /** *在由String构成的集合中删除所有长度为4的元素 */ static void expurgate(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) if (i.next().length() == 4) i.remove(); } 现在从代码的签名就可以看出,输入参数必须是仅仅由String构成的集合。如果客户试图传入一个由StringBuffer构成的集合,程序就不会通过编译。而且请注意我们上面的代码中并没有类型转换。它只有短短的一行,而且阅读使用泛型集合的代码也会非常清晰。 请您给我们介绍一下 "for增强"? 我们可以使用更优雅的方法遍历一个集合。你一般遍历集合的时候,都只是取元素,很少用到其他的方法。"for增强"可以让编译器代替你管理你的迭代器。例如,这是一个使用迭代器遍历一个由TimeTask构成的集合: void cancelAll(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ) { TimerTask tt = (TimerTask) i.next(); tt.cancel(); } } 现在我们用"for增强"重写一下这个方法: void cancelAll(Collection c) { for (Object o : c) ((TimerTask)o).close(); } 当你读这个语句的时候,其中的分号读作“在其中”。如果我们使用两个新关键字foreach和in将会更加自然,不过引入新关键字会比较麻烦。比如如果我们现有的代码中如果正好使用这两个字作为标志符的话,那么新的编译系统就会破坏我们的原有代码。我们的方法是在保留兼容性的基础扩充语言。 您能把泛型和"for增强"结合在一起吗? 当然没问题。你看,我们把泛型技术融入到上面的代码中: void cancelAll(Collection c) { for (TimerTask task : c) task.cancel(); } 我觉得这是更优雅的代码。现在代码可以准确地表明他要做什么,而且提供了编译期类型安全的保证。 请给我们讲讲自动置入(autoboxing)。 大家都知道,Java语言有两种类型的变量:一种是基本类型,一种是对象的索引类型(object references)。基本类型的变量不能置入到集合中,所以如果你想把基本变量存入集合或从集合中取出的话,你不得不在基本类型(如int)和对应的包装类(如Integer)之间转来转去。每个这样做的人都会觉得这不是好的做法。 比如,我们考虑一个程序它用来统计输入命令行中的词的频率。我们使用一个Map,它的关键字是输入的词,值是这个词在命令行中出现的次数: public class Freq { private static final Integer ONE = new Integer(1); public static void main(String args[]) { // Maps word (String) to frequency (Integer) Map m = new TreeMap(); for (int i=0; i m = new TreeMap(); for (String word : args) m.put(word, m.get(word) 1); System.out.println(m); } } 是不是好多了? 有一点值得注意:程序假设当你自动取出null的时候,你会得到0。是否是这种情况还是一个问题。另外一个可选择的就是抛出一个NullPointerException 异常。这两种选择都有其各自的优势。“自动取出null得到0”可以美化像上面这样的程序,但是它也可能隐蔽了真正的错误。如果谁有强烈的意见或者有能令人信服的关于这个问题更好的解决方案,请与JSR-201专家组联系。 新的“类型安全的枚举”(typesafe enums)比用整数枚举(int enum)有什么优势? 这个问题在我的书第21项中有详细的论述。简要地说: 它提供了编译期类型安全,而整数枚举根本没有提供任何类型安全。 它们对被枚举的类型提供了一个适当的命名空间――在整数枚举中你必须前置一个常数来得到命名空间。 它更强大――整数枚举被编译进了程序,如果你增加、删除或者重置了常数的顺序你必须重新编译你的程序。 输出的值是包含各种信息的――如果你打印一个整数枚举,你只会得到一个数字。 它们是对象,你可以把他们放入集合中。 它们本质上是类,所以你能增加任意的属性和方法。 哇,这么厉害!那么新的类型安全的枚举语言特性和你书中类型安全的模式有什么关系? 这个特性是对类型安全模式的首次语言上的简单支持。那些有差不多半页、冗长的、易错的支持模式的代码现在看起来很像C/C 中枚举的声明: enum Season { winter, spring, summer, fall } 不过它用起来却跟C/C 中的枚举大相径庭,你可以使用我们刚才讨论的所有的强大的功能。它甚至修正了类型安全模式的主要的缺点:你可以把这个新的语言特性和Switch语句用在一起。 你能给我们举例说明一下类型安全的枚举的强大功能吗? 当然可以。下面的这个枚举代表了一个美国硬币: public enum Coin { penny(1), nickel(5), dime(10), quarter(25); Coin(int value) { this.value = value; } private final int value; public int value() { return value; } } 看看,这个常数声明怎样调用了一个构造函数,输入一个整数代表分?还有,这个值怎样存放在一个带有公共访问方法的私有变量里面?这个就可以勾画出你能做的事情的轮廓。 您能给我一个类使用您上面定义的enum吗? 我正准备要说到这个。下面是一个小的例子,它用来输出分币表中各个分币的值和颜色。 public class CoinTest { public static void main(String[] args) { for (Coin c : Coin.VALUES) System.out.println(c ": " c.value() "¢ " color(c)); } private enum CoinColor { copper, nickel, silver } private static CoinColor color(Coin c) { switch(c) { case Coin.penny: return CoinColor.copper; case Coin.nickel: return CoinColor.nickel; case Coin.dime: case Coin.quarter: return CoinColor.silver; default: throw new AssertionError("Unknown coin: " c); } } } 看看我们如何声明另外一个关于颜色的枚举?一个叫做nickeld的硬币和一个叫做nickel的颜色根本不会引起什么冲突,因为硬币和颜色都有它们自己的命名空间。同时你可以看到我们可以把枚举常数和Switch语句用在一起。当你希望给一个枚举类增加一个方法而不想修改你的应用程序的时候,这个性质非常有用。 看起来真的很好。您乐意跟我们介绍一下静态导入(static import)会给开发者带来什么吗? 它让程序员不必在使用类的静态成员时前缀类名。人们确实希望这样,所以他们经常实现所谓的常数接口来达到这个效果: // "Constant Interface" antipattern - do not use! public interface Physics { public static final double AVOGADROS_NUMBER = 6.02214199e23; public static final double BOLTZMANN_CONSTANT = 1.3806503e-23; public static final double ELECTRON_MASS = 9.10938188e-31; } public class Guacamole implements Physics { public static void main(String[] args) { double moles = ...; double molecules = AVOGADROS_NUMBER * moles; ... } } 这是一个非常糟糕的做法:接口是用来定义类型的,不是用来定义常量的。Guacamole 使用Physics常数仅仅是一个实现细节,不应该对外开放公共的API。这样做的结果不仅让这个类的使用者糊涂,而且它还做了长期的承诺。即使你准备重写Guacamole 这个类,其中不再用到这些常数,你依然必须implements这个接口。因为这个类的使用者依赖于你的类implements Physics这个事实。 静态导入(static import)提供了一个清晰的解决方案。它让程序员使用某个类的静态成员而不用成为它的子类的方法。它和package import的功能很相似,不过他只是导入一个类的静态成员,而package import则是从包中导入一个类。下面是一个例子: import static org.iso.Physics.*; class Guacamole { public static void main(String[] args) { double molecules = AVOGADROS_NUMBER * moles; ... } } 注意,无论Physics是一个接口还是一个类,这个程序都可以正常地工作。如果它只是定义常数,那么它就应该定义为一个类而不是一个接口。 我懂了。现在您能告诉我关于元数据(metadata)的一些便利吗? 这与我们讨论的其它的一些特性不太相同。它同样也可以让开发变得更容易,不过需要工具开发商的支持。 现在许多API需要相当数量的样板文件。比如,当你定义一个JAX-RPC Web Service的时候 ,你要提供一个接口和一个实现类: public interface CoffeeOrderIF extends java.rmi.Remote { public Coffee [] getPriceList() throws java.rmi.RemoteException; public String orderCoffee(String name, int quantity) throws java.rmi.RemoteException; } public class CoffeeOrderImpl implements CoffeeOrderIF { public Coffee [] getPriceList() { ... } public String orderCoffee(String name, int quantity) { ... } } 这个例子是直接从我们Web Services Tutorial里面拷贝的。 如果有元数据功能的话,你就不必要手工写所有的这些东西。你只要标记代码让工具知道那些代码是可以远程访问的,工具就会自动生成上面的代码。下面是一个有元数据功能支持的代码的例子: import javax.xml.rpc.*; public class CoffeeOrder { @Remote public Coffee [] getPriceList() { ... } @Remote public String orderCoffee(String name, int quantity) { ... } } 所有的样本文件都没有了! 嗯,确实简洁多了。但是您不可能定义所有有用的性质并且构造所有的工具,不是吗? 对,JSR-175只是提供了一个框架给其他的开发者,让他们可以定义性质和构造工具。其他一些JSR诸如JSR-181定义了Web Services 的元数据,是定义属性的。我们期望这个领域有更多的发展。 向前看,您期望未来的Java语言会有什么新的改变? 这个不好说。我现在所有的精力都花在Tiger上面了,没有时间考虑下一个变化是什么。 您还想留给我们一些其他什么信息吗? 其他最重要的就是,Tiger 是一个以开发者为中心的版本。当James Gosling 和他的团队引入Java语言之后,Java的发展速度就像是一个起飞的火箭一样,原因就在于它触动了开发者的心灵,点燃了他们的热情。这个版本的开发依然是基于这个思想。 我很幸运能有机会最早接触这些语言的新特性,发现用它们工作是一种乐趣。我敢确信其他开发者也会这样。在现有的各种开发语言中,Java本来就是一个非常好用而且富有生产力的语言,而所有的即将到来的新特性又会大大地增强使用它的乐趣,提高使用它进行开发的生产力。
YOLO26升级:CVPR2026 WDAM小波方向注意力+C2PSA,频域高频引导低频暗区复原,小目标检测精度跃升! 将 WDAM 引入 YOLO 的 C2PSA 模块,核心优势在于用极低的计算开销,为模型装上了一个“结构感知”的增强器,尤其适合处理密集小目标与边缘部署场景。 阅读详情

相关推荐

告别模糊与偏色:使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战心得

本文详细介绍了如何使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战经验。从调试环境搭建到3A算法优化,再到画质增强模块的深度调参,提供了全面的技术指导和参数建议,帮助工程师解决噪声、色偏和细节模糊等常见问题,显著提升成像质量。

weixin_28729205的博客 455

Java教父Joshua Bloch访谈

Sun公司网站登出了2007 JavaOne大会期间对Joshua Bloch的访谈——摇滚巨星Josh Bloch。 Bloch现任Google 首席Java架构师,而在此之前,他是Sun公司的杰出工程师,领导了大量Java平台特性的设计和实现,包括Java SE 5.0版本和广受赞誉的Java Collections API。

书 人 事 5463

TI IWR 6843 ISK 毫米波雷达开箱测试

TI IWR6843 ISK毫米波雷达上手体验,教程十分详细,对于新手很友好。

qq_57061492的博客 4037

采访Java Collection的作者Joshua Bloch

想必用Java的人都用过JDK的容器类吧,什么List, Set, Map啦。每天这些代码在全世界成千上万的JVM里面运行,每天数以万记的程序员在使用这些类。你知道这些这么cool的代码是谁写的吗?是Joshua Bloch。他以前是在Sun工作,现在跳到Google了,Google是无敌了。他可是大师级别的人物了。虽说他是大师但是人家也在写代码,所以这样的人的文章必定是脚踏实地。而非有些只会动嘴皮子,开会的时候在白板上画出一堆框框线线然后让别人来coding的“专家”。虽然自己写了多年Java也设计了不少

卢声远 Shengyuan Lu的专栏 3858

CloudCompare横截面工具实战:从点云切片到轮廓提取的完整流程

本文详细介绍了CloudCompare软件中Cross Section工具的核心功能与实战流程。从交互式裁剪框的精准操控,到包络线提取的参数设置与优化,再到内部轮廓提取及批量处理技巧,完整解析了如何从三维点云中高效提取建筑立面、隧道断面等关键轮廓信息,是点云数据处理与分析的实用指南。

weixin_29290963的博客 286

从模型车到真实路口:基于YOLOv5-Lite与SORT的轻量化车流量检测系统实战

本文详细阐述了如何将基于YOLOv5-Lite与SORT的轻量化车流量检测系统从毕业设计原型部署到真实路口。文章聚焦于解决在嵌入式平台(如树莓派)上实现实时、稳定检测的工程挑战,涵盖数据采集、模型微调、系统集成及动态信号灯策略,为智能交通灯系统提供了实用的轻量化解决方案。

weixin_29179311的博客 126

Joshua Bloch访谈:选择编程语言就像选择酒吧

<br />■ 文 / Peter Seibel 译 / 郝培强<br /><br />本文是Commmon Lisp专家Peter Seibel对Google公司首席Java架构师Joshua Bloch的访谈,谈到程序员应该看什么书、如何能快速熟悉一种新语言以及为什么说选择编程语言就像选择酒吧。<br /><br />Seibel:你是怎么开始编程的?<br /><br />Bloch:我想这是受益于我的家庭影响。我父亲是Brookhaven国家实验室的化学家。当我上小学四年级的时候,他参加了一个程序设

qilihechuncai的专栏 1034

推荐系统(1):推荐系统评测

对于可以离线优化的指标,我个人的看法是应该在给定覆盖率、多样性、新颖性等限制条件下,尽量优化预测准确度。用一个数学公式表达,离线实验的优化目标是:最大化预测准确度使得 覆盖率 > A多样性 > B新颖性 > C其中,A、B、C的取值应该视不同的应用而定。

数据不会骗人 2527

J2SE1.5便于开发的新语言特性: Joshua Bloch的访谈录(1)

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录原文http://java.sun.com/features/2003/05/bloch_qa.htmlby Janice J. HeissMay 8, 2003随着预期Java 2 Platform, Standard Edition 1.5 (J2SE 1.5) beta版本在2003年晚一些时候的发布(众所周知的Ti

liuflei3139的专栏 1379

注意力机制模块:注意力机制新宠:EMA 注意力(高效多尺度注意力),即插即用,涨点明显

无降维成为共识:越来越多的研究者意识到,传统注意力机制的通道降维操作会造成不可逆的信息损失。EMA 提出的“保留每个通道信息”理念正在成为新一代注意力模块的设计标准。分组并行走向成熟:特征分组 + 并行处理的设计范式已在多个前沿架构中得到验证,兼顾了表达能力和计算效率。多尺度与跨空间融合:单纯的多尺度或单纯的跨空间交互都已无法满足复杂任务需求,两者的深度融合是当前的主流方向。边缘部署导向:2026 年的新论文越来越关注在资源受限设备上的高效运行,轻量化设计成为评估注意力模块的重要指标。

ZXSXJ的博客 952

电商数据采集实战——多平台价格监控、比价分析与智能告警系统

在电商竞争日益激烈的今天,价格监控与比价分析已成为品牌商、渠道商和消费者的核心需求。对于品牌商而言,需要监控各渠道售价是否低于指导价(破价监控);对于消费者而言,希望在最佳时机以最低价购入心仪商品;对于数据分析师而言,价格波动数据是洞察市场趋势的金矿。然而,电商数据采集面临三大核心挑战:本文将基于 Python + Scrapy + Playwright + Redis + ClickHouse 技术栈,构建一套完整的电商价格监控与比价系统。架构分层说明:电商平台的反爬手段层出不穷,采集系统必须具备多层次的

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 136

J2SE1.5便于开发的新语言特性: Joshua Bloch的访谈录(2)

您能把这六个方面的改进概括一下吗?  那好,我做一个简述: 泛型Generic – 提供了collection操作的编译期类型安全,并且避免了类型转换的苦差事。For循环增强Enhanced for loop – 避免使用容易引起错误的迭代器.自动置入/自动取出Autoboxing/unboxing – 避免了在基本类型(如int)和包装类型(如Integer)之间人工转换

liuflei3139的专栏 1148

告别 Python!C# 直接跑 YOLO 目标检测:工控机边缘推理终极方案

set;set;set;set;set;stringget;set;get;set;get;set;get;set;get;set;告别 Python 依赖,不是排斥 Python 的训练能力,而是为了工程化的极致。在工控机这个资源受限、稳定性要求极高的战场上,是目前最优雅、最高效的解决方案。更少的依赖= 更少的故障点。更快的速度= 更高的产线节拍。更简单的部署= 更低的人力成本。现在,拿起你的 C# 项目,导入那个.onnx。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 423

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(4)

新的“类型安全的枚举”(typesafe enums)比用整数枚举(int enum)有什么优势? 这个问题在我的书第21项中有详细的论述。简要地说: 它提供了编译期类型安全,而整数枚举根本没有提供任何类型安全。 它们对被枚举的类型提供了一个适当的命名空间――在整数枚举中你必须前置一个常数来得到命名空间。 它更强大――整数枚举被编译进了程序,如果你增加、删除或者重置了常数的

liuflei3139的专栏 1315

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(3)

您能把泛型和"for增强"结合在一起吗?  当然没问题。你看,我们把泛型技术融入到上面的代码中:  void cancelAll(Collection c) {    for (TimerTask task : c)        task.cancel();} 我觉得这是更优雅的代码。现在代码可以准确地表明他要做什么,而且提供了编译期类型安全的保证。 

liuflei3139的专栏 1143

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(5)(完)

看起来真的很好。您乐意跟我们介绍一下静态导入(static import)会给开发者带来什么吗?  它让程序员不必在使用类的静态成员时前缀类名。人们确实希望这样,所以他们经常实现所谓的常数接口来达到这个效果:  // "Constant Interface" antipattern - do not use!public interface Physics {  publi

liuflei3139的专栏 1176

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

STM32嵌入式C++调试实战:用GDB穿透抽象直击硬件真相

嵌入式开发中,C++在资源受限的MCU(如STM32)上并非简单移植,而是需重新理解其与硬件约束的耦合关系。C++的类封装、模板、RAII等特性虽能提升代码可维护性,但虚函数表、动态内存、RTTI等隐含开销极易引发HardFault、时序偏差或内存覆盖等‘幽灵问题’。GDB在此扮演关键角色——它不仅是断点调试工具,更是验证C++抽象是否真实映射到寄存器行为、内存布局和执行流的‘硬件X光机’。通过寄存器快照、内存契约检查、汇编级时序审计等方法,开发者可系统识别C++惯性思维与裸机现实的错配点。本文聚焦STM3

ciya3282的博客 201

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(3) (转)

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(3) (转)[@more@]XML:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /&g...

ciya3282的博客 167

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(4) (转)

J2SE1.5便于开发的新语言特性:Joshua Bloch的访谈录(4) (转)[@more@]XML:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /&g...

ciya3282的博客 166

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 295

信创环境下PageOffice文档控件适配与实践

信创适配做到文档控件这一层,拼的已经不是"有没有国产版本",而是同一个功能在两类终端上是否真的等价。等价的标准很具体:同一次点击能得到同样的结果,同一份公文能得到同样的版式,同一个项目不需要维护两套代码。这背后是三件并不轻松的工作:服务端用一套接口同时支撑两类终端,客户端把两种系统与四种芯片的安装包分发清楚,文档内核层由产品侧跟着 WPS 的版本走。浏览器这一层的压力,则被收进了产品自己的窗口里——升级节奏由产品掌握,不再交给运气。

zi_wu_xian的专栏 326

第三篇 第 6 课

前置:第三篇第 1 课(stdx 引入),第二篇第 1 课(std.regex)。环境:仓颉 SDK 1.2.0。本文所有代码与输出均逐行实测。

weixin_41618057的博客 514

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 351

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 532

Java 集合容器高频面试题全解:HashMap 树化阈值、1.7 死循环与 ConcurrentHashMap 演进(2026 招聘 JD 真题复盘)

HashMap 树化阈值 8 的泊松分布依据、退化阈值 6 的防抖设计、JDK 1.7 头插成环死循环的排查与修复、1.8 尾插后为何仍线程不安全、ConcurrentHashMap 放弃分段锁的原因与 ForwardingNode 协作扩容、computeIfAbsent 死锁陷阱、大集合找重复的场景题选型,附三层追问链自测。题目来源为 38 期公开招聘 JD 样本与字节、拼多多、建行、美团、快手公开面经。

蒙眼过河 417

spdlog 同步日志库使用详解

spdlog是一个轻量级 C++ 日志库,支持同步日志、异步日志、多线程日志、日志文件轮转和自定义日志格式。对于嵌入式 Linux 应用开发,我建议先使用。它可以帮我们完成:日志级别过滤。时间戳和线程 ID 输出。日志格式化。终端和文件输出。多线程安全写入。日志文件按大小或时间轮转。我们不需要自己实现互斥锁、文件写入、日志格式化和轮转等底层功能。

zengjiajun2006的博客 1118
上一篇: 浅谈 Java 中 this 的使用
下一篇: 甲骨文等公司成立支持开发Java工具的团体
java169
博客等级 码龄18年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值