程序员基础

一、计算机基础

1.1 计算机组成

  • 硬件:
CPU 主机 硬件
运算器+控制器+寄存+缓存 +内存 +外存+输入/输出
  • 软件:
系统层 中间层 应用层
硬件交互 软件通信 具体问题

1.2 计算机分类

  • 专用型:嵌入式
  • 通用型:移动<桌面<服务器<集群<仓库级<超级

1.3 数据

1.3.1 数据的表示

数据的维度有符号和编码。

纯数字

  • 数字进制:二进制B,八进制O,十六进制H,十进制D。用权来转换进制,不同进制运算规则一致。
  • 机器数:1 byte=8 Bit,就是说机器数有8个字长。原码首位正0负1。反码将负数首位之外的01互换,补码在负数的反码上再加1,移码在负数的补码上再取反首位。原码可方便正负和比较绝对值大小,补码用于位处理可判断是否溢出,移码可比较真实大小。
  • n字长的定点整数/小数,最多可表示±2<sup>±(n-1)</sup>。因此引入浮点数(正负S+阶码P+尾数M),32字长即单精度浮点数float,n字长阶码可有(2<sup>n-1</sup>-1)的指数浮动。

字符编码

字符包括十进制数、英文字母符号和文字,必须二进制编码。

  • ASCⅡ编码:查表编码,共128个码值。
  • 汉字编码:
输入码 内部码 输出码
规范码、拼音码、字形码 国标内码 点阵码
  • Unicode编码:对于UTF-8,汉字消耗1~3字节。

校验码

码距:合法编码之间的最少不同位数。

  • 水平/垂直奇偶校验码:单个数据前加校验位/数据组后加校验数据,使行列1的个数均为奇数,无纠错能力。
  • 海明码:2<sup>r</sup>≥k+r+1,在r个数据位之间加入k个校验位,保证能纠错。
  • 循环冗余校验码:校验码用模二运算的多项式,表示之前数据码的倍数,无纠错能力。

1.3.2 数据的运算

  • 逻辑运算:与AND,或OR,非NOT。异或XOR(奇数真成立),可由基础逻辑运算得到。运算律可由真值表穷尽得出。
  • 机器数运算:加法用原码同号相加,减法用补码相加求原。模运算加减会从符号相反的方向溢出。乘除需要用到移位硬件。
  • 浮点运算:加减法对齐阶码,尾数截断,若溢出则调整阶码。乘除法对阶码加减,对尾数相乘,也会截断变阶。

1.4 计算机组成和原理

1.4.1 总线

分类:芯片内总线<元件级总线<系统总线<通信总线

  • 系统总线:带宽=工频x位宽/8。分为串口与并口,串口的每对通道可以独立传输,而并口每次传1byte,还要单独的时钟通道。PCIe串口协议,最高通道数x16,迭代也加倍带宽。
  • 通信总线:USB4 c-c串口协议,全双工同时收发,能热插拔,供电强大。

1.4.2 CPU

CPU是中央处理单元/微处理器/处理器。

  • 功能:指令控制(顺序),操作控制(信号),时序控制(定时),数据处理(加工),异常响应()。
    组成:运算器ALU(运算/寄存/累加),控制器CU(指令的记取/译码/列表/时序/寄存/状态),寄存器组GPR(数据/地址/指令/状态/其它),内部总线。
  • 多核:提升性能,散热更好,可多线程。

1.4.3 储存

  • 分类:按材料分为磁储存,半导体储存,光储存。按功能分为读写储存器RAM(易失),只读储存器ROM(仅EEPROM可电改写)。按寻址分为随机读存RAM,顺序读存SAM,直接读存DAM。
  • 层次:在速度上,寄存(>高速缓存)>主存>外存。
    • 主存:RAM上电脑为DDR5 SDRAM,手机为LPDDR5 SDRAM。ROM上电脑为NAND固态硬盘/磁储存机械硬盘,手机为UFS4 NAND。组成有地址寄存器、地址译码电路、储存体、数据寄存器、控制线路。性能上,容量1MB=1024KB,还有带宽、存取时间、平均故障间隔等参数。
    • 高速缓存Cache:L1缓存容量一般为64KB,拷贝了主存频繁使用的内容。
    • 外存:CPU访问外存内容,必须拷贝完全文件。分为磁盘,闪存和光盘。机械硬盘磁盘不防摔,光盘耐用可靠容量大但读写慢。
  • 云储存:分为对象储存(标识分离),文件储存(目录树),块储存(挂载空间)。功能有同步,备份,共享。

1.4.4 输入/输出系统

外设种类多差异大,要用独立I/O系统控制。

  • I/O接口:并非简单接线,有编址/交换/缓冲/驱动/转换能力。并口/串口看之前介绍。

1.5 指令系统

指令系统连接硬件与软件。

  • 指令:格式为操作码+地址码。寻址。分为数据传送、输入输出,算术运算、逻辑运算、移位操作、程序控制、字符串类、异常控制、数值转换等指令。

1.6 多媒体

分为感觉媒体(视听内容)、表示媒体(文件编码)、表现媒体(输入输出设备)、交换媒体(储存传输设备)。

  • 数字声音:物理声音维度有动态、频率、基频、泛音、音色度。数字声音经过了采样、位化、编码,维度有采样率、位深、声道数、比特率、压缩率。合成数字声音(语音/音乐合成),通常被参数化、模型化,占用数据量小,并非直接的采样波形。
    • MIDI:乐器数字接口标准。MIDI文件包含乐曲演奏完整信息,扩展名.mid。
    • 声音文件格式:wav无损压缩,mp3有损压缩,mid非波形格式。
  • 图形图像:矢量图形用于编辑,像素图像用于展示。
    • 颜色:色相/色调是可见光谱的比例,饱和度是白光中加色相的比例,亮度由物理功率决定。常见的三基色是加法红绿蓝白、减法青品红黄黑。
    • 图片与设备:图片与屏幕的分辨率有像素分辨率,和物理分辨率dpi。色彩空间由屏幕/图片的单色位深上限和算法决定。单色位深相加得到(总)位深,真彩色可达24位深。用色表的彩图,称伪彩色。
    • 图片文件:gif动画伪彩可预览,png图片无损真彩,jpg图片有损真彩。
  • 动画视频:动画按运动分为实时动画(运动插帧)、矢量动画(实时绘制),按空间分为二维动画(可关键帧)、三维动画(实体模型)。模拟电视近乎淘汰,数字视频才是主流。
    • 视频压缩:音视频压缩主流MPEG-4标准,帧内M-JPEG压缩,帧间h.264(AVC)压缩,音频aac压缩。视频流文件可能会用AVC,HEVC,AV1压缩。

二、操作系统基础

操作系统OS是必需核心系统软件,管理用户软件和其它系统软件。

  • 特性有并发性、共享性、虚拟性和不确定性。功能有进程管理(时间)、文件管理(文件树)、储存管理(空间)、设备管理(外设)、作业管理(人机)、接口提供。
  • 分为批处理操作系统(执行无人脚本)、分时操作系统(适合多用户)、实时操作系统(物体控制/信息并发)、 网络操作系统(支持连网)、分布式操作系统(进一步支持网络协作)、微机操作系统(如MacOS/Linux/Win)、嵌入式操作系统(比微机更弱更专,如Android/IOS)。
  • 进程管理:顺序执行可复现,并发执行相互制约。状态分为就绪、运行、阻塞、新建、终止,原语进程无法中断。狭义上线程分配执行,进程分配资源,增加并发量,注意避免资源死锁。
  • 储存管理:符号地址和相对地址组成逻辑地址,逻辑地址再(动态)重定位到物理储存。储存管理分为分区储存(空间连续/需要碎片重整/可做分区保护),分页储存(页间不连续/每页等大/单独页表造成速度损失),分段储存(每段逻辑信息完整/利于共享保护),虚拟储存(外存扩大主存容量/局部启动程序)。
  • 外设管理:外设分为块设备(可随机访问)/字符设备(仅数据流),独占设备(如打印机)/共享设备(如磁盘)/虚拟设备(各种映射)。管理维度有实时状态,分配释放,用缓冲区,I/O实现,用户接口。优化维度有加通道,扩DMA(直接存取),缓冲技术(短作业减延迟),Spooling技术(长作业多作业)。磁盘调度会最小化平均访时,不允许并行。
  • 文件管理:文件是符号信息项的完整集合,由文件体和文件说明(文件名/类型/大小/日期/权限/所有者/位置/描述/版本/元数据/签名等)组成。文件名尽量用较短的英文数字,符号只用点杠下划。文件系统的功能有按名存取,并发控制,接口统一,权限控制,文件验错,储存优化。文件体逻辑结构分为分项(记录)/连续的字节流。文件的物理结构分为连续结构(利于顺序读追加写批量项/不利于大文件查改单项),链接结构(项内块用链指针),索引结构(文件内用索引表)。文件控制块(文件基本信息)组成文件目录,常是多级目录结构。文件存取分为顺序存取和随机存取(也叫直接存取)。空闲空间管理也用表链,还可用位图标记物理块。文件共享最好在目录结构中分开文件名和文件说明,文件保护有列用户组权限表、密码等。系统安全分用户权限、目录权限、文件权限,系统恢复分转储(系统/文件)、日志文件、一致性检查(块/文件)。
  • 作业管理:作业由程序、数据、说明(含用户/语言/时限/控制/资源信息)组成。作业调度策略有响应比(等待/执行)优先、硬件/指定优先。用户界面分字符界面、图形影音界面、VR多感知界面。

三、程序设计语言基础

Fortran是最早的高级语言。
机器语言(二进制流),汇编语言(字符化流),高级语言(面向应用)。解释器边转换边执行,编译器出文件再执行。
脚本语言(解释型)
PHP、Python(面向对象),Js、
编程语言(编译型)
C(命令式/结构化/面向过程),C++、C#、Java、Ruby(面向对象)
标记语言
XML、MathML、HTML

编程语言成分:

  • 数据:数据对象有意义有id,数据表示含编码信息,数据类型赋内存限制运算。常量只有右值不可变,多用局部量,类型有整形实型字符布尔/空型/枚举/构造/指针/类/用户。
  • 运算:含算术运算,关系运算和逻辑运算等。数据类型和算符组成运算规则,注意优先级和结合性。
  • 控制:含顺序结构(单线性),选择结构(多线性用好else if),循环结构(利用好for-break)。
  • 函数:定义包含函数名/形参/函数体/返回值。定义后置时,调用前要声明。
    语言处理程序
  • 汇编:源程序语句含机器指令(机器码),伪指令(定义/条件),宏指令(引用段)。汇编器第一次扫描确定地址,第二次扫描产生目标程序。
  • 编译:高级语言源程序,经过语法树分析(字符串检查/输入串检查),类型运算检查,生成中间代码,优化生成目标码。编译器的后端随不同的机器而变。
  • 解释:直接执行高级语言源程序,能边运行边改,原理和编译器相近。

四、数据结构与算法

逻辑结构分线性和非线性结构。储存结构分顺序储存和链接储存。

4.1 线性结构

  • 线性表:从表头到表尾都是单线性逻辑。顺序储存便于随机存取/追加,不便于删改。链式储存,单链表利用指针方便增删改。链表还有双向链表、循环链表,方便从任意节点遍历链表。

  • 栈和队列:栈增删同端先进后出,队列增删异端先进先出。顺序栈容量有限,链栈只有栈顶指针。顺序队列容量有限,循环队列便于判断空满。
    字符串:取值仅限字符的线性表。

  • 多维数组:储存空间由维数和维长决定,看成多维线性表,下标有界不做增删。多为顺序储存,分为行主序和列主序。

  • 矩阵:压缩储存如对角矩阵,对称矩阵(一维储存),三角矩阵,稀疏矩阵(三元组表储存)。

二叉树:结点最大数为2,区分左右。仅完全二叉树适用顺序储存,一般二叉树用三叉链表储存。遍历分为根/左/右优先遍历和层序遍历。二叉树可以改变解释与普通树互转(左子右平根成林)。最优二叉树(哈夫曼树)重新排列叶的位置,使加权的根叶距离最短,节省编码内存。二叉查找树左小右大,左根右遍历数值递增。
图:不限制元素的前后结点数,属性有向和度。关系用邻接矩阵储存,方阵阶数为元素数,无向图则矩阵对称。关系储存也可为元素分别分配邻接链表,和逆邻接链表。

查找:查找是用键找值的过程,查找表分为静态和动态(能够增删改)。顺序查找普适缓慢,折半查找快速难改(要求关键码单调变化),分块查找(索引查找)要求块间单调,树表查找性能不定便于插入,哈希查找计算验证地址取指针。

4.2 算法

算法是特定问题的可行求解方法。程序本质是数据和操作的集合。复杂度T(n)=O(n²)表示执行时间/空间总量和问题规模成平方阶。
排序算法:冒泡/插入排序O(n²)适用较有序少量输入,归并/堆排序O(nlog<sub>2</sub>n)适用大量输入。
递归算法:反复自调用,缩小并解决问题。
字符串运算:求串长,串复制,串比较,找子串。
图算法:遍历分深度优先,广度优先。最小生成树,连接全点、且无环路、边权最小。工程拓扑有向图,表示活动制约关系,不应有回路,多为单源点图。

五、软件工程

开发,维护,管理
软件生存周期:问题定义,可行性分析,需求分析(必备的功能/体验/约束),总体设计(划分功能模块/确定调用接口),详细设计(确定算法/数据结构/具体代码/输入输出/用户界面/使用说明),模块编码测试,综合测试,维护。分析-设计-编码-测试
周期模型:瀑布模型产品受到早期进度限制,增量模型受到增量相互影响,演化模型内测版影响用户,螺旋模型消除阶段风险,喷泉模型快速连续迭代。
过程评估:从过程无序到流程标准化。

软件工具:开发工具(需求/设计/编码/排错/测试),维护工具(版本控制/维护范围/修改记录/逆向恢复/工程重构),管理工具(项目成本期划资源控质/配置/评价)。
集成开发环境(IDE):
设计原则:抽象化(不考虑细节),模块化(高内聚),去访问化(避免各模块串门打架)。
结构化分析设计:数据流图分析。延迟考虑细节,顺序选择重复。

面向对象:对象包含数据和操作。类描述对象共性,类间可以多重继承。多态可换对象实现同消息的不同响应。写子类和接口,应依赖抽象而不是具体细节。

软件测试:发现新错误。复用记录测试实例。黑盒测试含功能错漏检查,界面I/O检查,数据访问检查,性能测试,启停检查。
软件调试:断点检查。归纳验证法。
软件维护:崩溃解决,功能迭代,补充功能,预备模块。

六、数据库基础

数据库管理:数据库系统,储存数据和联系。大数据,高并发需价值提纯。
数据模型:含实体属性联系。流行的是关系模型,用关系来划分属性。

SQL语言:看主流的MySQL和SQLite,别忘备份。三级模式中,外模式和模式记录逻辑结构关系,外模式是模式的可见数据子集,内模式为物理储存文件(.sql不一定包含完整数据与结构)。
SQL基础语法:SELECT查询FROM,WHERE条件,ORDER BY排序;INSERT插入,DELETE删除,UPDATE更新;CREATE建表,DROP删表,ALTER改表。

七、网络信息安全基础

网络

网络:远程访问,资源共享。硬件结构为主机、前端、中继、线路,软件结构为协议、应用。用户主机称边缘部分,其它称核心部分。按广度分为局域网LAN,广域网WAN(更慢)。交换技术主流为分组交换(数据短包),报文交换(储转邮件)。OSI模型已规范化了物理层(物性规范),链路层(成数据帧),网络层(转发分包/基于IP),传输层(基于TCP/UDP),应用层/高层(分HTTP/FTP/SMTP/SSH等)。

硬件:中继器放大信号延长线路。集线器创建分支带宽共享半双工。交换机创建分支带宽分离。网桥连接不同MAC网段发帧存在延时。路由器连接不同IP网段发包能够寻路。网关额外转换协议速率物理接口等。
传输:同轴线线芯平行有屏蔽网,双绞线线芯成对可选屏蔽网(信号电缆转换要匹配阻抗),光纤用全反射无需屏蔽存在散射只需放大。无线网传输频段多在2~40GHz(微波/厘米级/超高频带),频率高波长小难衍射,需要中继。

TCP/IP协议:TCP传输层能够检错,连接IP与高层。IPV4公网地址32位有限,子网掩码255.255.x.0(x=2<sup>8</sup>-2<sup>n</sup>末尾的0决定子网段最大主机数)可能产生子网号,使路由器能从IPV4中区分内外网和不同子网,NAT使家庭网络没有静态公网IPV4。IPV6有128位,最差情况也能让全球人每克都有数十个子网。

因特网:是网间网。每个IP可有65535(2<sup>16</sup>-1)个端口服务(高层协议)1023及以下为约定端口,常见端口有DNS53/SSH22/HTTP80/HTTPS443/FTP20。家用网络有线接入主流为光纤FTTH结合网线LAN,无线接入5G/WiFi主流使用FDMA(频分多址)。
自行配置主机静态网络填入本机IP(192.168.x.x空闲IP),路由IP(192.168.x.1),DNS IP(重庆电信61.128.128.68/61.128.192.68快速易劫持),掩码长度(家用填24)。

信息安全

储存安全:物理验证用户,物理隔离硬盘,用户目录限权,日志监控存取,更新杀毒软件,备份重要数据,主机断网使用。主流加密能做到算力级安全。
网络安全:防火墙和入侵检测技术,根据需求开等级。被大数据算出有消费价值的人必定被攻击。
个人手机能做的防护:用本地输入法(但牺牲速度),号卡设pin(保护号码),开云服务(定位丢失),闲时关闭WiFi(防止定位推销),关闭蓝牙快连(保护通讯录),经常备份(减小丢失损失),不要共享账号,小站填虚假密码,两次核对域名,重要网站打开二次验证,给app设最小权限,更新系统和杀软(至少安卓11),不明软件设最小权(或者沙盒运行),发图抹除地理,闲时关闭USB调试。
手机无法防护:手机号姓名需求泄露(骚扰电话),电话卡丢失(云端解锁手机/拖延挂失号卡),木马网站(虚构持证照办卡),图片诱导(广告虚假取消),匹配型诈骗(人怕出名)。

八、标准化与知识产权

国标:GB/T和GB/Z质量比GB更有保证。
知识产权:分为工业产权(专利/实用新型/商标等)和著作权(版权含软著等)。
软著不归单位的情况需同时满足三个条件:非本职成果/内容与工作无关/未使用单位技术。
合法使用软件:合法获取/非商业盈利/学习目的。

要赚钱学:c底层,java对象,js前端,
写工具学:lua脚本,python脚本
不常用:Rust部分支持函数式编程
lua性能稍好安卓可打包,python生态更好现成实例多。

九、Lua脚本语言

这一章只记自己尚不清楚的Lua5.3和之后的语法。
Lua终端环境:linux包名为lua5.x,Windows有开发软件luaforwindows(IDE名为scite)
基本语法:Lua支持命令行和文件执行。特殊关键字有nil,local,in,return,then。约定全局变量名为下划线加大写。
数据类型:动态类型,无需定义。八类中特殊类型有userdata,thread,nil。布尔类0为true,nil为false。串类值也可用[[string]]无名调用。串前加#求字节长,用..连接串,数字串用+运算。表类是数组,下标从1开始,支持自动扩充。函数类支持内嵌无名函数。线程类实际上是交替单线程。用户类
变量:声明总是全局变量,除了local单行/函数参量/函数内声明/条件控制,要多用local变成局部。赋值可多变量赋值,右值优先适合交换变量。值数多于变量数会舍去多余值。
循环:三种循环有while do end,for end,repeat until。循环支持break跳出。
条件:写法if then (elseif) (else) end,条件嵌套就更复杂。
函数:写法(local) function fun(x,y,z) (return) end。参数数量可变用...表示,参数名支持函数名形式。函数体内用select(i,...)会返回第i个和之后的参数值,用select('#', ...)会返回参数总数。
运算符:算数有加+减-乘*除/整//余%幂^负-。关系有相等==不等~=和大于小于。逻辑只有与and或or非not。串间用..连接,串求字节长/表求元素总数在前加#。
串:三种形式有'string.',"string",[[string]]。常用转义字符有换行\n。串求字节长在前加#,求字符数用utf8.len(str),模式匹配用string.gmatch(str,pat),转大写用string.upper(str)。
Lua正则表达式:转义%,

字符 描述 模式 描述
. 任意字符 [...] 集体匹配(视作一个字符)
x(单字符) 普通字符自身 [...-...] 中间匹配
%a 任意字母 [^...] 反选匹配
%u 任意大写字母 + 匹配前一字符≥1次(长串优先)
%l 任意小写字母 * 匹配前一字符≥0次(长串优先)
%d 任意数字 ? 匹配前一字符0或1次(长串优先)
%w 任意字母数字 - 匹配前一字符≥0次(短串优先)
%p 任意标点 %b() 匹配成对括号(等任意成对字符)
%% 转义%(等任意符号) () 成组捕获(如键值对组)
表类:表写为local myTable = {"a", [2]="b", ["key"]="c" }。纯数组时可直接操作元素myTable[i][j],下标从1开始。
迭代器:
  • for泛型迭代写为for k, v in pairs(table) do end,它会遍历表/数组的所有元素对。纯数组时也可以用ipairs()。
  • for无状态迭代写为for max, now in func, 9, 2 do end,外部迭代器func里只写迭代规则不存变量称无状态。
  • for多状态迭代写为for e in func(table) do end,外部迭代器写为function func(table) local i, max=0, #table return function() i=i+1 if i<=max then return table[i] end end end。加粗文本称为闭包函数(在函数中声明的函数),能够访问定义时外部的局部变量,会持续占用(我应该避免使用)。
    模块与包:加载模块写成(local m=) require "module",会(以别名)调用module.lua模块文件。
    文件I/O:打开文件file = io.open("file.lua", "r"),r只读r+读写w+覆盖a+追加,关闭文件file.close()。
    错误处理:一般写成xpcall(func, function(err) print(debug.traceback(err)) end),待测函数为func。
    面向对象:封装,继承,多态,抽象。可以用表,元表和函数模拟面向对象。
    SQLite数据库访问:使用安卓自带操作库。
--导包
import "android.database.sqlite.*"
--打开或创建数据库
db = SQLiteDatabase.openOrCreateDatabase(this.getLuaDir().."/test.db", MODE_PRIVATE, nil)


  • [x] 已完成
  • [ ] 未完成
    很好^1
graph TD

生物学 --> 化学

这是一个行内数学表达式

e2iπ=1

|abcd|=adbc

.

版权声明:
作者:marstt
链接:https://marstt.eu.org/202505/37.html
来源:MarsTT的站点
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>