
对WebAssembly的兴趣很大,但是到目前为止,您很少会在工作项目中遇到使用此技术的人。 当每个人都听说某事,但很少有人亲自尝试时,智能电视的应用程序开发也是“非典型的JavaScript”。
而且
Andrei andreynagih Nagih在这两个领域都有经验:他曾从事Peers.TV项目的智能电视应用程序,最近几个月对WebAssembly非常熟悉,以至于他最终在我们的HolyJS会议上对此进行了报告。 在HolyJS在线广播中,我们问了他两个问题。
现在,他们决定让Habr的读者也对它感兴趣,于是他们制作了采访的编辑文本。
(如果有人对视频格式更满意,则可以观看原始视频 ,而不是阅读帖子,)。Evgeny phillennium Trifonov:您在此处进行了有关WebAssembly的演示-是否有很多观众问题,这些问题是“理论上感兴趣的”,还是已经被发现实用?安德烈·纳吉克(Andrei Nagikh):报告发布后,我在讨论区回答了一个完全不同的问题,一个小时,令我感到惊讶的是,有这么多问题涉及整个领域。 基本上,这些问题来自“好奇”的人,但是有些人已经在使用它。 令人惊讶的是,因为这样的人很少。 有相当实际的问题。
Eugene:以前,他们曾经说过WebAssembly“成熟并开始适用”。 而现在的技术是如何“成熟”的呢?安德烈:这项技术本身已经相当有效,可以在生产中使用。 我们正在使用它。 但是问题出在工具上。 编译器本身非常不错,因为它比该技术本身更旧-可以从以前的版本中通过asm.js获得。 但是调试工具,源映射,调试器-这仍然很困难。 我认为在未来的一两年内,两个浏览器将提高这些观点。
Eugene:并且由于您最初需要WebAssembly,因此需要什么样的项目?这有什么好处?安德鲁:ByteFog是我们的项目之一,是一种用于P2P视频内容交付的技术。 我们可能会想到WebAssembly的最理想的用例。 我们已经有使用C ++编写的大型代码库,我们不想将其重写为其他语言,因此需要在浏览器中使用。 因此,此技术似乎适合此处的百分之一百。
最初,我们认为我们会接受它,只需对其进行编译就可以了。 但是,这当然不会在生活中发生,这就是为什么这份有关耙子的报告,实际上是关于如何将其全部投入生产的原因。
Oleg olegchir Chirukhin:出现的主要问题是什么?安德鲁:主要问题是我们无权访问该系统。 我们有一个本机应用程序,它可以执行任何操作。 当我们将其移植到浏览器时,除了JavaScript之外,我们无法做任何其他事情。 您需要以某种方式使用它,还需要使用浏览器API。
移植我们的应用程序的过程有条件地花费了八个月。 没错,在此期间,我们对代码库进行了很好的重构,总体而言,这是很好的。 现在我们可以将其移植到其他地方。
奥列格(Oleg):已经提到过拖曳,但是否可能更详细? 调试,跟踪,分析就这样。安德鲁:简而言之,一切都不好。 但是,美好的事物会散发出些许光芒。
好吧,编译器已经或多或少地得到了解决:它是Emscripten(我在谈论C ++,在其他运行时(Rust,Go,Kotlin / Native)以不同的方式)。
调试:Firefox支持源地图,这本身还不错。 Google Chrome浏览器仅允许您查看汇编代码,可以在此处放置断点,但是这很正常。
探查器在Firefox中效果更好,在Chrome中则差一些。 区别在于Firefox展开名称,即使名称与源代码中的名称相同。 Chrome会显示错误的名称,您需要斜视以了解名称。
Oleg:人们如何从JavaScript适应C ++,反之亦然?Andrey:可能您可以在这里看我-最初是前端,现在已经接触了本机代码。 但是,老实说,即使在项目开始之前,我仍然希望尝试在本地撒尿。 所以我可能不是很有代表性。
我们与我的同事Yura进行了很多交谈,后者在C ++方面的项目中发言:他告诉我有关“优点”的信息,我告诉他有关JavaScript的信息。 而且他对JavaScript感兴趣。 巧合-十分之十:本机希望JavaScript何时学习? 而且我们有一支优秀的团队。
还有第三个人-这是Kolya,他是一名建筑师,通常查看汇编代码并说:“伙计们,无论如何都可以对其进行调试。 好吧,看,一切都清楚了:这是一台堆叠的机器,在这里我们要处理内存,在这里是算术……伙计们,为什么我们需要源映射?” 好吧,他知道如何为嵌入式系统编写代码,在业余时间他会这样做。
奥列格(Oleg):您是否对C ++有什么特别的惊喜:语言,可用性以及使用它的能力?安德烈:嗯,当然,我已经准备好了。 最重要的惊喜是,在与项目进行了讨论之后,我们意识到JS和C ++有很多共同点。 似乎完全不同的语言,但是您可以找到交点。 您甚至可以就此主题进行单独报告,您需要考虑一下。
尤金(Eugene):现在,您要写什么呢?安德鲁:实际上,我还不准备写C ++产品。 我会为自己做一些事情。 但是JavaScript-它去哪里了?
奥列格(Oleg):C ++速度很快,并具有许多很酷的功能(例如模板),这又如何呢? 编写一些超标准代码时,模板可以帮助前端吗?Andrei:开个玩笑:“如果您有问题,并且想使用正则表达式解决它,那么恭喜您,现在有两个问题。” 我觉得模板有些相似。 在我们的项目中,我们尝试不使用模板,当C ++开发人员尝试在此处实现某些功能时,架构师会非常抵制。 问题来自调试:永远不清楚确切的错误出在哪里。
奥列格:也就是说,不清楚所生成的代码会发生什么? 他不能将源映射构建到源吗?安德鲁:据我所知,即使在带有模板的本机C ++中,调试也很困难。 当我们将其拖到WebAssembly下时,在WebAssembly下调试时会遇到问题。 因此,我认为这将完全是地狱。
(仔细看一下相机)孩子们,不要使用C ++模板!
奥列格(Oleg):没有模板,他会变成C。 可以用纯C语言编写。安德鲁:但是这些东西呢?
奥列格(Oleg):好吧……“带类的C”,是的。 我只是认为用类编写C语言代码和使用模板编写惯用C ++代码是两种完全不同的方法。安德鲁:是的,有可能。
奥列格(Oleg):一个哲学问题:您是否不认为将WebAssembly添加到浏览器时会打开通往地狱的门户?安德鲁:看来是这样。 因为现在,很可能会采用为整个C ++存在而编写的任何库或C ++程序,尝试在浏览器中对其进行编译,然后看看会发生什么,这将是一种时尚。 今天,我在浏览器中演示了Windows 2000的演示。
奥列格(Oleg):我的意思是,这只是功能完善的Windows 2000吗?安德鲁:是的,这是18年前的Windows 2000,它需要一台完整的计算机才能运行-现在Chrome需要它。
奥列格(Oleg):那需要内核模式的东西呢?安德鲁:她在QEMU仿真器中运行,并由Fabrice Bellar(QEMU的作者)由WebAssembly亲自移植。 当然,在那里您无法访问文件系统,即网络。 但这是Windows 2000,它启动,分散运行,一切就绪。 可以看到
奥列格(Oleg):让我们继续讨论智能电视的应用程序主题。 顺便说一下,您可以在那里使用WebAssembly做一些有趣的事情吗?安德鲁:如果在那里得到支持,那将是可能的。 智能电视有什么问题? 这种发展就像十年前的前端发展一样,因为没有更新智能电视。 一个人买了一台电视,将其挂在墙上,然后挂在那里多年。
奥列格(Oleg):但是我一直都在“等待,固件正在加载”。 已经激怒了。Andrei:固件可能正在加载,但是据我所知,它不会直接更新浏览器。 因此,我们仍然支持许多年前的电视,在该电视上浏览器显示为Chrome 5。
奥列格:我什至都不记得了。安德鲁:我也不记得了。 像浏览器之战的前端一样,智能电视(尤其是旧电视)的开发就是这样的雷区。
奥列格(Oleg):因此,您必须制作超级跨浏览器布局,该布局在旧版本和新版本上均适用?安德鲁:是的。 实际上,那里的问题不仅仅在于JavaScript的布局,而是API的不兼容性,现在我不再赘述。
奥列格(Oleg):您想在智能电视上使用的浏览器还有哪些其他功能?安德鲁:一百万种东西,从flexs(甚至不是JavaScript)开始,到以WebRTC结尾。 ByteFog使用WebRTC。 如果我们提取智能电视上已有的代码,那就太好了……
尤金(Eugene):除了提到的问题之外,智能电视的开发-感觉如何? 有什么感觉?安德鲁:有时候,智能电视浏览器的开发人员似乎不喜欢为智能电视开发应用程序的程序员,因为调试工具非常差,几乎没有。 这不适用于现代Tizen和webOS平台,它们在那里做得更好。 但是我做得比较早,那时有旧平台,那里的一切都很糟糕。 最好的调试工具是
weinre ,它并不是真正的调试器-您无法在其中停止JavaScript; 这是在网络套接字上运行的Chrome DevTools端口的类型。 通常,可以调试布局,但是使用JavaScript几乎无法执行任何操作。 我们以某种方式生活。
奥列格:但是,如果可以在浏览器中运行它,为什么还要在智能电视上进行调试?安德鲁:在浏览器中,我们有JavaScript,并且浏览器提供了一个API。 这是两件事。 同样,在电视上,我们有JavaScript,我们有来自浏览器引擎的API ...
Oleg:最有可能的是WebKit。安德鲁:是的,通常。 还有另一类API-该电视平台提供的API。 首先,这是一个播放器,然后是其他功能-遥控器等。 这些API将不在浏览器中。
有仿真器,制造商确实提供了仿真器,但是它们与硬件不完全匹配。 因此,在模拟器上调试在电视上运行并不是事实。 反之亦然:它可能无法在仿真器上运行,但可以在电视上完美运行。 因此,最后得出的结论是,我们不使用仿真器,而是尝试在真实的硬件上进行调试。 结果更快:您不会浪费时间在不存在的错误上。
奥列格(Oleg):您必须处理多少个平台,随着时间的推移,它们变得越来越小?Andrei:当我涉足智能电视时,制造商已经从旧的操作系统过渡到了一些新的操作系统,旧的操作系统有条件地称为Linux,每个操作系统都有自己的特色。 然后,我们不得不编写三种不同的应用程序-三星,LG和松下。 相对而言,这些应用程序复制了代码。 然后,几乎同时传出以下消息:三星正转向Tizen,LG正在转向webOS,松下正在转向Firefox OS(此后,它一直没有生存,松下现在分叉了)。
总的来说,似乎每个人都在改变平台-为什么不融合到一个平台上? 对于所有人,特别是对于开发人员来说,这会好得多:会有更多的软件,用户会收到更多有用的程序。 但是,不,我们仍然编写不同的应用程序。
奥列格(Oleg):是否有可能以某种方式填补所有平台?安德鲁:嗯,最后,我们进入了一个框架,我们替换了平台特定的东西,并尝试编写跨平台的业务逻辑。 但这似乎可以避免。
奥列格:还有Android电视吗?安德鲁:有两种。 您以前是怎么做的? 我们将普通的Android设备插入电视,然后放开。 然后,谷歌创建了一个专门的Android TV分支,它针对D-Pad(即遥控器)进行了更好的优化。 也有这样的电视。 但这是一个单独的故事和一个单独的商店。
而且,如果所有人都赢得了Android移动设备的青睐,并且各种制造商都选择了该操作系统,那么Google将无法通过电视来做到这一点。 正如xkcd图片中所示,不是所有东西都局限于一个平台,而是更多。
尤金(Eugene):我的Android电视下面有一台4K屏幕的电视,但它确实可以从HDMI输入接受4K,但是内置的Android为720p。 为什么会这样呢? 由于电视按4K标准是预算友好的,制造商是否可以节省硬件?Andrei:是的,我认为,这是因为操作系统无法在此硬件上渲染4K图片。 实际上,当智能电视(即电视上来自应用程序的部分)不使用全屏分辨率时,这是一种常见情况。 FullHD泄漏到HD Ready,4K泄漏到FullHD甚至720p。 当我们无法同时在4K电视上显示4K内容时,这是一个非常有趣的时刻,尽管我们同时拥有电视和内容。
电视通常通常具有接口-不幸的是,这是智能电视平台的祸害。 此外,在Yandex.Market上,请勿勾选“不会减速的电视”并进行过滤。 显然,它仍有待来到商店并在那里选择。
Oleg:这如何影响应用程序开发? 如果添加很多div,应用程序会越来越慢吗?安德鲁:当然。 如果需要渲染大型列表,则必须变形并渲染所有列表,而不是部分渲染。 我们可以在频道列表中包含200个频道,而无法渲染整个列表-然后他在滚动时会刹车。
我说的是几年前的情况。 在现在发布的电视上,情况可能会好得多。 但是,同样,人们很少更换电视。
奥列格(Oleg):您如何看待,我们现在在智能电视中看到的一切将会是什么?安德鲁:我很悲观。 我希望我的预测不会成真,但是我们看到电视上3D技术的下降,当时所有制造商都说:“好吧,没人买这个,这不是选择设备的关键因素。” 似乎智能电视可能会遭受这种命运,尽管我不想这么做。
奥列格(Oleg):如果您没有智能电视,那么使用此功能的主要方式是什么? 带一台笨重的PC并贴在电视上?安德鲁:一台大型计算机,我想没人会坚持。 控制台可能是最佳选择,但是智能电视和控制台有一个共同点:远程控制。 而且要做好良好的遥控器非常困难。 有时他们用加速度计制作操纵杆,即实现手势控制或模拟鼠标,但这也不是理想的选择。 通常,智能电视的问题更多地在于UI / UX区域。 在某种程度上,语音控制可以帮助电视UX-在Peers.TV上,可以使用用户的智能手机来支持它,现在我们正在研究带有麦克风的特殊遥控器。
尤金(Eugene):是的,我看到Google努力在语音控制方面引领电视。 虽然这发生了不同的成功。 但是,然后我们像这样结束了对话:我们希望在将来的某个时间,观众可以说“开始为我广播HolyJS”!如果您在阅读有关WebAssembly或Smart TV时有任何疑问,请在评论中询问Andrey。
还请注意, 下一次HolyJS将于5月24日至25日在圣彼得堡举行。 她的程序尚未公布,但可能还会有一个超出通常前端的“非典型javascript”的地方-门票逐渐变得越来越贵。