{"componentChunkName":"component---src-templates-blog-post-js","path":"/blog/2020-06-11-programing-core/","result":{"data":{"markdownRemark":{"id":"c009c7db-548b-5cf4-b826-2cf35a848b5a","html":"<h1>CS（Computer Science）</h1>\n<p><code>一门运用计算机解决问题的科学</code>。</p>\n<p><code>计算机设备</code>运用计算方法解决问题。</p>\n<p>找出解决问题的方法和途径，分析解决问题的效率和可行性。</p>\n<blockquote>\n<p>软件工程训练学习编程。</p>\n</blockquote>\n<h1>编程（Programing）</h1>\n<p>编程是一种工具（artifact），它是我们用计算机来解决计算机科学中提到的问题工具，是计算机科学的一部份。</p>\n<h2>编程的本质</h2>\n<p>计算机只能识别 0 和 1 也就是二进制（binary），0 和 1 分别代表通过或者断开（on or off）。<code>机器语言</code>（Machine Language）一种计算机能懂的语言，能够把左移或者右移等指令转换成一串 0 和 1 的序列。<code>机器语言由计算机集成芯片定义</code>。</p>\n<p>为了方便人阅读机器语言，发明了<code>汇编语言</code>，定义助记符来描述机器语言指令。</p>\n<h3>高级语言</h3>\n<p>人很难写出计算机读懂的机器语言，所以开发出了高级语言（High-level Language）。</p>\n<ul>\n<li>Java</li>\n<li>C</li>\n<li>C++</li>\n<li>BASIC</li>\n<li>Fortran</li>\n<li>.net</li>\n<li>...</li>\n</ul>\n<p>微处理器只能识别机器语言，想要计算机理解高级语言需要把它翻译（编译）成机器语言，这也是计算机科学的一部分。不同的高级语言编译过程不完全一致。</p>\n<h3>源代码和目标代码</h3>\n<p>程序员编程及是在写高级语言代码，这些代码被称为<code>源代码</code>（Source Code），源代码最终被编译成的机器语言被称为<code>目标代码</code>（Object Code）。</p>\n<h3>经典软件编译流程</h3>\n<p>编译器将源代码文件编译成目标代码文件，链接计算机提供的<code>库文件</code>组成一个更大的目标代码文件，这就是我们说的可执行程序或应用程序。</p>\n<h3>Java 编译过程</h3>\n<p>Java 编译器将源代码文件编译成 <code>Java 字节码</code> （Java Bit Code）, 一种人也读不懂计算机也读不懂的<code>中间语言</code>。类似的，把编译后的的 Java 字节码和一些包含中间指令的 Java 字节码文件链接成一个大文件，叫做 Jar（Java Archive File）。运行在 Java 提供的 JVM（Java Virtual Machine）上。</p>\n<p>不同的操作系统，不同的微处理器能够识别的机器语言是不一样的，这就要求编译器能识别所有机器，但是大多编译器做不到。Java 编译机制，产生的字节码运行在 JVM 上不需要关注不同机器不同操作系统，只要求计算机上安装了对应的 </p>\n<p>JRE（Java Runtime Enviroment），由 JVM 来充当编译器的角色。也就是说，编写的 Java 源代码经过 Java 编译成字节码文件，就可以在安装了 JRE 的计算机上运行，不需要根据不同计算机重新编译。</p>\n<h3>面向对象编程</h3>\n<table>\n<thead>\n<tr>\n<th>语言</th>\n<th>描述</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>机器语言&#x26;汇编语言</td>\n<td>对基础机器进行抽象</td>\n</tr>\n<tr>\n<td>高级语言（非面向对象语言）</td>\n<td>对计算逻辑进行处理</td>\n</tr>\n<tr>\n<td>面向对象语言</td>\n<td>对问题领域进行抽象</td>\n</tr>\n</tbody>\n</table>\n<p>什么是面向对象编程</p>\n<ul>\n<li>万物皆对象</li>\n<li>程序是对象的集合,它们通过发送消息来告知彼此所要做的。</li>\n<li>每个对象都有自己的由其他对象所构成的存储。</li>\n<li>每个对象都拥有其类型。</li>\n<li>某一特定类型的所有对象都可以接收同样的消息。</li>\n</ul>\n<p>什么是对象?\nBooch对于对象的描述:对象具有状态、行为和标识。</p>\n<ul>\n<li>状态:表明每个对象可以有自己的数据。</li>\n<li>行为:表明每个对象可以产生行为。</li>\n<li>标识:表明每个对象都区别于其它的对象。（唯一的地址）</li>\n</ul>\n<blockquote>\n<p>无状态对象：对象不包含数据，没有状态可以修改，没有行为。</p>\n</blockquote>\n<p>面向对象编程的三要素(特征)</p>\n<p>封装性( Encapsulation) </p>\n<ul>\n<li>隐藏实现细节（访问控制）</li>\n<li>定义接口</li>\n</ul>\n<p>继承性( Inheritance) </p>\n<ul>\n<li>S-A关系</li>\n<li>HAS-A关系(组合)</li>\n</ul>\n<p><code>多态性</code>( Polymorphism) </p>\n<ul>\n<li>后期绑定(虚函数) </li>\n<li>向上转形( Up Casting)</li>\n</ul>\n<h4>面向对象编程与面向对象分析</h4>\n<p>我们大部分开发人员并没有按照面向对象的理念进行编程，大多只是使用面向对象语言进行编程,没有面向对象方式编程还是面向过程。</p>\n<p>面向对象的本质：<br>\n<code>面向对象编程不是使用面向对象的编程语言进行编程,而是利用多态特性进行编程。</code></p>\n<p>面向对象分析是将客观世界,即编程的业务领域进行对象分析。\n充血模型与贫血模型领域驱动设计DDD</p>\n<blockquote>\n<p>DDD 方法论实质就是面向对象编程，是面向对象设计的一种落地。</p>\n</blockquote>\n<h4>面向对象设计的目的和原则</h4>\n<p>面向对象设计的最终目的，是使软件达到“强内聚、低耦合”\u001c，从而使软件：</p>\n<ul>\n<li>易扩展 - 易于增加新的功能</li>\n<li>更强壮 - 不容易被粗心的程序员破坏</li>\n<li>可移植 - 能够在多样的环境下运行</li>\n<li>更简单 - 容易理解、容易维护</li>\n</ul>\n<p>面向对象设计的原则</p>\n<ul>\n<li>为了达到上述设计目标,有人总结出了多种指导原则</li>\n<li>“原则”是独立于编程语言的,甚至也可以用于非面向对象的编程语言中。</li>\n</ul>\n<h4>设计模式( design patterns)</h4>\n<p>设计模式是用于解决某一种问题的通用的解决方案。</p>\n<p>Gang of Four (Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides)TH T 大类23种基本的设计模式。</p>\n<p>在更细分的领域当中还可以总结出许多设计模式。</p>\n<h2>总结</h2>\n<p>编程的本质：\n工程师<code>在</code>使用编程语言编写源代码，以“计算机”为载体，编译构建成运行在“计算机”上的应用程序。<code>实际上</code>是通过编程的手段利用计算机，分析、解决现实问题。在这个过程中遵循一定的原则、采用经典通用的设计模式来更好的应对现实问题变化。</p>\n<h2>Reference</h2>\n<p><a href=\"https://v.youku.com/v_show/id_XMzg2ODk1MTg4.html\">斯坦福大学公开课:编程方法：计算科学发展史</a></p>","frontmatter":{"date":"June 09, 2020","title":"软件开发简史-编程的本质","description":"编程的本质","tags":["Programing"]}}},"pageContext":{"id":"c009c7db-548b-5cf4-b826-2cf35a848b5a"}}}