How to find source of non generic functions?

时间:2017-12-18 08:02:50

标签: julia

Find source of generic functions is (thanks to Julia introspection) easy:

String brokerUrlRpi_Mqtt = "tcp://localhost:1883";
String clientId="ExamplePublish";
String channel = "SensorIntegratedData";
int qos=0;

public void publish(String data) throws MqttPersistenceException, MqttException {
  String time = new Timestamp(System.currentTimeMillis()).toString();
  System.out.println("Publishing at: "+time+ " to topic \""+channel+"\" qos "+qos);
  MqttMessage message = new MqttMessage(data.getBytes());
  message.setQos(qos);
  message.setRetained(false);
  client.publish(channel, message);
  // Disconnect the client
}   

I see it is defined in @edit sizeof("") as

julia/base/strings/string.jl

Is there similar way how to find source of Core.size function?

Help is not very helpful:

sizeof(s::String) = Core.sizeof(s) 

1 个答案:

答案 0 :(得分:2)

正如你和Dan Getz在评论中所做的那样,这是一个内置功能。 Julia有一组“原始”函数(列表starts here),由Julia的编译器显式处理。其中许多都直接映射到特定的CPU instructions,但是以通用形式(例如,添加但通常用于CPU和FPU支持的所有类型)。粗略地说,Julia的编译器管道接受代码并对其进行转换(降低),执行类型推断和内联,并最终将其简化为对高级函数(未内联的函数)或内置函数的一组函数调用。 。也许违反直觉,在大多数情况下没有内置函数的C实现:相反,内置函数仅仅作为代码生成器的“信号”,它采用这些大大减少的表达式并发出{{3并让LLVM生成本机代码。对于sizeof的特定情况,这里是LLVM IR

这样做是有充分理由的:

  • 如果您调用了C函数jl_sizeof,则必须支付函数调用的代价,与许多基本CPU指令相比,它是code to generate the LLVM IR。例如,如果朱莉娅的getindex(支持数组访问A[i,j])以这种方式实现,那么朱莉娅不会被认为是一种快速语言 - 它只是因为最终{{1}而快}导致内联LLVM IR(对于类型推断成功的情况)。
  • C缺乏Julia对类型和重载函数的惊人灵活性:你必须调用更类似于C ++模板特化的东西,而现实是发出LLVM比让编译器有效编写C ++更容易你(事实上,这是LLVM的重点)。

如果您想了解有关IR生成的更多信息,我发现的最佳资源是quite expensive。完成本教程需要一些时间才能有用,但它肯定会使Julia的一些内部结构变得神秘。