全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

用C语言模仿Python函数的实例

首先得说明一点,C 语言不是函数式编程语言,要想进行完全的函数式编程,还得先写个虚拟机,然后再写个解释器才行(相当于 CPython )。

下面我们提供一个例子,说明 C 语言函数可以“适度地模仿” Python 函数。

我们有如下的 Python 程序:

def line_conf(a, b):
  def line(x):
    return a*x + b
  return line

line1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5), line2(5))

 我们在C程序中适度地模拟其中的line_conf函数:

/* MIT License

Copyright (c) 2017 Yuandong-Chen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE. */

///////////////////////////////////////////////////////////////////////////////

// Note: The C program is almost equivalent to the Python program as follows:
// def line_conf(a, b):
//   def line(x):
//     return a*x + b
//   return line
//
// line1 = line_conf(1, 1)
// line2 = line_conf(4, 5)
// print(line1(5), line2(5))

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <stdarg.h>

typedef int Func();

Func *line_conf(int x, int y,...)
{ 
  va_list ap; 
  va_start(ap, y);

  asm volatile(
    "push %%eax\n\t"
    "subl $40, %%esp\n\t"
    "movl 8(%%ebp), %%eax\n\t"
    "movl %%eax, -36(%%ebp)\n\t"
    "movl 12(%%ebp), %%eax\n\t"
    "movl %%eax, -40(%%ebp)\n\t"
    "addl $40, %%esp\n\t"
    "pop %%eax\n\t"
    :::"memory"
    );

if(va_arg(ap,int) == 1){

LINE:

  asm volatile(
    "push %%ebp\n\t"
    "movl %%esp, %%ebp\n\t"
    "movl 8(%%ebp), %%eax\n\t"
    "imul -36(%%ebp), %%eax\n\t"
    "addl -40(%%ebp), %%eax\n\t"
    "movl %%ebp, %%esp\n\t"
    "pop %%ebp\n\t"
    "ret\n\t"
    :::"memory","%eax"
    );
}  
__END: 
  va_end(ap);
  return (Func *)(&&LINE);
}

int main(int argc, const char *argv[]){ 
  printf("====TEST START====\n");
  printf("34*234+6 ?= %d\n",line_conf(34,6)(234));
  printf("1*3+2 ?= %d; 324*65+3 ?= %d; 13*66+2 ?= %d\n",line_conf(1,2)(3),line_conf(324,3)(65),line_conf(13,2)(66));

  int fd = line_conf(1,6)(4);
  Func *fun = line_conf(3,3);
  int a = 1; // Limited point
  printf("3*3+3 ?= %d; 1*4+6 ?= %d\n",fun(3),fd);
  printf("====TEST END====\n");
  return 0; 
}

// Compile it by the following command:
// gcc -m32 -O0 -fno-stack-protector CFunctional.c; ./a.out
// The terminal output should looks like:
// ====TEST START====
// 34*234+6 ?= 7962
// 1*3+2 ?= 5; 324*65+3 ?= 21063; 13*66+2 ?= 860
// 3*3+3 ?= 12; 1*4+6 ?= 10
// ====TEST END====
//Note: The limitation happens between line 86 and line 88, we cannot insert any function here
// whose stack is larger than 40 bytes.(Why is 40? check the inline assembler language)

结果在MacOSX和Ubuntu上(i386)都能通过简单的测试。但是可以看到,仅仅是简单的模拟,我们也得用到大量(按比例)的汇编,可读性很差,而且模拟程度非常有限,代码长度也更长。相反,对于这类一般功能的函数,Python可以很容易地模拟C语言的函数,而且模拟程度很高。

以上这篇用C语言模仿Python函数的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# python  # c语言  # Python调用C语言的实现  # python和c语言的主要区别总结  # python 调用c语言函数的方法  # 浅谈python和C语言混编的几种方式(推荐)  # 用C语言模仿Python函数的一种简单实现方法  # python和c语言哪个更适合初学者  # 给大家  # 都能  # 很容易  # 很高  # 这类  # 希望能  # 要想  # 可以看到  # 仅仅是  # 还得  # 也得  # 这篇  # 才行  # 提供一个  # 很差  # 小编  # 更长  # 大家多多  # 编程语言  # 按比例 


相关文章: 网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何用花生壳三步快速搭建专属网站?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  建站168自助建站系统:快速模板定制与SEO优化指南  如何在VPS电脑上快速搭建网站?  如何选择美橙互联多站合一建站方案?  如何用搬瓦工VPS快速搭建个人网站?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  如何安全更换建站之星模板并保留数据?  建站主机无法访问?如何排查域名与服务器问题  如何获取上海专业网站定制建站电话?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  广东专业制作网站有哪些,广东省能源集团有限公司官网?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  Python lxml的etree和ElementTree有什么区别  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  建站主机核心功能解析:服务器选择与网站搭建流程指南  实例解析angularjs的filter过滤器  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  清除minerd进程的简单方法  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  公司网站制作价格怎么算,公司办个官网需要多少钱?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  如何通过网站建站时间优化SEO与用户体验?  实现虚拟支付需哪些建站技术支撑?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何选择CMS系统实现快速建站与SEO优化?  如何在IIS中配置站点IP、端口及主机头?  企业微网站怎么做,公司网站和公众号有什么区别?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何通过远程VPS快速搭建个人网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  深入理解Android中的xmlns:tools属性  建站主机是什么?如何选择适合的建站主机?  购物网站制作公司有哪些,哪个购物网站比较好?  如何在七牛云存储上搭建网站并设置自定义域名?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  如何在IIS服务器上快速部署高效网站?  网站网页制作专业公司,怎样制作自己的网页?  建站之星Pro快速搭建教程:模板选择与功能配置指南  Python多线程使用规范_线程安全解析【教程】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  建站10G流量真的够用吗?如何应对访问高峰?  如何通过智能用户系统一键生成高效建站方案?  如何在新浪SAE免费搭建个人博客?  ,网站推广常用方法?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。