B 站焊武帝爆火出圈:纯手工拼晶体管自制 CPU,java框架常见面试题

本文讲述了UP主自造CPU的过程,从寄存器设计到程序计数器实现,再到自主研发指令集和编程语言,最终完成硬件编码。作者还分享了Java开发者的学习资源,强调了自我学习的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通常来讲,CPU 的结构可以大致分为运算逻辑部件、寄存器部件和控制部件等。

而他最先 “下手” 的,就是 CPU 的寄存器部分。

Up 主设计了一个 6 位的移位寄存器

它的作用不仅能是用来存储,还能在时钟信号的控制下,将数据进行进行逐次右移或左移。

简单来说就像是一个交警叔叔,当数据从一个方向进来的时候,这个移位寄存器可以指挥它什么时候该往哪里走。

Up 主处理的第二个结构,是程序计数器 (PC)。

它作用简单来说,就是记录程序运行的位置。

而这也是整个项目下来最耗时、最复杂的部分,花了整整 3 个月之久。

程序计数器涉及的功能那可就多了。

像最基本的就是挨个字节读完指令后,计数要自动 + 1;而 CPU 重启之后,计数便会清零。

而且在不同的条件之下,还要能实现直接跳转、调用函数、函数返回等功能。

听着就有够复杂的了。

奈何,除此之外,还时常伴随着各种各样的 “玄学问题”。

Up 主就举了个例子:

花了一个多星期才在最深处找到一只焊反的二极管……

但功夫不负有心人,在经历 3 个月令人头秃的时光之后,最复杂的模块还是被他搞定了。

上电测试也没有问题:

然后就是硬盘(ROM)和内存(RAM)。

这是 CPU 外的比较庞大两个部分要手搓一个不太现实。

因此,Up 主用上了比较容易操作的 hm628512 来做 ROM 和 RAM:

左:RAM 和指针 右:ROM

再将 ROM 和 RAM 组装上去,现在 CPU 的基础模块已经基本完成了。

接下来就是打造指令译码器

它主要是用于把传到这里的 CPU 指令,进行解析运行:

再把做加减乘除的运算器(ALU)加上去:

最后还得再焊一个通用缓存上去:

现在,这个全部由三极管、二极管和电阻焊接而成的 CPU 就完成了!

看到这密密麻麻的元件,工程量的浩大就不用多说。

也难怪能让一众网友直呼 “肝帝” 了。

还有纯手写最原始代码


以为纯手工焊接就完了?

不不不,还有更硬核的。

因为这个 CPU 的指令集和架构都是自主研发的,所以没有适配的编程语言。

那怎么能让它跑起来呢?

这位 Up 主的对策是:

纯手写最原始代码 —— 二进制编程

噫吁嚱!噫吁嚱!

这一手露的,直接引发了网友们的第二波高潮

手写指令集,牛皮!这才是真・写代码!

直接上机械码,太狠了吧!

然后…… 然后……

Up 主竟然就开启了上古编程模式 —— “扣” 程序

面对此情此景,怎么一句 “绝绝子” 了得。

……

一切准备工作就绪。

接下来,便是见证奇迹的时刻。

亮灯,跑起!


但最开始,程序的运行并不是一帆风顺。

即便大神重启了几次,跑马灯的效果偶尔还是出现问题。

但 bug 很快被找到了:

有个地方断开了。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

分享

1、算法大厂——字节跳动面试题

2、2000页互联网Java面试题大全

3、高阶必备,算法学习

,可以添加V获取:vip1024b (备注Java)**
[外链图片转存中…(img-71rE0hOf-1711866363688)]

分享

1、算法大厂——字节跳动面试题

[外链图片转存中…(img-gA8UGZJC-1711866363689)]

2、2000页互联网Java面试题大全

[外链图片转存中…(img-GLdgIaKS-1711866363689)]

3、高阶必备,算法学习

[外链图片转存中…(img-Gw39P9me-1711866363689)]

好的,为您提供一个简单的图形界面Java计算器示例代码: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Calculator extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JTextField inputField; private JButton button0, button1, button2, button3, button4, button5, button6, button7, button8, button9; private JButton buttonPlus, buttonMinus, buttonMultiply, buttonDivide, buttonClear, buttonEquals; private double num1, num2, result; private String operator; public Calculator() { setTitle("Calculator"); setSize(300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); inputField = new JTextField(20); inputField.setHorizontalAlignment(JTextField.RIGHT); inputField.setEditable(false); JPanel buttonPanel = new JPanel(new GridLayout(4, 4)); button7 = new JButton("7"); button8 = new JButton("8"); button9 = new JButton("9"); buttonDivide = new JButton("/"); button4 = new JButton("4"); button5 = new JButton("5"); button6 = new JButton("6"); buttonMultiply = new JButton("*"); button1 = new JButton("1"); button2 = new JButton("2"); button3 = new JButton("3"); buttonMinus = new JButton("-"); button0 = new JButton("0"); buttonClear = new JButton("C"); buttonEquals = new JButton("="); buttonPlus = new JButton("+"); buttonPanel.add(button7); buttonPanel.add(button8); buttonPanel.add(button9); buttonPanel.add(buttonDivide); buttonPanel.add(button4); buttonPanel.add(button5); buttonPanel.add(button6); buttonPanel.add(buttonMultiply); buttonPanel.add(button1); buttonPanel.add(button2); buttonPanel.add(button3); buttonPanel.add(buttonMinus); buttonPanel.add(button0); buttonPanel.add(buttonClear); buttonPanel.add(buttonEquals); buttonPanel.add(buttonPlus); button7.addActionListener(this); button8.addActionListener(this); button9.addActionListener(this); buttonDivide.addActionListener(this); button4.addActionListener(this); button5.addActionListener(this); button6.addActionListener(this); buttonMultiply.addActionListener(this); button1.addActionListener(this); button2.addActionListener(this); button3.addActionListener(this); buttonMinus.addActionListener(this); button0.addActionListener(this); buttonClear.addActionListener(this); buttonEquals.addActionListener(this); buttonPlus.addActionListener(this); setLayout(new BorderLayout()); add(inputField, BorderLayout.NORTH); add(buttonPanel, BorderLayout.CENTER); } public void actionPerformed(ActionEvent e) { if (e.getSource() == button1) { inputField.setText(inputField.getText() + "1"); } else if (e.getSource() == button2) { inputField.setText(inputField.getText() + "2"); } else if (e.getSource() == button3) { inputField.setText(inputField.getText() + "3"); } else if (e.getSource() == button4) { inputField.setText(inputField.getText() + "4"); } else if (e.getSource() == button5) { inputField.setText(inputField.getText() + "5"); } else if (e.getSource() == button6) { inputField.setText(inputField.getText() + "6"); } else if (e.getSource() == button7) { inputField.setText(inputField.getText() + "7"); } else if (e.getSource() == button8) { inputField.setText(inputField.getText() + "8"); } else if (e.getSource() == button9) { inputField.setText(inputField.getText() + "9"); } else if (e.getSource() == button0) { inputField.setText(inputField.getText() + "0"); } else if (e.getSource() == buttonPlus) { num1 = Double.parseDouble(inputField.getText()); operator = "+"; inputField.setText(""); } else if (e.getSource() == buttonMinus) { num1 = Double.parseDouble(inputField.getText()); operator = "-"; inputField.setText(""); } else if (e.getSource() == buttonMultiply) { num1 = Double.parseDouble(inputField.getText()); operator = "*"; inputField.setText(""); } else if (e.getSource() == buttonDivide) { num1 = Double.parseDouble(inputField.getText()); operator = "/"; inputField.setText(""); } else if (e.getSource() == buttonClear) { inputField.setText(""); } else if (e.getSource() == buttonEquals) { num2 = Double.parseDouble(inputField.getText()); if (operator.equals("+")) { result = num1 + num2; } else if (operator.equals("-")) { result = num1 - num2; } else if (operator.equals("*")) { result = num1 * num2; } else if (operator.equals("/")) { result = num1 / num2; } inputField.setText("" + result); } } public static void main(String[] args) { Calculator calculator = new Calculator(); calculator.setVisible(true); } } ``` 该计算器界面包含数字按钮、运算符按钮和一个文本框,可以进行基本的加、减、乘、除运算。运算结果会显示在文本框中。运行该程序,即可看到计算器的图形界面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值