Laporan PLC

Laporan PLC bab 1-13

Kevin Setiadi Gunawan-2001551712
Saputra Wijaya-2001554683
William Hansel 2001552785
Nelson Andreas 2001552274
Jonathan Alvin Putra 2001548384

PERTEMUAN KE-1
Pada pertemuan pertama, kita membahas tentang apa itu Programming Language Concept sesungguhnya, dan mengapa kita harus belajar mengenai Programming Language Concept (PLC), dan segala hal lainnya mengenai dasar dari PLC itu sendiri. Pertama-tama, kita membahas “mengapa perlu memperlajari apa itu PLC?”. Alasannya adalah Peningkatan kemampuan untuk mengekspresikan ide-ide, Peningkatan latar belakang untuk memilih bahasa pemograman yang sesuai, Peningkatan kemampuan untuk belajar bahasa baru, Pemahaman yang lebih baik, Penerapan yang lebih baik bila menggunakan bahasa yang sudah dikenal, Keseluruhannya yaitu untuk kemajuan komputasi. Keenam, alasan diatas sudah membuktikan bahwa kita memang harus mempelajari apa itu yang disebut PLC.

Setelah membahas alasan “mengapa kita harus mempelajari apa itu PLC?”. Hal lain yang kita bahas adalah Programming Domains. Programming Domains adalah daerah atau territory yang menjadi acuan Programming digunakan atau diterapkan, dan menjadi batasan-batsan atau scope yang menjadikan Programming bekerja secara efektif, dan tepat. Kelima domains tersebut adalah Scientific applications, Business applications, Artificial intelligence, Systems programming, dan Web Software.

Selanjutnya, kita membahas tentang Language evaluation Criteria atau Criteria Evaluasi untuk menentukan sebuah Bahasa pemograman layak atau tidak untuk digunakan. Terdapat 4 criteria dasar yang menjadi acuan dalam evaluasi tersebut, yaitu Readability, yang berate setiap Bahasa pemograman harus mudah dibaca dan dimengerti agar tidak terjadi ke-ambigu-ann, lalu selanjutnya adalah Writability, yang berati setiap Bahasa pemograman harus mudah ditulis, karena hal ini tentu akan membuat para programmer lebih menguasai, dan menggunakan bahsa pemograman tersebut, lalu terdapat juga Reliability, yang berati harus terdapat pengkhususan dalam suatu bahsa pemograman agar tidak terjadi kesalahan, dan keambiguan yang tentu akan berakibat fatal, lalu yang terakhit adalah Cost, biaya adalah salah satu hal penting dalam evaluasi ini, tentu biaya tidak boleh mahal, dan dengan biaya yang murah dapat menciptakan keefiseinan, dan ketepatan yang baik

Lalu pelajaran keempat adalah Hal apa yang mempengaruhi sebuah Design dari Bahasa pemograman itu sendiri. Hal yang pertama adalah Computer Architecture, penggambaran arsitektur yang berpengaruh adalah the von Neumann architecture. Lalu, terdapat juga Program Design Methodologies. Setelah itu kita membahas mengenai pengaruh dari arsitektur computer itu sendiri. Seperti kita tahu adalah the von Neumann adalah pengaruh besar dalam Arsitektur computer, atau kita dapat lihat dari gambar dibawah ini.

Selain itu Bahasa pemograman juga memiliki beberapa kategori, yaitu Imperative, Functional, Logic, Markup/programming hybrid. Kemudian kategori tersebut dikembangkan kembali menjadi Metode Implementasi Bahasa Pemograman itu sendiri, yang meliputi :
1. Compilation
Program yang diterjemahkan ke dalam bahasa mesin; termasuk sistem JIT, lalu menggunakan aplikasi komersial besar, yang kemudian diterjemahkan Program tingkat tinggi (bahasa sumber) ke dalam kode mesin (machine language), yang membuat proses terjemahan Lambat, namun eksekusi cepat. Proses Kompilasi itu sendiri memiliki beberapa tahap:

• Analisis leksikal: mengkonversi karakter dalam program sumber ke unit leksikal
• Analisis sintaks: mengubah unit leksikal menjadi pohon parse yang mewakili struktur sintaksis program
• Analisis Semantik: menghasilkan kode intermediate
• Generasi kode: kode mesin yang dihasilkan

The Process :

2. Pure Interpretation
Program diinterpretasikan oleh program lain yang dikenal sebagai penerjemah. Lalu menggunakan Program kecil atau ketika efisiensi tidak masalah. Pelaksanaannya yang Mudah karena kesalahan run-time dapat dengan mudah dan langsung ditampilkan. Namun, Sering membutuhkan lebih banyak ruang. Lalu kini signifikan digunakan untuk beberapa bahasa Web scripting (misalnya, JavaScript, PHP)

The Process :

3. Hybrid Implementation Systems

Sebuah perpaduan antara compiler dan interpreter murni, yang menghasilkan Sebuah program bahasa tingkat tinggi diterjemahkan ke bahasa perantara yang memungkinkan penafsiran mudah, sehingga menghasilkan kecepatan yang lebih dari interpretasi murni. Contohnya adalah Program Perl yang sebagian disusun untuk mendeteksi kesalahan sebelum interpretasi. Lalu terdapat juga Implementasi awal dari Java adalah hybrid, bentuk menengah, kode byte, memberikan portabilitas untuk setiap mesin yang memiliki interpreter kode byte dan sistem run-time (bersama-sama, ini disebut Java Virtual Machine)

The Process :

PERTEMUAN KE-2

Pada pertemuan yang kedua ini, kita membahas mengenai perbedaan Syntax, dan Semantics. Pada dasarnya Sintaks adalah bentuk atau struktur ekspresi, pernyataan, dan unit program, sedangkan Semantik adalah arti dari ekspresi, pernyataan, dan unit program itu sendiri. Namun, munculah masalah untuk mendeskripsikan suatu syntax. Masalah itu adalah Terminology. Lalu terdapat dua Bahasa formal untuk mendefinisikan sebuah Bahasa pemograman, yang pertama adalah Recognizers, yang berati Perangkat pengakuan membaca string masukan atas alfabet bahasa dan memutuskan apakah string masukan milik Bahasa. Sedangkan yang kedua adalah Generator, yang berati sebuah perangkat yang menghasilkan kalimat dari Bahasa, dan dapat menentukan apakah sintaks dari kalimat tertentu sintaksis benar dengan membandingkannya dengan struktur generator itu sendiri.
Lalu selanjutnya kita mempelajari apa itu BNF and Context-Free Grammars. Context-free Grammars itu sendiri berkembang pada tahyun 1950, sedangkan Backus-Naur Form berkembangpada tahun 1959. Terdapat fundamental dalam BNF itu sendiri, yaitu di BNF, abstraksi digunakan untuk mewakili kelas struktur sintaksis – mereka bertindak seperti variabel sintaksis (juga disebut simbol non-terminal, atau hanya terminal) , lalu aturan memiliki sisi kiri (LHS), yang merupakan non-terminal, dan sisi kanan (RHS), yang merupakan serangkaian terminal dan / atau nonterminals. Selain itu Nonterminals sering tertutup dalam kurung sudut, dan menjadikan Sebuah simbol awal adalah elemen khusus dari nonterminals dari tata Bahasa.
BNF sendiri memiliki rules, yaitu  | begin end.
Selanjutnya kita membahas mengenai Derivations. Derivations yang berati turunan adalah sebuah kelanjutan dari BNF itu sendiri, sehingga Derivations memiliki beberapa cakupan yang lebih luas, dan ini adalah contoh dari Derivations itu sendiri

=> =>
=> =
=> a =
=> a = +
=> a = +
=> a = b +
=> a = b + const

Lalu, dalam menuliskan dalam sebuah semanthic atau mendeskripsikan sebuah Bahasa pemograman. Maka munculah beberapa masalah baru. Masalah tersebut adalah keambiguan. Oleh karena itu untuk menghilangkan keambiguan, maka muncullah sebuah rules baru yaitu

 – |
 / const| const

Selain itu, semantic juga memiliki beberapa jenis, yang pertama adalah static semanthic. Static semanthics adalah sebuah penjelasan syntax secara static atau tetap. Tidak terikat pada konteks manapun, namun memiliki beberapa masalah yang dapat muncul. oleh karena itu untuk membuat semanthics yang tepat setiap programmer harus dapat menguasai beberapa metode-metode, yaitu

• Programmer perlu tahu apa laporan berarti penulis
• compiler harus tahu persis apa bahasa
• konstruksi dilakukan bukti-bukti kebenaran
• akan mungkin generator compiler
• akan mungkin Desainer bisa mendeteksi ambiguitas dan inkonsistensi

Semantics itu sendiri memiliki beberapa jenis, yang terdiri dari
1. Operational Semantics: Menjelaskan arti dari sebuah program dengan mengeksekusi pernyataan pada mesin, baik simulasi atau actual
2. Denotational Semantics : adalah sebuah semantic yang berdasarkan recursive theory
3. Axiomatic Semantics : yang ketiga aadalah semantics yang berdasarkan pada Logic.

PEREMUAN KE-3
Pada bab 3 ini kita membahas apa itu yang namanya Names, Scope, dan Binding. Pertama-tama kita membahas apa itu Names. Names adalah sebuah proses penamaan dalam sebuah Bahasa pemograman. Penamaan ini menjadi begitu penting, karena penamaan ini akan mengindentifikasikan suatu variable dalam Bahasa pemograman. Oleh dari sebab itu names menjadi salah satu bagian penting dalam Bahasa pemograman. Metode Names dalam seiap Bahasa pemograman tentu berbeda. Terdapat Bahasa pemograman yang tidak case- sensitive(dipengaruhi oleh besar-kecil nya huruf), dan ada juga yang tidak. Selain itu, terdapat juga penentuan panjang huruf penamaan, dan masih banyak lagi. Setiap Bahasa pemograman memiliki ciri khas Names masing-masing. Namun, dari semua itu dapat dibuktikan bahwa names merupakan bagian penting dalam Bahasa pemograman.
Selanjutnya kita akan membahas apa itu Binding. Binding adalah sebuah asosiasi atau hubungan antara entitity, dan attributenya, sama hal nya antara variable, dan type atau values. Dalam proses Binding kita juga mengenal hal yang disebut Binding Time. Binding Time adalah waktu yang dimana proses binding terjadi. Binding times dapat dibagi menjadi 5 kemungkinan, yang pertama adalah Language Design Theme, yaitu proses binding dari symbol menjadi operations. Kemungkinan yang kedua adalah Language implementation time , yang berati proses binding floating point type menjadi representasi. Lalu, yang ketiga adalah Compile Time, yang merupakan binding sebuah variable menjadi type, biasanya dalam Bahasa C atau Java. Yang keempat adalah Load time, yang bermakna bind sebuah static variable menjadi memory cell yang biasanya terjadi di Bahasa C atau C++. Terakhir adalah Runtime, yang berati menmbind sebuah nonstatic variable menjadi memory cell.
Setelah membahas kemungkinan yang dapat terjadi, selanjutnya kita membahas ada 2 type binding, yaitu
1. Dynamic Binding Type
Adalah sebuah proses binding yang terjadi ketika progam sedang berjalan. Biasanya diguakan dalam Bahasa pemograman Js, Phyton, Ruby, PHP, and C#. selain itu dynamic binding type juga memiliki keunggulan yaitu memiliki ke-flexibelitasan yang tinggi, namun terdapat juga kekurangannya, yaitu membutuhkan biasa yang cukup mahal, dan computer akan sangat sulit menentukan suatu error
2. Static Type Binding
Adalah sebuah proses binding yang terjadi sebelum progam berjalan, dan biasanya memiliki keuntungan yaitu biaya yang murah, dan kerusakan atau error dapat dengan mudah dicari atau ditemukan. Namun, memiliki kekurangan yaitu tidak mempunyai fleksibelitasan yang tinggi.
Setelah membahas 2 type binding, selanjutnya kita membahas 2 storage binding. Pertama adalah Allocation yang berarti mengambil cell yang telah tersedia, dan sedangkan yang kedua adaah Deallocation, yang memiliki makna sel memori yang telah tidak diikat oleh variable dikembalikan ke kolam memori yang tersedia. Lalu setelah storage binding, kita membahas apa itu namanya Life time Variable, yang berate sebuah variable yang dimulai ketika sebuah cell spesifik terikat, dan berakhir ketika tidak terikat dengan cell tersebut. Life time variable dibagi menjadi 4 tipe, yaitu
a. Static variable : cell yang terikat pada memory cell sebelum eksekusi dimulai, dan tetap terikat pada memory cell yang sama sampai progam eksekusi selesai. Memiliki keuntungan yaitu semua addressing bersifat langsung, namun berdampak pada kurang kefleksibleitasan dalam static variable
b. Stack dynamic variable : sebuah variable yang dimana storage bindingnya dibuat ketika deklarasi statement dijelaskan, tapi tipenya terikat. Memiliki keuntungan yaitu support dynamic storage atau biasa kita sebut dengan recursive, dan tentu juga memiliki kekurangan yaitu waktu proses yang lambat karena addressing yang tidak langsung, lalu overhead allocation, dan deallocation, dan subprogram tidak didokumentasikan secara spesifik.
c. Explicit heap dynamic : sebuah variable yang memiliki abstrak memory cell yang dialokasi, dan dealokasi dengan intruksi explicit run-time yang ditulis oleh programmer yang hanya bisa dialokasikan sebagai pointer. Memiliki keuntungan yaitu storage penyimpanan yang dinamis, dan memiliki kekurangan yaitu tidak efisien, dan tidak handal.
d. Implicit heap dynamic : sebuah variable yang terikat dengan heap storage ketika ada nilai yang ditugaskan. Memiliki keunggulan yaitu memiliki flexibility yang membuat high generic code untuk ditulis ulang, dan memiliki kekurangan run-time overhead mempertahankan semua attributes dinamis, yang akan mencakup array subscript & range, dan sulitnya menentukan error.
Lalu selanjutnya kita akan membahas apa itu yang namanya Scope, scope adalah suatu batas peryataan atau range serta asosiasi nama dengan variable. Scope itu sendiri dibagi menjadi 2 types, yaitu :
1. Static Scope : metode binding nama ke non-local variable, dan kemudian static scope dibagi menjadi 2 lagi, yaitu bisa di nested subprogrammnya menjadi nested scope, dan Subprogram yang tidak bisa disted class. Selain itu memiliki kekurangan juga, terlalu banyak block access nya, lalu progam awal di hancurkan dan local variable biasanya menjadi global, dan subprogram gravitate menjadi global dari pada nested.
2. Dynamic scope : refrensi variable terhubung melalui deklrarasi dengan mencaro kembali melalui rantai, dari subprogram yang memaksa mereka panggil eksekusi poin.
Session 4 : Data Type in C++

What is Data Type?
A data type, in programming, is a classification that specifies which type of value a variable has and what type of mathematical, relational or logical operations can be applied to it without causing an error. A string, for example, is a data type that is used to classify text and an integer is a data type used to classify whole numbers.
Primitive Data Types
Almost all programming languages provide a set of primitive data types, what is primitive data types? Primitive data type are those not defined in terms of other data types. Some primitive data types are merely reflections of the hardware. Others require only a little non-hardware support for their implementation.
List of Primitive Data Types:
Type Keyword Description
Character char They can represent a single character, such as ‘A’ or ‘$’. The most basic type is char, which is a one-byte character. Other types are also provided for wider characters.
Integer int They can store a whole number value, such as 7 or 1024. They exist in a variety of sizes, and can either be signed or unsigned, depending on whether they support negative values or not.
Floating point float They can represent real values, such as 3.14 or 0.01, with different levels of precision, depending on which of the three floating-point types is used.
Double floating point double
Valueless void
Boolean bool can only represent one of two states, true or false.

Character String Types
It is a very powerful class to handle and manipulate strings of characters. However, because strings are, in fact, sequences of characters, we can represent them also as plain arrays of elements of a character type.

For example, the following array:
char foo [20];

is an array that can store up to 20 elements of type char. It can be represented as:

Therefore, this array has a capacity to store sequences of up to 20 characters. But this capacity does not need to be fully exhausted: the array can also accommodate shorter sequences. For example, at some point in a program, either the sequence “Hello” or the sequence “Merry Christmas” can be stored in foo, since both would fit in a sequence with a capacity for 20 characters.
By convention, the end of strings represented in character sequences is signaled by a special character: the null character, whose literal value can be written as ‘\0’ (backslash, zero).
In this case, the array of 20 elements of type char called foo can be represented storing the character sequences “Hello” and “Merry Christmas” as:

Array Type
An array is a series of elements of the same type placed in contiguous memory locations that can be individually referenced by adding an index to a unique identifier.
That means that, for example, five values of type int can be declared as an array without having to declare 5 different variables (each with its own identifier). Instead, using an array, the five int values are stored in contiguous memory locations, and all five can be accessed using the same identifier, with the proper index.
For example, an array containing 5 integer values of type int called foo could be represented as:

Where each blank panel represents an element of the array. In this case, these are values of type int. These elements are numbered from 0 to 4, being 0 the first and 4 the last; In C++, the first element in an array is always numbered with a zero (not a one), no matter its length.
Like a regular variable, an array must be declared before it is used. A typical declaration for an array in C++ is:

type name [elements];
Where type is a valid type (such as int, float…), name is a valid identifier and the elements field (which is always enclosed in square brackets []), specifies the length of the array in terms of the number of elements.
Therefore, the foo array, with five elements of type int, can be declared as:
int foo [5];

Pointer

Variables is a locations in the computer’s memory which can be accessed by their identifier (their name). This way, the program does not need to care about the physical address of the data in memory; it simply uses the identifier whenever it needs to refer to the variable.

For a C++ program, the memory of a computer is like a succession of memory cells, each one byte in size, and each with a unique address. These single-byte memory cells are ordered in a way that allows data representations larger than one byte to occupy memory cells that have consecutive addresses.

This way, each cell can be easily located in the memory by means of its unique address. For example, the memory cell with the address 1776 always follows immediately after the cell with address 1775 and precedes the one with 1777, and is exactly one thousand cells after 776 and exactly one thousand cells before 2776.

When a variable is declared, the memory needed to store its value is assigned a specific location in memory (its memory address). Generally, C++ programs do not actively decide the exact memory addresses where its variables are stored. Fortunately, that task is left to the environment where the program is run – generally, an operating system that decides the particular memory locations on runtime. However, it may be useful for a program to be able to obtain the address of a variable during runtime in order to access data cells that are at a certain position relative to it.


Session 5 : Expression and Assignment Statements in C++

Arithmetic Expressions
Arithmetic evaluation was one of the motivations for the development of the first programming languages. Arithmetic expressions consist of operators, operands, parentheses, and function calls. There are 3 operator in Arithmetic expressions :
• A unary operator has one operand
• A binary operator has two operands
• A ternary operator has three operands
The five arithmetical operations supported by C++ are:
Operator Description
+ Addition
– Subtraction
* Multiplication
/ Division
% Modulo

Operations of addition, subtraction, multiplication and division correspond literally to their respective mathematical operators. The last one, modulo operator, represented by a percentage sign (%), gives the remainder of a division of two values. For example:

x = 11 % 3;

Results in variable x containing the value 2, since dividing 11 by 3 results in 3, with a remainder of 2.

Compound assignment (+=, -=, *=, /=, %=, >>=, <, =, <= )
Two expressions can be compared using relational and equality operators. For example, to know if two values are equal or if one is greater than the other.
The result of such an operation is either true or false (i.e., a Boolean value). The relational operators in C++ are:
Operator Description
== Equal to
!= Not equal to
Greater than
= Greater than or equal to

Here there are some examples:
1. (7 == 5) // evaluates to false
2. (5 > 4) // evaluates to true
3. (3 != 2) // evaluates to true
4. (6 >= 6) // evaluates to true
5. (5 = c) // evaluates to true, since (2*3 >= 6) is true
3. (b+4 > a*c) // evaluates to false, since (3+4 > 2*6) is false
4. ((b=2) == a) // evaluates to true

Be careful! The assignment operator (operator =, with one equal sign) is not the same as the equality comparison operator (operator ==, with two equal signs); the first one (=) assigns the value on the right-hand to the variable on its left, while the other (==) compares whether the values on both sides of the operator are equal. Therefore, in the last expression ((b=2) == a), we first assigned the value 2 to b and then we compared it to a (that also stores the value 2), yielding true.

Logical operators ( !, &&, || )

The operator ! is the C++ operator for the Boolean operation NOT. It has only one operand, to its right, and inverts it, producing false if its operand is true, and true if its operand is false. Basically, it returns the opposite Boolean value of evaluating its operand. For example:

!(5 == 5) // evaluates to false because the expression at its right (5 == 5) is true
!(6 <= 4) // evaluates to true because (6 6) ) // evaluates to false ( true && false )
2. ( (5 == 5) || (3 > 6) ) // evaluates to true ( true || false )

When using the logical operators, C++ only evaluates what is necessary from left to right to come up with the combined relational result, ignoring the rest. Therefore, in the last example ((5==5)||(3>6)), C++ evaluates first whether 5==5 is true, and if so, it never checks whether 3>6 is true or not. This is known as short-circuit evaluation, and works like this for these operators:

Operator Short-Circuit
&& if the left-hand side expression is false, the combined result is false (the right-hand side expression is never evaluated).
|| if the left-hand side expression is true, the combined result is true (the right-hand side expression is never evaluated).

Bitwise operators ( &, |, ^, ~, <> )

Bitwise operators modify variables considering the bit patterns that represent the values they store.

operator asm equivalent description
& AND Bitwise AND
| OR Bitwise inclusive OR
^ XOR Bitwise exclusive OR
~ NOT Unary complement (bit inversion)
<> SHR Shift bits right


Session 6 : Control Structure Statement in C++

A program is usually not limited to a linear sequence of instructions. During its process it may bifurcate, repeat code or take decisions. For that purpose, C++ provides control structures that serve to specify what has to be done by our program, when and under which circumstances.

With the introduction of control structures we are going to have to introduce a new concept: the compound-statement or block. A block is a group of statements which are separated by semicolons (;) like all C++ statements, but grouped together in a block enclosed in braces: { }:

{ statement1; statement2; statement3; }

Most of the control structures that we will see in this section require a generic statement as part of its syntax. A statement can be either a simple statement (a simple instruction ending with a semicolon) or a compound statement (several instructions grouped in a block), like the one just described. In the case that we want the statement to be a simple statement, we do not need to enclose it in braces ({}). But in the case that we want the statement to be a compound statement it must be enclosed between braces ({}), forming a block.

Conditional structure: if and else

The if keyword is used to execute a statement or block only if a condition is fulfilled. Its form is:

if (condition) statement

Where condition is the expression that is being evaluated. If this condition is true, statement is executed. If it is false, statement is ignored (not executed) and the program continues right after this conditional structure.
For example, the following code fragment prints x is 100 only if the value stored in the x variable is indeed 100:

if (x == 100)
cout << "x is 100";

If we want more than a single statement to be executed in case that the condition is true we can specify a block using braces { }:

if (x == 100)
{
cout << "x is ";
cout << x;
}

We can additionally specify what we want to happen if the condition is not fulfilled by using the keyword else. Its form used in conjunction with if is:

if (condition) statement1 else statement2

For example:

if (x == 100)
cout << "x is 100";
else
cout < 0)
cout << "x is positive";
else if (x < 0)
cout << "x is negative";
else
cout << "x is 0";

Remember that in case that we want more than a single statement to be executed, we must group them in a block by enclosing them in braces { }.

Iteration structures (loops)

Loops have as purpose to repeat a statement a certain number of times or while a condition is fulfilled.

The while loop
Its format is:

while (expression) statement

and its functionality is simply to repeat statement while the condition set in expression is true. For example, we are going to make a program to countdown using a while-loop:

int main ()
{
int n;
cout < “;
cin >> n;

while (n>0) {
cout << n << ", ";
–n;
}

cout <0 (that n is greater than zero) the block that follows the condition will be executed and repeated while the condition (n>0) remains being true.

The whole process of the previous program can be interpreted according to the following script (beginning in main):

1. User assigns a value to n
2. The while condition is checked (n>0). At this point there are two possibilities:
condition is true: statement is executed (to step 3)
condition is false: ignore statement and continue after it (to step 5)
3. Execute statement:
cout << n <0) to become false after a certain number of loop iterations: to be more specific, when n becomes 0, that is where our while-loop and our countdown end.

Of course this is such a simple action for our computer that the whole countdown is performed instantly without any practical delay between numbers.

The do-while loop

Its format is:

do statement while (condition);

Its functionality is exactly the same as the while loop, except that condition in the do-while loop is evaluated after the execution of statement instead of before, granting at least one execution of statement even if condition is never fulfilled. For example, the following example program echoes any number you enter until you enter 0.

int main ()
{
unsigned long n;
do {
cout <> n;
cout << "You entered: " << n <0; n–) {
cout << n << ", ";
}
cout << "FIRE!\n";
return 0;
}

The initialization and increase fields are optional. They can remain empty, but in all cases the semicolon signs between them must be written. For example we could write: for (;n<10;) if we wanted to specify no initialization and no increase; or for (;n<10;n++) if we wanted to include an increase field but no initialization (maybe because the variable was already initialized before).

Optionally, using the comma operator (,) we can specify more than one expression in any of the fields included in a for loop, like in initialization, for example. The comma operator (,) is an expression separator, it serves to separate more than one expression where only one is generally expected. For example, suppose that we wanted to initialize more than one variable in our loop:

for ( n=0, i=100 ; n!=i ; n++, i– )
{
// whatever here…
}

This loop will execute for 50 times if neither n or i are modified within the loop:

n starts with a value of 0, and i with 100, the condition is n!=i (that n is not equal to i). Because n is increased by one and i decreased by one, the loop's condition will become false after the 50th loop, when both n and i will be equal to 50.

Subprograms
Subprogram adalah pondasi block dari sebuah program yang memiliki bentuk terpentitng dalam konsep design bahasa pemrograman.
Memiliki 2 dasar dari abstraksi fasilitas:
1. Process abstraction
2. Data abstraction
Dasar dari sebuah subprogram adalah :
– Memiliki sebuah subprogram pada setiap single entry point
– Pemanggilan nya tergantung selama eksekusi dari subprogram yang di panggil
– Control selalu mengembalikan ke pemanggil ketika memanggil menghentikan eksekusi subprogram.
Local referencing, environments
Local variable dapat stack dynamic
Keuntungan :
– Support recursion
– Storage untuk local di share antara sesame subprogram
Kerugian :
– Alokasi / de-alokasi, waktu inisialisasi
– Indirect addressing
– Subprogram tidak bisa history sensitive
Local variable static
Keuntungan dan kerugian dari static adalah kebalikan dari stack dynamic

Nested subprogram
Nested subprogram adalah subprogram yang diambil sesuai dengan keperluan, jadi tidak perlu menjalankan semua fungsi dari program untuk memanggil subprogram.

Metode parsing parameter
Formal parameter memiliki 3 model semantic yang berbeda yaitu :
1. In mode
2. Out mode
3. In-out mode

Implementasi model parsing parameter :
1. Pass by value
2. Pass by result
3. Pass by value result
4. Pass by reference
5. Pass by name
Implementasi parsing parameter method
Dalam banyak bahasa komunikasi parameter mengambil tempat saat melakukan run-time stack. Pass by reference adalah implementasi tersimple dan hanya untuk address yang di tempatkan pada stack.

Designing considerations
Ada 2 pertimbangan yang di masukkan dalam parameter passing method yaitu :
– Efisiensi
– One-way / two-way data transfer
2 metode diatas memiliki konflik :
– Programming yang baik menyarankan access terbatas pada sebuah variable, yang berarti one-way setiap berhasil.
– Pass by reference lebih efisien untuk pass struktur pada ukuran yang signifikan

Parameter that are subprogram
Masalahnya ada pada referensi lingkungan untuk mengeksekusi subprogram passed harus digunakan yaitu :
1. Shallow binding
Pemanggilan statement memberlakukan melewati subprogram
Sangat natural untuk dynamic scoped
2. Deep binding
Lingkungan dari definisi dari passed subprogram
Paling natural untuk static scoped languange
3. Ad hoc binding
Lingkungan dari statement yang di panggil yang passed subprogram

Overloaded subprogram
Subprogram yang memiliki nama yang sama dengan subprogram lain pada lingkungan referensi yang sama.

Generic subprogram
Mangambil parameter dari tipe yang berbeda aktivasi. Overloaded subprogram memberikan ad hoc polymorphism. Subtype polymorphism adlaah variable tipe T dapat akses semua objek tipe T atau semua tipe turunan dari T.

Closures
Subprogram dan reference environment dimana di definisikan.
– Reference environment dibutuhkan jika subprogram dapat di panggil dari mana arbitrary place pada subprogram.
– Bahasa static scope yang tidak mengijinkan nested subprogram tidak membutuhkan closures
– Hanya dibutuhkan jika subprogram mengakses variable pada nesting scopes dan dapat dipanggil dari mana saja.

Coroutines
Coroutine adalah subprogram yang memiliki multiple entries dan mengontrol nya untuk mereka sendiri, di support langsung pada Lua. Symmetric control adalah pemanggil dan yang di panggil coroutines dalam ukuran yang sama. couroutine call disebut dengan resume. Coroutines memberikan quasi-concurrent execution dari program unit.

Abstract Data Types
Kita sekarang akan membahas lebih konkret tentang apa itu ADT. Pada dasarnya, ADT adalah tipe data tertentu yang didefinisikan oleh pemrogram untuk kemudahan pemrograman serta untuk mengakomodasi tipe-tipe data yang tidak secara spesifik diakomodasi oleh bahasa pemrograman yang digunakan. Maka, secara informal dapat dinyatakan bahwa ADT adalah :
1. Tipe data abstrak ADT pertama kali ditemukan oleh para ilmuan komputer utuk memisahkan struktur penyimpanan dari perilaku tipe data yang abstrak seperti misalnya, Tumpukan(Stack) serta antrian(Queue). Seperti kita duga, pemrogram tidak perlu tahu bagaimana Tumpukan(Stack) perubahan inplementasi ADT tidak mengubah program yang menggunakannya secara keseluruhan, dengan catatan bahwa interface ADT tersebut dengan ‘dunia luar’ tetap dipertahankan.
2. Pemakaian dan pembuatan ADT dapat dilakukan secara terpisah. yang perlu dibicarakan antara pembuat dan pengguna ADT adalah interface ADT yang bersangkutan.
3. ADT merupakan sarana pengembangan sistem yang bersifat modular, memungkinkan suatu sistem dikembangkan oleh beberapa orang anggota tim kerja dimana masing-masing anggota tim bisa melakukan bagiannya sendiri-sendiri dengan tetap mempertahankan keterpaduannya dengan anggota tim yang lain.

Kelebihan dari melakukan abstraksi data adalah :
– Struktur data dapat di modifikasi.
– User tidak perlu secara langsung mengakses objek data tersebut.
– Kompilasi yang terpisah.

Constructor
Constructor berfungsi sebagai inisialisasi sebuah data dari suatu instance. Dalam class harus dibuat.

Destructor
Destructor berfungsi sebagai penghancur sebuah data dari suatu constructor. Dalam class harus dibuat jika tidak di buat maka memori akan penuh karena data tidak pernah di hancurkan.

Gambar Constructor dan Destructor

Encapsulation
Enkapsulasi adalah sebuah konsep dalam penyembunyian sebuah informasi atau sebuah grup dari subprogram yang terhubung secala logis melalui sebuah unit yang dapat di compile secara terpisah.
Contoh : class

Enkapsulasi pada C
– – File berisi satu atau lebih subprogram dapa melakukan kompilasi sendiri
– – Interface ditempatkan pada header file
– – Memiliki masalah pada hubungan antara header dan implementasi asosiasi
Object Oriented Programming
OOP (Object Oriented Programming) adalah suatu metode pemrograman yang berorientasi kepada objek. Tujuan dari OOP diciptakan adalah untuk mempermudah pengembangan program dengan cara mengikuti model yang telah ada di kehidupan sehari-hari. Jadi setiap bagian dari suatu permasalahan adalah objek, nah objek itu sendiri merupakan gabungan dari beberapa objek yang lebih kecil lagi. Saya ambil contoh Pesawat, Pesawat adalah sebuah objek. Pesawat itu sendiri terbentuk dari beberapa objek yang lebih kecil lagi seperti mesin, roda, baling-baling, kursi, dll. Pesawat sebagai objek yang terbentuk dari objek-objek yang lebih kecil saling berhubungan, berinteraksi, berkomunikasi dan saling mengirim pesan kepada objek-objek yang lainnya. Begitu juga dengan program, sebuah objek yang besar dibentuk dari beberapa objek yang lebih kecil, objek-objek itu saling berkomunikasi, dan saling berkirim pesan kepada objek yang lain.
Bahasa yang sering digunakan:
1. Kelas Abstrak (Class Abstraksi)
2. Polimorfisme (polymorphism)
3. Pewarisan (Inheritance)

Abtraksi

Kemampuan sebuah program untuk melewati aspek informasi yang diproses olehnya, yaitu kemampuan untuk memfokus pada inti. Setiap objek dalam sistem melayani sebagai model dari “pelaku” abstrak yang dapat melakukan kerja, laporan dan perubahan keadaannya, dan berkomunikasi dengan objek lainnya dalam sistem, tanpa mengungkapkan bagaimana kelebihan ini diterapkan. Proses, fungsi atau metode dapat juga dibuat abstrak, dan beberapa teknik digunakan untuk mengembangkan sebuah pengabstrakan.

Polimorfisme

Melalui pengiriman pesan. Tidak bergantung kepada pemanggilan subrutin, bahasa orientasi objek dapat mengirim pesan, metode tertentu yang berhubungan dengan sebuah pengiriman pesan tergantung kepada objek tertentu di mana pesa tersebut dikirim. Contohnya, bila sebuah burung menerima pesan “gerak cepat”, dia akan menggerakan sayapnya dan terbang. Bila seekor singa menerima pesan yang sama, dia akan menggerakkan kakinya dan berlari. Keduanya menjawab sebuah pesan yang sama, namun yang sesuai dengan kemampuan hewan tersebut. Ini disebut polimorfisme karena sebuah variabel tungal dalam program dapat memegang berbagai jenis objek yang berbeda selagi program berjalan, dan teks program yang sama dapat memanggil beberapa metode yang berbeda di saat yang berbeda dalam pemanggilan yang sama. Hal ini berlawanan dengan bahasa fungsional yang mencapai polimorfisme melalui penggunaan fungsi kelas-pertama.

Inheritas
Mengatur polimorfisme dan enkapsulasi dengan mengijinkan objek didefinisikan dan diciptakan dengan jenis khusus dari objek yang sudah ada objek-objek ini dapat membagi (dan memperluas) perilaku mereka tanpa haru mengimplementasi ulang perilaku tersebut (bahasa berbasis objek tidak selalu memiliki inheritas.)

Dengan menggunakan OOP maka dalam melakukan pemecahan suatu masalah kita tidak melihat bagaimana cara menyelesaikan suatu masalah tersebut (terstruktur) tetapi objek-objek apa yang dapat melakukan pemecahan masalah tersebut. Sebagai contoh anggap kita memiliki sebuah departemen yang memiliki manager, sekretaris, petugas administrasi data dan lainnya. Misal manager tersebut ingin memperoleh data dari bag administrasi maka manager tersebut tidak harus mengambilnya langsung tetapi dapat menyuruh petugas bag administrasi untuk mengambilnya. Pada kasus tersebut seorang manager tidak harus mengetahui bagaimana cara mengambil data tersebut tetapi manager bisa mendapatkan data tersebut melalui objek petugas administrasi. Jadi untuk menyelesaikan suatu masalah dengan kolaborasi antar objek-objek yang ada karena setiap objek memiliki deskripsi tugasnya sendiri.

Contoh Program
class Kendaraan{
int posisi1;
int kecepatan;
int posisi2;
int pergerakan;
int getPosisi1(){
return posisi1;
}
void setPosisi1(int theposisi1){
posisi1 = theposisi1;
}
int getKecepatan(){
return kecepatan;
}
void setKecepatan(int thekecepatan){
kecepatan = thekecepatan;
}
posisi2 bergerak(){
int jarak;
int waktu;
posisi2 = getKecepatan * waktu;
}
}
class Mobil extends Kendaraan{
}
class KendaraanTestDrive{
Mobil avanza = new Mobil;
avanza.setPosisi1(30);
avanza.setKecepatan(45);
avanza.bergerak();
}
Concurrency
Concurrency mencakup 4 level yaitu:
• Instruksi tingkat mesin
• Statement bahasa tingkat tinggi
• Tingkat unit
• Tingkat program
Ada 2 kategori concurrent unit control yaitu :
• Physical concurrency
Memiliki lebih dari 1 processor, beberapa program unit dari program yang sama di eksekusi serentak.
• Logical concurrency
Relaxation konsep dari concurrency yang membolehkan programmer dan aplikasi software memberikan concurrency asli.
Subprogram level concurrency
Task atau process atau thread adalah sebuah program unit yang dapat di eksekusi bersamaan dengan program unit yang lain.
Task berbeda dari subprogram biasa, terletak pada :
– Sebuah task dapat implicit
– Ketika program unit menjalan kan eksekusi task, maka tidak perlu dilakukan penundaan
– Ketika eksekusi task selesai, control dapat tidak kembali kepada pemanggil nya
Task dapat di bagi menjadi 2 kategori yaitu :
– Heavyweight
Task eksekusi pada ruang alamat nya sendiri
– Lightweight
Semua task berjalan pada ruang address yang sama, Jika sebuah task tidak berkomunikasi terhadap eksekusi pada sebuah program di sebut disjoint.

Semaphore
Semaphore adalah data struktur mengandung counter dan queue untuk menyimpan task descriptor (data struktur yang menyimpan semua informasi relevan tentang state eksekusi dari sebuah task) / mekanisme simple yang dapat digunakan untuk memberikan syncronisasi task.

Monitor
Mengenkapsulasi shared data dan operasi nya pada akses terbatas. Monitor adalah abstract data type (ADT) untuk shared data.

Exception handling and event handling

Exception handling adalah special process yang mungkin dibutuhkan ketika sebuah exception ditemukan. Process ini dapat dilaksanakan dengan unit kode atau segment yang disebut exception handler.

Event handling
Event adalah notifikasi bahwa suatu spesifik telah terjadi, seperti mouse click pada tombol grafis.
Semua bahasa pemrograman sekarang memiliki fungsi exception handling.
Salah satu nya menggunakan clause try, catch, finally clause

Functional Programming Language

Functional Programming
Functional programming adalah Program serba fungsi, yang artinya setiap persoalan diselesaikan dengan menggunakan fungsi.
Functional programming sendiri mulai dikembangkan tahun 1960an, dimotivasi oleh peneliti bidang artificial intelligence, symbolic computation, theorem proving, rule-based system, dan NLP.
Bahasa fungsional pertama adalah Lisp (McCarthy, 1960).
Memodelkan masalah komputasi sebagai suatu fungsi matematika, yang mempunyai input (domain) dan hasil atau output (range).

Variabel global
Didefinisikan dengan menggunakan fungsi define.
Contoh: (define f 120)
Evaluasi ekspresi
f120
(+ f 5) 125
(f)error, karena memiliki kurung tapi tidak melakukan sebuah operasi
5 5
#ffalse
#ttrue

Logic Programming Language

Logic Programming
Programming pada bahasa logic di ekspresikan dengan bentuk logic simbol. Menggunakan logical inferencing process untuk menghasilkan produk, bersifat declarative disbanding dengan procedural.

Symbolic Logic
Logic dapat di gunakan untuk :
– Mengekspresikan proposisi
– Mengekspresikan hubungan antara proposisi
– Menjelaskan bagaimana proposisi baru dapat mengganggu proposisi yang lain.
Bentuk symbolic logic yang digunakan untuk symbolic logic programming dipanggil predikat kalkulus.

Objek representasi
Objek pada proposisi biasa di representasikan dengan syarat simple : konstan atau variable.
Konstan : symbol yang merepresentasikan objek.
Variable : symbol yang merepresentasikan objek lain pada waktu lain

Compound term
Atomic proposisi : mengandung compound term
Compound term = satu elemen pada hubungan matematika, ditulis seperti fungsi matematika (mapping).
Functor = fungsi symbol yang menamai hubungan.

PROLOG adalah kependekan dari PROgramming in LOGic, yang berarti pemrograman
logika. Pemrograman Prolog menggunakan bahasa deklaratif, dimana pemrogram
memberi fakta dan aturan untuk selanjutnya diselesaikan oleh Prolog secara deduktif
sehingga menghasilkan suatu kesimpulan. Hal ini berbeda dengan bahasa prosedural
seperti Pascal, Fortran, C, atau yang sejenis, dimana pemrogram memberi perintah atau
penugasan untuk memecahkan persoalan langkah demi langkah, sehingga sering disebut
sebagai programming with assignment. Disamping itu, berbeda dengan pemrograman
fungsional, pemrograman logika ini menggunakan relasi, bukan fungsi sehingga sangat
sesuai untuk implementasi sistem pakar.

DASAR PEMROGRAMAN PROLOG
Pada bagian ini akan diuraikan dasar-dasar pemrograman Prolog, aturan umum penulisan
program, bagaimana melakukan dialog dengan Prolog, dan beberapa pengertian dasar
yang berkaitan dengan program Prolog.

Fakta
Fakta adalah suatu kenyataan atau kebenaran yang diketahui, dan menyatakan hubungan
(relasi) antara dua atau lebih obyek. Fakta dapat pula menunjukkan sifat suatu obyek.
Contoh sederhana adalah:
bapak(prawiro, joko).
merah(darah).
asin(garam).

Aturan
Aturan merupakan logika yang dirumuskan dalam bentuk relasi sebab-akibat dan
hubungan implikasi. Misalnya dapat dibuat aturan bahwa jika A adalah bapak dari X dan
X adalah bapak atau ibu dari Z maka dapat dipastikan bahwa A adalah kakek dari Z.

Relasi
Istilah merah, asin, kakek, bapak, ibu, dan orangtua pada contoh fakta dan aturan
sebelumnya disebut sebagai relasi. Relasi adalah tabel dengan n buah kolom dan terdiri
dari beberapa baris fakta maupun aturan. Misalkan relasi append adalah sekumpulan
tuple (X,Y,Z) dimana Z terdiri dari elemen X diikuti dengan Y atau Z=X+Y.

Variabel
Argumen suatu predikat dapat berupa konstanta (atom), variabel, atau obyek lain. Atom
disebut juga sebagai obyek nyata, sedangkan variabel disebut obyek umum. Suatu atom,
variabel, atau obyek lain dalam Prolog disebut term, sehingga argumen selalu berupa
term.

Leave a Reply

Your email address will not be published. Required fields are marked *