问题标签 [trampolines]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
interpreter - 持续传递风格与积极削减调用堆栈?
我正在考虑将 CPS 之类的东西用于基于演员的语言的解释器中。
函数参数在变量数组中传递,延续在同一个数组中返回,所以一个简单的函数
所以来自 read/eval/loop 的调用将是
入境时会是
其中 _ 是写入函数返回值的空槽。
在执行的下一步,参数变为
然后
等等。C中的实现基本上是
检查是否超出 args 数组的末尾并分配更多空间。
参数是连续的,作为对象的“延续”只是参数的一个子集。
如果我要实现一流的延续,他们将需要克隆参数数组;您也不会免费获得关闭。主要目标是与简单的机器代码生成配合得很好,并让您暂停和恢复执行。
虽然这个方案的灵感来自于对 CPS 的思考,但它并不完全是 CPS,并且非常类似于经过积极修剪的 C 堆栈可能看起来的样子——只是活动变量和每个函数的返回点。
这种风格有名字吗,特别是参数数组?这是一种蹦床+一个堆栈,尽管我习惯于调用“堆栈”更多的是历史而不是执行的未来。
optimization - 在 F#/Scala 中优化相互递归的标准方法是什么?
这些语言“本机”不支持相互递归函数优化,所以我想它一定是蹦床或..呵呵..重写为循环)我错过了什么吗?
更新:似乎我确实对 FSharp 撒了谎,但我只是在谷歌搜索时没有看到相互尾随的例子
scala - 如何使用 TailCall?
如果我理解正确, scala.util.control.TailCalls 可用于通过使用蹦床来避免非尾递归函数的堆栈溢出。API 中给出的示例很简单:
但是,更有趣的情况是,如果您想在 recurve 调用之后进行一些操作。我得到了一个“天真的”阶乘实现以某种方式运行
但这看起来很可怕,我怀疑这是预期用途。所以我的问题是如何使用 TailCalls 正确编写阶乘或斐波那契函数(是的,我知道如何使用累加器使它们尾递归)?还是 TailCalls 不适合这种问题?
mono - MonoDevelop 设置修复“用完蹦床类型 2”错误
我们正在开发一个 iOS 应用程序。当我们在 PC 上测试应用程序时,一切正常,但当我们在 iPad/iPhone4 上运行它时,我们经常收到“Ran out of Trampolines type 2”错误消息和应用程序崩溃。最近几天我们一直在尝试找出原因/修复它并尝试了我们在网上找到的所有建议,但我们仍然没有取得任何进展。我们发现的唯一解决方案是来自讨论使用编译器设置调整蹦床设置的帖子/网页,如下所示: -aot "nrgctx-trampolines=4048" -aot "nimt-trampolines=4048" in monotouch。但是我们使用 Unity3D 来开发我们的应用程序,所以我们没有向我们公开这个编译器选项。但我相信 Monotouch 和 Unity3D 都是基于 Mono 框架的,所以我
有谁知道这是否正确?如果是的话,谁能给我一些关于如何在我们的 Unity3D 项目中启用此选项的说明?
提前非常感谢!
trampolines - 减少使用 2 型蹦床的数量
我们正在使用 Unity3D 开发 iOS 应用程序,并且一直遇到“用完蹦床类型 2 错误”。由于 Unity 不允许使用调整蹦床限制,所以我们必须减少蹦床的使用量。到目前为止,我们已经做了一些事情,比如删除了一些 LINQ 调用,并且似乎稍微改善了这种情况。但实际上,我们仍然不确定我们所做的事情是否有帮助。
所以我想知道是否有人可以告诉我们蹦床类型 2 到底是什么,我们如何减少我们的应用程序起诉的蹦床类型 2 的数量?谢谢!
谢谢!
这是我几周前的原始问题: MonoDevelop settings to fix "run out of trampolines type 2" error
c - 有哪些实现尾调用消除的好方法?
我用 C/C++ 的邪恶组合编写了一个小型 Scheme 解释器,但我还没有实现正确的尾调用。
我知道MTA 算法中的经典切尼,但是还有其他很好的实现方法吗?我知道我可以将 Scheme 堆栈放在堆上,但这仍然不是适当的消除,因为标准规定应该支持无限数量的活动尾调用。
我也摆弄过longjmps,但到目前为止,我认为它只适用于非相互递归尾调用。
主要的基于 C 的方案如何实现正确的尾递归?
scheme - 如何以 CPS 形式编写分析器/评估器函数,如“eval-if”?
我正在尝试基于 SICP 中的元循环评估器编写一个玩具 python 方案解释器。由于 python 只支持有限深度的调用堆栈,我必须消除尾调用。我阅读了蹦床并用它实现了解析器。
但我不知道如何以连续传递风格编写分析器/评估器函数以将它们与蹦床一起使用。例如,eval-if
函数:
在蟒蛇中:
当我想检查谓词是否为真时,我必须对其进行新一轮的调用eval
。我应该如何以 CPS 形式编写这种递归调用?
c++ - 如何为钩子创建蹦床功能
我对挂钩很感兴趣,我决定看看我是否可以挂钩一些功能。我对使用 detours 之类的库不感兴趣,因为我想拥有自己做这件事的经验。通过我在互联网上找到的一些资源,我能够创建下面的代码。这是基本的,但它工作正常。然而,当挂钩由多个线程调用的函数时,它被证明是极其不稳定的。如果几乎同时拨打两个电话,它就会崩溃。经过一些研究,我认为我需要创建一个蹦床功能。在寻找了几个小时之后,除了对蹦床的一般描述之外,我找不到任何其他东西。我找不到任何关于编写蹦床函数的具体内容,或者它们是如何工作的。如果有人可以帮我写一篇,请发布一些资源,
下面是我写的代码。这真的很基础,但我希望其他人可以从中学习。
测试.cpp
钩子.cpp
ios - MonoTouch SIGABRT“用完类型 2 的蹦床”错误
在本机设备 (iPad) 上运行 MonoTouch 应用程序时,我收到 SIGABRT / 用完蹦床错误。
这发生在我的应用程序的早期 - 我正在使用 MonoTouch.Dialog 构建一个部分。
是否有增加蹦床数量的编译器设置?
如何对此进行分析并找出我的应用程序耗尽的原因?
'/private/var/mobile/Applications/9A5EE6EB-CAB8-404E-AF2F-E6571C1AC164/iphone.app/mscorlib.dll' (128) 中的类型 2 蹦床用完
堆栈跟踪:
在 System.Linq.Enumerable/c__Iterator1D
2.MoveNext () <0x000a7> at MonoTouch.Dialog.Section.AddAll (System.Collections.Generic.IEnumerable
1) [0x00020] 在 /Developer/MonoTouch/Source/MonoTouch.Dialog/MonoTouch.Dialog/Elements.cs:2006 在 MonoTouch.Dialog.Section.Add (System.Collections.Generic.IEnumerable`1) [0x00000] 在 / Developer/MonoTouch/Source/MonoTouch.Dialog/MonoTouch.Dialog/Elements.cs:2019 at BuiltSteady.Zaplify.Devices.IPhone.AddPage.ViewDidAppear (bool) [0x000d6] in /Users/ogazitt/zaplify/source/devices/ios /iphone/AddPage.cs:65 at (wrapper runtime-invoke) object.runtime_invoke_dynamic (intptr,intptr,intptr,intptr) <0xffffffff> 在 MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x00042]在 /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:29 在 BuiltSteady.Zaplify.Devices.IPhone.Application.Main (string[]) [0x00000] 在 /Users/ogazitt/zaplify/source/devices /ios/iphone/Main.cs:16 at (wrapper runtime-invoke) object.runtime_invoke_dynamic (intptr,intptr,intptr,intptr) <0xffffffff>本机堆栈跟踪:
0 zaplifyiphone 0x00ab0334 mono_handle_native_sigsegv + 280 1 zaplifyiphone
0x00ad3088 sigabrt_signal_handler + 180 2 libsystem_c.dylib
0x34f80539 _sigtramp + 48 3 libsystem_c.dylib
0x34f75f5b pthread_kill + 54 4 libsystem_c.dylib
0x34f6efeb abort + 94 5 zaplifyiphone
0x00b8c138 monoeg_g_logv + 152 6 zaplifyiphone
0x00b8c1a8 monoeg_g_log + 32 7 zaplifyiphone
0x00aa2454 get_numerous_trampoline + 152 8 zaplifyiphone
0x00aa2898 mono_aot_get_imt_thunk + 56 9 zaplifyiphone
0x00b459b4 initialize_imt_slot + 112 10 zaplifyiphone
0x00b46d9c build_imt_slots + 1124 11
0x00b46f04 mono_vtable_build_imt_slot + 120 12 zaplifyiphone
0x00ab3024 mono_convert_imt_slot_to_vtable_slot + 292 13 zaplifyiphone 0x00ab329c common_call_trampoline + 284 14 zaplifyiphone 0x00ab17a8 mono_vcall_trampoline + 228 15 zaplifyiphone
0x009addb0 generic_trampoline_vcall + 136 16 zaplifyiphone
0x00011ee0 MonoTouch_Dialog_Section_AddAll_System_Collections_Generic_IEnumerable_1_MonoTouch_Dialog_Element + 188 17 zaplifyiphone 0x00011f68 MonoTouch_Dialog_Section_Add_System_Collections_Generic_IEnumerable_1_MonoTouch_Dialog_Element + 36 18 zaplifyiphone 0x00293f0c BuiltSteady_Zaplify_Devices_IPhone_AddPage_ViewDidAppear_bool + 2068 19 zaplifyiphone 0x00968774 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 200 20 zaplifyiphone 0x00a9c980 mono_jit_runtime_invoke + 1644 21 zaplifyiphone
0x00b44e00 mono_runtime_invoke + 128 22 zaplifyiphone
0x00ba1518 monotouch_trampoline + 3228 23 UIKit
0x351ab6b5 -[UIViewController _setViewAppearState:isAnimating:] + 144 24 UIKit 0x35205269 -[UITabBarController viewDidAppear:] + 100 25 UIKit 0x351ab6b5 -[UIViewController _setViewAppearState:isAnimating:] + 144 26 UIKit 0x351d9115 -[UIViewController _executeAfterAppearanceBlock] + 56 27 UIKit 0x35177e3f _afterCACommitHandler + 174 28核心基础
0x340d0b4b CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 18 29 核心基础 0x340ced87CFRunLoopDoObservers + 258 30 CoreFoundation 0x340cf0e1 __CFRunLoopRun + 760 31 CoreFoundation 0x340524dd CFRunLoopRunSpecific + 300 32 CoreFoundation
0x340523a5 CFRunLoopRunInMode + 104 33 GraphicsServices
0x35c92fcd GSEventRunModal + 156 34 UIKit
0x35197743 UIApplicationMain + 1090 35 zaplifyiphone
0x004d4ba4 wrapper_managed_to_native_MonoTouch_UIKit_UIApplication_UIApplicationMain_int_string_intptr_intptr + 240 36 zaplifyiphone 0x00277900 BuiltSteady_Zaplify_Devices_IPhone_Application_Main_string__ + 152 37 zaplifyiphone 0x00968774 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 200 38 zaplifyiphone 0x00a9c980 mono_jit_runtime_invoke + 1644 39 zaplifyiphone
0x00b44e00 mono_runtime_invoke + 128 40 zaplifyiphone
0x00b490ac mono_runtime_exec_main + 436 41 zaplifyiphone
0x00b4dd20 mono_runtime_run_main + 756 42 zaplifyiphone
0x00aa0d08 mono_jit_exec + 140 43 zaplifyiphone
0x00a98f18 main + 2156 44 zaplifyiphone
0x00002ff4 开始 + 52