什么样的语言干什么样的事

简介: 什么样的语言干什么样的事

什么样的语言适合什么样的工作,这里拿「C」「python」来做对比。

C语言是强类型语言,他的特点就是「他什么都有,也什么都没有」。这样说是因为C里面都是很底层的语法,他需要你去管理内存,需要你去自定义一些数据结构,更快的处理速度。

Python是弱类型语言,相比C而言,它提供了很多现成的数据结构(比如字典、元组等等),他还有面向对象的写法,与此同时也不需要你去进行内存管理。

二者相比,我认为没有谁更好,只有谁更合适。

拿一个最简单的场景,字符串合并。这个需求在python里面实现非常简单

str1 = "1111111111111"
str2 = "22222222222222"
concat = str1 + str2

但是在C里面因为需要考虑内存的缘故,这件事情相对而言就没那么简单了,你需要去动态的申请内存,然后还要记得去释放你的这块内存。

#include <stdlib.h>
#include <string.h>
char* msa_strcat(const char* s1, const char* s2) {
  size_t s1_len = strlen(s1);
  size_t s2_len = strlen(s2);
  char* new_str;
  if ((new_str = calloc(1, s1_len + s2_len + 1)) == NULL) {
    return NULL;
  }
  strcat(new_str, s1);
  strcat(new_str, s2);
  return new_str;
}
int main() {
  char* str1 = "1111111111111";
  char* str2 = "22222222222222";
  char* concat = msa_strcat(str1, str2);
  free(concat);
  return 0;
}

再拿一个很简单的需求,字符串分割,这个在python里面,实现起来只需要一行

str1 = "1,2,3,4,5,6"
ret = str1.split(',')

C里面则需要很多行

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char** splitBySep(char* data, size_t* count, const char* sep) {
  char** ret;
  size_t data_len = strlen(data);
  size_t sep_len = strlen(sep);
  /* 统计有多少个分割符sep */
  if (!(*count)) {
    char* split_sep;
    if ((split_sep = calloc(sep_len + 1, sizeof(char))) == NULL) return NULL;
    for (size_t i = 0; i < data_len - sep_len - 1; i++) {
      memcpy(split_sep, data + i, sep_len);
      if (strcmp(split_sep, sep) == 0) (*count)++;
    }
    free(split_sep);
    /* 分割后的结果个数是sep的个数加1 */
    (*count)++;
  }
  if ((ret = calloc((*count), sizeof(char*))) == NULL) return NULL;
  size_t count_finish = 0;
  char* block;
  char* s;
  for (block = strtok(data, sep); block != NULL; block = strtok(NULL, sep)) {
    if ((s = calloc(strlen(block) + 1, sizeof(char))) == NULL) goto clean;
    memcpy(s, block, strlen(block));
    ret[count_finish] = s;
    count_finish++;
  }
  return ret;
clean:
  for (size_t i = 0; i < count_finish; i++) {
    free(ret[i]);
  }
  free(ret);
  return NULL;
}
void freeSplitRet(char** ret, size_t count) {
  for (size_t i = 0; i < count; i++) {
    if (ret[i] == NULL) continue;
    free(ret[i]);
  }
  free(ret);
}
int main(){
    char* str1 = "1,2,3,4,5,6";
    size_t count = 0;
    char* sep = ",";
    char** ret = splitBySep(str1, &count, sep);
    freeSplitRet(ret, count);
    return 0;
}

这样对比的话,可以发现C在处理一些字符串方面是不如python的,但是C的计算速度更快,对内存的管理更加精细,可以通过自定义数据结构(结构体)来实现Python里面任意的一个自带数据结构,或者说,「C」是面粉,「Python」是面条,各有各的伟大。

大部分时候,做一件事情,往往有目的性,有侧重点。如果你要追求速度,那么在处理字符串的时候,虽然C语言写起来有点麻烦,但是“写起来麻烦”已经变成了次要矛盾。如果你对速度的要求不高,python会是你的一个很好的选择。所以,当你还在纠结使用那种语言的时候,不妨先停下来认真看看你的问题是什么。

最后,这几天一直在写C语言,我的感觉是C好厉害,什么都能干,想要什么样的数据结构都能构造出来,在python里面虽然也可以通过类来实现一个自定义的数据结构,但是总感觉python缺点什么,不如C的正宗。

相关文章
|
6月前
|
算法 程序员 API
C 语言和 C++ 有什么区别?老程序员居然这样理解,不怕你不懂
C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制)
56 0
|
4天前
|
设计模式 Java 程序员
成为程序员后你都明白了什么?
成为程序员后你都明白了什么?
13 1
|
9月前
|
SQL 人工智能 Java
程序员:你见过哪些要命的奇葩代码?
程序员:你见过哪些要命的奇葩代码?
82 0
|
消息中间件 Oracle Dubbo
Java 之父偏爱函数式编程,反而被队友讨厌:编码风格简直像疯子!
Java 之父偏爱函数式编程,反而被队友讨厌:编码风格简直像疯子!
|
安全 Java 程序员
惊呆了!Java程序员最常犯的错竟然是这10个(一)
惊呆了!Java程序员最常犯的错竟然是这10个
71 0
|
Java 程序员 编译器
惊呆了!Java程序员最常犯的错竟然是这10个(二)
惊呆了!Java程序员最常犯的错竟然是这10个
85 0
惊呆了!Java程序员最常犯的错竟然是这10个(二)
|
JavaScript 程序员 C语言
能一眼看懂这些C语言函数,你就是天生的程序员!
喜欢这篇文章的朋友可以多多收藏、点赞、关注 一条龙~
1622 0
|
程序员
像我这样的人,除了写代码,还能干啥?
作者:陆小凤 出处:公众号【程序员江湖】 很久没有写原创了,究其原因还是因为变懒了。 人总是会输给自己的惰性,上一秒还在看书,下一秒可能就被抖音、王者荣耀缠住以至于无法脱身。
|
Java 程序员 C语言
一个C++ 程序员的生产力,大概相当于20个C程序员,200个java程序员,如何看待这句话?
每种语言都有其独特的优势,没有所谓谁厉害谁更差劲,真正的程序员修炼的是编程思想而不是拘泥于编程语法。最合适的就是最好的。
3862 0