如何看待不同計算機語言使用對個人編程習慣的影響?
Python 轉 Java (來源推上 @thedirtycoder)
彙編轉c:gotogotogotogotogoto
c轉c艹:************a,alisp轉python:(lambda)(lambda)(lambda)(lambda)erlang轉ruby:-&>-&>-&>-&>-&>-&>
Js轉其他(python舉例):def a(x): ......... def b(x,a):............a(x) 沒prototype?def a(x):.......... def b(x)......... b.__code__ = a.__code__ 不用小數lisp轉java:別攔我,我要自殺,沒有macro怎麼編程c轉java:別攔我,為什麼沒指針c轉c#:unsafe一坨c艹轉go:艹檸檬D谷歌,這挺萌沒d面向對象的彙編的泛型。死耗子c轉go:手動開gc……一萬年沒動靜。c轉Haskell:腦殼痛,沒用的抽象廢話連篇,還有這麼多點(.)Scala轉其他:沒下劃線嗎?
…………………………………………………………懂的點贊,評論里發發其他的,謝謝我是Perl入門的編程。後來學C++,一開始只知道C和C++要自己管理內存,甚至不知道對象成員是可以直接平拍在裡面而不用指針的。於是:
struct Vec3
{
float x;
float y;
float z;
};
struct MotionObject
{
MotionObject();
~MotionObject();
Vec3* position; // 一切對象都是對象引用
Vec3* speed; // 嗯沒問題,和Perl的手感一樣
};
MotionObject::MotionObject()
{
// 嗯很好,手工控制內存分配
position = new Vec3;
speed = new Vec3;
}
MotionObject::~MotionObject()
{
// 嗯很好,手工控制內存分配
delete position;
delete speed;
}
不過即使寫成這麼碎片化,依然比Perl要快了很多。。。
==========
補充:由於不少人對C++不熟,這個代碼通常在C++里應當寫成這樣:
struct MotionObject
{
MotionObject() = defau<
virtual ~MotionObject() = defau<
Vec3 position;
Vec3 speed;
};
position和speed的「內存位置」,直接就在MotionObject的裡面。
我可能比較容易適應
比如我寫Java Kotlin的話就用駝峰和不換行
寫C#就用Pascal和換行寫Agda就迅速適應了它的utf8輸入
不是很懂那些把一個語言的習慣搬到另一個語言的我想知道有多少人像我一樣寫python也到處加分號Orz
每一位優秀的HDL老師,都會對剛入坑的各位碼農們說:
「請不要用C語言的思維來寫Verilog」不過依然有一群剛入行的萌新嘗試在屏幕上輸出helloworld
附一段輸出helloworld的代碼。
除此之外,請用VGA線把板子跟顯示器連接起來。`timescale 1ns/1ns
module lcd_display(input clk, //system clock
input rst_n, //sync clockinput [10:0] lcd_xpos, //lcd horizontal coordinate
input [10:0] lcd_ypos, //lcd vertical coordinate output reg [23:0] lcd_data, //lcd data output [7:0] add1);`include "lcd_para.v" `define LCD_COLOR_DEFAULT `YELLOW`define LCD_ADDR_AHEAD 9"d2 //lcd address ahead, it is very important//--------------------------------------------------------------
wire vip_area1 = (lcd_xpos &>= 0 lcd_xpos &<512) (lcd_ypos &>= 0 lcd_ypos &< 32);
wire [63:0] vip_data1; wire [8:0] vip_addr1 = lcd_xpos[8:0] - (9"d64 - `LCD_ADDR_AHEAD); //32*16 = 512assign add1 = vip_addr1[7:0];vip_rom1 u_vip_rom1 ( .clock (clk), .address (vip_addr1), .q (vip_data1));
wire vip_area2 = (lcd_xpos &>= 64 lcd_xpos &< 576) (lcd_ypos &>= 256 lcd_ypos &< 320);
wire [63:0] vip_data2; wire [8:0] vip_addr2 = lcd_xpos[8:0] - (9"d64 - `LCD_ADDR_AHEAD); //32*16 = 512vip_rom2 u_vip_rom2 ( .clock (clk), .address (vip_addr2), .q (vip_data2));
//--------------------------------------------------------------
//LCD char display with rom inputalways@(posedge clk or negedge rst_n)begin if(!rst_n) lcd_data &<= 0; else begin //Display : "Hello World*^_^*"if(vip_area1 == 1"b1)
if(vip_data1[6"d63-lcd_ypos[5:0]] == 1"b1) lcd_data &<= `GREEN; else lcd_data &<= `LCD_COLOR_DEFAULT; //Display : "I am CrazyBingo!" else if (vip_area2 == 1"b1) if(vip_data2[6"d63-lcd_ypos[5:0]] == 1"b1) lcd_data &<= `GREEN; elselcd_data &<= `LCD_COLOR_DEFAULT;
//Display : WHITE AREA
else lcd_data &<= `LCD_COLOR_DEFAULT; endendendmodule母語C++,轉C#的時候習慣性寫上了析構函數,寫完new之後第一個想法是delete,有毒。平常用自己的CovScript編程語言,突然要改一個C#的Bug,轉頭就開始寫for it iterate arr,有毒。在Java里習慣性寫上了class foo:public base
寫java的時候即使else只有一句也要加上花括弧,寫typescript/python/groovy的時候總忍不住想把代碼縮成一行。
在下易語言玩家
打中文可以不用看鍵盤,打英文需要經常看鍵盤,雖然都是一樣的東西。
強類型語言轉Python:我怎麼確定參數類型......IDE無法識別具體類型不提示方法or其它標識符。
js轉其他(py除外):
大括弧一定不能換行+a, a|0, ""+avar a, function a, var a = function... , var a = (...args) =&> ... if(a == undefined)這語言回調怎麼這麼麻煩.jpg這玩意能不能做成事件驅動.jpgarguments對象呢.jpg重載是啥意思.jpgcs轉其他(py除外):
大括弧不換行賊難受「這也配叫泛型」.jpg(說的就是java,因為c++不叫泛型叫模板).和-&>傻傻分不清TypeOfVariableForXYZ VariableXYZ;TypeOfReturnValueOfDoSomething DoSomething(TypeOfArgument NameOfArgument)總之名字一定要長長長長長長長長長長長長長長長長長C轉csjava:這個變數是值傳遞還是引用傳遞.jpg這語言星號沒用么.jpgthis-&> //C是可以用struct做oop的好吧……只不過析構比較麻煩這個影響確實存在我用js時思維非常精簡換了java腦子裡全是廢話
作為純 C 過來的人,我只說一句:
int (*fun(const char* (*t)(unsigned),char ch ,int Num))(unsigned (*)(char* const),double);
這是一個簡單的函數聲明。
鑒於很多人不是很擅長 C ,在此對這個聲明大概分析一下。
首先這是一個函數,函數名為 fun ,我們先分析返回值:
fun 函數的返回值為一個指向「返回值為int 的,參數為 unsigned (*)(char* const) 和 double 的函數 」的指針。
fun 函數的參數有三個:const char* (*t)(unsigned),char ch ,int Num 。
第一個參數 t :const char* (*t)(unsigned) , 是一個指向 「返回值為 const char* 的,參數為 一個 unsigned 變數的函數」的函數指針指針。
第二、三各參數,分別為字元型參數 ch 和 int 型參數 Num 。
最後我們開始分析 fun 函數的返回的函數指針的參數內容:
共有兩個參數,分別為 unsigned (*)(char* const) 和 double ,後者不解釋。
前者 unsigned (*)(char* const) 是一個指向「返回值為 unsigned 的,參數為一個 char* const 的函數」的函數指針。
舉例如下:
#include &
##include &
#include &
#include &
int (*fun(const char* (*t)(unsigned),char ch ,int Num))(unsigned (*)(char* const),double);
int FunPoint(unsigned (*f)(char* const),double value); // 先把 double 轉成字元串,然後字元串哈希
unsigned GetStringHashed(char* const); // 根據字元串生成哈希值
const char* GetString(unsigned int key); // 根據哈希值生成字元串
// 已知, GetStringHashed 和 GetString 互為逆運算
int main()
{
srand(time(NULL));
int (*hasher)(unsigned (*)(char* const),double) = fun( GetString , "H" , 2333 );
printf("%d",hasher(GetStringHashed,0.88622692545275801364908374167057));
}
int (*fun(const char* (*t)(unsigned),char ch ,int Num))(unsigned (*)(char* const),double)
// 比如可以根據逆哈希函數和兩個參數返回一個依賴於字元串哈希實現的double哈希函數
{
if( t == GetString ch 0x40 )
{
return FunPoint ;
}
}
const char* GetString(unsigned int key) 我覺得主要是寫代碼的思維影響比較大吧 最個人開始是寫C,然後c++,然後php,然後python,然後java。 以前寫C的時候,所有東西東西都是用順序的思維,封裝的意識很差 後來用C++,雖然知道了面向對象,但是很多時候還是以面向過程的思維去寫代碼。 後來java寫多了,啥都往類裡面塞 等我再回過頭來寫C++的時候,會特別注意封裝,恨不得啥都封裝成一個類 PS:深深覺得,寫python的程序員都很幸福
// 假定這個函數可以根據哈希值生成字元串
{
int len = key/0x41 ;
char* str = (char*)calloc(len+1,sizeof(int));
for(int i=0; i&
java轉python 別攔我 我要去買遊標卡尺!
學校教的C,直到現在用py的時候還會不由自主的printf
網易雲遇到一個村民說邊聽著歌搖頭邊編程我就知道,他絕對不是Python程序員
有誰跟我一樣奇葩的入門語言是pascal,後來學C的時候覺得居然可以少寫這麼多單詞... 完全解放了輸入生產力呀,直到後來繼續學了C++
用習慣python以後 覺得 ; {} 什麼的好麻煩~~~~
我寫C的
高中數學不是有個演算法嘛,裡面有寫代碼的
我硬生生的用python的縮進和C的分號了
幾個月前給 Linux kernel 提 PR 像對待 JS 一樣壓縮了 C 代碼的哥們兒可以回答一下這個問題。
https://github.com/torvalds/linux/pull/437推薦閱讀:
※對於程序員來說,什麼叫良好的編碼習慣,怎麼樣養成良好的編碼習慣?
※如何學習python,就能僅靠python得到好工作?
※Steam的「遊戲內界面」是什麼原理,為什麼在自己添加的非 Steam 遊戲下也可以打開?
※應該如何理解 Client/Server?
※作為一個計算機學生,要如何預防頸椎病?