En la teoría de lenguajes de programación , el método call-by-push-value (CBPV) es un lenguaje intermedio que incorpora las estrategias de evaluación call-by-value (CBV) y call-by-name (CBN) . CBPV se estructura como un λ-cálculo polarizado con dos tipos principales: "valores" (+) y "computaciones" (-). [ 1 ] Las restricciones en las interacciones entre ambos tipos imponen un orden de evaluación controlado, similar a las mónadas o CPS . El cálculo puede incorporar efectos computacionales, como la no terminación, el estado mutable o el no determinismo. Existen traducciones naturales que preservan la semántica desde CBV y CBN a CBPV. Esto significa que al proporcionar una semántica a CBPV y demostrar sus propiedades, se establecen implícitamente también la semántica y las propiedades de CBV y CBN. Paul Blain Levy formuló y desarrolló CBPV en varios artículos y en su tesis doctoral. [ 2 ] [ 3 ] [ 4 ]
Definición
El paradigma CBPV se basa en el lema "un valor es, un cálculo hace". Una complicación en la presentación es distinguir las variables de tipo que abarcan tipos de valor de aquellas que abarcan tipos de cálculo. Este artículo sigue a Levy en el uso de subrayados para denotar cálculos, por lo quees un tipo de valor (arbitrario) peroes un tipo de cálculo. [ 4 ] Algunos autores utilizan otras convenciones, como conjuntos distintos de letras. [ 5 ]
El conjunto exacto de construcciones varía según el autor y el uso deseado para el cálculo, pero las siguientes construcciones son típicas: [ 2 ] [ 4 ]
- Las lambdas
λx.Mson cálculos de tipo, dóndey. Una aplicación lambdaF VoV'Fes un cálculo de tipo, dóndeyLa construcción de enlace letlet { x_1 = V_1; ... }. Mvincula valoresx_1a valoresV_1de tipos coincidentes ., dentro de un cálculoM:. - Un thunk
thunk Mes un valor de tipoconstruido a partir de un cálculoMde tipoForzar una operación lógica es un cálculoforce X:para un thunkX:. - También es posible envolver un valor
Vde tipocomo un cálculoreturn V:Dicho cálculo puede utilizarse dentro de otro cálculo comoM to x. N:, dóndeM:, yN:es un cálculo. - Los valores también pueden incluir tipos de datos algebraicos construidos a partir de una etiqueta y cero o más subvalores, mientras que los cálculos incluyen una coincidencia de patrones deconstructiva
match V as { (1,...) in M_1, ... }. Según la presentación, los tipos de datos algebraicos pueden limitarse a sumas y productos binarios, solo a valores booleanos o incluso omitirse por completo.
Un programa es un cálculo cerrado de tipo, dóndees un tipo ADT terrestre. [ 4 ]
Valores complejos
Expresiones como tienen sentido denotacionalmente. Pero, siguiendo las reglas anteriores, solo se puede codificar usando coincidencia de patrones, lo que la convertiría en un cálculo, y por lo tanto la expresión general también debe ser un cálculo, dando . De manera similar, no hay forma de obtener de sin construir un cálculo. Al modelar CBPV en la teoría ecuacional o de categorías , tales construcciones son indispensables. Por lo tanto, Levy define una IR extendida, "CBPV con valores complejos". Esta IR extiende el enlace let para enlazar valores dentro de una expresión de valor, y también para hacer coincidir un valor con cada cláusula devolviendo una expresión de valor. [ 3 ] Además de modelar, tales construcciones también hacen que escribir programas en CBPV sea más natural. [ 2 ]not true : boolnotnot true : F bool1(1,2)
Los valores complejos complican la semántica operacional , en particular al requerir una decisión arbitraria sobre cuándo evaluar el valor complejo. Dicha decisión carece de significado semántico, ya que la evaluación de valores complejos no tiene efectos secundarios. Además, es posible convertir sintácticamente cualquier cálculo o expresión cerrada a una del mismo tipo y denotación sin valores complejos. [ 3 ] Por lo tanto, muchas presentaciones omiten los valores complejos. [ 4 ]
Traducción
La traducción CBV produce valores CBPV para cada expresión. Una función CBV λx.M :se traduce a :thunk λx.Mv . Una aplicación CBV M N :se traduce en un cálculo de tipoMv to f in Nv to x in x'(force f), haciendo explícito el orden de evaluación. Una coincidencia de patrón match V as { (1,...) in M_1, ... }se traduce como . Los valores se envuelven con cuando es necesario, pero de lo contrario permanecen sin modificar. [ 2 ] En algunas traducciones, puede ser necesaria la secuenciación, como al traducir a . [ 4 ]Vv to z in match z as { (1,...) in M_1v, ... }returninl MM to x. return inl x
La traducción CBN produce cálculos CBPV para cada expresión. Una función CBN λx.M :traduce sin alteraciones, :λx.MN . Una solicitud del Banco Central de Nigeria M N :se traduce en un cálculo de tipoMv (thunk Nv). Una coincidencia de patrón match V as { (1,...) in M_1, ... }se traduce de forma similar a CBN como . Los valores ADT se envuelven con , pero y también son necesarios en la estructura interna. La traducción de Levy supone que , lo cual de hecho se cumple. [ 2 ]Vn to z in match z as { (1,...) in M_1n, ... }returnforcethunkM = force (thunk M)
También es posible extender CBPV para modelar la llamada por necesidad, introduciendo una M need x. Nconstrucción que permite el intercambio visible. Esta construcción tiene una semántica similar a M name x. N = (λy.N[x ↦ (force y)])(thunk M), excepto que con la needconstrucción, el thunk de Mse evalúa como máximo una vez. [ 6 ]
Modificaciones
Algunos autores han señalado que CBPV puede simplificarse eliminando el constructor de tipo U (thunks) [ 7 ] o el constructor de tipo F (computaciones que devuelven valores). [ 8 ] Egger y Møgelberg justifican la omisión de U en función de una sintaxis simplificada y para evitar la complejidad de las conversiones inferibles de computaciones a valores. Esta elección convierte los tipos de computaciones en un subconjunto de los tipos de valores, y entonces es natural expandir los tipos de funciones a un espacio de funciones completo entre valores. Denominan a su cálculo "Cálculo de Efectos Enriquecidos". Este cálculo modificado es equivalente a un superconjunto de CBPV mediante una traducción bidireccional que preserva la semántica. [ 7 ] Ehrhard, en cambio, omite el constructor de tipo F, convirtiendo los valores en un subconjunto de computaciones. Ehrhard renombra las computaciones como "tipos generales" para reflejar mejor su semántica. Este cálculo modificado, el "cálculo lambda semipolarizado", tiene estrechas conexiones con la lógica lineal . [ 8 ] [ 9 ] Se puede traducir bidireccionalmente a un subconjunto de una variante totalmente polarizada de CBPV. [ 10 ]
Otorgar
Paul Blain Levy recibió el Premio Alonzo Church 2025 por su trabajo en CBPV. [ 11 ]
Véase también
Referencias
- ↑ Kavvos, GA; Morehouse, Edward; Licata, Daniel R.; Danner, Norman (enero de 2020). "Extracción de recurrencia para programas funcionales mediante llamada por valor de inserción" . Actas de la ACM sobre lenguajes de programación . 4 (POPL): 1–31 . arXiv : 1911.04588 . doi : 10.1145/3371083 . ISSN 2475-1421 .
- 1 2 3 4 5 Blain Levy, Paul (abril de 1999). Llamada por valor push: un paradigma de subsumación (PDF) . Cálculos lambda tipados y aplicaciones, 4.ª Conferencia Internacional, TLCA'99, L'Aquila, Italia. Lecture Notes in Computer Science. Vol. 1581. págs. 228–242 .
- 1 2 3 Levy, Paul Blain (2003). Llamada por valor push: una síntesis funcional/imperativa (PDF) . Dordrecht ; Boston: Kluwer Academic Publishers. ISBN 978-1-4020-1730-8.
- 1 2 3 4 5 6 Levy, Paul Blain (abril de 2022). "Call-by-push-value". ACM SIGLOG News . 9 (2): 7– 29. doi : 10.1145/3537668.3537670 .
- ↑ Pédrot, Pierre-Marie; Tabareau, Nicolas (enero de 2020). "El triángulo del fuego: cómo mezclar sustitución, eliminación dependiente y efectos". Actas de la ACM sobre lenguajes de programación . 4 (POPL): 1–28 . doi : 10.1145/3371126 .
- ↑ McDermott, Dylan; Mycroft, Alan (2019). «Llamada extendida por valor push: razonamiento sobre programas efectivos y orden de evaluación». Lenguajes y sistemas de programación . Springer International Publishing. págs. 235–262 . doi : 10.1007/978-3-030-17184-1_9 . ISBN 978-3-030-17184-1.
- 1 2 Egger, J.; Møgelberg, RE; Simpson, A. (1 de junio de 2014). "El cálculo de efectos enriquecido: sintaxis y semántica" (PDF) . Journal of Logic and Computation . 24 (3): 615– 654. doi : 10.1093/logcom/exs025 .
- 1 2 Ehrhard, Thomas (2016). "Call-By-Push-Value from a Linear Logic Point of View". Programming Languages and Systems . Lecture Notes in Computer Science. Vol. 9632. pp. 202–228 . doi : 10.1007/978-3-662-49498-1_9 . ISBN 978-3-662-49497-4.
- ^ Chouquet, Jules; Tasson, Christine (2020). Expansión de Taylor para Call-By-Push-Value . Actas internacionales de Leibniz en informática. vol. 152. Schloss Dagstuhl – Leibniz-Zentrum für Informatik. págs. 16:1–16:16. doi : 10.4230/LIPIcs.CSL.2020.16 . ISBN 978-3-95977-132-0.
- ↑ Ehrhard, Thomas (julio de 2015), Un FPC de llamada por valor push y su interpretación en lógica lineal
- ↑ https://siglog.org/winner-of-the-2025-alonzo-church-award/
- Cálculo lambda
- semántica de lenguajes de programación