2015-07-29 8 views
14

Giriş dosyaları sağlamadan COBOL kodunu yürütmek mümkün mü? cobc kullanıyorum.Giriş kaynağı dosyası olmadan, ancak bir boru aracılığıyla cobc nasıl çalıştırılır?

Ben borusuna cobc sürecine kod çalıştı:

$ cat my-input.cbl | cobc 
cobc: No input files 

bir dosyayı derlemek ve çalıştırmak için, ben yapın:

cobc -x di.cbl -o a && ./a 

Bir dosyayı yok farz, ben Sadece bir yerde kod var (belki bir değişken olarak, string olarak), cobc'a iletebilir miyim? Dosyayı oluşturup, derleyip çalıştırmanız daha iyi olurdu.

Durumumda, kullanıcı COBOL programının kaynak kodunu giriyor ve bu bir dizi değişkeni. Şu anda, kodu bir dosyaya kaydediyorum, derledim ve sonra çalıştırıyorum. Cobc'nin kod snippet'ini stdin'de veya hatta cli seçeneği olarak desteklemesi ve ikili bir dosya oluşturması veya sonucu doğrudan göstermesi (iyi ya da kötü bir fikir olup olmadığından emin olmamak) hoş olurdu. node, örneğin, -p seçeneğine sahiptir: node -p 'console.log (1)' - bu 1 \ nundefined çıkacaktır. g ++, bu özelliğe sahiptir -

+0

GnuCOBOL projesine bir özellik talebi yapmak zorundasınız. Şu anda SourceForge'da, muhtemelen yakında hareket ediyor. –

+0

@BillWoodger Belki bunu yapabilir ve cevap yazabilir misiniz? :) SourceForge'in nasıl çalıştığını bilmiyorum ... –

+0

Bir dosyada kaynak kodun bulunmaması, "oluşturulan kodun" büyük bir anlamını taşımaktadır. Bu düşündüğün şeyin türü mi? Bir dosya kullanmak yerine pipo için yararlı olabilecek birkaç örnek var mı? Bunu yapabilirsen, asıl isteği gönderebilirim. –

cevap

6

Dün mümkün olmadı, ancak bugün, ve değişiklik onayını onayladığı anda değişiklikleri kaynak ağacında alacağım.

Derleyici kaynağında iki küçük değişiklik ve - stdin'i göstermek için kullanılabilir.

prompt$ echo 'program-id. test. display "hello".' | cobc -free -frelax -x -o thing - 
-: 1: Warning: PROCEDURE DIVISION header missing - assumed 
prompt$ ls -l 
-rwxrwxr-x. 1 btiffin btiffin 13192 Jul 31 17:27 thing 
prompt$ ./thing 
hello 

Bu da herhangi bir işletim sistemi için çalışmak ve edecek olanların değil,/dev/(paxdiablo yazdığı gibi şimdilik, GNU/Linux ve benzeri bir çok geçerli bir seçenektir) Stdin desteğiyle.

Ve bir kenara; cobc zaten bir POSIX yorumlayıcısı olarak kullanılabilir.

prompt$ chmod +x interp.cob 
prompt$ ./interp.cob 

Ne yazık ki

Command line: /usr/local/bin/cobc -xvg ./interp.cob 
Preprocessing: ./interp.cob -> interp.i 
Return status: 0 
Parsing:  interp.i (./interp.cob) 
Return status: 0 
Translating: interp.i -> interp.c (./interp.cob) 
Executing:  gcc -std=gnu99 -c -I/usr/local/include -pipe -Wno-unused 
       -fsigned-char -Wno-pointer-sign -g -o "/tmp/cob25113_0.o" 
       "interp.c" 
Return status: 0 
Executing:  gcc -std=gnu99 -Wl,--export-dynamic -o "interp" 
       "/tmp/cob25113_0.o" -L/usr/local/lib -lcob -lm -lgmp 
       -lncursesw -ldb -ldl 
Return status: 0 

vererek

#!/usr/local/bin/cobc -xvg 
     identification division. 
     program-id. SAMPLE. 

     procedure division. 
     display "scripted" end-display 
     goback. 

     end program SAMPLE. 

, bu sadece yapı içindir. Yürütme, fazladan bir adım gerektirir.

prompt$ ./interp 
scripted 

"Şimdi kod çalıştırmasına" için hiçbir derleyici seçeneği, yani bir -J (sabit formu) ve -j (serbest formu) seçeneği eklenecektir yoktur. İşi çalıştır, yeni bir form olan -x (çalıştırılabilir oluştur) haline gelir ancak aynı zamanda işlemin sonunda ikili dosyayı da çalıştırır. Daha sonra POSIX'te cobc "komut dosyalarına" erişebileceğiz. Şu anda izin verilen her şey oluşturuluyor ve çalışma ayrı bir komut olmalı.

Ve POSIX sağlama satırlarının tek bir argümanla sınırlı kaldığı sınırlamalar, yani -j-free işe yaramaz ve -j-Xref vb. Olmaz, ancak sınırlar dahilinde cobc betiklerine izin verilir.

Bu, derleyici için başka bir satır değişikliği, ve 400 satır seçenek ayrıştırma ve dökümantasyon. ;-)

Birkaç saat içinde test için hazır olmalıdır. Yine, bu değişiklikler diğer tüm derleyici denetleyicilerinden onay gerektirecektir, ancak geliştirmelere izin vermemek için herhangi bir neden göremiyorum. Derleme sonunda iki iş, biri için - stdin ve -J -j.

+0

Test tamam. cobc şimdi -j'yi derler, derler, bağlar ve gider. Yani cobc kabuk betiği 2.0 ön sürümde olacak, aynı zamanda bir cobc komut satırından derlenebilsin, bağlanabilsin ve bağlanabilecekti. –

+0

Teşekkürler! :) Bunun dahil edildiği kaynak koduna bazı bağlantılar sağlayabiliyor musunuz (örneğin, bağlantı bağlantıları vb.)? Bu harika bir haber! –

+0

@ İyonicăBizău, stdin'den cobc, Rev 630 ile gitti. Http://sourceforge.net/p/open-cobol/code/HEAD/tree/ Şerefe. –

3

Biraz sersemliklikle, bu yapılabilir.

000100 * HELLO.COB OpenCOBOL FAQ example 
000200 IDENTIFICATION DIVISION. 
000300 PROGRAM-ID. Hello. 
000400 PROCEDURE DIVISION. 
000500 DISPLAY "Hello world!". 
000600 STOP RUN. 

Böylece, zaten biz derleyip bu çalıştırabilirsiniz biliyorum: Önce test için kullanabileceğiniz bir dosya oluşturmak Eğer bir dosyada o istemiyorsanız,

pax> cobc -x hello.cob ; hello 
Hello world! 

Ama size senkronizasyon böylece sadece ne istediğinizi çıktı dosyasını ayarlayarak, bilgi almak için /dev/stdin "dosyasını" kullanabilirsiniz: bir fi geliyor

pax> cat hello.cob | cobc -x /dev/stdin -o hello2 ; hello2 
Hello world! 

le ama cobc dosyayı derlemek için açmıyor, böylece cat hello.cob'u standart çıktıya bir COBOL kaynak dosyası oluşturan herhangi bir komutla değiştirebilirsiniz.

Programınızda yapmanız gereken tek şey, /dev/stdin dosyasını /dev/stdin dosyası ile giriş ve uygun bir çıktı dosyası ile çalıştırmak ve daha sonra COBOL programınızı buna bağlamaktır.

İlgili konular