续体
在计算机科学中,续体(,也译作计算续体、续延、延續性),是实化计算机程序的控制状态的一种抽象表示。程式在運算過程中給定一個點,其「剩餘將要執行的部分」,即為「續體」。借助程式語言中的續體特性,程式設計師不但能模組化地自訂迴圈、break陳述句、continue陳述句等基本控制結構;此外還能以更加簡練的方式實現更加複雜的控制結構或計算模式,例如:異常處理、 生成器、協程、回溯、非确定性計算、概率编程、反向传播算法、可微分编程等。 概述 對…
共 37 篇文章
在计算机科学中,续体(,也译作计算续体、续延、延續性),是实化计算机程序的控制状态的一种抽象表示。程式在運算過程中給定一個點,其「剩餘將要執行的部分」,即為「續體」。借助程式語言中的續體特性,程式設計師不但能模組化地自訂迴圈、break陳述句、continue陳述句等基本控制結構;此外還能以更加簡練的方式實現更加複雜的控制結構或計算模式,例如:異常處理、 生成器、協程、回溯、非确定性計算、概率编程、反向传播算法、可微分编程等。 概述 對…
在计算机编程中,async/await模式是一种存在于许多编程语言中的语法特性。这种模式使得异步非阻塞函数逻辑可以用一种类似于同步函数的方式进行构造。在语义上,它与协程的概念相关,且通常也使用类似的技术实现。该模式大都是为了让程序能够在等待一个异步的长耗时操作完成的同时,也可以正常执行代码,它通常表现为Promises或者类似的形式。 这一特性出现在C# 5.0、C++20、 Python 3.5、 F#、 Hack、 Julia、 D…
在计算机科学中,信号()是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。 信号类似于中断,不同之处在于中断由处理器调解并由内核处理,而信号由内核调解(可能通过系统调用)并由进程处理。内…
在计算机学,尾调用是指一个函数里的最后一个动作是返回一个函数的调用结果的情形,即最后一步新调用的返回值直接作為当前函数的返回结果。 特征与简单示例 尾调用可能位于一个函数语法上最后的位置: function foo(data) { a(data); return b(data); } 在这里,a(data)、b(data) 都是函数调用,但是 b(data) 是函式返回前的最后运行的东西,所以也是所谓的尾位置。然后,并非所有的尾调用都必…
程序设计中的分支表(branch table)或跳躍表(jump table)是一種利用表格來轉移程式控制權(分支)的方式,表格中的內容就是對應的分支指令。這屬於多路分支。若使用汇编语言撰寫程式,常會用到分支表,不過也可能是由編譯器產生,特別是實現最佳化的,且其數值很相近的情形。 典型的實現 分支表包括許多的分支指令,而分支到這些分支指令的方式是是用其序列索引乘以分支指令長度當作分支指令的偏移量,此作法的原因是机器语言的分支指令長度是固…
在许多程序设计语言中,条件运算符(conditional operator, ?:)是一个基本的条件语句。条件运算符最初起源于BCPL程序设计语言。 用法 ?:的一般形式为 ? : 其中表达式1为布尔表达式,或真或为假。若表达式1为真,则返回表达式2的值作为整个条件表达式的值。若条件为假,则返回表达式3的值。例如 max =(a > b)? a : b ; 的执行结果就是将a和b中最大值赋给max. Actionscript 3 con…
在计算和计算机编程领域中,-{例外}-處理(,也意译为異常处理),指的是在程序执行期间,对出现的-{例外}-或異常情况的响应处理機制。一般而言,例外打断正常的执行流程并执行预先登记的“例外处理器”,具体處理措施依赖于它是硬件还是软件例外,还有软件例外是如何实现的。 例外是由计算机系统的不同层级来定义的,典型的层级有CPU定义的中断、操作系统(OS)定义的信号和编程语言定义的例外。每个层级都要求不同例外处理方式,但是它们可以是关联的,比如…
函数对象(function object)是一个程序设计的对象允许被当作普通函数来调用。 与之相区分: functionoid(函数体对象)定义为“有一个主要方法”的对象(object),不要求是什么类型,只要能 “调用” 就行。例如:struct LessThan { bool compare(int a, int b) const { return a functor(仿函数)定义为:重载了 operator() 的类对象(clas…
迴圈是计算机科学運算領域的用語,也是一種常見的控制流程。迴圈是一段在程式中只出現一次,但可能會連續執行多次的程式碼。迴圈中的程式碼會執行特定的次數,或者是執行到特定條件成立時結束迴圈,或者是針對某一集合中的所有項目都執行一次。 在一些函數程式語言(例如Haskell和Scheme)中會使用递归或不动点组合子來達到迴圈的效果,其中尾部递归是一種特別的递归,很容易轉換為迭代。 指定執行次數的迴圈(for loop) 大部份程式語言都提供迴圈…
在計算機科學中,分支()是在電腦程式中的一段序列程式碼。它會視情況而執行,主要是看控制流程在這個情況下,是否決定執行它。在高階語言與組合語言,乃至於機器碼寫成的程式中,都可以看到分支的存在。在高階語言中,通常會使用條件語句的形式,把分支包起來,並決定在何種狀況下,應該要執行哪一個分支指令。在組合語言與機器碼層級中,則使用跳躍指令(jump instructions),以標記定義出相對應的分支碼。
在计算机编程中,一些编程语言提供了用于例外处理(,或意译为异常处理)的机制。例外()这一术语所描述的通常是一种資料结构,该資料结构可以存储例外的相关訊息。例外处理的常见的一种机制是移交控制权。引发(raise)例外,也叫作抛出(throw)例外,通过该方式达到移交控制权的效果。例外抛出后,控制权会被移交至某处的接住(catch),并执行处理。 概述 从子程序作者的角度看,如果要表示当前子程序无法正常执行,抛出例外是很好的选择。无法正常执…
無窮迴圈()又称-{zh-cn:无穷回圈;zh-tw:死循環}-、无限循环(infinite loop),是指程式的控制流程一直在重複執行某一段程式碼,無法結束的情形,其原因可能是因為程式中的迴圈沒有設結束迴圈條件,或是結束迴圈的條件不可能成立等。在協作式多工(cooperative multitasking)的作業系統中,無窮迴圈會使系統沒有反應,若是先占式多工(preemptive multitasking)的系統中,無窮迴圈會用掉…
在程式語言中,While迴圈()是一種控制流程的陳述。利用一個返回結果為布林值的表達式作為循環條件,當這個表達式的返回值為“真”時,則反覆執行迴圈內的程式碼;若表達式的返回值為“假”,則結束執行迴圈內的代碼,繼續執行迴圈下面的代碼。 因為While迴圈在區塊內代碼被執行之前,先檢查陳述是否成立,因此這種控制流程通常被稱為是一種前測試迴圈(pre-test loop)。相對而言Do While迴圈,是在迴圈區塊執行結束之後,再去檢查陳述是…
Wild branch是電腦程式中的一個名詞,是指分支跳躍指令的目的位址不是有效的程式進入點,這常常是因為程序錯誤,指標陣列index被破壞的結果。之所以用Wild這個形容詞來形容,也是因為其結果難以預測。 Wild branch的影響不容易預測,產生的錯誤可能會依條件而不同:目的位址是否存在、目的位址是否恰好有有效的程式碼。Wild branch發生後,不一定會立刻偵測到,偵測到時,可能一些執行相關的證據已被破壞,或是已在目的位址執行…
setjmp.h是C标准函数库中提供“非本地跳转”的头文件:控制流偏离了通常的子程序调用与返回序列。互补的两个函数setjmp与longjmp提供了这种功能。 setjmp/longjmp的典型用途是异常处理机制的实现:利用longjmp恢复程序或线程的状态,甚至可以跳过栈中多层的函数调用。 成员函数 告诫与限制 longjmp实现了非本地跳转,微软的IA32程序设计环境中正常的"栈解开"因而没有发生,所以诸如栈中已定义的局部变量的析构…
程式語言中的標記()是加在源代碼中識別用的字串,大部份的語言都將標記視為標識符,後面要加一個冒號作為識別。 在許多高階語言中標記會用來標示Goto指令的終點。在組合語言中標記則是用來標示跳躍指令(如JMP)的終點。也時也會利用標記來作為程式的分段。Fortran及BASIC語言支援數字型的標記,也就是行號。標記也在调试時用來識別已編譯過程式的進入點。 用途 組合語言 在組合語言中要實現流程控制時,往往需要讓程式計數器前移或後移一段距離(…
控制流程(也稱為流程控制)是電腦運算領域的用語,意指在程式執行時,個別的指令(或是陳述、子程序)或求值的順序。不論是在宣告式程式語言或是函數程式語言中,都有類似的概念。 在宣告式的程式語言中,流程控制指令是指會改變程式執行順序的指令,可能是執行不同位置的指令,或是在二段(或多段)程式中選擇一個執行。 不同的程式語言所提供的流程控制指令也會隨之不同,但一般可以分為以下四種: 繼續執行位在不同位置的一段指令(無條件分支指令)。 若特定條件成…
异常处理(exception handling)是C++的一项语言机制,用于在程序能处理异常事件。 异常事件在C++中表示为异常对象(exception object)。异常事件发生时,由操作系统为程序设置当前异常对象,然后执行程序的当前异常处理代码块,在包含了异常出现点的最内层的try块,依次匹配同级的catch语句。如果匹配catch语句成功,则在该catch块内处理异常;然后执行当前try...catch...块之后的代码。如果在…
在一些程序语言中,eval 是一个把字符串当作表达式执行而返回一个结果的函数;在另一些之中,它执行多行的代码就好像它们被包括在其中,而不是包括 eval 的这一行。eval 的输入不一定是字符串;在支持句法抽象的语言(如 Lisp)中,eval 的输入将会由抽象句法形式组成。 安全风险 当使用 eval 而数据来自不可信任的来源时,一定要特别的注意。比如说,假设 get_data() 函数从 Internet 获取数据,这个 Pytho…
GOTO是一条可以在许多计算机编程语言中找到的语句。它是英文单词go和to的组合。当执行这条语句的时候,它将控制流程无条件地转到另一条语句(也叫「跳转」)。跳转语句需要指明標記,在不同语言中,標記可以是标识符或行号。在机器码级别,goto是一种分支的形式。 在一些语言中,可以不用显示地使用goto关键字而实现同样的功能,例如break或continue关键字可以跟随一个标识符。SNOBOL语言支持一种语句的后缀形式,可以在本条语句执行完…