11 | DSL:你也可以设计一门自己的语言

36 篇文章 7 订阅
订阅专栏
本文介绍了领域特定语言(DSL)的概念,强调了其在软件开发中的重要性,区分了外部DSL和内部DSL的区别,并指出良好的设计应导向DSL,如通过编写表达意图的代码。作者提到,尽管大多数人可能不会创建通用语言,但理解和使用DSL可以提升编程效率和代码质量。
摘要由CSDN通过智能技术生成

在前面,我们花了三讲的篇幅探讨程序设计语言,一方面是为了增进我们对程序设计语言的理解,另一方面,也希望从中学习到软件设计方面做得好的地方。除了借鉴一些语言特性之外,我们还能怎样应用程序语言,来帮我们做设计呢?

讲到程序设计语言模型时,我说过,程序设计语言的发展趋势,就是离计算机本身越来越远,而离要解决的问题越来越近。但通用程序设计语言无论怎样逼近要解决的问题,它都不可能走得离问题特别近,因为通用程序设计语言不可能知道具体的问题是什么。

这给具体的问题留下了一个空间,如果我们能把设计做到极致,它就能成为一门语言,填补这个空间。注意,我这里用的并不是比喻,而是真的成为一门语言,一门解决一个特定问题的语言。

这种语言就是领域特定语言(Domain Specific Language,简称 DSL),它是一种用于某个特定领域的程序设计语言。这种特定于某个领域是相对于通用语言而言的,通用语言可以横跨各个领域,我们熟悉的大多数程序设计语言都是通用语言。

在第 8 讲说过,它们都是图灵完备的,但 DSL 不必做到图灵完备,它只要做到满足特定领域的业务需求,就足以缩短问题和解决方案之间的距离,降低理解的门槛。

虽然大多数程序员并不会真正地实现一个通用程序设计语言,但实现一个 DSL,我们还是有机会的。这一讲我们就来谈谈 DSL,看看我们可以怎样设计自己的语言。

领域特定语言

不过,一说起设计一门语言,很多人直觉上会有畏惧心理。但实际上,你可能已经在各种场合接触过一些不同的 DSL 了。程序员最熟悉的一种 DSL 就是正则表达式了,没错,也许已经习惯使用正则表达式的你都不知道,但它确实就是一种 DSL,一种用于文本处理这个特定领域的 DSL。

如果你觉得正则表达式有点复杂,还有一种更简单的 DSL,就是配置文件。你可能真的不把配置文件当作一种 DSL,但它确实是在实现某个特定领域的需求,而且可以根据你的需求对软件的行为进行定制。

一个典型的例子是 Ngnix。无论你是用它单独做 Web 服务器也好,做反向代理也罢,抑或是做负载均衡,只要通过 Ngnix 的配置文件,你都能实现。配合 OpenResty,你甚至可以完成一些业务功能。

这么一说,你是不是觉得 DSL 的门槛不像听上去那么高了。

经过前面几讲的学习,你应该知道了,语法只是一种接口。很多人说到设计 DSL,脑子里实际想的也只是设计一种语法。所以,从软件设计的角度看,DSL 最终呈现出来的语法只是一种接口,但最重要的是它包裹的模型。

Martin Fowler 在他的《领域特定语言》这本书中,将这个模型称为语义模型(Semantic Model)。不过,在我看来,Martin Fowler 起这个名字是站在语言开发的角度,毕竟语义这个词,只有学过编译原理的人才好理解。所以,这里真正的重点是模型。

想要实现一个 DSL,可以这么说,DSL 的语法本身都是次要的,模型才是第一位的。当你有了模型之后,所谓的构建 DSL,就相当于设计一个接口,将模型的能力暴露出来。

当把 DSL 理解成接口,我们接受 DSL 的心理负担就小了很多。你可以想一想,它和你熟悉的 REST API 其实没有什么本质的不同。

既然是接口,形式就可以有很多种,我们经常能接触到的 DSL 主要有两种:外部 DSL 和内部 DSL。Martin Fowler 在他的书中还提到了语言工作台(Language Workbench),不过,这种做法在实际工作中用到的不多,我们暂且忽略。

外部 DSL 和内部 DSL 的区别就在于,DSL 采用的是不是宿主语言(Host Language)。你可以这么理解,假设你的模型主要是用 Java 写的,如果 DSL 用的就是 Java 语言,它就是内部 DSL,如果 DSL 用的不是 Java,比如,你自己设计了一种语法,那它就是外部 DSL。

把概念说清楚了,一些问题便迎刃而解了。这也可以解释为什么 DSL 让有些人畏惧了,原因就是说起 DSL,这些人想到的就是自己设计语法的外部的 DSL。其实,即便是外部 DSL,也不一定要设计一门语法,我们甚至可以借助已有的语法来完成。比如,很多程序员熟悉的一种语法:XML。

如果你是一个 Java 程序员,XML 就再熟悉不过了。从 Ant 到 Maven,从 Servlet 到 Spring,曾经的 XML 几乎是无处不在的。如果你有兴趣,可以去找一些使用 Ant 做构建工具的项目,项目规模稍微大一点,其 XML 配置文件的复杂程度就不亚于普通的源代码。

因为它本质上就是一种用于构建领域的 DSL,只不过,它的语法是 XML 而已。正是因为这种 DSL 越来越复杂,后来,一种新的趋势渐渐兴起,就是用全功能语言(也就是真正的程序设计语言)做 DSL,这是后来像 Gradle 这种构建工具逐渐流行的原因,它们只是用内部 DSL 替换了外部 DSL。

从复杂度而言,自己设计一种外部 DSL 语法,大于利用一种现有语法做外部 DSL,二者之间的差别在于谁来开发解析器。而外部 DSL 的复杂度要大于内部 DSL,因为内部 DSL 连解析的过程都省略了。从实用性的角度,更好地挖掘内部 DSL 的潜力对我们的实际工作助益更多。

代码的表达性

你或许会有一个疑问,内部 DSL 听上去就是一个程序库啊!你这个理解是没错的。我们前面说过,语言设计就是程序库设计,程序库设计就是语言设计。当一个程序库只能用在某个特定领域时,它就是一个内部 DSL,这个内部 DSL 的语法就是这个程序库的用法。

先用一个例子让你感受一下内部 DSL,它来自 Martin Fowler 的《领域特定语言》。我们要创建一个 Computer 的实例,如果用普通风格的代码写出来,应该是这个样子:

Processor p = new Processor(2, 2500, Processor.Type.i386); Disk d1 = new Disk(150, Disk.UNKNOWN_SPEED, null);
Disk d2 = new Disk(75, 7200, Disk.Interface.SATA);
return new Computer(p, d1, d2);

而用内部 DSL 写出来,则是这种风格:

computer() 
  .processor()
    .cores(2) 
    .speed(2500) 
    .i386()
  .disk()
    .size(150)
  .disk()
   .size(75)
   .speed(7200) 
   .sata()
.end();

如果这是一段普通的 Java 代码,我们看到一连串的方法调用,一定会说,这段代码糟糕至极!但在这个场景下,和前面的代码相比,这段代码省去了好多变量,反而是清晰了。这其中的差别在哪里呢?

之所以我们会觉得这种一连串的方法调用可以接受,一个重要的原因是,这段代码并不是在做动作,而是在进行声明。做动作是在说明怎么做(How),而声明的代码则是在说做什么(What)。

二者的抽象级别是不同的,“怎么做”是一种实现,而“做什么”则体现着意图。将意图与实现分离开来,是内部 DSL 与普通的程序代码一个重要的区别,同样,这也是一个好设计的考虑因素。

Martin Fowler 在讨论 DSL 定义时,提到了 DSL 的 4 个关键元素:

计算机程序设计语言(Computer programming language);

语言性(Language nature);

受限的表达性(Limited expressiveness);

针对领域(Domain focus)。

其中,语言性强调的就是 DSL 要有连贯的表达能力。也就是说,你设计自己的 DSL 时,重点是要体现出意图。抛开是否要实现一个 DSL 不说,的确,程序员在写代码时应该关注代码的表达能力,而这也恰恰是很多程序员忽略的,同时也是优秀程序员与普通程序员拉开差距的地方。

普通程序员的关注点只在于功能如何实现,而优秀的程序员会懂得将不同层次的代码分离开来,将意图和实现分离开来,而实现可以替换。

说到这里,你就不难理解学习内部 DSL 的价值了,退一步说,你不一定真的要自己设计一个内部 DSL,但学会将意图与实现分离开,这件事对日常写代码也是有极大价值的。

有了这个意识,你就可以很好地理解程序设计语言的一个重要发展趋势:声明式编程。现在一些程序设计语言的语法就是为了方便进行声明式编程,典型的例子就是 Java 的 Annotation。正是它的出现,Spring 原来基于 XML 的外部 DSL 就逐步转向了今天常用的内部 DSL 了,也就是很多人熟悉的 Java Config。

你会发现,虽然我在这说的是写代码,但分离意图和实现其实也是一个重要的设计原则,是的,想写好代码,一定要懂得设计。

总结时刻

今天,我们讨论了领域特定语言,这是针对某个特定领域的程序设计语言。DSL 在软件开发领域中得到了广泛的应用。要实现一个 DSL,首先要构建好模型。

常见的 DSL 主要是外部 DSL 和内部 DSL。二者的主要区别在于,DSL 采用的是不是宿主语言。相对于外部 DSL,内部 DSL 的开发成本更低,与我们的日常工作结合得更加紧密。

内部 DSL 体现更多的是表达能力,相对于传统的代码编写方法而言,这种做法很好地将作者的意图体现了出来。即便我们不去设计一个内部 DSL,这种写代码的方式也会对我们代码质量的提高大有助益。

关于语言,已经讲了四讲,我们先告一段落。下一讲,我们要来讨论编程范式,也就是做设计的时候,我们可以利用的元素有哪些。

如果今天的内容你只能记住一件事,那请记住:好的设计要迈向 DSL,我们可以从编写有表达性的代码起步。

思考题

最后,我想请你分享一下,你还能举出哪些 DSL 的例子呢?

领域语言(DSL)的设计与实践
02-19
领域语言(DSL)的设计与实践领域语言(DSL)的设计与实践领域语言(DSL)的设计与实践
DSL:Lua 的领域特定语言生成器
05-30
数字用户线 Lua 的领域特定语言生成器 概述 DSL 是一种语言生成器。 给定一组描述语言的标记模式和语法规则,DSL 将生成一个解析器。 DSL 基于 LPEG(Lua Parsing Expression Grammars),因此标记和规则以 LPEG 语法进行描述。 DSL 通过添加对编写自定义语言有用的功能来扩展 LPEG,例如诊断工具、错误处理和一些可用于编写模式的新原语。 DSL特性 解析事件回调(令牌尝试、令牌匹配、规则尝试、规则匹配、规则结束、评论尝试、评论匹配) 用于抛出语法错误的语法规则模式上的错误注释 自动生成表达式运算符,例如 *、/、+ 等。 自动空白处理 代码 -> AST -> 带有漂亮打印往返的代码 输入字符串的一次性解析 新的令牌原语 'T' 作为 LPEG 'P' 模式的扩展,用于编写语法规则 编写 DSL DSL 对象用于指定 DSL 中的语言
DSL(Digital Subscriber Line)和光纤(Fiber Optic)
最新发布
宋发元
08-26 415
光纤显著快于DSL,适合对速度和性能要求高的应用。光纤提供更稳定的连接,尤其适合需要低延迟、高可靠性的场景。DSL在已有电话线的区域更容易部署,但光纤覆盖范围在逐步扩展,尤其是在城市地区。DSL通常成本更低,适合预算有限且对速度要求不高的用户;光纤成本较高,但提供更优质的服务。
程序设计语言的表达——内部DSL
梦想风暴
03-26 5399
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://dreamhead.blogbus.com/logs/17667876.html 使用Java实现内部领域特定语言One Lair and Twenty Ruby DSLsImplementing an Internal DSL上面几个文章都是关于DSL的,不过,在这里,我并不是太关心DS
DSL语言基本语法
liupenglove的专栏
04-06 886
要使用这种查询表达式,只需将查询语句传递给 query 参数空查询语句:你可以使用 match 查询语句 来查询 tweet 字段中包含elasticsearch 的文档。
MDSF:DSL(Domain Specific Language)介绍
weixin_34289744的博客
09-26 340
前面介绍过模型驱动开发(MDD)、软件工厂(Software factory)、特定领域建模 DSM(Domain Specific)等都是高抽象的开发方法,这些方法使用的语言都是特定领域语言DSL)。相比于通用目的语言(C#/C++/JAVA/Delphi等)而言,DSL是一种为了特定任务而设计的开发语言,例如SQL是一种专门处理数据库的语言,本篇将介绍一下DSL。 一种语言   我们熟知...
领域专用语言DSL
热门推荐
Martin Fowler's Bliki 中文版
08-16 6万+
原文:DomainSpecificLanguage    设计        2004年2月13日            Bliki 索引所谓领域专用语言(domain specific language / DSL),其基本思想是“求专不求全”,不像通用目的语言那样目标范围涵盖一切软件问题,而是专门针对某一特定问题的计算机语言。几乎自计算机发明伊始,人们就开始谈论DSL使用DSL了。Un
Java中的DSL(领域特定语言设计与实现
微赚淘客系统开发者博客
07-28 555
Java中的DSL设计与实现提供了一种灵活的方式,使得开发者可以根据特定领域的需求设计专用的语言。通过内部DSL和外部DSL,可以实现简洁、直观的领域特定语言,提高代码的可维护性和可读性。内部DSL(Internal DSL)是利用现有语言的语法和功能来创建的领域特定语言。外部DSL(External DSL)是独立于现有编程语言的领域特定语言,需要单独设计语法和解析器。方法链是一种常用的DSL实现方式,通过将多个方法调用链接在一起,实现简洁的DSL语法。DSL设计应保持一致性,避免混乱的语法规则。
编程语言dsl
diaoju3333的博客
05-25 285
通用编程语言面向的是计算机通用功能: 即数据、计算、资源管理及数据与计算的组合方式; 数据与计算、计算与计算的组合方式是通用语言的问题域,是通用编程语言的在计算机硬件的基础上对问题解决通用描述方式; 和任何计算机和基础描述方式以外的问题域没有关系; 是在编程思想基础上对计算机和数据的直接或间接抽象; dsl是在此基础上对具体问题域的高阶抽象。 转载于:https://w...
mobl:针对移动Web开发的DSL【很详细】
家门口的知鸟
06-21 1357
 http://kb.cnblogs.com/page/100177/ 作者: Zef Hemel  来源: InfoQ  发布时间: 2011-05-10 13:21  阅读: 273 次  原文链接   全屏阅读  [收藏]  摘要:Zef Hemel现在是荷兰代尔夫特理工大学的博士生,他在那里研究对领域特定语言设计和实现。他对Web技术格外感兴趣。之前他曾经开发过W
DSL 领域特定语言
Sunny的专栏
05-05 3万+
一、DSL介绍 DSL(Domain Specific Language)是针对某一领域,具有受限表达性的一种计算机程序设计语言。 常用于聚焦指定的领域或问题,这就要求 DSL 具备强大的表现力,同时在使用起来要简单。说到DSL,大家也会自然的想到通用语言(如Java、C等)。 为什么没有一种语言同时 兼具『简洁』和『业务表达』能力呢? 从信息论本质上来讨论这个问题,每个语言的程序都可以抽象为一个字符串,每个字符串由有限数量的合法字符组成,它在运行时会实现某个功能,因而可以看作是一种需求的信源编码。每
基于Java的界面布局DSL设计与实现
02-27
火龙果软件工程技术中心  本文内容包括:创造性,还是乏味?界面布局语言介绍界面布局语言设计与实现关于设计的几点思考参考资料界面设计应该是一项充满创造性、富有乐趣的工作,但是却往往被认为非常的枯燥和繁琐。究其原因,是因为界面布局领域所采用的描述概念和具体的实现语言之间存在很大的语义隔阂。而一般的界面开发工具提供的所见即所得以及界面布局管理器等方案也无法很好地解决这个问题。在本文中,我们会给出一种更好的解决方案,我们不是去试图把界面设计者头脑中的设计概念和样式逐步降级、分解成所使用的实现语言能够理解的低层概念,也不是提供一些已经完成的、确定的但难以扩充和更改的布局样式库供界面设计者使用。我们所提供
calm-dsl:保持冷静和DSL开启!
04-06
语言设计一门妖术,在一种公认的语言基础上进行设计是一个巨大的胜利。 该语言还解决了范围限定,模块,if-else,继承等许多问题。完善的语言具有强大的工具支持:IDE,语法检查器,第三方模块,编码实践,更好的...
软件设计11DSL:你也可以设计一门自己的语言
qq_53280238的博客
07-10 599
今天,我们讨论了领域特定语言,这是针对某个特定领域的程序设计语言DSL 在软件开发领域中得到了广泛的应用。要实现一个 DSL,首先要构建好模型。常见的 DSL 主要是外部 DSL 和内部 DSL。二者的主要区别在于,DSL 采用的是不是宿主语言。相对于外部 DSL,内部 DSL 的开发成本更低,与我们的日常工作结合得更加紧密。内部 DSL 体现更多的是表达能力,相对于传统的代码编写方法而言,这种做法很好地将作者的意图体现了出来。
编程语言发展史之:编程语言的未来趋势
AI天才研究院
09-25 5427
编程语言”这个概念在近几年间已经成为现代科技领域的一个热门话题。它从诞生到今天已经经历了几百年的历史,各个编程语言都各不相同,但其中的共同点无疑就是可以实现一些程序功能。而“未来趋势”,则指的是这一系列编程语言的演进方向以及各自适应该方向的理念、方法和工具。那么,编程语言的未来是如何确立的呢?对于编程语言来说,如何走向成熟并取得成功,将是一个至关重要的问题。为了给读者提供一个深入浅出的理解,本文从编程语言的历史开始,一步步阐述编程语言发展的脉络。
C++ 元编程之代码生成:设计并实现拓扑结构 DSL
Hsuesh的博客
09-08 878
对比 来看看这幅图, 原先方式是需要这样描述: tf::Taskflow taskflow; tf::Task A = taskflow.emplace([] () {}).name("A"); tf::Task B = taskflow.emplace([] () {}).name("B"); tf::Task C = taskflow.emplace([] () {}).name("C"); tf::Task D = taskflow.emplace([] () {}).name("
DSL初探
qq_42828391的博客
03-22 1013
只要自底向上从左到右遍历树结构(后序遍历),根据节点的树结构类型去执行对应的转换函数,构建我们的执行算法。DSL的主要优势在于其在特定领域内的强大表达能力,可以减少开发者的工作量,提高代码质量。然而,设计和实现一个好的DSL并非易事,需要深入理解领域知识,同时也需要精通语言设计和实现技术。DSL广泛应用于各种领域,如Web开发中的HTML和CSS,数据库查询中的SQL,以及构建系统中的Makefile等。随着编程领域的发展,DSL将会越来越重要,我们也应该学习和掌握DSL,以便能更好地解决特定领域的问题。
Kotlin-简约之美-进阶篇(十六):DSL原理解析
门心叼龙的专栏
02-27 7324
DSL(领域特定语言)是Kotlin所带来的强大语法特性之一,也是Java中所不存在的功能,JetBrain也基于DSL开发出了众多的开源库,Kotlin的开发者可以使用DSL来重构许多已有的代码,甚至有可能做到彻底抛弃HTML,XML,SQL等代码的地步。 现代编程语言已经越来越向自然语言靠拢,因此学习使用一个语法特性并非难事,所以本文将延续本专题的风格:“理论先行”,重点在于详细讲解DSL在K...
ElasticSearch核心之DSL查询语句实战
老徐的博客只有干货
07-26 1353
Elasticsearch提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。 DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。目前常用的框架查询方法什么的底层都是构建DSL语句实现的,所以你必须掌握DSL
领域语言(dsl)的设计与实践
07-26
领域特定语言DSL)是一种根据特定领域需求和约束而设计的编程语言。相比通用编程语言DSL更加专注于解决特定领域的问题,能够提供更高效、简洁和易于理解的解决方案。 DSL设计与实践包括以下几个方面: 首先,DSL设计要考虑特定领域的需求和约束。通过深入了解和分析特定领域的问题与业务逻辑,设计者可以确定DSL所需的语法、语义和功能,以满足领域内的编程需求。 其次,DSL的实践需要选择合适的实现方式。常见的DSL实现方式包括内部DSL和外部DSL。内部DSL通常是在通用编程语言的基础上构建,使用该语言的语法和库来扩展和定制。而外部DSL则是基于独立的语法和语义,通过解析器和执行器来实现。 另外,DSL设计还需要注重易用性和可读性。DSL应该是简洁而直观的,让领域专家和非专业开发人员能够容易理解和使用。为了提高可读性,可以使用领域特定的术语和表达方式,使代码更富有表达力和可解释性。 此外,DSL的实践过程中,还需要提供良好的工具和支持。这包括编写DSL的编辑器、调试器和代码生成器,以及相关的开发环境和文档。这些工具可以帮助开发人员更快地开发和调试DSL程序,提高开发效率和质量。 总之,领域特定语言设计与实践需要深入了解特定领域的需求和约束,选择合适的实现方式,注重易用性和可读性,并提供相应的工具和支持。通过合理的设计和实践,DSL能够提供更高效、简洁和易于理解的解决方案,提升领域内编程的效率和质量。
写文章

热门文章

  • 05|音频降噪如何对症下药? 12209
  • 14|音效三剑客:变调、均衡器、混响 9102
  • 15|AI变声:音频AI技术的集大成者 7429
  • 22|再探HuggingFace:一键部署自己的大模型 7042
  • 11|网络差怎么办?音频网络传输与抗弱网策略 6223

分类专栏

  • Android 开发 19篇
  • C++实战笔记 26篇
  • 大规模数据处理 42篇
  • 技术管理2 37篇
  • 元宇宙 13篇
  • 前端 54篇
  • python自动化 36篇
  • Java 核心技术 41篇
  • 技术管理 37篇
  • Kafka 核心技术 45篇
  • 编译原理之美 41篇
  • 数学基础 56篇
  • 编程入门 35篇
  • 性能工程实战 33篇
  • 面试现场 39篇
  • 程序员工作法 55篇
  • 软件设计之美 36篇
  • 性能测试 33篇
  • 全栈工程师修炼 45篇
  • 搭建直播视频平台
  • AI大模型 30篇
  • 分布式协议与算法 28篇
  • 即时消息技术 23篇
  • Redis核心技术 49篇
  • 秒杀系统设计 9篇
  • 云计算 18篇
  • 程序员进阶攻略 65篇
  • 消息队列 39篇
  • 计算机组成原理 56篇
  • 代码精进之路 46篇
  • 动态规划面试 20篇
  • 系统性能调优 41篇
  • 架构实战案例 21篇
  • Go语言 50篇
  • eBPF 核心技术
  • 架构2 80篇
  • C++数据结构与算法
  • 微服务 39篇
  • 推荐系统 36篇
  • OAuth 2.0 15篇
  • 后端存储 27篇
  • python核心技术 32篇
  • 深入剖析 Kubernetes 52篇
  • 分布式技术原理与算法 35篇
  • RPC 实战与核心原理 27篇
  • Linux內核技术 21篇
  • 后端技术面试 44篇
  • 大数据 41篇
  • 游戏开发 37篇
  • HTTP 40篇
  • 机器学习 43篇
  • 架构 51篇
  • 网络编程 36篇
  • 视频技术 6篇
  • 密码学 20篇
  • Linux性能优化 58篇
  • 操作系统实战 5篇
  • c++ 34篇
  • 敏捷 10篇
  • 高并发系统设计 38篇
  • 音视频入门
  • Linux操作系统 66篇
  • C语言 31篇
  • 网络排查案例 5篇
  • 音频技术 16篇
  • 网络协议 46篇

最新评论

  • 07 | Raft算法(一):如何选举领导者?

    wfh2015: 有些地方写的有偏差。 1. Follower等待Leader超时时间,是一个在固定区间的随机数,论文写的参考值是150-300ms 2. 很多时候不用Paxos主要原因有三个:a) Paxos算法是非常难以理解的,论文作者也提到,即使是斯坦福博士专门研究这东西,也花了1年左右的时间 b) Paxos算法有一些细节部分并没有公开 c) Raft是一个完整的算法,在Raft作者博士论文提到过的,除了基本部分意外,还增加了成员变更(可以理解为变更副本数提供了理论基础)/客户端交互/日志压缩,这意味着并不是空中楼阁

  • 06 | 定位防火墙(二):网络层的精确打击

    allen-smith: 请问虚拟机1和2的IP地址是多少,谢谢.

  • 05|码流结构:原来你是这样的H264

    YangShine01: 写的太好了!!!

  • 11 | I/O优化(下):如何监控线上I/O操作?

    CSDN-Ada助手: Python入门 技能树或许可以帮到你:https://edu.csdn.net/skill/python?utm_source=AI_act_python

  • 20 | 概率基础(上):一篇文章帮你理解随机变量、概率分布和期望值

    梁顿: 以下是个人观点,不对请指正:随机变量这个概念是为了跟变量这个概念区分开。如果变量最后的数据是1,那它是100%是1;而随机变量不同,如果随机变量结果是1,那是指多大程度上是1,如70%的可能性是1.

大家在看

  • 《Information Science》C2 Can Do It Easily

最新文章

  • 16 | 网络优化(中):复杂多变的移动网络该如何优化?
  • 15 | 网络优化(上):移动开发工程师必备的网络优化知识
  • 14 | 存储优化(下):数据库SQLite的使用和优化
2024
08月 12篇
07月 49篇
06月 81篇
05月 158篇
04月 193篇
03月 255篇
02月 286篇
01月 218篇
2023年931篇
2022年46篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳坪山网站建设公司网站运营诊断优化报告实训网站seo如何优化郑州家居行业网站优化推广有哪些网站优化合同制老师汕头网站关键词优化教程昌乐网站优化代运营孝昌县网站做优化代理商坪山网站优化河南开封网站优化辉县网站搭建优化淘宝优化网站靠谱吗邯郸网站优化推广可靠吗郑州网站排名优化软件价格优化政府门户网站栏目设计绵竹做网站优化中国移动网站优化建议胶南网站优化滨海网站优化推广工作室广州网站关键词优化定制仙桃本地网站优化公司排名延庆网站优化公司哪家好网站seo优化外包公司网站设计与优化原则优化网站推广排名全面网站seo优化攻略坪山网站关键词优化多少钱衡水安平网站seo优化网站目录链接优化方法韶关网站关键词排名优化费用常州网站优化企业香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化