Visual Studio 11开发指南(4)Visual Studio 11编程语言发展

最后更新于:2022-04-01 10:26:57

**JavaScript 和交互性** 在Visual Studio 11中,JavaScript成为构造Windows和Web应用程序的第一类语言,都被Visual Studio中最好的工具所支持。除了全面的语言支持ECMAScript 5,显著改善智能显示(包括在大的JavaScript文件上更好的性能和得到很大改善的精确度),编辑器支持例如“跳转到定义”的操作,而且完全支持对Visual Studio中其他支持语言的调试,Visual Studio现在也提供新的集成调试窗口,与HTML/JavaScript应用程序调试交互。 新的DOM Explorer窗口通过HTML Document Object Model (DOM)深入探索和操作元素,样式以及更多。 [**![clip_image002](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf147891df.jpg "clip_image002") **](https://byfiles.storage.live.com/y1pv5KH-Gu9UahDjEYsGI-Jmk9Gq4hf7Ep8fDS_Uw4nYnlqo0fv8jUf2PLCcIGE_Pb_CqXNMCrEqn4/DOMExplorer.png?psid=1) 而且新的JavaScript控制台窗口提供对JavaScript的读-估计-打印循环(REPL),直接集成到Visual Studio中。这给运行的应用程序提供了实时运行的窗口,支持任何JavaScript表达式的评估。这结果也支持可视化,如下列屏幕截图所示: [**![clip_image004](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf147a8e4e.jpg "clip_image004") **](https://byfiles.storage.live.com/y1pYw-t0Ph-er1UA0fgckJGXv6-BVVCuL01JmHY3MQ-Tpn3y7cpyjGnnMkyquiURVnfNpjrX6d8Kow/JavaScriptConsole1.png?psid=1) 当计算表达式应用到当前应用程序的上下文时,你甚至可以定义新的功能,然后从控制台窗口直接使用这些功能: [**![clip_image006](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf147c450c.jpg "clip_image006") **](https://byfiles.storage.live.com/y1p6M2ruHE7yppyLEHFxUBWYLfxJmWSlmr0vVPKJj56EK4and0euCiKcZOyJVav0sajx1dqbravjXI/JavaScriptConsole2.png?psid=1)   **C#,Visual Basic,和异步** 通过C#和Visual Basic直接探索异步编程的集成。在Visual Studio 11开发者预览中,这已经成为了C# 5 和Visual Basic 11的一部分。 众所周知,异步编程是如何实现用户界面和可伸缩应用程序的响应,但这样的技术也很难实施。这些系统在每个操作只包含一次异步调用时仍然相对简单,但随着我们的世界发展为对一切都是以异步方式开放的,这样的操作变得很稀少。相反,在复杂的回调代码定位到最微不足道的模式之后,开发人员被迫写回调代码,像一个在调用时被排在另一个之后。几年来,当异步编程时,现代语言给我们的主要是不可用的控制流结构。现在,有了这些新的C# 和Visual Basic的异步语言功能,开发人员可以将他们当同步一样写异步代码,如所有使用这些语言提供的种种控制流结构,包括对循环的支持,条件,短接,和更多。 有了这些功能,我们可以为该设施提供Visual Studio的调试功能。例如,当调试时我们“跳过”(F10)一个声明,包括一次等待: [**![clip_image008](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf147db329.jpg "clip_image008") **](https://byfiles.storage.live.com/y1pbGwiqp9tvXfL6TFsA8TinfwgDD9jJlz9DOw3HAgt2S4BVlbwQ2g2dxxsViY51ZS7fapc2NIljcY/AsyncDebug1.png?psid=1) 它会表现的像你期待的那样,移动到逻辑控制流中随后的行,哪怕该代码像一个重写的继续回调异步调度中的一部分。 [**![clip_image010](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf14801946.jpg "clip_image010") **](https://byfiles.storage.live.com/y1pv5KH-Gu9Uah7HQXsY9CAq4CTjZ0g04UX4Yb3ely6VFYbQqd4gtIUvmdJoHwECXjVCPd49iZr3B4/AsyncDebug2.png?psid=1)   **C++ 和平行** Visual Studio对C++的支持。这不仅包括对C++11标准库,改进IDE支持(如引用突出显示和语义着色),和生成全部-本地Windows Metro样式应用程序的全部支持,也包括对平行提供丰富的新语言和库。 对Visual Studio 11中的Visual C++来说是新的,通过在他们的项目中利用大规模并行加速器(主要是GPUs),它使C++开发人员可以轻松编写代码。在常规的C++代码中,开发人员可以使用parallel_for_each方法调用lambda,该lambda被批注为“restrict(direct3d)”,这将导致编译器为lambda生成目标为DirectX加速器的代码。在下面的例子中,parallel_for_each方法被用来循环访问所有输出矩阵的指数,以计算两个输入矩阵的乘积。 ~~~ void MatrixMultiply( std::vector<float>& vC, const std::vector<float>& vA, const std::vector<float>& vB, int M, int N, int W) { array_view<const float,2> a(M, W, vA); array_view<const float,2> b(W, N, vB); array_view<writeonly<float>,2> c(M, N, vC); parallel_for_each(c.grid, [=](index<2> idx) restrict(direct3d) { int row = idx[0]; int col = idx[1]; float sum = 0.0f; for(int i = 0; i < W; i++) sum += a(row, i) * b(i, col); c[idx] = sum; }); } ~~~ 不仅C++ AMP代码部分直接集成进源文件并用标准C++语法表示,Visual Studio也提供对这些内核的完整调试,支持基本的功能如断点和分步执行,而且提供对调试窗口如查看, 本地和并行栈,与新的GPU线程和并行查看窗口的完全支持。 C++ AMP不是Visual Studio 11中唯一针对并行现象的为本地代码而作的努力。当它决定可做的操作时,C++编译器现在也自动完成循环。例如,对下面的代码来说,编译器会尝试利用SSE指令在cpu上运行多个迭代的for循环作为单操作的一部分,这将大大加快计算速度: ~~~ float a[1000], b[1000], c[1000]; … for(int i=0; i<1000; i++) c[i] = a[i] + b[i]; ~~~ C++编译器现在不仅自动向量化,还具有自动并行化的功能。而且包括Visual C++的并行库已经被极大扩展,包括更多的并行数据结构,并行算法,和一个更新的类似于在.NET Framework中被Task Parallel Library (TPL)使用的任务栏模式。   **F# 和数据访问** 并非所有语言都需要同样支持每个域和每个用例:如果他们这样做,会有多种语言需要更少的支持,。最终往往语言的发展迎合特定的域和特定的样式,而且我特别高兴我们对某一语言的投入成为了该规则的极好示例:即F#。通过Visual Studio 2010中的F# 2.0,我们提供了一种着重于加速计算复杂问题的解决方案。通过Visual Studio 11中的F# 3.0,我们继续保持着重于特别问题域的趋势,通过直接集成支持解决数据复杂问题。 F#是一种静态类型的语言,如同C#和Visual Basic,而且这种静态类型有很多优势。它通过支持像准确的智能提示的功能来提高开发经验。由于更多优化可用在编译时,它可以产生更好的性能。通过消除一些常见类型的错误,它也可以减少开发和测试成本。 然而,也有时候静态类型导致比动态类型需要更多代码。有一个极好的例子,世界上有非常丰富的信息,这在我们日常的软件生活中正在经历的越来越多。所有这些数据通常以非强类型方式进入我们的程序,在它公开到其他程序之前,首先需要分析和处理为强类型的对象。相比开发人员手动编程导入例程,这个问题已经被设计时代码生成处理为历史问题(例如,设计时工具导入一个Web服务描述然后生成必要的代理代码)。不幸的是,这种方法有问题,它与不断演变本质的数据源之间的交互性很差,如web上的数据。这会导致非常臃肿的客户端代码(为代表整个架构和元数据而生成的类型,不管客户端程序是否使用它们)。而且它没有顺利与脚本环境集成,如Visual Studio中的F#互动窗口。 通过F# 3.0中新的类型提供者机制,对F#程序和组件来说这种数据访问变的繁琐。同样,因为F#面向.NET Framework,用C# 或Visual Basic(或其他托管语言)写的应用程序可以通过F#组件利用这种新功能。使用F#编译器的可扩展机制,受影响的类型提供商可以给需要的库提供数据访问,在设计时和编译时用支持智能提示而且可扩展的方式可使类型和方法计算空间收益,。F# 3.0的库包括Odata,WSDL,和SQL (通过LINQ to SQL 和LINQ to Entities)的类型提供者,但是客户类型提供者也可能被写进目标任意数据源,如SharePoint列表和WMI提供者。 作为示例,请考虑一种想法去搜索Netflix目录与一部分人分享我的“S.”名字对象。Netflix公开一个Odata,这样就能被Odata类型提供商使用。 ~~~ open Microsoft.FSharp.Data.TypeProviders [<Generate>] type netflixCatalog = ODataService<"http://odata.netflix.com/Catalog/"> let netflix = netflixCatalog.GetDataContext() query { for person in netflix.People do where (person.Name.StartsWith "S. ") sortBy person.Name take 5 } |> Seq.iter(fun result -> printfn "%s" result.Name) ~~~ 我们不仅能够轻易导入相关元数据和快速查询,也可以通过经验查看智能显示: [**![clip_image012](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf1481be8d.jpg "clip_image012") **](https://byfiles.storage.live.com/y1pLBUCvHQeaoShFeNgMiHqGM6rLtLMmstnjsASrxC8MkKoHA-UavR3LNSg69k82kn3gQR9YrPPyHU/FSharpIntelliSense.png?psid=1) 而且这样的代码不仅能在F#应用程序中写,也可以直接在F# 交互窗口中写: [**![clip_image014](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-01_56fdf1482e7ce.jpg "clip_image014") **](https://byfiles.storage.live.com/y1pYw-t0Ph-er32ncbaSJQE7pknypqHvY-kZ9u0yRvDmtwwgSEG21v9vmQ7yQy00rwM-EUXJoU4ISY/FSharpInteractive.png?psid=1)   赶紧下载VS11体验吧 [http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144](http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144)    
';