最适合做 GUI 的是 DSL 或者 XML(以及 XML 的扩展)之类的标记语言,而不是编程语言。

例如 Qt 的 QML,Android 的 XML 或者 WPF 的 XAML 以及大家都再熟悉不过的 HTML/CSS,包括 JavaFX 也有 FXML。

一门编程语言如果想更适合定义界面,那么它的语法就得往 DSL 方面靠拢(或者支持 DSL 风格)。

作者:绅士喵
链接:https://www.zhihu.com/question/276815517/answer/390718261
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

作者:曹之忽
链接:https://www.zhihu.com/question/276815517/answer/402998275
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

GUI这个东西的特性就是变化多端,细节复杂,需要怼大量人力完成。所以适合GUI的语言,必然是可以节省人力的特性。从编程语言角度,越能更快给到编程者反馈,语言写法越接近最终成品的用户界面,基本是更好的。

0. 书写简单。语法简洁,杂音少,不需要写boilerplate。支持function closure是基础了。Kotlin里UI DSL还有大括号实际上也不是特别干净,最好能像CoffeeScript一样用缩进表达。

  1. tracing Garbage Collection。这一点也是书写简单,比如C/C++/Rust都不适合写GUI,一个视图的生命周期或者归属权需要想清楚在GUI编程里太难了,就算想清楚了明天界面一变就又不对了。连objC的refcount都感觉有点麻烦。
  2. 类型系统柔韧灵活。GUI编程套路太杂,成天又变。最好是structural typing,像GoLang或者TypeScript一样。能临时定义个类型或者类JSON的对象传出去是最好的。
  3. 能反映视图的DSL。能通过看代码的视觉形状想象出GUI形态是增加效率的重要手段,过程式地创建UI太啰嗦不直观 。实际上不仅是视觉组件可以对应到DSL,组件上的事件处理(比如click handler)和样式最好也能直接写在DSL上。除了直观的好处,还能结合逻辑代码动态创建视图,这点是写模板(XML/HTML)做起来稍微麻烦点的。
  4. 能快速反应代码变化。参考webpack的hot module reload和flutter的hot reload。上面说了UI是需要大量人力的,调整细节就是其中一项。hot reload是GUI语言加速开发减少人力最大的利器。
  5. 语言自带异步编程。UI编程有大量需要等待用户输入/资源请求的场景。语言级别的异步编程非常重要。比如async/await的语法就是一种支持,或者Rx作为标准库也是一种支持。Golang那种CSP的异步模型就不太适合UI编程,还是太罗嗦不直观。异步编程到底怎么支持才好还没想透彻,但是GUI语言自带异步编程肯定是必需品。

总之就是怎么写得快怎么好咯。如果综合上面几点,最好的GUI语言就是

CoffeeScript的语法 + TypeScript的类型系统 + Kotlin的语法糖DSL + Dartlang的热加载 + C#的async/await/Rx

 

与其问什么语言最适合做 GUI,倒不如问做 GUI 需要语言/框架具有哪些特性。

首先用代码来“画”界面在现在来看是很怪异的,所以用 DSL + 完善的布局系统来写界面一定是趋势。对应的技术有 WPF、Qt Quick、JavaFX、Android Layout XML...

其次,界面不能脱离了数据,而如何将数据与界面之间建立起关系是至关重要的,双向数据绑定无疑是最好的实现方法。对应的技术有 WPF、Cocoa、各种 Web MVVM 框架...

最后还有交互,交互是一件很复杂的事情,不要试图用函数式的思想去解决这个问题,交互一定需要命令式的编程方式,而实现交互最基础的一点就是事件系统,如何将视图里的控件事件与一段逻辑代码联系在一起?看看 Qt Signal/Slot 和 Cocoa 就知道了,这点需要一个语言特性叫反射。

作者:Cyandev
链接:https://www.zhihu.com/question/276815517/answer/401765634
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 
作者:银杏林守望者
链接:https://www.zhihu.com/question/276815517/answer/389957690
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

按照我的理解,适合写gui的语言应当有这些特点

  1. 自带DSL,这非常重要。MFC可以认为是用c(oo都谈不上。。)来过程式的生成界面,delphi是界面和代码分离,界面是二进制/后来记得是xml。 java swing 也是用代码生成界面,IDE生成的代码上面一堆的警告让你别动也是无奈。。。 语言自带DSL可以极其优雅的用语言本身生成界面并且DSL这玩意更加容易IDE友好
  2. 面向对象,这个不解释。
  3. 支持函数式编程,开发GUI过程中挺重要的,函数可以作为一等公民的话可以极大的简化GUI开发中的事件处理,对比js写界面和java(8以前)就深有体会
  4. MVC,事件驱动,模型传递。
  5. 简单
  6. 最好跨平台

大概就这么多,要我说,我认为最适合的语言是

  • kotlin 但是目前kotlin没太好的界面库,swing和javafx都是迷之尴尬,而且太重,不过按照jetbrains的野心,用kotlin重构GUI是一定的事情
  • 未来的typescript,呃不是ts/js+h5,h5作为DSL还是很破碎和尴尬的。node上要是能搞个界面库,用ts/js来实现原生gui是很不错的。不过貌似没有人蛋疼去做这个事情毕竟有webkit。呃,对了国人有个ide做的挺好的,就是js实现windows界面开发,那个写起来比h5爽多了
 
可以用C/C++做底层渲染引擎,然后用各种标记语言搭建界面,HTML, Qt的QML都是这种模式,理由是标记语言具有不用编译,所见即所得,可以做出美观的界面。
 
 
 

ui 的关键部分

我个人觉得应该分为四个部分。

第一:排版(包括布局)

第二:附加属性(外观 颜色 边框 阴影 行高 字体)

第三:事件(交互)

第四:数据

以上主要是对目前前端 这种UI范式进行的总结。

而排版(或布局)需要一些比较自动化得 约定和机制。以便于确保 编程人员不用过多得考虑排版(反面教材就是winform 具体位置点这种的是最差的)。

附加属性这个完全可以参考css 这种 设计模式。

事件和数据 没啥好说的 参考下 类似 angularjs 或者vue 这种双向绑定就是了。

那么到底需不需要标记语言呢?

不一定。

因为也完全可以用 编程语言来布局。关键是api的设计而已。

作者:ggff ss
链接:https://www.zhihu.com/question/276815517/answer/423970001
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 
这取决于计算机语言所拥有的图形用户界面库 库写的好就好

UI语言杂集的更多相关文章

  1. 跨平台移动开发UI语言 -XAML

    Xamarin.Forms 把XAML (Extensible Application Markup Language, XAML) 带进了ios,android的界面开发,也就使得使用Xamarin ...

  2. [Asp.net 5] Localization-Asp.net运行时多语言

    本节介绍的是Microsoft.AspNet.Localization工程.该工程是运行在Asp.net 5环境中的运行时多语言设置. ASP.net 5中间件技术 在新的Asp.net 5中,可以将 ...

  3. ios获取当前语言

    上代码: + (NSString*)getPreferredLanguage { NSUserDefaults * defaults = [NSUserDefaults standardUserDef ...

  4. windows官方多语言方案

    编写 Win32 多语言用户界面应用程序 Windows 2000 针对全球市场制定了新的增强支持标准,提供了许多国际化功能,例如完全支持 Unicode.预设支持数百种语言以及用于从右向左语言的镜像 ...

  5. 本地化SilverLight应用程序(多语言支持)

    原文 http://www.cnblogs.com/seaworm/archive/2010/11/30/1892325.html 利用资源文件(Resources File)使SilverLight ...

  6. Flex 国际化(中英语言适配)

    原文地址:http://www.cnblogs.com/meteoric_cry/archive/2011/01/13/1934404.html(由于此贴时间久远,已做微调) 1.新建Flex Pro ...

  7. WPF 多语言解决方案 - Multilingual App Toolkit

    1.首先安装Multilingual App Toolkit   2.新建项目,在VS中点击"工具" -> "Multilingual App Toolkit&qu ...

  8. 在SOUI中使用动态多语言切换

    动态语言切换是很多国际化产品的需求,SOUI之前的版本支持静态多语言翻译,通过在程序启动时设置好语言翻译模块,在程序中打开的UI都会自动调用该翻译模块进行文字翻译,但是不支持运行进语言切换. 最近几个 ...

  9. winform 不同语言(中文,英文等)

    Visual Studio 对于.NET 程序的本地化提供了完整的支持,这里仅介绍实现多语言版本本地化程序的简单步骤.注意黑体处为关键点.一. 窗体本地化    对于Windows 窗体,你需要做的第 ...

随机推荐

  1. VMware配置NAT方式下的静态ip

    一.VMware上NAT模式工作原理 原理图如下: 说明: 1.虚拟主机与本地主机通信时,直接通过虚拟交换机访问(不管是虚拟主机的ip是静态ip还是动态分配的ip) 2.虚拟主机与外网通信时,虚拟主机 ...

  2. docker进入容器的四种方法

    在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法. 进入Docker容器比较常见的几种 ...

  3. ssy-publish

    github地址: https://github.com/shangyueyue/ssy-publish 一.安装 npm install ssy-publish -D 二.在process.cwd( ...

  4. PCB Layout初学者必会知识总结(转)

    PCB是印刷电路板(即Printed Circuit Board)的简称.印刷电路板是组装电子零件用的基板,是在通用基材上按预定设计形成点间连接及印制元件的印制板.该产品的主要功能是使各种电子零组件形 ...

  5. vue 动态组件,传递参数

    <template> <div class="top"> <div class='nav'> <ul class='navHader'&g ...

  6. jeecg根据模板自定义导出

    //1.获取模板的路径: String lujing = request.getSession().getServletContext().getRealPath("/")+ &q ...

  7. Hibernate3疑惑解决

    1.session的get()和load()有什么区别?     # get()如果没有找到持久化类返回null,有可能导致空指针异常.     # load()如果没有找到持久化类直接抛出异常.   ...

  8. JS中map()与forEach()的用法

    相同点: 1.都是循环遍历数组中的每一项 2.每次执行匿名函数都支持三个参数,参数分别为item(当前每一项),index(索引值),arr(原数组) 3.匿名函数中的this都是指向window 4 ...

  9. Shell脚本中判断字符串是否被包含在内

    1.字段 grep:案例: str1="abcdefgh"str2="def"result=$(echo $str1 | grep "${str2}& ...

  10. 部署k8s时容器中ping不通

    192.168.42.120 | UNREACHABLE! => {    "changed": false,     "msg": "Fail ...