软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

6
“用C语言编写一个汇编程序。” 为什么要用高级语言编写用于低级语言的机器代码翻译器?
我的微处理器班老师给了我们一个作业,说: “用C语言编写一个汇编程序。” -我亲爱的教授 所以对我来说似乎有点不合逻辑。 如果我没搞错,汇编语言是从机器代码到高级语言之旅的第一步。我的意思是C是比汇编语言更高级的语言。那么,用C编写汇编语言有什么意义呢?在没有C语言的情况下,他们过去在做什么?他们是用机器代码编写汇编程序吗? 对我来说,用高级语言为低级语言编写机器代码翻译器没有任何意义。 假设我们已经创建了一个全新的微处理器架构,该架构甚至没有C编译器。用C编写的汇编程序能否模拟新架构?我的意思是没用吗? 顺便说一下,我知道GNU汇编器和Netwide汇编器是用C编写的。我也想知道为什么它们是用C编写的? 最后,这是我们的教授提供给我们的简单汇编程序的示例源代码: // to compile, gcc assembler.c -o assembler // No error check is provided. // Variable names cannot start with 0-9. // hexadecimals are twos complement. // first address of the code section is zero, data section follows the code section. //fout …

3
在Github上许可
我是第一次上载到GitHub,并且面临各种有关许可的疑问。我不知道那个话题是在网上发现的!但是即使很复杂,我的情况也是如此典型,以至于我猜大多数使用Github的人都已经知道这一点。 我只想公开上传一个应用程序,该应用程序在我的POM for Maven(打包和构建Java管理器)上引用了第三方库,并显然在代码中调用了它们。其中一些是GPL,其他Apache,其他多个许可... 你们通常都需要担心所有这些东西吗?我没有分发任何二进制库或第三方库,没有修改它们,没有在商业上使用任何东西...我是否必须“明确提及它们”?在什么文件中?我有必要为自己的lib使用GPL许可证吗? 令我感到惊讶的是,互联网上的信息到底是什么,因为我从来没有见过有人注意到使用Spring,JUnit等的通知。
13 licensing  gpl  github 

6
通过逆转关系可以解决圆椭圆问题吗?
具有CircleextendEllipse违反了Liskov替换原理,因为它修改了后置条件:即,可以独立设置X和Y来绘制椭圆,但是对于圆,X必须始终等于Y。 但是,不是因为Circle是Ellipse的子类型引起的问题吗?我们不能扭转这种关系吗? 因此,Circle是超类型-它只有一个方法setRadius。 然后,椭圆通过添加setX和扩展Circle setY。调用setRadiusEllipse将同时设置X和Y-意味着保留setRadius的后置条件,但是现在您可以通过扩展接口独立设置X和Y。

3
部署Web应用程序的系统的健康检查的范围应该是什么?
今天,我有一项任务是为长期运行的服务“编写运行状况检查”,该服务是用于部署Web应用程序的业务流程系统。 我试图确定这种健康检查的范围,并提出了与健康检查范围有关的以下问题: 如果业务流程系统报告任务正在运行,则认为服务正常是否足够好? 还是我们应该手动ping每个服务? 还是应该走得更远,并尝试确保网络应用按照显示网页的目的进行操作? 运行状况检查是否还必须检查某些依赖服务是否也在运行?就像数据库或业务流程系统本身一样。还是其他健康检查的责任? 最后,如果其中一项从属服务失效,并且Web应用程序随后发生故障,那么Web应用程序应该报告不良运行状况还是良好运行状况,因为这不是Web应用程序的故障? 我知道这是5个独立的问题,但是它们都与部署Web应用程序的长期运行服务的运行状况检查范围有关,因此我认为将它们分组在一个问题中会更有意义。 这对我来说很难实现,因为我不确定什么是健康的定义或类似标准的健康检查应该是什么样。 此特定服务的健康检查应包含哪些内容?

1
我们在滥用静态方法吗?
几个月前,我开始从事一个新项目,在遍历代码时,它使我震惊了所使用的静态方法。它们不仅保留了实用程序方法collectionToCsvString(Collection<E> elements),而且还保留了大量业务逻辑。 当我问负责背后原因的那个人时,他说这是逃避斯普林暴政的一种方式。它围绕着这个思考过程进行了一些操作:要实现客户收据创建方法,我们可以提供服务 @Service public class CustomerReceiptCreationService { public CustomerReceipt createReceipt(Object... args) { CustomerReceipt receipt = new CustomerReceipt(); // creation logic return receipt; } } 现在,那个家伙说他不喜欢让Spring不必要地管理类,主要是因为它强加了限制,即客户类必须是Spring bean本身。我们最终将一切都由Spring管理,这几乎迫使我们以过程方式使用无状态对象。或多或少在这里说了什么https://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html 因此,除了上面的代码,他有 public class CustomerReceiptCreator { public static CustomerReceipt createReceipt(Object... args) { CustomerReceipt receipt = new CustomerReceipt(); // creation logic return receipt; } } …


1
开发社区是否广泛接受开放数据协议(odata)?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 编辑:如果您不熟悉odata,请前往这里。 我正在尝试确定是否值得学习这项技术,或者它是否会流行。 前提很有趣,作为API的开发人员,这似乎是向使用它们的开发人员提供更大灵活性的好方法。 不幸的是,在过去的几年中,我对开放数据协议没有太多的“嗡嗡声”,因此只是尝试评估一下一旦我学会了它,它是否有可能出现。 提前致谢。


3
显式DAG代替矢量时钟进行同步
我已经开始研究在一组同级之间进行数据同步的方法。对等方必须能够以断开连接的方式工作,然后同步在一起以合并其本地更改。 对等方应该能够使用“三种方式合并”来合并本地更新。因此,在同步时,对等方应该知道哪些事实是最新的,但是在没有严格排序的地方,他们应该能够基于公共根将这些事实合并在一起。 当独立的同级进行更改时,他们可以使用“时钟”为它们“打上时间戳”。我使用术语“时钟”和“时间戳”,但我不是在说壁钟。我的意思是某种事件的部分排序,使因果关系清晰明了。事件之间的“先发生”关系形成有向无环图(DAG)。 似乎使用矢量时钟来构建这种部分排序的“通常”方法。但是,这些可能会变得非常大。间隔树时钟等最新发展提供了更紧凑的时间戳存储。 我根本不清楚的是,为什么同步协议显然不会“简单地”显式存储DAG。(或者他们?) 对等方可以通过随机生成UUID(或通过其他方法,例如<peer-name> + <local-monotonically-increasing-counter>)来独立创建时间戳。该时间戳的顺序对于该对等点是完全清楚的。 当两个对等方彼此同步时,他们可以商定新的时间戳。同样,此时间戳的顺序对双方均清晰可见。 现在需要在对等方之间传递DAG之前发生的事件,但是此操作的存储和带宽要求很小。时间点是图顶点。因此,它们具有1个或2个传入边(1个用于客户端上的事件,2个用于客户端之间的同步)。这是有界的,与网络中对等方的数量无关。 要使用单个时间点,您需要导致该时间点的时间图。然而,据我所看到的,任何对即能知道的时间点(它产生它本身,或与其他同行产生的,或者与它同步时已被其他同行告诉它)已经也有有机会了解到那个时间点之前的历史。我认为可能有一个归纳证明。 鉴于显式地存储和同步DAG似乎很简单:在实践中使用了吗?如果不是,为什么首选矢量时钟? 笔记 点对点 与客户端服务器解决方案相比,我更喜欢对等解决方案。 可能的最终拓扑将是许多客户端连接到在彼此之间复制的一小得多的服务器组。但是,最好有一个支持该特定拓扑的通用解决方案,而不是一个需要此特定拓扑的解决方案。


6
为什么编译器不内联所有内容?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 有时,编译器会内联函数调用。这意味着它们将被调用函数的代码移到调用函数中。这使事情变得更快一些,因为不需要在调用堆栈中上下移动内容。 所以我的问题是,为什么编译器不内联所有内容?我认为这将使可执行文件明显更快。 我能想到的唯一原因是可执行文件大得多,但是如今拥有数百GB内存真的重要吗?改进的性能值得吗? 还有其他原因导致编译器不仅仅内联所有函数调用吗?

4
Callable <T>和Java 8的Supplier <T>有什么区别?
在CodeReview提出了一些建议之后,我一直在从C#切换到Java。因此,当我查看LWJGL时,我想起的一件事是,每次调用都Display必须在Display.create()调用该方法的同一线程上执行。记住这一点,我整理了一个看起来像这样的课程。 public class LwjglDisplayWindow implements DisplayWindow { private final static int TargetFramesPerSecond = 60; private final Scheduler _scheduler; public LwjglDisplayWindow(Scheduler displayScheduler, DisplayMode displayMode) throws LWJGLException { _scheduler = displayScheduler; Display.setDisplayMode(displayMode); Display.create(); } public void dispose() { Display.destroy(); } @Override public int getTargetFramesPerSecond() { return TargetFramesPerSecond; } @Override public Future&lt;Boolean&gt; isClosed() …
13 java 


2
根据汇编语言,OOP如何在内存中组织“对象”和“类”?
内存中的对象如何组织? 例如,我知道一个函数是内存中的一段代码,它期望通过堆栈和/或寄存器的参数并处理它自己的堆栈帧。 但是对象的结构要复杂得多。他们是如何组织的?每个对象都具有与方法的“链接”,并将地址自身传递给该方法吗? 很高兴看到这个主题的很好的解释。 UPD。我提出的问题更加精确,并且我主要对静态键入语言感兴趣。

3
负号如何存储?
我正在观看有关带符号整数的最大值和最小值的视频。 以带正号的示例为例-0000 0001第一位表示数字为正,而最后7位表示数字本身。因此,很容易将其解释为+1。 现在以负符号值-1000 0000为例,结果为-8。好的,计算机可以理解这是一个负值,因为它的第一个比特,但是它如何理解000 0000表示-8? 通常,负符号值如何在计算机中存储/解释?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.