V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
paopjian
V2EX  ›  问与答

为什么安卓对其他开发语言的支持少?

  •  1
     
  •   paopjian · 2023-04-21 15:42:26 +08:00 · 1929 次点击
    这是一个创建于 589 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 win 上用 C++/java/go/python/C#多种语言都能写出一个可视化界面,但在安卓上主流还是使用 java/kotlin 使用 android studio 进行开发, 甚至 go 语言的 mobile 还是实验项目.

    为什么安卓上的开发语言适配没有像 win 一样百花齐放呢,连 IDE 局限那么几个?
    16 条回复    2023-04-23 10:34:33 +08:00
    Vindroid
        1
    Vindroid  
       2023-04-21 15:43:38 +08:00
    要这么多语言干嘛?要和前端一样学死自己吗
    westoy
        2
    westoy  
       2023-04-21 15:53:21 +08:00
    有和用是两回事

    win32 时期各搞各的是大家都不通气啊

    但现在会有多少公司去用 pyqt/pyside 或者 java fx 新开个通用桌面项目?

    前二十年开源流行起来之后, 大家都随大浪了啊, 成本最优、风险最小嘛

    就算前端, 也是 react 和 vue , 再加一个小众的 angular , 你也不会再去用 backbone 、knockout 、ember 这些对吧?
    wy315700
        3
    wy315700  
       2023-04-21 15:55:25 +08:00
    win 上你甚至能用汇编写一个可视化界面
    winterbells
        4
    winterbells  
       2023-04-21 16:01:44 +08:00 via Android
    iOS 不也一样吗
    cuso45h2o
        5
    cuso45h2o  
       2023-04-21 16:07:14 +08:00   ❤️ 1
    大部分语言都能 build 出能在 Android 上的运行的动态库吧,所以那就认为 OP 说的是 UI 框架好了。Android 上用的比较多的有 Flutter ( Dart 语言)国内厂商用的也挺多的,还有 React Native ( TypeScript 语言)国外也有一些大厂在用,Xamarin ( C#语言)之前看到一些 V 友嘲笑的荷兰 gov 做的健康 App 就是用它制作的。Windows 上常见的也就比这多一些吧。Android 上还有一些不完善的,应该就是主流的够用了再做别的意义不是很大。
    lxiian
        6
    lxiian  
       2023-04-21 16:40:22 +08:00 via iPhone
    要那么多干什么
    AoEiuV020CN
        7
    AoEiuV020CN  
       2023-04-21 18:49:48 +08:00 via Android
    反了吧,应该是其他开发语言对安卓支持少,
    对 ios 支持更少,
    Windows 可能还是用户太多,除非仅支持移动端否则都会支持 Windows ,
    agagega
        8
    agagega  
       2023-04-21 20:02:45 +08:00
    不懂 Android. 但看到有人提 iOS 的,iOS 没有虚拟机,整个都是 native 代码,OC runtime 本质就是 C 上的一组函数,Swift 和 C 也有很自然的 FFI ,所以只要你想,任何只要能和 C 互操作的 native 语言都能在 iOS 上链接到一起。看起来不火热是因为 iOS 这个市场小了而已。
    ysc3839
        9
    ysc3839  
       2023-04-21 21:32:13 +08:00 via Android
    因为 Android 提供的 API 是一套很丰富的 API ,其中有许多东西是要配套使用的,比如界面设计器等,其他语言要不然直接调用这套 API ,结果就是要自己实现很多很复杂的东西,要不然用自己的界面引擎,结果就是生态不好、性能不好,更何况 Android 使用的是 Java ,天然就有隔离。
    Win32 API 没有太多复杂的东西,简单封装一下就行。反观新的 UWP API ,也是很少第三方语言支持。

    @agagega iOS 也是提供了套丰富的 API ,其中许多功能似乎是没有开源的,印象中生成界面 nib 的工具就是闭源的,我没见过完全开源的 iOS 开发框架。其次虽然理论上说其他语言也能调用 objc 的函数,但是实际仍然是二等公民,需要自己折腾很复杂的 objc_msgSend 。而且关键是很多东西都缺示例代码,比如说我最近想用标准 C++给 iOS 应用写一段网络相关的代码,查阅苹果的 Network.framework 文档,里面直接给了一段非标准的回调函数的示例,我在网上完全找不到如何用标准 C++实现那种回调函数,估计要知道原理只能编译后逆向工程了。
    agagega
        10
    agagega  
       2023-04-21 23:35:48 +08:00
    @ysc3839
    苹果的文档确实很烂。非标准的回调函数指的是 ObjC 的 Block 吗?如果是的话那用 C++是不好弄。虽然有 ObjC++这种东西,但用苹果那套 API 写界面,最后接口都会变成 ObjC 的形状……

    Mozilla 以前给 Rust 在 macOS 上弄过一些工作。但对要在 iOS 上用非官方方案开发 App 的开发者来说,倒确实还不如用 RN/Flutter 这些技术了。
    agagega
        11
    agagega  
       2023-04-21 23:37:20 +08:00
    突然又想到一点,Win 上各种语言能百花齐放,重要的原因大概是 COM (或者构筑 COM 的那堆东西),然后因为这些东西流行得比较早,后来的技术多少会受到它的影响
    ysc3839
        12
    ysc3839  
       2023-04-22 01:00:02 +08:00 via Android
    @agagega 就是这一段 https://github.com/cntrump/nwcat/blob/0a77fcb3bd4aeb8e01991c2bdafda65937c2c6c1/nwcat/main.c#L387-L396

    我个人认为 Windows 支持的语言多不只是因为 COM ,COM 只是部分因素,更重要的还是简单。UWP API 的底层模型 Windows Runtime 也是基于 COM 的,但是少有其他语言支持,基本上都是微软自己实现的,原因应该是太复杂。
    JavenXiao
        13
    JavenXiao  
       2023-04-22 08:54:58 +08:00
    开发 Android 这不是 JavaScript 和 dart 也行[doge]
    test0x01
        14
    test0x01  
       2023-04-22 14:56:56 +08:00 via Android
    只要你系统提供 c 语言级别的完整 api ,那就能够百花齐放。
    agagega
        15
    agagega  
       2023-04-23 01:15:47 +08:00
    @ysc3839
    这个 ^ 开头的 lambda 语法就是 Objective-C 的 Block: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html

    在 Clang 里,C 也能这么写。而且 block 的类型也和函数指针不一样。如果参数指名道姓要一个 block ,那可能就只有用这个语法包一层了。
    Al0rid4l
        16
    Al0rid4l  
       2023-04-23 10:34:33 +08:00
    你说的都是 GUI 的开发, GUI 的话, 几乎所有系统想要成熟稳定生态好写起来坑少都可以归为平台自身框架, Qt, Web 三选一. 你说的那些, C++ 要么 Qt, 要么平台自身框架如 WinUI MFC, Go 不清楚估计是 Web, Python 是 pyQt, C# WPF/MAUI 这些算平台自身框架. 剩下少有人走的路自己实现渲染, 那也不符合写起来坑少了.

    至于 C# 拿来写移动端的, Flutter/RN 拿来写 Win Linux 的, Java FX 的, 甚至 Tauri, Avalonia 这样的, 都不太能算是成熟稳定生态好, 只能拿来写写个人 /小公司项目.

    Win 百花齐放其实也就这几类, C++/C# 是微软平台自身框架自己在推, 多是多, 从 Win32 MFC 到 WPF, WinUI3/MAUI, 但也是一言难尽, 你也不会想学着学着这框架就凉了.

    IDE 局限那么几个, 这世界上能叫 IDE 的总共也就几个...

    不要求 GUI 的话, 能编译到平台对应 C ABI 兼容的语言都行吧.

    要问为什么, 厂商通常都支持 C 但也不想让你用它写 GUI, 不利于推广和生态发展, 用 C 写写底层差不多得了, 没办法, 谁让操作系统都是 C 写的. 厂商只有动力推广自己平台框架绑定的语言, 语言通常也是自己的语言, Win 是 C++/C#, Android Java/Kotlin, 水果 OC/Swift, C++ 吧几个大厂一起定标准的, 厂商也不爱让你用, 这不可控. Win 用 C++ 是没办法, 谁让早年 C++ 开发多生态好其他语言又没出生, 微软也更想让你用 C#. Google 也是, Android 时候也就 Java 开发多生态好简单易学, 后面有了干儿子 Kotlin 如果不是为了兼容怕不是恨不得 Java 死, 水果更不用说, 你根本不会问出这样的问题.

    至于其他语言, 都是社区有需求自己去实现对应平台的绑定, 轻松点的绑定到 Web, Tauri 那样. 有点追求的 Avalonia 尽量绑定到原生, 没有的就自己 skia 渲染. 财大气粗的就 Flutter 全部自己 skia 撸. Win 上其他语言的 GUI 也是几十年历史积累下来的, 安卓历史连 Win 一半没到就多出了 Flutter, 可以了.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2494 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 02:27 · PVG 10:27 · LAX 18:27 · JFK 21:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.