【转】动静之间,不变的本质--我的程序语言实践

系统多语言实践(一) 应用系统支持多语言,在有跨国业务的公司中,是个很常见的需求。一般涉及到的语言有中简、中繁、英文、日语等。本文就.Net Web平台下实现该需求做一些初步探讨。 在Asp.Net Web Form时代,微软就给出了一个解决方案。简单来讲,就是将多语言资料维护到*.{Culture Code}.resx文件中,绑定的工具根据该文件自动生成静态的多语言访问类。 这个方案,简单实用。对于一般的小项目也 阅读详情

动静之间,不变的本质

                                       ——我的程序语言实践

                                               作者:周爱民

引子
====
源于SD2.0大会的召开,以及拙作《JavaScript语言精髓与编程实践》一书的出版在即,优快云、博文视点以及《程序员》的编辑都希望我写一点关于语言的东西。我已经为这个问题苦恼了很久,因为我不知道可以说什么,既可以与先行者有别,又可以使后来者为鉴。

这下便借用《程序设计语言实践》一书的书名,讲讲我的经历吧。


从动态语言到静态语言
====
我所学的第一门语言其实是数据库编程语言DBASE,参加的是学校的一个暑期的关于微机操作的培训——程序设计语言只是其中很小的一部分,我们得从键盘键位之类的开始学起。就这样,我也只学了十天。这是在1994年,当时用的是DBASE III。DBASE是解释执行的、弱类型的一种语言,我用它写过数据库的前置的口令检测程序。很快我就换成了BASIC,换这门语言的原因是当时要参加省赛区的一个竞赛,我用了一个月略多的时间来学习它就参赛了,结果是第二名。在后来的学习中,我用BASIC写过内存处理、端口处理程序。到了1997年的时候,我的一个朋友的毕业设计要用BASIC来写,当时我已经丢下BASIC两年了,但还是用了一晚的时间完成了一个考试管理系统,包括班级、学科管理、成绩管理和档案管理(含磁盘检测以上报档案)。当时我用了一个名为Turbo Basic的东东,是Borland做的最后一款BASIC语言的工具,据内幕说是因为与微软存在协议,后来Borland再也没出过这一语言的工具。

(*) 顺便补充一点,那个微机培训的课程是一个月,而我当时对文学感兴趣,因为要去北京参加一个笔会而只学了十天。我对文学的兴趣持续到1999年,在2000年的时候,一篇早期的文学作品拿了网易首届网络文学大届的散文金奖(这个大赛也只办了一届,哈哈)。而对文字的喜好则持续到现在,成了我写书作文的根基与动力。

在DOS时代还有一种可编程的批处理(当然现在在Windows系统中也有,只是用的人实在不多了),我曾经用它与BASIC和汇编结合起来,写过系统加锁程序。这些大概都是在1996年之前的事了。

我学习编译型语言的时间晚于解释型的,最初是在1995年初开始自学《数据结构》一书,那一版的书就是用PASCAL语法来讲的,而我学算法语言晚于学《数据结构》,所以当时并不会PASCAL,也不可能在当时的BASIC中理解这些复杂的数据结构。因此我又买来Pascal语言入门教材自学,然而题不对板,数据结构中用的与我这本书所讲的,以及我能用的Pascal编译器三者全不靠谱,而那时候我还在死学死用的层次上,学了半年而无有小成。

然而《数据结构》却没有耽搁,对这门学科的学习成了我这么多年来理解编程的基础。再后来,我又开始自学汇编语言、算法语言(Pascal)和操作系统原理,到了1996年初,我基本上已经完成了对语言和系统的自学。这个时候,我的语言选择已经从Basic转到了Pascal。

换言之,我从动态语言走到了静态语言。不过这样说,我可能被立即反问:它们是动态语言吗?我慎之又慎的思考之后的回答,仍然“是”。前面提到的DBASE、BASIC和批处理其实都有动态语言的特征——尽管这在我学习它们时是不知的。


回归动态-从Delphi到JavaScript
====
知道我的朋友很多是因为Delphi以及我所写的《Delphi源代码分析》一书。我从1996年开始做一些商业产品的代码,一直到2003年都是使用的Pascal/Delphi系列语言,以及一些汇编语言。我从传统过程式开发转变到面向对象开发,用了非常长的时间——超过两年。直到2003年的早些时候,我终于停下忙忙碌碌的、无止尽的代码书写,问了自己一个问题:Delphi是怎么回事?

为了给自己解答这个问题,我辞掉所有的工作,静下心来研究这门语言。准确地说,是研究静态语言的语法、语义以及面向操作系统的编译与二进制文件生成。《Delphi源代码分析》这本书讲的就样的一些内容:语言的基本要素、操作系统对语言的要求、语言的实现等等。只不过我是通过对Delphi的源代码的分析来展现这些罢了。

用了一年的时间,我终于看明白语言在“结构”方面的真相:所有的语言效果、语法以及二进制的执行能力,原来不过是操作系统理解的一堆“可执行和可存取的数据结构”。“编译”这一过程,无非是把这些细节隐藏起来,让程序员以为自己在写一种非常高级的、逻辑的、有趣的代码,而忽视掉背后的本质部分:静态的数据与指令。

如同我此前对于Pascal/Delphi的盲目一样,我学用JavaScript之初也是盲目的。我选择JavaScript的唯一原因,只是因为我在Web上开发时找不到第二种可以通用的语言(如果当时我能选择一种类pascal语法的语言,我一定会错失学习JavaScript的良机)。

我从1998年开始使用JavaScript,这离这门语言被创生出来不过三年时间——以语言的历史而言,这算得上是“追新”了。在最初我无非是把它当成一种脚本化的过程式语言,以及用来响应网页里的OnXXXX事件的一些代码。但在一两年之后,在我深受Delphi中的面向对象编程思想的影响之后,我发现JavaScript令我不堪忍受:它毕竟不是一门具有完整的对象特性的语言。于是我开始试图实现JSOOP:JavaScript的面向对象编程。

这一设想以及一些实践开始于2002年,但直到2004年初我才真正着手实施这个计划,到了2005年末这个项目延伸为现在的Qomo(Qomolangma OpenProject)。而我另一方面的计划——自2005年初开始写的一本名为《B端开发》的书,也终于因为Qomo项目而被放弃,变成了《JavaScript语言精髓与编程实践》。因为在Qomo开发过程中,我发现讨论JavaScript这种语言本身,远比“在浏览器端(B端)开发”更为有趣。尽管,在这其间我还用过PHP、Java与C#等等,不过相对于后面要讨论的内容来说,这些已经不重要了。

因为我对编程的理解,终于从Delphi走回JavaScript,从静态回归到动态。


JavaScript语言的基本特性
====
到底JavaScript是怎样的、以及为什么会吸引我呢?如今我之视见,JavaScript语言包括了四个方面的语言特性:过程式语言、面向对象语言、函数式语言和动态语言。具有过程式特性,是它入门容易的原因;面向对象特性则使它符合主流的程序设计思想;函数式是JavaScript语言的根基,而动态语言则是它的外在表现,以及强大到难于驾驭的根源。

前些时候在北京参与优快云大会时,与一个老朋友谈到JavaScript,他说:JavaScript具有几乎所有主要语言形式的原子要素。我觉得,这个“语言原子”的概念就提得很好。的确,JavaScript在上述四个方面都表现平平,但每个方面都抓住了相应语言范型的精髓。不但如此,JavaScript还使用了一个最简而又最合理的方式来组织各种语言特性。仅以“动态”而论,《JavaScript语言精髓与编程实践》讲述了JavaScript所包括的四个方面的动态性质:
 - 动态执行
 - 动态类型
 - 重写
 - 实现动态环境的基础数据结构
源于本文篇幅,对于更深层面的问题便不讨论了,这里仅讨论一下静态执行与动态执行的某些本质上的差异。举个例子来说,下面的代码:
------
obj.aMethod(x,y,z);
------
这显然是一个对象方法调用。但对象方法是如何实现的呢?在静态语言中,因为有编译过程,所以我们把一个结构放在内存里,并使得它
  - 拥有一个对象实例指针指向obj,
  - 拥有一个对象方法指针指向aMethod()在代码区的地址,
  - 在有效代码的前后加入处理x,y,z这些参数的代码(例如入栈与清栈)。
在执行时,我们将obj与aMethod交给执行系统,并传入指定参数(的序列),然后就可以按照既已编译的规则来执行了。
然而在JavaScript中,由于它是一个动态语言,因此编译的结果只是一个表达执行过程的语法树。这个语法树被存储为一个二叉树形式的数据结构。更细节的说,二叉树的Root/Left/Right三个节点分别表示运算符、运算元1、运算元2。以较为复杂的三元运算符“?:”来说,下面表达式:
------
isTrue ? expr1 : expr2
------
就被表达为
        root(?)
         /   /
left(isTrue)  right(:)
               /  /
       left(expr1) right(expr2)
——学过数据结构的开发者一定对此不会陌生,因此我就不细讲实现和使用这个结构的过程了。不过这一结构也显然地可以陈述为一个lisp/scheme表达式。同样的道理,一个对象方法的过程亦是如此,用这样的方法来表达上面的“对象方法调用”,就可以用lisp/scheme方法来陈述:
------
((. obj aMethod) x y z)
------
正是这个细节,表明在JavaSctipt中所谓的“对象方法调用”,其本质上是函数式语言中的一个运算式。因其是一个运算式,所以能动态地(作为语法树的一部分)解释执行。

同样的方法,可以解构所有在JavaScript有关执行系统(语句、表达式、函数等)的问题,基本上都可以归结到函数式这个范围内。换而言之:函数式这个“原子”为JavaScript提供了执行和动态执行能力。

再往后,我考察了JavaScript在数据结构层面上的实现。这方面最精当(而又平凡)的解释是前两天在微软架构师有关语言的讨论中做出的:JavaScript的对象其实是“属性包”。不过,更专业而难解的词汇是“关联数组”。JavaScript使用关联数组作为动态化类型的基础,而静态的值类型仅包括布尔、数值、字符串类型(字符串兼具值与引用两方面特性)和undefined四种。当所有的类型被归结到这里时,就可以发现“动态”的另一层含义与”引用“结合了起来:
  - 所谓引用,不过是动态地找到值的一种手段
另一方面,对运算系统的考察,也会被归结到这里:
  - 所谓运算,本质是针对值的运算

举个实例来说,例如:
------
aWindow.width = obj.aMethod(x,y,z);
------
其中".width”运算的目的是找到一个值类型的属性;“.aMethod()”的目的是找到一个函数并调用它,然后返回某个值;“=”运算则将某值传入某个存值的属性。

所以,根源上来说,JavaScript中的所有运算都是围绕“如何得到和使用值(类型)数据”来的。对此更深入的推论是:所有的计算系统都是围绕这一根本目的来的。

在写《JavaScript语言精髓与编程实践》的过程中,我一次又一次地回顾了我对Delphi的所有理解,抛开那些将语法树静态化到内存结构和磁盘文件结构的过程,我看到:所有静态与动态语言,在本义上所追求的,无非是算法与结构的平衡——即先满足算法实现一致性,还是先满足结构实现一致性的问题。

在这十余年之中,我从动态开始,深入静态又回归动态,最终我来到了原点:程序=算法+结构。

学两种语言
====
在《程序设计语言实践》中对“语言”有一个分类法,将语言分类为“说明式”与“命令式”两种。Delphi以及C、C++、Java、C#等都被分为“命令式”语言范型的范畴;“函数式”语言则是“说明式”范型中的一种。我如今回顾我对语言的学习,其实十年也就学会了两门语言:一门是命令式的,一门是说明式的。当然从语言的实现方式来看,一门是静态的,一门是动态的。

这便是我程序员生涯的全部了。

我毕竟不是计算机科学的研究者,而只是其应用的实践者,因而我从一开始就缺乏对“程序”的某些科学的或学术层面上的认识是很正常的。也许有些人认为一开始程序便是如此,或者一门语言就应当是这样构成和实现的,那么可能他是从计算机科学走向应用,故而比我了解得多些。而我,大概在十年前学习编程,以及在后来很多年的实践中,仅被要求“写出代码”,而从未被要求了解“什么是语言”。所以我才会后知后觉,才会在很长的时间里迷失于那些精细的、沟壑纵横的语言表面而不自知。然而一如我现在所见到,与我曾相同地行进于那些沟壑的朋友,仍然在持续地迷惑着、盲目着,全然无觉于沟壑之外的瑰丽与宏伟。

前些天写过一篇BLOG,是推荐那篇“十年学会编程”的。那篇文章道出了我在十年编程实践之后,对程序语言的最深刻的感概。我们学习语言其实不必太多,深入一两种就可以了。如果在一种类型的语言上翻来覆去,例如学C、Delphi、Java、C#……无非是求生存、讨生活,或者用以装点个人简历,于编程能力上提高是不大的。更多的人,因为面临太多的语言选择而浅尝辙止,多年之后仍远离程序根本,成为书写代码的机器,把书写代码的行数、程序个数或编程年限作为简历中最显要的部分。这在明眼人看来,无过是熟练的砖头工而已。

《大道至简》中说“如今我已经不再专注于语言”。其实在说完这句话之后,我就已经开始了对JavaScript的深入研究。在如此深入地研究一种语言,进而与另一种全然有别的语言比较补充之后,我对“程序=算法+结构”有了更深刻的理解与认识——尽管这句名言从来未因我的认识而变化过,从来未因说明与命令的编程方式而变化过,也从来未因动态与静态的实现方法而变化过。

动静之间,不变的是本质。我之所以写这篇文字,并非想说明这种本质是什么亦或如何得到,只是期望读者能在匆忙的行走中,时而停下了脚步,远远地观望一下目标罢了。

而我,此时刻,正在做一个驻足观望的路人甲。
 

如何实现动静分离 一、动静分离 我们的网站简单来说分为 2 种数据资源,一种是动态的数据,即 PHP 等程序语言实时吐出来的数据,在网页内容上主要是 HTML 代码,另一种则是静态资源,比如图片、css、js、视频等(当然,图片等资源也可能是实时动态生成的,比如 PHP 缩略图,这里就不展开讨论了)。 一般网站初建,因为流量小、业务简单等原因,都默认将两种数据放到一台服务器上提供服务。访问量大到一定程度之后,就... 阅读详情

相关推荐

网络数据的统计分析_R语言实践

网络数据的统计分析_R语言实践

我的程序语言实践

动静之间,不变的本质        ——我的程序语言实践===========引子====源于SD2.0大会的召开,以及拙作《JavaScript语言精髓与编程实践》一书的出版在即,优快云、博文视点以及《程序员》的编辑都希望我写一点关于语言的东西。我已经为这个问题苦恼了很久,因为我不知道可以说什么,既可以与先行者有别,又可以使后来者为鉴。这下便借用《程序设计语言实践》一书的书名,

aimingoo的专栏 6129

Gazebo仿真环境下的强化学习实现

实际上利用Gazebo进行强化学习无非是环境获取上的不同,Gazebo的环境控制需要使用ROS服务进行控制,状态可以通过Gazebo进行获取,同时某些必要数据需要从话题中获取,最重要的是组织获取 的数据(通过话题等)与控制Gazebo的仿真步骤之间的组合。强化学习的手段与传统算法无异,强化学习方法最重要的是要确定动作空间、状态空间、奖励空间,这三个空间是work的前提。在笔者自己的环境中,将获取里程计的话题以及获取激光点的数据替换成为了自己的本机的仿真环境匹配的话题。

Moresweet 猫甜 6451

Go 语言实践(一)

本文由Austin发表 指导原则 我们要谈论在一个编程语言中的最佳实践,那么我们首先应该明确什么是“最佳”。如果您们听了我昨天那场讲演的话,您一定看到了来自 Go 团队的 Russ Cox 讲的一句话: 软件工程,是您在编程过程中增加了工期或者开发人员之后发生的那些事。 — Russ Cox Russ 是在阐述软件“编程”和软件“工程”之...

weixin_34211761的博客 309

xenomai内核解析--嵌入式实时linux概述

Linux系统作为一个GPOS(通用操作系统)发展至今已经非常成熟可靠了,并且由于遵循GPL协议,开放所有系统源代码,非常易于裁剪。更重要的是,与其他开源的GPOS或RTOS相比,Linux系统支持多种处理器、开发板,提供多种软件开发工具,同时Linux系统对网络和图形界面的支持非常出色。显然,选择Linux操作系统在产品的开发周期和成本控制方面都有巨大优势。 虽然Linux系统功能强大、实用性强...

wsg1100 3702

ArcGIS拓扑面错误批量修改

在工作学习中经常会遇到拓扑修改的问题,当数据量巨大的时候会产生拓扑问题 当拓扑错误数量巨大时,人工逐一修改是不现实的,基于此利用gis自带工具箱实现拓扑面类错误的批量修改。 一、.常见拓扑错误的类型: 1面重叠 2空隙(绿色部分) 二、拓扑检查 1新建数据库-----新建数据集—导入数据. 2新建拓扑 3修改拓扑容差及名称 添加拓扑修改规则 完成拓扑检查-查看拓扑错误 三、拓扑批量...

qq_43173805的博客 3万+

动静之间,不变的本质——我的程序语言实践

       周爱民先生的又一心血之作《JavaScript语言精髓与编程实践》即将于2008年3月出版,3月中旬在全国书店上架。周爱民先生节选了他博客上的一篇文章作为《JavaScript语言精髓与编程实践》的代序,希望大家关注。全文链接如下: http://blog.youkuaiyun.com/aimingoo/archive/2007/11/01/1861213.aspx

977

【CSP-J/S】复赛注意事项 上机文件组织形式

每年/S 复赛都有很多同学因为一些小失误导致一年的努力付之东流。Tony老师整理了一些复赛容易踩坑的点,或许对你有帮助!

星卯教育-信奥教练tony 1万+

Nginx 教程-动静分离

Nginx 教程-动静分离 实战

lly576403061的博客 3948

看完让你的RSA提升一个台阶 [GKCTF 2021]RRRRsa

我是,今天我给大家分享一个关于RSA的题目,带大家领略的魅力。今天开始前,我们先学习一下。

m0_62102520的博客 853

PICO+Unity MR空间网格开发实战:从零构建透视交互场景

本文详细介绍了使用PICO 4 Ultra与Unity引擎进行MR空间网格开发的完整实战流程。从环境准备、项目初始化、核心组件配置,到空间网格的生成、可视化与物理交互实现,手把手教你构建一个能识别真实环境并发射虚拟小球的透视交互场景。文章重点解析了PICO SDK中空间网格功能的关键配置与优化技巧,并提供了真机部署与调试的实用指南。

e3f4g5的博客 491

网站的动静分离实践(动静分离)

1. 动静分离的实现思路 动静分离是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。 动静分离的一种做法是将静态资源部署在nginx上,后台项目部署到应用服务器上,根据一定规则静态资源的请求全部请求nginx服务器,达到动静分离的目标。 1.1 静态资源部署至CDN上 我们的方案是直接将静态资源全...

qq_20069429的博客 1188

深入剖析 YOLOv11 中的 C2PSA 注意力机制

YOLOv11中的C2PSA注意力机制在目标检测领域取得突破性进展。该机制通过跨通道分组交互和轻量级位置编码,在仅增加0.6%计算量的情况下提升mAP 1.5-2.3个百分点。C2PSA创新性地结合局部跨通道交互、位置编码和双分支并行调制,采用纯卷积实现自注意力,避免传统注意力机制的高计算复杂度。实验表明,C2PSA在COCO数据集上以微小计算代价显著提升检测性能,特别是对小目标和遮挡目标效果突出。该模块可直接嵌入YOLO架构,为轻量级目标检测提供新的优化方向。

shrgegrb的博客 3401

深入浅出动静态库

当你在Linux系统上编写和运行程序时,动态库和静态库是两个非常重要的概念。它们不仅影响着程序的编译和执行效率,还直接关系到程序的可移植性和灵活性。

欢迎来到阿熊的blog~~ 1254

ATT MTU 交换机制:提升 BLE 数据传输效率的关键

在低功耗蓝牙(BLE)技术的面试中,ATT MTU 交换机制始终是高频考点。无论是芯片厂商的固件开发岗,还是物联网设备的协议栈调试岗,面试官都爱通过这个知识点考察候选人对 BLE 数据传输底层逻辑的理解。本文将系统梳理核心考点,结合历年真题详解应答思路,轻松应对这类问题。​

byte轻骑兵的技术小窝 2411

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

nginx动静分离

在现代Web应用架构中,动静分离已成为一种广泛采用的优化策略。这种技术的核心理念是。

2401_86544677的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Linux学习笔记】深入理解动静态库本质及其制作

Linux动静态库学习笔记 本文系统介绍了Linux中的动静态库概念、制作和使用方法。主要内容包括: 库的概念:库是可供复用的二进制代码,分为静态库(.a/.lib)和动态库(.so/.dll)。 静态库: 编译时链接到可执行文件 制作方法:使用ar工具打包.o文件 使用方法:通过gcc的-L、-l选项指定库路径和名称 动态库: 运行时动态加载,节省资源 制作方法:使用gcc -shared和-fPIC参数 使用方法:除编译选项外,还需注意库路径设置 提供了详细的Makefile示例

大白的编程日记. 1294

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

后端面试必备:Nginx中实现动静分离的原理与实践

动静分离是指将网站中的静态资源(如HTML、CSS、JavaScript、图片等)与动态内容(如PHP、JSP、ASP等生成的页面)分开处理的一种架构设计方法。通过Nginx实现动静分离可以显著提高网站的性能和并发处理能力。

qq_58299462的博客 1132

Nginx动静分离

什么是动静分离为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源比如图片,js,css等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。用户请求的动态文件比如servlet,jsp则转发给Tomcat,Jboss服务器处理,这就是动静分离。这也是反...

zsj777的专栏 4466

Nginx的动静分离:原理、配置与最佳实践

动静分离将静态资源(如HTML、CSS、JavaScript文件、图片等)与动态资源(如数据库查询结果)分开处理,从而有效地利用服务器资源,提高系统的并发处理能力和响应速度。动静分离的核心思想是将静态资源缓存到Nginx服务器上,减少对后端服务器的请求次数。当客户端发出请求时,Nginx接收到请求后,会根据预先配置的动静分离规则,将请求转发给后端服务器。1. server块:在server块中定义一个location,用于匹配客户端请求的路径,并将请求转发给后端服务器。二、Nginx动静分离的配置。

My_wife_QBL的博客 899

Nginx配置——动静分离

Nginx配置——动静分离

scorpio的博客 8437

[Linux]:动静态库

想深入了解 Linux 中的动静态库吗?本文将为你详细解读它们的原理、使用方法及打包方式,助你轻松掌握这一重要知识,提升编程技能,快来探索吧!

Bettysweetyaaa的博客 2128

06.Nginx动静分离

????1.nginx动静分离 1.1 什么是动静分离 1.什么是动静分离? 简单来说就是将动态请求和静态请求分开处理。php、 python、java、nginx。 2.为什么要做动静分离? 首先Tomcat在处理静态资源时效率不高,但默认情况下无论 “动态、静态“ 资源都是由tomcat处理,而Tomcat在处理静态 资源时需要进行逻辑运算,从而会导致应用响应慢,并且会 占用不必要的系统资源。 那么借助Nginx实现动态资源请求和静态资源请求分离后,可 以减少系统不必要的消耗和延时。以便加快系统的

crykenneth 289

Web 架构之动静分离

动静分离是指将 Web 应用中的动态资源(如 PHP、JSP、ASP 等动态脚本生成的页面)和静态资源(如 HTML、CSS、JavaScript、图片等)分开处理和部署。通过将静态资源和动态资源分别部署在不同的服务器或存储系统上,可以充分发挥各自的优势,提高网站的性能和可扩展性。动静分离是一种有效的 Web 架构优化策略,它可以显著提高网站的性能和可维护性。通过将静态资源和动态资源分开处理和部署,可以充分发挥各自的优势,减少服务器的负载,提高资源的访问速度。

懂搬砖 2534
上一篇: 【转】是什么限制了我们面向对象(的开发)
下一篇: OOP之封装 【C#】
SysBug
博客等级 码龄22年 3粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值