OpenQASM(open quantum assembly language),即開放量子匯編語言,是一種命令式編程語言,它的特性類似于硬件描述語言(hardware description language),由 IBM 于 2017 年 7 月在其量子計(jì)算平臺推出,它能夠使用電路模型、基于測量的模型和近期量子計(jì)算實(shí)驗(yàn)來描述通用的量子計(jì)算,也是目前適用范圍較廣的量子匯編語言,目前已更新至 3.0 版本。
OpenQASM 作為一個開源框架,廣泛用于基于門的設(shè)備的量子程序規(guī)范。借助 OpenQASM,用戶可以對構(gòu)成量子計(jì)算基石的量子門和測量操作進(jìn)行編程。目前,許多量子編程庫使用先前版本的 OpenQASM 2.0 來描述簡單的程序。
OpenQASM 在框架中提供了一組參數(shù)化的物理邏輯門和并發(fā)的實(shí)時經(jīng)典計(jì)算的集合。它的主要目標(biāo)是作為高級編譯器與量子硬件通信的中間表示載體,在表示形式上,也考慮到了人們使用它時的易讀性。特別是,該語言允許同一程序的不同表示形式,所以 OpenQASM 可以由 Composer 生成,也支持手寫,或者由更高層次的軟件工具來完成,比如 ProjectQ、Quil、Liquid 等等。
OpenQASM 3.0 與之前版本相比,增加了更多功能,例如脈沖電平控制、門定時和經(jīng)典控制流程,以彌補(bǔ)最終用戶界面和硬件描述語言之間的差距??偨Y(jié)起來,基本集中在以下三個方面:
遵循上述設(shè)計(jì)目標(biāo),OpenQASM 3.0 相比之前的 OpenQASM 2.0 規(guī)范進(jìn)行了大幅擴(kuò)展升級。增加了許多經(jīng)典控制流和計(jì)算的新功能,使編寫量子算法更容易,并描述構(gòu)成這些算法一部分的經(jīng)典數(shù)據(jù)處理。然而,該語言并非設(shè)計(jì)用于通用經(jīng)典計(jì)算,并且在短期內(nèi),任何執(zhí)行 OpenQASM 3.0 程序的硬件都不太可能支持該語言可以描述的全套數(shù)據(jù)操作。
OpenQASM 3.0 的硬件能夠保證它們在運(yùn)行時將處理性能穩(wěn)定在高效和實(shí)時執(zhí)行的操作上。這組操作在不同的實(shí)現(xiàn)工具下,實(shí)現(xiàn)方式會根據(jù)硬件種類略有所不同,需要提前了解不同硬件在運(yùn)行時可以實(shí)現(xiàn)哪些語言功能。隨著時間的推移,隨著量子控制的要求變得不那么繁重,實(shí)現(xiàn)組件可能會變得更加強(qiáng)大。
在將來 OpenQASM 3.0 的編譯器也會支持一些經(jīng)典操作,這些經(jīng)典操作會被合理地判斷為編譯時常量,并在編譯時執(zhí)行這些操作。上面所說到的“合理推斷”是指聲明為常量的值以及字面意義。例如,這意味著“科學(xué)計(jì)算器函數(shù)”(如sin、exp 等)將始終對只涉及兼容類型的字面符號和聲明為常量的值的表達(dá)式起作用,而且編譯器會將這些表達(dá)式完全折疊成單個常量。具體能夠如何實(shí)現(xiàn),還需要我們繼續(xù)等待相關(guān)的適配工作。
因?yàn)槟壳安皇撬谢陂T的量子設(shè)備和模擬器都支持 OpenQASM 3.0 ,所以在一些代碼示例中,將會使用部分 OpenQASM 2.0 的內(nèi)容。
首先展示一下如何利用 OpenQASM 中的語法規(guī)則設(shè)置部分量子門:
OPENQASM 2.0;
include "qelib1.inc";
qreg q[10];
creg c[10];
x q[0];
h q[1];
tdg q[2];
sdg q[2];
cx q[0],q[2];
cx q[1],q[4];
u1(pi) q[0];
u2(pi,pi) q[1];
u3(pi,pi,pi) q[2];
cz q[2],q[5];
ccx q[3],q[4],q[6];
cu3(pi,pi,pi) q[0],q[1];
measure q[2] -> c[2];
measure q[0] -> c[0];
可以看到,OpenQASM 會直接對需要進(jìn)行轉(zhuǎn)置共軛操作的量子邏輯門與量子線路進(jìn)行直接轉(zhuǎn)化;并且在對量子程序轉(zhuǎn)化 QASM 指令集之前,會對其中包含的控制操作進(jìn)行分解。
目前在已開源的量子編程框架中,本源量子的 QPanda 框架提供了 QASM 轉(zhuǎn)換的工具接口的,接口為std::string convert_qprog_to_qasm(QProg &, QuantumMachine*),使用方式也較為簡單。接下來我們可以來看看QPanda框架是如何進(jìn)行QASM轉(zhuǎn)換的:
#include "QPanda.h"
USING_QPANDA
int main(void)
{
auto qvm = CPUQVM();
qvm.init();
auto prog = QProg();
auto cir = Circuit();
auto q = qvm.qAllocMany(6);
auto c = qvm.cAllocMany(6);
// 構(gòu)建量子程序
cir << Y(q[2]) << H(q[2]);
cir.setDagger(true);
auto h1 = H(q[1]);
h1.setDagger(true);
prog << H(q[1])
<< X(q[2])
<< h1
<< RX(q[1], 2 / PI)
<< cir
<< CR(q[1], q[2], PI / 2)
<<MeasureAll(q,c);
// 量子程序轉(zhuǎn)換QASM,并打印QASM
std::cout << convert_qprog_to_qasm(prog,qvm);
return 0;
}
具體的操作步驟是這樣的:
最終的輸出結(jié)果如下:
OPENQASM 2.0;
include "qelib1.inc";
qreg q[6];
creg c[6];
h q[1];
x q[2];
h q[1];
rx(0.636620) q[1];
h q[2];
y q[2];
rz(-0.785398) q[2];
cx q[1],q[2];
rz(-0.785398) q[2];
cx q[1],q[2];
rz(1.570796) q[2];
rx(1.570796) q[1];
ry(-0.785398) q[1];
rx(-1.570796) q[1];
measure q[0] -> c[0];
measure q[1] -> c[1];
measure q[2] -> c[2];
measure q[3] -> c[3];
measure q[4] -> c[4];
measure q[5] -> c[5];
接下來我們可以看看目前已經(jīng)支持了 OpenQASM 3.0 的 Amazon Braket,是如何利用 OpenQASM 3.0 語言的:
具體示例為如何利用 Braket 創(chuàng)建一個 OpenQASM 3.0 任務(wù)。比如,從準(zhǔn)備一個Gz狀態(tài)開始:
// ghz.qasm
// Prepare a GHZ state
OPENQASM 3;
qubit[3] q;
bit[3] c;
h q[0];
cnot q[0], q[1];
cnot q[1], q[2];
c = measure q;
或者我們還可以使用 Boto 3 創(chuàng)建 OpenQASM 3.0 任務(wù)。在下面的實(shí)例中,使用了 ghz.qasm:
import boto3
import json
my_bucket = "Amazon-braket-my-bucket"
s3_prefix = "openqasm-tasks"
with open("ghz.qasm") as f:
source = f.read()
action = {
"braketSchemaHeader": {
"name": "braket.ir.openqasm.program",
"version": "1"
},
"source": source
}
device_parameters = {}
device_arn = "arn:aws:braket:::device/qpu/rigetti/Aspen-11"
shots = 100
braket_client = boto3.client('braket', region_name='us-west-1')
rsp = braket_client.create_quantum_task(
action=json.dumps(
action
),
deviceParameters=json.dumps(
device_parameters
),
deviceArn=device_arn,
shots=shots,
outputS3Bucket=my_bucket,
outputS3KeyPrefix=s3_prefix,
)
在噪聲模擬方面,我們也可以使用 OpenQASM 3.0 來完成。在 Braket 中提交以下程序即可完成噪聲模擬:
// ghz.qasm
// Prepare a GHZ state
OPENQASM 3;
qubit[3] q;
bit[3] c;
h q[0];
#pragma braket noise depolarizing(0.75) q[0] cnot q[0], q[1];
#pragma braket noise depolarizing(0.75) q[0]
#pragma braket noise depolarizing(0.75) q[1] cnot q[1], q[2];
#pragma braket noise depolarizing(0.75) q[0]
#pragma braket noise depolarizing(0.75) q[1]
c = measure q;
以下列表中提供了所有受支持的編譯指示噪聲運(yùn)算符的規(guī)范:
#pragma braket noise bit_flip(<float>) <qubit>
#pragma braket noise phase_flip(<float>) <qubit>
#pragma braket noise pauli_channel(<float>, <float>, <float>) <qubit>
#pragma braket noise depolarizing(<float in [0,3/4]>) <qubit>
#pragma braket noise two_qubit_depolarizing(<float in [0,15/16]>) <qubit>, <qubit>
#pragma braket noise two_qubit_dephasing(<float in [0,3/4]>) <qubit>, <qubit>
#pragma braket noise amplitude_damping(<float in [0,1]>) <qubit>
#pragma braket noise generalized_amplitude_damping(<float in [0,1]> <float in [0,1]>) <qubit>
#pragma braket noise phase_damping(<float in [0,1]>) <qubit>
#pragma braket noise kraus([[<complex m0_00>, ], ...], [[<complex m1_00>, ], ...], ...) <qubit>[, <qubit>] // maximum of 2 qubits and maximum of 4 matrices for 1 qubit, 16 for 2
) <qubit>[, <qubit>] // maximum of 2 qubits
目前除了較為通用的 OpenQASM 開放量子匯編語言外,其實(shí)還存在很多專用匯編語言,這些語言在對應(yīng)設(shè)備的適配兼容性上,可能表現(xiàn)會更好。比如,啟科量子推出的一款量子匯編語言—— QuQASM ,是針對自研的量子編程框架 QuTrunk 來進(jìn)行適配的。
QuTrunk 使用 Python 作為宿主語言,利用 Python 的語法特性實(shí)現(xiàn)針對量子程序的 DSL (領(lǐng)域?qū)S谜Z言), 把用于量子編程的專用語言稱為:QuQASM。它的主要特點(diǎn)是最左邊是一個量子門操作,中間加入( * )號鏈接符,最右邊是操作的量子比特,形式如下:
gate * qubits
為了方便理解,我們可以再多看看幾個例子:
H * q[0]; # 對q[0]做hadamard門操作
CNOT * (q[0], q[1]); # q[0]為控制位,q[1]為目標(biāo)位
All(Measure) * q # 對q代表的所有量子比特做測量操作
使用該標(biāo)準(zhǔn)是充分利用了 Python 語法對( * )運(yùn)算符的重載特性。該表形式更接近量子物理計(jì)算公式,同時 ( * )在計(jì)算機(jī)編程語言上表示乘法的意思,借此表示左邊的量子門操作實(shí)際上是對量子比特做矩陣乘法運(yùn)算。
使用該標(biāo)準(zhǔn)編寫的量子匯編是可以直接被 QuTrunk 解析運(yùn)行的,不需要做語法方面的解析處理工作?;谠撎匦裕琎uTrunk 可以無縫銜接 QuBranch 通過可視化量子編程生成的量子線路。即 QuTrunk可以直接運(yùn)行 QuBranch 生成的量子線路(只需做一些簡單的初始化工作),而無需做語法上的轉(zhuǎn)譯處理。
下面是 QuQASM 每個量子門操作介紹:
//H(hadamard): 哈德馬門,對a做H門操作,常用于使量子比特處于疊加態(tài)
H * a
//X(NOT): 非門(Pauli-X)對a進(jìn)行取反操作, 量子比特繞布洛赫球的x軸旋轉(zhuǎn)pi角度
X * a
//Y: Pauli-Y, 量子比特繞布洛赫球的y軸旋轉(zhuǎn)pi角度
Y * a
//Z: Pauli-Z, 量子比特繞布洛赫球的z軸旋轉(zhuǎn)pi角度
Z * a
//CNOT(CX): 受控非門,a作為控制位,b為目標(biāo)位,如果a為1則對b進(jìn)行取反,如果a為0則不做任何操作
CNOT * (a, b)
//Toffoli: 托佛利門,a, b作為控制位,c為目標(biāo)位, 如果a,b均為1則對b進(jìn)行取反,否則不做任何操作
Toffoli * (a, b, c)
//Measure: 測量門,對a進(jìn)行測量,結(jié)果要么是0,要么是1,測量結(jié)果受概率振幅影響
Measure * a
//P: 相移門,將量子比特0>態(tài)和1>態(tài)的相位根據(jù)給定的角度進(jìn)行移動
P(theta) * a
//Rx: 量子比特繞布洛赫球的x軸旋轉(zhuǎn)theta角度
Rx(theta) * a
//Ry: 量子比特繞布洛赫球的y軸旋轉(zhuǎn)theta角度
Ry(theta) * a
//Rz: 量子比特繞布洛赫球的z軸旋轉(zhuǎn)theta角度
Rz(theta) * a
//S: 量子比特繞布洛赫球的z軸旋轉(zhuǎn)pi/2角度
S * a
//Sdg: 對S門的反向操作, 繞布洛赫球的z軸反方向旋轉(zhuǎn)pi/2角度
Sdg * a
//T: 量子比特繞布洛赫球的z軸旋轉(zhuǎn)pi/4角度
T * a
//Tdg: 對T門的反向操作, 繞布洛赫球的z軸反方向旋轉(zhuǎn)pi/4角度
Tdg * a
//Swap: 交換兩個量子比特的狀態(tài)
Swap * (a, b)
//SqrtSwap: 對兩個量子比特做sqrt交換
SqrtSwap * (a, b)
//SqrtX: 平方根X門
SqrtX * a
//Rxx: 兩個量子比特繞x^x旋轉(zhuǎn),旋轉(zhuǎn)角度為theta
Rxx(theta) * (a, b)
//Ryy: 兩個量子比特繞y^y旋轉(zhuǎn),旋轉(zhuǎn)角度為theta
Ryy(theta) * (a, b)
//Rzz: 兩個量子比特繞z^z旋轉(zhuǎn),旋轉(zhuǎn)角度為theta
Rzz(theta) * (a, b)
//Barrier: 分隔量子比特,阻止量子線路對相應(yīng)量子比特做優(yōu)化等處理
Barrier * a
Barrier * (a, b)
//U1: 對單個量子比特繞z軸旋轉(zhuǎn)
U1(lambda) * a
//U2: 對單個量子比特繞x+z軸旋轉(zhuǎn)
U1(phi, lambda) * a
//U3: 通用單量子比特旋轉(zhuǎn)門
U1(theta, phi, lambda) * a
//All: 對其他量子門操作進(jìn)行封裝,提供對多量子比特便捷操作
All(Measure) * qreg (對qreg代表的所有量子比特進(jìn)行測量)
All(H) * qreg (對qreg代表的所有量子比特進(jìn)行H門操作)
我們可以利用 QuQASM 語言來完成量子電路圖的編譯和輸出,具體操作方法如下:
# import package
from QuTrunk.circuit import QCircuit
from QuTrunk.circuit.gates import H, CNOT, Measure, All
# allocate resource
qc = QCircuit()
qr = qc.allocate(2)
# apply quantum gates
H * qr[0]
CNOT * (qr[0], qr[1])
All(Measure) * qr
# print circuit
qc.print()
# run circuit
res = qc.run(shots=1024)
# print result
print(res.get_counts())
# draw circuit
print(qc.draw())
輸出結(jié)果如下所示:
qreg q[2]
creg c[2]
H(0) * (q[0])
CX(1) * (q[0], q[1])
Measure(0) * (q[0])
Measure(0) * (q[1])
[{"00": 519}, {"11": 505}]
一個程序適用N種產(chǎn)品,該如何進(jìn)行編程?
在測量應(yīng)用中,對于相似產(chǎn)品,如:環(huán)規(guī),想要提高測量效率,并且減少產(chǎn)品程序的數(shù)量,測量員可以對產(chǎn)品的相同點(diǎn)進(jìn)行一定分析,發(fā)現(xiàn)其中部分?jǐn)?shù)據(jù)可實(shí)現(xiàn)參數(shù)化,通過RationalDMIS軟件的高級語言功能實(shí)現(xiàn)產(chǎn)品的快速測量,并適用于多種規(guī)格的產(chǎn)品。
1、產(chǎn)品分析
對于有著眾多規(guī)格的環(huán)規(guī)而言,如果每一個規(guī)格的大小都進(jìn)行編程,是一個非常繁瑣且不便的工程,對于測量員使用對應(yīng)程序也是極其不便的,影響測量效率。我們對環(huán)規(guī)這類產(chǎn)品進(jìn)行分析,特點(diǎn)如下圖:
環(huán)規(guī)的類型內(nèi)外為TYPE,總高度定義為H,頂部向下偏移量定義為UP,底部向上偏移量定義為DP,環(huán)規(guī)直徑定義為DM,測量截面數(shù)量m,每個截面測量點(diǎn)數(shù)為n。
2、程序的設(shè)計(jì)
2.1 程序運(yùn)行后,通過人為輸入,可以實(shí)現(xiàn)不同規(guī)格產(chǎn)品的自動測量
2.2 流程圖
2.3 RationalDMIS 程序編寫
(1)通過DMIS提示,設(shè)置一個運(yùn)行時輸入?yún)?shù)的提示窗口
代碼如下:
(2) 對參數(shù)進(jìn)行判斷,如判斷環(huán)規(guī)類型、輸入內(nèi)容為字母
、0 等情況
(3)手動建立坐標(biāo)系
(4)設(shè)置安全平面宏
(請將安全平面宏程序按以下內(nèi)容修改)
(5)自動精建坐標(biāo)系
(6)評價與分析
通過前面輸入的層數(shù)與點(diǎn)數(shù)參數(shù),進(jìn)行圓柱測量,并
進(jìn)行評價
(7)生產(chǎn)檢測報告
(8)總結(jié)
通過RationalDMIS軟件,只需簡單3步,即可完成:
1、條件判斷,輸入管控參數(shù),判斷規(guī)格類型;
2、利用賦值,將管控參數(shù)賦給變量;
3、通過變量,規(guī)劃測量軌跡,實(shí)現(xiàn)了不同規(guī)格的產(chǎn)品的檢測;
最終實(shí)現(xiàn)一個程序,完成N個不同規(guī)格產(chǎn)品的自定、高效測量。
(9)完整代碼如下
向上滑動閱覽
$$/* Header
DMISMN/'Created by [思瑞測量技術(shù)(深圳)有限公司(非銷售版)-101522-10825] on 星期四, 五月 26, 2022', 4.0
UNITS/MM, ANGDEC, MMPS
WKPLAN/XYPLAN
PRCOMP/ON
TECOMP/OFF
FLY/1.000000
MODE/PROG, MAN
SNSET/APPRCH, 1.000000
SNSET/RETRCT, 1.000000
SNSET/DEPTH, 0.000000
SNSET/SEARCH, 10.000000
SNSET/CLRSRF, 10.000000
RECALL/D(MCS)
SNSLCT/S(ROOTSN2)
GEOALG/BF, LSTSQR
GEOALG/ANGLB, DEFALT
GEOALG/CIRCLE, MAXINS
GEOALG/ARC, LSTSQR
GEOALG/PLANE, LSTSQR
$$
$$
$$*/
MODE/MAN
DECL/COMMON, INTGR, RINGconfig,TYPE,RINGH,RINGDM,RINGUP,RINGDP,RINGPOINTS,RINGCOUNTS
RINGconfig = PROMPT/TEXT,'請選擇環(huán)規(guī)類型:',LIST,TYPE,'內(nèi)','外',TEXT,'高度 H:',EDIT,RINGH,TEXT,'直徑 DM:',EDIT,RINGDM,TEXT,'上偏移量 UP:',EDIT,RINGUP,TEXT,'下偏移量 DP:',EDIT,RINGDP,TEXT,'每層測點(diǎn)數(shù) N:',EDIT,RINGPOINTS,TEXT,'層數(shù) M:',EDIT,RINGCOUNTS
if/(TYPE.EQ.1)
KNPTN1=ASSIGN/1
ELSE
KNPTN1=ASSIGN/-1
ENDIF
$$檢查參數(shù)
IF/(RINGH.EQ.0)
RINGH = PROMPT/'請輸入正確的環(huán)規(guī)高度 H', 100, 1
ENDIF
IF/(RINGDM.EQ.0)
RINGDM = PROMPT/'請輸入正確的環(huán)規(guī)直徑 DM', 9999, 1
ENDIF
IF/(RINGUP.EQ.0)
RINGUP = PROMPT/'請輸入正確的偏移量 UP', RINGH, 1
ENDIF
IF/(RINGDP.EQ.0)
RINGDP = PROMPT/'請輸入正確的偏移量 DP', RINGH, 1
ENDIF
IF/(RINGPOINTS.EQ.0)
RINGPOINTS = PROMPT/'請輸入正確的每層測點(diǎn)數(shù) N', 9999, 3
ENDIF
IF/(RINGCOUNTS.EQ.0)
RINGCOUNTS = PROMPT/'請輸入正確的測量層數(shù) M', 9999, 2
ENDIF
F(PLN1)=FEAT/PLANE,POL,0,0,0.000000,0.000000,0.000000,1.000000
FA(PLN1)=FEAT/PLANE,POL,0,0,0.000000,0.000000,0.000000,1.000000
$$Measurement points are created through nominal points
MEAS/PLANE, F(PLN1), 3
PTMEAS/POL, 16.022606, 89.412167, 0.000000, 0.000000, 0.000000, 1.000000
PTMEAS/POL, 16.618454, 203.430682, 0.000000, 0.000000, 0.000000, 1.000000
PTMEAS/POL, 16.155284, 335.311794, 0.000000, 0.000000, 0.000000, 1.000000
ENDMES
D(CRD1) = DATSET/FA(PLN1), ZDIR
D(CRD1) = TRANS/ZORIG, FA(PLN1)
F(CIR1)=FEAT/CIRCLE,INNER,CART,0.000000,0.000001,-2,0.000000,0.000000,1.000000, RINGDM
FA(CIR1)=FEAT/CIRCLE,INNER,CART,0.000000,0.000001,-2,0.000000,0.000000,1.000000, RINGDM
$$ Measurement points are created through nominal points
MEAS/CIRCLE, F(CIR2), 4
PTMEAS/CART, 0, KNPTN1*RINGDM/2, -2 , 0, -1*KNPTN1, 0
PTMEAS/CART, KNPTN1*RINGDM/2, 0, -2, -1*KNPTN1, 0, 0
PTMEAS/CART, 0, -1*KNPTN1*RINGDM/2, -2, 0,1*KNPTN1, 0
PTMEAS/CART, -1*KNPTN1*RINGDM/2, 0, -2, 1*KNPTN1,0, 0
ENDMES
D(CRD2) = DATSET/FA(PLN1), ZDIR, FA(CIR1), XORIG
D(CRD2) = TRANS/ZORIG, FA(PLN1), YORIG, FA(CIR1), XORIG, -0
MODE/PROG,MAN
$$ MACRO: EASI_CLEARPLN_GOTO
$$ FUNCTION: CLEARANCE SURFACE IMPLEMENTATION
$$ Move machine CLEAR SURFACE DIST above the current clear surface
$$plane and then move machine parallel to the clear surface plane
$$ ALL Macro parameters are in PCS and Current UNITS
$$ Last update: 3-1-04 Add mode checking. only works in PROG MODE
$$ Last update: 8-24-04 Clear position is based on the surface of
$$
$$ This sample DMIS Macro is provided by External-Array Software, Inc.
$$ It should be modified for your own use. There is no guarantee for
$$ the quality of this Macro. November, 2003
$$ 調(diào)用參數(shù) ISOM 為安全平面參考元素類型理論0(OR實(shí)際1)
$$ 調(diào)用參數(shù)目標(biāo)位置測點(diǎn)TRAX 、TRAY、 TRAZ,TRAI,TRAJ,TRAK坐標(biāo)及矢量
M(EASI_CLEARPLN_GOTO) = MACRO/ISNOM, TARX, TARY, TARZ, TARI, TARJ, TARK
DECL/LOCAL, REAL, CCX, CCY, CCZ, CCI, CCJ, CCK
DECL/LOCAL, REAL, CURX, CURY, CURZ, TD, CLRDIST, SDIAM,BJDIST
DECL/LOCAL, CHAR, 255, CLRLABEL, FLABEL, MMODE, SNAME
$$獲取當(dāng)前運(yùn)行模式及安全平面參考元素名Label
MMODE = VALUE/MODE
CLRLABEL = VALUE/SNSET, CLRSRF
$$判斷Label是否存在(關(guān)閉情況為空,非關(guān)閉則會獲取到字符串,字符串長度大于0) 同時判斷條件 當(dāng)前模式是否為自動,否則跳過
IF/ ( (LEN(CLRLABEL) .GT. 0) .AND. (MMODE .EQ. 'PROG,MAN') )
$$獲取安全距離
CLRDIST = VALUE/SNSET, CLRSRF, DIST
BJDIST= VALUE/SNSET,APPRCH
TARX=ASSIGN/TARX+BJDIST*TARI
TARY=ASSIGN/TARY+BJDIST*TARJ
TARZ=ASSIGN/TARZ+BJDIST*TARK
$$給FLABEL賦值,默認(rèn)FA
FLABEL = ASSIGN/'FA'
$$根據(jù)ISOM情況來更改FA或F
IF/ ISNOM .EQ. 0
FLABEL = ASSIGN/'F'
ENDIF
$$賦值CCX,CCY,CCZ,CCI,CCJ,CCK為安全平面參考元素中心坐標(biāo)的XYZIJK
CCX = OBTAIN/FLABEL(@CLRLABEL), 3
CCY = OBTAIN/FLABEL(@CLRLABEL), 4
CCZ = OBTAIN/FLABEL(@CLRLABEL), 5
CCI = OBTAIN/FLABEL(@CLRLABEL), 6
CCJ = OBTAIN/FLABEL(@CLRLABEL), 7
CCK = OBTAIN/FLABEL(@CLRLABEL), 8
$$獲取探頭名稱
SNAME = VALUE/SNSLCT
$$獲取探頭直徑
SDIAM = OBTAIN/SS(SNAME), 8
$$延安全平面矢量增加一個探頭半徑
CCX = ASSIGN/CCX + CCI * SDIAM/2
CCY = ASSIGN/CCY + CCJ * SDIAM/2
CCZ = ASSIGN/CCZ + CCK * SDIAM/2
$$獲取當(dāng)前探針X,Y,Z坐標(biāo)
CURX = VALUE/GOTOM, XAXIS
CURY = VALUE/GOTOM, YAXIS
CURZ = VALUE/GOTOM, ZAXIS
$$計(jì)算當(dāng)前坐標(biāo)到安全平面的垂直距離
TD = ASSIGN/(CURX – CCX) * CCI + (CURY – CCY) * CCJ + (CURZ – CCZ) * CCK
$$清除原有判斷,任意位置先垂直移動到安全高度
$$IF/ TD .LT. CLRDIST
TD = ASSIGN/(CLRDIST – TD)
GOTO/CURX+CCI*TD, CURY+CCJ*TD, CURZ+CCK*TD
$$ENDIF
$$計(jì)算目標(biāo)坐標(biāo)到安全平面的垂直距離
TD = ASSIGN/(TARX – CCX) * CCI + (TARY – CCY) * CCJ + (TARZ – CCZ) * CCK
IF/ TD .LT. CLRDIST
TD = ASSIGN/(CLRDIST – TD)
GOTO/TARX+CCI*TD, TARY+CCJ*TD, TARZ+CCK*TD
$$建議增加大于的情況
ENDIF
ENDIF
ENDMAC
SNSET/APPRCH, 1.0000
SNSET/RETRCT, 1.0000
SNSET/DEPTH, 0.0000
SNSET/SEARCH, 10.0000
SNSET/CLRSRF, FA(PLN1), 10.0000
F(PLN2)=FEAT/PLANE,POL,0,0,0.000000,0.000000,0.000000,1.000000
$$ Measurement points are created through nominal points
CALL/M(EASI_CLEARPLN_GOTO), 1,0, KNPTN1*RINGDM/2, 0 , 0, 0, 1
MEAS/PLANE, F(PLN2), 3
PTMEAS/POL, KNPTN1*1+RINGDM/2, 90, 0.000000, 0.000000, 0.000000, 1.000000
PTMEAS/POL, KNPTN1*1+RINGDM/2, 210, 0.000000, 0.000000, 0.000000, 1.000000
PTMEAS/POL, KNPTN1*1+RINGDM/2, 330, 0.000000, 0.000000, 0.000000, 1.000000
ENDMES
D(CRD3) = DATSET/FA(PLN2), ZDIR
D(CRD3) = TRANS/ZORIG, FA(PLN2)
F(CIR2)=FEAT/CIRCLE,INNER,CART,0.000000,0.00000,-2,0.000000,0.000000,1.000000, RINGDM
$$ Measurement points are created through nominal points
CALL/M(EASI_CLEARPLN_GOTO), 1,0, RINGDM/2, -2 , 0, -1*KNPTN1, 0
MEAS/CIRCLE, F(CIR2), 4
PTMEAS/CART, 0, RINGDM/2, -2 , 0, -1*KNPTN1, 0
IF/(TYPE.EQ.2)
CALL/M(EASI_CLEARPLN_GOTO), 1,RINGDM/2, 0, -2, -1*KNPTN1, 0, 0
ENDIF
PTMEAS/CART, RINGDM/2, 0, -2, -1*KNPTN1, 0, 0
IF/(TYPE.EQ.2)
CALL/M(EASI_CLEARPLN_GOTO), 1,0, -1*RINGDM/2, -2, 0,1*KNPTN1, 0
ENDIF
PTMEAS/CART, 0, -1*RINGDM/2, -2, 0,1*KNPTN1, 0
IF/(TYPE.EQ.2)
CALL/M(EASI_CLEARPLN_GOTO), 1,-1*RINGDM/2, 0, -2, 1*KNPTN1,0, 0
ENDIF
PTMEAS/CART, -1*RINGDM/2, 0, -2, 1*KNPTN1,0, 0
ENDMES
D(CRD4) = DATSET/FA(PLN2), ZDIR, FA(CIR2), XORIG
D(CRD4) = TRANS/ZORIG, FA(PLN2), YORIG, FA(CIR2), XORIG, -0
$$ Set.Term.Delete
IF/(TYPE.EQ.1)
KNPTC1=ASSIGN/'內(nèi)'
ELSE
KNPTC1=ASSIGN/'外'
ENDIF
TEXT/OUTFIL,CONCAT('環(huán)規(guī)類型:',KNPTC1)
TEXT/OUTFIL,CONCAT('環(huán)規(guī)直徑:',STR(RINGDM))
TEXT/OUTFIL,CONCAT('環(huán)規(guī)高度:',STR(RINGH))
TEXT/OUTFIL,CONCAT('測量上偏移量:',STR(RINGUP))
TEXT/OUTFIL,CONCAT('測量下偏移量:',STR(RINGDP))
TEXT/OUTFIL,CONCAT('測量層數(shù)',STR(RINGCOUNTS))
TEXT/OUTFIL,CONCAT('每層測量點(diǎn)數(shù):',STR(RINGPOINTS))
DECL/COMMON,INTGR,ALLPOINTS
ALLPOINTS=ASSIGN/RINGCOUNTS*RINGPOINTS
DECL/REAL,PRR,PA,PH,PX,PY,PI,PJ,PDA,PDB
IF/(TYPE.EQ.1)
F(CYL1) = FEAT/CYLNDR,INNER,CART, 0,0,-1*RINGH/2, 0,0,1, RINGDM, RINGH
CALL/M(EASI_CLEARPLN_GOTO),1,RINGDM/2,0,0, -1,0,0
MEAS/CYLNDR, F(CYL1),ALLPOINTS
DO/PDA,1,RINGCOUNTS,1
DO/PDB,1,RINGPOINTS,1
PRR=ASSIGN/RINGDM/2
PA=ASSIGN/(360/RINGPOINTS)*(PDB-1)
PH=ASSIGN/-1*RINGUP-(RINGH-RINGUP-RINGDP)/RINGCOUNTS*(PDA-1)
PI=ASSIGN/COS(DTOR(PA))*KNPTN1*-1
PJ=ASSIGN/SIN(DTOR(PA))*KNPTN1*-1
PX=ASSIGN/RINGDM/2*PI
PY=ASSIGN/RINGDM/2*PJ
PTMEAS/POL,PRR,PA,PH,PI,PJ,0
ENDDO
ENDDO
ENDMES
ELSE
F(CYL1) = FEAT/CYLNDR,OUTER,CART, 0,0,-1*RINGH/2, 0,0,1, RINGDM, RINGH
MEAS/CYLNDR, F(CYL1),ALLPOINTS
DO/PDA,1,RINGCOUNTS,1
DO/PDB,1,RINGPOINTS,1
PRR=ASSIGN/RINGDM/2
PA=ASSIGN/(360/RINGPOINTS)*(PDB-1)
PH=ASSIGN/-1*RINGUP-(RINGH-RINGUP-RINGDP)/RINGCOUNTS*(PDA-1)
PI=ASSIGN/COS(DTOR(PA))*KNPTN1*-1
PJ=ASSIGN/SIN(DTOR(PA))*KNPTN1*-1
PX=ASSIGN/RINGDM/2*PI
PY=ASSIGN/RINGDM/2*PJ
CALL/M(EASI_CLEARPLN_GOTO),1,PX,PY,PH,PI,PJ,0
PTMEAS/POL,PRR,PA,PH,PI,PJ,0
ENDDO
ENDDO
ENDMES
ENDIF
T(TDM1)=TOL/DIAM,-0.500000,0.500000
OUTPUT/FA(CYL1),TA(TDM2)
T(TCLD1)=TOL/CYLCTY,0.200000
OUTPUT/FA(CYL1),TA(TCLD1)
參考文獻(xiàn):《2015 PC-DMIS比武大賽論文集》
]]>第一個方法,將內(nèi)容顯示在控制臺中,用到Console.Write("你好C#!");
當(dāng)我們把這行代碼敲入main()方法體中
先介紹一下這個C#的基礎(chǔ)語句規(guī)定:每條代碼結(jié)束是必須以;(英文輸入法下的分號)結(jié)束。
Console.Write("你好C#!"); 意思解說,是將 [你好C#] 這個內(nèi)容寫到控制臺上,如果英語能力比較好的同學(xué)可以發(fā)現(xiàn),Write的意思是寫,之所以C#好上手,是因?yàn)楹枚喙δ芎头椒ㄔ谡{(diào)用的時候大體上就明白它的意思。
讓我們回到代碼上面,這是點(diǎn)擊【啟動】按鈕,來運(yùn)行一下我們寫的代碼。
發(fā)現(xiàn)運(yùn)行的時候,【控制臺】程序還是一閃而過,程序就運(yùn)行完畢了。這是因?yàn)榇a的意思就是在【控制臺】中寫上 [你好C#]之后,沒有其他條件讓程序停止,程序就是運(yùn)行完畢了,直接退出了,為了讓我們可以看到[你好C#]這個讓人激動的內(nèi)容,我們接下來要輸入第二個方法,來讓程序停止。
第二個方法,等待用戶輸入方法 Console.Read();這個方法的意思就是等待用戶在控制臺上輸入一個內(nèi)容,任何的內(nèi)容,如果用戶不輸入的話,就一直等待。這樣就達(dá)到了讓程序停止的目的了。
這時我們再次點(diǎn)擊【啟動】按鈕,來看看效果。
這次程序停止了,可以讓我們很清楚地看到自己輸入的內(nèi)容了,有興趣的小伙伴可以去試一試。
將代碼中雙引號里面的內(nèi)容替換成自己想展示的內(nèi)容!
這里給新手做一個入門計(jì)算機(jī)的小知識:
計(jì)算機(jī)的組成定義是:輸入設(shè)備(鼠標(biāo)、鍵盤、觸摸屏、觸摸筆、游戲搖桿等設(shè)備)與輸出設(shè)備(顯示屏)與運(yùn)算設(shè)備(CPU、GPU)等。
我們編寫的程序最終的目的是輸入什么,經(jīng)過計(jì)算(相關(guān)程序邏輯)后輸出什么。那么本章講述的【控制臺】中的Console控制器就提供了相關(guān)輸入與輸入的方法。
如果想把結(jié)果顯示在【控制臺】的屏幕上就用Write(寫入)提供的相關(guān)方法;
如果想獲取用戶在【控制臺】中輸入的內(nèi)容,就用Read(讀取)提供的相關(guān)方法。
下一章,我們將開啟輸入與輸入相互配合的相關(guān)教程!
]]>所以都2022年了,在眾多高級編程語言的包圍下,還會有人將匯編作為程序員入門的第一個編程語言嗎?答案是有的,前段時間一位用戶發(fā)帖稱:我的叔叔曾經(jīng)是一位程序員,建議我從匯編語言開始學(xué)。
Reddit最近對編程有了點(diǎn)興趣,就找了之前做程序員的叔叔。想問問有什么建議嗎,結(jié)果叔叔開口就是:一定要遠(yuǎn)離那些簡單的高級編程語言,如Python或者Ruby。
叔叔解釋到,當(dāng)年他第一次接觸代碼的時候一度認(rèn)為自己是個天才,因?yàn)閹滋靸?nèi)就掌握了新技能。直到他接觸了C,才顛覆了自己對代碼的認(rèn)知。而且之前掌握的那些基礎(chǔ)技能在學(xué)習(xí)C語言的時候完全沒用。
如果Reddit能將匯編語言或者C語言入門,以后學(xué)習(xí)任何編程相關(guān)的內(nèi)容都會非常輕松。
然而經(jīng)過一番討論之后,網(wǎng)友和Reddit叔叔的觀點(diǎn)截然不同。很多網(wǎng)友認(rèn)為,能說出這種觀點(diǎn)的叔叔年齡已經(jīng)非常大了。如果是1980年之前畢業(yè)說先學(xué)會匯編還是很常見的,可以了解,畢竟當(dāng)時匯編很常見。然而在1990年以后,可以選擇的范圍太多了。
還有網(wǎng)友調(diào)侃到這就好像你叔叔讓你學(xué)車,不要學(xué)怎么開,而是知道每一個部分是如何工作的。
平心而論,學(xué)好匯編語言可以幫助我們深入理解計(jì)算機(jī)底層,但不意味著我們就一定要對高級編程語言避之不及。我們可以好好學(xué)匯編,但是如果你只是從事軟件看法,適當(dāng)了解一下即可。
]]>
到這里,我們已經(jīng)說完了編譯器的技術(shù)細(xì)節(jié),也同時完成了一門新的編程語言。
(Here,We introduced a compiler's basic techniques, meanwhile completed a new program language.)
按照計(jì)算機(jī)領(lǐng)域的慣例,當(dāng)一門語言制作完成時,要打印一行"hello world"。
打開一個文本編譯器,輸入以下代碼:
int printf(const char* fmt, …);
int main()
{
printf("hello world\n");
return 0;
}
然后保存為一個文件hello.c。
之所以跟C語言用同樣的擴(kuò)展名,是因?yàn)檫@樣文本編譯器就可以顯示語法顏色。
當(dāng)然,文件名也可以隨便起,反正編譯器都會把它當(dāng)作一個文本文件。
我在語法上盡量保持了與C語言的類似,但是沒有支持宏,所以把printf的函數(shù)聲明直接寫在第1行,而不是include "stdio.h"。
接下來編譯它,Linux上的shell命令是:./a.out hello.c
(當(dāng)然,在這之前要先用gcc編譯scf框架的源碼。)
./a.out hello.c命令的輸出如下:
編譯器啟動之后,初始化語法分析的各個模塊。
然后,開始源代碼的語法分析,首先分析printf()的函數(shù)聲明,
然后,分析main()函數(shù)的代碼:
分析完main()函數(shù)之后,也就到達(dá)了文件的結(jié)尾eof。
到了這里,語法分析就結(jié)束了。
接下來是編譯器的后端流程:
1,中間代碼優(yōu)化的日志,可以看到中間代碼、基本塊、循環(huán)和分組信息:
中間代碼優(yōu)化
2,然后開始生成機(jī)器碼,CPU平臺是x86_64,
機(jī)器碼生成
3,給gdb生成debug信息,生成.o目標(biāo)文件,
debug信息和目標(biāo)文件
到了這里,編譯就結(jié)束了。
接下來是連接,即昨天那篇文章的內(nèi)容。
4,這段代碼很簡單,連接時只需要從動態(tài)庫里查找printf這一個函數(shù),
下圖是查找時打印的日志。
查找printf
5,找到printf之后,完成動態(tài)連接,并且生成可執(zhí)行文件。
連接完成
6,用readelf -a 1.out查看生成的可執(zhí)行文件,信息如下:
scf編譯的默認(rèn)文件名是1.out。
ELF頭
從ELF頭可以看出,文件類型是EXEC可執(zhí)行文件,平臺是x86_64,入口地址0x400817。
各節(jié)的情況
"hello world"字符串常量在.rodata節(jié),動態(tài)連接的printf()需要plt和got,如上圖。
程序頭
所需的動態(tài)庫,以及動態(tài)重定位的函數(shù)。
calloc和free函數(shù)是因?yàn)槟J(rèn)把自動內(nèi)存管理的scf_object.c文件也連接進(jìn)去了。
動態(tài)庫、重定位函數(shù)和符號表
7,運(yùn)行結(jié)果:
運(yùn)行結(jié)果
給一張main()函數(shù)的最終內(nèi)容:
main函數(shù)
可以看到,連接器已經(jīng)修改了加載"hello world"字符串的內(nèi)存地址,也修改了調(diào)用printf的內(nèi)存地址。
]]>功能描述//
短信發(fā)送川程序
LETTER PROm TImE
在這里你可以大膽說出你內(nèi)心的想法,寫給戀人/愛人/朋友或者自己,看看別人的人有什么想對你說的話
發(fā)件箱&收件箱
OUTBOX AND INBOX
發(fā)件箱顯示你發(fā)送給他人的信息,收件箱顯示他人給你發(fā)的信息,右下角的標(biāo)志點(diǎn)開即可發(fā)送短信給TA。
寫信給TA
WRITE LETTER TO SOMEONE
填寫收信人的姓名,手機(jī)號,你想發(fā)給他的內(nèi)容以及你的署名,點(diǎn)擊立即寄出即可發(fā)送短信給TA。
發(fā)件和收件詳情
SENDING AND RECEIVING DETAILS
發(fā)件詳情頁可再發(fā)一封給TA,僅需填寫內(nèi)容。收件詳情頁可選擇直接給TA回信或刪除。
個人中心
WRITE LETTER TO SOMEONE
我的頁面可進(jìn)行個人信息編輯及查看剩余可發(fā)短信條數(shù),小程序免費(fèi)贈送2條短信,充值即可享受發(fā)送多條短信。
手機(jī)短信界面
SMS INTERFACE
一
當(dāng)TA在小程序中寄信給你,你的手機(jī)將會收到一條短信通知,在微信中搜索小程序即可查看具體內(nèi)容。
已讀提醒
READ REMINDER
當(dāng)TA看了你的信件時,你的微信將會收到一條提醒。
后臺//
短信設(shè)置、模板小時設(shè)置、系統(tǒng)設(shè)置、充值套餐、提示設(shè)置、用戶管理、充值記錄成、登錄
、綁定手機(jī)號、發(fā)送短信、充值、短信通知、通知、模板消息
]]>在網(wǎng)絡(luò)中,特別是回貼中,如果出現(xiàn)1024這四個數(shù)字,不知道的可能感覺莫名其妙,今天解釋一下:
1024一般有三個意思:第一個意思,也是最初的意思,是源于網(wǎng)站論壇,為了防止有人涮屏灌水,網(wǎng)站平臺規(guī)定每隔1024秒才能回復(fù)一次,有些人不遵守規(guī)矩,惡意灌水涮屏,平臺就屏蔽了該人的回復(fù),代替內(nèi)容顯示1024,所以大家看不到回復(fù)者的內(nèi)容,只看到數(shù)字1024.
由此延伸出第二個意思,是在網(wǎng)上回復(fù)對方的時候,故意用1024來當(dāng)作回復(fù)內(nèi)容,實(shí)際上是自己不愿意打字,或者不愿意回應(yīng),看到對方回復(fù)過來1024,可以理解為“知道了”,頂貼,已閱等意思。
第三個意思是在信息計(jì)量的單位是按1024來進(jìn)級的,1024K等于1M,1024M等于1G,1024G等于1T,所以在網(wǎng)絡(luò)中,特別是玩電腦專業(yè)的網(wǎng)友,喜歡用1024來代表“一級棒”,用在回復(fù)別人貼子時,可能代表夸獎這個貼子的空容是很棒," 一級棒“。還有的時候,程序員把1024當(dāng)成自己的身份標(biāo)簽,也是一級棒的意思。
除了以上在回復(fù)帖子時的三個意思,程序員網(wǎng)友們還把10月24日當(dāng)成自己的節(jié)日,也叫”程序員日“。
網(wǎng)絡(luò)是復(fù)雜的,網(wǎng)友們的智慧是閃亮的,網(wǎng)絡(luò)變化的步伐也是飛快的。理解網(wǎng)絡(luò)語言也需要不斷的學(xué)習(xí)。
“轉(zhuǎn)化率”決定文案的價值,所以要怎么才能寫出高轉(zhuǎn)化的廣告文案呢?
民國時期的廣告
高轉(zhuǎn)化的文案都有什么特點(diǎn)?
1、準(zhǔn)確傳遞價值
讓用戶注意→感興趣→購買欲望→信任→產(chǎn)生購買行為,文案是傳遞了一定價值的。
但文案不是看起來越高大上就會越受歡迎,言之無物的華麗辭藻還不如準(zhǔn)確告訴你的客戶這是一個什么產(chǎn)品,它能為你們帶來什么。只有用戶理解了你才能懂你,你被理解了才能直擊用戶的痛點(diǎn),文案才會實(shí)現(xiàn)它該有的價值,才能更大程度達(dá)成成交。
文案要準(zhǔn)確傳遞價值
2、尊重用戶的真實(shí)想法
所謂尊重用戶的真實(shí)想法,是將產(chǎn)品的優(yōu)勢盡可能展現(xiàn)在用戶眼前,包括適用于什么年齡段人群、什么類型人群慎用……讓用戶自由選擇,不強(qiáng)加個人意志給用戶。
沒有人看見“抓緊時間搶購”和“趕快搶,馬上就沒了”就會馬上美美下單,詳情頁的內(nèi)容才是他們購買一樣產(chǎn)品的理由。
尊重用戶的真實(shí)想法
3、不知不覺之中的營銷
淺顯易懂的文字更容易被get到,一本正經(jīng)向你介紹、鼓動你去你購買產(chǎn)品的文案你反而會產(chǎn)生厭惡情緒。通常來說越像日常對話的文案反而越高級,更能讓用戶讀懂。
不知不覺完成營銷就是最高明的手段,例如就像兩個人面對面聊天一樣卻又讓人朗朗上口的超能洗衣液文案“用一次就知道是我想要的,用了就離不開它!”,還有旺仔QQ糖的“你也要吃一顆嗎?”能讓用戶心甘情愿記住它,產(chǎn)生信任,自然就會購買。
4、適當(dāng)制造懸念
適當(dāng)制造懸念會讓消費(fèi)者產(chǎn)生繼續(xù)了解的欲望,也可以將品牌放在一個與眾不同的位置。但不是“捧一踩一”的自我吹捧。
同時也能讓消費(fèi)者自己去了解你和其他品牌有什么不同。一個和同類產(chǎn)品有明確區(qū)別的品牌會更受到消費(fèi)者的注意哦!
消費(fèi)者
案例列舉:高轉(zhuǎn)化文案是什么樣的?
案例一:農(nóng)夫山泉——我們不生產(chǎn)水,我們只是大自然的搬運(yùn)工!
水是生命之源,人們喝水的時候會通過水補(bǔ)充很多身體所需要的能量和一些礦物質(zhì)。大自然里的水含有更多天然的礦物質(zhì),這也是為什么溪水喝起來比蒸餾水更甜更好喝。
自然的礦泉水更受消費(fèi)者歡迎,農(nóng)夫山泉抓住了消費(fèi)者這一點(diǎn)心理,說明自己并非加工蒸餾的水,準(zhǔn)確地向消費(fèi)者傳遞了他們“自然”的價值。
高轉(zhuǎn)化文案
案例二:特侖蘇——不是所有牛奶都叫特侖蘇。
特侖蘇先說明自己和一般的牛奶不一樣,哪里不一樣?品質(zhì)不一樣。這就需要消費(fèi)者自己做接下來的了解。奶源品質(zhì)、生產(chǎn)工藝、甄選標(biāo)準(zhǔn),都是這個牌子與眾不同的原因。
當(dāng)消費(fèi)者知道他們的優(yōu)勢,自然會信服這句廣告語。每次買牛奶的時候也會選擇他們。
上網(wǎng)購物的消費(fèi)者
案例三:新蓋中蓋——一片頂過去五片!
新蓋中蓋的廣告讓不少人都印象深刻,他們那些廣告語就像是家里長輩之間的日常對話,不僅是老人家記住了補(bǔ)鈣要用它,年輕人都記住了“走路也有勁了,一口氣上五樓,不費(fèi)勁兒?!弊屓艘幌戮蚲et到它想要表達(dá)什么。
家庭成員之間對話
文字的力量絲毫不亞于海報傳達(dá)給消費(fèi)者的視覺感受,就連營銷戰(zhàn)略大師勞拉·里斯提出的“語言錘”概念,就大大肯定了文字的力量。
品牌在做營銷推廣的時候追求的就是用最容易讓人了解和接受的語言實(shí)現(xiàn)營銷、達(dá)成轉(zhuǎn)化。所以學(xué)會寫高轉(zhuǎn)化文案對一個品牌來說是很重要的。
今天關(guān)于品牌怎么寫高轉(zhuǎn)化文案,你學(xué)會了嗎?大家可以留言討論或持續(xù)關(guān)注我們:廣州神鷹網(wǎng)絡(luò)科技有限公司。
廣州神鷹網(wǎng)絡(luò)科技有限公司秉承“誠信共贏”的原則,用合適的價格做專業(yè)的服務(wù),希望通過建立良好的產(chǎn)業(yè)生態(tài),讓雙方都有錢賺,才能長久合作,用口碑說話。
神鷹網(wǎng)絡(luò)的服務(wù)包含官網(wǎng)建站、自媒體代運(yùn)營、新聞稿代寫代發(fā)、信息流/競價推廣托管等。競價托管服務(wù),包括百度、360、UC、今日頭條等平臺,以及信息流廣告,一手渠道資源,高效便捷實(shí)惠!
近些年來,人與人之間的交流更多地轉(zhuǎn)移到網(wǎng)絡(luò)上,文字的表達(dá)因此有了很多新特點(diǎn),在詞匯、語法、修辭等方面也形成不少新現(xiàn)象。在詞匯方面,網(wǎng)絡(luò)生活造就了大量新詞,這些新詞有些很快就消失了,有一些則長時間地留在人們的語言運(yùn)用之中,還有一些經(jīng)過時間的考驗(yàn)進(jìn)入了詞典,成為一種常用詞。在語法和修辭方面,由于網(wǎng)絡(luò)交流的特殊特點(diǎn),在簡略達(dá)意和追求生動的基礎(chǔ)上,出現(xiàn)了許多網(wǎng)絡(luò)特有的表達(dá)方式。同時,圖像或圖案和一般文字表達(dá)的融合也相當(dāng)深入,表情包等都成為網(wǎng)絡(luò)表達(dá)的日常。這些現(xiàn)象有些是適應(yīng)網(wǎng)絡(luò)交流的一些特殊需要形成的,有些是網(wǎng)絡(luò)的特點(diǎn)決定的,當(dāng)然也有為了刻意吸引眼球或交流的便捷而出現(xiàn)的。還有,網(wǎng)絡(luò)的社群化,也形成諸多在特定群體里流行的網(wǎng)絡(luò)詞匯和表達(dá)方式。它們在特定網(wǎng)絡(luò)社群中是一望皆知的普通表達(dá),社群以外的人卻往往難以理解。簡而言之,網(wǎng)絡(luò)語言的狀況相當(dāng)復(fù)雜,這些只是一些主要趨向。
對于這些現(xiàn)象,可以從兩方面來認(rèn)知:
一方面,語言本身就是不斷發(fā)展變化的,它會隨著時代或技術(shù)的發(fā)展不斷適應(yīng)環(huán)境。歷史地看,語言不可能一成不變;從現(xiàn)實(shí)看,世界其他語言也都受到網(wǎng)絡(luò)生活的深入影響。網(wǎng)絡(luò)作為極大影響社會生活的一種媒介,當(dāng)然會在語言的應(yīng)用上形成諸多新特色。網(wǎng)絡(luò)的書面交流往往是即時的、迅捷的,因此有一些很接近于口語的表達(dá)。它們明顯區(qū)別于一般的書面語,這是一種常態(tài)。網(wǎng)絡(luò)語言的某些生動、活躍的因素,也在某些方面豐富了中文的表達(dá)方式。其中一些逐漸被社會認(rèn)可,成為公眾的常用表達(dá)。還有一些不規(guī)范、不明確的表達(dá)則隨著時間的推移而自然地消失了。這些都是語言不斷發(fā)展變化的歷史的一部分。
說網(wǎng)絡(luò)語言對于中文只有負(fù)面影響,可以說是一種詩意的感慨,卻未必客觀。書面語從口語中汲取更多生動的表達(dá)方式,是歷來語言變化的一個重要方面。像五四時代的白話文運(yùn)動,就從口語中吸納了更多因素來建構(gòu)現(xiàn)代中國新的書面語形態(tài),我們現(xiàn)在使用的書面語也是經(jīng)歷了這樣的巨大變化而來的。網(wǎng)絡(luò)語言當(dāng)然會在某些方面豐富中文的表達(dá),會對中文的發(fā)展起到積極作用。可以說,語言的發(fā)展本身就包含了一定會“有變”。
另一方面,注重語言規(guī)范,尊重語言表達(dá)的一般規(guī)律,在語言表達(dá)上避免過度求怪求異、隨意隨興,讓人們更易于理解也是重要的。追求語言的優(yōu)美,追求在具體語境中的合適表達(dá),追求語言使用的更高標(biāo)準(zhǔn),也都是人們需要持續(xù)努力的。
語言的網(wǎng)絡(luò)表達(dá)確實(shí)有其蕪雜紛亂的一面,存在一些不良的語言表現(xiàn),比如口語中的一些污言穢語也出現(xiàn)在網(wǎng)絡(luò)表達(dá)中等等。這些都會對語言環(huán)境造成污染。因此,人們尤其需要在文字水平的提高上多下功夫,具備規(guī)范運(yùn)用書面語的能力,在自己的表達(dá)中體現(xiàn)出更好的書面語追求。
流暢、生動、規(guī)范的書面表達(dá),是人們進(jìn)行交流的基礎(chǔ),社會永遠(yuǎn)需要有對于語言表達(dá)規(guī)范性的追求。進(jìn)行書面語的寫作與一般的網(wǎng)絡(luò)交流,有所差異很正常,前者更為審慎和規(guī)范,應(yīng)該具有更高的語言使用標(biāo)準(zhǔn)和尺度。當(dāng)然,如果在書面語表達(dá)上有自己的風(fēng)格和美學(xué)方面的探究,那就是更高的境界了。這里說的就是語言的發(fā)展一定要“有度”。
“有變”且“有度”,在有度的規(guī)范中看到有變的活力,在有變的活力中也要求有度的規(guī)范。因此,人們無需對于當(dāng)下的語言狀況產(chǎn)生過度的焦慮,同時也需要有更多更高的語言使用追求。(張頤武,作者是北京大學(xué)中文系教授)
]]>譯者 | 翟珂
審校 | 孫淑娟
亞歷山大-波普說過“人類的希望是永恒的”,雖然波普是個詩人,不是極客,但我相信他能夠理解發(fā)現(xiàn)一種新的編程語言時的期待感。他知道軟件開發(fā)人員永遠(yuǎn)期待一種語言,能夠以其獨(dú)特的Unicode字符組合,解決我們所有的問題,使編碼變得更簡單,甚至只需點(diǎn)擊幾下即可。
他也肯定會理解我們對一種新的語法的渴望,這種語法是如此直觀,以至于我們只需要想象要做什么,然后就能夠使用語法清晰的表達(dá)出其中的邏輯。這是一種對新代碼的渴望,這種代碼看起來就像三段式(Triple axel)、梭魚式(inward three and a half)或奧運(yùn)會上的大回轉(zhuǎn)跑那樣毫不費(fèi)力和優(yōu)雅。
然而,大多數(shù)現(xiàn)代編程語言建立的初衷并不是創(chuàng)作者異想天開或?yàn)榱苏故舅麄兊木幋a能力。它們是針對創(chuàng)作者需要解決的一個常見問題而產(chǎn)生的。雖然大多數(shù)開發(fā)者會繼續(xù)使用一種或多種更老、更成熟的語言進(jìn)行日常編碼,但我們永遠(yuǎn)在尋找新的語言來幫助我們解決編碼問題。我們可以看到這種趨勢,尤其是在特定領(lǐng)域語言或 DSL 的崛起。這些語言緊湊且集中,它們不適用于通用用途,但是正是出于這個原因,可能會在你的工具箱贏得一席之地。
這里有 11 種較新的語言,并且都已經(jīng)找到了自己的用途。有些是 DSL,旨在做好一件事。其他的,似乎要拯救世界。即使你現(xiàn)在不需要它們,但它們都能讓我們的計(jì)算機(jī)把要做的事情做得更好。
Reactive Clojure是Clojure和React的結(jié)合體:一個將反應(yīng)式前端的所有可能性與 Clojure 堅(jiān)實(shí)的功能優(yōu)勢相結(jié)合的系統(tǒng)。你可以使用Reactive Clojure布置一個復(fù)雜的前端組件集合,并使用函數(shù)將它們串連起來。反應(yīng)式框架能夠處理這些細(xì)節(jié),并且確保應(yīng)用數(shù)據(jù)在組件和數(shù)據(jù)庫之間流通。Clojure則提供功能基礎(chǔ),使非常規(guī)的用例成為可能,并且可調(diào)試。
這看起來簡直是天作之合,但還需要通過時間的檢驗(yàn)。Reactive Clojure是一個將前端組件結(jié)合在一起的好選擇。它的多線程模型與多任務(wù)的復(fù)雜性和反應(yīng)式儀表板自然匹配。
有時,程序員會將大部分工作花費(fèi)在配置文件上,這些文件通常用JSON、YAML甚至XML編碼。在某些情況下,你甚至不需要寫具體的代碼,只要不停地切換各種配置文件來完成工作。
Nickel的誕生就是為了解決這一問題,它是一種用于創(chuàng)建配置文件的編程語言。你可以用Nickel來創(chuàng)建非靜態(tài)的配置文件。一個參數(shù)的值可以發(fā)生變化,在一周內(nèi)可以是一個值,在周末則是一個不同的值。在運(yùn)行Nickel時,它會創(chuàng)建一個新的配置文件,以適應(yīng)它收到的所有參數(shù)。
Nickel的結(jié)構(gòu)在很大程度上是功能性的,而且可以使用類型檢查。一段非常好的Nickel代碼幾乎可以保證輸出遵守句法規(guī)則和任何其他需要執(zhí)行的規(guī)則。你可以編寫代碼來創(chuàng)建配置文件,然后再對其他代碼進(jìn)行管理,這聽起來有些滑稽。但對于現(xiàn)代架構(gòu)來說,這是一個非常實(shí)用的解決方案。
Kobra的創(chuàng)造者希望有一種語言能夠?yàn)楣こ處?、科學(xué)家和其他不那么專業(yè)的編碼者開放機(jī)器學(xué)習(xí),于是這個機(jī)器學(xué)習(xí)的視覺語言就誕生了。Kobra的編輯器用拖放塊組成了類似代碼的序列,這些塊用于統(tǒng)計(jì)分析和機(jī)器學(xué)習(xí)的常見內(nèi)置例程。這個過程感覺就像R語言,它的數(shù)據(jù)框由表格數(shù)據(jù)和一組用于創(chuàng)建儀表板和論文的圖形顯示函數(shù)而組成。
這是云計(jì)算最有用的功能之一,能夠啟動和關(guān)閉服務(wù)器,用以處理數(shù)據(jù)激增。數(shù)據(jù)中心的硬件團(tuán)隊(duì)曾經(jīng)需要花費(fèi)數(shù)周時間來申購、安裝、測試和配置一臺機(jī)器。現(xiàn)在,云讓你在幾分鐘甚至幾秒鐘內(nèi)完成所有這些工作。
許多敏捷開發(fā)團(tuán)隊(duì)已經(jīng)開始為不同云支持的各種API編寫代碼。微軟為在Azure中啟動機(jī)器創(chuàng)建了一種簡化的語言,作為其基礎(chǔ)架構(gòu)即代碼理念的一部分。
Bicep 語言提供了一種高效的聲明式格式,可以編碼出開發(fā)人員希望在新實(shí)例中的應(yīng)用。一些基本的類型安全可以幫助防止錯誤,并且 VS Code 中提供了一個語法感知編輯器。該語言本身是為對基礎(chǔ)架構(gòu)進(jìn)行高階思考而設(shè)計(jì)的,具有強(qiáng)聲明性結(jié)構(gòu),允許你以任何順序包含指令,讓 Azure 的資源管理器優(yōu)化執(zhí)行。
使用浮點(diǎn)數(shù)出現(xiàn)錯誤帶來的開發(fā)風(fēng)險是眾所周知的,相當(dāng)多的Bug是由于不注意的數(shù)字格式造成的。
Frink正是為解決這一問題而創(chuàng)造的,它是一種有“單位意識”的語言。Frink中的每個變量不只是持有一個數(shù)字,而且還標(biāo)明了計(jì)量單位(幾乎所有的計(jì)量單位),比如噸、瓦、英尺或者米。這使單位轉(zhuǎn)換變得很容易,F(xiàn)rink的核心機(jī)制在于使用任意精度的數(shù)字來減少四舍五入的問題。這就像一種對于測量單位來說的類型檢查。
聲音合成對于游戲開發(fā)、VR和任何依賴良好音質(zhì)的應(yīng)用都非常有用。而Faust就是這種特定領(lǐng)域的語言,它的結(jié)構(gòu)是純功能的,并且每一個功能都建立了一個聲音處理管道。它的后端將傳入的聲音分解為數(shù)字表示,而代碼本身是一組可以組成最終結(jié)果的函數(shù)。比如,你可以通過分割代碼輸出并引入延遲來創(chuàng)造一個回聲和混響。另外,F(xiàn)aust的代碼可以轉(zhuǎn)譯成C++、C、LLVM Bitcode、WebAssembly、Rust和其他一些語言,因此你幾乎可以在任何項(xiàng)目中使用它。
任何編寫代碼的人都知道程序員如何組建一個樂隊(duì)。寫一些代碼,為鼓機(jī)拼出節(jié)奏,然后用子程序取代所有其他的樂隊(duì)成員,用這種方式甚至能建立一個完整的交響樂團(tuán)。
Melrōse和Glicol就是為這種音樂創(chuàng)作方式而生的編程語言。使用這兩種語言你只需要用幾個按鍵就能創(chuàng)造出一個看上去精心制作的作品。Melrōse圍繞西方音樂中常見的標(biāo)準(zhǔn)十二音度的高層次工作。音符被分組為序列,軟件處理大部分的細(xì)節(jié)工作,如移調(diào)。輸出到任何具有MIDI功能的樂器上,代碼也可以對通過MIDI端口進(jìn)入的信號作出反應(yīng),因此運(yùn)行Melrōse代碼可以代替一個樂隊(duì)成員。
Glicol是一個基于Rust的工具,它能完成許多和Melrōse相同的任務(wù),但級別較低。Glicol可以與數(shù)字信號處理相結(jié)合,可以提供廣泛的音樂類型選擇。該工具旨在通過其開源的音頻引擎產(chǎn)生可用于瀏覽器的聲音。正如其開發(fā)者所說:“入門費(fèi)用低,上限高?!保糜诠膭钆c所有會此技能的人合作。
將指令傳送到計(jì)算機(jī)的最有效方法是將它們編碼為二進(jìn)制并將它們限定為 CPU 使用的基本操作集。每個芯片都有自己喜歡的二進(jìn)制語法,Pascal 或 Java 等一些語言有一種中性的二進(jìn)制格式,可以在本地虛擬機(jī)上運(yùn)行。WebAssembly為Web瀏覽器提供預(yù)先處理的二進(jìn)制代碼,并以標(biāo)準(zhǔn)格式與文本相結(jié)合。其目標(biāo)是用更容易運(yùn)行的、接近本地速度二進(jìn)制格式來代替構(gòu)建Web應(yīng)用程序的JavaScript代碼。
許多開發(fā)者使用WebAssembly但不直接編寫,而是用編譯器將高級語言轉(zhuǎn)化成WebAssembly,并在瀏覽器中運(yùn)行。還有一個舉措就是創(chuàng)建低級語言,以人類可讀的形式公開WebAssembly的大部分基本結(jié)構(gòu)。Wase就是這樣的一種選擇,它提供了一種類似C的語法和強(qiáng)類型。
在Web瀏覽器之外,也有WebAssembly的用武之地,作為一種通用的編碼指令方式,其堆棧機(jī)類似于Java的JVM。例如,Redpanda是一個流媒體數(shù)據(jù)平臺,它為開發(fā)者提供了一個機(jī)會,當(dāng)數(shù)據(jù)通過WebAssembly編寫的代碼進(jìn)入管道時,可以對其進(jìn)行調(diào)整或修改。
從某種意義上來說,Java并不能算是一種新的語言。Java最偉大的地方之一就是,它的開發(fā)者在維護(hù)與舊版本的兼容性方面做得很好,對于最新的JVM來說,編譯10年甚至20年前的代碼通常很容易。雖然這些代碼不能保證能正常運(yùn)行,但它仍然比幾乎任何其他語言更容易編譯。并且Java團(tuán)隊(duì)擁有一套包含數(shù)百萬個集成測試的套件。
將Java 17列入這個名單是因?yàn)樗呀?jīng)非?,F(xiàn)代化了,以至于1990年代的開發(fā)者肯定認(rèn)不出是Java。它有許多額外的功能和擴(kuò)展,能夠改變開發(fā)者的編碼方式。
比如增強(qiáng)的隨機(jī)數(shù)發(fā)生器或更嚴(yán)格的浮點(diǎn)數(shù)學(xué)語義,解決了編寫非常復(fù)雜的數(shù)字代碼的難題。編寫會計(jì)系統(tǒng)的開發(fā)人員可以使用整數(shù)來保存錢的數(shù)量,但那些處理AI算法和復(fù)雜線性代數(shù)的開發(fā)人員則需要浮點(diǎn)數(shù)。
其他的,如強(qiáng)封裝和擴(kuò)展的switch語義,為核心語言帶來了規(guī)范性和靈活性??偠灾捎谒羞@些改進(jìn),使編寫更強(qiáng)大、更安全的代碼比以往任何時候都容易。它的核心仍然是Java,但附加功能有所不同。
原文鏈接:https://www.infoworld.com/article/3658204/11-new-programming-languages-to-make-a-coders-heart-sing.html
來源:51CTO技術(shù)棧
]]>