C++ std::adjacent_difference算法的巧妙设计与不足

2025-08-25

本文探讨了C++标准库中`std::adjacent_difference`算法的设计理念。该算法计算输入序列中相邻元素的差值,并复制第一个元素到输出序列。这种设计虽然保证了与`std::partial_sum`算法的对称性,如同微积分中的微分和积分互为逆运算,但同时也限制了其泛型性,因为不同类型数据的差值类型可能不同。文章进一步类比微积分中的导数和积分,解释了该算法的设计初衷,并对比了Q语言中更灵活的`deltas`函数,最终得出结论:虽然Stepanov的设计初衷良好,但其在泛型性方面有所不足,C++23中的`pairwise_transform`则提供了更灵活的解决方案。

阅读更多
开发

程序员的编程偏好:童年经历的影响

2025-05-19

本文作者反思了自己的编程偏好,追溯到其童年经历。他认为文化和成长环境比理性论证更能塑造我们对技术的核心信念。作者的童年经历让他养成了追求完美、避免错误和抗拒寻求帮助的习惯,这些习惯也反映在他的编程风格上:偏好静态类型语言、避免依赖、追求代码简洁。作者认为,与其强求适应不适合自己的工作环境,不如寻找一个与自身特质相符的环境,才能最大限度地发挥潜能。最后,作者呼吁程序员们接纳彼此不同的编程风格,并重视自身感受在职业选择中的重要性。

阅读更多
开发 童年经历

转置张量文件

2024-11-30

本文讨论了safetensors文件格式的优缺点,并提出了一种改进方案tensorsafe。safetensors文件格式用于存储多维数组,其头部包含张量元数据(形状、类型、偏移量),之后是原始张量数据。然而,这种设计需要两次遍历数据集才能创建文件,并且元数据中的偏移量是相对于数据部分的,使用不便。tensorsafe格式将元数据块移到文件末尾,并使用绝对偏移量,从而解决了这些问题。文章还探讨了其他替代方案,如分块元数据和浮动元数据,并总结了各种设计的优劣。

阅读更多

编程先锋

2024-11-04

本文介绍了四位编程先锋:Edward Kmett,Haskell社区的知名人物,以lens库的工作而闻名;Casey Muratori,Handmade Hero项目的创始人,倡导从零开始构建软件;Aaron Hsu,Co-dfns(一个在GPU上运行的APL编译器)的作者;以及Bret Victor,一位界面设计师,致力于创造更直观的交互工具。文章赞扬了这些程序员对编程的深刻思考和创新贡献,并鼓励读者在日常工作中寻找更深层次的意义。

阅读更多
未分类

交易模型是编程范式

2024-08-18

这篇文章探讨了账户模型和UTXO模型这两种交易模型之间的区别,这两种模型分别类似于面向对象编程和函数式编程。账户模型使用类似面向对象编程的风格,每个更新都会影响全局分类账状态,而UTXO模型则采用具有子结构类型的函数式编程风格。文章深入探讨了每种模型在抵抗重放攻击、多路交易、错误恢复和监管合规性方面的优缺点,并得出结论:UTXO模型在所有这些方面都表现出色。

阅读更多
未分类 交易模型 UTXO

计划-执行模式

2024-06-26

本文介绍了一种通用的解决问题的方案:计划-执行模式。该模式将复杂算法的实现分为两个阶段:计划阶段和执行阶段。计划阶段负责根据输入制定计划,该计划以数据结构的形式封装了算法的所有决策。执行阶段则负责根据计划执行操作。这种方法可以更全面地测试决策部分,并增强系统的调试能力。文章还讨论了执行阶段的两种方式:直接执行计划和使用状态机和驱动循环来处理不确定性。

阅读更多
未分类

数字塔的惨败:为何面向对象编程在处理数字类型层次结构上力不从心?

2024-05-22

本文批判了面向对象编程在处理数字类型层次结构(例如自然数、整数、有理数等)时的缺陷,并提出了函数式编程的解决方案。作者以自然数和整数为例,指出OOP中基于继承的建模方式会导致“is a”关系的错误,以及代码冗余和维护困难等问题。相反,函数式编程通过代数数据类型和函数组合,能够更清晰、灵活地表示数字类型及其之间的关系,并通过类型提升和简化操作来减少代码冗余。

阅读更多
未分类

启迪软件

2024-05-20

这篇文章介绍了作者心目中的启迪软件,包括UNIX、Git、Emacs、Boost.Graph和Bazel。作者从个人经历出发,讲述了这些软件如何帮助他理解编程、操作系统、版本控制、文本编辑和构建系统等概念,并深入探讨了它们的内部机制和设计哲学。作者认为,好的启迪软件应该能够解决日常问题,具有简洁的设计和易于探索的内部结构,并鼓励用户深入学习和掌握。

阅读更多
未分类