首页 > 最新文献

Summit on Advances in Programming Languages最新文献

英文 中文
Verified Compilers for a Multi-Language World 多语言世界中经过验证的编译器
Pub Date : 1900-01-01 DOI: 10.4230/LIPIcs.SNAPL.2015.15
Amal J. Ahmed
Though there has been remarkable progress on formally verified compilers in recent years, most of these compilers suffer from a serious limitation: they are proved correct under the assumption that they will only be used to compile whole programs. This is an unrealistic assumption since most software systems today are comprised of components written in different languages - both typed and untyped - compiled by different compilers to a common target, as well as low-level libraries that may be handwritten in the target language. We are pursuing a new methodology for building verified compilers for today's world of multi-language software. The project has two central themes, both of which stem from a view of compiler correctness as a language interoperability problem. First, to specify correctness of component compilation, we require that if a source component s compiles to target component t, then t linked with some arbitrary target code t' should behave the same as s interoperating with t'. The latter demands a formal semantics of interoperability between the source and target languages. Second, to enable safe interoperability between components compiled from languages as different as ML, Rust, Python, and C, we plan to design a gradually type-safe target language based on LLVM that supports safe interoperability between more precisely typed, less precisely typed, and type-unsafe components. Our approach opens up a new avenue for exploring sensible language interoperability while also tackling compiler correctness.
尽管近年来在经过正式验证的编译器方面取得了显著进展,但大多数编译器都有一个严重的局限性:它们被证明是正确的,前提是它们只会被用来编译整个程序。这是一个不切实际的假设,因为今天的大多数软件系统都是由用不同语言编写的组件(包括类型化和非类型化)组成的,这些组件由不同的编译器编译到一个共同的目标,以及可能用目标语言手写的低级库。我们正在追求一种新的方法,为当今世界的多语言软件构建经过验证的编译器。该项目有两个中心主题,这两个主题都源于编译器正确性作为语言互操作性问题的观点。首先,为了指定组件编译的正确性,我们要求如果源组件s编译到目标组件t,那么与任意目标代码t'链接的t的行为应该与s与t'互操作的行为相同。后者需要源语言和目标语言之间互操作性的形式化语义。其次,为了实现从ML、Rust、Python和C等不同语言编译的组件之间的安全互操作性,我们计划设计一种基于LLVM的逐渐类型安全的目标语言,支持更精确类型、更不精确类型和类型不安全组件之间的安全互操作性。我们的方法为探索合理的语言互操作性开辟了一条新的途径,同时也解决了编译器的正确性。
{"title":"Verified Compilers for a Multi-Language World","authors":"Amal J. Ahmed","doi":"10.4230/LIPIcs.SNAPL.2015.15","DOIUrl":"https://doi.org/10.4230/LIPIcs.SNAPL.2015.15","url":null,"abstract":"Though there has been remarkable progress on formally verified compilers in recent years, most of these compilers suffer from a serious limitation: they are proved correct under the assumption that they will only be used to compile whole programs. This is an unrealistic assumption since most software systems today are comprised of components written in different languages - both typed and untyped - compiled by different compilers to a common target, as well as low-level libraries that may be handwritten in the target language. \u0000 \u0000We are pursuing a new methodology for building verified compilers for today's world of multi-language software. The project has two central themes, both of which stem from a view of compiler correctness as a language interoperability problem. First, to specify correctness of component compilation, we require that if a source component s compiles to target component t, then t linked with some arbitrary target code t' should behave the same as s interoperating with t'. The latter demands a formal semantics of interoperability between the source and target languages. Second, to enable safe interoperability between components compiled from languages as different as ML, Rust, Python, and C, we plan to design a gradually type-safe target language based on LLVM that supports safe interoperability between more precisely typed, less precisely typed, and type-unsafe components. Our approach opens up a new avenue for exploring sensible language interoperability while also tackling compiler correctness.","PeriodicalId":231548,"journal":{"name":"Summit on Advances in Programming Languages","volume":null,"pages":null},"PeriodicalIF":0.0,"publicationDate":"1900-01-01","publicationTypes":"Journal Article","fieldsOfStudy":null,"isOpenAccess":false,"openAccessPdf":"","citationCount":null,"resultStr":null,"platform":"Semanticscholar","paperid":"132796967","PeriodicalName":null,"FirstCategoryId":null,"ListUrlMain":null,"RegionNum":0,"RegionCategory":"","ArticlePicture":[],"TitleCN":null,"AbstractTextCN":null,"PMCID":"","EPubDate":null,"PubModel":null,"JCR":null,"JCRName":null,"Score":null,"Total":0}
引用次数: 40
Programming Language Abstractions for Modularly Verified Distributed Systems 模块化验证分布式系统的编程语言抽象
Pub Date : 1900-01-01 DOI: 10.4230/LIPIcs.SNAPL.2017.19
James R. Wilcox, Ilya Sergey, Zachary Tatlock
Distributed systems are rarely developed as monolithic programs. Instead, like any software, these systems may consist of multiple program components, which are then compiled separately and linked together. Modern systems also incorporate various services interacting with each other and with client applications. However, state-of-the-art verification tools focus predominantly on verifying standalone, closed-world protocols or systems, thus failing to account for the compositional nature of distributed systems. For example, standalone verification has the drawback that when protocols and their optimized implementations evolve, one must re-verify the entire system from scratch, instead of leveraging compositionality to contain the reverification effort. In this paper, we focus on the challenge of modular verification of distributed systems with respect to high-level protocol invariants as well as for low-level implementation safety properties. We argue that the missing link between the two is a programming paradigm that would allow one to reason about both high-level distributed protocols and low-level implementation primitives in a single verification-friendly framework. Such a link would make it possible to reap the benefits from both the vast body of research in distributed computing, focused on modular protocol decomposition and consistency properties, as well as from the recent advances in program verification, enabling construction of provably correct systems implementations. To showcase the modular verification challenges, we present some typical scenarios of decomposition between a distributed protocol and its implementations. We then describe our ongoing research agenda, in which we are attempting to address the outlined problems by providing a typing discipline and a set of domain-specific primitives for specifying, implementing and verifying distributed systems. Our approach, mechanized within a proof assistant, provides the means of decomposition necessary for modular proofs about distributed protocols and systems.
分布式系统很少作为单片程序开发。相反,像任何软件一样,这些系统可能由多个程序组件组成,然后分别编译并连接在一起。现代系统还包含各种服务,它们相互之间以及与客户机应用程序之间相互作用。然而,最先进的验证工具主要关注于验证独立的、封闭世界的协议或系统,因此无法解释分布式系统的组成性质。例如,独立验证的缺点是,当协议及其优化实现发展时,必须从头开始重新验证整个系统,而不是利用组合性来包含验证工作。在本文中,我们关注分布式系统在高层协议不变性和低层实现安全属性方面的模块化验证的挑战。我们认为,两者之间缺失的联系是一种编程范式,该范式允许人们在单个验证友好的框架中对高级分布式协议和低级实现原语进行推理。这样的联系将使我们有可能从分布式计算的大量研究中获益,这些研究集中在模块化协议分解和一致性属性上,以及从程序验证的最新进展中获益,这使得构建可证明正确的系统实现成为可能。为了展示模块化验证的挑战,我们展示了分布式协议及其实现之间分解的一些典型场景。然后,我们描述了我们正在进行的研究议程,其中我们试图通过提供一种类型规则和一组用于指定、实现和验证分布式系统的领域特定原语来解决概述的问题。我们的方法在证明助手中机械化,为分布式协议和系统的模块化证明提供了必要的分解手段。
{"title":"Programming Language Abstractions for Modularly Verified Distributed Systems","authors":"James R. Wilcox, Ilya Sergey, Zachary Tatlock","doi":"10.4230/LIPIcs.SNAPL.2017.19","DOIUrl":"https://doi.org/10.4230/LIPIcs.SNAPL.2017.19","url":null,"abstract":"Distributed systems are rarely developed as monolithic programs. Instead, like any software, these systems may consist of multiple program components, which are then compiled separately and linked together. Modern systems also incorporate various services interacting with each other and with client applications. However, state-of-the-art verification tools focus predominantly on verifying standalone, closed-world protocols or systems, thus failing to account for the compositional nature of distributed systems. For example, standalone verification has the drawback that when protocols and their optimized implementations evolve, one must re-verify the entire system from scratch, instead of leveraging compositionality to contain the reverification effort. \u0000 \u0000In this paper, we focus on the challenge of modular verification of distributed systems with respect to high-level protocol invariants as well as for low-level implementation safety properties. We argue that the missing link between the two is a programming paradigm that would allow one to reason about both high-level distributed protocols and low-level implementation primitives in a single verification-friendly framework. Such a link would make it possible to reap the benefits from both the vast body of research in distributed computing, focused on modular protocol decomposition and consistency properties, as well as from the recent advances in program verification, enabling construction of provably correct systems implementations. To showcase the modular verification challenges, we present some typical scenarios of decomposition between a distributed protocol and its implementations. We then describe our ongoing research agenda, in which we are attempting to address the outlined problems by providing a typing discipline and a set of domain-specific primitives for specifying, implementing and verifying distributed systems. Our approach, mechanized within a proof assistant, provides the means of decomposition necessary for modular proofs about distributed protocols and systems.","PeriodicalId":231548,"journal":{"name":"Summit on Advances in Programming Languages","volume":null,"pages":null},"PeriodicalIF":0.0,"publicationDate":"1900-01-01","publicationTypes":"Journal Article","fieldsOfStudy":null,"isOpenAccess":false,"openAccessPdf":"","citationCount":null,"resultStr":null,"platform":"Semanticscholar","paperid":"132809847","PeriodicalName":null,"FirstCategoryId":null,"ListUrlMain":null,"RegionNum":0,"RegionCategory":"","ArticlePicture":[],"TitleCN":null,"AbstractTextCN":null,"PMCID":"","EPubDate":null,"PubModel":null,"JCR":null,"JCRName":null,"Score":null,"Total":0}
引用次数: 22
Overparameterization: A Connection Between Software 1.0 and Software 2.0 过度参数化:软件1.0与软件2.0之间的连接
Pub Date : 1900-01-01 DOI: 10.4230/LIPIcs.SNAPL.2019.1
Michael Carbin
A new ecosystem of machine-learning driven applications, titled Software 2.0, has arisen that integrates neural networks into a variety of computational tasks. Such applications include image recognition, natural language processing, and other traditional machine learning tasks. However, these techniques have also grown to include other structured domains, such as program analysis and program optimization for which novel, domain-specific insights mate with model design. In this paper, we connect the world of Software 2.0 with that of traditional software - Software 1.0 - through overparameterization: a program may provide more computational capacity and precision than is necessary for the task at hand. In Software 2.0, overparamterization - when a machine learning model has more parameters than datapoints in the dataset - arises as a contemporary understanding of the ability for modern, gradient-based learning methods to learn models over complex datasets with high-accuracy. Specifically, the more parameters a model has, the better it learns. In Software 1.0, the results of the approximate computing community show that traditional software is also overparameterized in that software often simply computes results that are more precise than is required by the user. Approximate computing exploits this overparameterization to improve performance by eliminating unnecessary, excess computation. For example, one - of many techniques - is to reduce the precision of arithmetic in the application. In this paper, we argue that the gap between available precision and that that is required for either Software 1.0 or Software 2.0 is a fundamental aspect of software design that illustrates the balance between software designed for general-purposes and domain-adapted solutions. A general-purpose solution is easier to develop and maintain versus a domain-adapted solution. However, that ease comes at the expense of performance. We show that the approximate computing community and the machine learning community have developed overlapping techniques to improve performance by reducing overparameterization. We also show that because of these shared techniques, questions, concerns, and answers on how to construct software can translate from one software variant to the other.
一个名为Software 2.0的机器学习驱动应用的新生态系统已经出现,它将神经网络集成到各种计算任务中。这些应用包括图像识别、自然语言处理和其他传统的机器学习任务。然而,这些技术也已经发展到包括其他结构化领域,例如程序分析和程序优化,这些新颖的、特定于领域的见解与模型设计相结合。在本文中,我们通过过度参数化将软件2.0的世界与传统软件1.0的世界连接起来:一个程序可以提供比手头任务所需的更多的计算能力和精度。在软件2.0中,过度参数化——当机器学习模型的参数多于数据集中的数据点时——作为对现代基于梯度的学习方法在复杂数据集上以高精度学习模型的能力的当代理解而出现。具体来说,一个模型拥有的参数越多,它的学习效果就越好。在软件1.0中,近似计算社区的结果表明,传统软件也被过度参数化,因为软件通常只是简单地计算出比用户所要求的更精确的结果。近似计算利用这种过度参数化,通过消除不必要的、多余的计算来提高性能。例如,许多技术中的一种是降低应用程序中的算术精度。在本文中,我们认为可用精度与软件1.0或软件2.0所要求的精度之间的差距是软件设计的一个基本方面,它说明了为通用目的设计的软件与适应领域的解决方案之间的平衡。与适应领域的解决方案相比,通用解决方案更容易开发和维护。然而,这种轻松是以牺牲性能为代价的。我们表明,近似计算社区和机器学习社区已经开发了重叠技术,通过减少过度参数化来提高性能。我们还表明,由于这些共享的技术,关于如何构建软件的问题、关注点和答案可以从一种软件变体转换到另一种。
{"title":"Overparameterization: A Connection Between Software 1.0 and Software 2.0","authors":"Michael Carbin","doi":"10.4230/LIPIcs.SNAPL.2019.1","DOIUrl":"https://doi.org/10.4230/LIPIcs.SNAPL.2019.1","url":null,"abstract":"A new ecosystem of machine-learning driven applications, titled Software 2.0, has arisen that integrates neural networks into a variety of computational tasks. Such applications include image recognition, natural language processing, and other traditional machine learning tasks. However, these techniques have also grown to include other structured domains, such as program analysis and program optimization for which novel, domain-specific insights mate with model design. In this paper, we connect the world of Software 2.0 with that of traditional software - Software 1.0 - through overparameterization: a program may provide more computational capacity and precision than is necessary for the task at hand. \u0000In Software 2.0, overparamterization - when a machine learning model has more parameters than datapoints in the dataset - arises as a contemporary understanding of the ability for modern, gradient-based learning methods to learn models over complex datasets with high-accuracy. Specifically, the more parameters a model has, the better it learns. \u0000In Software 1.0, the results of the approximate computing community show that traditional software is also overparameterized in that software often simply computes results that are more precise than is required by the user. Approximate computing exploits this overparameterization to improve performance by eliminating unnecessary, excess computation. For example, one - of many techniques - is to reduce the precision of arithmetic in the application. \u0000In this paper, we argue that the gap between available precision and that that is required for either Software 1.0 or Software 2.0 is a fundamental aspect of software design that illustrates the balance between software designed for general-purposes and domain-adapted solutions. A general-purpose solution is easier to develop and maintain versus a domain-adapted solution. However, that ease comes at the expense of performance. \u0000We show that the approximate computing community and the machine learning community have developed overlapping techniques to improve performance by reducing overparameterization. We also show that because of these shared techniques, questions, concerns, and answers on how to construct software can translate from one software variant to the other.","PeriodicalId":231548,"journal":{"name":"Summit on Advances in Programming Languages","volume":null,"pages":null},"PeriodicalIF":0.0,"publicationDate":"1900-01-01","publicationTypes":"Journal Article","fieldsOfStudy":null,"isOpenAccess":false,"openAccessPdf":"","citationCount":null,"resultStr":null,"platform":"Semanticscholar","paperid":"133546609","PeriodicalName":null,"FirstCategoryId":null,"ListUrlMain":null,"RegionNum":0,"RegionCategory":"","ArticlePicture":[],"TitleCN":null,"AbstractTextCN":null,"PMCID":"","EPubDate":null,"PubModel":null,"JCR":null,"JCRName":null,"Score":null,"Total":0}
引用次数: 5
Teaching Programming Languages by Experimental and Adversarial Thinking 实验与对抗思维下的程序设计语言教学
Pub Date : 1900-01-01 DOI: 10.4230/LIPIcs.SNAPL.2017.13
Justin Pombrio, S. Krishnamurthi, Kathi Fisler
We present a new approach to teaching programming language courses. Its essence is to view programming language learning as a natural science activity, where students probe languages experimentally to understand both the normal and extreme behaviors of their features. This has natural parallels to the "security mindset" of computer security, with languages taking the place of servers and other systems. The approach is modular (with minimal dependencies), incremental (it can be introduced slowly into existing classes), interoperable (it does not need to push out other, existing methods), and complementary (since it introduces a new mode of thinking).
我们提出了一种新的编程语言教学方法。其本质是将编程语言学习视为一种自然科学活动,学生通过实验探索语言,了解其特征的正常行为和极端行为。这与计算机安全的“安全心态”有自然的相似之处,语言取代了服务器和其他系统。该方法是模块化的(具有最小的依赖性)、增量的(它可以慢慢地引入到现有的类中)、可互操作的(它不需要排挤其他现有的方法)和互补的(因为它引入了一种新的思维模式)。
{"title":"Teaching Programming Languages by Experimental and Adversarial Thinking","authors":"Justin Pombrio, S. Krishnamurthi, Kathi Fisler","doi":"10.4230/LIPIcs.SNAPL.2017.13","DOIUrl":"https://doi.org/10.4230/LIPIcs.SNAPL.2017.13","url":null,"abstract":"We present a new approach to teaching programming language courses. Its essence is to view programming language learning as a natural science activity, where students probe languages experimentally to understand both the normal and extreme behaviors of their features. This has natural parallels to the \"security mindset\" of computer security, with languages taking the place of servers and other systems. The approach is modular (with minimal dependencies), incremental (it can be introduced slowly into existing classes), interoperable (it does not need to push out other, existing methods), and complementary (since it introduces a new mode of thinking).","PeriodicalId":231548,"journal":{"name":"Summit on Advances in Programming Languages","volume":null,"pages":null},"PeriodicalIF":0.0,"publicationDate":"1900-01-01","publicationTypes":"Journal Article","fieldsOfStudy":null,"isOpenAccess":false,"openAccessPdf":"","citationCount":null,"resultStr":null,"platform":"Semanticscholar","paperid":"129712354","PeriodicalName":null,"FirstCategoryId":null,"ListUrlMain":null,"RegionNum":0,"RegionCategory":"","ArticlePicture":[],"TitleCN":null,"AbstractTextCN":null,"PMCID":"","EPubDate":null,"PubModel":null,"JCR":null,"JCRName":null,"Score":null,"Total":0}
引用次数: 7
Growing a Software Language for Hardware Design 为硬件设计开发一种软件语言
Pub Date : 1900-01-01 DOI: 10.4230/LIPIcs.SNAPL.2015.32
Joshua S. Auerbach, D. F. Bacon, P. Cheng, Stephen J. Fink, R. Rabbah, Sunil Shukla
The Liquid Metal project at IBM Research aimed to design and implement a new programming language called Lime to address some of the challenges posed by heterogeneous systems. Lime is a Java-compatible programming language with features designed to facilitate high level synthesis to hardware (FPGAs). This article reviews the language design from the outset, and highlights some of the earliest design decisions. We also describe how these decisions were revised recently to accommodate important requirements that arise in networking and cryptography.
IBM研究院的液态金属项目旨在设计和实现一种名为Lime的新编程语言,以解决异构系统带来的一些挑战。Lime是一种与java兼容的编程语言,其特性旨在促进对硬件(fpga)的高级合成。本文从一开始就回顾了语言设计,并重点介绍了一些最早的设计决策。我们还描述了最近如何修改这些决策以适应网络和密码学中出现的重要需求。
{"title":"Growing a Software Language for Hardware Design","authors":"Joshua S. Auerbach, D. F. Bacon, P. Cheng, Stephen J. Fink, R. Rabbah, Sunil Shukla","doi":"10.4230/LIPIcs.SNAPL.2015.32","DOIUrl":"https://doi.org/10.4230/LIPIcs.SNAPL.2015.32","url":null,"abstract":"The Liquid Metal project at IBM Research aimed to design and implement a new programming language called Lime to address some of the challenges posed by heterogeneous systems. Lime is a Java-compatible programming language with features designed to facilitate high level synthesis to hardware (FPGAs). This article reviews the language design from the outset, and highlights some of the earliest design decisions. We also describe how these decisions were revised recently to accommodate important requirements that arise in networking and cryptography.","PeriodicalId":231548,"journal":{"name":"Summit on Advances in Programming Languages","volume":null,"pages":null},"PeriodicalIF":0.0,"publicationDate":"1900-01-01","publicationTypes":"Journal Article","fieldsOfStudy":null,"isOpenAccess":false,"openAccessPdf":"","citationCount":null,"resultStr":null,"platform":"Semanticscholar","paperid":"125065440","PeriodicalName":null,"FirstCategoryId":null,"ListUrlMain":null,"RegionNum":0,"RegionCategory":"","ArticlePicture":[],"TitleCN":null,"AbstractTextCN":null,"PMCID":"","EPubDate":null,"PubModel":null,"JCR":null,"JCRName":null,"Score":null,"Total":0}
引用次数: 4
期刊
Summit on Advances in Programming Languages
全部 ACTA GEOL SIN-ENGL Ecol. Processes Chin. Phys. Lett. 2005 Asian Conference on Sensors and the International Conference on New Techniques in Pharmaceutical and Biomedical Research Environ. Eng. Res. Asia-Pac. J. Atmos. Sci. Environment and Natural Resources Journal Int. J. Biometeorol. ICARUS Environ. Chem. J. Space Weather Space Clim. [Hokkaido igaku zasshi] The Hokkaido journal of medical science Clim. Change Atmos. Res. 2012 IEEE 8th International Conference on E-Science ARCH ACOUST INFRARED PHYS TECHN Hydrol. Earth Syst. Sci. Can. J. Phys. Environ. Mol. Mutagen. 2011 International Conference on Electric Technology and Civil Engineering (ICETCE) 2008 Fourth International Conference on Natural Computation Appl. Clay Sci. European journal of biochemistry "Radiation and Risk" Bulletin of the National Radiation and Epidemiological Registry 环境与发展 FITOTERAPIA 2013 IEEE International Test Conference (ITC) Environ. Eng. Sci. Entomologisk tidskrift Appl. Phys. Rev. New Astron. Rev. Nat. Astron Environmental Sustainability J PHYS G NUCL PARTIC Am. J. Phys. Anthropol. Q. J. Eng. Geol. Hydrogeol. 2011 IEEE/ACM International Conference on Computer-Aided Design (ICCAD) J. Earth Sci. MNRAS Adv. Atmos. Sci. J. Mod. Opt. Geochem. Int. 2008 Annual Report Conference on Electrical Insulation and Dielectric Phenomena 2010 International Conference on Electrical and Control Engineering ECOL RESTOR ECOLOGY 2013 IEEE 39th Photovoltaic Specialists Conference (PVSC) Environ. Educ. Res, J. Environ. Eng. Geophys. J. Math. Phys. Environ. Geochem. Health Environ. Prot. Eng. J. Atmos. Chem. ATMOSPHERE-BASEL Aquat. Geochem. ARCT ANTARCT ALP RES Energy Environ. FETAL DIAGN THER ACTA PETROL SIN INDIAN J PURE AP PHY ARCHAEOMETRY Clean-Soil Air Water Basin Res. Environ. Technol. Innovation Geobiology 2011 Fourth International Conference on Information and Computing Clean Technol. Environ. Policy Environ. Res. Lett. PHOTONICS-BASEL Acta Geophys. Atmos. Meas. Tech. IZV-PHYS SOLID EART+ 航空科学与技术(英文) ACTA GEOL POL 测绘科学技术 Chem. Ecol. Archaeol. Anthropol. Sci. ENVIRONMENT Acta Geochimica Aust. J. Earth Sci. Appl. Geochem. Acta Oceanolog. Sin. APL Photonics AAPG Bull. Adv. Meteorol. Ann. Glaciol. J. Hydrol. Am. J. Sci. ASTRON ASTROPHYS Atmos. Chem. Phys. GEOLOGY Conserv. Genet. Resour. ENG SANIT AMBIENT ERN: Other Macroeconomics: Aggregative Models (Topic) Geochem. J. Commun. Theor. Phys. Annu. Rev. Earth Planet. Sci. Conserv. Biol. Ecol. Res.
×
引用
GB/T 7714-2015
复制
MLA
复制
APA
复制
导出至
BibTeX EndNote RefMan NoteFirst NoteExpress
×
0
微信
客服QQ
Book学术公众号 扫码关注我们
反馈
×
意见反馈
请填写您的意见或建议
请填写您的手机或邮箱
×
提示
您的信息不完整,为了账户安全,请先补充。
现在去补充
×
提示
您因"违规操作"
具体请查看互助需知
我知道了
×
提示
现在去查看 取消
×
提示
确定
Book学术官方微信
Book学术文献互助
Book学术文献互助群
群 号:481959085
Book学术
文献互助 智能选刊 最新文献 互助须知 联系我们:info@booksci.cn
Book学术提供免费学术资源搜索服务,方便国内外学者检索中英文文献。致力于提供最便捷和优质的服务体验。
Copyright © 2023 Book学术 All rights reserved.
ghs 京公网安备 11010802042870号 京ICP备2023020795号-1