编程思想:程序自身的模型/函数模型硬件标准如何实现

前言

        前面提到过写程序的过程:根据各种需求,构建程序模型(逻辑模型),再用代码实现.本贴关于程序自身的模型以及函数模型,以及推导硬件标准从逻辑到代码的思路.

程序自身的模型

        如图

 应用APP

        接受输入---鼠标动作,键盘输入的字符等,得到结果---画面,显示数据等.

工具

        包括框架和编程语言等都属于编程工具,工具是程序员学习的主要部分.经典描述---程序=数据结构+算法.工具解决的两大问题:数据的表达,以及逻辑的建立.逻辑表现在函数的定义(函数模型在后面讲述).数据和逻辑两大部分和硬件有着对应关系,机器关注的也是数据和逻辑,只是表现形式不一样,逻辑被化作指令码,数据化成地址.所以一个好的程序员对指令集也应该有一定理解.

        程序的输出最终会成为硬件状态的变化.框架封装硬件标准来控制硬件(后面讨论硬件实现的思路).

编译

        程序员在IDE(集成开发环境)里写的内容叫做"代码",是一个包含空白符(空格,换行符,tab)的字符串,芯片不认识代码.所以需要用编译器,使代码成为具有一定语义的单词,这个过程就是编译.编译的意义之一是认识到所有的语言,或者程序员的写下的字符都是工具,通过编译才让这些字符有了意义.

目标语言

        可以被芯片识别和执行的指令.物理形式是二进制数(很多和计算机有关的图片喜欢用一连串的0和1,就是表达在底层起作用的是0和1的组合).内容仍然是数据和逻辑.表示逻辑的二进制数交给PC(程序计数器),表示数据的二进制数表示数值或者地址.地址用于数据传递,数值表示结果.

        机器码很难读,所以把他化成较为容易理解的汇编指令.汇编指令也不是很多,常见的有立即数,寻址,跳转,移动(move),在高级语言如C语言中有对应的定义.除非高级语言中没有对应定义(如时钟)再考虑底层的内容.

函数模型

        函数是把逻辑和实现结合起来的一种形式.函数名称是程序员要做的事,函数内容是如何实现这件事,函数形参是做这件事需要处理的数据,把他们结合起来就是如何用数据的变化来做成想做的事.

        函数可能有返回值也可能没有返回值.返回值和逻辑本身没有联系.返回值给调用函数一个结果.这个结果可能会用到下一个函数调用中.

/*伪代码*/
void fun(){     //函数名表示逻辑,没有参数传入/*函数体*/....        //语句---数据变化
}

抽象和推导       

        笔者把人的思考方式简单分成抽象和推导两种.思考能力相应分为抽象能力和推导能力. 

        抽象是从现象中抽取普遍规律,形成公理,定理或规则的过程.推导与抽象相反,是从已知的公理/定理/规则出发,得到结论,关系,模型的过程.两者相比,抽象比推导难,科学界的许多成果都是建立在抽象的基础上(并验证).

        思考能力和人的聪明程度是正相关的.学习能力强的人会思考.学习是一种模仿,方法有推导,记忆,有穷假设等.有的人学习时候没注意这方面能力的培养,单单采用反复记忆加练习(当然即使思维能力强,这两项也是必须的).推导能力强的人学习效果更好.所以在学习的过程中,时常要训练自己的思维,让自己的学习能力变强.

        从<简单逻辑学>这本书里,推导有个简单的公式,离散数学里也有提到

A∈B,B→C,则A→C

        当A属于B的范畴,B能得到C,则A也能推导出C 

硬件标准实现的思路

        以下为笔者推导思路,不保证准确.

        硬件作为一个程序中的模块,以文件形式被某种语言的主程序调用.假设硬件标准中有一个画直线的函数,该如何实现呢?

        1>从物理结构上看,硬件以含若干根导线的接口和计算机相连接.操作系统可以访问这些端口并把数据写入,以达到交换数据控制硬件的目的.那么操作系统是怎么识别到端口的呢?笔者想应该是由硬件驱动程序来完成.硬件驱动程序指明通信的端口,操作系统通信时调用驱动来实现数据传送.

        2>端口导线通常不会很多,直接控制寄存器是不够的.例如8根线的端口只能控制8位.假设硬件有128M空间,那么应该有一种机制来保证数据能传给这128M空间.假设端口就是8位的,那么和8位端口直连的硬件部分作为数据缓冲区,另外想办法把缓冲区数据传递出去.

        3>为了实现缓冲区和硬件寄存器区的数据传递,在硬件的控制电路中设置一个模式,在这种模式下定义一个硬件标准,先指明传递数据的地址,再传数据过去.

        假设data_on()函数用于操作系统传递数据给硬件,change_on()用于硬件内部传递数据.

/*伪代码*/
//端口地址由驱动给出,可以作为全局变量或局部变量,如果作为局部变量,要在data_on()函数内定义形参
int addr=端口地址;    /*把数据传给缓冲区*/
void data_on(int value){int *p=addr;*p=value;
}

        change_on()和data_on()互斥,此时操作系统和硬件不能传递数据,用于硬件内部数据传递.

        在此基础上,写出伪代码---buf是缓冲区,pointer是硬件内部数据指针

/*伪代码---标准的实现*/
void line(int x_start,int y_start,int x_end,int y_end){/*第一次传8位数据给pointer指向的地址*/data_on();change_on();move(buf,pointer);/*第二次传8位数据给pointer指向的地址*/data_on();change_on();move(buf,pointer+8);
}

        写到这里,相信新的问题又给看出来了.pointer这个硬件寄存器的指针如何实现?很容易想到的是在操作系统端实现这个指针.即硬件设计为操作系统操作端口数据,来控制硬件寄存器.

/*主程序端伪代码*/line(2,3,3,5);    //从坐标2,3到3,5画一条直线

        这个例子只为了思路锻炼,不必在意正确与否,或者和实际比较起来会走很多弯路

小结

        程序自身模型,函数模型的演示,硬件标准如何实现的思路

         

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91928.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于JAVA Spring Boot物理实验考核系统设计与实现 (文档+源码)

目录 一.研究目的 二.需求分析 三.数据库设计 四.系统页面展示 五.源码获取方式 一.研究目的 信息数据的处理完全依赖人工进行操作&#xff0c;会耗费大量的人工成本&#xff0c;特别是面对大量的数据信息时&#xff0c;传统人工操作不仅不能对数据的出错率进行保证&…

【国内电子数据取证厂商龙信科技】安卓镜像提取与解析

前言随着智能手机更新迭代越来越快&#xff0c;手机厂家对手机系统安全性要求也越来越严格。系统安全性提高对公民的隐私是一件好事&#xff0c;但是对于取证行业确实一个大难题&#xff0c;手机系统安全性的提高意味着我们能对犯罪嫌疑人手机的提取数据和恢复数据越来越少&…

Java+Ollama 本地部署 DeepSeek-R1 对话机器人:从 0 到 1 实战指南

作为 Java 开发者&#xff0c;想在本地搭建一个能理解代码、支持多轮对话的 AI 机器人&#xff1f;DeepSeek-R1 这款开源大模型绝对值得一试。今天就带大家用 OllamaJava 实现本地化部署&#xff0c;全程实操&#xff0c;新手也能跟着做&#xff01; 一、先搞懂&#xff1a;为…

Java Web项目Dump文件分析指南

目录 1. Dump文件的类型与作用 2. 生成Dump文件的方法 3. 分析Dump文件的工具 4. 分析步骤与常见问题解决 5. 最佳实践与预防 在Java Web项目中&#xff0c;dump文件是JVM&#xff08;Java虚拟机&#xff09;在发生崩溃、内存溢出或特定事件时生成的内存快照文件&#xff0…

Ubuntu网卡驱动无效,不能连接wifi上网

一、现象及临时网络准备 我的另一篇博客详细介绍了前期准备工作&#xff1a; 知乎&#xff1a;Ubuntu网卡驱动无效&#xff0c;不能连接wifi上网知乎&#xff1a;Ubuntu网卡驱动无效&#xff0c;不能连接wifi上网 在此基础上&#xff0c;还得给Ubuntu配好镜像源&#xff0c;…

LeetCode Hot 100 二叉搜索树中第 K 小的元素

给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。示例 1&#xff1a;输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1示例 2&#xff1a;输入&#xff1a…

5-大语言模型—理论基础:注意力机制优化

目录 1、稀疏注意力机制&#xff08;Sparse Attention&#xff09; 1.1、核心问题&#xff1a;传统注意力的 “效率瓶颈” 1.2、具体稀疏策略&#xff08;详细计算逻辑&#xff09; 1.2.1、局部窗口稀疏&#xff08;Local Window Sparse&#xff09; 1.2.2、基于内容的稀疏…

轻松学习C++:基本语法解析

基本语法解析引言基本语法变量和数据类型运算符控制结构函数示例代码&#xff1a;计算圆的面积引言 C是一种功能强大的通用编程语言&#xff0c;由Bjarne Stroustrup于1979年创建。它在C语言的基础上进行了扩展&#xff0c;支持面向对象编程、泛型编程和过程式编程。C以其高性…

Python Pandas读取Excel表格中数据并根据时间字段筛选数据

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录Python Pandas读取Excel表格中数据并根据时间…

CS231n-2017 Lecture3线性分类器、最优化笔记

图片向量与标签得分向量&#xff1a;上节讲到&#xff0c;图片可以被展开成一个向量&#xff0c;对于这个向量&#xff0c;假设它有D维&#xff0c;那么它就是D维空间的一个点&#xff0c;又假设我们的标签集合总共有K种&#xff0c;我们可以定义一个K维标签得分向量&#xff0…

windows wsl ubuntu 如何安装 open-jdk8

安装步骤 jdk dhd:~$ java -version Command java not found, but can be installed with: sudo apt install openjdk-11-jre-headless # version 11.0.20.11-0ubuntu1~22.04, or sudo apt install default-jre # version 2:1.11-72build2 sudo apt install op…

Javascript进程和线程通信

JavaScript 中的进程通信&#xff08;IPC&#xff09;和线程通信是实现高性能、高并发应用的核心技术&#xff0c;尤其在处理 CPU 密集型任务或跨环境数据交互时至关重要。以下从底层机制到应用场景的详解&#xff1a;&#x1f9e9; ​​一、进程通信&#xff08;Inter-Process…

堆堆堆,咕咕咕

1.找TopK问题要找到最前面的k个元素void swap(int *a,int *b) {int temp*a;*a*b;*btemp; } //向下调整最小堆 void minheapify(int arr[],int n,int index) {int left2*index1;int right2*index2;int smallestindex;if(left<n&&arr[left]<arr[smallest]) smalles…

n8n教程分享,从Github读取.md文档内容

从上一篇我们了解到了如何安装 n8n 那么这节课我们尝试从github的个人仓库获取某个文件的内容 目标如下 content/business/1.how-to-use-money.mdx 总流程图 流程详解 第1步&#xff1a;申请 GitHub Personal Access Token (Classic) 在gitrhub 个人 设置选项 申请 GitHub P…

分布式ID与幂等性面试题整理

分布式ID与幂等性面试题整理 文章目录分布式ID与幂等性面试题整理一、分布式ID1. 为什么需要分布式ID&#xff1f;2. 分布式ID的核心要求3. 常见分布式ID方案(1) UUID(2) 数据库自增(3) Redis自增(4) 雪花算法(Snowflake)(5) 美团Leaf/百度UidGenerator4. 雪花算法详解二、幂等…

node.js学习笔记1

目录 Node.js是什么 Node.js下载与安装 Buffer缓冲区 一些计算机硬件基础 程序运行的基本流程 Node.js是什么 node.js是一个JavaScript运行环境&#xff0c;或者说&#xff0c;node.js是一个可以运行JavaScript的软件。 可以用于开发服务端、桌面端、工具类应用。 服务器…

游戏开发日志

我来为您逐行详细讲解这个 ViewMgr.cs 文件。这是一个Unity游戏中的视野管理系统&#xff0c;用于优化游戏性能。## 文件结构概览这个文件主要包含以下几个部分&#xff1a; 1. 数据结构和接口定义 2. 视野管理器 ViewMgr 类 3. 工具类 ViewTools让我逐行为您讲解&#xff1a;#…

使用 PlanetScope 卫星图像绘制水质参数:以莫干湖为例

1.数据采集 我使用ArcGIS Pro 中的Planet Imagery插件下载了 2023 年 6 月 25 日的安卡拉莫干湖卫星图像。 图 1&#xff1a;使用 Planet 插件下载卫星图像 图 2&#xff1a;下载图像的日期和传感器选择 我查阅的研究中指出&#xff0c;使用无降水时期的卫星图像对于水质测定…

Docker部署前后端分离项目——多项目共享环境部署

目录 一、简介 二、文件目录结构 三、前端部署流程&#xff08;多nginx&#xff09; 3.1 前端打包 3.2 编写部署文件——项目1&#xff08;consult-system&#xff09; 3.3 编写部署文件——项目2&#xff08;person-system&#xff09; 3.4 前端部署至linux服务器 3.5…

学习笔记(39):结合生活案例,介绍 10 种常见模型

学习笔记(39):结合生活案例&#xff0c;介绍 10 种常见模型线性回归只是机器学习的 “冰山一角”&#xff01;根据不同的任务场景&#xff08;分类、回归、聚类等&#xff09;&#xff0c;还有许多强大的模型可以选择。下面我用最通俗易懂的语言&#xff0c;结合生活案例&#…