标签: precompile

使用宏动态创建函数名称

我正在尝试创建一个宏(C/C++)来动态创建一个函数.基本上我有一个函数,其名称在"MyClassA"部分中有所不同.争论也应该通过宏定义来传递.然后在函数中有一个变量方法调用,例如"methodForClassA",再次使用一组变量的参数.

void Java_somepackage_MyClassA_fixMethod(int arg1, int arg2) {
Toolbox.methodForClassA(arg1, arg2);
}
Run Code Online (Sandbox Code Playgroud)

这种模式有40多种功能.当然我可以手动或用脚本创建它们.但是用宏来做这个也有可能吗?比如像这样的东西(不起作用):

# define MACRO_TEST(classname, methodname, args, argsMethod) void Java_somepackage_##classname_fixMethod(##args) {\
    Toolbox.##methodname(##argsMethod);\
} 
MACRO_TEST(MyClassA, methodForClassA, args1, args2)
Run Code Online (Sandbox Code Playgroud)

经过一些实验和阅读文档,我只能找到如何创建"动态"函数名称的模式,其中"("跟在动态部分之后:

#define FUNCTION(name, x) int func_##name() { return x;}
FUNCTION(test, 2);
Run Code Online (Sandbox Code Playgroud)

问候,

c macros precompile

6
推荐指数
1
解决办法
5884
查看次数

预编译时从js.erb文件访问模型

我有一个Rails 3应用程序,我试图用我的数据库中的每个Nation(少于300个国家)填充javascript变量作为JSON对象.这是我nations.js.erb文件中的相关行:

_this.nations = <%= Nation.all.to_json :only => [:id], :methods => :text %>;
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中调用我的js文件时,/assets/users.js这需要民族文件,该_this.nations变量完全填充.当我尝试进行预编译时,我得到以下内容:

$> rake assets:precompile
$> rake aborted!
uninitialized constant Nation (in nations.js.erb)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:是否可以Nationjs.erb文件中引用模型或任何模型进行预编译?我也尝试使用我的NationsHelper但我的错误只是改为未初始化的常量NationsHelper.

我对RoR很新,所以如果需要我没有提供的相关信息,请问问.

ruby-on-rails precompile asset-pipeline

6
推荐指数
1
解决办法
1274
查看次数

什么是javascript模板预编译?

我正在研究简单的模板引导我的javascript工作..它需要非常简单,所以我不使用Handlebars,小胡子或任何其他强大的模板引擎.

我一直在阅读" PRECOMPILE "或" COMPILE " 这个词,以提高性能.但我不确定那究竟是什么意思.在我的工作中,我将模板html缓存在我的对象中,以避免每次都碰到模板html.

这是一个非常简单的功能,主要做以下几点

_template = _template.replace(/\{(.+?)\}/g, function(token, match, number, txt) {
                    return item[match];
                });
Run Code Online (Sandbox Code Playgroud)

item是保存要替换的值的对象.

当有人(车把等)说编译模板时,有人可以告诉我它究竟意味着什么.?

javascript optimization templates precompile

6
推荐指数
2
解决办法
3717
查看次数

Javascript - 预编译正则表达式性能

这篇文章中,据说预编译正则表达式将提高脚本性能。作者通过性能测试证明了这一点。然而,据我了解,这篇文章讨论的是重复使用正则表达式的情况。如果脚本中有很多正则表达式,但每个正则表达式只使用一次怎么办?预编译在整个脚本中仅使用一次的正则表达式是否会带来性能优势?

javascript regex performance precompile

6
推荐指数
1
解决办法
8503
查看次数

如何在ant中使用jasper2预编译.jspf文件

.jspf文件是"Java服务器片段" - 仅适用于其他.jsp文件中的includes()的jsp.

预编译所有.jsp文件非常方便,因为它在构建时而不是运行时暴露语法错误,缺少导入,java代码错误等.在我们查看页面之前,我们都在.jsp中的拼写错误都没有出现.我正在将一个自动任务放入ant中以预编译我的所有JSP文件.(参见http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html#Web_Application_Compilation).

Tomcat的jsp编译器jasper2内置了一个假设,即所有jsp文件都有'.jsp'文件扩展名.这违反了当前建议在适当时使用.jspf文件扩展名.

问题: 如何编写一个ant任务来调用jasper2(又名jspC)来预编译所有.jsp文件,包括.jspf文件?

ant jsp tomcat precompile jsp-fragments

6
推荐指数
1
解决办法
3775
查看次数

预编译没有md5指纹的特定资产

在我的rails 4项目css使用字体文件.所以他们需要另外预编译.

我通过在config/environments/production.rb中添加以下行来实现这一目标

  # Add the fonts path
  config.assets.paths << Rails.root.join('vendor', 'assets', 'fonts','fonts')
  #
  # # Precompile additional assets
  config.assets.precompile += %w( *.svg *.eot *.woff *.ttf )
Run Code Online (Sandbox Code Playgroud)

并运行rake资产:在生产中预编译.

但结果如下:

I, [2013-10-10T19:27:51.931963 #16052]  INFO -- : Writing /var/lib/openshift/521e19c85004460a8e000107/app-root/runtime/repo/public/assets/fonts/glyphicons-halflings-regular-ab2f6984951c07fd89e6afdefabd93c7.eot
I, [2013-10-10T19:27:51.940615 #16052]  INFO -- : Writing /var/lib/openshift/521e19c85004460a8e000107/app-root/runtime/repo/public/assets/fonts/glyphicons-halflings-regular-24dfb40c91db789b8b8faba6886ac1ef.svg
I, [2013-10-10T19:27:51.950685 #16052]  INFO -- : Writing /var/lib/openshift/521e19c85004460a8e000107/app-root/runtime/repo/public/assets/fonts/glyphicons-halflings-regular-4b2130768da98222338d1519f9179528.ttf
I, [2013-10-10T19:27:51.983230 #16052]  INFO -- : Writing /var/lib/openshift/521e19c85004460a8e000107/app-root/runtime/repo/public/assets/fonts/glyphicons-halflings-regular-7a07f26f72466361ac9671de2d33fd1c.woff
Run Code Online (Sandbox Code Playgroud)

和css文件引用没有此md5指纹的字体文件.

我怎样才能预编译资产,以便在没有md5指纹的情况下生成资产?或者我应该在这种情况下将它们放到public/fonts /文件夹中?

assets ruby-on-rails precompile

6
推荐指数
1
解决办法
1082
查看次数

使用Gradle预编译JSP

我试图将我们的构建过程从Maven改为Gradle(V 2.9).在Maven中我正在使用JSP的预编译:

        <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-jspc-maven-plugin</artifactId>
            <version>9.2.7.v20150116</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <id>jspc</id>
                    <goals>
                        <goal>jspc</goal>
                    </goals>
                    <configuration>
                        <excludes>**\/*inc_page_bottom.jsp,**\/*inc_page_top.jsp</excludes>
                        <includes>**\/*.jsp</includes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
Run Code Online (Sandbox Code Playgroud)

它工作正常.现在我试图找到一种方法来做同样的gradle.我找到了一些信息/ build.gradle示例,但没有什么工作真的.我目前使用Tomcat 7作为servlet容器,我计划在几周内切换到8.当然,为目标servlet容器编译它们当然是完美的但首先我很乐意预编译它们就像我这样做与maven为/与码头.

我当前build.gradle的一部分,它给了我一个错误:

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.bmuschko:gradle-tomcat-plugin:2.2.4'
    }
}

apply plugin: 'com.bmuschko.tomcat'

tomcat {
    jasper {
        validateXml = true
        errorOnUseBeanInvalidClassAttribute = false
        compilerSourceVM = "1.8"
        compilerTargetVM = "1.8"
    }
}

task compileJsps(type: JavaCompile, dependsOn: 'clean') {
    dependsOn tomcatJasper
    group = 'build'
    description = 'Translates and compiles JSPs'
    classpath = configurations.tomcat + sourceSets.main.output + …
Run Code Online (Sandbox Code Playgroud)

jsp gradle precompile tomcat7

6
推荐指数
1
解决办法
3660
查看次数

StackExchange.Precompilation - 如何对预编译诊断进行单元测试?

背景

我正在使用StackExchange.Precompilation在C#中实现面向方面的编程. 在GitHub上查看我的存储库.

基本思想是客户端代码将能够在成员上放置自定义属性,预编译器将对具有这些属性的任何成员执行语法转换.NonNullAttribute我创建了一个简单的例子.何时NonNullAttribute放置参数p,预编译器将插入

if (Object.Equals(p, null)) throw new ArgumentNullException(nameof(p));
Run Code Online (Sandbox Code Playgroud)

在方法体的开头.


诊断很棒......

我想让错误地使用这些属性变得困难.我发现的最好的方法(除了直观设计)是Diagnostic为了无效或不合逻辑地使用属性创建编译时间.

例如,NonNullAttribute对值类型成员使用没有意义.(即使对于可以为空的值类型,因为如果你想保证它们不是null,那么应该使用非可空类型.)创建Diagnostic一个很好的方法来告知用户这个错误,而不会像这样构建崩溃一个例外.


......但我该如何测试它们?

诊断是突出错误的好方法,但我也想确保我的诊断创建代码没有错误.我希望能够设置一个可以预编译这样的代码示例的单元测试

public class TestClass {
    public void ShouldCreateDiagnostic([NonNull] int n) { }       
}
Run Code Online (Sandbox Code Playgroud)

并确认已创建正确的诊断(或在某些情况下未创建诊断).

任何熟悉StackExchange.Precompilation的人都可以给我一些指导吗?


解:

@ m0sa给出的答案非常有帮助.实现有很多细节,所以这里的单元测试看起来很像(使用NUnit 3).注意using staticfor SyntaxFactory,这消除了语法树构造中的大量混乱.

using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using NUnit.Framework;
using StackExchange.Precompilation;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

namespace MyPrecompiler.Tests {

    [TestFixture]
    public class NonNull_CompilationDiagnosticsTest {

        [Test]
        public void NonNullAttribute_CreatesDiagnosticIfAppliedToValueTypeParameter() …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing precompile roslyn

6
推荐指数
1
解决办法
108
查看次数

什么时候`@ static`运行?

@static expr是一种只运行expr一次的方法; 对于某种感觉.
但它有什么意义呢?

是吗:

  • 每次安装一次包装?
  • 每次包装一次?
  • 其他一些定义

最常见的用途是用于OS检查:例如 ccall((@static Sys.iswindows() ? :_fopen : :fopen), ...)

我想知道我是否可以使用它来生成基于环境变量的不同代码:特别是JULIA_NUM_THREADS.这个环境变量可以在julia的运行之间改变,但如果它在会话期间发生变化,则不会对它做出任何反应.

precompile julia

6
推荐指数
1
解决办法
226
查看次数

如何通过 Clang++ 生成和使用预编译头?

官方文档说明了如何通过接口使用预编译头-cc1,如下生成它们:

$ clang -cc1 test.h -emit-pch -o test.h.pch
Run Code Online (Sandbox Code Playgroud)

并使用它们:

$ clang -cc1 -include-pch test.h.pch test.c -o test.s
Run Code Online (Sandbox Code Playgroud)

问题是该-cc1接口的级别太低,开发人员无法通过 CLI 使用。-cc1事实上,常规高级接口最终会通过为其正确操作提供大量参数来调用低级接口,例如适合编译时系统的包含路径。如果没有这些参数,该-cc1界面就无法正常工作:

$ clang++ -cc1 /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h -emit-pch -o std.pch
/usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h:33:10: fatal error: 'cassert' file not found
#include <cassert>
         ^~~~~~~~~
         1 error generated.
Run Code Online (Sandbox Code Playgroud)

有没有办法从高层接口使用预编译头,以便开发人员在日常工作中可以方便地利用此功能?

c++ build clang precompile

5
推荐指数
1
解决办法
3190
查看次数