百科问答小站 logo
百科问答小站 font logo



王茂泽宣称其破解世界著名难题「冰雹猜想」,他的证明正确吗? 第1页

  

user avatar   yuan-chen-42-24 网友的相关建议: 
      

我们从头来慢慢阅读一下他的论文,我慢慢写,也算是减轻一下看到这个问题人的工作量。

(我还是希望作者能给一个假如找出漏洞就给一万块的悬赏,毕竟你那么有信心,何妨悬赏个一万块钱呢。如果你愿意悬赏,请在评论区留言,我当天一定看完你的论文…)

有些人评论说要我直接给结论…那我只能说这篇文章的错误非常多,引理5.1,5.2我认为都有问题。在这之前的我也不保证是对的,很有可能也存在错误…

难道有人真的以为这篇文章……它真的能够证明一个世界性难题吗…如果真的能完全用初等数学工具,那这个问题别人早就做出来了。

我一直认为,如果你要试图证明一个数学难题,那么你最基本要做的事,是把前人为这个难题做出的努力写的论文全部看一遍而且完全理解。

我不否认一些人虽然没有经历过高等教育,但他们确实具有聪明才智。比如自己从无到有推导悬链线方程的人,但这个东西别人已经做出来了,你打开一本教材,上面都有,为什么不去看了以后再说证不证明呢。

我并不歧视民科,有些人的东西如果在两三百年前,确实是有现实意义的,但在现在,我只能可惜努力错了方向。还是那句话,先看其他人的成果,再去做自己的。

这篇文章读起来理解不难,难的是阅读。以我个人的学习经验,这种写法是很明显的…嗯,外行人的写法,比如同余类一定要写成一个无限矩阵,其实只要说模几同余类就行了…看这篇文章非常折磨人。

我一直在试图把这篇文章翻译成正常人能看懂的中文写法,但是呢,难度很大,我发现两三个错误以后就没有再进行下去了。

我真的很希望作者能给审稿费,或者找身边数学系的朋友看一看。


其人在命题5中

这个命题的意思是,模4余3类进行一个运算之后,会得到3

而且这个运算是专门针对模4余3类制定的

那么这个运算,很明显不成立

我举个反例吧

15=3*4+3,那么经过一次运算,就变成了4了,4模4余0,而不是3,直接就出去了。如果再进行一次这个运算,那结果都不是整数。

既然这个运算对模4余3类都不是封闭的,那你凭什么能够一直进行这个运算呢?我不太懂,也不太想帮这位作者再看下去找理由了。


个最开始的一堆东西我就不加赘述了,大概是简述冰雹猜想,并且他讲了他的思路,也就是如果将数字划分为六类,冰雹猜想的运算法则能让所有的数都变成他划分出来的第四类中,并且第四类继续运算能够变成1。

这是这篇文章我看到的第一个迷惑点。我刚看到第一眼的反应是推导符号用在这里,但为什么就可以推导下去呢,然后我阅读了他上面论述,也算是理解了这个图的意思。所以不做什么评价了,它就是这么一个示意图。


然后他要证明第一个命题:4的r次方会在第四行这一类里面,而且行数是

然后就是他的命题2

F就是这个冰雹猜想的相关运算,进行了m次以后,他认为任何自然数进行m次运算以后都会处在第四列的位置。

(说句题外话,这里的话,写存在m,使得巴拉巴拉这样可能会看起来顺眼一点)

然后同一页的下方,有这么一个公式

这个公式的意思很好理解,但是写法还是有点怪:既然你给出了这么一个函数,它就是一个函数,不是三个函数。它只不过是个分段函数罢了,没必要给他起名123,这样子看起来会很奇怪,当然,可以理解,但就是看起来非常奇怪,你要么干脆三个函数写开来···



不是我就纳了闷了,谁的论文是这么写的啊,这是把自己思考过程的草稿写到论文上面去了吧。这个结构实在是。

他既然提到了命题1,我就先翻到下面看命题一的证明。

这一行搞得花里胡哨的,其实就是三一定整除三个连续整数的乘积,跟这个2的几次方没关系。三个连续整数自然一定有一个是3的整数倍。结论没问题,但写的····

行吧继续

然后这是数学归纳法

那么到这里,我简单验算了一下,命题一的证明是对的。

再往下不写了,先睡了,如果有人有兴趣可以留个言,我想得起来就继续读继续写,想不起来就算了····

无论这个东西对还是不对,我可以非常肯定的说,没有什么人愿意看这篇文章。理由有很多,我个人建议,作者先把该文给本校的数学系老师看,并且让他们本人推荐,这样也许会有人愿意看也说不定……


好了我回来继续受折磨了···我特么不去看组会的内容在这里干嘛呢···


命题2,其他种类的数字经过运算之后会变成他上面说的那一种数字。不过我感觉这个m得说明是有限次步骤还是无限次步骤,有限次步骤的m意义更大一点,无限次的话能不能用都感觉不好说。

然后是先证明,这个东西我没有发现什么问题

然后是要证明如果e是6n+2的形式,那么经过一次或者两次运算之后,它可以写成6k+4的形式。

该证明也没有问题

命题三,第四类中的元素进行两到三次运算之后,还会回到4类里面来

那么经过第一次运算,会变成以下两个类别,n模13的时候是6n+5形式的,n模24的时候是6n+2形式的

那么在n是2的倍数时,6n+5的形式的数可以在一次运算以后进入第4类√

对于6n+2形式的数,一次运算以后

这里面已经进入第四类的不谈,如果进入了第一类,在进行一次运算以后还是会进入第四类

那么命题三的运算部分是没有问题的


然后就是第一部分的结束

其人认为,可以将冰雹猜想等价转化为任何自然数n,都可以经过

这个公式的运算变成1.

这明明比原猜想更加复杂了吧···

那么这个是不是成立的呢,让我们来看一下。

他说F(x)这个变换本质上是行序数n的变换

那么能不能用本质呢,我觉得并不能。但这个能不能等价,我觉得是可以的,如果能够证明任何一个数的行序数在进行过有限步骤的运算后会降为1,那么第一行的六个数都是已经确定满足条件的,确实是可以的。


这个运算给的理由也很简单,就是根据这里来的。也就是说,第四类的行序数在经过运算之后最多变成这三种形式。

看这篇论文真的是精神污染,他证明的手法非常简略,我相信高中生都能看得懂,但他写的方式实在是很奇怪,语言也非常奇怪,带有很浓重的民科色彩。

第二部分的研究对象就变成了一个新的4*无穷的矩阵

然后又来了一个推导符号的图

我说实话我现在是看不懂他这个图是什么意思的,特别是(1 3)这个表示,我不知道谁写论文会把一个没有定义的东西写在前面,反正我不这么写。但我们不在乎这个东西,继续往下看。

第四个命题,如果自然数在124行,经历过运算之后会变成第三行也就是模4余3的数

引理4.1,n在经过运算之后不会变成n

其实就是要证明这是一个递减的运算。我没有去看具体证明,实在是不想看了,我们来到下一个

然后是这个,24类经过运算会变成13类,过程大家自己看吧,其实就是说任何偶数,一定是2的b次方和某个奇数的乘积。他的运算法则是能除以二那同时就要乘以3,那么经历过运算之后就会变成3的b次方乘以一个奇数。那么3的b次方乘以一个奇数还是奇数,就是这么个东西。


然后引理4.3,行数模4余1 的数,经历过一定次数运算,一定会变成行数模4余3

但这里的写法应该是不对的。如果一个数是模1的,那么它经过乘三加1再除4之后,还会是模4余1吗?他这里的意思很明显是认为它无论怎么运算,要么模4余1,要么模4余3,不会出现模4余2和4的情况。

但是比如13是除4模1的,13*3+1=40,40/4=10,10明显是除4模2的,这里就直接出去了。

那么让我们来看一看下面他有没有讨论模1的数运算之后变成模4余4或者模4余2的情况

如果没有讨论,那么证明不成立。

因为虽然证明了模2和4的数会在运算之后变成模1或3的,但是完全有可能一个数在模1和模24之间无限循环,

那么他有没有呢

如果我没有看错这个标记,他一直在反复运用第二种运算,并没有讨论是否存在在1和24之间无限循环的可能性。


但是,我们的阅读过程并不在这里结束,让我们继续往下看去

命题5,模4余三的数,最后经过计算,不停地加1再除以4,不仅保持在模4余3这个种类中,而且最终结果会变成3

这个东西很明显有问题,因为模4余3的数,我举个反例吧

15=3*4+3,那么经过一次运算,就变成了4了,4模4余0,而不是3,直接就出去了。如果再进行一次这个运算,那结果都不是整数。

既然这个运算对模4余3类都不是封闭的,那你凭什么能够一直进行这个运算呢?我不太懂,也不太想帮这位作者再看下去找理由了。


user avatar   yuhang-liu-34 网友的相关建议: 
      

这老兄的论文发在Advances in Pure Mathematics上。这期刊名字我看一次笑一次,真有人把它和著名二区期刊——Advances in Mathematics 搞混的。。

我发下他们近期文章列表给大家看一下:

Articles - Advances in Pure Mathematics - SCIRP

随手一翻就是N多个大猜想的证明:The Proof of the 3X + 1 Conjecture

A New Method to Prove Goldbach’s Conjecture

Very Original Proofs of Two Famous Problems: “Are There Any Odd Perfect Numbers?” (Unsolved until to Date) and “Fermat’s Last Theorem: A New Proof of Theorem (Less than One and a Half Pages) and Its Generalization”

Geometric Proof of Riemann Conjecture (Continued)

这水平简直吊打四大啊。说起来我想起另一件事情。有一次Yau在哈佛组织召开庆祝JDG建刊多少周年的会议,开幕词上他说,他曾经考虑过把JDG改名为Journal of Geometry,把differential去掉,因为现在接受的很多文章并不是微分几何领域的。这个想法一提出就立刻被大部分几何同行们及时制止了。。后来他想想,老牌期刊不改名确实是明智之举。“老用户”们可能把新名字期刊当成野鸡期刊。。

所以同学们以后看期刊名字一定要看仔细啊,一个单词都不能错。差一个单词就从顶刊变成了,hhh。还有另外一些雷,比如有个期刊叫 Annals of Mathematics and Physics. peertechzpublications.com

自己看看里面的文章判断下吧。如果自己判断不了,看看这个期刊有没有被SCI收录。名头听起来很响亮但连SCI都不是的数学期刊,基本都是乐色。


user avatar   plel 网友的相关建议: 
      

鉴别数学民科小技巧:

对于哥德巴赫猜想、孪生素数猜想、黎曼猜想、冰雹猜想(3x+1问题)、费马大定理、P和NP问题这种顶级世界数学难题,

使用非常初等的数学来证明(优秀的高中生都可以看懂里面的数学公式的,例如你只能看到一堆加减乘除同余公式来证明著名数论猜想),你甭管他啰嗦了多少页, 是个错误的证明。

通过这个技巧,大家来检阅一下这篇文章吧。论文是开放下载的(open access),可以直接打开链接。论文网址如下:


这个证明是正确的概率 ≤ 国足2026年世界杯夺冠的概率。



为了对比一下,我截图了一些著名定理的证明给大家一个感性的认识,让大家感受一下高等的数学是什么样子的。

1)陈景润关于“1+2”定理的证明:

2)Andrew Wiles证明费马大定理的论文:

3)张益唐在孪生素数问题上的突破,证明了“存在无穷多个之差小于7000万的素数对”。

4) 望月新一关于ABC猜想的悬而未决的证明。

我不是说初等证明就一定是错的。而是说这种世界难题的关注度极高,无数的数学天才都为之努力。如果真的有初等证明,早就被发现了,还能轮得到民科吗?


user avatar   bai-jing-hei-zi-11-96 网友的相关建议: 
      

Lemma 5.2 的证明是有问题的。这个引理在证明一个很强的结论:

简单标一下,这里的 表示某个模 余 的数。 定义如下:

论文第 4 节证明了 3X+1 猜想和下面的猜想是等价的:对任意正整数 ,不断令 ,则一定能在有限次内使得 。这里姑且认为这个证明是对的。Lemma 5.1 证明了任意一个数经过有限次 后一定会变成一个模 余 的数,这里也姑且认为这个证明是对的。Lemma 5.2 则要证明,模 余 的正整数 经过有限次 之后能变成一类形式很特殊的数。

但它只用归纳法证明了

也就是说,它只证明了:形式很特殊的数在变化过程中一定会保持模 余 ,而这些数以外的数一定在某一次操作的时候不再模 余 了。但这显然是推导不出“每个数都会变成形式很特殊的数”这样的结论的。

也许其他地方还有错误,欢迎在评论区交流。


user avatar   yi-xin-wei-ni-55 网友的相关建议: 
      

搜了一下这个杂志,八九不离十是掠夺杂志。

这么说吧,我写篇文章说闻牛屁能治胰腺癌,只要不错别字连天,文章段落格式符合正常人写作方式,交上版面费就能发表。


user avatar   knowone-33 网友的相关建议: 
      

比较无聊,慢慢理一下这篇文章吧. 这篇文章非常不好读,作者的记号真的很奇怪,把同余写成了无限行的大矩阵,模6余1的东西硬要写成 这样;而且事无巨细地详细地写上了所有完全平凡的部分的证明,连Lean里面一个linarith能解决的都要归纳证明,这文章其实比形式证明还要啰嗦... 不过反正读几十上百年前的数学文献也日常处理非标准的记号和说法,好多(美国的)作者写东西也大段大段废话,所以这个也不是不能看...


3x+1问题现在比较流行的版本是这样的:

令Collaz函数 . 对任何正整数 ,迭代序列 最终是 循环.


这篇文章首先是通过模6分析,把3x+1问题化归到了一个类似的问题:


令函数 . 对任何正整数 ,迭代序列 中最终会出现 .


这个看起来就很像Collaz在1930年代提出来的最早的变种,只有 那个情况迭代公式不一样...不过3x+1问题早期的历史实在是不好追溯,也不知道是不是真的有过这个变种.


回到文章,作者此时又开始了一波模4分析,重点在于文章里面的Lemma 4.3:

如果 ,则对某个 有 .

这里就是文章开始出错的地方. (文章里面这个引理里面 全部打成了 ,只能认为是排版错误了,不然这个引理及其证明就没有任何正确的地方)这个命题当然不能说错,因为3x+1猜想成立的话这个命题也是对的(总得出现一次 ...)但文章里面给的证明让人看得云里雾里. 作者声称用归纳法证明的两个命题即使正确,也无法得到引理的证明. 不过这一部分的逻辑太过于混乱,理不清楚.

(Un)fortunately, 我们也不需要去理顺它,因为文章里的Lemma 5.2整个就是错的:

如果 ,则若干次(可能是0次)迭代之后结果可以写成 的形式

这个是错的, 就是反例. 即使是认为作者想说的是 而不是 也是这样. 接下来作者证明的就是 迭代之后一定会到达1,这大概是可行的,当然这个集合在自然数中非常稀疏.


(引理4.3的证明中,作者一方面要证明 迭代下的性质,另一方面却似乎一厢情愿地想要让 “按照他想的来”,也就是只对 的所有迭代都是模4余1来讨论,逻辑混乱之间就直接忽略了模4余1而迭代之后模4余2之类的情况. 引理5.2看起来也是类似的问题. 然而3x+1问题的困难之处就在于不管是用 还是用 来陈述,迭代之后我们立刻失去了对奇偶性/模4余数的控制,也就无法知道下一次迭代该用哪一个分支来计算.)


于是不停搞模6模4的方法没有解决3x+1问题. 这篇文章的粗浅尝试可以说并没有碰到3x+1问题的皮毛. 至于这一类的方法有没有可能解决3x+1问题...万一不停地模6模4这样下去,然后出现无穷递降了是吧,也不一定的,有人想去尝试就去呗... 但是要是真的出现了无穷递降,3x+1问题就会失去所有的数学内涵,成为一道欺骗无知中学小朋友的超复杂竞赛题.


user avatar   warmwine 网友的相关建议: 
      

很少有人不基于框架直接写GUI界面啦,我这个回答就从GUI框架反过来推什么语言做GUI合适。(只聊桌面端GUI编程框架)

Qt

几乎是C++领域最流行的跨平台桌面端软件开发框架了,这个框架是两个挪威人在1995年创建的,发展至今可以说历史相当悠久,稳定性也很有保障。很多大公司都在用它做界面比如金山的WPS。

它内置了自绘引擎,也就是说界面上的一个按钮,一个文本框,都是Qt的引擎自己画的,这保证了基于Qt开发的软件界面在不同操作系统上看起来是一模一样的。

它提供了大量的与界面无关但与软件开发息息相关的API,比如、网络、文件系统、剪切板等,而且让这些API在不同的操作系统下都有效,这极大的节省了开发人员的时间。

但它也有一些缺点,比如在处理一些特殊需求上很不方便,比如:目前Qt有没有比较好解决高分屏下缩放显示的方案?Qt没有真正完美的无边框解决方案吗?等,在一些组件的渲染上也会出一些隐藏的较深的问题(QListItem),一旦遇到,就很难解决。

Qt近年来不太专一,qml,qtquick等,搞了很多,而且这些新玩意儿一直不温不火,有些模块做了又废弃了,比如:qt script,搞来搞去,搞的模块繁多且复杂,用起来不是很舒服。

Qt有界面描述语言(XML描述界面),可以通过设计器拖拽空间设计界面,编译期界面描述语言被转义成C++代码,性能上没啥损失。

Qt商业授权不太友好,开发商业应用一定要谨慎,之前听说有公司为此付出了高额的版权费。个人开发者可以免费使用。Qt的免费版本不允许静态链接,会有版权上的限制,但开发者还是可以通过一些特殊的编译方法静态连接Qt的库的。

除了使用C++开发Qt应用外,开发者还可以使用其他语言开发Qt应用,最流行的就是使用Python基于PyQt做Qt应用了,其他语言的绑定不是很成熟,但PyQt仍然有版权的问题。

GTK

GTK是1997年创建的,也非常成熟稳定,是C语言开发的,但有很多语言的绑定,比如官方支持的JavaScript、Rust等,当然用C++语言操作GTK也很方便,它也有自绘引擎(Cairo),也提供了大量系统相关的API,商业授权也非常友好,基于GTK开发商业软件不用担心收到律师函的问题,虽然它是一个跨平台桌面软件,但它似乎只在Linux操作系统领域流行,有非常多的Linux桌面软件都是基于GTK开发的。

这也直接导致GTK的维护者很重视Linux领域的发展,而忽视Windows和Mac领域。这个框架提供的很多API,只在Linux下有,Windows和Mac下没有。这样的API数量众多。甚至在Windows下编译一下GTK的源码都要比Linux下难很多。而且GTK的渲染引擎在Windows下性能表现也不如在Linux下好。

GTK在Windows上也没办法静态连接,它到不是因为版权的问题,而是它依赖MSYS2的一些库,这个库用于在Windows上模拟Linux环境,这也是为什么GTK在Windows上表现不佳的原因之一。

另外,由于GTK是C语言开发的,所以开发风格也很C语言化,这对于部分开发者来说可能觉得繁琐。

wxWidgets

wxWidgets是1992年英国的一个大学教授开创的跨平台GUI软件,也非常成熟稳定,商业授权非常友好。它没有自绘引擎,而是对不同平台下的界面API做了整合和封装,这样开发者在Windows下开发的软件看起来就是Windows窗口风格、Linux开发的软件看起来就是Linux窗口风格,这对于某些软件来说,正是他们想要的,但要想搞一些花哨的特效就没那么容易了。它同样也提供了大量的系统相关的API供开发者使用。

它是C++开发的,所以对C++开发者非常友好,除此之外它还支持静态连接,也就是说开发个应用不用分发给用户一大堆dll,当然Qt也支持静态连接,但是你得自己编译Qt的源码(不是很方便),而且Qt的授权规则也不允许普通开发者这么做。

它会有些小问题,比如我之前提的:wxEVT_NOTIFICATION_MESSAGE_DISMISSED event emit twice,但总体来说还是非常稳的。除了开发的界面比较死板外,没啥大的问题。目前使用这个框架开发软件的人越来越少了。

FLTK

fltk是1998年创建的跨平台开源GUI框架,历史悠久,商业授权友好,而且C++之父也用它,它非常轻量级,支持静态连接,一个简单的应用编译后只有500K左右,非常赞,

它有自己的自绘引擎,没记错的话用的是OpenGL,但它的重绘机制是按区域重绘的,如果组件A所在的区域上存在组件B,那么A组件重绘时,会把B组件的给重回掉,开发者必须自己写代码处理这种情况。想象一下,如果你想实现一个A组件fade out的同时B组件fade in的效果,就会非常麻烦。

FLTK提供的一些组件样式都比较刻板,绘图API也比较少,你想实现一个漂亮一点的圆角按钮(它内置圆角按钮的圆角大小是不能改的),必须自己画,而且还得借助一些非常奇葩的手段才行(如果你想知道,可以联系我)

它是C++开发的,但API不够现代,用起来总体还算舒服的,它有Rust绑定:fltk-rs。它的用户比前面三个都少。它提供了一些与界面无关的操作系统API,但非常少,几乎可以忽略。

Duilib

是2010年国内一个开发者开发的GUI开发框架,因为底层基于DirectUI开发,所以只支持Windows平台,不支持跨平台,开源协议友好,商用没有任何问题(需要附加Lincence文件),国内有很多大厂基于这个技术做桌面端应用,比如网易、腾讯、百度,这个框架是基于C++开发的,对C++开发者友好。但框架本身还有一些问题,比如对高分屏支持不佳、特殊控件绘制上也有一些小问题,除了界面相关的API外,几乎没有提供系统级的API,作者纯粹是用爱发电来开发这个框架,所以更新不是很及时。

相对来说网易基于Duilib开发的分支更完善一些:NIM_Duilib_Framework,添加了高分屏支持、多国语言、整合了多线程处理的支持,但环境搭建相对比较麻烦。如果开发者要用这个框架,一定要用develop分支下的代码,master分支下的代码问题很多,这个框架看上去也是作者一个人努力的成果。

Sciter

Sciter是2006年创建的跨平台闭源GUI框架,足够稳定,商业授权不友好,但个人开发者可以随便用(只能用动态链接库),一旦公司规模超过3人,就得买版权了(有权静态连接)。

它内部封了一个浏览器核心,让开发者使用HTML,CSS,JS来创建界面,但对这个浏览器核心做了大量的精简,不像Electron和NW.js动辄上百兆的体积,它只要6M就够了。当然这也意味着有些浏览器特性它是不支持的,比如CSS3的flex布局,它就不支持(但它提供了自己的flex布局实现方式)。以前它使用自研的一个脚本语言(和JavaScript很像),自从集成了Fabrice Bellard大神的QuickJs之后,就全面支持JavaScript了。它还对一些特殊的场景做了内置的支持,比如渲染大列表。

它使用C++开发,对C++开发者很友好,有Rust、go、Python等语言的绑定,但都是社区提供的,质量堪忧。有很多知名厂商都用这个库做界面,比如360、teamviewer、赛门铁克等。

RmlUi和Sciter很像,可以看成Sciter的替代框架,但RmlUi这个项目有三界作者,一个一个的弃坑不知道新任作者会不会弃坑,目前还不是很成熟,比如我正在尝试帮作者解决的CJK输入法的问题,目前还不推荐大家使用这个框架。

CEF

CEF是2008年创立的,基于Chromium的跨平台GUI框架,稳定且商业授权友好,国内很多大厂都用的CEF:比如微信桌面端、网易云音乐桌面端、QQ桌面端、微信桌面端、MATLAB、FoxMail、OBS Studio,装机量破亿。

由于它几乎封了一个完整的Chromium,所以体积非常大,但支持所有的HTMLCSSJS特性,它几乎不提供任何与操作系统相关的API,创建个托盘图标、读写个文件啥的,都要开发者自己完成,它是C/C++开发完成的,对C++用户非常友好,它有gopythonjava等语言的绑定,但都是社区提供的,质量值得担忧。

它对Chromium封装的很好,避免了开发者直接与Blink、V8、Chromium等复杂的代码打交道,很多功能都有默认实现方式,遵从约定由于配置原则,有经验的C++开发者可以很轻松的驾驭CEF框架。

由于Chromium是版本弟,所以CEF版本发布也非常频繁,很多被标记为稳定的版本,还是会出一些莫名其妙的问题,选一个好的版本非常重要。

与Electron一样,它也是分主进程和渲染进程的,所以开发者要非常娴熟的运用跨进程通信的技术,虽然CEF提供了跨进程相关的API,但复杂度还是有点高的,使用的时候要认真细心。

MAUI

这是微软的跨平台GUI框架,不仅仅支持桌面端,还支持移动端,但官方并不支持Linux的桌面端(黑人问号,感觉与微软近些年向开放、开源的大方针相悖),这个框架新的狠,至今还没发布稳定版。目前还没什么人用。而且不知道将来会不会被微软放弃。

它是.NET平台下的GUI框架,有自绘引擎,对C#开发者很友好,界面依然是用XAML描述的,可能很多人一听到XAML就直接弃坑了。XAML表现力确实弱一些,我觉得WPF没火起来跟XAML有直接关系。

使用这个框架开发桌面应用得封一个.NET框架给用户,当然有了.NET框架应用程序访问一般的系统级API也就不成问题了。

Compose Multiplatform

这是JetBrains搞的跨平台GUI框架,也非常新,前段时间刚刚推出1.0.0版本,但这个版本还不是很稳,至少比Flutter Desktop的第一个稳定版要差很多。同样也几乎没什么人用。

它的自绘引擎用的是Google的skia,这个自绘引擎稳的很,Chrome和Flutter都是用的它,所以排版、绘制、渲染之类的工作不太会出问题。比Java生态圈里的Swing和JavaFx要好很多。

JetBrains的东西当然对Kotlin开发者友好啦,Java生态下的很多东西你都能用,访问系统级API也没啥大问题,同样也得考虑封一个JRE给用户。

flutter-desktop

这是谷歌的跨平台开发框架,开源、免费、文档齐全、投入力度大且持久,同样也新的很,Windows版本刚刚发稳定版,Mac版本还没稳定。

如果你完全没搞过移动端的flutter,想用这个框架开发桌面应用,那么意味着你要学的东西还挺多的。好在dart和flutter入门都不是很难,学习曲线比较平缓。

由于flutter在移动端积累了很多年,所以界面上的一些东西在desktop端都比较稳(skia自绘引擎),与操作系统相关的东西还不成熟,生态也不太好,比如你想订制一下窗口的标题栏,想访问一下注册表这类工作可能得自己想办法。不过它有类似FFI的支持,跟C/C++语言打交道很方便。

开发者直接使用Dart语言描述界面,这会导致众多大括号嵌套在一起的问题,可能很多开发者不习惯。

webview2

这是微软Edge浏览器团队推出的跨平台GUI引擎,是闭源的,目前只支持Windows,对C#和C++开发者友好,如果使用C#开发,就得考虑把.NET运行时分发给用户,如果使用C++开发,就得自己处理系统级API的操作,webview2本身是不对系统级API做封装的。

这个框架推出也没多久,很多API也还不稳定,更值得担忧的是这个团队,他们前不久刚刚放弃了自己的浏览器核心转而使用Chromium浏览器核心,不知道他们会不会放弃webview2这个框架。

它的优势是可以复用系统当中已存在的webview2二进制资源,也就是说它虽然封了一个Chromium浏览器核心,但如果你可以确定客户电脑已经存在了基于webview2开发的应用,你的安装包体积可以足够小。

它也是多进程架构,甚至比Electron还要多一个进程(为了复用二进制资源),资源占用比较多。

webview

这个库使用操作系统的浏览器引擎来达到减小安装包体积的问题,Mac上使用Cocoa/WebKit,Linux上使用gtk-webkit2,Windows 10上使用Edge(也就是上一个小节里提到的webview2),它应该是不支持Win7的。开发者要考虑前端代码浏览器兼容的问题。

开源且免费(MIT)有go、Rust、Python等语言的绑定,不过官方支持的是go语言,C和C++,操作浏览器的API非常少,不支持自定义scheme,更别提系统级API了。

TAURI

采用的技术方案与webview类似,所以安装包也足够小,非常新,还没发布稳定版,开源免费。webview框架碰到的问题TAURI都有,

使用Rust开发,将来会支持Deno,作者说将来会直接使用webview的技术来支持多平台,

NW.js

NW.js最早把Chromium和Node绑定到一起,用前端知识做界面,用Node技术访问操作系统,最早叫node-webkit,在2012年创建。NW.js基于MIT开源,可以无忧使用。没记错的话,微信小程序开发工具是用NW.js开发的。作者是英特尔的员工,英特尔的一些工具也是用NW.js开发的。

除了Chromium和Node的能力外,NW.js自己也封装了一些系统级API,类似托盘图标、剪切板、系统菜单这种,但数量明显比Electron要少。

NW.js可以在多个窗口间共享同一个Node.js上下文,而且还可以通过配置让Node的上下文和Dom上下文混合,这给开发者带来了很多便利。心智负担减少很多。不像Electron要时刻想着进程间通信,哪些模块当前进程不能用这类问题。

NW.js虽然起步早,但奈何没有杀手级应用,周边的生态和工具链没发展起来。用的人越来越少,维护的投入也不如Electron大,再加上Chromium更新非常频繁,导致NW.js的有些API也不是很稳,恶性循环加剧。

Electron

Electron的作者曾经在NW.js团队工作过(NW.js项目贡献第二多的人就是Electron的作者),后来辗转到了github公司,于2013年在创建了Electron,也是个开源免费的产品。由于VSCode、slak等国际型产品都选择了Electron,所以从者甚众,生态和周边工具链也完善的多。虽然开发方式上有点蹩脚的地方(多进程架构及模块归属进程),但瑕不掩瑜。

Electron每创建一个窗口都会多一个进程,这使Electron创建窗口的效率不高(秒级),NW.js有复用进程的机制,即使新窗口加载完全不同域的页面也不会创建新的进程(毫秒级)。这也是为什么很多基于Electron开发的应用都使用Dom模拟弹窗的原因。

无论是浏览器相关的API,还是系统级API,Electron提供的都比NW.js多。

--------2022-02-25更新--------

这些框架除了对开发者使用的编程语言有要求外,还有一个重要的差异就是有没有独立的界面描述语言(也就是UI DSL),这非常重要,涉及到一个框架表达业务的重要能力。

类似XAML、qt的ui文件、HTML+CSS都是界面描述语言,下面这种也可以算界面描述语言,但我感觉它不够纯粹(flutter、qml和Compose Multiplatform都是类似这样的):

       panel {   row {     checkBox(...)     row {       textField(...) // indented relatively to the checkbox above     }   } }     

但无论如何,显而易见的是,没有任何一个界面描述语言能比的上HTML+CSS组合。想想看:HTML里各种花里胡哨的语义化标签和Dom操作技巧,CSS里的布局方式、伪元素、动画描述...,对比之下你就会觉得XAML、qml直流都是弟弟。

除此之外,一个优秀的GUI框架还有两个重要的需求,这里我简单聊聊:

强大的事件处理机制必不可少。

想想这些:鼠标事件、键盘事件、触屏事件...界面加载完成、媒体播放结束、元素大小改变...网络状态变更、数据段传输完成...另外,还得处理事件冒泡、事件捕获、事件分发吧...

qt的开发者曾经说过qt的SIGNAL和SLOT机制是有性能问题的(但影响很小)

强大的异步处理机制必不可少

你不能在用户处理业务逻辑的时候,让界面渲染工作阻塞,这就需要一个强大的异步处理机制,让开发者自己去开线程去完成业务处理,无疑是又麻烦又会增加开发者的心智负担。

我记得很早之前在C# WinForm应用中,点击一个按钮,如果不用Invoke执行逻辑处理的话,界面就会卡死。

这么看来,在你的GUI应用里包一个浏览器核心还是挺有必要的,这样你就可以用HTML+CSS强大的能力来描述你的界面,用JavaScript强大的事件处理机制和异步处理机制来完成用户交互。

可能有人会想,这会带来很多问题呀,比如应用体积会增大的100M以上、会占用更多的CPU和内存资源,还会更耗电等等。

确实,目前来看这些都是问题,但仔细想想,这些问题应该不会持续太久,网络会变的更快,用户的磁盘和内存会变得更大,CPU处理能力也会更好,耗电的问题当然会持续存在,甚至会愈发耗电,但电的供应会持续增长呀。

web相关的技术之所以胜出,并不是这些技术的设计者有多厉害,而是这20多年间,有大量的人涌入了这个领域,前赴后继的推动着它前进。其他任何一个领域都没有这么热火朝天的景象。推荐大家看看我的另一个回答:

------------2022-02-27更新----------

用Web相关的技术做GUI应用的优势是,让开发者可以把大部分精力投注在业务本身上,而不是处理与GUI相关的技术细节。

实际上所有的框架,都应该是这个目的,比如ORM框架,目的应该是让开发者把大部分精力投注在业务与数据之间的关系上,而不是管理关系型数据的技术细节。

当然这肯定是有损耗的,在性能、稳定性、资源消耗上,都会有所削减。而且,因为有框架的存在,开发者很难深入到框架内部做一些特殊的事情。比如,我们该如何修改HTML的排版渲染机制呢?

所以,有些框架注重性能,有些框架注重开发效率,开发者做选择题的时候也应该衡量这两个问题,你的应用对哪些方面要求多一些呢?

你如果要开发一个视频监控系统,没多少业务功能,但要24小时不间断的记录视频数据,随时调取某一段时间的视频数据,这种应用可能Qt是最好的选择。

你如果要开发一个类似飞书的团队协作应用,业务逻辑复杂的一塌糊涂,而且要在短时间内满足更多用户的需求,占领更多的市场,那么Electron可能是更好的选择(目前飞书已经不再用Electron了,他们自己编译了Chromium核心,自己封了一个类似CEF的框架)

目前微软、谷歌、JetBrains等公司都非常重视桌面端开发框架,也在推各自的框架产品,说明桌面应用领域并没有没落,反而应该更加受到重视。

虽然移动端应用大行其道,但我认为,只有生活、社交、轻娱乐等方向上的应用在移动端有较好的发展。文档协作、大型游戏、开发工具、专业管控软件等应用还是在PC端发展的更好一些,毕竟PC端有更多样的输入输出设备、更广阔的显示和交互的空间,更强的存储和计算能力。

希望桌面软件开发领域的从业者都能获得幸福。

满屏荒唐言,一把辛酸泪,一把辛酸泪,一把辛酸泪...





  

相关话题

  无穷维流形是什么意思? 
  一个袋子里有n个球,都是红球。现在拿一个球出来,放一个蓝的进去,重复n次过后红球占比? 
  n! 和 n²,哪个更大呢? 
  流汗黄豆有什么数学表达? 
  如何理解矩阵的「秩」? 
  这个极限怎么证? 
  如果把一个完美球放在平面上,接触地面的面积是不是为0? 
  这种积分怎么算? 
  拥有一个对数学敏感的孩子该如何培养? 
  广义反函数的定义及该定义的相关说明(问题描述)? 

前一个讨论
如何成为那种一点就透,悟性很高的人?
下一个讨论
如何看待 SpaceX CEO 马斯克当选美国工程院院士,是实至名归吗?





© 2024-05-09 - tinynew.org. All Rights Reserved.
© 2024-05-09 - tinynew.org. 保留所有权利