演讲与出版物

演讲

Nobody Can Program Correctly: A Practical and Interactive Guide to Debugging C++ Code
Sebastian Theophil

我们喜欢写代码,但尽管我们尽了最大努力,我们还是会犯错误。我们的程序会有错误。有时,我们没有写出我们想要写的东西,有时我们不理解编程语言的某个方面,有时我们缺乏或者没有考虑关于程序系统环境的一些关键信息。因此,我们的程序将无法正常运行。我们现在做什么? 在此演讲中,从一个程序崩溃开始,我将带您经历整个调试过程。我们下一步做什么? 我们必须问哪些问题? 我们需要什么信息? 我们可以做些什么来找到崩溃的原因? 哪些工具可以帮助我们完成这一任务,最后但同样重要的是,我们可以做些什么来确保这种错误不再发生? 感谢我们多年来在 think-cell 遇到并调试的真实示例,您将学习如何重现、定位、理解和修复最困难的错误。


Typescripten — Generating type-safe JavaScript bindings for emscripten
Sebastian Theophil

WebAssembly 已经成为 C++ 开发人员非常流行的目标平台。多亏了 emscripten,将本机应用程序移植到 WebAssembly 很容易——只要应用程序只将浏览器用作显示和输入设备。然而,emscripten 并没有为标准 JavaScript API(如 DOM 操作 API)提供类型安全包装器,更不用说现有 Web 应用程序提供的任何其他 JavaScript API 了。我们的开源工具“typescripten”建立在三项强大技术之上,旨在缩小这一差距。它使用 TypeScript 接口定义文件和 TypeScript 编译器 API 来创建基于 emscripten 的类型安全 C++ 包装器。TypeScript 已经为 7,000 多个 JavaScript 库提供了接口定义文件,您现在可以从 C++ 中安全地使用这些文件。我们努力设计 C++ 包装器,使使用它们的 C++ 代码看起来与等效的 TypeScript 或 JavaScript 代码相似。然而,基于原型的 Javascript 和 Typescript 的特殊语义通常很难翻译成基于类型的语言,如 C++。我将详述我们在设计此框架时面临的挑战和做出的选择。


Windows, macOS and the Web: Lessons from cross-platform development at think-cell
Sebastian Theophil

12 年来,think-cell 一直是一家仅支持 Windows 的软件公司,我们大约 70 万行代码的代码库无意中已变得十分依赖平台。六年前,我们决定将应用程序移植到 Mac。这种变化影响了我们开发过程的每一部分:项目组织、构建系统以及我们如今用 C++ 编程的方式。常用的跨平台库(如 Qt 和 boost)是很好的构建工具,但仅凭它们本身是不够的。对于许多概念,如互斥器、信号量或共享内存,它们仅为具有非常不同语义和生存期的平台特定对象提供公共接口。我们希望轻量级的、独立于平台的 C++ 抽象概念在渲染、国际化、文件 I/O、鼠标事件处理、RPC 调用和错误报告方面具有相同的语义。开发这些是具有挑战性的,首先,因为我们必须定义应用程序所需的语义,其次,我们必须在每个平台上实现它们。这不是一个简单的过程,但我认为它极大地提高了我们代码的质量。到目前为止,我们已经进入了下一个挑战,并开始将一些功能转移到 Web 应用程序中。当然,我们希望重用现有的代码库,这意味着用富于表现力、类型安全的 C++ 编写 Web 应用程序。这绝对是我们书中的优势!我们使用 emscripten 构建了 Web 应用程序,但我们从任何 TypeScript 接口定义生成类型安全的 C++ 绑定。在演讲中,我将概述我们部署的 C++ 抽象概念,着重介绍跨平台问题领域,这些领域由于任一操作系统的局限性而难以定义通用语义,当然,我还将展示使我们公司用 C++ 编写 Web 应用的工具。


The C++ rvalue lifetime disaster
Arno Schödl

右值引用从 C++ 11 开始就出现了。最初引入它们是为了提高移动对象的效率:假设右值引用所引用的对象很快就会超出作用域,因此可以在不受损害的情况下清除其资源。C++ 标准库,例如 std::cref 或 std::ranges,利用了右值引用的另一个方面:由于它们很快就超出了作用域,因此假设在当前函数的作用域之外保留它们是不安全的,而左值引用是安全的。我们也发现这个假设对智能内存管理非常有用,尤其是在通用代码中。
可惜,C++ 语言本身违背了这一假设。右值绑定到 const&。这意味着看起来无害的函数会静默地将右值转换为左值引用,从而隐藏了右值的任何生存期限制。临时对象生存期扩展旨在通过延长临时对象的生存期,使临时对象绑定到引用变得安全。但这只适用于临时对象是纯右值,并且已经与右值引用发生冲突的情况,更不用说虚假生成的左值引用了。这些问题不仅仅是理论上的。由于这些问题,我们很难在代码中发现内存损坏。我在该演讲中将详细描述问题,展示仅使用库的问题缓解方法,最后针对如何改正而提供过去不可能实现的标准方案。


Better C++ Ranges
Arno Schödl

范围在 C++ 标准中已经存在了一段时间,并进入了现代代码库。在 think-cell,我们已经开发和使用自己的范围库 20 年了,它建立在标准之上,与标准兼容,但在许多方面都超越了标准。范围转接器通常是堆叠的,筛选器在转换器顶部。要使堆栈高效,迭代器还不够好。我们使用了一个更高效的新概念,同时与迭代器兼容,这样库用户就可以像以前一样继续使用迭代器。标准库对容器和视图之间的区别非常严格,范围转接器是必须维护对要调整的数据的引用的视图。相反,我们允许范围转接器保存数据,自给自足并同时进行惰性求值。标准迭代器模型只允许外部迭代。然而,内部迭代通常比外部迭代更容易实现。对于许多应用程序来说,内部迭代是完全足够的,并且比外部迭代更高效。因此,我们将内部迭代引入范围系列,以至于库用户可能不知道或不关心正在使用哪种迭代。标准算法返回迭代,并使用最终迭代器来表示某些单例模式状态。通过自定义返回值,我们可以使代码更加简洁和富有表现力,例如取消令人畏惧的迭代器结束检查。这些特性结合在一起,使范围成为文本格式化的优秀工具。我们可以使用这些范围表示要设置格式的值,在概念上将其转化为延迟计算的字符串。这些字符串在最终扩展显示之前,可以像现在使用常规字符串一样使用:用于函数返回;用作标准算法输入;嵌入到其他同样延迟计算的字符串中;等等。通过选择正确的接口,我们可以在编译时优化这种扩展,从而实现良好的语法和非常接近手动优化代码的性能。


Range-Based Text Formatting - For a Future Range-Based Standard Library
Arno Schödl

长期以来,文本格式一直是 C++ 库的作者喜欢的问题。在本演讲中,我希望能使你们相信,范围与一些元编程相结合可以为文本格式问题提供很好的解决方案。我们会介绍具有内部迭代的某种范围形式,它会逐一生成自己的元素,而不是公开外部迭代器。我们可以使用这些生成器范围表示要设置格式的值,在概念上将其转化为延迟计算的字符串。这些字符串在最终扩展成容器之前,可以像现在使用常规字符串一样使用:用于函数返回;用作标准算法输入;嵌入到其他同样延迟计算的字符串中;等等。通过选择正确的接口,我们可以优化这项扩展,使其较使用手动优化特殊案例代码来创建同等字符串仅慢 15%。


Why Iterators Got It All Wrong — and what we should use instead
Arno Schödl

您知道迭代器,对吗? 您会怎样描述迭代器? “迭代器用于指向元素序列。” 听上去很好,是吗? 最近,范围概念的引入导致迭代器面临危险境地。特别是范围包括用于以怠惰方式转换或筛选元素序列的范围转接器,而范围也有迭代器。
一切都好,是吗? 很遗憾,并非如此。自从发明 C++ 以来就一直在使用的迭代器概念存在根本缺陷。特别是有些迭代器必须视其目的是指向元素还是指向元素间的边界而采用不同的行为方式。因此,元素和边界是两个截然不同的概念。在此演讲中,我将说服你们相信问题真实存在并具有实际意义,就修复方式提出建议,并展示解决方案如何既能解决问题,又能清洁代码并防止错误。


From Iterators To Ranges — The Upcoming Evolution Of the Standard Library
Arno Schödl

在整个 C++ 库中,迭代器对无处不在。一般可以接受的是,将此类组对合并为单一实体(通常称为范围)可提供更简洁、更可靠的代码。但是,定义此类范围概念的精确语义出奇的棘手。理论上的考量与实际情况彼此冲突。有些设计目标彼此不兼容。


A Practical Approach to Error Handling
Arno Schödl

每个程序都会出现错误,有些错误源自程序的内部漏洞,而有些则源自运行程序的环境。忽略所有错误将导致程序完全不可靠,而处理所有可能的错误将大幅提高复杂度,几乎没有好处。在 think-cell,我们一直使用并改善遵循原则的错误处理方法,我们从未在别处见过该方法。此演讲描述了我们的方法,以便在你们的下一个项目中,可以花费更少的精力编写更可靠的软件。


C++ Weekly episode – Interview on CppCast
Arno Schödl

Rob Irving 和 Jason Turner 的 CppCast 于 2018 年 1 月 24 日就 think-cell 的 think-cell 范围库和一般 C++ 开发情况采访了 Arno。


开发简单的 PowerPoint 加载项会有多难?
Valentin Ziegler

Office 开发通常与无聊的 VBA 宏或笨拙的 JavaScript 联系在一起。Valentin 交谈过的许多开发人员都惊讶地得知,think-cell 的代码库有一百万行 C++ 代码,我们必须在这个过程中创建一些通用库来保持代码的简短。我们努力在 PowerPoint 上实现最简单的用户界面,使用户能够在很短的时间内创建非常漂亮的幻灯片,为此我们需要使用功能非常强大的工具。接下来将展示我们如何应用最先进的算法来解决布局和放置问题,以及为了与主机应用程序无缝集成,我们必须克服哪些挑战。


Industrial Strength Software Hacking
Simon McPartlin

软件修补是强大但存在潜在风险的漏洞修复方式,它可添加功能并提高软件的可用性或性能。此演讲将审视对无法取得源代码的软件进行修补,该行为通常称为黑客行为。我们首先讨论需要此类行为的原因与时机,然后介绍在设计和实现健全补丁时的详细信息。最后描述查找合适的修补位置可以使用的各种工具和技术。


std::cout is out — Why iostreams must go
Sebastian Theophil

我们最近开始将我们的软件传播到其他平台。在此过程中,我们发现 iostreams 和 C 样式 I/O 带来的烦恼。在此演讲中,我们将简要介绍为什么我们的代码库中舍弃了 iostreams 及其替代品。


C++ Memory Model
Valentin Ziegler 和 Fabio Fracassi

C++ 记忆模式可定义多个线程如何与内存及共享数据进行交互,开发人员由此能以独立于平台的方式推出并发代码。此演讲将说明 C++ 中的多线程执行和数据竞争、并发代码如何受编译程序和硬件优化的影响,以及如何使用锁和原子操作避免未定义的行为。然后将着重讲述原子操作的不同内存顺序、其保证以及性能影响。


C++ vs. Java
Valentin Ziegler 和 Fabio Fracassi

我们喜欢 C++,并每天都在使用它。在此演讲中,我们将说明 C++ 在概念上远胜于 Java(虽然 C++ 的复杂性名声在外)的原因。为什么? 因为 C++ 了解值的语义。因为 C++ 有未定义的行为。因为 C++ 不会执行垃圾回收。因为我们使用 C++ 可以编写抽象而高效的代码。


科学出版物

An Efficient Algorithm for Scatter Chart Labeling
Sebastian Theophil 和 Arno Schödl
AAAI 2006 论文集

此论文将展示适用于点特征新变体标记问题的高效算法。目标是放置最大数量的点标签,使其不会彼此相交或与点相交。首先我们展示的算法使用具有有限前向序列的贪心算法。随后展示的算法会以迭代方式将标签重新分组,同时对每组调用第一种算法,从而识别最佳标记顺序的近似值。某商用产品正使用所展示的算法来标记图表,我们的评估显示它产生的结果远远优于其他标记算法的结果。


A Smart Algorithm for Column Chart Labeling
Sebastian Müller 和 Arno Schödl
SMART GRAPHICS 2005 论文集

此论文将展示用于对柱形图及其衍生对象进行标记的智能算法。为了高效解决此问题,我们将其分为两个子问题。我们先展示了某几何算法,以解决为单一列标签找到良好标记的问题,假定已标记其他一些列。然后,我们展示了用于找到良好顺序的策略,其中将对列进行标记,该策略重复使用第一种算法以获得某有限前向序列。某商用产品正使用所展示的算法来标记图表,并已在实践中证明能产生满意的结果。


Graphcut Textures: Image and Video Synthesis Using Graph Cuts
Vivek Kwatra、Arno Schödl、Irfan Essa、Greg Turk 和 Aaron Bobick
SIGGRAPH 2003 论文集

在此论文中,我们将介绍适用于图像和视频纹理合成的新算法。在我们的方法中,会转换示例图像或视频中的修补区域,并将其复制到输出,然后沿最佳缝合线缝在一起,以生成新的(通常是更大的)输出。与其他技术相比,图形切割技术并未预先选择修补的大小,而是用于针对输入与输出纹理之间的指定偏移来确定最佳修补区域。与动态编程不同,我们实现缝合线优化的图形切割技术适用于任何维度。除了常规图像合成外,我们还特意将其用于 2D 和 3D 以执行视频纹理合成。


Controlled Animation of Video Sprites
Arno Schödl 和 Irfan Essa
SCA 2002 论文集

在此论文中,我们将展示生成视频子画面受控动画的新方法。视频子画面是通过对录制的移动对象视频画面进行重新整理而创建的动画。运用我们的技术,用户可以使用灵活的成本函数指定动画,会通过重复更换后续的视频子画面来自动优化该函数。


Video Textures
Arno Schödl、Richard Szeliski、David H. Salesin 和 Irfan Essa
SIGGRAPH 2000 论文集

此论文将介绍所谓视频纹理的新型媒体,其质量介于相片和视频的质量之间。视频纹理可提供连续无限变化的图像流。虽然视频纹理的个别画面可能会不时出现重复,但视频序列整体绝不会精确重复。视频纹理可用于取代数码照片,以注入具有动态质量和显式操作的静态图像。

希望了解更多?

若您对 think-cell 的工作、职位空缺或活动有任何疑问,请随时联系我们的同事 Julia Zhachuk。

hr@think-cell.com
+49 30 6664731-81

think-cell 人力资源代表.


分享